学什么?
有些人对什么都感兴趣,硬盘上存着几百G的教学视频电子书破解软件,却只是仅仅保存着,没有转化成知识。有些人只知道自己刚进公司的那点东 西,JDK一定要1.4.2,VC++一定要6.0,系统一定要Windows XP,否则就是大逆不道。前一种是不知道自己想要什么,后一种是固步自封、眼界短浅,都不是一个程序员应该有的学习态度。
常见的程序员有Windows桌面开发,Linux服务器开发,Web前端开发,DB数据库相关,游戏服务器端开发,游戏客户端开发,RIA开发 (如Flash、Silverlight),移动开发(这个现在最火了尤其是Android和iOS),嵌入式开发,行业软件开发等等,基本上我列举的这些已经涵盖了大部分程序员类型,每个类型都有不同的基础知识以及扩展内容需要学习。另外有一些共通的内容如数据结构、基本算法、操作系统是都应该学习了解的。
另外一种分法是按照编程语言区分,但是这个比较有局限性,比如C程序员,一般是Linux服务器开发或者嵌入式,单纯懂C语言是没前途的。再比如PHP,就要对Web前端开发和服务器都有所涉及才能称得上称职。
在这里还要多废话一句,程序员相比其他行业是一个需要不停学习的行当,固步自封立刻就落后,经验值的累积速度会随着年龄的增长而降低,这也是为什么在国内很少看到50岁以上的程序员。至于架构师这个很多程序员期望的职业,我的看法是:如果架构师不写代码只会用PPT,只不过是一个大忽悠罢了。
我这篇文章只是介绍了一个方法,希望能帮助刚入门的朋友答疑解惑。根据这篇文章(怎样练习一万小时),如果你想得到一个比较不错的职业发展,长期不间断的练习是绝对必须的。
如果你的情商高于智商,非常擅长与人交往,那么程序员不是合适你的职业,做其它任何行业都会得到比程序员更好的结果。这也许有些偏激,但对于国内现状就是这样。十年以后,如果你还是在做编程,比较一下你的同学朋友就会知道我说的正不正确。
如何学?
我下面介绍的学习都是关于技术,但是首先要说明的是,一个优秀的程序员必定要对英语有一定的掌握,应该有比较强的读写能力,另外最好有一定的听说能力。
英语的学习如同技术学习一样,必须持之以恒。比如每天都听一篇 CNN Student News,泛听一下Nightly News等等。在Apple iTunes上可以免费订阅大量Podcast,只要你坚持听时时学,英语水平一定会提高。而且英文水平的提高会对你的职业带来非常大的帮助。
专精篇
无论什么行业,如果想成为专家,专精某个或者某几个方面是必要的,比如我就一直标榜:Windows Visual C++程序员。这里面就包含了Windows开发,Visual C++集成开发环境使用,C++程序员几个方面。
我们用学习英语的办法来说明如何专精“听读写说”,就以一名C#程序员来举例好了。
1)听看
第一步是听视频或者看视频。这是对某个方面知识快速了解的好办法,因为视频相比书籍文档更精彩一些,而且花费的时间相对比较少,注意力更集中一些。
在www.verycd.com上可以看到大量的编程类培训视频,只要你想学的不是非常偏门都可以找到。也可以在优酷上在线观看。如果你对自己的英文水平有自信,可以到youtube.com上观看英文的视频。另外C#是微软公司出品,微软公司最大的特点就是不差钱,他们的免费视频在网上都可以找到。
在verycd上搜索一下“C#”就可以找到好几页,比如这个http://www.verycd.com/topics/2857178/ 《传智播客.Net培训视频教程》,还有http://www.verycd.com/topics/2866044/ 《C#4.0中文视频教程》都可以下载听听。
2)读
读是专精某个领域知识中最重要的一步,读书、读文档、读代码都算是这部分。
先说说读书。读书首先是选对书,选书也难也不难。如果你身边有高人,可以请教高人。如果感觉没有高人,那么可以参考china-pub的排行榜,然后结合douban.com上的网友点评来选购,如果还没头绪,给我留言好了。计算机方面的书籍我建议选下面几个出版社的:人民邮电(知名品牌是图灵)、 电子工业、机械工业、清华大学出版社、东南大学出版社。不能说他们出版的一定是精品,但是精品基本上都被这几个出版社出了。比如C#方面,如果我选择我会选这一本作为精读——《C#与.NET3.5高级程序设计》
精读的书目不要多,一次应该限定在两三本左右。读书时应该备有以下工具:一个本子,一支荧光笔,一支签字笔。本子用于记录自己的心得体会,感觉比较精彩的内容可以标记出来。另外应该定期把笔记总结到网上(比如google docs中)。为什么不直接总结成电子文档呢?个人经验觉得本子是最快捷也最不影响阅读的记录方式。如果你觉得转成电子文档麻烦,那我还有一绝招,就是直接用数码相机用微距模式拍照,然后保存图片就好了。
如果涉及到代码,也应该把示例代码的运行环境准备好,比如C#就需要安装一下DotNet开发环境(比如Mono或者Visual Studio),学Java就应该安装JDK,学C语言应该安装一个gcc等等。
精读时应该尽量理解每个章节,章节后面如果有习题就应该把习题做完,然后再学后续内容。如果有相关示例代码,也最好把代码自己录入然后调试运行一 下。前面之所以提到选对书,就是因为如果你书选的有问题,那么精度这一步就很难进行下去,翻译的质量直接影响到你学习质量。精读时的进度也不要太快,免得自己理解不深。如果有可能,最好中英文比对一下(现在网络上可以搜到很多书的英文版ebook),这样不仅可以学习英文,而且最重要的是一些中文中比较难理解的,阅读英文部分可能会容易看懂,这个好像有些难理解,但是就我个人翻译的经验,一般来说翻译会把译者的想法带入,所以很可能造成一些歧义。
精读部分还包括读文档,因为很多比较新一些的知识还没有书籍,只有论文或者电子文档,还是建议把文档打印出来阅读。
读代码也是很重要的一点,如果不是天才,那阅读经典代码就跟阅读经典名著一样,对于编程语言的学习是非常必要的。选择一个好的阅读项目跟选书一样要精心,我建议先从比较精短的示例开始阅读,比如微软的C# code example或者像是www.codeproject.com上得分比较高的文章代码。阅读的代码一定要选择可实际运行的,这样可以在你感兴趣或者有问题的地方加上断点调试,观察变量、调用栈等等变化。
当掌握比较基本的知识以后,应该转向选择一些比较经典的开源项目。C#或者Java好的开源项目很多,这里就不多说了。
3)写
这里的写不是指前一步中写写书上的示例代码,而是说把前面两步学到的知识应用到实际项目中,这一步是最重要的。
再加强说明一次,把学到的东西应用在自己的实际项目当中,不管项目大小,这一步是自学过程中最重要的。
跑题一下说说,我看到过很多培训,内容很好,讲的也不错,但是最后收效甚微。问题不是讲师的水平不够,而是听众只是听了,没有用起来。光看是看不成高手的。
有些朋友会问了,我真不知道写什么,能给点建议么?我的建议是先从小应用开始,然后在写一个比较实用的程序。
什么是小应用呢?比如我喜欢看网络小说,就可以编一个浏览器一样的程序,打开以后它就直接访问小说网站。或者喜欢炒股的,可以编一个股票信息收集, 把网上的股票信息抓取下来。或者有一些自己需要的功能,比如定期抓取屏幕存成图片文件(这个对于测试人员比较有用),或者就是编一个程序它可以播放视频音频。小应用的意思是自己觉得好玩,功能上也不是很复杂,比较容易实现的。
写过一些小程序以后,有感觉了,那就应该把学到的东西用到自己实际项目当中,比如我学Lua,就用Lua加Sqlite数据库编写了以前需要手动实现的功能,也用Lua实现了对C++代码的解析生成html帮助文档。也许你工作项目未必需要这个知识,但是可以在一些边缘项目中使用,力争多用多写,熟能生巧,编程其实就是手熟罢了。
如果就是不知道该如何写一个小程序,那么有几种可能,一个是你想的功能太复杂,这个好解决,另找一个题目就是了;另一种可能是你精读的不够,我建议你把书再仔细读一遍,把书上的例子好好再次写写;如果题目也不复杂,精读也读了,还是不知如何下手,那劝你还是换一个行当好了。三百六十行行行出状元,不是一定要做程序员这一行的。
4)说
说,就是分享。分享的过程其实也是提高的过程。
一般来说,IT公司都有一个分享学习机制,程序员对自己专长的方向研究一段时间以后,整理成ppt,然后演示给大家看。也有一些兴趣组比如Python本地用户组也有类似线下分享交流的机会。如果有这样的机会,建议大家踊跃作为讲师参加。当你写讲稿或者演示的时候会突然发现某些方面其实还很薄弱,当听众提问交流的时候也会发现自己某些地方可能了解的不是那么透彻,这其实也是在学习。分享不仅仅锻炼口才,而且会给人你在这个领域比较精深的感 觉,而且从分享过程中你会发现很多以前没注意到的问题。
分享也是推广的过程,比如你看好C#语言,但是公司可能觉得没有这方面人力或者了解不够,你的传道会让大家对这方面知识了解的多一些,相关疑问也可以找你来答疑,这样也是提升人气值的好办法。
广博篇
一个优秀的程序员,不仅仅要有几样拿手的专业领域,还应该博彩众家之长,了解一下软件工程、架构设计等等方面的知识,还要及时跟踪了解国内外技术动态。
首先,应该像英语学习中的泛读一样,通读一些感兴趣的经典的书籍,比如《程序员修炼之道》《设计模式》《代码大全》《深入理解计算机系统》《快速软件开发》《Unix编程艺术》《编程珠玑》等等。这些书不像精读书可以立刻用到实际。但是这些经典书籍中的思想是可以一直影响整个编程生涯。其实这些书才是真正值得精读的。只不过没办法立刻见效,所以把它们作为广博篇中的提高级书目。
选书一定要小心,烂书就跟老鼠屎,会恶心你很长时间并且降低你学习的积极性。如何选一本好书参考前面精读部分。
想了解技术动态,订阅技术牛人的blog是非常重要的,比如我对redis很感兴趣,于是就订阅了redis作者antirez的博客,他有时候会对一些项目中比较重要的设计做解读。另外比如infoq.com,可以订阅他们的rss来跟踪最新的文章。我建议大家申请一个google账户,使用 google reader作为rss阅读器。在google reader中订阅很方便,直接加入博客地址就可以了。
想跟踪最新潮最酷炫最流行最时尚的编程技术,下面几个来源不可错过。
- 一个来源是reddit的programming讨论区 http://www.reddit.com/r/programming/,reddit的编程讨论区非常活跃,基本上流行的博客文章内容都会被人提交到讨论区,而且讨论的质量也很高。
- 另外一个来源是DZone的首页http://feeds.dzone.com/dzone/frontpage,DZone新闻有一个很有意思的特点是可以看到顶和踩的数量,一般顶数量比较高的,可以阅读。
- 再有一个是美味书签的programming http://www.delicious.com/tag/programming 和development http://www.delicious.com/tag/development ,这两个tag基本上涵盖了编程相关的链接(未必是新文章),可以作为参考。
- 最后一个新闻来源是HackerNews,也就是HN http://news.ycombinator.com/ ,HN与reddit programming有些类似,可以作为一个补充。
这几个来源更新非常快,基本上每天都可以看到上百条更新。我建议是不用每条都看,标题感兴趣的看一看,或者发现同时在几个源都出现的也可以看看。每天有个二三十分钟看完前面几个新闻来源,对于新技术动态或者各种技术八卦那就是了如指掌了。
如果你发现某个博客文章写得质量非常高,建议你可以订阅这个博客,一般来讲这样的博客质量都是水准以上的。我大部分的技术博客都是这么搜集来的。
另外现在博客上基本都有twitter地址,也可以follow这些技术牛人的twitter,由于推特的局限,相比博客的学习价值要更低一些,但是交流的时效性比较高。
邮件列表讨论也是一种很不错的讨论方式(相比论坛而言),比如python-cn,toplanguage都是很好的中文技术类邮件讨论组。
关于广博篇,本来还想展开一些,写写如何解决问题,但是这些内容在以前的博客中都有涉及。