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

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,你会怎么总结呢?

 

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可以使用最廉价的服务器,运营成本就比行业的其他公司低很多。】——《浪潮之巅》

 

posted @ 2014-07-20 22:35  SoftwareTeacher  阅读(1342)  评论(2编辑  收藏  举报