现代软件工程 第十五章 【稳定和发布阶段】练习与讨论

15.3.0 案例分析

可以看看这两个学生项目的例子,推断出这些团队的血型:

STG游戏的跳票(为了完美,推迟了7天,但是7天之后也没有发布……) [i]

英语学习软件(说了“明早发布”,但是明早一直没到)[ii]

15.3.1  反动分子阿超

在最后的稳定阶段,阿超不断地把事情推到下一个版本,二柱和果冻都不耐烦了——为什么不拼一下,把所有事情在第一版搞定?

阿超: 有两种做法——

1. 根据事情的轻重缓急,安排大部分事情在下一个版本做。正因为我们对项目、团队、商业模式有信心,才会把很多事情安排在以后的版本中。

2. 拼一下,把所有事情搞定,后果是大家都累得够呛,[leal2] 然后人也走了,没有人有兴趣做下一个版本。

二柱: 我记得当年我们公社组织修水利的时候,大家都拼了老命,有几个前辈都牺牲了,才把水库修好……难道这些不是有价值的么?

果冻: 对!我记得山坡上还用巨石刻了一些标语,有两个前辈就是牺牲在炸开巨石刻字的时候。

阿超: 是啊,现在看起来,那些刻在山上的标语是属于可“cut”的功能。至少我们可以把它推迟到下一个版本。到今天,我们大家都意识到刻巨大的“人定胜天”标语不是特别重要的“功能”,对么?这样岂不更好?当年我们的叔叔伯伯们的确没有必要“誓死完成”所有的任务。

二柱: 要在以前,你就是反动分子。

阿超: 我们写商业软件,是要赚钱养家,如果自己都做得疲惫不堪,精神不振,那拿钱来养啥?如果还要刻字,我建议在山坡上刻“以人为本”几个大字。

15.3.2  银弹之战

银弹:为了避免项目的成员为了一些问题争执不休,移山公司发明了银弹(Silver Bullet)这一工具。简而言之,就是每个角色的代表(Dev/Test/PM)在项目过程中可以使用有限次的“停止争论,按我说的办”的武器 – 银弹。银弹一出,大家就要听话。当然,银弹用一个少一个,下次有争论的时候,别人就更有机会使用这个手段了。

讨论 - 银弹真的有用么?

15.3.3 扁鹊三兄弟

果冻: 我听说了萝卜和白菜的故事,其实类似的事儿古代早已有之,请看一段关于“扁鹊三兄弟”的古文:

王独不闻魏文王之问扁鹊耶?曰:‘子昆弟三人其孰最善为医?’扁鹊曰:‘长兄最善,中兄次之,扁鹊最为下。’魏文侯曰:‘可得闻邪?’扁鹊曰:‘长兄于病视神,未有形而除之,故名不出于家。中兄治病,其在毫毛,故名不出于闾。若扁鹊者,镵血脉,投毒药,副肌肤,闲而名出闻于诸侯。(《鶡冠子·卷下·世贤第十六》)[leal5] 

扁鹊是这么说的:“俺大哥治病是看病人的神色,病还没有表现出来他就把病给治了,所以他的名声不出家门。俺二哥治病是在病人稍有不适的时候,就把他们搞定,所以他的名声不出巷子。而我扁鹊看病用的是疏通血脉的针、有毒副作用的汤汁、埋入肌肤之内的草药。所以我的名声反倒传遍了各个诸侯国。”

二柱: 这个跟王屋河的防洪是一个道理,上游搞得好,不发洪水没人知道,下游要决堤了,一堆人上去堵,死伤几个,就出名了。我们最善于搞末端治理。

在软件开发上,如果项目早期就发现并解决了问题,除了“家里人”,没人知道;项目中期发现问题并解决,项目的许多相关人员“公司”都知道了;项目后期出了问题,我们要加班,重写代码,hack原来的设计,开一些后门来解决问题(下一些副作用很大的猛药),总算把项目给救活了,这时候全公司的人都知道了。

阿超: 我记得小学六年级学过“曲突徙薪”的故事,也讲了类似的道理。我们往往奖励末端治理的英雄,但是最初提建议的人未必得到奖励,移山公司会不会也是这样?

15.3.4 分析一些著名的失败项目 - 例如,电脑控制的丹佛机场行李系统。
如果你们小组要给这个项目做 Postmortem,你会怎么总结呢?
http://calleam.com/WTPF/?page_id=2086
http://www.nytimes.com/2005/08/27/national/27denver.html
  • Denver Airport to mangle last bag
  • The baggage system at Denver : prospects and lessons
  • MSNBC on Denver’s Automated Baggage System
