开发周期技术上无法准确预测
法律援助根据国外的一项统计数据,受调查的软件项目进度平均延期222%,根据笔者与中国软件企业管理人员及程序员的沟通,对于软件开发延期的原因,企业管理人员认为项目经理早期计划不充分是最主要的原因,其次是应急预案制定不足;而程序员则认为客户需求变更和技术复杂程度是最主要的原因。以上两者的差异来源于企业管理人员大多不懂软件,对于程序员也缺少了解。企业管理人员为了在有竞争对手的商业谈判争取订单,有时候不得不承诺减少开发周期,同时也是因为竞争的原因,软件开发成本限制参与项目的程序员数量和技术水准,而以上的结果是项目经理所最不愿意看到的。因此,从某种程度上来讲,软件开发合同前期的商务谈判过程决定了软件开发的成败,有些软件开发失败的真正原因恰恰是对于软件开发一无所知的客户。客观存在的物体具有我们可以感知的属性,例如正在建造的房屋,但是对于软件来讲,开发中问题都存在于代码之中,无论开发经验多么丰富的程序员,他都无法准确预测开发过程中可能的问题。尽管软件行业存在很多评估工作量的理论和方法,例如中国某知名企业的开发规范中是这样表述的:“停工和节假日不安排工作;不考虑加班;考虑测试中发现问题的返工时间;考虑客户需求的稳定性;考虑各项活动的交接和信息的传递时间;考虑风险对活动的影响;考虑项目的效率因素,在正常估算的工期内增加20~40%的余量”。由以上开发规范中的考量因素可以看到,很多因素是无法准确量化的,同时评估工作仍需考虑团队的凝聚力问题,因此技术上准确地确定开发周期是很难实现的,最终还是靠开发团队的历史数据和经验来粗略估算。基于以上的原因,项目经理应当在软件早期的商务谈判中向企业的管理人员充分说明开发周期的复杂性以争取宽裕的开发时间;对于企业管理人员来讲,应当在商务谈判中与律师协商,妥善安排有关开发周期的合同约定,例如开发合同中软件开发的各个阶段的时间限制应当只作为合同描述内容作为参考使用,而不能作为确定合同违约行为的依据,这样可以帮助软件开发人员在总开发周期内对分项时间进行调整。如确因客观原因造成无法按照预期完成软件开发(笔者案例中曾有核心程序员离职造成开发延期),则软件公司应当及时向客户进行通报,提出延期请求并以备忘录、补充协议等形式对双方的合意进行书面确认。尽管大多数软件开发合同对于延期交付有罚金作为违约责任,但是开发过程中与客户协商延期的效果还是要远远好于开发周期后协商延期。