软件工程是一种人力密集型的过程和方法,主要管理软件项目相关的人员、资源以及风险。优秀的软件管理人员必须能够准确估算、控制风险和变革。
由于软件的抽象性,软件项目管理需要专门的技术和经验,软件项目经理的基本职责是保证项目处于有效的控制之下。软件项目是从需要估算的任务开始,例如,开发的这个产品有多大规模,需要多长时间,需要什么样的技术和资源等。项目计划是保证项目有序开展的必要条件,如果没有几乎,任何承诺都不比瞎猜强。
在大多数组织中,由于强大的压力可以强制工作人员加班加点,软件工程师经常在压力下作出承诺。所以历史数据就显得尤为重要,没有历史数据帮助估算就无法知道这个进度是否合理。任何时候都要收集和使用历史数据,否则你就不能跟管理人员讨价还价,拿到更符合实际的工作计划。
为什么软件总是存在进度上的压力?本质问题就是不现实的进度估算,我们往往对进度预期保持乐观。没有一个标准方法适用于各种项目,每个组织需要定义一个符合实际对估算方法。有些问题需要在估算时考虑:
什么时候进行估算和重新估算?
如果估算和实际有了偏差,什么时候进行重新估算?
如果需求变化率,什么时候重新估算?
怎样用过去对项目度量来改进软件估算成本?
大多数软件失败对根本原因是什么?软件工程教育是一个主要原因,大多数大学还是专注于编程技巧,教软件编程而不是软件工程。而现实中,工业界大多数问题都很复杂,编码只是工作量对一小部分,大概占整个开发工作量对20%。工业界需要对人才是具有收集需求、项目计划、软件架构、系统设计、客户接口和产品管理等占总工作量80%对技术的人员。
在建筑行业,各工种工作人员都经过专业的培训,在开始盖楼之前,总建筑师要与出资方开会,讨论需求,也就是大楼多高,有什么功能,什么结构,有多少房间,有多少办公室等等,这些都需要考虑进去。在开工之前,建筑师要画一个非常详细的图,构建模型以及蓝图。在每一个阶段,这些计划和新的日程、成本估算、风险分析等等都要经过认真的评审。
而在软件领域,人们只做很少的提前规划工作,总是立刻就开始编码。由于提前规划很差,工作日程总是建立在最好的猜测上,而不是建立在一个随着事情的发展而变化、合理的需求分析基础之上的,不合理的草率的工作日程是失败的根本原因。当然也有少数成功的项目,但绝大多数情况是归功于几个优秀工程师行为。