http://www.computerworld.com/article/2556725/it-project-management/united-axes-troubled-baggage-system-at-denver-airport.html 

[i]      http://www.cnblogs.com/buaashine/archive/2012/12/17/2821563.html#2590003

[ii]      http://www.cnblogs.com/SuperBrothers/archive/2012/12/18/2822585.html


15.3.5  一个Postmortem 的实例

移山公司 Stone 项目 Postmortem 结果

1.  我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和 典型场景有清晰的描述? 想做的事情还是太多,导致很长时间不能集中精力。

2.  是否有充足的时间来做计划? 有时间,但是大部分人并不知道如何利用这一段时间来做计划。

3.  团队在计划阶段是如何解决同事们对于计划的不同意见的? 主要通过喝酒聊天解决,另外阿超有某种“光环”,大家对他有些崇拜, 这样他说的话别人都比较容易接受,也没有特别强烈的不同意见。

计划

1.  你原计划的工作是否最后都做完了?如果有没做完的,为什么? 很多事情都没做完,大家认为最后没做完的事情,都是可有可无的。

2.  有没有发现你做了一些事后看来没必要或没多大价值的事? 很多,但是大家认为与其不断地争论某些事情有没有必要,不如做了 再说。

3.  是否每一项任务都有清楚定义和衡量的交付件? 大部分都没有,因为我们大家都不知道做到多少才叫“好”。有些情况下, 大家对细节过早地进行讨论,花了很多时间。不如等到后来再讨论。

4.  是否项目的整个过程都按照计划进行? 基本上,因为阿超的“光环”,大家大部分情况下都听他的。

5.  在计划中有没有留下缓冲区,缓冲区有作用么? 有缓冲区,原来认为没有必要,后来发现还是有用的。主要是各人进 度不一,有些模块不断地有一些小问题,花了很长时间才能做好。

6.  将来的计划会做什么修改?(例如:缓冲区的定义,加班。) 应该明确缓冲区的长度。

资源

1.  我们有足够的资源来完成各项任务么? 很多情况下,花了不少时间来设置机器,以及设置用来测试的数据。

2.  各项任务所需的时间和其他资源是如何估计的,精度如何? 开始精度很粗略,后来随着项目任务的加重,大家只顾得上干活,没 时间考虑精度问题。

3.  用户测试的时间,人力和软件 / 硬件资源是否足够?

4.  你有没有感到你做的事情可以让别人来做(更有效率)?

比如网页的 CSS 设计,最好由美工设计来做,开发人员最后做实现即 可。我们要有专职的设计,不要临时拉人来帮忙。因为临时帮忙的设 计师对整个项目了解不多,事后也找不到他。

变更管理

1.  每个相关的员工都及时知道了变更的消息吗? 由于大家都坐得比较近,小道消息传播得比较快。

2.  我们采用了什么办法决定“推迟”和“必须实现”的功能? 用了“银弹”,除了导致一场短时间的斗殴之外,还可以。银弹的目 的就是一种威慑。

3.  项目的出口条件(Exit Criteria)是否得到清晰的定义? 大家都不太懂“出口条件”是什么,经过这一个项目之后,稍稍清楚了一些。但是说实在的,在这个项目里面我们没有用到太多。

4.  对于可能的变更是否能制定应急计划?

基本没有,到时候随意抓人顶上。

5.  员工是否能够有效地处理意料之外的工作请求?

规定所有请求都转到 PM 那里处理,这样减轻了开发人员的压力,让 他们有大部分时间花在自己那一亩三分地上。

设计 / 实现

1.  设计工作在什么时候,由谁来完成?是合适的时间,合适的人么? 有些界面的设计过早,大家为了字体的大小、按钮的尺寸争论,事实 上这些事情不应该由开发人员在项目早期来做。

2.  设计工作有没有碰到模棱两可的情况,团队是如何解决的? 很多,大家都不知道如何解决。就看具体执行的人是如何解决的,有 的解决得好,大家并不知道出过问题;有的经常拿出来讨论,大家都 知道问题在哪里,但是没法达成一致。

3.  团队是否运用单元测试(Unit Test)、测试驱动的开发(TDD)、 UML 或者其他工具来帮助设计和实现?这些工具有效么? 运用了单元测试的员工,整体来看 Bug 不多,没有用单元测试的员工, 后期比较忙。

