《梦断代码》读后感 - 驱动,责任,交流,远虑

这三篇读后感原来发布在我自己申请的域名 yishan.cc 上面,后来这个域名被墙了。

 

 

(原文写于2008年12月)

几个星期前,我给《现代软件工程》课的每一个团队都发了一本 《Dreaming In Code》的中文版 《梦断代码》,要求写读后感。这本书讲了这样的故事:一群很有经验的代码牛人在先进软件开发模式的指导下,没有资金压力,在更多大牛的带领下,原计划用一到两年的时间开发出一个备受期待的个人信息管理软件(PIM),后来花了七年时间才完成这一创举,但是已经无人喝彩。我是9月份读的英文版,后来又翻阅了中文版,也有一些感想如下。

1)驱动

到底是什么驱动程序员和管理人员,测试人员长年累月投入到一个软件项目中去?

有理论认为,传统的软件公司用工资,职位,绩效考核等让一群经过面试和培训的人在严格定义的流程下一起工作(大教堂/Cathedral模式)。其实,用开源,社区,共享的模式会更好(集市/Bazaar模式)也许更好。正如在第26页所说的 [所有页码都是指英文版]

… it maps an alternate universe for programming in which time is simply less important because the work is cooperative rather than corporate, the workers are all volunteers, and the motivation is fun and ego, not financial reward.  [p26]

这理论听起来很好,但是我想起了两个故事:

1) 美国的一个肥皂剧Seinfield里有一集,讲了一个混混Kramer 热心地加入了一家公司,义务打工,起初他的口头幽默和热情感动了团队,领导委以重任,不料Kramer 根本没法儿把事情做好。最后领导只好找他谈话,Kramer 承认自己不行,他说- 但是俺是义务给你们打工的! 领导说,对,这就是让我们为难的地方。。。 项目中来了一位“义务打工的”,照理说,对项目只有帮助,而且别人是“义务”,你怎么好意思把别人赶走?

2) 我以前在西雅图的时候参加过一个非营利组织,成员们都是有热情为社区服务,而且义务付出。但是后来有些成员就逐渐找不到了,一些事情也不了了之。 由于大家都是义务贡献,你没法如何要求别人。

在Chandler 项目中,Andy Hertzfeld 就是这样一个义务作贡献的大牛。但是他也遇到了同样的"志愿者问题" –

They don’t know whether to count on you or not. And because you’re not getting paid, there’s lack of control. [p167]

后来这位Hertzfeld 也拍拍屁股走人了,大家可以为 fun 和 Ego 一起工作,但是如果fun  和 ego 都得不到满足,或者,那motivation 也会急剧下降。

2)责任 和驱动紧密相关的,是责任 – Accountability.

在 Hard Drive 这本书中,讲了这样的故事 – 由于Windows 一再拖延,BillG 最后跟 SteveB 说 – 如果今年下雪之前Windows 还没出来,你就别在这儿干了。 书中没有详细讲 SteveB 回头来又和他的团队讲了什么,但是第二天一个员工背着睡袋进驻了办公室。

很多年以后,Windows Vista 也经历了很长的拖延,在又一次宣布拖延之后,人们发现 Windows 团队中一个赫赫有名的 VP 已经卷起铺盖走了。

我们回过头来看,在Chandler 项目长达7年的拖延中,有没有发生过各位项目管理者引咎辞职的事? 好像没有。 [有不少人离开,但是没有人直接为项目延期负责]  既然我上一次拖延没有什么惩罚,那我为什么一定要拼了老命要避免下一次拖延呢?

在传统意义上的软件公司,如果项目延期,那项目原计划的收入就拿不到,拖延的时间再长一些,员工就得走人,否则整个公司都被拖垮了。在“集市”,社区,共享的模式下,大家都是义务,大家都在玩票,大家都做贡献,但是对最终项目不直接负责任,那到底谁负直接责任呢?

在《移山之道》 中,我讲了下面的例子:

阿超:我今天在“顶球”网吧看到大牛他爹在下棋,围观者支招的不少,有的说上马,有的说拱卒,有的说出车。大牛他爹一会儿招法就乱了,眼看局势不灵了,围观者一哄而散,老崔后来也没法,只好认输了。

