有一个问题一直困扰着我,假如数字化和虚拟化是这个世界不可逆的大趋势,那么软件开发势必是建造未来世界的基础能力。如果软件工程的可靠性一直都跟现在一样不可靠,这个未来的世界将如何构建?正如你难以想象现在的建筑工程不可靠,工厂不可靠。在做 CODING 的过程中,我们一直在试图拿传统行业的发展路径来对比软件开发行业,以期望能给我们一些启发,这个行业将走向何方。
我们经常把软件工程跟建筑工程相比较。这两者确实有很多相似之处,例如都有设计阶段和施工阶段,都需要大规模协作。建筑行业有一个迷人之处在于无论多么牛逼的设计,最终都是同一帮人在施工。从普通写字楼到上海中心等地标性建筑几乎无一例外你会看到“中建 x 局”。而且建筑工程基本都能还原最初的设计。相比之下,软件工程就太依赖施工的人了,过于依赖一线的手艺,不同的团队做出来的东西可谓是天壤之别。

建筑行业有一个细分叫做装修。你对建造高楼可能不太了解,但是搞装修我相信大多数人都经历过,大概率是痛苦的经历。装修涉及到各种类型的工作,例如强电,弱电,木工等等,然后有个包工头,相当于是项目经理。一个好一点的装修队往往是全工种的,但这个装修队承接你家的装修并不是整个团队都在你家,而是到了某个人干活的时候他才出现。其他时间他大概率在其他工地干活。包工头干的就是协调各个工种在各个工地上的排期。装修队能这么干的前提是每个工种的工作基本不依赖上下文,来到一个陌生的工地,看看图纸,包工头交代几句就能干活。然而软件开发就不能这么干。虽然软件开发团队也是各个工种齐全,前端,后端,产品经理等等,但是你几乎不可能让一个前端同学穿梭于不同的项目之中,效率会极低,因为他的工作依赖上下文。所以,我们看到绝大部分软件开发团队都是专注做一个项目,做完一个再做下一个,而不是并行。所以无论管理上的组织架构是怎样的,在实际执行过程中,装修队是横向团队,而软件开发团队是纵向团队。
那么,来了一个关键问题:有没有可能软件开发逐步的标准化,使得每个开发者的工作可以不依赖上下文,让团队横向化?这是一个大命题,感觉可以探讨三天三夜。我曾经写过一篇文章《平台神话的破灭与 5000 万的教训》,讲述曾经因为迷信软件工程可以标准化而付出的代价。可以说,软件开发到目前为止依然有很大一部分“艺术”的成分。所以,我对这个问题的回答是,看不到标准化的路径。(依然有很多人在这个方向上尝试,有可能他们是对的,但是此时此刻我只能祝福他们。)
如果软件工程跟建筑工程只是形似,那有没有更神似的行业可以参考?我们看到了制造业,工厂。
说起工厂,很容易联想到“流水线”。这一点跟软件开发行业最近大火的 DevOps 不谋而合,大家习惯性的把 CI/CD 称为流水线。最近行业的发展,逐步的形成一个共识,DevOps 的流水线不仅仅是 CI/CD,而是从需求到代码,到最后部署上线为止的全流程。我们把这个全流程分为四个阶段:需求,实现,测试,发布。这四个阶段对应制造业就是:设计,生产,质检,发货。两者在方法论上几乎是完全一致的。

工厂的组织模式是车间,产线,一个车间可能有一条或者多条产线,而产线是生产的最小单位,是个纵向团队。每条产线都有明确的目的,并且不能随意变换,例如生产发动机,或者生产底盘。每条产线拥有实现其目的的全部资源,可以闭环。一个工厂可能有很多产线,软件开发也是类似,无论多大的公司,大如腾讯,每个软件开发团队的人数也只是以十人左右为单位。车间主任就是团队 leader。我们是不是可以把产线/开发团队定义为:以某种固定方式进行协同工作以达成特定目的的组织。这里有两个关键词很重要,“固定方式”,“特定目的”。“固定方式”是指,每个团队有自己的管理方式,质量标准。虽然很多公司会对这些有所规定,但实际执行大多还是依赖团队 leader。这也是为啥公司大了,从上往下看会感觉很乱。“特定目的”是指团队不是万能的,你不能让一个做 App 的团队去搞操作系统。
工厂有零部件车间,也有成品车间,对应的有半成品仓库,成品仓库等等。这些应对到软件开发,就是制品库。制品库这个概念随着 JFrog 这个公司的做大而逐步被行业所意识到,原来软件开发也是需要“仓库”的,足见我们这个行业有多么落后。讽刺的是,现在工厂都在讲数字化,MES(Manufacturing Execution System) 系统可以记录生产过程的每个细节,进行数据收集和分析,而软件开发的过程对于很多团队来说依然是黑盒,除了最后的产品是数字化的,可以说软件的生产过程在数字化方面是很落后的。我们有很多软件开发工具,例如项目管理工具,代码管理工具等等都是解决的团队内的单点问题,却不能有机的透视整个软件的开发过程,更不能在上层协调各个产线联合生产一个大产品。
越来越多的人意识到软件开发的黑盒问题,这个问题不解决无法保证大规模软件工程的效率和可靠性。有人尝试通过咨询,教育来解决这个问题,然而我们认为工具才是最终的答案。

但再多的工具也无法解决软件开发中的“艺术”成分。目前我看到的解法是把它封装在产线里面,从而在更高的层面实现标准化。某些产线拥有个别天赋异禀的匠人,我想也是合理的。
深圳南山科技园地铁站,是我见过的唯一一个在上下班高峰期因为人员过于密集以至于超出移动基站负载导致没有网络信号的地方。每天看着科技园熙熙攘攘的人群,我常常自嘲,我们不是新时代的“民工”,而是新时代的“厂妹”。