最近几年,我们越来越多地听到 “软件工程能力” 这个词。关于 “软件工程能力”,本章主要讨论三个问题:

  1. 为什么要重视软件工程能力。
  2. 什么是软件工程能力。
  3. 怎样提升软件工程能力。

1 、为什么要重视工程能力


由于行业内竞争加剧、成本上涨和产业升级等形式的变化,工程能力受到越来越高的重视。

  1. 形式变化与挑战

最近几年,软件研发企业尤其是互联网企业正面临以下形式的变化和挑战。

  • 行业竞争的加剧。中国互联网经过 20 多年的发展,早已不是荒蛮之地,竞争的需要逼迫各企业在软件研发的质量和效率上不断提高。
  • 成本上涨。中国在研发成本尤其是人力成本方面上涨非常快。中国软件工程师的人力成本已超过欧洲,和美国的差距也没有那么大了。在这种情况下,业内对于人均产出提出了更高的要求。
  • 产业的升级。中国的互联网企业普遍从 toC 转向 toB,而 toB 对软件研发的质量提出了更高要求。
    1. 如何应对挑战

面对以上挑战,一些企业的对应方法时延长工作时间、增加工作强度。部分公司出现了“996”的工作制度。应该说,这些方法给从业者的身体健康和正常生活带来了严重的负面影响,它们也只能是短期行为,不可能被长期执行。
从现实情况来看,其实国内很多软件工程师的工作效率是比较低的,并有巨大的提升空间。根据笔者多年的访谈反馈,很多软件工程师已经工作了 8~10 年,但是他们的工作方法其实是错误的。在以前人工成本低、管理方法比较粗放的情况下,这些问题并没有得到足够总是。现在公国很多传统行业在进行转型升级,因此中国的很多软件工程师也需要升级了!
提升工程能力,是应对以上变化和挑战的重要解决之道。

  1. 工程能力的制胜之本

在提升工程能力的路上,我们可能会听到一些不同的声音。有些人说,手头的业务很忙,所以没有时间提升工程能力;有些人说,现在的项目进度已经很紧凑了,按照正规的方法来工作会拖慢进度,所以不能对工程能力有严格要求。
从使用不正规的方法到使用正规的方法,一定会有一些学习上的成本投入,更重要的是,工程能力不是锦上添花、可有可无,而是一种生存能力。很多项目的失败,其实是输在从业者工程能力的不足上了!
工程能力首先会影响 “打的准不准”。如果从业者不能做好需求识别和分析,缺乏产品方面的意识,那么研发出的软件就没有市场和用户。
工程能力还会影响 “是否能打赢”。工程能力会影响软件研发的效率、质量和成本,一个低效率、低质量和成本高的软件项目是没有市场竞争力的。

2、 什么是工程能力


在了解了工程能力的重要性后,本节说明什么是工程能力。

2.1、工程能力的误区

很多人可能会将 “提升工程能力” 等同于 “写好代码”。
代码确实是软件研发的重要产出,但是工程能力的涉及范围绝不仅仅限于编写代码。
软件研发是一个需要多人共同参与完成的工作,提升工程能力也不限于 “一个人” 能力的提升。
工程能力反应的是团队的综合素质。要提高工程能力,不仅要看单兵素质,也要看团队能力;不仅要提升写代码的能力,也要提升其他方面的能力(1.3)。
在软件研发过程中,很多从业者的大量时间其实并没有用在琢磨技术上,而是用在了其他方面(比如沟通、项目协调、错误设计导致的返工),这些方面的时间消耗往往也没有打到大家的关注。很多项目的失败并不是因为技术,而是因为那些非技术的因素。

2.2、工程能力的定义

