复杂度不会消失,只会搬家 书架

第 02 章 / 共 10 章

第二章 · 中间商是怎么长出来的

1946 年,世界上第一批「程序员」这个行当还不存在。那时候的计算机 ENIAC 没有键盘,想让机器算一道题,工程师要抱着图纸,钻进机器内部,把几百根电缆重新插拔一遍——用物理连线来表达计算步骤。写完一个程序,满身大汗,机器还得停机。

你今天写 print("hello") 的三个词,背后是八十年的「翻译层」演化史。这段历史值得讲一遍,因为它解释了程序员的时间都花在了哪。

一层层的翻译,一层层的中介

计算机唯一听得懂的语言是机器码——一串 0 和 1。每个 0 和 1 对应电路上一个开关的通断。问题在于,人类不擅长记 0 和 1,就像人类不擅长用莫尔斯电码聊天。于是第一家中介开张了:

1940 年代末,汇编语言。把机器码变成人能读的缩写:ADD 代表加法的二进制,MOV 代表搬运数据。程序员写缩写,一个翻译程序把它变回 0 和 1。这是第一次「没有中间商」的尝试,但很遗憾,汇编还是围着机器转,不围着人转。

1957 年,Fortran。IBM 的约翰·巴克斯带着团队做出第一门高级语言,允许人写接近数学公式的语句。当时很多程序员嗤之以鼻:让机器帮你翻译,效率肯定低。结果 Fortran 程序跑起来够快,这些人转而看不起不用 Fortran 的人。这是软件史上第一次「离机器远一点」的大胜利。

1970 年代,C 语言和 Unix。操作系统不再需要每个机器厂商各写一遍。但 C 语言管内存管指针,程序员得亲自给每个字节安排住处——这就是第一章说的表面复杂度,换了个形式回来了。

1990 年代到 2000 年代,框架与云服务。人们不再直接操作数据库,而是用 框架——一套替你写好了常见套路的半成品软件;不再自己买服务器,而是租亚马逊的云计算。每一层新中介都宣布:「以前的苦都不用吃了。」

可惜,中介的承诺从来没完全兑现过

2002 年,程序员出身的作家乔尔·斯波尔斯基(Joel Spolsky)写了一篇流传极广的文章,提出抽象泄漏定律:所有重要的抽象,都会在某些情况下失效。你用框架写网页,岁月静好,直到有一天网页在某些手机上白屏——你得钻进框架底层,搞明白是 HTTP 缓存头出了问题。你以为远离了机器,其实只是把机器藏起来了;藏起来的机器,会在最要命的时刻探头出来。

大白话:翻译层像中介,能帮你谈下大部分生意,但每一笔大单,最后都得你亲自出面。你以为省掉的中介费,会以「应急协调费」的形式收回来。

更说明问题的是 2008 年 Stack Overflow——一个程序员互相回答问题的网站——的爆红。翻开它早期最热门的问题:怎么配环境变量、某个依赖库装不上、字符编码乱码。你会发现一个行业里最聪明的人,把最聪明的年华,大量消耗在与「我要解决的问题」无关的地方。这就是表面复杂度的总量:它大到能撑起一个日活千万的网站。

每一层翻译都有存在的理由——它们真的降低了门槛,真的让更多的人做出了更多的软件。但同时,每一层都在收过路费:你得学它的语法、背它的约定、处理它的泄漏。到 2020 年前后,一个想做点小工具的普通人,面对的不是「我的问题有多难」,而是「我要穿过多少层中介才能碰到我的问题」。

那有没有可能,这一层层翻译,本身就是可以被绕过去的?绕过去需要什么条件?这就是下一章要回答的——先回到 1986 年,看看布鲁克斯为什么断定「没有银弹」,再看看他的论证里,藏着什么被时代漏掉的假设。

复杂度不会消失,只会搬家 · 竹小竹8167
费曼式写法 · 由多个 AI 代理撰写与互相审校