作为一个程序员,难免要不断学习新东西。其实不光是程序员,所有想自我进步的人都需要学习。学习不等于上学。学习其实主要是自学。自学不一定是是自己学习,可以和别人一起。自学,我的理解是自主学习,不需要别人催,这一点很重要。小时候,每天上学不知道为什么,反正好好学成绩好父母就开心,玩的时候,父母也不会太限制。但是,一旦不上学或者离开学校仍然自主学习的人才会不断提高和进步。比如小时候,暑假很长,除了无聊的暑假作业,如果父母,长辈,哥哥姐姐可以给出一个书单,那么在家看书会是一个很好的提高自己的机会。我记的我小时候,读过一些连环画,世界名著翻译本,例如汤姆索亚历险记(英文版在这)。虽然内容我完全不记得了。对了我还读了《钢铁是怎样炼成的》(应该是这版)。印象中就是男主角的青春爱情很吸引人,他的革命热情完全不理解。还有一些书,我都不记得了。每个人上小学到上大学之前,暑假要是能多读一些书,对他/她的人生影响是很大的。我现在觉得上学时的暑假读书太少了。当然这和我那个年代有关系,书很少,受过良好教育的长辈很少,自然指导就很少。但是,我觉得我幸运地地方就是我父母对我看书十分支持,而且上学的过程中我认识了很好的朋友。我从朋友那借到了一些书,虽然我也不记得了。但是,我印象深刻的是,有一次我去同学家。我看到他的卧室墙上挂着一个地图,我的直觉是中国地图,因为我家里也挂了一个。但是,我离远处看上去觉得轮廓不一样。走近了一看,原来是一张美国地图。我就非常好奇问为什么挂美国地图。我同学说那是因为他在读《华盛顿传》(不记得当年的版本了,就在amazon随便找一本。)。我还是奇怪,看华盛顿传为甚麽要挂美国地图。他说因为华盛顿传里有好多地名,而且华盛顿领导了独立战争,看了地图才能明白当时的形式。哇,这个对当时的我非常震撼。觉得真是不一样的读书方式。我同学很大方地说,等他看完了,就把书借给我看看。我当时很开心,一是好奇想看看这个华盛顿传是否真的这么有趣,二是为自己认识这样的朋友感到十分高兴。所以,这也是我所说的自主学习,可以两个人一起。我们就有了一提起讨论的东西。后来,也是他带着我周末一起去市立图书馆看书,上自习。这麽多年下来,一直是我很好的朋友和榜样。 OK。扯远了。说了这么多,就是想说看书是自主学习的一个方式。那么,对于程序员这个职业,看书学习新技术就是十分必要的。在这里,我想列出一个简单的书单以供参考。 首先,我的建议就是看英文书。中文书很难看懂,而且错误很多。我上学的时候就是在这方面吃了苦。那么,问题是英文不好怎么办,我也是同样的问题,但是我没能解决。在我上大学时,还是看了好多中文书或者中文翻译的书。我想现在的大学生应该英语都没问题。所以,一定要看英文书。那英文实在不好怎么办,买一本英文的,再买一本翻译的。对比着看。是我知道,这有两个缺点,一费钱,二费时。费钱,两本书,有时翻译的很烂,或者没翻译的。费时,看英文的很慢。但是,没办法,想以后从事这个职业就得看的懂英文的科技书。一旦,看完一本,后面就可以很顺利看英文的书了。其实,这种技术类的书比小说容易看多了。 下面,我列出一些我个人比较喜欢的书,有基础类的,也有技术类的。

  1. SICP,structure and interpretation of computer programs, 这是一本经典教材,被誉为是魔法书,看封面就知道了。这是MIT的EECS一年级教材。如果是计算机专业的学生,一定要读一读这本书,非常震撼的一本书。我是上研究生的时候才从图书馆里借来看一看。我当时就对作者佩服的五体投地,觉得应该上本科的时候就看。这是一本从概念上讲解计算机程序设计的书。一开始接触可能有点难,但是看过五章之后,你就会有一种上到一个高层次的感觉。而且有这本书垫底,以后的计算机系专业课学起来会非常轻松。而且MIT给出了作者的教学视频,真的是功德无量。互联网时代使自学变得容易了。当然,还是那句话,得自己有定力和意愿去学。
  2. How to design programs: an introduction to programming and computing. 这本书也是一本基础书,比魔法书容易上手。而且循序渐进,没有任何programming的知识也能看懂。非常适合大学一年级的学生。
  3. Effective Java. 说了两本大部头的科班书。我们来说说这本技术书。在我上学的那个时代,Java是一门新兴语言而且前景美好。这本小册子就是Java领域的必读经典,作者也是Java libraries的开发者,有着丰富的经验和对Java的透彻理解。这本书对于工作中的实际程序非常有帮助。看过这本书之后,对于语言的运用会上一个台阶。
  4. Refactoring:improving the design of existing code. 这本书也是OO领域的经典书。我第一次知道这本书也是从我一个同学那里。上研究生的时候,我在宿舍里玩着我的玩具版本的Java代码,我同学看到说:“你应该看看重构这本书。”我就去图书馆借了这本书果然是本好书。感谢我这些同学,真是对我帮助很大(回头我要写一个系列blog介绍我这些大牛同学,呵呵)。总之,这本书一定要看。书中的知识在每天的工作中都会用到。我个人甚至觉得比design patterns还重要的一本书。作者Martin Fowler也是一个大牛。总是能把问题讲的浅显易懂。我个人非常敬佩的业界翘楚。有关这本书的理解我会专门写一篇blog来介绍。

  5. Head first design patterns. 这是一本很有意思的书。写作风格很平易近人。让这么一个挠头的问题变得比较容易懂。对于,刚开始接触design patterns的人,这本书很友好。当然,这本书的code也是Java写的。如果像我一样看到那本经典的 gang of four 写的design patterns 就头晕的话,这本很容易上手。说一下我的感受,四人帮那本适合C++很熟的人,并且不惧怕学术词汇的人来读。初学者一般不知道作者在说什么,但是如果有经验的开发者读那本书的话,就会觉得说的太好了。我个人更喜欢Java的这本。但并不是说这本就完全轻松读懂。也是要自己敲Java code的,而且如果完全没有产品级代码的经验就体会不到design pattern的好处。因为每一个例子都是直接上design patterns去解决。初学者就觉得好厉害呀,但是甚麽时候用,不知道。这也就造成了有了锤子看谁都是钉子的问题。或者过度设计的问题。代码变得很难懂。而且design patterns这么多,根本不能全记住。这也是我为什么更喜欢refactoring 那本书的原因。从一个具体的小问题出发,一点一点循序渐进的把代码重构到某一个pattern. 非常的自然。而且顺带说一下,如果你先看了我推荐的第一本书,SICP的话,就会觉得OO的design patterns 太麻烦,太小儿科了。我是先看的design patterns 后看的SICP,发现这不就是functional programming原生支持的吗?OO费了这末大的劲儿。不管怎样,如果用OO 或者Java,强烈推荐看一下这本书。
  6. Working effectively with legacy code. 这本书对工作非常有帮助。因为在工作中,很少有机会重头开发一个全新的项目。那也就意味着你要接着做别人做过的项目。这必然会面临遗留代码的问题。而这本书就是针对这种问题的。作者以其丰富的经验和敏锐的洞察力娓娓道来如何在遗留代码中加入新功能同时保证少出bug,使遗留代码得到演进。我在实际工作中使用了作者的方法,非常管用。这是一本强调实践的书,真的很好用。
  7. Agile software development, principles, patterns and practices. 这是一本比较综合的书,从概念到方法论再到最佳实践,一应俱全。主要介绍了敏捷开发方法。说一个关于敏捷的传说,话说当年在硅谷,startup要是不用敏捷方法根本拿不到风头。呵呵。这本书让我重新认识了OO。作者深入浅出,理论实践相结合。作者Robert. C. Martin 是业界响当当的人物。这是一本不可多得的好书。

