Fork me on GitHub

laike9m's blog

Yuri Is Justice

Google

Legacy Code, Legacy Country

最近我发现软件工程和国家的演化有诸多相似之处。很多复杂的历史/政治/经济/社会问题,映射到软件工程领域后都变得好懂了。因此来分享一下这个观察世界的角度,相信程序员们会很容易接受。我姑且把它称做“软件社会学”。软件社会学不是一种(严肃的)理论,而是一种可以用来认识世界的工具。

国家和软件项目的相似性

首先也是最重要的一点,我们要意识到国家和软件项目的相似性。这里列举几点,其实还有更多:

  • 都有“生命”,且生命周期较长
  • 都在不断变化
  • 参与其中的人带来变化,变化也反过来影响每个人

解释一下第一条。有人会说我的代码还没上线项目就被毙了,生命周期哪里长了?没错,但同样也有还没诞生就夭折的国家。再者,这里的“较长”并非指绝对时长,而是相对于变化速度来说的——代码变化快,即便它只存在了几个月,也可能有几百几千次提交了。

虽然我们无法严格地把两者对应起来,但不妨先建立一个框架,后面才有的讨论。

国家的兴衰 → 代码的生长和腐化

这点相信凡是在稍具规模的项目上工作过的人都能理解。正如国家在刚建立时一般朝气蓬勃,一个项目在刚开始的时候总能快速迭代。这时候代码量和技术债都很少,改了甚至就能直接 push 上线。人也少,大家对项目和彼此都很熟悉,工作起来效率很高。

随着时间推移,项目的代码量多了起来,团队规模也越来越大(姑且假设项目很成功)。工程师们逐渐发现,原来了如指掌的代码渐渐读不懂了,经常要问同事这里怎么工作,那里为什么这么改;明明就改了一行,却 break 了不知道哪个角落的测试,而你却连这个测试在干嘛都不知道;代码规范也从一开始的统一,变成了八仙过海各显神通;合理抽象更是不存在了,大家都是能跑就行哪管那么多。

假设这时突然来了个年轻有为的程序员,大手一挥说这么干不行,我们要制定规范、改进代码质量,让开发速度重新快起来。结果呢?可能项目里的老人不鸟他,可能老板觉得他不出活,也可能只是单纯的工作量太大他完成不了——总之这种事基本没有成功的案例。国家也类似,到了末期全身都是积弊,想改也没法改了。这是不以个人意志为转移的。

社会观念/政治体制 → 软件项目的架构

这是我觉得最有意思的一个对应。我们都知道合理的系统架构对于后续开发的重要性,因为很多东西一旦确定下来后面就很难改了。国家也是类似,比如大家最熟悉的两个例子:

  • 秦始皇:中国第一架构师,提出的“大一统”架构延续了两千多年
  • 独立宣言:提出了“人人生而平等”的理念,作为美国的基石延续至今

自这些架构提出之后,虽然后人不断小修小补,提出各种不同的解读,但这些架构在社会中只会越嵌越深,以致无法被撼动。几百年几千年过去,这时候你会发现初始架构的强大之处——不管上层代码再怎么变,国家就按这个架构一直跑下去了。

应用举例:为什么完美的体制不存在?

我们都知道随着环境/需求/人员/预算等状况的变动,一个曾经很合适的架构会变得不合适(比如难以扩展),反之亦然。社会观念和政治体制也是如此,比如曾经高效的奴隶制在历史长河中就被淘汰了,这种例子不要太多。

我们还知道,软件工程里是没有银弹的,同样也没有完美的体制。总有人说美国三权分立很完美,结果 Trump 安排的三个大法官完美演示了什么叫卡系统 bug,那倒车开得叫一个快。事实就是,在一个极端复杂的系统里是不存在“完美”的,只有永恒的 trade-off。

应用举例:为什么错误的政策会造成深刻且持久的伤害?

由于人类很可悲地生活在线性的时间里,发生的事情就是发生了。错误的设计会造成深刻且持久的伤害,因为新代码会遵循这个设计编写,从而变成未来重构的负担——错误持续得越久,负担也就越大。有人形象地把改代码比作一边开车一边换车轮。事实的确如此,理性的公司都不可能抛掉老代码来个完全重写。George Hotz 在推特尝试过,但失败了,因为这事本来就不可能成。类似的,实行一个政策很容易,改掉却很难,于是错误(技术债)就这么越积越多,直到无法维持下去的那一天。

应用举例:为什么小国容易治理?

独立开发者们写代码发布新版本总是很快,因为依赖少。不论是加新功能、修bug、重构,甚至是更新架构,都相对容易。随着团队扩大,这些原本容易的事也变得困难了。

国家类似,越小的国家越容易治理,根本原因在于复杂度是和规模正相关的,甚至如果考虑内部依赖,这种复杂度的增长是指数级的。一套对小国适用的政策很可能对大国不适用——就好像你很难在 Google 这种体量的公司用创业公司的风格去工作。

应用举例:为什么美国如此强大?

美国的例子实在是太有趣了,因为它完全就是从英国这个 repo fork 出去,然后又重写的一个版本。因为是重写,所以可以抛掉君主制这个积累了几千年的技术债;因为是重写,所以 co-founder 们重新审视了一下人类历史,找到了当时最新最合理的架构;还是因为重写,奴隶制这种错误的设计没有在代码中扎根太深,因此在后续大版本中被移除,但即便这样美国也付出了沉重代价。美国历史短,但这正是它最大的优势。它就 Google 和Meta 这些曾经的创业公司一样,通过发现一块新的大陆,然后称霸全球。

然而即便是美国,技术债在二百五十年中还是不可避免地越积越多:枪支、毒品、贫富差距、社会两极化等等。人类若想找到新的灯塔,也必须通过建立新的国家——比如火星殖民、加密货币(?),但这就是另一个故事了。