一个围棋国手在一次重要的对局后,听到旁观者对棋局的进程有很多不同的看法,他也没有过多争辩,只是说:“无责任的旁观者和有重大责任的当局者的看法自然是不一样的”。

无责任的旁观者在支招后,如果不灵,他可以面不改色地继续支招,甚至可以给另一位对局者支招,不管最后谁输谁赢,旁观者随时都能安心地离开,回家吃饭。有重大责任的当局者在走了损招或败招之后,他很可能就要认输下台,丢掉比赛的奖金和头衔。

我在清华大学的这一次《现代软件工程》课,我发现有些学生好像不是特别投入,后来了解到,由于申请学校用的GPA只计算前三年的成绩,第四学年课程的分数就和申请学校没有什么关系了,所以比较“鸡肋”。有一个同学说,如果这门课是在第三学期,那许多同学们会非常计较分数,排名。现在,只要能过就可以了。这也许解释了不少项目中出现了“花最少的努力能过就行”的心态。

一个软件团队可以制定出动人的远景/Vision, 但是如果大家没有搞清楚驱动项目的各种因素和每个角色应付的责任,那Vision只是一句话而已。

时间和交流:时间对每一个人都是公平的,对每一个软件项目也是这样。

nearly all software projects require only 1/6 of their time for the writing of code and fully 1/2 of their schedule for testing and fixing bugs.  But it was rare project manager who actually planned to allocate developers’ time according to such a breakdown. [p17]

书中援引理论家的话说,最高效的软件团队规模应该是一个人,因为这样就不用交流了。 随着人数的增加,依赖关系的复杂,新手,老手员工之间的不同步,交流的成本会随着几何级数增加。在这里插播一个有奖竟猜:

当Windows 研发团队在开发Windows 2000的时候,团队内部每天有多少封e-mail 交流?

a) 90

b) 900

c) 9,000

d) 90,000

对每一个团队成员来说,他/她不仅要完成手头工作,还有报告自己的进展(通过email 或其他形式),回答别人的问题,了解其他人的进展。每个人的时间都是有限的,那怎么能保证我们在应付所有的交流/沟通之后,能有时间完成“手头工作”?

一个微软的同事前两天跟我说,他们最近没写什么代码,集中精力做“planning” 去了,大家写了很多PowerPoint,改了很多PowerPoint。然后给VP, General Manger 做了两轮汇报,然后根据VP们的意见再修改,再汇报。。。 PowerPoint 的风格变得非常专业和花哨,但是他们仍然没有完成Planning,进入实质开发阶段。华丽的 PowerPoint 中的每一个条目,也需要花PM 很多时间才能写明白,让VP 了解,同时也要花一线dev/test 很多时间才能实现,但是VP,PM 和 Dev/Test 面对同一个条目,他们心里想的是同一回事么?

外部交流

在Chandler 项目中,幸运的是,他们没有这么多VP 要汇报 (真正的VP  –  Al Gore 只露了一个小脸),但是我注意到他们用于交流的时间也非常多。例如

Every day the developers shared a chat room via Internet Relay Chat (IRC) [p139]

1 internal and  4 external email list set up. 

blogs, wiki’s…

这些都是花时间的!我看到团队成员还要回复素未谋面的爱好者的各种问题(例如质问他们为何不用某某框架,等等),当然这种透明度也满足了很多人的好奇心,开源,社区的优点么。。。 另一方面,项目管理人员发现他们面对着大量的任务没有时间完成。就像第一章 Doomed 的开篇就说到:

John is doomed,  he has 500 hours of work scheduled between now and the next release… [p11]

团队中其他人也好不到哪里去。那在这种情况下,是花时间继续参加各种讨论,blog,提供透明度 (Transparency),满足大众的好奇心,还是集中精力把自己“手头的事” 搞定?我从书中没有看到经验丰富的管理人员这时候采取了什么措施。事实上,在产品发布之后,没有证据表明,那些在IRC,Email,BBS 上发了很多议论的爱好者未必真正下载并使用你根据他们的意见开发出来的软件。那这么忙于交流是为嘛?!

事实上,这么多交流和信息并不能帮助人们回答一个最重要的问题 –

What had each programmer accomplished in the past week, and what task was next? [p141]

