编程心智(二)——二八定律对软件开发的影响

相信很多人都听说过二八定律,这是一个适用性非常广泛的定律。我发现二八定律同样适用于软件开发,并对其产生了十分深远的影响。这次我想聊聊二八定律是如何影响我们日常的开发工作的,希望通过这个话题来改变一下大家习以为常的开发思维。

定义

二八定律是19世纪末20世纪初意大利经济学家巴莱多发现的。他认为:

在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的,因此又称二八定律。

二八定律有相当广泛的普适性,不论是在生活中,还是在工作上,只要你细心观察,都会发现其身影。

功能需求对软件开发的影响

不知道大家有没有发现这样一个事实,随着我们系统要处理的业务功能越来越多,我们添加一个新功能的代价也越来越大。很有意思,我发现业务功能与添加一个新功能要做出的努力呈现出类似于下图所示的关系。

起初,为了使得一个新系统能运行,我们不得不处理一些非业务性的工作,比如搭建框架、技术选型、架构设计、部署结构设计、资源申请等等。而一旦这些基础性的工作完成,那我们就可以快速的完成业务需求。大概花费我们20%的精力就可以满足80%的业务功能,这些业务功能也是系统的主要功能。但是再往后新增功能,所要做出的努力就会成指数增长。这张图与P o EAA中的领域逻辑复杂度与工作量之间的关系类似。当然,这个曲线并不是绝对的,影响这条曲线的关键在于系统的代码架构,好的代码架构能让你在处理复杂的业务需求时更加从容。(题外话,我认为一个优秀的程序员应该具备处理复杂需求的能力。)

既然我们发现了这个规律,是否能指导我们的日常开发工作呢?答案是肯定的。因为80%的功能基本已经满足了大部分人的需求,而为了满足少数人的需求而增加80%的努力是不值得。当然,公司完全有理由要求你这么做,与此同时你也可以把这个利害关系介绍给他们听。

甚至在细分到x轴和y轴,我们可以继续运用二八定律来分解。80%的业务功能其实大概只有20%是核心功能,其余的只是为了优化体验或者简化流程为存在的;而对于20%的努力而言,其中80%的工作主要集中在满足核心的业务需求而存在的,我们应该也必须投入这么多精力来设计并开发这些功能,因为它们是整个系统的核心。

性能优化对软件开发的影响

程序员总是对性能优化这个话题充满激情,好像这成了唯一彰显其技术能力的手段。确实,要把应用系统的性能优化到极致,确实要付出大量的努力。但实际上性能优化所付出的努力与取得的效果也符合二八定律。其工作量与索取的效果类似于下图所示。

不消多说,凡是做个性能优化的同学应该都会有这样的感触:只用加个索引或者加上缓存就可以使得系统的性能大幅度提供。使用常规的优化手段(大概耗费20%的精力)就可以取得显著的效果(提升80%的性能)。但是要取得另外20%的性能提升要付出努力将大大增加。掌握这个规律相信大家应该知道如何“使力”了。

项目人数对开发效率的影响

还一个比较显著的符合二八定律的场景就是在项目管理上。

同时参与一个项目的人并非越多越好,实际上影响应项目进度只取决于少数人(20%),后面增加更多的人其实收效甚微。我个人也是倾向于不要在一个项目上投入过多的人力,要精不要多。现在微服务这么流行,我觉得也有类似地影响。它在架构层面把一个大系统拆分成一个一个小服务,让每个服务有少数几个人负责,这样整体的开发效率会更高。

小结

类似上面的例子还有很多,比如迭代周期对软件质量的影响、服务数量对整体可用性的影响等等,只要你细心观察就会发现二八定律在我们的日常开发工作中无处不在。更为重要的是,我们不仅要发现其存在,更要在那20%的重点上下功夫,避免在80%的事情上瞎费劲。

(文中配图是我用Windows的画图程序生成的,不好看望大家见谅。)

参考资料:

二八定律
企业架构模式

坚持原创技术分享,您的支持将鼓励我继续创作!