人们总是对巧合津津乐道,比如著名的林肯与肯尼迪。前几天我才意识到巧合也发生在了自己身上。
首先需要科普一下,西班牙足球甲级联赛(以下简称“西甲”)有三支传统强队:皇马、巴萨、马竞。由于三队和其它球队差距太大,常常被球迷们称为“西超”。这其中,皇马和巴萨的球迷很多,马竞球迷则很少。而我恰好就是个马竞球迷。
随机选地球上的三个人,其中分别有一个皇马、巴萨、马竞球迷的概率是多少呢?做一下超级粗略的估算,假设一个人是皇马或巴萨球迷的概率为 1/20,是马竞球迷的概率是 1/10000,乘起来就是 1/20 * 1/20 * 1/10000 = 1/4000000,即四百万分之一。
而我们组就出现了这个情况:我(马竞)、一个俄罗斯老哥(皇马)、一个印度妹子(巴萨)。除此之外就没有球迷了,正正好好。这还不算完,更绝的是我们三个的桌子恰好挨着,像下图画的这样:
桌子是去年重返办公室时随机分配的。因为是 open office,我们三个的桌子不与其它任何桌相邻,形成了一个孤岛!而直到几个月后我们吃饭聊天才知道彼此都是球迷。这和大街上直接抓三个人分别是三队球迷也没啥区别了吧。这么巧的事竟然那真的能碰到,我已经不知道怎么去计算概率了。
跟女朋友讲了一下,她说因为我已经是马竞球迷,所以遇上此事的概率自然就大一些。这么一想也对。但这的确是我经历过最巧合的事了,因此记录一下。
最近我发现软件工程和国家的演化有诸多相似之处。很多复杂的历史/政治/经济/社会问题,映射到软件工程领域后都变得好懂了。因此来分享一下这个观察世界的角度,相信程序员们会很容易接受。我姑且把它称做“软件社会学”。软件社会学不是一种(严肃的)理论,而是一种可以用来认识世界的工具。
国家和软件项目的相似性
首先也是最重要的一点,我们要意识到国家和软件项目的相似性。这里列举几点,其实还有更多:
- 都有“生命”,且生命周期较长
- 都在不断变化
- 参与其中的人带来变化,变化也反过来影响每个人
解释一下第一条。有人会说我的代码还没上线项目就被毙了,生命周期哪里长了?没错,但同样也有还没诞生就夭折的国家。再者,这里的“较长”并非指绝对时长,而是相对于变化速度来说的——代码变化快,即便它只存在了几个月,也可能有几百几千次提交了。
虽然我们无法严格地把两者对应起来,但不妨先建立一个框架,后面才有的讨论。
国家的兴衰 → 代码的生长和腐化
这点相信凡是在稍具规模的项目上工作过的人都能理解。正如国家在刚建立时一般朝气蓬勃,一个项目在刚开始的时候总能快速迭代。这时候代码量和技术债都很少,改了甚至就能直接 push 上线。人也少,大家对项目和彼此都很熟悉,工作起来效率很高。
随着时间推移,项目的代码量多了起来,团队规模也越来越大(姑且假设项目很成功)。工程师们逐渐发现,原来了如指掌的代码渐渐读不懂了,经常要问同事这里怎么工作,那里为什么这么改;明明就改了一行,却 break 了不知道哪个角落的测试,而你却连这个测试在干嘛都不知道;代码规范也从一开始的统一,变成了八仙过海各显神通;合理抽象更是不存在了,大家都是能跑就行哪管那么多。
假设这时突然来了个年轻有为的程序员,大手一挥说这么干不行,我们要制定规范、改进代码质量,让开发速度重新快起来。结果呢?可能项目里的老人不鸟他,可能老板觉得他不出活,也可能只是单纯的工作量太大他完成不了——总之这种事基本没有成功的案例。国家也类似,到了末期全身都是积弊,想改也没法改了。这是不以个人意志为转移的。
社会观念/政治体制 → 软件项目的架构
这是我觉得最有意思的一个对应。我们都知道合理的系统架构对于后续开发的重要性,因为很多东西一旦确定下来后面就很难改了。国家也是类似,比如大家最熟悉的两个例子:
- 秦始皇:中国第一架构师,提出的“大一统”架构延续了两千多年
- 独立宣言:提出了“人人生而平等”的理念,作为美国的基石延续至今
自这些架构提出之后,虽然后人不断小修小补,提出各种不同的解读,但这些架构在社会中只会越嵌越深,以致无法被撼动。几百年几千年过去,这时候你会发现初始架构的强大之处——不管上层代码再怎么变,国家就按这个架构一直跑下去了。
应用举例:为什么完美的体制不存在?
我们都知道随着环境/需求/人员/预算等状况的变动,一个曾经很合适的架构会变得不合适(比如难以扩展),反之亦然。社会观念和政治体制也是如此,比如曾经高效的奴隶制在历史长河中就被淘汰了,这种例子不要太多。
我们还知道,软件工程里是没有银弹的,同样也没有完美的体制。总有人说美国三权分立很完美,结果 Trump 安排的三个大法官完美演示了什么叫卡系统 bug,那倒车开得叫一个快。事实就是,在一个极端复杂的系统里是不存在“完美”的,只有永恒的 trade-off。
应用举例:为什么错误的政策会造成深刻且持久的伤害?
由于人类很可悲地生活在线性的时间里,发生的事情就是发生了。错误的设计会造成深刻且持久的伤害,因为新代码会遵循这个设计编写,从而变成未来重构的负担——错误持续得越久,负担也就越大。有人形象地把改代码比作一边开车一边换车轮。事实的确如此,理性的公司都不可能抛掉老代码来个完全重写。George Hotz 在推特尝试过,但失败了,因为这事本来就不可能成。类似的,实行一个政策很容易,改掉却很难,于是错误(技术债)就这么越积越多,直到无法维持下去的那一天。
应用举例:为什么小国容易治理?
独立开发者们写代码发布新版本总是很快,因为依赖少。不论是加新功能、修bug、重构,甚至是更新架构,都相对容易。随着团队扩大,这些原本容易的事也变得困难了。
国家类似,越小的国家越容易治理,根本原因在于复杂度是和规模正相关的,甚至如果考虑内部依赖,这种复杂度的增长是指数级的。一套对小国适用的政策很可能对大国不适用——就好像你很难在 Google 这种体量的公司用创业公司的风格去工作。
应用举例:为什么美国如此强大?
美国的例子实在是太有趣了,因为它完全就是从英国这个 repo fork 出去,然后又重写的一个版本。因为是重写,所以可以抛掉君主制这个积累了几千年的技术债;因为是重写,所以 co-founder 们重新审视了一下人类历史,找到了当时最新最合理的架构;还是因为重写,奴隶制这种错误的设计没有在代码中扎根太深,因此在后续大版本中被移除,但即便这样美国也付出了沉重代价。美国历史短,但这正是它最大的优势。它就 Google 和Meta 这些曾经的创业公司一样,通过发现一块新的大陆,然后称霸全球。
然而即便是美国,技术债在二百五十年中还是不可避免地越积越多:枪支、毒品、贫富差距、社会两极化等等。人类若想找到新的灯塔,也必须通过建立新的国家——比如火星殖民、加密货币(?),但这就是另一个故事了。
总结
一旦你意识到这种对应,便会发现两者的相似性远不止文中写的这些。这种重新认识世界的过程将是个有趣的体验。
我不认为软件社会学是一种理论,因为它基于类比而非严肃的论证。我更愿意把它当做趁手的工具。工具只要能用就好,我们不用特别关心原理,也无需严格证明它的正确性。或许未来有人能深化一下把它做成一种理论,谁知道呢。
最近在 OpenAsk 上回答了两个问题,让我又开始想念知乎了。自从 2020 年离开知乎,我便把主要的输出放在了 Twitter、Blog 和播客。我以为自己的表达欲被完全满足了,然而时隔多年重拾“问答”,我才发现并没有。我开始想念知乎,想念问答这种独一无二的形式,怀念那种回答一个问题之后看着自己写的答案的充实感——这种充实感我已经好多年没体会过了。
问答这种形式好在哪呢?我曾经写过两篇文章:
“问答”(半主动输出)和“推文/博客/播客”(主动输出)最大的区别在于,前者给你规定了一个主题,而后者你得自己决定。这种创作的绝对自由反而带来了一种不自由,因为你看似可以但实际上并不能随意选定主题。比如,你要考虑整个账号的调性、读者/听众的口味、避免挑起争议等等。只有小透明才能想说什么就说什么,因为没有人关注和在意。问答就不一样了。因为问题就在那,你反而可以大胆涉足并且不用担心(或者更少担心)这会损害你的某种 integrity。体会一下其中的差别:当一个知乎数学领域答主在情感问题下作答,往往会被善意调侃并视为一种高强度脑力工作之余的休闲活动;反之,如果自己开一个公众号去写男女关系,则会被认为不务正业,平时到底有没有把心思放在研究上。这种差别让看似不自由的“回答”反而有了更大的创作空间,并且让人有机会在更广泛的领域输出自己的见解。实际上极少有人能只专注一个领域而对其它事情完全没有看法,这在我看来几乎是不可能的。
说回 OpenAsk,语音作答无疑是最大亮点。不是所有人都习惯发语音,但做了播客之后我发现,声音确实能带来比文字更丰富的信息(当然文字也有独特优势,这里就不展开了)。而且相比写回答在那斟酌用词,录个两分钟的音频基本不花时间。当然我觉得也有可改进之处:比如 2min 时长太短、不支持文字(自己的付费回答我也想提供一个免费概览)、只能回答自己的问题等等。然而即便这些都支持了,我也不得不承认自己依然更喜欢知乎那种大广场的形式,且怀念知乎曾经的氛围。这些东西在中文网络上都不会再有了。