团队组织与管理

优秀的软件开发团队是互联网公司最宝贵的财富,组建一个优秀的开发团队,一般经过四个步骤:

  1. 人力资源规划:识别和记录项目角色、职责、所需技能以及报告关系,并编制人员配备管理计划的过程
  2. 项目团队组建:根据项目人力资源规划,通过有效手段获得项目所需人员,组建项目团队的过程
  3. 项目团队建设:提高工作能力、促进团队互动和改善团队氛围,以提高项目绩效的过程
  4. 项目团队管理:跟踪团队成员的表现,提供反馈,解决问题并管理变更,以优化项目绩效的过程

在一个团队中,不同角色的开发人员承担各自的任务,密切协作,完成任务:

人员选择与团队

对于应届毕业生可能教育背景的权重较大,但在步入社会后,解决问题能力、沟通能力、适应性、工作态度、个人品行这些方面的素质更加关键。因此选择团队成员时,应当:

  • 考虑团队中的技术、经验和个性是否整体均衡
  • 选择性格互补的成员组成的团队可能比仅仅根据技术能力选择成 员的团队更有效率
  • 团队的领导力来自于成员的尊重,而不是名义上的头衔

优秀的团队是具有互补的技能、对一个共同目的做出承诺并彼此负责的群体,要培养良好的团队气氛,应该注重:

  1. 设定具有挑战性的团队目标
  2. 营造一种支持性的环境(沟通交流,团队学习)
  3. 团队成员的自豪感
  4. 让每一位成员的才能与角色相匹配
  5. 正确的绩效评估

开发团队组织模式

  1. 民主式结构

    • 团队成员完全平等,享有充分民主,成员之间通过协商做出决策,项目工作由全体讨论协商决定,并 根据每个人的能力和经验进行分配
    • 优点:特别适合于规模小、能力强、习惯于共同工作的软件开发组,每个人都能充分发挥主观能动性
    • 缺点:不适合平均水平差距较大、水平较低的团队,分歧一旦产生,难以愈合
  2. 主从式结构

    • 以主程序员为核心,主程序员既是项目管理者也是技术负责人,团队其他人员的职能进行专业化分工
  3. 矩阵式结构

    • 将技术与管理工作进行分离,技术负责人负责技术上的决策,管理 负责人负责非技术性事务的管理决策和绩效评价

建立团队

这些项目对建立高效合作的团队大有裨益:

  • 召开项目会议
  • 确立团队身份
  • 创建共同的目标
  • 管理决策制定
  • 建立奖励体系
  • 管理冲突
  • 激发项目团队活动

其中一个关键是绩效评估

  • 通过对团队成员工作绩效的考察与评价,反映团队成员的实际能力和业绩以及对某种工作职位的适应度
  • 合理的绩效评估方式有:

项目沟通管理

沟通在团队协作事务中的重要性毋庸置疑,甚至可以说,良好的沟通决定一切:

  • 沟通是为了达到一定的目的,将信息、思想、情感在个人或群体之间进行传递或交流的过程;
  • 更关键的是,要明确沟通是你被理解了什么⽽不是说了什么

沟通的复杂性

团队协作完成事务,并非参与人数越多越好:

  • 对于可分解的任务,增派人手可以并行地完成,减少工作所需时间;但是对不可分解的任务,增派人手并没有任何作用;

而对可分解的任务,也有容易沟通和错综复杂之别:

  • 如果可分解的任务前后顺序因果明确,各模块可以并行地通力协作,那么就比较容易完成;若各模块间关系错综复杂,那就不便协作;

另外团队成员之间的沟通也会随着人数的增加而快速增加:

还有一点,赶进度的最好办法不是增加人手,而是延长工作时间(加班):

  • 因此团队的人数尽量不要超过 7 个,否则会因为沟通的成本增加导致工作效率下降;

沟通的方式

沟通的本质其实就是发送方与接收方的信息传递,涉及双方将自己的想法与认知加密传送、接收解密后理解:

  • 在传递过程中,噪音通常是语言表达的歧义等问题,导致双方沟通并不能完全地互相理解、使得思路同步;