我的故事 – 在MS Outlook97 发布之后,网上对这个V1 版本有很多意见,也有很多期待。 其中很多用户在 NewsGroup (新闻组) BBS 上发表了强烈的建议,要求Outlook 支持直接阅读 NewsGroup/BBS 的内容,当时只有Outlook Express 有这个功能。Outlook 的开发成员一度认为用户的要求太强烈了,如果我们没有这个功能,可能V2就会很不受欢迎 (几个dev 已经做了一个初始版本)。 但是大家仔细分析后发现,在BBS上强烈发言的,就是那么几个人,因为他们老用BBS,因此他们的需求特别强烈,并且好像声势浩大,但是别的大部分用户根本就不上BBS,因此也没机会表达意见。所以Outlook 决定不做 NewsGroup 的功能,一直到现在。

内部的交流

除了外部的交流,还有内部的交流,随着一个人经验的增多,会有很多其他人来找你,为大大小小的事咨询你的意见。然而你自己也有无数的任务要完成,怎么办?微软的员工对这种情况也不陌生,微软团队允许一些人 “Go Dark”,他们可以关起门自己干活,敲门不答应,不回答一般的email,不参加会议等等。

据说很早以前,BillG 把开发OS/2 API 的任务交给了一个牛人,这位前辈接受任务之后,并没有开新闻发布会,建立email distribution list, 或者QQ 群,而是挂了一个和下面类似的牌子在办公室门外,把门一关,一个人闷头开发去了。

                不要打扰、投喂办公室里的动物

我们知道交流很重要,但是软件不是在QQ 群中交流出来的(当然,有人在QQ 群中交流别人写好的软件),而是一些人一行行写出来的。 这个过程需要集中注意力,避免打扰。在一个 “集市” 风格, “共享” 的开发氛围中,如何能保证关起门来开发呢?

远虑和近忧

Kapor 的团队看起来非常重视“远景”, 他们似乎没有近忧 – 这也许是致命的。

他们对于软件的基本架构/infrastructure 非常关心,例如对于存储系统,它们提出了下列需求:[p103]

  1. it has to make life easy for the Python programmers
  2. it has to operate efficiently over a network
  3. it needs to be able to handle very large individual date items and very large numbers of items
  4. it has to be reliable, using database "transactions."
  5. it has to support searching and indexing
  6. [0] User experience  //Kapor 后来加上去的,似乎不相干的一条远景。

后来对于Data Storage,又有如下构想:[p109]

  1. Provide programmers with as revolutionary a data model as users
  2. data can live anywhere.
  3. Data is safe from corruption.
  4. Data is quick to get.
  5. Data can be large.

非常令人佩服的远虑。 如果一个项目能同时实现其中3个目标,就已经能实用并吸引客户,开始赚钱了。 但是Chandler 项目的同志们不满足于只实现两三个,他们要实现全部5个梦想。

一群牛人在 “没有近忧,只有远虑” 的条件下讨论问题,最后只能议而不决。 在一次次延续到深夜的讨论中,有人感慨 – "How is this night different from all other nights?" //[p110]

没有近忧,或者说不用为近忧而负责 – “我们这个月的目标没完成不要紧,但是我们的远景一定要讨论好”。 导致了项目不能收敛 – 一个项目的一个里程碑中,不确定的事情应该越来越少,bug 也越来越少,直到产品发布。

Making firm technical choices was hard in the absence of a settled design, and settling on a design was hard in the absence of a technical roadmap. [p150 – 151]

正因为大家没有近忧,所以大家可以继续等待,设计要等技术决定后才好做,而技术的选择要等设计决定后才好开始。就这样,大家折腾到2005年的时候,他们才从高瞻远睹的远虑的云端中下来,有了第一个脚踏实地的计划:

But for the first time, at least, they could see they had a plan grounded in reality, rooted in estimates that … [p232]

Kapor 毕竟是聪明人,很多年以后,他说到了教训:

We’ve consistently overinvested in infrastructure and design… [p342]

