现代软件工程讲义 11 项目管理 - 事后诸葛亮会议

介绍

一个里程碑结束了, 下面怎么办?  团队有什么经验教训? 产品怎么才能做得更好?

我们常说 “软件的生命周期”- 这个软件开发的周期结束了, 生命也结束了。 我们能不能像医学的尸体解剖一样, 把这个软件开发的流程解剖一下? 解剖的过程可以叫:  Postmortem, Retrospective, Review, 事后诸葛亮会议, 等等...  大多数学校里的软件工程项目结束后大家一哄而散,  一些诺言像 "我一定会补上文档的", “我们还会继续开发的”...  成了撤退时的疑兵之计,  等烟尘散去,  同学们早跑没影了。   

总结经验是非常必要的:

- 皮特·德鲁克:在企业管理中常见的错误是,只强调寻找正确答案,而忽视了寻找真正的问题所在。 

- Ray Dalio: 要从自己的错误中不断反思,才能形成属于自己的原则,成为一个所谓 “专业的犯错者”, 让每一次错误都为这个团队所用,不断改进团队所遵守的 “原则”, 用自己的原则体系来驱动项目,用理性来对抗世界的复杂。 

在学习的过程中,最大的失误不是忘记了某个知识点,而是没有问对问题  -- 我们的事后总结,就是试图 问对的问题。 一个 ”对的问题“ 能促使大家思考,讨论,发现问题的核心原因。 

(下面的人物来自 移山之道)

产品发布了,大家松了一口气。阿超建议大家开一个总结会议,就是事后诸葛亮会议。会议请公司的秘书小芳主持并作记录。为了让大家能畅所欲言,阿超和大牛没有参加会议。为了活跃气氛,小芳还买了零食、饮料、河曲啤酒等。

阿超给小芳一个讨论的模板,同时也嘱咐小芳不一定要拘泥于模板,要见机行事,根据会议的进展灵活地变动计划。要牢记会议的核心问题是“如果你可以重新来过,什么方面可以做得更好?" 另外, 在问 “为什么” 的时候, 要多问几次,  层层推进, 找到问题的根源。

例如: 软件发布后用户报告了一个大问题。 ”为什么?"

因为程序没有考虑某种边界条件.  "为什么在测试阶段没有测试出来?"

因为这个代码是测试的最后阶段才加进去的。  “为什么不通知PM/Test?”

因为dev 认为没有问题的, 很简单的修改。 "为什么不通知别人?"

因为dev 认为那些都是软件工程无聊的规定... dev 是大牛人, 不必遵守的。 “为什么?!”  

问到这个层次,就把问题根源暴露出来了。

通用的 postmortem 模板

现代软件工程 项目Postmortem 模板

邹欣

现代软件工程 课件

2011

设想和目标

1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?

2. 是否有充足的时间来做计划?

3. 团队在计划阶段是如何解决同事们对于计划的不同意见的?

用户量, 用户对重要功能的接受程度和我们事先的预想一致么? 我们离目标更近了么?

有什么经验教训? 如果历史重来一遍, 我们会做什么改进?

计划

1. 你原计划的工作是否最后都做完了? 如果有没做完的,为什么?

2. 有没有发现你做了一些事后看来没必要或没多大价值的事?

3. 是否每一项任务都有清楚定义和衡量的交付件?

4. 是否项目的整个过程都按照计划进行?

5. 在计划中有没有留下缓冲区,缓冲区有作用么?

6. 将来的计划会做什么修改?(例如:缓冲区的定义,加班)

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

 

资源

1. 我们有足够的资源来完成各项任务么?

2. 各项任务所需的时间和其他资源是如何估计的,精度如何?

3. 测试的时间,人力和软件/硬件资源是否足够? 对于那些不需要编程的资源 (美工设计/文案)是否低估难度? 

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

有什么经验教训? 如果历史重来一遍, 我们会做什么改进?

 

