软件工程的最大难题

一、引言

大学有一门课程《软件工程》,研究如何组织和管理软件项目。

说实话,这门课不适合本科生,因为学生可能体会不到,课程到底要解决什么问题。只有亲身参与过大项目的开发,经历过大团队,才能感受为什么软件工程很重要,又很难做对。

软件开发有一个难题,叫做“扩展”(scaling),即怎样服务更多的用户。你有10000个并发用户,跟你有10个并发用户,这是完全不同的概念,哪怕功能完全相同,背后的实现是完全不一样的。并发用户数上升一个数量级,软件就必须重构,大量问题随之产生。

大项目的技术难度高,管理难度更高,而且大团队的生产率往往很低,行动缓慢。 《软件工程》就是研究,如何扩展软件和团队,适应大项目的需要。

国外有很多专著,研究这个问题。前些日子,我读到一篇文章[1],推荐了两本书。第一本叫做《加速:构建和扩展高性能技术组织》,第二本叫做《规模:生物,城市和公司的普遍法则》。

我看了这两本书的介绍,觉得很有启发,下面就做一些摘录。

二、大项目的困境

一个典型的大型软件项目,开发过程通常是下面这样。

最开始的时候,它是一个小项目,开发人员就是两三个人,甚至可能只有一个人。产品比较简单,功能很有限。

第一版发布后,拿给客户使用,反响不错。客户要求的新功能,能够很快开发出来,Bug 修补也很快,因为早期客户往往可以与开发人员直接沟通,快速反馈。

公司于是决定投入更多人员,开发这个项目。团队慢慢变大了,软件开始变得复杂,开发速度逐渐变慢了,2.0 版花费的时间比预期要长一点。Bug 的修复难度开始增加。总之,新功能的开发日程变久了。

公司的自然反应是进一步扩充团队。但是更多的新成员其实会降低其他人的生产率,一个普遍现象是团队规模越大,每个人的平均生产率越低。

几年以后,代码逐渐老化,复杂性不断增加,项目开始停滞不前。某些极端的情况下,软件的维护成本变得非常高昂,并且几乎不可能进行更改。

最终,这个项目成为技术债务,等待被新项目替换。

三、为什么大项目的开发效率低?

大项目就像一头大象,让人望而生畏。可是一旦需要奔跑,大象就会步履蹒跚,被猎犬远远甩在后头。它快不起来的原因有两个。

(1)代码复杂度

随着代码量的增长,单个开发者想要理解整个代码库,变得越来越困难。如果团队超过五个人,每个人负责一个功能,那么单个人几乎不可能追踪系统的所有工作进度。

当你中途加入团队,整个项目是一个紧密耦合的大型系统,你又不理解系统的每一个工作细节。这时,你就不太敢修改以前的代码,因为不知道随之而来的全部影响。

你不真正理解系统,也就不会感到自己是代码的主人。你会很犹豫要不要重构,过时的代码开始累积,技术债务就这样出现了。长此以往,开发变得越来越不愉快和令人无法满意,最终导致人才流失。后面接手的新人,更难于重构那些遗留下来的代码。

(2)团队原因

随着团队成员的增加,交流成本开始指数式上升。如果整个团队有 n 个程序员,为了了解其他人的工作,你需要跟 n - 1 个人逐一交流(口头或者书面),那么整个团队的交流路径总数就是 n * (n - 1) / 2。这意味着,交流成本的增长速度是人员增长速度的平方,团队人数越多,协同的难度就越大。

大团队保持扁平化管理,也会越来越困难,必须拆分成较小的群体。这时,对等的交流会被自上而下的交流所取代。团队成员会感觉,自己从平等的利益相关者,转变为普通的工作人员,工作动机受到了影响,责任感和主人翁意识都会淡漠。

管理层为了解决问题,会尝试组建新团队和新的管理架构。但是,不管怎么做,大型组织都很难保持所有成员的积极参与。

四、解决方法:代码解耦