前面介绍了工程能力的重要性,但是我在这里认真低问一句 “工程能力到底是什么?” 恐怕没有人几个人能回答出来,而如果不解答这个问题,我们是无法在实践中真正提升工程能力的。
在百度内部资料中,将工程能力定义为:使用系统化的方法,在保证质量的前提下,更高效率地为客户/用户持续交付有价值的软件或服务的能力。
这个定义索然很短,但是包含了不少信息,可以将其拆解为五点:
软件工程能力 - 图1
下面对以上五点分别进行说明。

  1. 研发的目的是提供价值

在现实工作中,很多软件工程师习惯从技术角度思考问题,忽视所研发的软件对业务的实际价值。还有一些工程师喜欢使用复杂和高深的技术,而不管这些技术是否适用于当前的场景。
虽然不能忽视技术在软件研发中的重要作用,但是我们必须要认识到:系统设计、代码编写等技术只是手段,而不是目的。这些技术都必须为项目的目标服务。及时有很好的技术,如果软件最终对用户没有价值,那么这个项目很可能是失败的(除了那些纯粹以技术探索为目的的项目)。
在项目规划阶段,就要重视客户需求或商业价值角度的思考,这样才会使软件的研发活动更有针对性,从而减少不必要的研发投入。
另外,在软件研发中还要具有成本意识,软件工程师要学会计算投入产出比。

  1. 质量第一

    在现实工作中,经常出现这样的现象:在研发资源或项目时间紧张的情况下,软件工程师往往会降低质量的要求。很多人会考虑一个问题:研发质量和项目时间怎么做好权衡。
    在《软件开发的 201 个原则》一书中,将 “质量第一” 列为全书的第一个原则,可见其重要性。

    原则 1 质量第一 无论如何定义质量,客户都不会容忍低质量的产品。质量必须被量化,并建立可落地实施的机制,以促进和激励质量目标的达成。即使质量没达到要求,也要按时交付产品,这似乎是政治正确的行为,但这是短视的,从中长期来看,这样做是自杀。质量必须放在首位,没有可商量的余地。Edward Yourdon 建议,当你被要求加快测试、忽视剩余的少量 Bug、在设计或需求达成一致前就开始编码时,要直接说 “不”。 ——- 摘自《软件开发的 201 个原则》

如果不能保证软件质量,就会影响用户的体验,从而影响软件的价值。如果软件没有价值,软件研发活动就失去了意义,那么原来所设定的时间目标还有什么意义呢?
降低质量要求,事实上不会降低研发成本,反而会增加整体的研发成本。在研发阶段通过降低质量所 “节省” 的研发成本,会在软件维护阶段加倍偿还。
要保证软件的质量,首先要针对项目情况,明确定义软件锁应打到的质量要求。不同性质的软件,对于质量的要求是不同的,软件工程师不应该固守唯一的质量标准。
虽然质量不能权衡,但是我们也需要考虑项目时间这一因素,要通过提高技术水平来高效率、低成本、系统性地保证质量,这也是软件研发团队技术能力的一种体现。
最后要说明,高质量的软件首先是设计出来的,而不是写出来或测试出来的。因此,要提高软件质量,首先要提升软件的设计能力。

  1. 实现价值持续交付

在现实工作中,还会出现这样的现象:在软件研发的前期,开发人员放松对软件的要求,并且对项目投入不足。比如,在设计文档没有充分完成(甚至没有设计文档)的情况下就开始编码;在编码时也不注重代码规范,并缺乏认真的代码评审。而在软件研发的后期,开发人员发现软件维护困难,成本远超预期。另外,有不少从业者值喜欢开发新的系统,而不喜欢维护和升级老系统,一方面是老系统的问题比较多,另一方面是这项工作也很难去展示个人业绩。
对于这些问题,从业者首先需要提升对软件研发规律的认识,明确软件的研发和维护是长周期的。在软件规划时,需要综合考虑软件在整个生命周期内的研发成本投入,在研发的早起少欠技术债。
软件/服务的价值提供是长周期的,从业者要做好长期维护、长期服务、持续改进优化的思想准备。

  1. 系统化和科学的方法