变更管理

1. 每个相关的员工都及时知道了变更的消息?

2. 我们采用了什么办法决定“推迟”和“必须实现”的功能?

3. 项目的出口条件(Exit Criteria – 什么叫“做好了”)有清晰的定义么?

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

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

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

 

设计/实现

1. 设计工作在什么时候,由谁来完成的?是合适的时间,合适的人么?

2. 设计工作有没有碰到模棱两可的情况,团队是如何解决的?

3. 团队是否运用单元测试(unit test),测试驱动的开发(TDD)、UML, 或者其他工具来帮助设计和实现?这些工具有效么?

4. 什么功能产生的Bug最多,为什么?在发布之后发现了什么重要的bug? 为什么我们在设计/开发的时候没有想到这些情况?

5. 代码复审(Code Review)是如何进行的,是否严格执行了代码规范?

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

 

测试/发布

1. 团队是否有一个测试计划?为什么没有?

2. 是否进行了正式的验收测试?

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

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

5. 在发布的过程中发现了哪些意外问题?

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

总结:

      你觉得团队目前的状态属于 CMM/CMMI 中的哪个档次?
      你觉得团队目前处于 萌芽/磨合/规范/创造 阶段的哪一个阶段?

      你觉得团队在这个里程碑相比前一个里程碑有什么改进? 
      你觉得目前最需要改进的一个方面是什么?

 

怎么开好一个 Postmortem 会议:

  1. 保持会议轻松愉快的氛围, 可以考虑换一个开会的环境, 有饮料, 零食, 音乐的帮助更好
  2. 当 [大官] 的最好不要出现, 让大家畅所欲言。 (即使出现, 也要夹着尾巴, 不要为自己以前的行为辩护, 作好听众)
  3. 坚持对事不对人的原创, 强调 - 如果再有一次机会, 会如何改进? 而不是挖历史旧帐.
  4. 照顾到模板提及的各个领域, 可以深入团队最感兴趣的部分。
  5. 让所有人都有充分发言的机会。
  6. 有人记录发言要点, 最后列出所有改进意见
  7. 最后大家可以投票, 如果我只有三票, 投给哪些改进意见 
  8. 大官们保证要采取行动, 执行票数最高的一些改进意见。

一个例子

小芳:最后要交一个什么样的文件呢?是不是所有问题的列表就可以了?

阿超:列出问题,只是一个部分,重要的是让所有人了解问题的存在之后,开始讨论解决方案,要提出一个解决问题的草案。

原来准备开一个小时的会议进行了两个多小时才结束,食品和酒水的消耗也比原计划多了两倍,有人被抬出了河曲大酒店。

小芳最后把大家的意见和建议整理之后,发给了全体成员。

移山公司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)是如何进行的,是否严格执行了代码规范?

刚开始还像那么回事,后来就变成走走形式。往往是“小飞,我要check-in 了,reviewer 填你的名字,怎么样?”其实小飞后来也没看代码。

测试/发布

1.       团队是否有一个测试计划?为什么没有?

我们有测试计划,而且因为有了计划,测试人员好像不再像无头苍蝇胡乱测试

2.       是否进行了正式的验收测试?

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

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

有。

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

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

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

(b)不是所有的Bug 或 task 都记录在TFS中。

5.       在发布的过程中发现了哪些意外问题?

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

这里有同学们几个项目的总结记录:
beta阶段的postmortem报告 - 霸王移山 - 博客园
【Final Homework 3】Postmortem@Beta Stage - SE_team - 博客园
Postmortem @ beta - take it and go - 博客园
还有一个比较沉痛的总结 (这样的总结比一哄而散好多了):
泛海精灵项目的回顾与反思 - MicroTeam - 博客园

微软公司的每个项目结束后, 都要做 Postmortem, 有时候还请团队外的顾问人员来主持, 以保证质量。

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

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

相关文章

现代软件工程讲义 4 方法论 - MSF

