2012年3月31日星期六

快速软件开发 学习笔记 之二

快速软件开发 学习笔记 之二



第3章 软件开发的基础性实践

人们经常劝导你要采用标准的软件工程实践,因为它们是“正确”的或者它们会提高产品的质量。但是,采用软件开发的基础性实践的原因不在于它们“正确”,而在于它们可以切实减少费用和缩短产品面市时间。软件开发的基础性实践分为管理实践、技术实践和质量保证实践。

3.1 管理的基础性实践

3.1.1 Planning(项目规划)

软件业界的最佳完成项目都具有这个鲜明特征:强有力的前期规划。软件项目的规划包括以下的内容:

 

表 3-1 规划软件项目

软件项目的规划活动

进一步参考

Estimation(项目估算)和scheduling(制定进度计划)

第7章和第8章

确定项目团队人数、所需技术技能、人员到位时间和具体人选

第11章

确定团队结构

第12章

确定项目采用的生命期模型

第6章

管理风险

第4章

3.1.2 Tracking(项目跟踪)

项目跟踪是一个基本的软件管理行为。你如果不跟踪一个项目,你就绝不会知道你做的项目规划是否被贯彻执行了。项目跟踪包括对项目的进度、成本和质量目标的检查,以提供项目状况的可视性,避免项目失控。

典型的管理层面跟踪手段包括:

l  task list

l  status meeting

l  status report

l  milestone review

l  budget report

l  management by walking around

典型的技术层面跟踪手段包括:

l  technical audit

l  technical review

l  milestone quality gate

l  issue tracking system

 

最佳实践:Issue Tracking System

给整个项目乃至整个公司选择一个issue tracking system。这个issue tracking system可以是商业软件系统(如ClearQuest),也可以是免费软件。只有在issue tracking system就绪之后,才开始启动你的项目。

3.1.2.1 Miniature Milestones(小型里程碑)

软件项目存在major milestones,它们是为项目设定总方向的长间隔里程碑。这种里程碑通常以“月”作为间隔。Major milestone对于设定方向很有帮助,但它们的间隔过长,以至于不能提供很好的项目控制。而miniature milestone则是一种进行项目跟踪和控制的精细方法,它能很好地提供项目状况的可视性。把major milestone和minor milestone组合会有很好的效果,major milestone提供项目的策略目标,而miniature milestone则提供实现每个目标的战术方法。

最佳实践:Miniature Milestone(小型里程碑)

1.       及早设立小型里程碑。先紧后松优于先松后紧。

2.       让开发人员建立他们自己的mini milestone。软件经理让员工定义他们自己的小型里程碑,也就是允许他们控制其工作细节。软件经理所要做的是要求员工告知其工作细节,这有助于员工全心投入工作,也避免了经理们的过度管理(macro-management)。

3.       确保mini milestone在1或2天内可到达。这也就要求单个mini milestone内的任务应该是明确的和细分的,而不是模糊的或笼统的。

4.       确保mini milestone的二义性。小型里程碑只有“done”和“not done”两种状态,而不存在“90% done”这类的说法。软件经理或Tech Lead应该细致地跟踪项目进展状况,要每天都同开发人员一道对照设定的mini milestone来评估项目进展情况。一定要确保当一个mini milestone被标记为“done”时,它是真正100%被完成了。

5.       把mini milestone用于短期规划,而非长期规划。

6.       如果发现经常不能按期到达mini milestone,则可以停下来,分析无法到达的原因(例如:开发人员需要培训、单个mini milestone内的任务过多、开发人员常受到杂务的干扰等)。找准原因之后,应该对原有的mini milestone规划进行调整,或者重新制定规划。

 

3.1.3 Measurement(度量)

使软件企业长期进步的一个关键是收集measurement data以分析软件质量和生产率。为了使开发更为高效,软件从业人员需要具有软件度量方面的基本知识,也需要理解与收集度量数据有关的问题,还需要理解某些度量数据以便用于分析项目的状况、质量和生产率。

最佳实践:度量

7.       以表3-1为基础,建立自己的度量数据表格。注意:收集过多的数据会让人淹没在不知其义的海量数据中。对于刚开始采用度量实践的软件团队和组织来说,可尝试最多收集12种不同的度量数据。即使是有丰富度量实践经验的组织,也最多收集24种度量数据。