常用的沟通方式有三类:

  1. 口头沟通:谈话、讨论、演讲、汇报、谈判、会议

    • 口头沟通能够让参与者通过感知器官直接接收对方发出的信息,因此特别适合复杂问题的即时沟通和交流,可以迅速获得双方的反馈
    • 对时间和地点要求较高
  2. 书面沟通:合同、报告、会议纪要、报表、备忘录、便条

    • 书面沟通传递的信息量最大,书面内容严谨、有条理,具有更强的规范性、准确性、权威性,适合于存档、查阅、引用
    • 对书写人的能力要求较高,需要花费很多时间和精力进行准备,互动和反馈效果较差
  3. 电子媒介沟通:电话、Email、BBS、即时通讯、协作工具

    • 虽然也可以在很短时间内传递信息,但是缺少了对肢体语言信息的感知和理解

项目沟通

项目沟通管理是为了确保项目信息及时且恰当地收集和传递,对项目信息的内容、传递方式和传递过程等进行的管理活动。完成这一工作的项目经理,需要完成与项目相关的所有人员的沟通:

这里实现沟通的有效手段之一就是项目会议,在项目完成的不同阶段,需要不同的项目会议:

  • 项目启动会议(最重要):
    • 目标:
      • 项目概况:范围与目标、总体进度、方法和程序
      • 确定项目人员的角色和任务
      • 确立团队的工作模式
    • 形式:
      • 重大项目:精心准备、集中 1-2 天;前期介绍与建立基本规则
      • 一般项目:简单有效;回顾项目范围与成员互相自我介绍
    • 建立基本规则:计划决策、追踪决策、管理变动决策、关系决策
  • 项目计划会议(在每一阶段开始时):
    • 制定当前阶段的项目计划
    • 将工作任务明确分配给项目成员
  • 项目阶段进展会议(每月或每季度,周期性地汇报):
    • 向项目干系人和高层管理者汇报项目进展
    • 解决需要高层管理者支持的问题
  • 项目技术评审会议
  • 项目组内部会议(每日或每周的例会):
    • 通报项目组成员的工作进展
    • 了解成员在工作中遇到的困难,并寻找资源解决
    • 确定后续的工作计划

项目绩效报告

项目绩效报告是收集和发布关于项目进展等绩效信息,通常使用文字说明、曲线图形和报表等形式进行描述。

软件项目计划

软件项目计划是对软件项目实施所涉及的活动、资源、任务、进度等进行规划。按时交付是软件项目的最大挑战,合理地安排进度是软件项目计划的关键内容。因此涉及的几个问题就是:

  • 必须做什么?
  • 如何做?
  • 安排谁去做?
  • 什么时候做?
  • 成本是多少?
  • 达到什么质量?

通常,软件项目计划分为前后四步:

开发问题描述

问题描述是描述系统应该说明的问题、目标环境、客户交付和验收标准的简短文档。

问题描述是对系统所表述问题的共同认识,通常是由项目团队和客户共同开发形成的,它定义了问题提出的背景需要支持的功能和性能以及系统运行的目标环境等。

定义顶层设计

顶层设计描述了最初从系统到子系统的分解,它描述了系统的软件体系结构。设计流程如下:

  • 子系统分解时要比较不同的方案、以及可以采用的标准的体系结构风格;
  • 需要强调💥:子系统分解应该是高层的,专注于功能,并且要保持稳定;每一个子系统可以被分配给一个团队或一个人,由他负责其定义和实现;

例如一个微信订票应用的顶层设计示意图:

  • 前端部分根据用户角色不同,分为用户端页面和管理员页面,它们各自有不同的权限、呈现内容;
  • 然后通过 RESTful 风格的 HTTP API 接口与后端数据库进行通信;
  • 数据存取模块封装数据库接口,处理所有数据读取请求与操作数据库,在必要情况下对部分频繁只读的数据进行缓存处理;

项目工作分解

项目工作分解是将项目整体分解成较小的、易于管理和控制的若干子项目或工作单元,直到可交付成果定义的足够详细,足以支持项目将来的活动。

在上面订票应用中,可以分为如下功能模块:

  • 于是,我们可以根据每个人要完成的内容,将顶层设计中的逻辑模块分配给团队成员:

建立初始时间规划

在项目工作分解的基础上,进一步估算活动所需的时间和资源,并按照一定的顺序将这些活动进行组织和调度,从而创建项目的进度计划表:

  • 制定进度计划需要在资源、时间和实现功能之间不断平衡,并需要定期更新

软件项目估算

项目估算是对完成项目交付物的时间成本进行预算和估计的过程。

项目估算想要准确,会有这样的困难:

  • 软件规模越大,复杂性越高,不确定性就越大
  • 需求的不确定性会对项目估算产生很大影响
  • 没有可靠的历史数据使项目估算缺少参照物

