产品开发之道
1.4.1 开发正确的产品
所谓“开发正确的产品”是指“开发能够赚取利润的产品”。对于企业而言,评判产品“对错”的标准就是“能否赚钱”。
政府每年给大学科研机构投资很多钱,允许人们去研发不赚钱的东西,例如很多自然科学基金项目的考核目标是学术水平而不是经济效益。但是企业的职能和大学科研机构的完全不同。企业只能开发“能够赚取利润”的产品,赔钱的产品不能开发。
不少人有疑问:
有些国际著名的大企业拥有自己的研究机构,例如贝尔实验室、IBM研究院、微软研究院等等。这些机构的学术水平极高,企业花巨资让那些天才们研究一些看似不赚钱的东西,岂非违背企业的根本目标?
国际著名的大企业之所以活得那么风光,就是因为它们很少干蠢事,越活越好。这个问题要透过表象才
能看到本质:
科学技术是第一生产力,为了提高企业的科技竞争力,国际著名的大企业不得不花巨资从事超前的研究。那些超前的研究成果通常没有短期的经济效益,但是可能在不久的将来被大规模地应用,从而产生巨额利润。当然不少研究成果可能永远都不会产生经济效益,这就是科研投资的风险。世界范围内的科技竞争非常激烈,有些关键性的技术往往决定了企业的命运。万一竞争对手在科技上领先一步,马上就会占领市场的主要份额,自己就面临被淘汰的危险。例如当前几乎所有的大型电信企业都在研究3G(第三代移动通信),简直可以用豪赌来形容。所以为了让自己在未来能够活下去并且活得更好,大企业不得不花巨资从事超前的研究,这是战略投资,当然符合企业的根本目标。
有些大企业的产品发展战略非常有意思:
在市场上推出第一代产品的时候,企业内部已经掌握第二代产品的技术,并且开始在实验室里研究第三代技术。当第一代产品没有遇到竞争对手、或者市场没有疲软的时候,绝对不推出第二代产品(免得冲击第一代产品,降低利润)。一旦状况改变,马上推出第二代产品,让竞争对手措手不及,或者以自我淘汰的方式带动新一轮消费。这样周而复始,力图永远领先于竞争对手,永远占领市场最大份额。例如芯片业老大Intel就是这样做的。
对于普通的中小企业而言,它们只能干些力所能及的事情。如果采用成熟的技术就能够做出能赚钱的产品,那就没有必要自己研究新技术,尽可能地降低风险。
判断一个设想中的产品是否能给企业带来利润,这绝对不是一件轻松的事情,千万不能依赖于少数领导人拍脑袋的决策方式。
“开发正确的产品”这种决策过程叫“立项管理”。立项管理的主要目的是:
通过规范化的流程,判断并采纳符合企业根本目标的立项建议,提供合适的资金和资源,使立项建议成为正式的项目。
一般地,立项管理过程包含“产品构思、立项调查、可行性分析、立项申请、立项评审、项目筹备”等关键活动。本书第二章将论述立项管理。
1.4.2 正确地开发产品
所谓“正确地开发产品”是指:
(1)项目团队在预定的时间和成本之内,开发完成合格的产品;
(2)项目团队尽最大努力把产品做得好、做得快并且少花钱。
前者是基本要求,后者是努力方向。
“质量、效率、成本”通常是衡量产品开发过程优劣的三个关键指标。如果产品的质量比较差,必然挨用户骂,轻则被退货、重则倒品牌。如果工作效率(包括生产率和行政效率)比较低,等你慢腾腾开发完成产品并推向市场时,可能大部分市场已经被竞争对手捷足先登了。如果开发成本太高,要么用户买不起,要么利润率太低。
一般说来,质量、效率、成本之间存在对抗关系。俗话说“一分钱一分货”,人们买东西的时候大多认可“质量越好价格就越高”。再如俗话“慢工出细活”,言下之意是提高质量将使生产率降低。根据常识可知,要想同时提高产品质量、效率并且降低开发成本是非常不容易的。人们应当根据企业的实际状况,围绕企业利益最大化这个目标,分析质量、效率、成本的诸多构成要素,给出优化和折衷的措施。
一、关于软件质量
软件的质量属性很多,如正确性、精确性,健壮性、可靠性、容错性、性能、易用性、安全性、可扩展性、可复用性、兼容性、可移植性、可测试性、可维护性、灵活性等。对于一个特定的软件而言,我们首先要判断什么是它的质量要素,才能给出提高质量的具体措施,而不是一股脑地想把所有的质量属性都做好,否则不仅做不好,还可能得不偿失。简而言之,能成为卖点的质量属性才是质量要素,才值得开发人员关注。
特别要提醒读者注意的是:提高软件质量的最终目的为了获取尽可能多的利润,而不是出于对完美质量的追求;如果某些质量属性并不能产生显著的经济效益,我们可以忽略它们,把精力用在对经济效益贡献最大的质量要素上。
大多数软件工程教科书和学术文章总是站在技术的角度论述软件质量,并且努力把技术推向极致。这些技术无疑是有价值的,但是我要指出这种教育方式可能会误导读者。开发人员学会了提高软件质量的技术,却常常在不该用的地方用了它。
例如,谈到软件的可扩展性,开发人员首先想到的是怎样提高可扩展性,于是努力去设计很好的体系结构来提高可扩展性,却不考虑该不该做这件事。从商业角度考虑,如果某个软件将不断地推出新版本,那么可扩展性很重要。但是如果软件永远都不会有下个版本(一次性买卖),那么根本无需提高可扩展性,何必自找苦吃呢!
再如,让两个同类的软件A和B相互兼容可以使用户得益,为了提高软件之间的兼容性,开发人员通常会在数据格式方面下功夫。从商业角度考虑,如果A和B存在竞争关系,那么弱者应当设法与强者兼容,否则无容身之地;强者应当避免被竞争对手兼容,否则强者的市场将被瓜分。如果开发人员出于好意而让强者与弱者兼容,此举无疑会损害企业的利益。
缺乏商业经验的开发人员往往因为单纯而傻得可爱,却因幼稚而傻得可笑。
作者在著作《高质量程序设计指南——C++/C语言》中,主要从技术角度对软件质量作了大篇幅的论述。本书将继续探讨软件质量这个话题,但是思路已经改良:(1)先从经济利益识别软件的质量要素,并给出合适的质量目标;(2)再用技术手段提高软件质量,实现质量目标。
二、关于效率
企业总是希望产品上市的时间越短越好,这样可以抢占市场。对于合同性的项目而言,开发方应当在合同指定的期限内交付软件,否则违约的话将损害双方的利益。所以对于企业而言,时间就是金钱。
在正常情况下,开发团队的工作效率是决定产品实际开发时间的主要因素。所以提高工作效率是企业获取更多利润的有效途径。在旧社会,资本家的工厂里都有监工,监工的职责就是让工人们不停地干活,在给定的时间内生产出更多的东西。
提高工作效率的前提条件是所有工作成果的质量必须合格。否则,工作效率越高,软件中的缺陷就越多,那么用于测试和维护的代价也越高,得不偿失。所以提高质量、提高效率都不是喊口号,要根据企业的目标和当前实力,量力而行。
在不对质量和成本产生负面影响的前提下提高工作效率,这才是真本事,常见措施有:
² 提高项目成员的工作技能。即使在组建项目团队时每个成员的技能都是合格的,每个人仍然需要不断学习,无论对于项目还是人生而言都是有益的。项目经理应当组织一些有针对性的培训,提高项目成员的工作技能,使他们在开发产品时不仅做得好而且做得快。
² 制定合适的软件过程。软件过程定义了做事的主要步骤,如果过程混乱,做事颠三倒四的话,势必伤害生产率。虽然人们都知道开发软件要经历需求分析、系统设计、编程、测试这些阶段,但是严格的线性顺序并不见得就是最优的,因为许多局部工作可以并行开展甚至提前开展。世界上并不存在放之四海皆准的、通用的软件过程标准,所以项目经理应当制定适合于本项目的软件过程,并随着项目的进展加以适当的优化。
² 提高复用程度。复用就是指“利用现成的东西”,软件中可以复用的对象有设计模式、代码库、文档模板等等。由经验可知,通常在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。一般地可以相信成熟的东西总是比较可靠的,而大量成熟的工作可以通过复用来快速实现(即具有高生产率)。软件人员应当懂得复用别人留下的成熟可靠的成果(可能要花钱去买也可能是免费的),并且还要给自己留下可以在将来复用的东西。复用不是人类懒惰的表现而是智慧的展现。
² 使用高效率的开发工具和管理工具。使用好的工具无疑有助于提高人们的工作效率。软件人员通常会采用业界推荐的开发工具,几乎每天都要使用,因为这是开发产品所必需的。然而管理工具就一言难尽了,因为功能先进但是价格昂贵的管理工具对于大部分项目而言并不见得是最合适的。例如目前比较流行的配置管理工具:SourceSafe的功能一般,价格较低,使用非常方便;CVS的功能比SourceSafe强一些,完全免费,用起来不如SourceSafe方便;而ClearCase则是功能极强,价格极高,必须经过数天培训后才能学会使用。所以无法说那个配置管理工具更好。项目经理应当根据项目的规模、经济实力等因素,选择合适的管理工具,并且要坚持使用才能提高团队的生产率。
三、关于成本
软件不同于常见的生活用品。开发软件主要用人们的脑子,不需要开工厂,无需原材料,也不需要放到百货商店的柜台上销售。一般地,开发成本和维护成本是软件的主要成本构成。
除了软硬件基础设施的成本外,人力资源成本占了开发成本的主要比例。人力资源成本等于雇员的工资乘以工作时间,所以企业招聘员工的理想状态是:以最低的工资招聘恰好满足工作需要的人。另外,设法提高工作效率以减少总的开发时间,从而降低人力资源成本。
人们常常关注开发成本而忽视了维护成本。对于一个有信誉的企业,如果卖出去的软件产品中有错误,那么就有义务修改错误。软件刚卖出去的时候,销售价格肯定比开发成本高,看起来是赚了钱。但是如果软件质量比较差的话,那么维护成本将是个无底洞,完全有可能把先期赚的钱给消耗光。所以人们不可为了压缩开发成本而放弃软件测试、技术评审等质量检查活动。前期偷懒将使后期遭殃。
在绝大多数情况下,设法降低成本将有益于企业获取更多的利润,但并不是绝对的。企业有短期目标和长期目标之分,为了使企业利益最大化,在某些时候企业会不惜成本地去抢占市场,以使未来获取更多的利润。产品的决策者一定要搞清楚质量、效率、成本之间的复杂关系,判断孰重孰轻,给出优化和折衷的措施。
四、关于软件过程改进
一般地,在软件开发过程中,工程类的过程域主要有:需求开发、系统设计、软件实现、软件测试、软件维护等等;管理类的过程域主要有:项目规划、项目监控、需求管理、质量管理、配置管理等等。上述过程域中的任何活动都会影响产品的质量、生产率和成本。
从20世纪90年代之际,软件过程改进成为软件工程和项目管理交叉学科的主流研究方向。软件过程改进的目标就是“提高产品质量、提高工作效率和降低开发成本”。业界的实践证明,走规范化之路是成本最低、见效最快、能持续发展的软件过程改进方法。规范化之路就是本书致力探索的成功模式。
本书从第三章起直至最后一章,将深入阐述在每个过程域“正确地做事”的方法,总结出可以复用的模式。请读者参考作者的另一本著作《CMMI 3级软件过程改进方法与规范》。