8.       在项目进行过程中,每到一个major milestone,更新度量数据表格中的相应数据。

9.       在项目结束之后,再次汇总数据。

10.   由原始数据获得一些组合数据,例如:

l  已修复的缺陷数 vs. 被发现的缺陷总数(有助于评价产品质量)

l  尚未修复的缺陷数 vs. 被发现的缺陷总数(有助于预测项目发布日期)

l  通过inspection发现的缺陷数目 vs. 通过execution testing发现的缺陷数目(有助于规划质量保证任务)

l  估算项目剩余天数 vs. 实际项目剩余天数(有助于跟踪和改进估算准确度)

l  按编程语言统计每人每月的平均代码行数(有助于估算和规划编码任务)

l  按编程语言统计每人每月的平均功能点数目(有助于估算和规划编码任务)

l  按缺陷严重程度、按子系统或按缺陷潜入时间来统计修复一个缺陷所用的平均时间(有助于规划纠正缺陷的任务)

l  生成一页文档的平均小时数(有助于规划文档任务)

11.   花较多的时间分析和整理得到的度量数据。可以采用下面任何一种方法:

12.   把收集的试题数据和分析结果反馈给开发人员和软件经理,并讨论试题数据表格是否需要增加或删减表项,以供下一个项目使用。

 

表 3-2 常用度量数据

成本和资源

l  按activity、按phase或按人员类型来统计的工作量

l  计算机资源

l  日历时间

变更与缺陷

l  按不同分类法(严重程度、子系统、潜入时间、出错原因,解决手段)统计的缺陷数目

l  缺陷检出方法(review、inspection、test,等等)

l  检出并修复每个缺陷所用的工作量

过程

l  process definition(design method、编程语言、review method,等等)

l  估算完成时间

l  milestone progress

l  随时间的代码增加量

l  随时间的代码修改量

l  随时间的需求变更量

产品

l  开发日期

l  总工作量

l  项目种类(内部业务软件、商用盒装软件、或系统软件)

l  项目中的函数数目或object数目

l  以代码行数或功能点数衡量的项目规模

l  文档的规模

l  编程语言

 

度量是有用的,但它也不能包治百病。应该记住度量存在的局限性:

l  收集的数据是有误差的。试题过程中会有很多误差,因此收集的数据并不准确。

l  警惕过分依赖度量数据的倾向。度量数据能够为我们提供软件项目的历史数据,对度量数据的分析也能够为我们提供一定的项目洞察力,但是,它只是起参考作用而不能被过分依赖。

3.2 技术的基础性实践

3.2.1 Requirements Management(需求管理)

需求管理是一个完整的过程,它包括:收集需求;把需求记录为文档、电邮、UI storyboard、executable prototype或其它形式;依据需求跟踪软件设计与编码;在项目进行过程中管理需求变更。

需求管理的成功取决于理解各种不同的实践,以便为特定的项目选择最合适的实践。下面是需求管理的基础性实践:

l  需求分析方法论(结构化分析,数据结构分析,面向对象分析)

l  系统建模实践(类图,数据流图,实体-关系图,数据-字典表示法,状态转移图)

l  沟通实践(Joint Application Development,user-interface prototyping,常规会谈实践)

l  需求管理与不同的生命期模式的关系

需求管理在两个方面对加快开发速度发挥着巨大的影响:

l  requirements gathering往往比其它软件开发任务完成得要从容些。如果能加快需求收集的速度但又不伤及质量,那么就能缩短总的开发时间。

l  从项目一开始就把需求弄清楚的成本,比起直到构建阶段或维护阶段再把需求弄清楚的成本,要少50到200倍。

3.2.2 软件设计

软件架构与设计的基础性实践包括:

l  总体设计风格(对象设计,结构化设计,数据结构设计)

l  基础性的设计概念(information hiding,modularity,abstraction,encapsulation,cohesion,coupling,hierarchy,inheritance,polymorphism,basic algorithm,basic data structure)

l  对典型性困难问题的标准解决方法(exception handling,internationalization和localization,portability,memory management,database design,performance,reuse)

l  针对应用领域的独有设计思考(财务应用,科学应用,嵌入式系统,实时系统,安全攸关的系统)

l  系统架构方案(subsystem organization,layering,subsystem communication styles,典型的系统架构)