总结

一旦你意识到这种对应,便会发现两者的相似性远不止文中写的这些。这种重新认识世界的过程将是个有趣的体验。

我不认为软件社会学是一种理论,因为它基于类比而非严肃的论证。我更愿意把它当做趁手的工具。工具只要能用就好,我们不用特别关心原理,也无需严格证明它的正确性。或许未来有人能深化一下把它做成一种理论,谁知道呢。

Google

我又开始想念知乎了

最近在 OpenAsk 上回答了两个问题,让我又开始想念知乎了。自从 2020 年离开知乎,我便把主要的输出放在了 Twitter、Blog 和播客。我以为自己的表达欲被完全满足了,然而时隔多年重拾“问答”,我才发现并没有。我开始想念知乎,想念问答这种独一无二的形式,怀念那种回答一个问题之后看着自己写的答案的充实感——这种充实感我已经好多年没体会过了。

问答这种形式好在哪呢?我曾经写过两篇文章:

“问答”(半主动输出)和“推文/博客/播客”(主动输出)最大的区别在于,前者给你规定了一个主题,而后者你得自己决定。这种创作的绝对自由反而带来了一种不自由,因为你看似可以但实际上并不能随意选定主题。比如,你要考虑整个账号的调性、读者/听众的口味、避免挑起争议等等。只有小透明才能想说什么就说什么,因为没有人关注和在意。问答就不一样了。因为问题就在那,你反而可以大胆涉足并且不用担心(或者更少担心)这会损害你的某种 integrity。体会一下其中的差别:当一个知乎数学领域答主在情感问题下作答,往往会被善意调侃并视为一种高强度脑力工作之余的休闲活动;反之,如果自己开一个公众号去写男女关系,则会被认为不务正业,平时到底有没有把心思放在研究上。这种差别让看似不自由的“回答”反而有了更大的创作空间,并且让人有机会在更广泛的领域输出自己的见解。实际上极少有人能只专注一个领域而对其它事情完全没有看法,这在我看来几乎是不可能的。

说回 OpenAsk,语音作答无疑是最大亮点。不是所有人都习惯发语音,但做了播客之后我发现,声音确实能带来比文字更丰富的信息(当然文字也有独特优势,这里就不展开了)。而且相比写回答在那斟酌用词,录个两分钟的音频基本不花时间。当然我觉得也有可改进之处:比如 2min 时长太短、不支持文字(自己的付费回答我也想提供一个免费概览)、只能回答自己的问题等等。然而即便这些都支持了,我也不得不承认自己依然更喜欢知乎那种大广场的形式,且怀念知乎曾经的氛围。这些东西在中文网络上都不会再有了。

Google

湾区与独立开发

湾区(Bay Area)是否适合独立开发?表面看,这里技术氛围浓厚,激荡着无数新鲜的 idea,似乎很适合做点什么。然而思考下来,我觉得湾区反而是最不适合独立开发的地方。

为什么这么说?众所周知,湾区是地球上生活成本最昂贵的地区之一,而独立开发者需要承担现金流不稳定的风险——光是这点就把湾区踢出去了。而这仅仅只是表面,它反映的是独立开发和湾区码工两种生活方式的不兼容。

聊独立开发总绕不开技术和产品,然而在此之前,它首先是一种生活方式,我愿称之为“半躺半卷”。这很好理解:独立开发者们不需要坐班,想几点起就几点起,甚至一段时间完全不工作也没问题,是所谓“躺”;另一方面,独立开发者没有 paycheck,必须自负盈亏,这又逼着他们不得不卷起来以保证自己不饿肚子。

那湾区呢?根据我片面的观察,是“要么卷到死,要么躺到死”。卷的人是真卷,可以一周工作 6-7 天,每天十几个小时。躺的人则可以很躺,比如在大厂到了 terminal level 升职无望,生活就变成了上班打卡划划水,下班吃吃喝喝找乐子——小红书上比比皆是。

“半躺半卷”、“卷”和“躺”是截然不同的生活方式,没有高下之分。但如果我们继续挖掘,会发现核心矛盾还是那两个字:独立。湾区的钱太多了。大家都在为钱而活,自愿或不自愿地成为金钱的奴隶——在大厂的卷升职,在创业公司的赌一夜暴富。湾区几乎没有人是独立的。这一方面是源于失去丰厚的收入,打工人无法在这里生存,但另一方面,这种依附金钱的生活方式在不知不觉间侵蚀了人们的内心,让他们不再渴望凭兴趣去做点什么(不要和我说创业是兴趣驱动)。举例来说,我认识的湾区程序员里(不包括网友),只有一个会去折腾个人项目,没见过搞开源的。或许是我认识的人太少,也或许这是业界常态,但湾区程序员好像确实就只知道给公司写代码。有的人一毕业就进大厂,从来没做过也不知道什么叫个人项目——这就像破壳后第一眼看见人的小鸡会误把人当妈妈。有的人则像身怀绝技的侠客,被大厂招安后从此收剑入鞘,GitHub 江湖上只留下他们的传说。“独立”?湾区码工哈哈大笑。独立能当饭吃吗,能买大 house 吗?

好了,那如果你身在湾区,却不幸怀着独立开发的梦想,有什么是你能做的?这也是我在思考的事情。虽然还没有结论,但我觉得至少有两点:

  • 认识到这种矛盾和困境。因此我写了这篇文章。
  • 找到相关社群或者 role model,看看他们是怎么做的。
    环境是重要的,只有身处对应的环境,才有改变的可能。好在湾区程序员的基数足够大,我相信能找到这样的人,这是我接下来会尝试去做的事。

top