平衡软件质量与时间、成本、范围的关系

平衡软件质量与时间、成本、范围的关系

现实中的典型案例:

  • 一个项目正常估算,要三个月才能完成,但是客户或现场要压缩到一个月完成,而不知道如何说服他们;
  • 项目开发到一半,产品经理说有一个非常紧急的功能,要增加到这个版本中,不知道该不该拒绝或如何拒绝;
  • 听说迭代模型开发很好,你也尝试使用,但是每次迭代时间到了还是完不成,只能把迭代时间延长,最后又做回传统的瀑布模型了;
  • 你们组使用瀑布模型开发,一到项目后期总免不了加班加点赶进度,为什么他们用敏捷开发的加班要少一些?

这些日常项目中涉及时间、成本和范围的问题,都离不开“软件项目距管理金三角”的概念。

掌握好这个知识点,学会平衡软件质量与时间成本范围的关系,可以帮助你更好驾驭项目中的各种问题,也可以帮助你更好理解软件中的各个模型,尤其是瀑布模型和敏捷开发。

什么是软件项目管理金三角

在显示生活中,我们都知道,做产品想“快、省、优”都占着,是不可能的,最多只能选两样。想要便宜且质量好,就要花时间等;想要快还要质量好,那就得多花钱;想要又快又便宜,那就得接受质量差。

而在软件项目中,也有一个类似的平衡关系,就是软件质量与范围、时间、成本四个要素之间的平衡。

  • 软件质量:产品的质量、客户的满意度
  • 范围: 需求范围
  • 时间: 多久完成
  • 成本: 花多少钱


上图就是著名的项目管理金三角,三条边分别是时间、成本和范围,中间是质量。

为什么质量放在三角形的中间?
因为软件工程的目标就是要构建和维护高质量的软件,所以项目的质量是高于一切的。也就是说,质量这个因素一般不会妥协,因此把质量放在三角形中间,然后在时间、成本、范围这三条边之间寻求平衡。

质量往往也是其他三个因素平衡后结果的体现。

如何应用“金三角”来做决策?

项目管理其实就是项目中一系列问题的平衡和妥协,而金三角理论则为我们的平衡提供了理论指导,了解这三个因素分别对项目其他方面产生的影响,可以帮助你在做决策时进行权衡取舍。

当你接手一个项目,进度要求、成本和范围指标应该是可以跟踪到。有了这些信息,你就可以及时发现问题,调整金三角的边,及时解决,防止这些小问题发展成大问题。

举两个例子,看看金三角是如何应用的。

客户要压缩时间怎么办?

做开发管理,常遇到的问题之一就是时间被压缩,比如开头的第一个问题。通常我们会据理力争,说这不科学,肯定不行。客户说时间点很重要,必须一个月上线。结果就是大家吵得不欢而散,最后还得加班加点做,质量也不好。

这个例子很典型,先用金三角分析下:客户希望时间是1个月,也就是说时间这条边被缩短了,那么结果就是会影响到另外两条边:范围和成本,如果另外两条边可以调整,也不是不可以。

于是,再遇到类似问题,可以用金三角的沟通方式:一个月也不是不行,就是我们得需求调整一下,第一个版本只能做一些核心功能,剩下的后面版本再加上(调整范围)。另外,开发得增加一人,不然风险太大。(增加成本)团队这个月需要执行996来完成这个重要项目。(互联网模式的时间增加)

这样的方案提出来,就好沟通多了,最后重点就变成了砍多少功能、加多少人、如何合理安排加班的事情了。

产品经理要临时加需求怎么办?

文章开头的第二个例子。
先拿金三角知识套用一下。增加需求,也就是范围这条边要增加,那就必然对成本和时间这两条边造成影响,要么增加成本,要么延期或加班。

面对这种临时加需求的情况,我们也不需要直接说不能加,而是清楚的让产品认识到这样做的后果:进度延期或加班(长时间加班影响团队)、需要更多人力。如果这个功能真的太重要,可以接受延期,那就重新制定新的计划就好了。

所以,如果我们能应用好金三角知识,很多软件中的问题,一下子就多了很多方案可以选择了。

瀑布模型和敏捷开发如何平衡时间、成本、范围的关系?

瀑布模型有严格的阶段划分,有需求分析、设计、开发和测试等阶段,通常在开发过程中不接受需求变更,也就是说,我们可以认为瀑布模型的范围是固定的,其他两条边时间和成本是变量。

所以用瀑布模型开发,如果中间发现不能如期完成进度。通常选择的方案就是延期(加班),或者往项目中加班。

敏捷开发中,是采用固定时间周期的开发模式。例如每两周一个Sprint,团队人数也较少,所以在敏捷开发中,时间和成本两条边是固定的,就只有范围这条边是变量。

这就是为什么在敏捷开发中,每个Sprint开始前都要开Sprint计划会,大家一起决定下个Sprint能完成的任务。甚至在Sprint结束时,没能完成的任务会放到下个Sprint再做。

这时,再回到文章开头的第三个问题:

听说迭代模型开发很好,你也尝试使用,但是每次迭代时间到了还是完不成,
只能把迭代时间延长,最后又做回传统的瀑布模型了;

现在是不是就明白了:如果不能固定“时间”这条边,就会导致时间也变成了变量,迭代自然无法正常推进。

如何平衡好软件质量与时间成本范围的关系?

其实如何平衡好软件质量与时间成本范围的关系,我们只能在“多、快、好、省”中最多选择两样,然后再另一边或另外两边去寻找平衡。

所以第一件事就是:从时间、成本和范围这三条边中找出来固定的一条或两条边,再去调整另一条边。

下面,来分析一些案例,帮助你更好的理解。

淘宝网第一个版本是怎么做到一个月上线的?

2003年4月7日马云提出成立淘宝,2003年5月10日淘宝就上线了,只用了一个月时间。

好,如果你是当时的淘宝网负责人,马云要你一个月上线,功能还不能少,你怎么办?

第一件事当然是先应用金三角分析:时间这条边被固定了,一个月;功能也不能少,范围这条边也限制了,那就只能在成本上想办法了。要么一下子雇很多牛人,要么直接买一个现成的电子商务网站,然后修改。

显然,直接先买一个网站,再雇一堆牛人的方案最好,所以淘宝网站就这样在一个买来的网站基础上,由一堆牛人快速搭建起来了。归功于淘宝的快速上线,刚推出后,正好赶上“非典”,网购需求增大,淘宝网一下就火起来了。

从成本角度我们还有可以去做的,比如DevOps中的CI&CD持续集成部署、优秀的敏捷开发工具等等。

极限编程是怎么做到“极限”的?

极限编程(eXtreme Progrogramming,XP),是目前敏捷开发主流的工程实践方法,极限编程的“极限”,意思就是如果某个实践好,就将其做到极限。比如:

  • 如果做测试好,对软件质量帮助大,就让每个开发人员都做测试
  • 如果集成测试重要,就每天都做几次测试和集成
  • 如果简单的就是好,那么就尽可能的选择简单的方法实现
  • 如果追求质量第一,就要有严格的codereview和单元测试覆盖率
  • ……

极限编程的“极限”理念,改进了软件项目中的五个基本方法:沟通、简单、反馈、尊重和勇气。同时产生了很多优秀的实践方法,例如持续集成部署、自动化测试、重构等等。

这些实践帮助我们可以在短时间的迭代中,产生高质量的代码。
我们用金三角的理论来分析一下极限编程在Sprint中的应用。

一个Sprint做的内容是确定的,相当于成本和范围这两条边都固定了,时间这条边就成了变量了。要么通过加班延长工作时间,要么通过提升效率、减少浪费来提升时间利用率

极限编程,就是通过帮助我们提升效率和减少浪费这方面来做的。比如:

  • 持续集成,通过自动化部署,节约手工部署时间
  • 自动化测试,节约测试时间
  • 只做刚好的设计,避免设计时考虑太多不必要的可能,造成浪费
  • 研发流程的标准化和信息共享化,降低了沟通、协作成本

其实,我们在项目开发过程也能借鉴这种思路,比如说写代码,少自己造轮子,多使用成熟的开源或者商业组件,可以提升效率;比如把需求搞清楚再去开发,可以减少很多返工的时间成本…

MVP模式是怎么诞生的?

这些年流行的MVP(minimum viable product,最小化的可行性产品)模式,是一种快速推出产品的模式:一开始只推出最核心功的能,满足用户最核心的需求,然后在用户使用过程中收集反馈,进一步升级迭代。

这种模式怎么诞生的呢?还是应用金三角理论,要快速推出产品,还想成本不用太高,那就意味着时间和成本这两条边是固定的,剩下范围这个变量。

所以最简单有效的办法就是砍掉一些重要性不那么高的功能需求,只保留最核心的需求。通过缩小范围的方式,达到快速推出高质量产品的效果。

类似的道理,开发负责人,在遇到很多功能忙不过来的时候,可以主动和项目经理协商,砍掉一些不那么重要的需求,把精力放在核心需求上,保证项目保质如期上线。

总结

要平衡好软件质量与时间成本范围的关系并不难,重要的是根据“金三角”的三条边,找出固定的一条或两条边,然后去调整剩下的边,达到平衡。

参考与版权:极客时间 - 技术领导力

文章作者: MarkLin
文章链接: http://yoursite.com/2019/04/30/平衡软件质量与时间、成本、范围的关系/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 MarkLin的博客