l  设计工具的应用

3.2.3 Construction(软件构建)

软件构建的基础性实践包括:

l  编码实践(变量和函数命名,代码布局,注释)

l  与数据相关的概念(scope,persistence,binding time)

l  特定数据类型使用方针(一般的数字,整数,浮点数,字符,字符串,布尔值,枚举,具名常量,数组,指针)

l  与控制相关的概念(组织直线型代码,使用判断式,控制循环,使用布尔表达式,控制复杂度,使用goto、return和递归函数等较少用的控制结构)

l  断言和其它以代码为中心的检错实践

l  把代码组织成函数、模块、类和文件的规则

l  单元测试和调试实践

l  集成策略(增量式集成,大爆炸式集成)

l  代码优化与实践

l  所使用的特定编程语言的细节

l  软件构建工具的使用(编程环境,对团队工作的支持,代码库,代码生成器)

 

最佳实践:Daily Build(每日生成)和Smoke Test(冒烟测试)

1.       每日生成和冒烟测试背后的思想很简单:每天都要对整个产品build和test一次。这意味着每天都要将每个文件编译、链接,并组成可执行程序,产品再通过一个相对简单的自动化测试,以检验其是否具有最基本的可用性。

2.       在daily build和smoke test就绪之前,不要开始任何construction任务。

3.       Daily build和Smoke test依赖于一些基础设施和前期准备,包括:

(1)     一台联网的专用build machine(可以是PC,也可以是服务器),用于生成产品和完成冒烟测试。

(2)     在build machine安装必要的支持软件,包括版本控制系统客户端,编译环境,自动化编译工具,邮件系统,自动化测试工具等。

(3)     对build machine及相关软件工具进行测试,确认build machine可以用于自动化的每日生成和冒烟测试与报告广播。

4.       从项目进入construction阶段的第一天起,就每天进行daily build和smoke test。过程如下:

(1)     build machine在每天晚上的10点,从版本控制系统中check out最新的项目源代码树,进行编译、链接,并把生成的程序和log文件放入与当天日期对应的路径下。一个好的daily build应该是成功地编译、链接所有的文件、库和组件,并且没有严重级别的编译告警和链接告警。

(2)     在build machine上对刚生成的程序运行自动化的冒烟测试,并把测试结果log文件放入与当天日期对应的路径下。程序应该通过冒烟测试中的所有测试才算成功。

(3)     build machine上的邮件系统向指定的干系人发送电邮,告知当天daily build和smoke test的结果。

(4)     干系人在第二天早上检查昨天的daily build和smoke test的结果。如果发现错误,应停下手头工作,立即进行改正。冒烟测试是execution testing中的第一道关口,所以必须被赋予最高优先级。

(5)     上述过程,每天进行,周而复始,直到项目交付。即使项目的进度压力大,也必须坚持本实践。

5.       冒烟测试随着产品代码的增加而增加。坚持为产品代码编写测试代码,看似花时间,但实际却是为项目真正地节约时间。

6.       Daily build失败或通不过smoke test应该是罕见的例外,而不应该是常态。如果频繁出现这种情况,那就应该好好思考一下为什么会这样了。

 

3.3 质量保证的基础性实践

大多数公司都认为:最好从一开始就远离错误。远离错误的关键就是从第一天起就注意运用质量保证的基础性实践。高的软件质量与短的开发时间是相辅相成的,下图给出了两者的关系。

clip_image002[6]

由图可见:95%附近的一些点很重要,因为能做到大约95%的被发现缺陷被修复的项目通常能实现最短的进度,最少的工作量和最高的用户满意度。

下面是一些质量保证的基础性实践:

l  Error-prone module。对易错模块(error-prone module)的质量保证是软件特别重要的一个方面。易错模块通常指错误率达到“10个缺陷/1000代码行”的模块。鉴别出易错模块,对其进行review以决定是否需要重新设计或重新实现。对于易错模块,推倒重来有时比东修西补更省时。

l  Testing。最常见的质量保证实践无疑是execution testing。两种基本的测试方法是单元测试和系统测试

l  Technical review。Technical review用于检查requirements、design、code、test cases或其它project artifact中存在的缺陷。Technical review是对execution testing的重要补充,是每个软件项目的关键组成部分。常见的technical review方式包括informal walkthrough、code reading和inspection。



TAG: