关于计算机专业的人如何学好编程
最近总是有人问如何确定自己方向的问题,说是看到有的人在搞手机,有的人在搞网页,有的人在搞游戏,还有其他的什么的,然后说自己只懂得这么一点东西不知道该怎么办之类的事情。我一直在一些做软件开发的群里面混,里面有很多学生,也有很多从业者。那些人对于人们在基础不够扎实的情况下就“做各种各样具体的项目”有两种说法,一种说是浮躁,另一种说是这样开阔眼界是好的。
大学就四年。学校通常安排前两年学数学英语,然后大一学语言大二学数据结构。到了大三有很多比较具体而且复杂的课程,然后就要找实习,大四其实就是在找工作,课也没有,卫生也不检查了,等于在租学校的宿舍住。
于是在这短短的三年里面想在计算机那么多领域里面找到自己喜欢的,然后钻研下去,最后还有所成就的话,还是比较难的。因此很多人经常会看到自己周围突然有两三个人就干了点什么很有成就感的事情了,一问,以前学过的。这种人我也接触了几个。我有一个同学说是高中的时候被称为代码狂人,给emule写了点代码,然后还自己做了个即时通讯工具卖了出去。到了大学就一直在重写这个东西,最后实习就到腾讯去了。前几天还遇到个人,说是小学就在折腾flash里面的action script了,后来投靠perl,说是一直到了大一才写了一个超过2000行的程序。我也没去求证,只是觉得比较不可思议。
于是我想,就照着那些传统的路子先搞定一门语言(《C++Primer》),然后学数据结构(《算法导论》),再去学点库(《STL源代码分析》《深入浅出MFC》),之后弄点设计模式(《设计模式》),最后写个某某管理系统(笑)什么的,也是无聊了点。竟然要学了那么多东西,才能弄出一个看得见摸得着的程序,也太考验人的意志力了吧。几乎是个人都是从拖控件开始的。那些一开始就摸着黑白屏幕狂搞算法的人,要么是NOI出身,要么是ACM出身,然后对着几道算法题乐此不疲。但是最后有所成就的,很少。我在学校认识了那么多个ACM出身的,最后也就一个去了google。感觉风险还是有点大啊。
但是反过来也是有问题的。要是一开始就从界面开始弄,人也是很容易浮躁的。很多人因此就陷入了对花花世界的追求了(根据对群里面的人的统计),譬如说特别关心怎么在ListView前面画棵树什么的。这种人里面,其中一些有追求的,最后都会沿着Windows SDK,再走到DDK,最后写驱动,一脚踏进泥坑,从此不能自拔,当然这些人也是少数。每当有少数人对着剩下的多数人说跟“我今天实现了让Word不能打开某某文件”差不多的这些事情的时候,他们两眼大放光芒,然后就开始跪求源码,狂问用了什么API,最后当代码终于到手的时候,就放进之前精心准备好的一个文件夹里面,封存万世,从此再也不去看了。当然也有其他的版本,譬如说老是下载书,而且还是rar,然后从不解压一样。曾经有这么一个人就在群上炫耀说自己有多少多少G的电子书。我让他上截图,结果全是rar。根本就没看嘛,他自己也承认了。
于是怎么看两条路都是很有危险的,这就是为了什么到了大四的时候,能学成的人总是不多的缘故。 太容易陷进去了 。这是什么意思呢?人总是只对自己做得好的事情感兴趣。对自己还没做的事情感兴趣那种是好奇,需要严肃对待。当人终于做好了一件事情之后,就会一直不断的钻研下去,这当然是好事。但是,从此只见树木不见森林,以为全天下的编程就那一件事情,那当然是要吃亏的。
所以首先要开阔眼界,知道世界上原来还有这么多的东西可以做。 在差不多知道编程是什么东西的时候,需要这个玩一玩,那个玩一玩 。不然就会看到旁边的同学这个用Java在手机上跑一个能告诉你1+1=2的东西,那个人用PHP+MYSQL弄了个留言版,看得唾液直流,心里发慌,说自己对着C++的黑白屏幕弄了这么久居然连那点小玩意都做不出来,自尊心很容易受到打击的。
于是在玩过了之后呢,要及时收手,就专门做一件事情好了 。因为这个时候自己已经大概知道自己看见的东西差不多就是那个样子,想做自己也做得出来,看着别人写那些花边的程序也就不会给自己施加太多压力了。专门做一件事情的意思就是,选定一个方向,然后找书,找人,看代码,写程序。 譬如说可以去弄图形做游戏,也可以去弄脚本引擎做做编译器,还可以跟着老师去搞什么数据挖掘啊嵌入式什么的 。对一个领域的深入研究最大的用处是可以让自己接触复杂的问题 。
当然,当研究得深入了之后,程序就越写越大了,这个时候就会出现很多各种各样的问题了。譬如说效率太低啦,程序一出错就要全盘推倒重来啦(这个还是比较可悲的),代码太多很难组织函数啊类什么的啦,或者说名字给你用光啦等等。这个时候就需要各种各样的理论知识了,譬如说数据结构与算法,还有设计模式什么的。当然讲来讲去也就这几样,因为“这世界上没有银弹”,所以那些通用的东西必然不多,剩下的还是要靠在同各领域里面其他人的积累或者自己的研究才能最终解决的。
上面所说的可以做的各种各样的事情还是偏向于理论化一点,其实有一个学术上的领域还是不够的,因为最终一个程序在跟计算机打交道的时候靠的是输入输出,也就是俗称IO的东西了。这究竟是什么呢?也就是说,知道那个地方放着你要的数据,你要把它拿过来。你自己算出了什么,知道要往哪里放,你要会放。这里面包含的东西很多,譬如说典型的,键盘和屏幕上的输入输出,网络要用的Socket啦Web Service啦,那些看得见的窗口啦控件啦,读写硬盘啦,还有其他什么的。这种在某一平台上的专用的API都是至少要熟悉一种的。不然你光学会这个算法那个算法有什么用啊,譬如说你想对一个图片进行压缩,专门学了那个知识,但是一个bmp放在硬盘上你却读不进来,那岂不没意义了么。
于是说了这么多,无非就是刚开始的时候要去见识世面,然后挑一个来慢慢研究,最后研究着研究着程序搞大了,就自然会碰到很多高级的问题了。这个时候去解决了,其实本科需要你具备的水平其实也差不多达到了。
所以很多人都洗心革面,终于开始努力研究一个领域的问题了。领域总是复杂的,这个时候会遇到很多编程上的问题,譬如说算法太复杂表达不出来啦,文件读着读着就挂啦,一不小心越界了之后造成了很多奇怪的问题啦(C++)等等。这种关于调试的问题,一般只能够靠自己错得多错得离谱了,最后就成才了。当然前人也总结出了经验,写了本叫《 Why Programs Fail 》的书,想看的话可以自己去下载。其次, 具体的库总是有很多书和文档的,没事也要多看点 ,譬如说用Visual Studio的人都得把MSDN给装了。
话也差不多说完了,虽然我自己也觉得这篇文章比较虚,因为这也是“通用的东西”。具体自己该怎么办自己得好好想想。我就把这篇东西献给现在大一大二那些还在迷宫里转的弟弟妹妹了,要是有什么特殊的疑难杂症的话,就私底下联系我吧。
总之,无论什么时候,手头上都要留有一个可以研究的问题才好。