本人出于兴趣驱使,从初中就开始研究计算机及编程,但我不是神童,我没有写过9000个软件,也没有90天写过40w行代码,我只是自认为对编程稍有门路罢了。如今快毕业了,在一家挨踢企业实习。在学习的道路上经历了很多,也感悟了很多——编程以外的道理。有些现象让我看在眼里,疼在蛋上。因此我决定撰文,旨在引导编程初学者一个正确的学习方式,帮助他们少走弯路。本文适合大一新生,以及对编程有兴趣的同学阅读。如有意见,欢迎到我邮箱拍砖。edi.wang@outlook.com

你为什么要编程


兴趣第一

我必须要说的是,据我观察,以及自身体会发现,要想学好编程,最好的前提条件就是兴趣。但不是每个学编程的人对此都有兴趣,并且,要让一个没有心思研究编程的人静下心来学习这门需要大量时间和精力才能入门的学科,是相当难办的。我的重点不在如何教你去培养兴趣,我不是教育砖家。我要说明的是,如果你有兴趣,那恭喜你,你一定可以学好编程。

如果“不幸”进了计算机专业

如今计算机专业已经遍地开花了,但很可惜的是,不是每个人,或者说有相当大的一部分人,不是出于自己而选择计算机专业的。如果你是“不幸”的一员,并且你根本就不想学计算机,或者说厌恶编程,那我劝你早点想个出路,编程不可能适合你。就目前我观察的情况而言,除非是后来发掘了兴趣,不然没几个“不幸”的人可以在计算机行业立足。如果你已经没有别的路可走了,并且没有拼爹的资本,那你的目标就是学会在计算机行业就业的基本技能,给自己找一个起点。这时要克服的应该是心理上的屏障,这个我没有办法指导你,我不是心理砖家。总之,不要自暴自弃,更不要让对计算机的仇恨以及对优秀同学的羡慕嫉妒恨吞噬自己。

为什么编程,这个问题的最终答案就是为了赚钱。如果有兴趣,这可以成为快乐。比如微软Channel9上的Code4Fun那伙Geek。但大家要记住,不要为了钱,让兴趣成为一种压力。我不是社会学砖家,我无力在本文去喷社会问题,对于赚钱,每个人的观点也不一样,这个只能让大家自己体会。

准备工作


选一门技术

现在切入正题,帮助大家少走弯路。首先最重要的是选择一门技术。注意,是一门,仅仅一门而已。现在不同于以往,我当年刚玩电脑的时候,技术非常少,很容易学。如今的技术日新月异,五花八门,每种都很犀利。要去研究的话,每种技术都非常有深度。

就拿网页前端来说,以前只有很单一的HTML,用FrontPage或Dreamweaver就能搞掉。但现在要做一个能拿得出台面的网页,你至少得会HTML,CSS,Js,以及结合起来的AJAX,并且熟悉一种或几种框架才能搞定。这还只是前端。如果你想要独立做个能够上线使用的动态网站,在现在这个时代下,要学的东西非常多。人的精力有限,面对现在如此众多的技术,不可能样样精通。初学者容易犯的毛病就是什么都想学,我认为这是浮躁的表现,学习不能急功近利。认真学好一样东西,在这个时代已经是很不容易的了。

如何选择一门技术呢?首先我认为,对于初学者来说,必须容易上手。并且,这门技术必须具有良好的前景和商业价值。

就目前的情况而言,我认为最方便入门的还是网站开发方向的技术。Web应用大势所趋,即使互联网诞生之初并不是为之设计的。我们暂且不论把本地应用都放Web上这种做法是否妥当,就目前的形式而言,这种模式,即使可能是对Web的误用,也将会继续发展很长一段时间。几周后微软提交的新http协议将被审核,如果成功,那未来的Web将是另一方天地。构建Web应用,你首先得会基本的网页设计和制作,并且,重点是,你得学习一门后台语言。这里的选择很多,我本人是做ASP.NET的,用的是C#语言,但你也可以用JAVA,PHP或者其他语言去写,这也是做Web编程的好处——选择非常丰富。

如果你不打算做Web,你可以尝试开发桌面应用,未来Windows8的Metro应用将是一大亮点。并且新的编程模型允许你用现在的主流语言去构建Windows8的应用,这些语言甚至包括用来做Web的HTML和Js。

另外,我不推荐初学者去开发IOS、Android或是WinPhone应用。虽然他们看起来好,但开发手机应用需要的编程水平绝对高于桌面和Web应用,因为要考虑对算法细节的把握,它对手机的性能、耗电量至关重要。而目前的情况而言,想要开发出合格的手机应用,起码得有非常丰富的经验做铺垫,这显然是初学者办不到的。

