Judy Beta Postmortem
设想和目标
1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?
与Alpha阶段相同,我们的软件要解决的Julia程序的dubug功能。问题定义得比较清楚,具体分拆成断点,堆栈,步进等具体功能。我们的典型用户是Julia的开发者和VScode的使用者小芳,典型场景是小芳需要写一个基于julia的AI框架,但是她需要一个debugger进行断点调试。
2. 我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付了么? 原计划达到的用户数量达到了么?)
原计划的功能基本实现,其余未实现的功能由于文档支持和Julia本身支持问题无法实现。我们按照原计划的时间进行了打包和交付。由于没有发布,所以我们的用户数量暂时局限在团队内部。
3. 和上一个阶段相比,团队软件工程的质量提高了么? 在什么地方有提高,具体提高了多少,如何衡量的?
和上一个阶段相比,我们的代码管理更加优化,我们的前后端代码由原来的分开开发变成在同一个仓库中,每日后端实现功能后前端直接进行测试。并且我们在Beta阶段加强了code review和每日构建测试。我们衡量的方式是通过结对开发者的一方进行pull request,另一方merge之前进行code review。故我们衡量的方式是pr和merge的次数。
有什么经验教训? 如果历史重来一遍, 我们会做什么改进?
计划
1. 是否有充足的时间来做计划?
我们在Alpha阶段和Beta阶段的交替期间,有充足的时间(大约十几天)进行计划。我们同时在这段期间内对我们未来可以完成的功能进行了调研。
2. 团队在计划阶段是如何解决同事们对于计划的不同意见的?
开会并充分交换了各成员意见。
3. 你原计划的工作是否最后都做完了? 如果有没做完的,为什么?
我们真的确实有一部分计划没有完成,但并不是因为时间预算不充分,而是这部分从根本上很难实现。在前端方面,她们缺少必要的VScode插件文档进行对后端代码进行打包,导致我们退而求其次只能对前端代码进行打包;后端部分,由于Julia本身语法支持受限,我们很难通过元编程取得debug所需的部分信息。我们咨询了开发者,并详细浏览了文档和论坛,都没有找到办法。
4. 有没有发现你做了一些事后看来没必要或没多大价值的事?
有,我们本来打算通过修改ast树的方式来添加和删除块内断点,后来发现这样会带来删除时的麻烦,后来我们改成源码层级的添加和删除,虽然增加了一定时间开销(用户不可察觉),但是使实现更加简单了。
5. 是否每一项任务都有清楚定义和衡量的交付件?
每一项任务由具体的功能模块的测试样例定义(操作定义)。交付件为测试样例得以通过。
6. 是否项目的整个过程都按照计划进行,项目出了什么意外?有什么风险是当时没有估计到的,为什么没有估计到?
最大的意外其实出现在Alpha阶段,就是发现Julia的支持不足。Beta阶段的意外应该是在内部最终测试的时候会出现对某些用户可以正常安装而另外一些用户安装失败的情况。我们推测这个问题由Node.Js导致
7. 在计划中有没有留下缓冲区,缓冲区有作用么?
我们在计划中留有了缓冲区(详见Beta阶段总计划)。同时在Beta阶段的中间也留有了缓冲区进行代码重构。事实上正是由于缓冲区的时间,让我们得以在Beta阶段的中间重构代码并得以扩展功能。
我们学到了什么? 如果历史重来一遍, 我们会做什么改进?
在做一个world's first的项目之前,充分调研前人的工作,确定项目实施的可能性和多大程度上可能。并且需要根据人员的开发能力分配角色。
资源
1. 我们有足够的资源来完成各项任务么?
如果是指人员、时间和开发环境等资源,我们是有资源的。
如果是指文档、语言支持、技术支持等资源,我们非常缺乏这样的人才。正是由于对这些技术人才的缺乏,导致中间走了一些弯路,并且有些功能没有成功实现。
2. 各项任务所需的时间和其他资源是如何估计的,精度如何?
时间按照功能模块估计,比如估计多文件大概需要多长开发时间,多断点大概需要多长开发时间等等等。时间估计的基本准确,因为大概哪几天实现什么功能基本能按计划完成,即使是中间的突发状况也在缓冲区时间内得以解决。
3. 测试的时间,人力和软件/硬件资源是否足够? 对于那些不需要编程的资源 (美工设计/文案)是否低估难度?
测试的时间完全足够,因为前端人员在Alpha阶段已经完成了大部分的工作,所以在Beta阶段基本负责在后端实现了新功能以后前端负责每日构建和测试。
4. 你有没有感到你做的事情可以让别人来做(更有效率)?
当然。如果我们能有VScode的技术人员支持,我们的可能就可以实现完整打包。如果我们有Julia的开发人员,那我们也不需要自学Julia查文档去花费特别多时间。
变更管理
1. 每个相关的员工都及时知道了变更的消息?
是的,我们不仅通过SCRUM而且通过teams进行了交流讨论。
2. 我们采用了什么办法决定“推迟”和“必须实现”的功能?
根据预估的时间和难度,以及功能模块的重要程度。当我们在Beta阶段中间时,我们有很多backlog,比如多文件支持,块内多断点支持,比如堆栈查看支持。明显块内多断点更加重要,之后是多文件,堆栈查看甚至没有看到实现的希望,自然就决定了前两个。
3. 项目的出口条件(Exit Criteria – 什么叫“做好了”)有清晰的定义么?
在预先设定的所有测试样例上通过测试。
设计/实现
1. 设计工作在什么时候,由谁来完成的?是合适的时间,合适的人么?
Beta阶段开始,前后端商量决定。设计的时间合适,人不太合适。专业人员不足。
2. 设计工作有没有碰到模棱两可的情况,团队是如何解决的?
有,前端Protocol的设计。和后端块内多断点的设计,可以从ast层级插入断点和删除断点,但是需要复杂的搜索,容易造成潜在bug,也可以从源码层级进行插入和删除断点,优点是实现简单,缺点是性能不足。考虑时间和性能,最终选择了后一种方案。
3. 团队是否运用单元测试(unit test),测试驱动的开发(TDD)、UML, 或者其他工具来帮助设计和实现?这些工具有效么? 比较项目开始的 UML 文档和现在的状态有什么区别?这些区别如何产生的?是否要更新 UML 文档?
单元测试几乎没有,测试驱动的开发是真的。基本都是前端测试过程中遇到的问题,然后督促后端去解决和完善。这些工具其实有效。项目开始的UML和现在完全不同,当时以为实现块内多断点比较简单,后来才发现需要重构,添加消息队列等一系列要素,所以UML图变化很大。
4. 什么功能产生的Bug最多,为什么?在发布之后发现了什么重要的bug? 为什么我们在设计/开发的时候没有想到这些情况?
块内断点,因为涉及到断点位置的确定,断点的维护。后来的每一次功能扩展(多文件支持,多块内多断点支持),都对原有的实现方式造成了冲击,Alpha版本的遗留代码很容易造成遗留Bug,所以这个功能我们在回归测试的时候反反复复改了很多次。发布之后最大的bug就是发现在不同机器上安装的情况会有问题。比如在某些机器上安装后立即就可以使用,有些机器上安装以后无法运行。由于这个问题比较玄学,我们也没有想到会出现这样的情况(虽然我们仔细比较了机器运行环境和dependency)
5. 代码复审(Code Review)是如何进行的,是否严格执行了代码规范?
代码复审我们还是非常认真的进行了的。对于后端的结对编程来说,一位开发人员实现了某个功能,会向公共仓库的master分支提交pull request, 这个时候另一位开发者进行code review,并到对应分支上进行独立设计测试样例测试,code review出现问题会直接与开发者交流,测试出现问题不予merge。
测试/发布
1. 团队是否有一个测试计划?为什么没有
由于我们是测试驱动开发,所以有测试计划。
2. 是否进行了正式的验收测试?3. 团队是否有测试工具来帮助测试?
没有。
3. 团队是如何测量并跟踪软件的效能的?从软件实际运行的结果来看,这些测试工作有用么?应该有哪些改进?
软件效能是前端测试体验来决定的,实际上由于debugger的运行和相应速度快到分辨不出,所以并没有考虑效能测试和效能优化
5. 在发布的过程中发现了哪些意外问题?
前述。在某些机器上可能安装失败。打包只能打包前端代码。后端代码需要单独下载。我们提供了README帮助用户完成安装。
团队的角色,管理,合作
1. 团队的每个角色是如何确定的,是不是人尽其才?
基本人尽其才。前端的人做比较喜欢也比较熟悉的工作。后端开发对debugger的工作机制略微比较熟悉所以从事后端。
2. 团队成员之间有互相帮助么?
当然有。比如在前后端对接过程中zhiqi将master分支作为标准来简化前端测试。
3. 当出现项目管理、合作方面的问题时,团队成员如何解决问题?
开会。
团队贡献分
Name | Score |
Manli Shu | 21 |
Zhiqi Lin | 22 |
Yuechen Wang | 19 |
Yu Xing | 18 |
demo
总结
团队处于CMMI的第一个档次,因为团队磨合时间有限,而且也不是专业的团队,属于磨合期吧。在这个里程碑的改进之处在于加强了团队成员的内部交流,增加了效率。我觉得最需要改进的一个方面是我们团队缺乏PM,分工不太明确,导致出现了一些重复开发这样的情况。
我们小组做的最好的原则是 无论团队内外,面对面的交流始终是最有效的交流方式。在Beta阶段,我们团队共四人,采取两人一组的两组结对编程的方式。有时候在分工以后,如果遇到问题,我们仍然会进行面对面交流。和 保持简明 -- 尽可能简化及工作量的技艺 -- 极为重要。在项目中我们在实现块内多断点的时候遇到分歧,最后还是以更加简单的实现为原则。
合照