[内容来自 移山之道]白话MSF方法论 2.1 果冻的预习果冻:超总,听说你要讲MSF,我就先预习了一下,但是MSF的名词太多了,我真是头大,能不能解释一下这两句: “MSF的一个基础原理是学习所有的经验。…

现代软件工程 作业 1 个人项目

这是现代软件工程课的个人项目作业 个人项目 Individual Project: 一个人独立完成. 时间: 可以考虑在第一周就给同学们这个项目; 也可以考虑在团队项目Alpha 阶段之后进行, 作为一个缓冲。 考核内容基本源代码控制的用法 程序的测,回归测试 效能测试 网络编程 C/C/…

现代软件工程 作业 2 结对项目

这是现代软件工程课的作业 结对项目 Pair Project: 一对同学用结对编程的方法完成 结对编程课件: 现代软件工程讲义 3 结对编程和两人合作 软件工程讲义 3 两人合作(2) 要会做汉堡包 Pair Project http://academic.research.microsoft.com/academicmap tasks for each …

现代软件工程 作业 3 团队作业

这是现代软件工程课的作业列表, 老师可以根据情况选用, 建议要保证每周都有作业。 团队作业 Team Homework: 适合团队完成的作业 这些作业都要团队的成员互相配合才能完成, 团队可以选出一位同学完成作业的具体写作和发博客部分, 大家可以轮流完成。 一个团队通常由 5-7名…

现代软件工程 作业 4 个人作业

这是现代软件工程课的作业 个人作业 Individual Homework: 个人完成的作业 (读书报告等), 着不同于 “个人项目 Individual Project”. Individual Homework #1 a good question is 50% of a good solution, now let’s share your questions about the text book(s), and …

现代软件工程讲义 9 测试 关于闰年的测试

我们谈了不少测试的名词, 规范和原则 (link1, link2). 软件是人写的, 测试计划和测试用例也是人写的, 人总会犯错误。错误发生之后, 总有人问: 为什么这个bug 没有测出来啊?! 我们看看一类简单的bug是如何发生的,以及如何预防它们再度发生: 闰年 软件少不了和…

对大学 IT 专业教育的反馈