收敛的另一个特点是 – 做过了的决定,就要执行,不要反复。事实上,Chandler 团队在很多决定上摇摆不定。 架构师Hertzfeld 度假回来,发现他带领其他同事奋战一个夏天得到的 Document Architecture 被扔到一边,原来 Kapor 决定 “We’ll have to come back and realign things”  [p168]。 如果你是做义务劳动的 Hertzfeld,你还能做下去么?

回到 “远景”, 我相信几乎没有合适的解决方案能满足“远景” 中的所有要求,很难找到 “多快好省” 的解决方案(书中提到 fast|cheap|good 不能兼得,这也是MSF 中 time | resource | feature 三个元素的矛盾)。但是往往存在若干方案,从不同的角度逼近最优,但是有各自令人讨厌的缺点。我们能否有智慧来选择这样一个方案,把近忧,远虑都慢慢解决?

我自己在微软正在做一个创新项目,前几天一位加入这个项目不久的优秀的开发人员对我说,我们去年设计的数据库问题太多了,如果我们早就像我这样设计,估计会好很多。我不是数据库的专家,我只能对他说,如果我们当时坚持要做到今天这样才发布,这个项目也许就做不到今天了。

换句话说,正是因为早期那些不完美,但是及时的设计,让后来者有挑剔这些不完美的奢侈机会。

我们每个人在使用这些不完美的软件(Windows, Outlook, 甚至Linux)的时候,都应该感谢当初设计者做出了正确决定,而那些坚持完美设计远景的项目,它们都到哪去了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程练习:模块化,单元测试,回归测试,TDD

这是《构建之法》实战教学的一部分。适合作为同学们的第二个程序作业。 第一个程序作业: 请看 “概论” 一章的练习,或者老师的题目,例如这个。 作业要求: 软件工程的作业越来越有意思了, 我们在第一个作业中&#xff…

《构建之法》参考书和链接汇总

《构建之法》 参考书和链接汇总 参考书汇总 一些读者对《构建之法》引用过的参考书也感兴趣,因此我把所有参考书单独列出来。其实人大部分的思想都是受某些外部信息的启发影响而来,很多道理看似新颖,其实别人早就讲过了😀。这个参…

现代软件工程讲义 7 分析和设计方法

(这一节在第一版的 《构建之法》中没有, 是《构建之法》电子书(多看版), 和纸版书第二版中新增加的内容,纸版书第二版预计2015年6月出版) 11.1 分析和设计方法 我们写软件就是要解决用户的需求,我们需要表达和传递下面这些…

三周的 软件工程实践课 课程安排建议

不少学校想在暑期安排软件工程实践课, 在这么短的时间内要做到软件生命周期的完整体验是有很多挑战的,下面是一个建议: 软件工程课程设计 - 三周计划,10 次授课,10 次学生报告。 第一周,准备: 在…

现代软件工程讲义 源代码管理

【现代软件工程课件】 源代码管理 -- 以实践促进学习 移山软件学院的学生果冻问老师: 为啥需要源代码管理? 我自己写代码多爽,别人要,就用QQ 传过去好了。 老师问:原始人怎么建房子? 果冻:或者找一个洞&…

现代软件工程讲义 个人项目和结对项目练习 地铁

很多老师反映教软件工程和程序设计的时候没有合适的题目,《构建之法》提供了下面的题目,都是从简单的解题思路入手,逐步增量改进。学生们可以复习基本的编程技能,然后逐步加入模块化,文件处理,单元测试&…

最新软件工程总结,项目模板,软工作业下载

(改了标题吸引目标用户) 老师教课,学生上课,首先要讲明师生关系。 其次,就是要说明这门课的底线是什么。 我们假设所有人写作业都独立思考,认真实践,不断改进,勇于创新... 这个假设通常是不全面的&#xf…

C语言 教学实践建议

(编程/软件工程课程怎么教) 这是2016年秋季学期和北京工业大学耿丹学院合作教学的计划。这也可以用于其他学校的 C 语言课程。 2016级有四个班,每班大约 32 人,每班配有一个有一定实际工作经验的助教,配合老师把课教好。 C语言是一门基础课&…

团队项目建议 - 英语学习 App

在这几年推广《构建之法》软件工程教学的过程中,我看到很多老师在讲软件工程的时候,虽然讲了很多年,但是手头没有任何项目,学生或者现想(得到一些大而无当,无法在一学期内完成一个可用版本的项目), 或者抄袭…

