编者按:
在2019年5月17号,莫斯科的 DevGAMM上,Jonathan Blow发表了一个题为『阻止文明倒塌』的长达一小时的奇怪演讲。我把这个演讲总结为下面这篇文字记录。
善意提醒:不懂编程不代表你我不能阅读一篇和计算机有关的演讲,并有所思考,只能跟风刷刷梗;另外,对于Blow的观点,作为成年人我们应该可以有自己的反思。
我个人对这个演讲的逻辑非常赞叹,但也认为他明显偏重了软件系统本身的问题,而对另一个甚至更根本的问题选择了视而不见。
那就是当代效率提升过程中的真正瓶颈:人的协作。
如果仔细观察软件,以及其他可以类比的当代文明复杂系统,大规模的人际协作中无法改进的沟通效率、责任分配、人性的不可管理,都让系统不可避免地显现为笨拙甚至荒谬的面貌。
而抽象层级的提高,也绝不仅仅是软件的趋势而已,正如它所带来的问题也绝不仅是机器的问题。
如果你不知道Blow是谁:他是一个独立游戏设计师,《时空幻境》和《见证者》的作者,感兴趣可以听我对他的介绍评述电台关于游戏的信仰 。
以下是正文。
阻止文明倒塌
乔纳森布洛,2019年5月在莫斯科
演讲从1957年苏联发射 Sputnik 上天引发的美苏太空争霸谈起,回顾了首次卫星发射、首次宇航员上天,以及首次登月的过程。在1962年9月肯尼迪总统在一次国会演讲中宣称我们要在这个十年结束之前实现登月。结果1969年阿波罗11号实现了这个目标。
Blow 的要点在于:人类(这里指美国)从一无所知,到实现登月只用了12年。然而从那时之后,人类的载人航天事业很大程度上停滞,甚至出现了倒退。这是不是很令人遗憾?
Blow 播放了一段后来解密的阿波罗11号现场纪录片片段,那种震撼的感觉难以名状,只有看的人能了解其中直观的『退步感』。(编者感慨:我们用真实的科幻交换了手中的 iPhone。)
然后 Blow 播放了一段 Elon Musk 的 TED 访谈,其中 Elon 指出:我们一定要意识到:不同于可持续能源的未来是必然的,Spacefare civilization(多星球文明)绝对不是必然会发生的(它需要巨大的努力)。
1969年人类可以登月,然后人类只能用航天飞机把人送到近地轨道。然后航天飞机退役,近地轨道也没法送上去了——连起来看,趋势是向着0倒退。这和人们对于“科技当然显然必然自动地向前进步”这样的信念相违背。
Elon 认为,正好相反,科技在不付出巨大努力的情况下,是逐渐倒退的。
从古埃及的后人忘记金字塔,到古罗马人忘记如何建造罗马水道。
Elon 的火箭创业公司则非常成功,他们的目标是2024年重新实现载人登月。Blow 接下来给出了几个科技倒退的实例:
第一个是 Lycurgus Cup,公元300年。从正面看它的反光是青色的,透光来看,则呈现为红色。原因是其银和金的颗粒体积非常小,小到50-70纳米,如此之小以至于物理放大镜看不见它们,想观测需要用电子显微镜。然后西罗马帝国覆灭,后人忘记了这个工艺。
很多人认为这就是扯淡,当时的人并不知道其任何原理只是误打误撞做出了这些东西。Blow 则认为有如此观点的人显然没有用心亲手打磨过任何东西,否则他们一定会明白,达到这样水平的结果,是不可能通过偶然和运气的。
对于工艺的掌握必然在不断迭代过程中达到了非常高的水平,它才有任何可能出现。比如这个图案中人的身体的肉红色,肯定是费劲千辛万苦不断改进实现出来的,这就是一种材料科学。
然后 Blow 提到了拜占庭的喷火筒。拜占庭的战船上安装了这种金属喷管,喷出某种成分的“水扑不灭”的有机物燃烧导致的火焰,焚毁敌人船只。这是拜占庭帝国的国家机密,它在帝国灭亡之前就被遗忘,原因不明,具体实现方式已经不可考证。
第三个例子是机械日历,一种安提凯希拉装置(Antikythera Mechanism),1901年于希腊安提凯特拉岛上的一艘古船残骸中被发现的随船沉没2100余年的钟形装置。
这个机械日历的实际模型被复原为一段动画(可自行搜索视频,语言无法描述),它的精密程度是高档机械手表的范畴。它的存在意味着背后多么复杂的一整套制造能力呢?
这样的例子还有很多,就不说了,Blow 这时候放了地动仪的图片。要点是:在人类历史上,杰出的科技被完全遗忘。这件事经常发生,当代也一样。
然后 Blow 给出的例子是 Bob Colwell,早期英特尔的首席芯片架构师,在计算机发展初期的时候接受采访的片段内容,背景是他们发现合作的零部件制造商TI(德州仪器公司)送来的产品不能稳定使用,质量残次。
Bob去找TI质询,本来以为对方会说“那是你们不知道怎么使用,我们的产品是好的”,实际对方的答复是:“是,我们知道,我看看你的清单。哦,我们还有更多你们不知道的(不好使的产品)。”
实际情况是,TI 没有比任何其他竞争对手更差,摩托罗拉、Fairchild 也一样。这些硅制品让英特尔的芯片研发停滞不前,为何会如此?TI的人回答道:
“第一代 TTL(逻辑门电路)是那帮胡子花白的老头子做的,他们知道其中的道理;现在的工程师都是毛头小子,学校毕业过来搞生产,他们不知道内部组装的改变,会导致感应峰(inductive spikes)。”
这里的spike就是指每一个点的电压变化时,都会产生磁场,而磁场变化的相互干扰,没有被设计者纳入考虑,因为他们不理解。这就是科技退步的原因。代际之间的交流和传承需要巨大的努力,这过程中有损失。如果代际的传承失败,文明就灭亡。
接下来 Blow 给出了历史中文明灭亡的实例,来自于 Eric Clive 的一个演讲,题目是《公元前1700年的文明灭亡》,具体来说是青铜器时代晚期,爱琴海,古埃及,塞浦路斯,迈锡尼,赫梯,古巴比伦等。
这一圈围绕在美索不达米亚平原和地中海一带的文明曾经形成了一个非常复杂的贸易网络。在下图中,每个节点是一个文明,不是每一个都能和每一个贸易,但通过中间节点,所有贸易都达到非常优化的效率。
这一点非常重要,因为青铜作为国防和生产的重要资料,非常难以制造。你需要用锡和铜一起生产。铜产地比较少,比如塞浦路斯岛。而锡则更难找,而且离铜产地非常远,比如阿富汗。而这些文明需要把它们运到一起以生产青铜。
而这些文明的灭亡至今没有确切原因,有人说是自然环境恶化导致互相攻击,贸易变成战争。它们灭亡到什么程度呢,不仅是国家不存在了,城市也消失了,语言和文化也消失了。刻在石碑上的文字大多数至今我们不能翻译。
Blow 的要点是:软件正在倒退,而人类空前依赖软件。尽管,这和我们置身其中的人的观感是相反的。波音飞机掉下来的主要原因就是软件问题(这点编者不能同意)。文明衰退的速度如果很慢,我们能意识到这个衰退么?
这里 Blow 给出了他对于“软件明显在蓬勃发展”之直观感受的解释:软件正在享受硬件能力提升的红利,它只是“看上去”蓬勃发展而已。
机器学习是最明显的例子。一方面,它在二十年前不能存在主要是因为硬件性能无法支持而已。另一方面,它只是人类依赖着的软件世界中极小极小的部分。属于软件的进步已经很长时间停滞。
比如,我们使用软件给自己AI换脸成明星的样子,或者配上猪耳朵,这个有趣的部分,只占这个app极小极小的部分,而这个部分非常简单,另外的极大部分却极度复杂,包括把你的脸加载到屏幕上,以及处理你的点击等等。出问题的是这些部分,人工智能的局部成就没法和软件世界整体的退化的巨大惯性抗衡。
最明显的迹象,就是“我们已经不指望软件能长期稳定工作了。”我们的标准一降再降,还能降到多低?降低到哪里会出大问题?
接下来 Blow 疯狂吐槽了十分钟,关于电脑上一切软件都经常 bug,以至于用户对于一切软件“重启试试”成为不假思索的操作。包括 Emacs 的问题、Visual Studio 不能处理最最简单的指令,只能连续报错,微软 Word 的字符换行 bug 二十年后仍然没有消灭,像幽灵一样此起彼伏;
于是他为了缓解自己的愤怒想打游戏,打开 Epic Store 和 Steam 又连续遇到 bug;于是他关掉游戏客户端去看 CS 直播,发现 CS 直播电竞比赛里全程有一个多余的名为“未定义”的 bug 玩家出现在地图里,直到比赛结束;
然后他进入俄罗斯签证申请页面,被死活不能通过,且不能刷新的手机号验证脚本逼得只能刷新整个页面重新填写申请;然后他来到莫斯科住进酒店,他的房间的座机有5%的概率会空调开关触发响铃……等等,编者这里就不赘述了。
这让90年代电脑销售的一个常见推销语“五个9”(指,本设备可以99.999%时间稳定运行)成为今日的讽刺。Blow的电脑连两个9都没有。
对于这个问题,软件行业的普遍答案是:市场不会为更好的稳定性买单。Blow则认为:对于一个从未提供出足够稳健的产品的行业,为什么会有人会相信它『能』?
接下来,Blow 从正面描述了软件的结构:抽象层次的序列。机器语言、汇编语言、Fortran/C/C++、C#/Haskell/Javascript……在这个序列里,绝大多数工程师在最高抽象层次进行工作,因为这是“聪明、省力、高效率的”。
在这个抽象从低到高的序列里的某些位置,问题就出在这里。Blow 认为,全行业的高抽象层次工作,多数人的“高效率”的另一面,是失去(或者从未拥有过)能力。
考虑 Facebook 作为一个软件的功能增加,和它要多雇佣的成千上万的工程师,二者相除得到的平均每人的价值创造是趋近于零的。这和“抽象层次越高效率越高”明显矛盾。
Blow 给出的对比,是 UNIX 发明者 Ken Thompson 的一个演讲片段。
他回忆道他趁老婆孩子出去度假,用了三个礼拜写了三个东西(编辑器、编译器、软硬件交互层或者叫操作系统),做出了 UNIX。现场爆发笑声和掌声——当今程序员可没有这种效率。而 Blow 认为这是个悲剧,它并不好笑。今天软件显没有在进步,它的鲁棒性和生产力都在衰退。
Blow 从图形计算的角度给出了一些“最最基本的,你不能直接做的事情”,其中一个编者能听懂的例子是,把一个程序拷贝到另一个设备(安装是个复杂过程)——而这并不是因为 CPU,CPU 不能背锅因为今天各类设备的 CPU 一致性已经相当好。
安装程序不是为了对接 CPU,而是为了解决操作系统层面不可思议之多的兼容问题,其绝大部分是我们不想打交道的。操作系统本来是给 CPU 赋予能力,但同时你也可以说它防止着 CPU 具备很多能力。
在编程过程中,你绝大多数时间在处理那些,你很难理解、也不可能预料到的各种和你的设计思路没有关系的问题。
更可怕的是,你不能直接编写一个独立程序进行编译和 linking。微软为了能让人这么做,专门设计了一个 vswhere 的软件。
现在有一种叫做LSP的东西,开源的语言服务器协定。
在Blow看来它基本上是一种更复杂、更费劲的编写和调用库的方式,而其满足的需求都是非常基本的操作,比如在你的编辑器里临时起意,查看一个变量的特征或者类型,LSP给你提供一个工具条,或者鼠标点击直接查询的功能。
为了实现这个,你需要一个标准化服务跑在服务器上,好让你的编辑器和服务器用socket交互——为了使用方便,你把本地的、单一的编程工作置于分布式的系统之中。
这样的做法推而广之,你依赖了越来越多的库,库又依赖了越来越多的库,关键是这些库/服务本身可能是在变化的、并且没有被中心化地存储和管理,这样一来我们就陷入了无穷无尽的debug的、重启服务的、互相同步的……我们自身所不能掌握的问题海洋之中。
现在大家竟然在积极主动建设着这样一个东西,程序员们忙着把简单事情复杂化的同时……电脑游戏却变得连最基本的事情都很难实现了。比如游戏现在很难保持全屏, 经常跳出为窗口。再比如,辛辛苦苦做的游戏,很难稳定在一个帧数上跑,无论你多努力也不行。
Allen(全称听不清楚)在GDC上介绍了他的一篇论文讲述了这个简单的能力我们现在无法具备的原因。
复杂性的提高,加速了知识的丢失:
1、知识总量更多,我们就让每个人知道的比例变得更小来应对。
每个人对全局的把握一弱再弱,既难以传承知识,也难以做好自己的工作。
2、『深知识』被『琐碎信息』替代。
典型的深知识,如理解Cache Coherency(缓存一致性,指保留在高速缓存中的共享资源,保持数据一致性的机制),可以让人优化程序在多个处理器上跑得更快。
典型的琐碎信息,如『这个Unity里的小图标不知道为啥不显示了,请教老师傅得知,是某个深藏不露的菜单里看似没有关联的一个开关关闭了导致的,打开就好了,过了一阵子它不知道为何又关闭了,总之,编译之前一定要记得检查那开关打开没有』。
后者作为知识,往往几个月后随着Unity版本更新就完全作废,作为程序员要花很多脑力学习这种速朽的所谓知识,这件事情非常缺(offensive)。
3、好信息被噪音淹没。
症状是谷歌越来越难用,你的问题越复杂,网上搜来搜去看到的答案就越大概率是错的,或者只是浪费你的时间。
Blow认为,显而易见的是,复杂性越高,我们承受灾难,或者体制性腐化(参考上文东罗马帝国),的能力就越差。
而现在大家似乎相信,我们能承担的复杂性上限,是无限的。想象现在大公司里那种极少数能够透彻理解整个系统的工程师离退休之后后继无人、且很难把整套知识传递给年轻员工的情况,答案已经很明显了。
这一切和游戏有什么关系呢?
曾经的游戏,是关于如何榨干性能,将机器的潜力推至极限的。推至极限,要求我们透彻理解机器本身,这就自然导致我们倾向于做出非常鲁棒的程序。
今天整个行业转向Unity和Unreal。自己写引擎的人越来越少。一整代程序员从学习到工作,一直在写支离破碎的C#片段,放在Unity的这里那里,从来没写过系统性的,或者底层的程序。
这本身倒没什么,它缩短开发时间,提高个人效率,缩短游戏开发时间。但这意味着放弃,对其他能力的放弃,对整体性知识的放弃。
Blow说,割裂性的分工没问题,但是如果所有人都这样分工,那么没有任何人会做这之外的事情了。Unity和Unreal又是怎么来的呢?
它们生长于这样一个环境:所有的游戏公司都在自己写引擎,专门的引擎公司就从这些游戏公司里雇人过来,做出了如今的垄断性引擎。现在没有这样的环境,彻底没有那种人了的话,Unity去哪里雇人?
首先的结果,是他们彻底断绝了新引擎作为竞争对手的涌现可能。然后,这几个大引擎怎么继续维护和发展,也成了问题,自身开始衰退,也是很有可能的。
游戏开发者社群的情况很像阿西莫夫的《基地》:
我们有一群人知道怎么用电脑编程、也有一群人精通嵌入式系统/高性能计算这些事。当很多程序败坏、丢失、难以维护的时候,我们这群人的知识可以重建它们——但我(Blow)真的不确定,我们是否有足够多的底层人才,以及对底层充分了解的高层人才,能做好系统底层的工作。
也许,我们需要一个新的『基地』(foundation,也有基础的意思)。不好意思,剧透了。
说回到青铜时代的文明失落,无数历史显示了一种现象:当只有精英阶层可以读和写的时候,很多能力无法普及,文明变得脆弱——普通人也主观上不想学习那些。今天的我们,几乎没有人能理解自己的程序跑着的时候,CPU里正在发生什么。这就是脆弱。
如果青铜器时代那个程度的知识都会失落,那面对我们现在如此复杂的系统,我们怎么能相信它的存续和发展?各种各样的生存压力随时可能爆发,考验我们的软件世界。比如气候变迁。
比如国际争端,比如一些国家切断国际互联网了,比如中国不给我们加工芯片了。别笑,现在有些国家的程序员连上stackoverflow复制粘贴代码都费劲。这些事情单独来看肯定都不至于伤害我们的文明,系统复杂到今天程度,抗折腾能力会很差。
正如Elon Musk所言,技术会自然地退步。我们要警惕,要对抗,就一定要在每一个层级上简化:硬件、操作系统、库、应用层面的代码、网络、编译、debug、内容分发、人机交互。而这一切又完全可以如此简单,因为它们的现状如此荒谬!
我们需要的只是『意愿』(will)和『品位』(taste)而已!
大家都充分认识到复杂之荒谬,简单之美——简化可以让事情变得更好。
退一万步讲,也许你认为软件不会让文明倒塌。没关系,咱们就只从自身利益出发——所有程序员都每天气呼呼的工作着,因为他们知道自己大量的时间精力用在没有意义的荒唐事上,而不是真正有趣的,创造性的事上。
如果我们不改变做事的方式,未来的程序员工作会更加庸俗不堪,就跟没有SpaceX时候的美国航天事业一样。
再退一步,假设你只是独立游戏开发者,你可能觉得自己无力改变任何事情,只要忍几个月,把游戏做完就好了。毕竟重构、重写需要大量的时间——我想告诉你这种想法永远是错误的,因为我们永远低估了自己做游戏需要的时间,你以为的五个月,大概率实际是几年。
糟糕的工作方式让你付出的代价,比你以为的,要大得多,长得多。也许那拖延的几年时间,就是拜复杂系统所赐。反过来,如果你积极应战,简化架构和代码,兴许很值得。听起来像是又基础又无聊的建议,但我要大胆断言——我们大多数人甚至都不太知道怎么做这件事了。
【演讲完】
精彩内容