在 AI 大潮一浪高过一浪,大家都在谈计算思维,大模型,scaling law 的时候,我们不妨看看这本书 – 《为什么需要生物学思维》
这本书的英文名叫 Over-Complicated Technology at The Limits of Comprehension。 直译过来就是:过度庞杂的技术,让人几乎不能理解。作者是塞缪尔 · 阿贝斯曼,他在2008年获得生物学博士学位之后,就在应用数学,计算机生物学,和复杂性科学这些领域进行研究。
为什么想要和你分享这本书呢?因为我们现在用的很多算法,大自然在演化的过程中早就实践了。所以,了解大自然是怎么解决复杂问题的,可以帮我们更好地打开思路,找到处理复杂问题的高效方法。
从更实际的角度来说,我们创造了技术,技术应该为我们服务,但为什么我们经常会被技术困住呢?或者说,作为一名技术人员,我们要怎么处理和技术的关系?
比如前些年的一个例子是某地的健康码突然不能正常工作,或者突然弹窗警告,你顿时被定在原地,不能旅行。你觉得自己是无辜的,但找谁申诉也没有用,这个软件的代码就是要给你弹窗,说你的状态不正常。这个程序不是程序员们一行一行地写的么?为什么我们控制不了它?
作者写这本书的目的,就是为了帮助我们在两个极端:恐惧和崇敬我们的复杂技术之间,找到一条正路,为理解技术、掌握技术、高效地构建和维护复杂系统探索出方向。
那这本书具体讲了什么,对我们技术工作的启发又在哪儿呢
首先,作者开宗明义地说:技术进入了“纠缠时代”。他的原话是这么说的:“技术已经变得如此复杂,我们无法完全理解它,也无法完全控制它。每个专家都只了解这庞然大物的片段,却无法把握难题的整体。我们进入了 ‘纠缠时代’”。
随后,他分析了复杂系统形成的原因,以及人类为什么会慢慢控制不了这些系统。我在这儿挑两个最主要的原因来详细和你说:
第一个是 accretion,堆积,书中把它翻译为“吸积”,就是一层一层缓慢叠加的意思。程序员形容多年失修的代码库,常用 ”屎山“ 这个词,这的确体现了常年堆积的功力。
第二个是interoperability,翻译成互操作性,是要保证不同版本的模块都能互相兼容。
这个两个原因在IT行业通常是一起出现的。例如,我们常用的文字编辑工具 Word,新版本需要能处理各种老版本的文件格式和最新的文件格式,还要保证最新开发的功能在老格式的文档上也能起作用,但是,这个功能在老格式的文档的实现细节和新格式不一样,怎么办?通常的办法是增加一个抽象层,提供一套调用界面 API,在外界是调用一样的操作,在内部,每个格式有自己的不同实现细节。
很多用户纳闷,开发一个新版本为什么要花那么长时间?其实很大一部分时间花在测试兼容性上了。软件团队在开发全新功能之外,还要保证新版本的软件要能处理所有老版本的文件格式,老版本的服务器协议,等等。
说到这儿,你也许会想,如果我有一个机会,抛弃这些老旧系统的束缚,创新一个新的、简明的、没有陈旧包袱的系统,不就好了吗!
那我们不妨一起来回忆一下 Windows 8 这个系统,它的确砍掉了有非常悠久历史的计算机桌面的 “开始”按钮。结果如何呢?
Windows 8 把用户界面过度简化了,但是没有考虑绝大多数用户多年形成的路径依赖。你会说,把代码简化并统一,这个思路总没有错吧?但是,简化为一,也未必是简化。
下面我经历过的一些故事,这些故事让我更好地理解了作者的意图,也希望能对你有帮助。
第一个,是Windows 宏大的 “一个核心” One Core 的故事。
计算机软件行业操作的对象是信息。因为信息是一个人类定义的概念,所以很多人觉得,在和信息打交道的时候,人类应该是可以随心所欲的,我们不断地创造新软件,似乎只有想象力才是我们的极限,在这个过程中,难道还要遵守什么规律么?
下面我讲的这个故事,就是要告诉你,软件开发不能随心所欲,无论在什么时候,遵守自然规律都是有必要的。
我曾经工作过的 微软 Windows 团队开发过很多优秀的产品。在Windows 10发布之后,新的领导团队是从 WinPhone 业务过来的,领导们高瞻远瞩,觉得我们维护两套代码太没有效率了, 决定Windows 的所有产品都应该用一套代码,便于Windows 在手机这样的小设备,以及笔记本电脑,台式机,游戏机XBox,和服务器上同时运行。大领导还把这个宏伟计划简称为 OneCore,就是同一个核心。
软件核心模块公用,这是良好的愿望,但是一层层要求下来,到了基层,这个良好的愿望就变味了。某一个团队负责Windows的中文输入法,这是一个历史非常悠久的桌面输入法,同时他们还开发了一个新兴的手机输入法。由于 OneCore 的宏伟目标,这个团队也不得不和大家跳起了 OneCore 的广场舞。
但是,从用户的角度看,两种输入中文的场景是很不一样的,一个是桌面大屏幕,用独立的键盘,沉浸式地输入长句子,桌面输入法有二十多年的历史;另一个,是一个小小的手机竖屏,用屏幕上的软键盘,输入一些短句子,表情包,而且手机有好几种独特的输入方法,包括12键,手写,语音输入等等。
在OneCore 的大旗下,团队不得不把 Windows 桌面和手机Windows Phone 上面的输入法合并为一套代码。这个合并花了一年多的时间,就是不断往原有代码中添加新的层次,导致更加复杂的内部结构。然后,一年后,OneCore 成功了,合并好的代码里面,纠缠着许多 “if else" 条件判断互相纠缠的结构。
由于我们花时间在强行建设一个超级复杂的内部代码结构,就没有时间解决用户的问题。当时,我们收到了中文用户的不少迫切需求,希望输入法的团队解决。他们说,现在不行,我们都要做 OneCore,等我们做好了这个,就有时间解决你的需求了,这个部分改好了之后,就能用一套代码在Windows,WinPhone,甚至XBox 上实现,这是多么美妙的一件事啊?
结果一年多过去了,他们花费千辛万苦把各种代码用 if else 语句揉成了一套代码,但是,WinPhone 彻底没有了。可是当初我们要增加的需求,因为代码的复杂度增加,更困难了,这输入法的团队也解散了,产品交给了另一个团队来做。
回过来说,在这长达几年的折腾过程中,用户呢?啥也没得到!如果你一直是Windows 输入法用户,那我想问问,这个输入法在过去的 6-7 年里改进了什么,你能说出来么?
有听众要问,这个故事和“生物学思维”有什么关系呢? 好问题。 生物是活生生的,它的最终形态是生长出来的,不是看到了一个最终的形态,就强行一步拼凑到那个状态。植物由种子发芽长大,有了根茎叶,花,和果实。 这是缓慢生长出来的。
如果你想获得一朵真花,你不会用镊子一个细胞一个细胞地制作最终的花,而是从种子开始养育它。
如果你看到高大的乔木,低矮的灌木,他们各自都和自己的环境适应得非常好,你应该让它们各自长得更好,而不是说,因为它们都有根茎叶花果实种子这些共同的抽象概念,你就强行搞“一种植物”,把他们都合起来。
计算机软件完全是人构造的概念和在这之上的实践,另一个完全是人造的概念和实践是建筑和城市 – 有意思的是,专家认为,建筑和城市规划也要向生物学习,特别是向生物和环境互动,适应环境的方式学习。 上面我说的 “如果你想得到一朵真花” 的句子,就是引用于建筑学的名著 《建筑的永恒之道》。
不尊重 “自然地构建系统” 这个规律,就会出现强行规定 OneCore 而失败的例子。
想要解决问题,我们就要认识客观世界,找到规律,怎么找规律呢?首先,要了解世界并不围绕人类的意愿而存在,我们要认识世界,而不是臆想一个规律,然后强行让自然界满足这个规律。
我非常喜欢的一本书:《费曼的彩虹》“Feynman’s Rainbow”里面有一个很好的例子。
书的作者,李奥纳德 (Leonard Mlodinow) 是一位物理学的高才生,他很年轻就进入加州理工学院成为研究员,和许多诺贝尔奖获得者作同事,著名的物理学家理查德·费曼就是其中之一。 李奥纳德当时为“研究什么问题”而苦恼,听说大家都在研究“统一场理论”,就是把物理学中的四种基本的力统一起来的一种理论,觉得这也是不错的一条路。他就去问费曼的建议, 费曼反问他,为什么要做这个研究,他回答说:
“统一场理论,难道不是我们都想要的么? ”
费曼给了他当头棒喝,他说:
我什么都不想要。自然规律和我想要什么无关!你怎么知道世上存在一个统一场理论? 也许有四种理论,也许每一种力都有各自的理论!我不知道。我不会告诉自然怎么做,应该是自然告诉我。
生物界有千千万万种生物,这些生物,他们的‘内核’应该是类似的,但是在外在的各种表现上,有千差万别,是他们在长期演化中与自然环境达到的一种平衡。软件设计也一样,最核心的就是循序执行,条件判断,循环,子程序等基本概念,但是不同的软件的开发,在什么程度要统一,什么程度要分别对待?这是个难题,也是软件工程之所以有趣的地方。
回到我前面说的几件故事,谁希望 Windows 桌面的开始按钮消失? 是用户吗?用户自然地有这个痛点么?还是 “为赋新词强说愁”的设计师?一个桌面电脑的中文输入法,和一个手机的输入法,二者应该分享多少代码?多少用户体验?是谁来决定呢?期待你的意见。
我并不懂生物学,也不懂建筑学,更不懂物理的统一场理论。 所以我会提一些比较幼稚的问题,请教大家:
生物在地球上存在的时间,是用 “亿年” 这个单位来衡量。 建筑这个完全由人类创造的概念和行业在地球存在的时间,是用 “千年” 这个单位来衡量,软件这个完全由人类创造的抽象概念,和行业业在地球存在的时间,是用 “年” 的单位来衡量,目前还只是两位数。 “生物学思维”,和“建筑学思维”应该给“软件思维”什么样的启发?
我可以举一个具体的例子
我们谈到一些软件要满足各种老版本的需求,研究表明,从统计意义上来说,80% 的用户的用户只使用一个软件的 20% 的功能,例如:一个用户会说:我只要最新的格式,我不要任何老格式的支持,你能给我这个精简的版本么? 如果要把一个软件的功能做成用户可以任意定制,随意组合,这个软件的开发成本是多少? 另外,如果我们就发布了一个只有 20% 功能的精简版,会有 80% 的用户购买这个精简版么? 你作为软件设计师,你会怎么回答? 你会怎么选择? 你的决定在生物学界,建筑学界有类似的模式可以参考么?