大项目的开发效率不高,把这个问题归咎于程序员的技术水平低和管理不善,都是没用的。 根本原因是软件规模的增长,必然使得代码和团队变得笨重。除非很早就认识到问题的根据,采取缓解对策,否则前面描述的情况,迟早都会出现。

解决这个问题,要从代码和团队两方面着手。

代码层面的解决方法是,将软件解耦,拆分成组件或者模块,防止各个部分紧密地耦合在一起。每个组件和模块,都可以独立开发,通过公开的接口被其它部分调用。

这样的话,就大大减轻了开发者的负担,只需要负责自己的代码即可,不需要关心其他部分的实现。每个部分都可以单独重构,不担心影响到其他部分。

五、解决方法:团队解耦

除了代码解耦,团队层面也需要解耦,要把人员分开。

这可以参考互联网的架构。互联网是迄今为止最成功的大型软件解耦实例,它之所以能够扩展,是因为它由一个个独立的节点组成。为了防止节点之间互相依赖,各个节点都遵循以下规则。

·遵守公开的通信协议。·不需要了解其它节点的内部实现,就可以与之通信。·节点之间不直接共享状态,只通过通信交换数据。·每个节点单独开发和部署。

大团队也应该遵循类似的原则,进行解耦。

·每个子团队都可以独立运作,不依赖外部人员。·子团队内部的运作,不需要被外部知道。·子团队之间的协调,应该按照公开的协议和规则,最好能够自动完成,避免私下协商。

六、团队解耦的注意点

团队解耦有一些注意点。

(1)子团队的人数不宜过多,每个子团队最好不要超过5个人。

(2)子团队应该是一个小型的全功能软件开发组织。

很多大团队按照人员角色分组,比如架构组、开发组、DBA 组、测试组、工程组等等,这是错误的。这样完全没有解耦,还是瀑布式流程,各组之间依然互相依赖,工作时必须与别组单独协商。而且,可能会产生利益冲突,比如,开发组希望尽快交付,而测试组希望多一点时间测试。

正确做法是按照软件的业务功能分组,每组负责一个全流程的软件大功能,设计、编码、测试、部署、支持等人员都在同一组。这样才能做到解耦,以及独立的交付和重构。每组内部使用什么工具、如何实现某个功能,都是自己决定,各组之间不需要共享内部细节,也不依赖别组的工作。

(3)大团队应该保障子团队的自主权,按照子团队提供的功能和商业价值,进行资源分配。

(4)软件架构师的角色很重要。

软件架构师的关注点,不应该是团队使用的工具和技术,而是各种服务与整个系统运行状况之间的协议和通信,保证代码和团队可以正确解耦。

(5)代码解耦和团队解耦的关系。

理想情况下,代码解耦与团队解耦保持一致,形成一对一的关系,一个子团队负责一个独立的模块。实际运作中,一个子团队负责几个模块也可以,但是一个模块不能由多个子团队来参与。

(6)通信(模块之间的、子团队之间的)尽量规范化,争取做到过程简单、文档充分,最好有规范的 API,这样无需任何人员交流,就能建立通信。

(完)

References

[1]文章:https://mikehadlow.blogspot.com/2018/11/decoupling-architecture-and-teams.html

(0)