估算的原则

  1. 应该满⾜于事物的本性所能容许的精确度,当只能近似于真理时,不要去寻求绝对的准确。即,估算只要能够达到足够可用的精确度即可,不必完全准确
  2. 软件项目估算的首要原则:对结果进行估计,而不是活动

估算的行为就是预测未来,因此不论用什么方法,所有估计实际上都是概率:

  • 不过即使是“概率”地给出估计,也要综合考虑事实、风险等因素,仍要承担责任;

基本估算方法

  1. 专家判断

    • 通过借鉴历史信息,专家提供项目估算所需的信息,或根据以往类似项目的经验,给出相关参数的估算上限
    • 不过这种方法的方差很大,专家的判断并不总是准确、可行
  2. 参数估算

    • 通过对大量的项目历史数据进行统计分析,使用项目特性参数建立经验估算模型,估算诸如成本、预算和持续时间等活动参数
    • 参数估算通常有这四类方法:功能点、COCOMO、用例点、机器学习

功能点方法

功能点方法是依据软件信息域的基本特征和对软件复杂性的估计,估算出软件规模。

  • 信息域有五种:
  • 这种方法适合于在开发初期进行估算,并以功能点为单位度量软件规模;

功能点方法包括以下过程:

  • 首先确定功能点计算的范围和应用程序边界,估计出所有数据功能及其复杂性,即内部逻辑文件和外部接口文件;再估计出所有事务功能及其复杂性,及外部输入、外部输出和外部查询;然后根据加权因子计算出未调整功能点 UFC :
  • 接着根据所开发系统的特点,得到下列表的 14 项调整因子值:
  • 最后由功能点计算公式 得到已调整的功能点;

功能点实际代表了软件规模的度量单位,可以根据以往项目的历史数据,统计出不同编程语言对应一个功能点的代码行,进而可以把功能点转化为代码行。

COCOMO 模型

结构性成本模型 COCOMO(COnstructive COst MOdel)是一种利用经验模型进行工作量和成本估算的方法:

  • 分为基本、中间、详细三个层次,分别用于软件开发的三个不同阶段——系统开发初期、各子系统的设计、子系统内部各个模块的设计;
  • COCOMO 的经验公式为: ,其中:
    • :人月工作量
    • A:工作量调整因子
    • B:规模调整因子
    • Size:规模,单位是千行代码或功能点数

COCOMO 模型把软件分为三类,由此给出上述经验公式的参数:

COCOMO 模型是基于过去的历史经验做出的预测,因此只是一个大概参考,不要过分相信。

用例点估算

用例点估算是在面向对象软件开发项目中用于估计规模和工作量的方法,它比功能点方法要简单一些。

  • 角色是与系统交互的用户,用例是系统提供的方法;

进行用例点估算,有 5 步:

  1. 计算角色复杂度:

  2. 计算用例复杂度:

  3. 计算未平衡用例点:

  4. 用技术复杂度因子 和环境复杂度因子 进行调整,得到用例点

  5. 估算项目开发工作量:

    • 只要给出基于每个 UCP 完成的时间,就可以计算出项目开发工作量:
    • 建议:每个 UCP 为 16-30 人时,均值为 20 人时

机器学习方法

神经网络是采用一种学习方法导出一种预测模型,这种方法使用历史项目数据训练网络,通过不断学习找出数据中的规律,再用其估算新项目的工作量:

还有一种基于案例推理的机器学习方法:识别出与新项目类似的案例,再调整这些案例,使其适合新项目的参数

Practice

选择

  1. 软件开发团队的每一个成员都应该参与计划活动,以便( )。 A. 降低计划的粒度 B. 深入地分析需求 C. 所有成员同意该计划 D. 开始设计

C

  1. 在选择开发团队组织结构时应考虑( )因素。 A. 沟通的复杂程度 B. 最终程序的规模大小 C. 发布日期的严格程度 D. 项目预算的多少 E. 选项 A,B 和 C F. 选项 A,B 和 D

E

  1. 某大型化工产品公司计划开发一个新的计算机应用,用以跟踪原材料的使用情况。这个应用由公司内部组成的开发团队进行开发,已有多年开发类似应用的经验。假设初始估计的程序规模是 32000 行源代码,使用基本 COCOMO 模型进行估算,开发工作量大约是( )人月。

  1. 经验估算模型是基于( )。

来自历史项目数据的回归模型

讨论

软件项目估算是一件非常困难的事情,其最大的挑战是项目的复杂性和不确定性。下面列出的两篇博客探讨和分析了软件项目估算困难的主要原因:

请说说你对软件项目估算的看法。