研发团队相关

Posted by Moon-sky on October 7, 2016

技术团队管理相关

团队类型

暂无 #### 团队目标 暂无

工作流程

  1. 工作目录
    1. 工作日志
      1. 问题追踪
        1. 耗时
        2. 解决方案
      2. bug跟进
        1. 数目
        2. 解决用时
    2. 相关文档
      1. 设计文档
      2. 需求文档
      3. 开发评估文档
        1. 软件大小
          1. 行数
          2. 文件数
          3. 第三方SDK名称大小
      4. 第三方文档
        1. SDK
      5. 测试文档
        1. 测试环境
        2. 测试列表
        3. 测试结果
      6. 总结建议文档
        1. 开发本项目主要暴露的问题
        2. 可以改进的空间
  2. 工作流程

编程规范

  1. 命名规范
  2. 编码规范
  3. 代码审核
    1. 目的
      1. 找出代码的错误
        1. 编码错误
        2. 规范错误
      2. 逻辑错误
      3. 算法错误
        1. 算法不够高效
        2. 边界没有处理
      4. 回归性错误
        1. 当前的修改导致的以前修复的bug重新出现
      5. 发现可能需要改进的地方
        1. 代码架构
      6. 互相教育开发人员
    2. 前提
      1. 代码成功编译
      2. 代码使用了漏洞分析工具,并且解决了相关问题
      3. 单元测试覆盖了所有代码
    3. 审查方式
      1. 面对面复审
      2. 在线复审
      3. 团队复审(2人及以上)
      4. 结对复审(1人)
    4. 审查后需要处理的
      1. 更正明显的错误
      2. 对于无法很快解决的错误,创建一个任务task 记录
      3. 错误汇集到错误日志中,方便统计
    5. 代码复审的核查表

      类别 内容
      概要部分 1.代码符合需求吗?
      设计规范部分 1.是否硬编码
      2.是否删除无用代码(注释掉的,或者没有用到的)
      3.代码中是否存在与已有的Library职能一样的代码
      具体代码部分 1.对错误、异常是否都有处理,对于调用的外部函数是否检查了返回值
      2.参数传递是否有误
      3.循环是否可能出现死循环
      4.是否存在内存泄漏,资源是否正常释放(文件、数据库、音频、图像
      4. 是否存在无效资源文件

软件测试

bug 又称小强,指的是导致程序不能正常运行的错误或者异常。

  1. Bug 描述
    1. 表现症状:
    2. 程序错误(从程序代码角度来看导致bug发生的原因)
    3. 根本原因(从流程或者个人习惯上面分析问题)
  2. 测试分类
    1. 按照测试设计的方法
      1. 黑箱
      2. 白箱
    2. 按照测试目的分类
      1. 功能测试
        1. 单元测试(unit test 最基本的功能方法、参数上面验证程序的准确性)
        2. 功能测试(functional test验证模块的功能)
        3. 集成测试(intergration test验证几个相互依赖关系的模块的功能)
        4. 场景测试(Scenario test验证几个模块能否完成一个用户场景)
        5. 系统测试(system test对于整个系统功能的测试)
        6. 外部软件测试(alpha/beta test)
      2. 非功能测试
        1. 压力测试(stress test 测试软件在负载情况下是否能够正常功能)
        2. 效能测试(performance test 耗电量、CPU占用率等其他指标)
        3. 本地化/全球化测试(Localization/Globalization Test)
        4. 兼容性测试(不同版本的硬件环境,不同的屏幕尺寸等)
        5. 配置测试(Configuration Test 在各种配置环境下是否能够正常工作)

项目总结(Postmotem)

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

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

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

用户量、用户对重要功能的接受程度和我们事先的预想一致么?我们离目标更近了么?有什么经验教训?如果历史重来一遍,我们会做什么改进?

计划

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

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

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

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

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

将来的计划会做什么修改?

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

资源

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

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

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

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

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

需求变更管理

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

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

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

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

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

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

设计/实现

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

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

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

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

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

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

测试/发布

团队有没有测试计划?为什么没有?

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

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

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

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

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

总结:

你觉得团队目前处于萌芽/磨合/规范/创造阶段的哪一个阶段?

你觉得团队在这个里程碑相比前一个里程碑有什么改进?

你觉得目前最需要改进的一个方面是什么?

现代软件工程 项目回顾(Postmortem)例子

设想和目标

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

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

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

计划

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

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

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

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

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

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

资源

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

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

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

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

变更管理

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

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

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

对于可能的变更是否能制定应急计划? 基本没有,到时候随意抓人顶上。

员工是否能够有效地处理意料之外的工作请求? 规定所有请求都转到PM那里处理,这样减轻了开发人员的压力,让他们有大部分时间花在自己那一亩三分地上。

设计/实现

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

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

团队是否运用单元测试(Unit Test)、测试驱动的开发(TDD)、UML或者其他工具来帮助设计和实现?这些工具有效么? 运用了单元测试的员工,整体来看Bug不多,没有用单元测试的员工,后期比较忙。TDD要求PM要清楚地确定功能说明(Spec),我们目前还做不到这一点。一个好处是:大家都追着PM要Spec,弄得PM的压力很大,以前谁都不搭理PM的Spec。

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

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

测试/发布

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

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

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

团队是如何测量并跟踪软件的效能的?从软件实际运行的结果来看,这些测试工作有用么?应该有哪些改进? *TFS还是很有用的,至于改进,有这样一些建议:

输入Bug还是步骤比较多,有很多需要手动重复填写的字段。 不是所有的Bug或Task都记录在TFS中。* 在发布的过程中发现了哪些意外问题? 有些功能在新的机器上不能工作,因为很多设置没有明确的定义,也没有记录。软件发布时,这些设置没有能正确地拷贝到发布的机器上去。这说明很多关于这个系统的“知识”还没有形成文字,还是保留在某些人的脑袋中。

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

周报
  1. 目的:每周总结自己的工作情况,分享自己的经验教训。主要包括工作中遇到的问题(走过的弯路、)
  2. 内容
    1. 本周工作成果
    2. 本周未完成工作
      1. 原因:
      2. 解决方案:
    3. 本周工作中最有成就感的事情
    4. 本周感觉最失败的或者不如意的事情
    5. 本周的经验教训
    6. 下周的工作计划
      1. 工作内容:
      2. 计划完成时间:
      3. 可能需要配合的资源和人员
日报
  1. 目的: 自我严格要求使用,主要用于有上进心的人,就像日记一样,可以记录自己的学习历程。
  2. 内容:
    1. 今日完成
    2. 今日未完成
    3. 今日思考
分享会
  1. 目的:分享前沿技术、个人经验,相互学习,促进感情
  2. 内容:
    1. 每周五晚上7:30
    2. 提前发出邮件告知
      1. 邮件内容: 时间、地点、主讲人、主题
    3. 记入工作考核

Creative Commons License
This work is licensed under a CC A-S 4.0 International License.