相关推荐

  • 软件项目规模越大,降本增效越明显!飞算全自动软件工程平台有效助力行业提升效能

    在数字化转型的这场时代浪潮中,软件服务企业遇到了最好的时代,但同时也是最坏的时代. 顺势而上,伴随着时代趋势同步成长,这一点很好理解,可是,"坏"从何来呢? 企业的数字化转型通过各 ...

  • 飞算全自动软件工程平台,中国原创技术打出一记超强“全自动”

    你输入流程图,平台助你实现自动开发,自动测试,自动运维. 出品 | 创业最前线 作者 | 花爷 惟改革者进,惟创新者强,惟改革创新者胜. 近日,中国软件产业自主创新的画卷上又增添了浓重的一笔:&quo ...

  • 个人学期总结

    一.学期初,实验一中的任务4,大家拟定了5个准备从课程学习中找到答案的问题,通过一个学期的学习,相信大家已经有了答案,请根据自己的学习实践回答自己当初提的问题,并提出一个新的问题. 问题一:通读该书目 ...

  • 如何正确理解低代码开发?

    白码2020-10-23 18:44:41 随着计算机时代的到来,从1940年代出现的巨型真空管供电的庞然大物开始,开发计算机软件在很大程度上需要具备理解数学,数字逻辑和一种或多种编程语言的能力才能完 ...

  • 软件行业被中国原创技术带进了全自动开发时代

    特别策划2020-11-23 18:33 钱德虎 "-它就像是疯狂的技术达尔文实验室.创造它的,是那些永远把手指按在快进键上的研究者." 谁也没有想到,这个威廉·吉布森在1984年 ...

  • 初中数学反比例函数闯关难题,建议收藏!

    i初中数学 公众号 初中数学反比例函数闯关难题 i初中数学 爱 · 初中数学,是一个由数学名师团发起的公众号,旨在为初中生提供数学同步知识学习,同步习题训练,期中期末知识要点总结,期中期末模拟试卷测评 ...

  • 摆脚跌叉与金鸡独立无缝衔接有技巧,掌握后,拳架转换难题轻松解决

    刘左龙老师:摆脚跌叉后,如何裆走后弧起身到金鸡独立? 刘左龙:陈正雷老师关门弟子,曾获得全国武术锦标赛太极枪术第一名,河南省首届武动中原太极拳比赛中拳枪双科一等奖第一名,多次在太极拳年会中取得拳枪双科 ...

  • 学会多维度拆解问题,你也能成为解决难题的高手

    劳伦斯·D.迈尔斯曾经留下这样一句至理名言:"改变想法是解决问题的重要一步." 生活中大家是否都经历过这样的场景,快期末考试了,发现还有很多知识没有学?领导布置了一个任务,却不知道 ...

  • 蠕墨铸铁件生产,8大技术常见技术难题汇总分析!

    蠕墨铸铁 蠕墨铸铁件除了蠕化处理问题,还有哪些问题? 在蠕墨铸铁件生产中,常见的铸件缺陷除有灰铸铁件的一般缺陷外,还有蠕化不成.蠕化率低.蠕化衰退.白口过大.孕育衰退.石墨漂浮.表面片状石墨层.夹渣等 ...

  • 数据透视表为你搞定80%的工作难题,你却连它的最佳拍档都不知道……

    每天一点小技能 职场打怪不得怂 编按:在日常工作中,数据透视表已经成为每个EXCELER最重要工作伙伴之一,在每个EXCEL的工作战场几乎都留下了它战无不胜的身影.可是,当遇到脏数据的时候,透视表却无 ...

  • 动点最值问题:19大模型 例题详解,彻底解决压轴难题!

    成才路上 初中精品学习资料 104篇原创内容 公众号 1.将军饮马模型 2.利用三角形两边差求最值 3.手拉手全等取最值 4.手拉手相似取最值 5.平移构造平行四边形求最小 6.两点对称勺子型连接两端 ...

  • 广汽丰田,好学生也有难题 | 汽智

    广汽丰田是好学生吗?这应该不难回答. 从2019年起,广汽丰田就走上了快速发展路,旗下产品凯美瑞.雷凌.汉兰达等一直占据着各自细分市场的强势地位,也助力广汽丰田的销量不断攀升. 数据显示,广汽丰田在2 ...

  • 如何利用IMPACT框架帮你解决业务难题?

    根据<2020年全球人才趋势>报告的数据,四分之三的人才专业人士表示,在未来五年中,人员分析将是其公司的首要任务.尽管如此,许多公司尚未做好准备.超过一半(55%)的受访者承认,他们仍然需 ...

  • 破解“金字塔组织”难题之道

    一.认识自己 在攻克金字塔组织难题上,组织实际在两个方向努力: (1)规则派:把"规矩"讲清楚,以理服人,这方面流程再造与KPI管理几乎把能做到的事情做到了极致. [理论逻辑] 1 ...