TDD 要求 PM 要清楚地确定功能说明(Spec),我们目前还做不到 这一点。

一个好处是:大家都追着 PM 要 Spec,弄得 PM 的压力很大,以前 谁都不搭理 PM 的 Spec。

4.  什么功能产生的 Bug 最多,为什么? 交易功能由于牵涉的面太多,Bug 也最多。

5.  代码复审(Code Review)是如何进行的,是否严格执行了代码规范? 刚开始还像那么回事,后来就变成走走形式。往往是“小飞,我要提 交代码了,审核人填你的名字,怎么样?”其实小飞后来也没看代码。

测试 / 发布

1.  团队有没有测试计划?为什么没有? 我们有测试计划,而且因为有了计划,测试人员好像不再像无头苍蝇 一样胡乱测试。

2.  有没有做过正式的验收测试?

有些测试人员最后不敢说验收测试不成功,似乎是迫于某些开发人员 的“淫威”。

3.  团队是否有测试工具来帮助测试? 有。

4.  团队是如何测量并跟踪软件的效能的?从软件实际运行的结果来看, 这些测试工作有用么?应该有哪些改进?

TFS 还是很有用的,至于改进,有这样一些建议:

1)输入 Bug 还是步骤比较多,有很多需要手动重复填写的字段。

2)不是所有的 Bug 或 Task 都记录在 TFS 中。

5.  在发布的过程中发现了哪些意外问题? 有些功能在新的机器上不能工作,因为很多设置没有明确的定义,也 没有记录。软件发布时,这些设置没有能正确地拷贝到发布的机器上去。 这说明很多关于这个系统的“知识”还没有形成文字,还是保留在某 些人的脑袋中。

6.  我们学到了什么?如果历史重来一遍,我们会做什么改进?

【略】

15.3.6   维护和运营

维护和运营一个大型网站有技术含量么? 值得钻研么?  下面是一个事例:

【出生在德国的霍尔斯对工作的质量要求极高,他发现当一个网站服务器数量多到一定程度后,永远有一些服务器会处于宕机状态,虽然可以将用户请求转到别的服务器上,但如果衔接得不好,用户体验就不好。而服务器之间、数据中心之间的服务请求如何转移,里面大有学问。以前的互联网公司不管多么大,都没有重视这个问题,因为工程师们觉得这不是一个技术活。霍尔斯让他的一个学生来解决这个问题,要求做到从监控到流量的转移完全自动化。他的那个学生开始也觉得这个工作太没有技术含量不愿意做,霍尔斯指出这不仅很有意义,而且很有研究价值,这个问题一旦解决,就说明可以用廉价、质量稍差的服务器(比如PC)提供和那些昂贵的高稳定性的服务器(比如IBM和太阳公司制造的大型服务器)同样可靠的服务。霍尔斯最终说服了他的这位学生接受这项工作,后者不负众望解决了问题。霍尔斯和他的学生解决的这个看似细小而又没有技术含量的问题,实际上恰恰是其他公司难以提供和Google同样稳定的服务的原因。更重要的是,它使得Google可以使用最廉价的服务器,运营成本就比行业的其他公司低很多。】——《浪潮之巅》

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

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

相关文章

现代软件工程 第十六章 【IT 行业的创新】练习与讨论

16.6.0 Xerox Parc 的成功创新和推向市场的失败 http://research.microsoft.com/en-us/um/people/blampson/Slides/AltoAtPARCIn1970s_files/frame.htm http://research.microsoft.com/en-us/um/people/blampson/38-AltoSoftware/WebPage.html http://research.microsoft.com/…

感恩回馈——你评博客,我送好书

各位博客园的用户: 最近我的书《构建之法—现代软件工程》上市了,得到了不少读者和老师的好评,出版2个月即告重印。该书的相关信息参见豆瓣页面:http://book.douban.com/subject/25965995/ 《构建之法—现代软件工程》得以出版和畅…

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

这三篇读后感原来发布在我自己申请的域名 yishan.cc 上面,后来这个域名被墙了。 (原文写于2008年12月) 几个星期前,我给《现代软件工程》课的每一个团队都发了一本 《Dreaming In Code》的中文版 《梦断代码》,要求写读后感。这本书讲了这样的…

软件工程练习:模块化,单元测试,回归测试,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;回…