[这是2009 年 写的文章, 一部分收集到 <IT 小小鸟> 这本书里了。 这两天看到软件学院同学对教学的反馈, 看来好些问题都没有得到解决。 教育部门时不时会开教学研讨会, 去世界有名的大学, 公司参观, 他们还要参观多少年? 他们会请已经毕业的学生来提意见么? 学生要年…

现代软件工程 来自卓越大学教师的建议 (读书笔记)

教师教学有培训和参考书么? 我从来没想到过我会在大学里教书, 而且还教了好几年, 四个学校。 当时接到任务的时候, 我把它当作实习生培训和新员工培训的”学院版”, 还是继续强调实践, 反馈, 合作, 就这么开讲了。 在微软公司, 做大部分和人相关的事情, 都得先有一个培训, …

软件工程讲义 9 创新的出路 走进作坊

我第一次注意到 “作坊”这个词和软件行业联系起来大概是这个 2004 年 11 月的报道: 标题: 信产部副部长娄勤俭&#xff1a;中国软件业还在手工作坊阶段 日前&#xff0c;信息产业部副部长娄勤俭在出席中国软件产业生态链高层论坛时表示&#xff0c;中国软件产业的规模还比较小…

现代软件工程 习而学的软件工程教育

茅于轼先生写了一篇博客 ( http://blog.sina.com.cn/s/blog_49a3971d0102dufj.html ) 纪念茅以升先生提出的 习而学的工程教育: 把颠倒了的工程教育顺序恢复过来&#xff0c;即他称之谓“习而学的工程教育”。 以桥梁建筑专业为例&#xff0c;大学一年级先学施工条例&#xff0…

现代软件工程 教课心得

现实世界是最好的老师, 我们这些叫 “老师” 的人, 充其量是个助教。 但是有些助教却不让学生见到老师。 **************** 老师都想把课教好, 学生都想把课学好. 但是我们常常看到一个学期过后, 老师, 学生都有很多抱怨 (例如: 各种良好愿望和计划在实施中的问题). 看了上…

微软学术搜索项目 10个版本的历程

这是我在微软亚洲研究院参与的项目之一, 从 2009 年秋天开始, 我们小组把它从一个研究原型发展为涵盖全学科的学术搜索门户。 它索引了 4千万论文, 2千万作者, 6 大实体类型, 8 种数据可视化功能, 具有开放的API 平台和手机客户端. 下面说说项目的发展: 2009/8: 内部发布 alp…

以实际产品为例, 进行软件工程训练的作业

每个小组 (结对) 从下列产品中选一个, 按照下面的说明写软件测试报告, 分析并提出建议, 写一篇博客 (包括四部分)即可。 产品1. 必应词典客户端 (http://dict.bing.msn.cn/) 产品2. 必应缤纷桌面 (http://desktop.bing.msn.cn/) 产品3. 微软学术搜索 (http://academic.researc…

现代软件工程讲义 9 测试 QA 的角色和分工

测试的角色 (Test) 要独立出来么 ? 独立出来的测试角色怎么才能发挥作用? 有些成功人士和成功的公司号称没必要有独立的测试角色 (Test), 你怎么看? 最近又看到一些关于开发人员要不要负责测试的讨论。 例如: http://www.aqee.net/on-testers-and-testing/ 大多数的开发…

程序设计作业: 车模+数模 = ?

我上学的时候只听说过 “航模”, 没听说过“数学建模”这门学问. 这几年在简历里看到过不少人号称数模得过什么奖之类的, 我都没好意思问太仔细。 在帝都开车经常遇到堵车, 我于是想到了一个车模的问题。 我想请大家帮着给这个车模搞个数模, 求个解法: 想象帝都北四环或北五…

计算机考研的调查和改进建议

几星期前, 我在微博上讨论考研的事, 有专家建议不如把意见整理出来, 说不定可以转告给相关方面。 我没有考过研, 问了公司的同事们, 绝大多数都是保研的, 也没考过。 我从网上下了一份模拟题, 好像还挺难&#xff0c;有一种要翻书的冲动。 全国有多少学生为了考研而奋斗? …

2012 夏季高校微软俱乐部活动 - 开门创新

创新啊创新, 大家都在讲创新。 一般的理解, 创新就是公司内部关起门来想, 实验, 内部评审, 然后申请专利什么的, 其实也有开门创新的办法: http://www.innovationexcellence.com/blog/2012/08/13/40-examples-of-open-innovation-crowdsourcing/ it is about bringing extern…

笔记 - 高等教育的创新

教育是一个社会发展的支柱, 你和我能看到并理解这个博客, 教育功不可没。 高等教育的形式并不是一成不变的, 高等教育一直在演进, 变革中, 最近一股“online higher education” 的浪潮在美国兴起, 貌似突兀, 其实有规律可循。 在关注最近的在线教育浪潮之前, 我们看看美国高等…

现代软件工程讲义4 Scrum/Sprint

Advanced Software Engineering, Development Process, Scrum/Sprint 软件开发的流程有很多 (看 各种方法论概述), 我也写过一篇博客 (酒后的敏捷) 谈了谈最近比较时髦的开发流程。 今天我们不喝酒, 正襟危坐地说说敏捷这一路 Scrum/Sprint 开发方法. 从理论上看, 这个方法真…

北航 2012 秋季 现代软件工程 两人结对 作业要求

Pair Project: Elevator Scheduler [电梯调度算法的实现和测试] Design and implement an Elevator Scheduler to aim for both correctness and performance, in managed code. Skills to learn and practice: a) Peer to peer collaboration b) Requirement …