/*

* 这是 《构建之法》 第三版的草稿

*/

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] 。

再多说一句,这么多年之后,大家发现交易员的工作逐渐被程序和程序员取代了。

如果我们对职业有认真的态度,那就能发现很多证明个人能力的方式。


[XZ1]改编自儿歌<木桶有个洞>, 参见http://www.scoutsongs.com/lyrics/theres-a-hole-in-the-bucket.html

[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

构建之法 第三版 第3章 部分草稿 (剪牦牛毛、老程序员去金融公司的故事)...相关推荐

  1. 构建之法 第三版 17 章 部分草稿

    构建之法 17 章 人,绩效和职业道德 (<构建之法> 第三版草稿) 2016/12/23 17.1 领导力 在软件开发过程中,有很多平等合作,但是也有上下之分的领导/被领导关系,即使都是 ...

  2. 构建之法第三章学习小记

    0.写在前面 看了<构建之法>这本书,更多的注重实际,和我们在课堂的学到的东西完全不同,更多的是职场上的事.书中的每个问题都能引发我的深思,这些问题都是我在校园中根本发现不到的,瞬间感觉到 ...

  3. 0320 关于构建之法前三章的读后感

    0320 关于构建之法前三章的读后感 构建之法前三章读后感 读完了第一章后,开始对于软件工程的重要性有了一些必要的认识了.何为软件工程,这个问题一直在我的心头萦绕,做软件无非就是把代码写出来,将分支语 ...

  4. 构建之法1、2、16章观后有感

    构建之法1.2.16章观后有感 构建之法1.2.16章观后有感 第一章 概论 问题:何为BUG?要以怎样的态度对待BUG? 教材内容:P16.17 思考:说到BUG,大家的第一反应是漏洞.错误和失败品 ...

  5. 读《构建之法》第11,12章有感

    读<构建之法>第11,12章有感 今天我读了<构建之法>的11,12章,其中第11章主要讲了软件的设计与实现的一些知识,告诉我们具体如何去开发一个软件.而第12章则为我们介绍了 ...

  6. 算法导论第三版第十一章11.1-4

    算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要堆整个数组进行初始化时不太实际的,因为该数组的规模太大 ...

  7. 金三银四过后整理出的阿里最新Java程序员面试题目(2018.4月)

    目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术一面 Java IO流的 ...

  8. 码龄超过20年,依然对生活和编程充满激情,这是三位70后“老”程序员的故事

    大数据文摘出品 作者:周素云.张秋玥 加班996,生病ICU. 这是一句最近搅乱了很多程序员平静生活,也让所有的"社畜"认真反思人生的话题.但是,让程序员们真正感到焦虑的其实并不只 ...

  9. 构建之法 第三次心得

    构建之法 第四.五章心得 学习了第四第五章之后,我了解到了两人合作的注意要点,还有团队和开发流程.软件都是在相互合作中完成的,合作的最小单位是两个人.每个人的标准都不一样,对于什么是好的代码规范未必认 ...

最新文章

  1. 《C#精彩实例教程》小组阅读06 -- C#运算符与表达式
  2. Stack Overflow requires external JavaScript from another domain, which is blocked or failed to load.
  3. 为什么要学习DOS?
  4. HttpWebRequest.GetResponse() raises exception when http status code 400 (bad request) is returned
  5. 从源码分析DEARGUI之add_radio_button
  6. hdfs mv命令_大数据入门:HDFS文件管理系统简介
  7. Getting Started With Hazelcast 读书笔记(第七章)
  8. sed 执行错误:sed: 1: “…”: Invalid command code f
  9. 阿里2019财年收入达3768.44亿元 盘前涨幅一度超4%
  10. 一些很好的工具软件~
  11. OmniConverter: Mac上的最简单好用的免费全能音视频转换器
  12. 095 issubclass和isinstance
  13. 清华大学计算机课程对应教材,清华大学计算机专业大一到四的课程 教材详细名字...
  14. 硬盘检测神器-HD Tune Pro/Hard Disk Sentinel
  15. 瀚高DB兼容MySQL if函数
  16. 树莓派3B+ 安装 `ReSpeaker 4-Mics Pi HAT` 声卡,录音与播放
  17. JavaScript自动触发事件
  18. QML 从入门到放弃
  19. 梯度弥散与梯度爆炸及其解决方法
  20. 关于Redux到底是个什么鬼

热门文章

  1. HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)...
  2. php 之fsockopen(转)
  3. 02_MySQL约束课堂笔记
  4. java-弹簧布局(自适应窗口)
  5. Windows坐标系统
  6. c语言vbs,我的vbs整人程序
  7. python做excel表格柱状图_Python Excel 绘制柱形图
  8. python计算PR曲线sklearn.metrics.precision_recall_curve
  9. 读取打印TFRecord格式数据
  10. 吴恩达《机器学习》学习笔记五——逻辑回归