今天我来介绍一本很有启发的书虽然和软件开发的关系不大。但是书的作者是硅谷响当当的人物, Reid Hoffman。在介绍这第8本书之前,先来八卦一下作者。这个大牛就是PayPal黑帮的核心成员。这个Paypal 黑帮中的人物都是硅谷的创业者,我会在介绍另一本书时提到。作者一直想建立一个职业社交网络,也就Linkedin。基于他的经验和理念,最终他写了这本书,Startup of you.

  1. The startup of you: adapt to the future, invest in yourself, and transform your career. 这本书提出一个很有意思的观点就是不管你创不创业,你都需要企业家精神。即便你是公司职员,给别人打工的,领一份工资。貌似企业家精神没啥用。但是换个角度,把自己想做是一个提供服务的公司,而你就是这个公司的老板兼员工,付给你工资的公司就是你的客户,虽然你只有一个客户。(这又让我想到了北美的通常就业职位有两种形式,一种是permanent, 一种是contractor。而contractor就正好符合这个概念。以后有机会我会写篇blog详细介绍北美的这两种形式的就业。)但是,这种角色的转换带动了思考问题的角度的转换。如果你是公司老板你是不是想把自己的服务做好,从客户那里赚更多的钱。这就会促进自己学习技能,提高知识水平。而不会消极的觉得自己就是打工的,给一份钱干一份活儿,干多了自己就亏了。因为,这时候你把自己当作一个服务公司,你是替自己打工,你为自己将来争取更多客户做准备。客观上,作为个人你也就不会担心自己被裁员了。因为这就是换了一个客户而已。如果你的服务够好,永远都是有客户的。并且这又引出另外一个问题,什么是铁饭碗。小时候经常听爸妈说铁饭碗这个词,比如中国大型国有企业,垄断行业,比如铁路,邮局。这就是意味着一辈子在一个地方一个领域工作从来不用担心被裁员。从另一个角度说也就是基本上每天干同样的事情一直到退休。但是,这本书提出,铁饭碗是永远有工作,不一定是一个地方,一家公司,一个行业。而是说你永远可以有工作,因为你是一个提供服务的公司,你具有企业家精神。这本书的另一个优点是,它不但提出理念,还给出了具体步骤去实践。这个太有帮助了。比如,如何开始一个新的职业,自己完全没经验的领域,作者给出了自己的例子,然后一步一步的说明。书中提到的另一个概念就是networking,这也和北美找工作的环境暗合。加拿大的找工作培训经常说隐藏的工作机会是正式发出来的工作机会的一半。这里就体现了networking的重要。总之,这本书是一个需要反复阅读的小册子。