读书笔记 —— A pragmatic programmer

最近把”A Pragmatic Programmer: From Journey man to Master”复习了一遍。这本书是2010年差不多六年前买的中文版,之前读过一遍。这次阅读似乎比之前的感触更多了一些,我想还是写下来加深下印象,希望能够更好地指导自己的实际行动。其实很多道理都很简单,或许是大道至简,或许不同的是是否能够用于指导实际的行动。
第一章主要是作为务实的程序员的基本原则。首先是要诚实地面对自己的不足,所谓 “The greatest of all weaknesses is the fear of appearing weak.”。然后对工作和自己的责任感,提供选择而不是借口。在记住Big picture的同时Don’t Live with Broken Window, 保持追求更好的心态的同时又知道什么时候适可而止。要坚持学习“An investment in knowledge always pays the best interest.”保持自己知识和能力的多元化。还有就是有批判的思维对待自己看到听到的,不是一味的接受。最后是强调沟通的重要性和基本的技巧。知道自己的观点,了解自己的听众,注意沟通的时机和方式。
What do you want them to learn?
What is their interest in what you’ve got to say?
How sophisticated are they?
How much detail do they want?
Whom do you want to own the information?
How can you motivate them to listen to you?
第二章主要是介绍务实的一些常用方法。包括增强正交性,避免重复,提高可重用性,其中提到测试可以做一个检验正交性的一个很好的途径。然后是保持构架的灵活性,实现可撤销性,比如一个系统换用不同的数据库。在许多未知因素的情况,曳光弹(Tracer Bullets)来帮助定位目标,通过快速构建框架让用户能够及早看到能工作的东西,同时对于开发者也是一个能够在其中工作的环境和一个集成的平台,更能感受到工作的进度。和原型开发不同,曳光弹是在产品中使用的代码,而原型开发则是实验性着的,是应该扔掉的代码。之后是接近领域编程(Program Close to the Problem Domain), 可以实现小型的领域语言自动生成代码。最后这一章节提到了估算的重要性,通过理解系统,分解系统,追踪自己的估算来提高下一次估算的准确性。
第三章是建议的基本工具,所谓工欲善其事,必先利其器。建议包括使用纯文本来保存知识,熟悉Shell, 用好一种编辑器(Emacs VS VI :-), Not Notepad),使用代码版本控制系统。在调试时保持”Fix the problem, Not the Blame”, 和”Don’t Panic”的心态。最后建议是学习一门文本操纵语言,以及在必要的时候构件代码生成器(Write Code That Writes Code).
第四章注重实效的偏执(Paranoia)。首先要坚信自己不可能写出完美的软件(You Can’t Write Perfect Software), 所以要防御性编程,按照合约设计。在出现问题时候Crash Early, 正确使用断言(不可能发生的情况)和异常(Use Exception for Exceptional Problems), 最后对于程序资源的管理要有始有终。
第五章 Bend, or Break是关于保持代码灵活性的技巧,首先是要使耦合降低到最少,Put abstraction in code, details in metadata 实现动态配置。然后是时间上的解耦提提高并发行。”Analyze Workflow to Improve Concurrency”. 最后是解耦的一些常见模式,包括Observer Pattern, Model-View-Controller pattern, 还有不太理解的用黑板协调工作流。
第六章是关于Coding时候的一些建议,包括”Don’t Program by Coincidence”, 总是意识到自己在做什么,按照计划行事,测试代码和假定,把事件花费在高优先级的事情上。理解算法效率,然后是重构的一些建议,包括”Refactor Early, Refactor often”,重构时候不要增加新的功能。接着是测试的重要性,”Design to Test”。最后是”Don’t Use Wizard Code You Don’t Understand”, 这让我想起了当年的VC6的MFC,后来专门读一本都没有太弄明白。
第七章Before the Project, 首先是关于需求的建议,所谓完美不是没有什么需要增加的,而是在没有什么需要去掉时候达到的。在需求分析阶段,要想用户一样去思考,不是搜集需求而是挖掘它们。要注意倾听自己反复出现的疑虑,不要过于Rush. 还有就是对于有些事件行胜于言(Some Things Are Better Done that Described)。
第八章是注重实效的项目。包括围绕功能,而不是工作职务来组织项目,然后是要使自动化无处不在,包括编译,发布,测试。测试要全面(Test State Coverage, Not Code Coverage), 使(Find Bus Once), 最后建议温和地超过用户的期望,同时”Sign your work”,一个注重实效的程序员一定是乐于接受挑战,勇于承担责任的人。
回头想一想,其实很多道理很是简单,但所谓大道至简。所谓要成为一个好的程序员,其实所需要的道理也多不了多少,只不过,当水平不够的时候,永远不能认识到那些朴素道理的重要。能不能让正确的原则知道正确的行动本身,其实就是区分是否是高手的一种显著标志,这些需要通过不断的有意识的强化实践和反复提醒,坚持学习,努力!
下一本书是”Soft Skills: The software developer’s life manual”.

随笔 —— 关于选择

最近换了公司,面临择组的问题,思考的比较多,有点累。正好在微博上看到别人的转载,有种豁然开朗的感觉。
优柔寡断,是人生最大的负能量。人生没有什么好忧桑的,从内心角度去看,人生路径上的任何一种选择都是错误的,无论你怎么选,内心都会有落差。因此,当选择来临,左和右,选一个边走就是。人生没有对错,只有选择后的坚持,不后悔,走下去,就是对的。一句诗说的好 —— 走着走着,花就开了。
回头想一想这么多些年来自己做的选择:
1. 2000年,保送还是自己考大学,选择了后者。绝对是最正确的选择,那个时候似乎不知道害怕。
2. 2004年,保送研究生还是工作,选择了前者,更多不是基于自己的思考,而是大部分人的选择,是对是错,我不好说。
3. 2007年,找工作,并没有太多的纠结,选择留在北京进入外企。似乎也是大部分人的选择。
4. 2009年,买房还是炒股,选择了后者,是人生至今最惨痛的教训。我似乎想不起来自己选择的原因,似乎是没有紧迫感,也是自己对于人生没有规划吧。不过性格中的弱点倒是在股市中一览无余,希望自己真的学到了一些东西。
4. 2011年,进入小米还是来美国,选择了后者,想一想还是有些后悔?但是出国来也是人生的一种经历吧。
人生注定是要面对很多的选择,而我似乎早已失去了当年高考时候的勇气,我想的确需要思考,但是也不用过于犹豫,毕竟坚持下来才是关键,无论哪个领域,都需要坚持才有积累。这样才能在机遇来临的时候抓住。想一想2010年面试Facebook的失败,那就是自己没有充分准备和积累的结果,至今仍是遗憾。
所以,不要犹豫,选择自己之前选择的领域,反思自己在一年多的时间中没有太多长进的原因,努力努力,夫复何言。