如何提升软件开发过程的效率、效果?
带着这个问题,笔者阅读了获得Jolt软件开发生产力大奖的著作《精益软件开发》以及《精益软件开发管理之道》,书中将精益的理念融入到软件开发中,形成诸如“消除浪费、构建品质、创造知识、延迟承诺、快速交付、尊重人、整体优化”等七条原则,并深刻阐述了敏捷和精益取得成功的原因,包括系统思考、技术杰出、可靠交付、不断改进、卓越的人以及一致的领导等,从时间、空间、行业、文化背景等角度进行了全局性阐述。
为了避免空洞、宽泛的谈论如何利用精益达到增效的目标,本文将基于精益理念,以技术作为切入点,探讨如何从技术角度提升软件开发过程的效率及效果。无论你当前采用的是瀑布还是敏捷,都将适用。
1、基本复杂性
Fred Brooks在1986年发表的地标性文章《No Silver Bullet》中提到“软件的复杂性是一项基本属性,不是偶然属性。开发软件产品的经典问题来自于这一基本复杂性,以及复杂性随规模增长而出现的非线性增长”。目前,业界均已承认软件的非线性增长的复杂性,“分而治之”是共识的解决方案,如何确定最好的划分标准并不简单。但我们回归到软件设计本身,从架构角度考虑是否可以降低复杂性?软件工程学中早已给出答案,“高内聚、低耦合”,即尽量在软件设计之初就尽量保证架构的低依赖,从根源降低后期的维护、管理成本,这在瀑布开发模式中有效,在敏捷开发中更是如此。敏捷中我们鼓励变更、积极应对变化,但对于拥有紧密耦合、高度依赖的系统来说,变更以及迭代的不断变化将存在很大风险,同时成本高昂。
所以,要使开发过程有效,且降低成本,首要考虑架构设计是否具有低依赖性。
2、构建高品质
业界普遍认可“通过尽早发现错误和立即改正错误可以有效降低成本”。即在缺陷引入时就能够及时发现。
目前软件中心普遍采用的瀑布开发方式中通过在需求分析、总体设计、详细设计、程序实现等阶段增加走查、评审,确保阶段输出结果正确,以降低缺陷延迟到测试阶段发现的高额修复成本。在测试环节,通过多种技术手段尽量识别缺陷。但纵观开发模式以及中心的基线数据,不难发现我们存在如下浪费:
1. 组织级“工作量占比-项目工作量构成”基线中显示,目前单元测试到功能测试工作量占比66.33%,“各工程阶段发现问题”基线中显示,单元测试到功能测试识别问题占比43.44%。即在项目的中后期花费项目三分之一的时间识别出项目43%的问题,这与我们 “尽早发现缺陷降低修复成本”的目标并不一致。
2. 瀑布的方式对于功能项来说是批量的分析、批量的设计、批量的开发与测试,大批量工作会在每个过程步骤上产生排队现象,所以缺陷不会在进入时即被检出,而必须等到批处理的检查、测试时才能发现。
3. 划分“设计”与“实现”阶段,无法对设计、实现是否合理、符合用户需求给予及时的反馈。同时,我们也不可否认,设计与实现是无法清晰的分离的。
我们可以参考精益原则,消除浪费、内建质量来构建高品质,进而降低成本。在敏捷开发中较多的成熟团队已采用相关的方法,如通过采用小批量、及时反馈验证降低延迟反馈成本,通过测试驱动开发和持续集成来构建高品质。这些良好的实践在瀑布开发模式也可以采用:
1. 以小步骤的方式开展工作,降低批量,减少等待;
2. 尽量采用有规律的节奏实施快速验证、反复进行;
3. 测试驱动开发:先编写必须保持的条件,然后再编码,以保证通过这些条件,将以往的先编码再测试的“缺陷—注入”过程改进成测试驱动编码的“错误—证明”过程,确保缺陷引入及被发现。
4. 分级分层的自动化测试,即保证测试覆盖,同时提升效率,降低人工成本。
5. 持续集成,并保持对识别的缺陷及时处理。
6. 编写逻辑简单、清晰的代码,提升可读性,有效降低维护成本。
总之,无论瀑布还是敏捷产品,在软件开发过程中应用如上敏捷实践,构建高品质产品是降低质量成本、维护成本的最有效方法。
3、演进式开发
在敏捷开发中演化形成“演进式开发”的概念,它的核心是一些列短期发现的循环,每个循环通过客户研究、协作建模、快速实验等方式不断发现开发产品以及团队的弱点,以便改进系统,提升效率、效果。
这里提到的客户研究不仅限于收集需求,更多采用走进用户现场,通过访谈、观察等方式进行客户研究、挖掘;协作建模通过流程图、图表、图像等简洁的方式促进团队内、团队与客户的交流;快速实验通过迭代的方式先开发高风险、高价值的特征,在这个过程中了解团队技能及产能,同时得到客户反馈。
这一过程循环式、演进式进行开发,并辅以上文提到的低依赖性架构和测试技术,可以有效适应客户、市场不断变化的需求,降低一次性、大规模实施带来的风险,提升效率以及客户满意度。
除以上几点外,通过培训、实践等方式提升每位开发者的专业技术能力,以工匠之心对待软件开发中的每一个过程,也是提升软件质量、降低成本的必要条件。
4、小结
精益软件开发是一个多维度的系统理念,本文仅从其中的技术角度进行剖析如何利用精益理念实现“控本增效”。首先,在架构层面,实现低依赖性;其次在实现层面,有效应用测试驱动开发和持续集成等敏捷开发实践,构建质量;并通过演进式的开发来提供改进循环,同时注重培养人员的专业技术提升。基于以上几点,以技术作为降低成本的切入,提升开发效率,提高客户满意度。
撰稿:上海分中心工程管理部质量管理团队 张欣璐 编辑:孙菲菲 高允