再来谈谈大学里的情况,初学者刚开始面对的一般都是C语言或者VB,而且居然是6.0。学基础固然没错,但千万不要把大部分时间都花在C上。这个是效率时代,什么语言生产效率高,就用什么,研究底层实现这种事情,初学者是不可能搞定的。所以,就目前的时代来说,我认为你应当只把20%的精力花在课内的编程学科上,并且不要因为成绩好而自满。课余时间自己去学C#或者JAVA这样的主流语言,不要等老师教你。等你体会了现在主流的编程技术,再回头看课内的东西,简直就是小菜。这也是我个人的体会。我一开始是自学的ASP和VB,然后学了VB.NET,再转到C#,最后才回头自学C语言和C++,非常好上手。

最后要记住,要想独立开发一个应用,尤其是Web应用,光会一门技术是不行的。但不代表你非要样样精通。正确的做法是,将你的重点始终放在一个地方,对于你构建应用来说的其他必要技术,只要做到可用、够用即可。

你需要阅读

书籍是必备的,不要指望看视频或靠别人教能学到什么。你需要买书,并且不止一本。省钱的技巧是是:不要去购买(不是不要看)《21天学通XXX》,《XXX从入门到精通》这样的入门书籍。这些书尽量在图书馆借阅,因为你以后大部分的时间都不会再用到。要购买的,是一些高档次的书籍。要分辨一本好书,一个比较实用的技巧是看作者,好书往往是某某人著的,而不是某某人编著,或者是编的。并且,一本好书,是经得起反复阅读的。我不能在本文里点名批评某些无良作者,但我非常鄙视把别人的东西拿来整合一下就出版的不负责的态度,书中的代码甚至是错误的,明显没有实验过,就拿出来赚钱,这非常讽刺。

就我自己学习的.NET技术而言,我的读书路线是这样的:《ASP.NET2.0基础与实例教程》这本是基础书籍,帮助我入门。随后我读了《C#与.NET3.5高级程序设计》、《C#编程风格》、《重构》这样的进一步深入的书籍。初学者可能觉得,看了一本带示例的入门教程,已经可以构建一些普通应用了。但要知道,一个高质量的软件,不仅仅是可用的,更重要的是它的可维护性与拓展能力,以及面对需求变化的能力。所以,你必须了解,如何去调整和优化你代码,因此你需要更进一步的阅读。本文稍后会讨论重构。

好的硬件设备真的很重要

恩。首先声明,这一条不是让你作为理由向父母要钱去买电脑打游戏的。对于编程来说,一台好电脑真的十分重要,因为你不得不面对庞大的框架、开发工具以及虚拟机等耗资源大户。可以说,做开发用的计算机,除了显卡,其他都应该比游戏机要强。为了给自己的编程工作创造一个尽可能没有阻碍的环境,我建议大家不要吝惜买一台好电脑的钱。它将会你带来更多价值。另外,有条件的话,准备一块白板。它可以帮助你记录要做的事项或构建程序结构的草稿。

工作环境

每个人所适应的环境都不同。对我来说,最好的环境,不是图书馆,不是实验室,也不是寝室,而是自己家里,并且,尽量安静。我得承认,我在寝室的时候,我会忍不住和室友一起玩魔兽。只有在家里,我才能冷静下来,思考问题。并且,我的大部分技术书都放在家里的书架上,就在电脑的对面,非常方便查阅。

编程需要灵感,一个适合自己的工作环境可以让大脑在最优化的条件下运行,对于编程是十分有帮助的。所以建议大家,对于工作环境,不要“凑合着能用”就行,去寻找或布置一个最适合自己的工作室。

如何实践


计划一个真正的项目

不要满足于做做小DEMO、小工具。把眼光放远点,去计划一个称得上是产品的项目。做小工具和做系统是两回事,做工具你可能会把注意力集中在算法和实现细节上,而做系统,你就会考虑到架构,以及不同模块之间如何协同工作的问题。这也会把你引领到面向对象设计(OOAD)的道路上来,从一个大局和整体去设计系统,这是学编程所真正应该领悟的。至于底层算法,现在的编程框架已经实现的很好了。没有必要自己去做。本文稍候会讨论关于“重新发明轮子”的问题。

我自己也是从做小工具开始的,当年用的是VB,写小工具的利器。然而当我开始做我自己的网站项目时,才是我真正理解编程的开始。所以,我建议初学者去规划一个真正能用的系统,并一点点去完善、发布新版本。

它可以不完美

我知道很多初学者看到这里会觉得一上手就做一个系统有点太难了。我也知道,这确实很难,对我来说也是这样的。但你一开始策划的时候,它并不需要完美。比如我自己的博客系统,第一个版本非常简陋,仅仅具有简单的新闻发布和管理功能。它甚至没有分类、没有标签库,也不支持评论。但后来,随着学习的深入,我会逐渐增加新的功能。在这个过程中,你会慢慢体会到系统是如何从简单变的复杂,并且你会感受到需要一种新的设计手段,去解决系统变大所带来的问题。

遵循标准

任何一种语言,都会有人总结出一种编程风格。它是行业中所普遍采用的最流行的约定。比如大小写、空格、换行等格式的要求。当然,你的代码不遵循标准也是可以执行的,毕竟风格不是逻辑。但遵循标准可以让你的代码显得更加专业化,也可以增加它的可读性(很多时候读你代码的并不只有你一个人)。

举个最简单的例子,初学者写程序,用的变量名常常是a,b,c等没有含义的字母。在程序逻辑简单的时候,可能并没有太大的影响。然而,如果你的系统发展到了一定规模,到处充满着这些不能一眼就看出用途的变量名,那么最后受苦的十有八九是你自己。如果你对IDE的功能又不是很熟悉,那改一个地方的时候,肯定要找得你蛋碎。

循序渐进的模式


学习模式

正如我前面所说,系统慢慢变大之后,你会考虑重新设计。这就是对以往经验的总结、对问题现状的分析,以及尝试新的设计方法(更专业的说法是设计模式)。这也就是编程的学习模式。如果你不去实践,就算你把设计模式这本书的内容背出来,也是没用的。因为你没有体会过之前的编程方法所带来的问题。没有吃过苦,就不会有到位的理解。所以编程的学习模式是循序渐进的,基于实践的方法。

代码重构

新手和高玩的一大区别就在于他们写的代码的可读性和可维护性。虽然代码只要逻辑正确,都可以让程序产生正确的运行结果,但更重要的一点是为将来做考虑。因为软件的需求总是在不断变化的,你不得不面临需求变更所带来的代码修改。而重构的意思,就是在不改变软件可观察行为的前提下,调整代码,让它以尽量小的变更去应对需求的更改。最终也就是用重构得到模式。

重构是编程学习路上的必经环节,我个人认为,只有你学会了重构与设计模式,才是真正的入门开始。我又想骂那些《XXX从入门到精通》的书了,什么叫入门?什么叫精通?写书请不要用这样的标题去吸引眼球。

关于重构,大家可以去看Martin Fowler大牛写的《Refactoring: Improving the Design of Existing Code》

体会超越编程的哲学

在你到达一定境界后,你会感觉到你对这个世界有了新的认识——它是那么复杂,却又能被组织在一起,你似乎可以用编程的思想去描述事物以及他们之间的关系。恭喜你,你体会到“面向对象编程(OOP)”了。我们现在所采用的OOP语言,正是从现实生活中所类比而来的,它模拟了现实生活中事物之间的关系,用一种自然的习惯去编程,这就是为什么OOP可以成为现代的程序设计方法。以往在学习OOP语言,比如C++、JAVA、C#时,你也许并不会考虑到哲学的深度。然而,当你能从语言本身去反推世界时,你会觉得豁然开朗。当然,这一层面的理解也是有深度的。我平时也只是爱好用编程语言去讽刺社会中的蛋疼现象,比如某某人继承高帅富接口之类的,经常关注我微博的肯定知道,哈哈。目前只有少数几个世界级大师才称得上能从编程中体会哲学。这些大师有的已经去世了……

我走过的一些弯路


不要重新发明轮子

初学者学习一段时间后,还容易犯个错误,就是喜欢自己去实现一些框架已经提供的功能,似乎这样做心理上更有安全感,技术上也似乎能锻炼自己。我也曾经认为,什么东西都自己写可以装B,但最后发现自己是傻逼。这种做法在业界是非常不可取的。首先,从实现的角度来说,你很难超越框架。就拿生成随机数或GUID的功能来讲,框架本身的算法经过了非常深入的优化,并且是经过测试的,高效、稳定的算法。初学者自己写的算法,可能存在bug,并且也不是专门优化过的。所以,我严重建议在编程时使用框架提供的功能,不要自己去“重新发明轮子”。

最常见的“重新发明轮子”有:排序、树、链表、栈等数据结构和基本算法。其实这些基本的类不论是JAVA还是.NET,都已经内置在框架中了,我们只要直接使用就行了。

也有一部分初学者“重新发明轮子”,是因为对框架不够熟悉。

不要过度设计

学习重构及设计模式后,新手往往喜欢把刚学到的东西到处套用。但别忘了一点——任何设计模式,都是帮你省力的,它是懒人的工作。如果你滥用设计模式,往往会适得其反。在一些简单的场合,你用设计模式所花费的努力已经远远大于直接修改原先的代码了。在OOAD上也是如此,不是什么系统都要用三层架构,不是什么网站都要MVC。如果为了“看起来专业”而进行不必要的设计,那就亏大了。我身边也有一些人,整天把MVC、MVP、Entity Framework等名词挂在嘴边,碰到再简单的系统也要生搬硬套,这实在是装逼不讨好了。所以,正确的做法应该是根据系统的规模,寻找一种适度的设计方法,学会取舍。

编程不是你的全部


最后,请大家记住,编程并不是你的全部。任何事情都可能让人着迷,网络游戏可以,同样,编程也可以。一旦沉迷其中,就容易变成计算机的奴隶——如果把所有的业务时间都用来学习编程,你会失去生活中的许多应该体验的事物,等最后发现自己只会编程,而在别的方面和别人很不一样,将是一件很痛苦的事,这也是我的亲身感受,如今我已后悔莫及。所以,有空的时候还是多融入生活吧。多去了解人类的想法,而不能只和计算机说话。