软件行业有两个貌合神离的现象,一是看起来是瞬息万变,新技术层出不穷,不过深入到这表象的背后,其实较多的原则都是通用的,而且也变化不大。就像武术世界一样,各有各的招式,但是基本功都是相通的。二是听起来是高科技行业,但除了少部分的研究者会有一些突破性的发现以外,大部分人不过是在使用他们的研究成果而已,也就是“代码的搬运工”。然而也不能因此就说,软件行业就像流水线一样了,只要用几次就熟练了。我有一些初中毕业的同学,让我也介绍他们来公司做这行,因为这行比起他们来说是高工资行业了,他们认为这些事情进去做一段时间就会了,我一时也不知道怎么拒绝。就像这本书里的内容,有些人看了也会觉得“高手也不过如此吗,大部分我也知道。”其实作者想说的是,编程是一种技艺,一种需要用心学习的技艺。这不再是卖油翁那个时代,“无它,唯手熟尔”就足够了,而是要额外多加思考的。比如在做一件事的时候,除了做熟练外,还要思考如何做的更好,更高效,例如很多人觉得开会没意义,觉得还不如去写代码,例如很多人长期都在重复做某件同样的事,但从来没有想过是否可以通过另外的方式取代会议,从来没有想过使重复某件事自动化,而后者就是作者在本书中的核心任务,也就是注重实效(pragmatic)的程序员要做的。
而我想,同样的思想也可以用在任何行业里,比如家庭中,比如教育小孩上,所以可以通过工作上这样的锻炼,养成习惯,在其他方面就较易融会贯通,这也不啻于是一种收获。
先来看看作者的哲学观点,也就是理论前提。作者先通过介绍人在软件工程中的作用及缺陷,去发扬人的积极能动性,和规避人的本能缺陷,从而在处理问题,寻求解决方案上能做出明智的选择。
作者有提到六个基础特征:
负责 在所有弱点中,最大的弱点就是害怕暴露弱点。我们可以为我们的能力自豪,但对于我们的缺点——还有我们的无知和我们的错误——我们必须诚实。所以面对人的本能缺陷,我们必须要有勇气去担责,而不是找借口逃避。在面对事情变坏了时候,不要说事情做不到,而是提供选择,通过选择什么方式能够挽回局面。
避免破窗效应 软件开发过程中,有一种类似于热力学定律的“熵”,无序,而且倾向于最大化。尤其是在大型项目上,功能多,交互频繁,更加不可控。假设有一些“破窗”(低劣的设计,错误决策,或糟糕的代码)长时间没有修复,那整个项目就会迅速恶化。修订好轻微破了点的窗户,哪怕是用木板钉起来,或者是挂个名片说明,比如注释掉,或者说明TBD,都可以防止进一步的被破坏。这也是较省事的,说明还处在可控情势,越往后面就越不可控,情势就急转直下,到最后“熵”赢得胜利,项目就失败了。
士兵还是村民 先来说个故事。 三个士兵打仗回家乡,饿了,前面的村庄却都锁着门,关着窗,因为战乱,村民也粮食匮乏。士兵们想了想,自己煮了一锅水,放了三块石头。吃惊的村民走出来看。 “这是石头汤。"士兵解释道。 "就放石头吗?" 村民疑惑的问。 "一点也不错----但有人说加一些胡萝卜味道更好。"然后一个村民跑开带回来了胡萝卜。 几分钟后,村民又问“就这些了?” 士兵说”几个土豆会让汤更实在。"接下来,牛肉、韭菜、盐等都来了。士兵和村民们煮了一大锅,一起享用了一顿美餐。
这个故事说的什么呢?有的时候,你知道要做什么,以及怎样去做。但是中间会遇到很多阻力,要么这个不配合,那个不愿意,要么这个待批准,那个要研究。这个时候就要拿出石头来了,先拿出一些合理的东西,做好它,拿给他们看,让他们大吃一惊。然后说“要是我们增加…可能会更好。”然后就等着他们来找你,给你增加原本你想要的东西了。因为参与正在发生的成功要更容易,让他们瞥见未来,就能让他们聚集在周围了。
就这样了吗?那村民是不是最后会觉得自己被骗了呢?这就是故事的另一面。就像为人熟知的温水煮青蛙,水慢慢的加热,青蛙不会跳的,直到被煮熟。从村民的角度看,他们也是过于集中注意力想着石头,被温和而渐进的欺骗了。我们也是,慢慢地,从微不足道的小偏离,逐渐的歪离了初心。 所以,做士兵,还是做村民?
note:这个和破窗效应不同之处在于,前者是没有注意到变化,后者是觉察到没人会在意。
完成还是完美 中国的成语故事,画蛇添足,也可以用来说明欲求更好,却把好事变糟。软件行业很多的产品并不是要做到完美才发布,很多用户宁愿用一些有缺陷的产品,也不愿等一年后再用上完美的产品,而且只是你眼中的完美。其实通过前期用户使用的反馈,可以更好的将产品引向最终解决方案。
在某些方面,编程就像是绘画。你从空白的画布和某些基本原材料开始,通过知识、艺术和技艺的结合去确定用前者做些什么。你勾画出全景,绘制背景,然后填入各种细节。你不时后退一步,用批判的眼光观察你的作品。常常,你会扔掉画布,重新再来。
但艺术家们会告诉你,如果你不懂得应何时止步,所有的辛苦劳作就会遭到毁坏。如果你一层又一层、细节复细节地叠加,绘画就会迷失在绘制之中。
不要因为过度修饰和过于求精而毁损完好的程序。继续前进,让你的代码凭着自己的质量站立一会儿。它也许不完美,但不用担心:它不可能完美。
知识资产 知识的投资从来没有人说是不好的,它永远是一个人最重要的职业财富。但是,有一点是大家遗漏掉的有,它是有时效的资产,尤其是软件行业。新技术、语言和环境的更新,旧有的知识会慢慢变得过时。随着知识的价值降低,你的价值也在降低,如何阻止这样的事,让资产升值呢?
就像金融资产,要保值就要经营。我从书中选取认为重要的三条。
定期投资:即使投资量很小,习惯自身也和总量一样重要。
多元化:你知道的不同的事情越多,你就越有价值。先把当前所用的技术掌握好,但不要止步,因为技术变化快,要扩展学习新的技术,才能更好的进行调整,赶上变化。
复盘:我认为这重心是在温故而知新。
那什么是获得智力资本、从而为你的资产提供资金的最佳方式呢?
每年至少学习一种新语言。不同语言以不同方式解决相同的问题。通过学习若干不同的方法,可以帮助你拓宽你的思维,并避免墨守成规。
每季度阅读一本技术书籍。讨论与当前的项目有关的有趣话题,养成习惯,一个月读一本书。在你掌握了你正在使用的技术之后,扩宽范围,阅读一些与你的项目无关的书籍。
也要阅读非技术书籍。记住计算机是由人——你在设法满足其需要的人——使用的,这十分重要。不要忘了等式中人这一边。 试验不同的环境。如果你只在Windows上工作,就在家玩一玩Unix(可自由获取的Linux就正好)。如果你只用过makefile和编辑器,就试一试IDE,反之亦然。
持续投入十分重要。一旦你熟悉了某种新语言或新技术,继续前进。学习另一种。学习的过程将扩展你的思维,使你向着新的可能性和新的做事方式拓展。思想的“异花授粉”十分重要;设法把你学到的东西应用到你当前的项目中。即使你的项目没有使用该技术,你或许也能借鉴一些想法。
好了。学了很多了。有人向你请教问题,可是你连起码的想法都没有。不要悲伤,不要止步,不要把问题搁在那里,把找到答案视为对你个人的挑战。去internet,去图书馆,去找有答案的人。但是,时间?时间很短缺呀。这就是需要预先规划了。
最后一个要点是,批判地思考你读到的和听到的。你需要确保你的资产中的知识是准确的,并且没有受到供应商或媒体炒作的影响。
交流 我相信,被打量比被忽略要好。——Mae West, Belle of the Nineties,1934 问题不只是你有什么,还要看你怎样包装它。除非你能够与他人交流,否则就算你拥有最好的主意、最漂亮的代码、或是最注重实效的想法,最终也会毫无结果。没有有效的交流,一个好想法就只是一个无人关心的孤儿。
作为开发者,我们必须在许多层面上进行交流。我们把许多小时花在开会、倾听和交谈上。我们与最终用户一起工作,设法了解他们的需要。我们编写代码,与机器交流我们的意图;把我们的想法变成文档,留给以后的开发者。我们撰写提案和备忘录,用以申请资源并证明其正当性、报告我们的状态、以及提出各种新方法。我们每天在团队中工作,宣扬我们的主意、修正现有的做法、并提出新的做法。我们的时间有很大一部分都花在交流上,所以我们需要把它做好。
如何做?
知道你想要说什么。 在工作中使用的更为正式的交流方式中,最困难的部分也许是确切地弄清楚你想要说什么。
规划你想要说的东西。写出大纲。然后问你自己:“这是否讲清了我要说的所有内容?”提炼它,直到确实如此为止。这个方法不只适用于撰写文档。当你面临重要会议、或是要与重要客户通电话时,简略记下你想要交流的想法,并准备好几种把它们讲清楚的策略。
了解你的听众 只有当你是在传达信息时,你才是在交流。为此,你需要了解你的听众的需要、兴趣、能力。假设一个做开发的滑稽人物在发表长篇独白,讲述某种神秘技术的各种优点,一定是把市场部副总裁弄得目光呆滞。这不是交流,而只是空谈,让人厌烦的空谈。
要在脑海里形成一幅明确的关于你的听众的画面。
选择风格 调整你的交流风格,让其适应你的听众。有人要的是正式的“事实”简报。另一些人喜欢在进入正题之前高谈阔论一番。如果是书面文档,则有人喜欢一大摞报告,而另一些人却喜欢简单的备忘录或电子邮件。如果有疑问,就询问对方。
但是,要记住,你也是交流事务的一方。如果有人说,他们需要你用一段话进行描述,而你觉得不用若干页纸就无法做到,如实告诉他们。记住,这样的反馈也是交流的一种形式。
让文档美观 你的主意很重要。它们应该以美观的方式传递给你的听众。
太多程序员(和他们的经理)在制作书面文档时只关心内容。我们认为这是一个错误。任何一个厨师都会告诉你,你可以在厨房里忙碌几个小时,最后却会因为饭菜糟糕的外观而毁掉你的努力。
做倾听者 如果你想要大家听你说话,你必须使用一种方法:听他们说话。即使你掌握着全部信息,即使那是一个正式会议,你站在20个衣着正式的人面前——如果你不听他们说话,他们也不会听你说话。
鼓励大家通过提问来交谈,或是让他们总结你告诉他们的东西。把会议变成对话,你将能更有效地阐明你的观点。谁知道呢,你也许还能学到点什么。
回复他人 如果你向别人提问,他们不做出回应,你会觉得他们不礼貌。但当别人给你发送电子邮件或备忘录、请你提供信息、或是采取某种行动时,你是否经常忘记回复?在匆忙的日常生活中,很容易忘记事情。你应该总是对电子邮件和语音邮件做出回应,即使内容只是“我稍后回复你。”随时通知别人,会让他们更容易原谅你偶然的疏忽,并让他们觉得你没有忘记他们。
除非你生活在真空中,你才不需要能交流。交流越有效,你就越有影响力。