结对和团队项目建议 - 黄金点游戏

故事看这里: 背景故事 (链接) 作业 这个游戏可以变成一个持续发展的团队项目: 1)在课堂上玩这个黄金点游戏,用Excel 纪录成绩。过渡到做成简单的单机版游戏,锻炼基本的编程能力 2)两人合作,做成简单的 client/server A…

个人和结对项目 - 英语单词词频统计

个人或结对编程项目 英语单词词频统计程序 (最新版本在这里) 实现一个命令行程序,支持几种模式下的单词词频统计 Implement a console application to tally the frequency of words under a directory. For all text files (file extension: "txt") unde…

个人或结对项目 - 动态显示程序运算的过程

现在网上有很多关于动态显示排序过程的小工具,小程序。 1) https://visualgo.net/sorting 2) http://jsdo.it/norahiko/oxIy/fullscreen 3) http://coolshell.cn/articles/4671.html 我们能否也做一些类似的工作呢? 在在这个作业中 (http:…

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

构建之法 17 章  人&#xff0c;绩效和职业道德 (<构建之法> 第三版草稿) 2016/12/23 17.1 领导力 在软件开发过程中&#xff0c;有很多平等合作&#xff0c;但是也有上下之分的领导/被领导关系&#xff0c;即使都是平级的员工之间&#xff0c;也有老师傅/新人&#xf…

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

/* * 这是 《构建之法》 第三版的草稿 */ 3.2 软件工程中的几种思维误区 正如我们在第一章讲的那样&#xff0c;软件有很多特性&#xff0c;软件开发有它自己独特的规律&#xff0c;如果不了解这些特性&#xff0c;软件工程师就会产生不符合实际的想法&#xff0c;在开发过程中…

软件工程课的分数系统,和打分方法

考考考&#xff0c;老师的法宝&#xff1b;分分分&#xff0c;学生的命根。 以《构建之法》为核心的软件工程课已经在全国几十个学校开展了好几年&#xff0c;由于采用 Learning by doing (做中学) 的方法&#xff0c; 同学们通过实际的作业获得分数&#xff0c;逐渐累积并转换…

现代软件工程作业 – 计算最长英语单词链

结对编程 – 计算最长英语单词链 《构建之法》练习题 大家经常玩成语接龙游戏&#xff0c;我们试一试英语的接龙吧&#xff1a;一个文本文件中有N 个不同的英语单词&#xff0c; 我们能否写一个程序&#xff0c;快速找出最长的能首尾相连的英语单词链&#xff0c;每个单词最多只…

现代软件工程讲义 个人项目和结对项目练习 四则运算

这是构建之法 《现代软件工程》课的作业题之一。 下面的题目&#xff0c; 从简单的命令行处理和数据处理开始开始&#xff0c;让同学们逐步练习&#xff0c;巩固算法&#xff0c;学会松耦合的设计&#xff0c;学会PSP&#xff0c;源代码控制&#xff0c;单元测试&#xff0c;回…

软件工程作业 - word count

(编程和软件工程作业系列) 实践最简单的项目&#xff1a;WC 实践是理论的基础和验证标准&#xff0c;希望读者贯彻“做中学”的思想&#xff0c;动手实现下面的项目&#xff0c;并和别人的成绩相比较&#xff0c;分析产生差距的原因。 1. 实现一个简单而完整的软件工具(源程序特…

软件工程课, 编程课 助教的工作介绍

在用 "做中学 (Learning By Doing) " 方式讲授编程和软件工程课的时候&#xff0c;我们认为助教在其中起了很大的作用。 费曼学习方法的精髓是 “以教代学” 。如果不能向其他人简单地解释一件事&#xff0c;那么你就还没有真正弄懂它。 我们课程的各位助教&#xff…

软件工程资料 - 优秀的大学怎么教程序开发和软件工程课

他山之石&#xff0c;可以攻玉 世界上很多大学都有不错的教学方法&#xff0c; 例如我们曾经的助教总结他在国外的学习经历&#xff0c;可以看出老师和学校对于如何教好课是花了心思&#xff0c; 有很多投入的。 一门课怎么上&#xff1a; https://zhuanlan.zhihu.com/p/206103…