根据笔者的长期调查,中国的软件工程师中有很多人缺乏对软件工程方法的系统性学习。很多软件工程师读过的专业软件工程类图书不会超过两本,阅读的内容主要是编程语言、网络和操作系统等,而不是软件工程。
软件工程是一个非常专业的领域。在过去的十年中,前人在这个领域已经总结出大量优秀的理念、方法和实践经验。软件工程不是由几个小窍门或小知识组成的,而是由产品设计、需求分析、系统设计、编码方法、质量保证、项目管理、系统运维和产品运营等方向组成的综合学科,并且在每个方向上都有非常深入的体系。
在软件研发方面,是否使用了科学的方法,效果会相差十倍、百倍、千倍,甚至是从 0 到 1 的差距。

  1. 持续提升研发效率

在现实工作中,我们不难发现,很多涉及软件研发的管理者对业务目标非常关注,而对提升软件研发能力的关注度则不足。
软件研发效率可提升的空间很大,永无止境,对软件研发能力的提升不是一个短期行为,而是一个持续的过程。在这方面,需要团队的项目管理者,以及每个软件工程师持续关注和投入。

3 、怎样提升工程能力


  1. 本节简要说明软件工程师在工作中如何提升工程能力。
  1. 工程能力的素质要求

在《百度软件工程能力定义》中,将工程能力分解为公司能力素质、团队能力素质和个人能力素质三类,每类都列出了所需的素质要求:
软件工程能力 - 图2

  1. 人是工程能力的根本

在提升工程能力的过程中,很多组织只重视工具和平台的建设,而忽视了对 “人” 的关注。
“人” 是工程能力的根本。“人” 对工程能力的重要性远远超过工具。“优秀的人+一般的工具” 在研发效率上远远超过 “一般的人+优秀的工具”。
随着软件工具的增强,人与人之间在研发效率上的差距会进一步扩大。而软件工具的增强,使得软件研发团队的小型化成为普遍趋势。考虑到软件研发项目中沟通成本随着人数增长而呈指数型增长的规律,小规模优秀工程师团队的研发效率要远高于大规模普通工程师的团队。
伟大的系统和产品一定来自优秀的人和团队。在 “人” 没有改变的情况下,团队规模的增加、劳动时间的延长,都无法从根本上改变软件的品质。无论是对于组织还是个人,都应该在培养 “人” 方面投入更多的资源。

  1. 工程能力提升源于自我驱动

有些人希望通过简单的考核手段来提升工程能力,也有人将自身工程能力没有得到提高归结于 “没有得到所在团队领导的支持”。
对于提升工程能力,工程师的自我驱动力是最重要的。在工程师没有充分理解和认可工程能力的情况下,考核可能只会引起一些表层指标的变化,但是很难让工程能力发生本质性改变。
我一直秉持一个观点:如果一个人知道什么高效而正确的方法,那么他(她)一定不会继续使用低效且错误的方法。相比于依赖指标考核,不如通过教育和培训让工程师了解什么才是正确的方法。在这之后,优秀工程师的自驱力会发挥非常大的作用。
对于那些不认可工程能力的人来说,考核也不会起到真正的作用。一名优秀的工程师,一定不是依靠考核来驱动的。考核只能起到识别和鼓励的作用,而无法使一个人从一般变为优秀。

  1. 个人能力的素质要求

上面对个人能力的素质要求列出了 10 条,似乎有些多。为了更易于掌握,强调以下三点:
写好代码(对应编码能力),写好文档(对应需求把握和系统设计),做好项目管理。
而在代码、文档和项目管理三者中,重要性为:项目管理 > 文档 > 代码
对于这个排序,可以做如下解读。
(1)没有好的管理,有再好的技术也没有用。
(2)好的代码,首先来自好的设计。
(3)需求分析先于系统设计。
针对目前现实中的情况,建议读者加强对项目文档的重视,加强对需求分析的重视,以及加强对项目管理的重视。相关内容会在后面的章节中有详细介绍。