如何学好编程
——写给还在校的学生
10月份一直在忙上一个项目,每天都淹没在一大堆英文文档里,不断的实验、总结,就是晚上回到家里还是在思考着一些解决方案。博客也就闲置了整整一个月,北京的冬天来了,也一直找不到写东西的心情。现在项目告一段落,也重新进入了学习探讨的状态,于是觉得该写点什么了。听一些学弟学妹在述说这学院发生的事情,回忆自己学习各种技术一路走来的各种迷惘,决定写下一些个人经验下来,算是给所有在校的大学生一点建议吧。
记得在学校学得第一门语言是C++,饶有兴致的去写了不少代码,出了能在ACM竞赛中看到一点点效果之外,也不明白在现实社会中到底能用来干什么。后来又接触了Java和数据库,一般都会分组去做一些所谓的模拟项目,借书系统或者订餐系统之类的,开始发现能做出来的东西跟超市的收营系统有那么一点相似之处。再后来又接触了J2EE,开始做很多Web项目,这一下挖得可够深的,把学校不太重视的CSS/Javascript什么的一顿猛学……一直到现在,研究完BEA Tuxedo和BEA Weblogic之后,感触还是挺深的,回忆起来走了不少的弯路,但还算幸运的是以前打下的许多基础,都渐渐的在深入技术学习的过程中起到了关键作用!
首先我非常理解刚进入大学就凭借不错的智商,迅速学习编程,能写得一手好代码的那些哥们,马上就希望通过做真实的项目把自己的代码转化成真实世界的应用这种想法。也许在某些老师的帮助下,确实还真做出了一些东西来。但其实这时候最大的误区就是根本还不知道计算机世界是多么的庞大,自己的理论体系是多么的残缺不全,坦白的说,如果没进大学前没有学习过计算机相关知识的话,1~2年内是不可能去理解自己写的程序是如何能在现实世界中发挥作用的。
很多人曾经讨论过到底学习C好还是Java好?无数经典的回答无非都是一句话:各有所长!无论你从拿一种语言开始,当你真正深入到一定程度之后,你都会发现一种思想上的统一。现实社会上某些需求更适合C语言做,某些更适合Java做,如果暂时无法理解的话,就大概记住这么一句话吧:Java语言随着互联网一起诞生并壮大的。(不过千万不要认为自己理解这句话,如没有系统的整理过历史线索,又没经历过那个时代的,还是就简单的当作一句话记住吧)
其实编程语言只是一种工具而已,在熟练操作这种工具前,不妨问问自己对计算机世界有多了解?比如可以尝试着回答以下这些问题:
1、一台PC机不装任何系统的时候都包含了那些硬件和程序?当安装一个操作系统的时候,依次在PC机中加入了哪些程序?硬盘的组成结构是什么样的?可否在一块硬盘上放两个操作系统?硬盘启动又如何引导去启动哪一个操作系统呢?
2、学校分配了IP给你,你通过这个IP是如何连接上互联网的?需要什么样的设备才能接入互联网?速度又如何?在互联网中,你的标识又是什么?有哪些访问限制,是否可以突破这些限值?如果你们寝室有使用路由,不防看看路由器设置里的DMZ、Upnp、Firewall、Broadcast这些设置都是干什么用的?
3、等你安装了一个操作系统,大部分恐怕还是Windows吧,有没有想过这个OS如何控制你的硬件资源,这些硬件资源在OS里又转化成哪些指标。如果这个OS是这样构造文件系统的,那么另外一个OS又是否使用着另外一种思路去构造文件系统和控制硬件资源呢?
其实以上的这些只是计算机知识体系的不同方面的小细节而已,但是笔者也是在工作第1年期间,分别在不同的时期才找到这些问题的答案,这些知识又对笔者深入学习编程和软件开发起到至关重要的作用。想想刚进大学啥也不顾埋头猛写程序而忽略了整个知识体系的行为,现在觉得满稚嫩的!
接下来回到编程语言上吧,笔者在大三选择了Java深入学习的,后来接触了很多哥们,有在学校的成绩佼佼者,也有做了很多项目的所谓经验牛人,都声称是Java高手吧,似乎代码也写得非常好了。可是笔者却认为学好一门语言,比如Java吧,光靠写代码是远远不够的,许多辅助的能力和习惯最终才能帮助你真正成为一门语言的高手,笔者总结一共需要以下几点:
1、大量的代码编写,这是基础,不必多说
2、大量的代码阅读,源码阅读也好,前辈的代码阅读也好,不光读好的,还要读不好的
3、计算机基础知识,比如SSL概念、NAT协议、编译原理、TCP/IP细节等等
4、英文阅读和思考能力,这似乎是中国的程序员永远的痛啊
5、不断的总结思考,观察分析能力,简而言之就是不断更新自己的理解,否定那些误区
这些都是相辅相成的,至少笔者认为缺一不可。也许你用Java做了很多项目,其实一些规模还挺大,可你却说不清楚Java虚拟机的构造,工作原理,和内存回收机制;也许你做了很多网站,可你很可能说不出来Js的内存管理方式,HTTPS协议的内容和TCP/IP每次握手的步骤;也许你的代码经验越来越多,可是你却一直不知道数据库索引如何带来正面或负面的影响的,缓存、连接池、中间件,还有所谓的集群,从本质上都是怎么回事。这些欠缺最终都导致了你只能重复的去做一些项目,却永远无法再提升一个层次,虽然可能还是被人吹捧着,但这个社会有多浮躁,相信无需笔者多说。
可能听很多老师也说过,学软件很累,新的技术层出不穷,要不断的翻新,不断的学习。其实如果真的热爱这个行业,你会发现那些技术之间都有着千丝万缕的联系,本质上他们都是建立在同样的知识体系之上的。如果你学透了Java,你再看C语言,会轻易的发现C语言也很简洁、某些地方远比非常强大;如果你把Javascript学透了,你可能会发现groovy、ruby、perl等等脚本也各自有自己的优势和特点。再进一步,如果你对数据库、操作系统都掌握得很好了,你会发现自己忽然就多了很多关于系统架构、性能瓶颈、故障分析上的经验。从这个意义上来说,笔者认为很多经验本身就来自于知识体系本身,而非现实世界。
最后,笔者希望给那些还在学校学习的学生们一些学习计算机软件的忠告:
1-在学校最好不要急功近利的盲目的追求写代码做项目,时刻记得充实自己的知识体系
2-在写代码的过程中时刻保持好习惯,因为笔者见过太多例子,经验不足可以慢慢积累,习惯一旦坏了,就几乎不可能再改过来了,千万不要为了省事写出不负责任的代码
3-永远不要放松英语,因为你在学校如果不好好学上来,工作之后就更加难补习,最终很可能会成为你技术上升的瓶颈
4-学校课堂和老师只能带你入门而已,图书馆才是你充实各种理论最好的地方,毕业之后再难找齐那么多珍贵的资源学习了
5-千万不要去认为自己已经懂很多了,看到听到的任何经验都尽量自己去求证,因为在这个浮躁的社会里,信息的价值和正假都参差不齐
6-到实习工作之后,也要保持不停的思考和总结,要分清楚公司的模式是看重结果,而学习技术的模式永远是过程更重于结果,所以也决定了学习大多都在工作之余进行,保持好习惯