1.2.2 工程能力的定义
前面介绍了工程能力的重要性,但是我在这里认真地问一句“工程能力到底是什么?”恐怕没有几个人能回答出来,而如果不解答这个问题,我们是无法在实践中真正提升工程能力的。
在百度内部材料《百度软件工程能力定义》中,将工程能力定义为:使用系统化的方法,在保证质量的前提下,更高效率地为客户/用户持续交付有价值的软件或服务的能力。
这个定义虽然很短,但是包含了不少信息,可以将其拆解为五点,如图1.1所示。
图1.1 对工程能力定义的拆解
下面对以上五点分别进行说明。
1. 研发的目的是提供价值
在现实工作中,很多软件工程师习惯从技术角度思考问题,忽视所研发的软件对业务的实际价值。还有一些软件工程师喜欢使用复杂和高深的技术,而不管这些技术是否适用于当前的场景。
虽然不能忽视技术在软件研发中的重要作用,但是我们必须要认识到:系统设计、代码编写等技术只是手段,而不是目的。这些技术都必须为项目的目标服务。即使有很好的技术,如果软件最终对用户没有价值,那么这个项目很可能是失败的(除了那些纯粹以技术探索为目的的项目)。
在项目规划阶段,就要重视客户需求或商业价值角度的思考,这样才会使软件的研发活动更有针对性,从而减少不必要的研发投入。
另外,在软件研发中还要具有成本意识,软件工程师要学会计算投入产出比。
2. 质量第一
在现实工作中,经常出现这样的现象:在研发资源或项目时间紧张的情况下,软件工程师往往会降低质量的要求。很多人会考虑一个问题:研发质量和项目时间怎么做好权衡。
在《软件开发的201个原则》一书中,将“质量第一”列为全书的第一个原则,可见其重要性。
原则1 质量第一
QUALITY IS #1
无论如何定义质量,客户都不会容忍低质量的产品。质量必须被量化,并建立可落地实施的机制,以促进和激励质量目标的达成。即使质量没达到要求,也要按时交付产品,这似乎是政治正确的行为,但这是短视的。从中长期来看,这样做是自杀。质量必须被放在首位,没有可商量的余地。Edward Yourdon建议,当你被要求加快测试、忽视剩余的少量Bug、在设计或需求达成一致前就开始编码时,要直接说“不”。
——摘自《软件开发的201个原则》
如果不能保证软件质量,就会影响用户的体验,从而影响软件的价值。如果软件没有价值,软件研发活动就失去了意义,那么原来所设定的时间目标还有什么意义呢?
降低质量要求,事实上不会降低研发成本,反而会增加整体的研发成本。在研发阶段通过降低质量所“节省”的研发成本,会在软件维护阶段加倍偿还。
要保证软件的质量,首先要针对项目情况,明确定义软件所应达到的质量要求。不同性质的软件,对于质量的要求是不同的,软件工程师不应该固守唯一的质量标准。
虽然质量不能权衡,但是我们也需要考虑项目时间这一因素,要通过提高技术水平来高效率、低成本、系统性地保证质量,这也是软件研发团队技术能力的一种体现。
最后要说明,高质量的软件首先是设计出来的,而不是写出来或测试出来的。因此,要提高软件质量,首先要提升软件的设计能力。
3. 实现价值持续交付
在现实工作中,还会出现这样的现象:在软件研发的前期,开发人员放松对软件的要求,并且对项目投入不足。比如,在设计文档没有充分完成(甚至没有设计文档)的情况下就开始编码;在编码时也不注重代码规范,并缺乏认真的代码评审。而在软件研发的后期,开发人员发现软件维护困难,成本远超预期。另外,有不少从业者只喜欢开发新的系统,而不喜欢维护和升级老系统,一方面是老系统的问题比较多,另一方面是这项工作也很难去展示个人业绩。
对于这些问题,从业者首先需要提升对软件研发规律的认识,明确软件的研发和维护是长周期的。在软件规划时,需要综合考虑软件在整个生命周期内的研发成本投入,在研发的早期少欠技术债。
软件/服务的价值提供是长周期的,从业者要做好长期维护、长期服务、持续改进优化的思想准备。
4. 系统化和科学的方法
根据笔者的长期调查,中国的软件工程师中有很多人缺乏对软件工程方法的系统性学习。很多软件工程师读过的专业软件工程类图书不会超过两本,阅读的内容主要是编程语言、网络和操作系统等,而不是软件工程。
软件工程是一个非常专业的领域。在过去数十年中,前人在这个领域已经总结出大量优秀的理念、方法和实践经验。软件工程不是由几个小窍门或小知识组成的,而是由产品设计、需求分析、系统设计、编码方法、质量保证、项目管理、系统运维和产品运营等方向组成的综合学科,并且在每个方向上都有非常深入的体系。
在软件研发方面,是否使用了科学的方法,效果会相差十倍、百倍、千倍,甚至是从0到1的差距。
5. 持续提升研发效率
在现实工作中,我们不难发现,很多涉及软件研发的管理者对业务目标非常关注,而对提升软件研发能力的关注度则不足。
软件研发效率可提升的空间很大,永无止境。对软件研发能力的提升不是一个短期行为,而是一个持续的过程。在这方面,需要团队和项目管理者,以及每个软件工程师持续关注和投入。