/*
* 这是 《构建之法》 第三版的草稿
*/
3.2 软件工程中的几种思维误区
正如我们在第一章讲的那样,软件有很多特性,软件开发有它自己独特的规律,如果不了解这些特性,软件工程师就会产生不符合实际的想法,在开发过程中走很多弯路。软件的模块之间存在着各种复杂的依赖关系,由于软件的不可见性和易变性,依赖关系很难定义清楚,并得到及时的维护和修复。对依赖关系的两种极端态度都会导致可笑的行为,并且无一例外地引起延迟交付。
被依赖关系束缚:一种极端是过于悲观,不想修复,出了问题都赖在相关问题上面,下面是工程师果冻和项目经理大牛之间的对话[XZ1] :
木桶有一个洞, 咋办啊, 大牛?
修哇,果冻!
用啥来修啊, 大牛?
用粗麻绳把它堵上, 果冻!
麻绳太长, 咋办啊, 大牛?
用刀砍短啊, 果冻!
刀太钝, 咋办啊, 大牛?
磨刀啊, 果冻!
磨刀石太干, 咋办啊, 大牛?
拿木桶去取水啊, 果冻!
木桶有一个洞,咋办啊,大牛?
不分主次,想解决所有依赖问题:另一种极端是过于积极,想马上动手修复所有主要和次要的依赖问题,然后就可以“完美地”达到最初设定的目标,而不是根据现有条件找到一个“足够好”的方案。我们还可以看一个小飞的故事:
小飞早上醒来之后,发现宿舍的哥们都出门学习去了,他想起昨晚下决心要和哥几个一起每天去图书馆自习,连续奋斗一个月迎接考试!他拎着书包出门,发现自行车轮胎气不足,于是就去找隔壁宿舍的果冻同学借打气筒,果冻说他的打气筒昨天拿去她女朋友荔荔那里去了,但是他们俩昨晚吵架了,打气筒还在荔荔的宿舍里。小飞说我可以去拿!果冻说最好带个小礼物去;小飞问带什么礼物呢?果冻说荔荔说过她想要手织的围巾,小飞想牦牛毛的围巾最好了,于是小飞就开始剪牦牛的毛[XZ2] 。
过了大半天,同学们自习回来了,看到小飞,就问:你为啥要追着牦牛跑啊?小飞摸了摸脸上的汗水,喃喃地说,我也忘了, 我本来是要去上自习的…
过早优化:既然软件是“软”的,那它就有很大的可塑性,可以不断改进,放眼望去,一个复杂的软件似乎很多模块都可以变得更好。一个工程师在写程序的时候,经常容易在某一个局部问题上陷进去,花大量时间对其优化,无视这个模块对全局的重要性,甚至还不知道这个“全局”是怎么样的。这个毛病早就被归纳为“过早的优化是一切罪恶的根源”:
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Yet we should not pass up our opportunities in that critical 3%. A good
programmer will not be lulled into complacency by such reasoning, he will be
wise to look carefully at the critical code; but only after that code has been identified[XZ3] .
王屋村软件学院的小飞同学在下雨的时候经常打着一把很精巧的小雨伞,和同学们一起匆匆赶路。同学们提醒他:
小飞,你这雨伞太小了,你的裤腿都湿了!
但是小飞还是打着这把小雨伞。几年过去了,在毕业酒会上,大家又谈起这个故事。小飞红着脸解释了原因:
我原来想,如果有女朋友的话,两人在雨中打着很小的雨伞,她就会靠我近一些。现在我还是单身,我想起了“过早优化是烦恼的根源”。
过早扩大化/泛化(Premature Generalization):
软件的”软” 还表现在它可以扩展, 在写一个程序的时候,需要某个函数可以处理整数类型和字符串类型的信息。有程序员往往灵光闪现-- 哎,能不能把类型抽象出来,让这个函数处理所有可能的类型?这样不就一劳永逸了么?有些软件本来是解决一个特点环境下的具体问题,有程序员一想,我们能做一个平台,处理所有类似的问题,这样多好啊!这样的前景的确美妙,程序员的确需要这样的凌云壮志,但是要分清楚必要性,难度和时机。本书8.8.1 提到的画扇面就是一个很好的例子。
王屋村的程序员这几种错误做法放在一起,就构成了下面这个靓丽的风景线:
(在3.2 后面加一段)
3.3 软件工程师的职业发展
21 世纪以来,中国大陆每年招收六百万大学生,其中的百分之十是在学习各种IT 相关的专业(计算机科学与技术、计算机工程、计算机软件、软件工程、管理信息系统等)。扣除读研究生(最终大部分也会走上工作岗位)、出国等分流,同时考虑到培训机构给就业市场贡献的大量劳动力,每年大致有四十万到六十万左右的“软件工程师”进入工作岗位。他们都是以什么样的心态对待这一职业的呢?在工程师抱怨这个行业的同时,我们可以由低到高,看看人们对职业的态度有哪些等级:
1. 临时的寄托或工作 ( Temporary Work)
在大学你会看到很多人选IT专业的原因和“热爱”没有什么关系,有些人是因为专业调剂来到这里,有些人是因为要拿一个文凭作为敲门砖(例如,跨专业考上软件专业的研究生,然后计划以硕士的资格去考公务员)。 他们处于低动力, 低技能的状态.
2. 工作 (Job)
这就是一个能挣钱养家的营生,如果别的营生更赚钱,那就会跳到别的地方去。一些人留在这个职业,只不过是因为他不会做别的。这些人会经常问“软件开发做到35岁以后怎么办”这样的问题。当然,如果了解和体会了软件开发的投入和回报的关系, 这些人的心态会进步到下一个阶段.
3. 职业 (Profession)
在工作的基础上,能加上职业道德,职业规划。只有在这个层次上可以开始谈有意义的“职业发展”。他们对“30岁以后”、“35岁以后”都有一定的打算。
4. 投身的事业 (Commitment / vocation )
把软件项目相关的目标作为长期的承诺,碰到困难也不退缩,一直坚持到完成任务。
5. 理想的呼唤(Calling)
一些人觉得这是理想的呼唤,通过软件可以改变世界,他们主动寻找机会,实现自己的理想。
很多读者会问, 我怎么知道这个工作就是我的事业, 或是理想的呼唤呢? 我上课、上班不用心,正因为这不是我想投身的事业,我想投身什么我也不知道,但是肯定不是正在学习的软件工程!
这些读者可以参考一下 Emanuel Derman 的故事,他从小喜欢物理,认为这就是“理想的呼唤”,在名校拿了理论物理的博士学位之后,非常想做“纯物理”研究,很看不起应用物理,更不用说其他工作了。但是由于经济和能力的原因,他不得不去一般的大学做物理老师,和家人两地分居,郁郁不得志。在35岁的时候(很多中国IT人士认为是程序员的职业终点),他改行做了贝尔实验室某不太重要部门的程序员,在那里领悟到了编程的优美和挑战;几年后他跳槽去华尔街证券公司做程序员,第一个项目是把交易员用的命令行程序改造为GUI 的程序(听起来也不是很高大上),也经常被资深的交易员呼来唤去,令人不爽。但是他坚持学习金融知识,做各种金融分析,逐渐成长为金融风险研究的专家,部门总经理(也被公司解雇过);最后在实践中把金融,数学,和软件融合在一起,在这个新领域提出了有广泛影响力的新模型,被评为金融界的“年度金融工程师”。他最后去一流大学开创了金融工程 (Financial Engineering) 这门学科。他回顾自己的职业经历时说:
回首当年,我(的态度)的确是错了。任何事情,当你仔细探究,你就会理解它的量和质;当你对一个领域的神韵足够了解,并开始连接这个领域的表现形式和实现细节的时候,任何一个领域都是会变得引人入胜的[XZ4] 。
再多说一句,这么多年之后,大家发现交易员的工作逐渐被程序和程序员取代了。
如果我们对职业有认真的态度,那就能发现很多证明个人能力的方式。
[XZ2]尾注:剪牦牛毛(Yak Shaving)是在国外编程编程界小范围流行的术语,描述为了间接地帮助实现一个目标,而做的一些次要而且和目标无关的工作。其中一个解释:http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html
[XZ3]尾注:来源于Donald Kunth 的论文 Structured Programming with go to Statements, ACM Computing Surveys, Vol 6, No. 4, Dec. 1974 (p.268).
[XZ4]尾注:故事来自《My Life as a Quant: Reflections on Physics and Finance》作者Emanuel Derman. ISBN 0470192739. 翻译的文字出自其中第六章。Emanuel Derman的个人网站: http://www.emanuelderman.com