2007-07
23

相信这张图大家一定见过,它描述了在软件开发各个阶段,发现并修改bug所需的相对费用。 例如,一个本应在设计阶段发现的bug,如果一直到部署并开展应用之后才被发现, 那么修改这个bug所花费的代价是设计时修改的代价的470倍-880倍。

relative-cost-per-life-cycle.png

设计阶段是在选定方向,而编程则是朝着目标前进,测试就是检查有没有达到目的地。 如果最初选择了错误的方向,那么无论如何努力前进也无法到达目的地, 事后走回头路会花费更多的时间。最近在开发中几次验证了这个事实。 一次是在详细设计审查时发现了设计中的一个重大方向性错误, 如果没发现并继续编程,测试阶段再去改代码就会使得代码、测试用例等完全重做, 浪费大量时间。另外一个例子就是以前开发的一个项目, 当时没有做详细设计而直接开始编程,就等于放弃了修改bug效率最高的设计阶段, 增大了项目风险。

因此在软件开发中,最重要的阶段不是测试,而是设计(概要设计和详细设计)。 做好设计文档并严格审查,就能大幅度地减少开发风险,降低开发费用。


2007-07
20

我曾经做过一个失败的项目。那时我对项目管理一知半解, 对于风险管理、进度管理等更是一无所知, 以致最后花费了当初几倍的人力来挽救它造成的损失。

项目概况

这个项目的策划是在11月开始的,是对现有的一个Web应用程序进行改造。 客户写了一份简单的需求说明,希望能在12/25圣诞节之前投入使用。 根据这份需求说明,我们整理出了一份功能列表, 然后估算每个功能的代码规模,发现规模大大超出期限,于是跟客户交涉, 删减了一些功能,并将发布日期定为1/26。 最后结果为服务器端3KL,客户端3KL,按照1KL/人月的保守估计, 需要6个人月,投入两个人,正好能在1月底完工。 于是项目就开始了。

阅读全文 »
2007-02
05

如何统计代码的修改规模?如果肯花钱,则能买到统计代码修改规模的专业工具。这里介绍一种利用subversion和grep组合的方法简单统计代码修改规模。下面假设程序代码中的注释有两种格式,一种以 // 开头,另一种是Javadoc格式,即

/**
 * This is a function.
 * @param {String} v str
 */

为清晰起见,下面的统计命令分成了几行来写。

svn diff -r4:320                    # 获取rev4和rev320之间的差异
    | sed -e 's/\r//g'              # 删除行尾的换行符^M。Windows下必须
    | grep "^+[^+]"                 # 取得修改部分
    | grep -Ev "^+[[:space:]]*(\/\*)|(\*)|(\/\/)"     # 删除注释
    | grep -v "^+[[:space:]]*$"     # 删除空行
    | wc -l                         # 统计行数