整个软件工程的发展史,就是一段抽象层次不断提升的历史。我们如今正在见证又一个抽象层次的出现,它为我们带来了极其强大的框架,帮助我们以此为基础构建新的系统。之前我也曾反复提到,以往我们最关注的架构决策同样在新的框架中有所体现,进而引发新的决策需求:我应该使用什么样的云服务?应该使用什么样的消息系统?又应该使用什么样的平台?
这些决策涉及一系列经济因素,而不仅仅是与软件相关。我认为架构师的角色已经发生了变化,因为我们现在已经开始解决系统层面的问题,而不再局限于软件问题。Grady Booch 是软件工程领域的先驱,早在 57 年前,年仅 12 岁的他就制造了自己的第一台电脑,并凭借随后数十年来在软件工程和软件架构领域的卓越贡献而广受爱戴。作为 UML 的联合缔造者,他还开创了面向对象设计的术语和实践。
身为 IBM 院士、ACM 院士,他凭借自己在软件架构方面的工作获得了一系列知名奖项。他出版过六本著作并发表了 100 多篇软件工程技术论文。在本次访谈中,我们将探讨软件工程的最初两个黄金时代、UML 的建立过程,以及 Grady 为何不认同 UML 自 1.0 版以来的发展方式。此外,访谈还将涉及软件架构实践随时间推移的变化,Grady 对于大语言模型的看法,更多趣闻(例如比尔-盖茨曾邀请 Grady 出任微软公司首席架构师,但被其婉拒)等等。总之,本期播客节目是一次对话传奇软件技术领袖的宝贵机会,让我们共同开启这段旅程吧。
软件开发领域的演变
问:您最为人所知的身份自然就是 IBM 公司的首席科学家。这是个非常耀眼的光环,那担任 IBM 公司首席科学家到底是种怎样的体验?之所以说非常耀眼,是因为我们很难想象你日常工作具体要做什么。
Grady Booch:嗐,只是个职务罢了,不用太过较真。我还打算在名片上还写我是个自由激进分子呢,但高层管理者显然不希望我这么搞。
所以我只能选择更为温和的表述。实际上,我自己最重要的头衔/职务就是研究员,或者叫院士。当前在世的 IBM 院士大概有 68 个人,哦不,是 89 个。而 IBM 在整个发展史上一共出现过大约 350 名院士。
所以说我们这帮人还有点稀缺。2003 年,我们公司 Rational Software 被收购之后,我就被 IBM 任命为院士。成为院士的一大好处,在于它很像某种终身职位——代表企业对于我们个人的信任,类似于“你之前做得很好,我们希望你能继续保持下去,而且愿意为你给予一定的自由发挥空间。”身为一名院士,我专注于软件工程方向,后来又把注意力转向了人工智能,因此我有很大的自由来追求自己认为有意义的东西。正如 Alan Kay 所说,要去“创造未来”。在我的职业生涯中,从 2003 年开始,我先是留在 Rational 部门一段时间,但很快就转到了研究部门,因为 IBM 的高管团队意识到我是那种关注未来五到十年趋势、而不仅仅是下个季度问题的人。
事实上,我早期研究工作的重点就是努力想要以自动化方式发现遗留软件系统中的模式。那时候神经网络还没有出现,所以这虽然是个相当有趣的探索方向,但很遗憾始终没能取得任何进展。这毕竟是个颇具挑战性的问题。因此,我们开始更多从架构角度开展工作。我曾与许多客户展开合作,在几十年的职业生涯中四处空降,响应客户们提出的“请帮我解决这个特殊的架构问题,魔法师先生。”
对我来说,最令人兴奋的一点,就是几十年来我几乎参与到自己所能想象的一切领域的项目当中。好像是在 2010 年左右,我开始被 AI 领域重新吸引。
问:您刚刚提到自己在遗留系统上工作,那对你来说何谓遗留系统?
Grady Booch:这确实需要明确定义,毕竟当我们写下一行代码的瞬间,它其实就成了遗留系统,直到我们最终将其废弃。
所以在某种程度上讲,所有代码都可以被称为遗留系统。Facebook 是个遗留系统,谷歌也是,就连 OpenAI 也面临遗留系统问题。而现实情况也确实如此,陈旧代码永远无法被彻底消灭。哪怕再怎么努力,只要我们构建出某些有用的东西,它就会持续存在并最终成为遗留的包袱。而在另一方面,除非代码的设计之初就充分考虑到可废弃性,否则必然会有一部分代码难以甚至根本不可变动——这对应的就是成本,是一定程度上的技术债。看看那些大型金融机构就明白了,这些组织从 20 世纪 60 年代开始就在使用代码库。我还跟美国国税局有过一次接触,他们希望对自己上世纪 60 年代开发的技术系统进行现代化改造。
那现在我们就回顾一下,上世纪 60 年代究竟发生了什么。为什么大家技术现代化的改造目标总是集中在这个时代的系统上?60 年代,人口不断增加,社会保障持续提升,许多组织中都诞生了大量文职工作。
因此到 20 世纪 60 年代中后期,银行和政府意识到工作实在太多、根本无法手动管理。为什么过去银行下午 3 点就要关门?因为他们得留出时间让人类雇员核对账目。美国国税局的情况也很相似。20 世纪 60 年代,有那么一段时期也掀起过人力流程自动化的浪潮,而其中大部分系统是由 IBM 360 汇编语言所编写的。
时间快进到当下:美国国税系统中仍有大量使用 IBM 360 汇编语言编写的代码,它们运行在模拟器之上。而这就带来了极其艰难的挑战,因为其中某些代码体现的是嵌入在汇编语言本体中的业务规则。那么,我们要如何扭转这种状况?答案是,恐怕只能领先堆人力的方式慢慢解决,也就是将旧有代码转换为 COBOL 汇编语言,以使其能够在现代技术上运行。单纯模拟能够达成的效果已经非常有限。
但大家也知道,下令每年都会制定出新的商业规则。那金融机构又该如何跟上时代变化的脚步?这是个真实存在的遗留问题。Facebook 的代码虽然没有那么久远,但面临的问题是相同的。谷歌这边也是一样。甚至还很年轻的 OpenAI 也将很快被这个问题所困扰。
问:在说起空降到不同类型的企业帮助他们解决问题时,能不能具体介绍一下多年来您曾经跟哪些公司合作过,具体帮助他们处理了哪些架构、遗留代码和技术债难题?
Grady Booch:你能想到的几乎每个领域我都接触过。毕竟我从业也那么多年了,经常会跟包括金融服务和国防部门在内的各行各业打交道。实际上,追溯到很久之前,复杂系统并非起源于商业领域,而是率先部署在国防产业当中。其实整个现代计算体系都诞生于此,也就是在第二次世界大战和冷战环境下孕育出的 SAGE 系统——即半自动地面防空系统。其出现在 20 世纪 50 年代,一直运行到 20 世纪 80 年代。这套系统的建立目标非常明确,就是为了应对苏联轰炸机飞越北极、直插美国本土的威胁。当时我们还没有卫星,雷达也不够普及,而这套系统也引发了后来大家常说的第一次软件危机。
这样的战略迫切性促成了北约会议的召开,来自世界各地的一群计算机科学家聚集起来讨论如何解决这一重大威胁。在我看来,这就是软件工程第一个黄金时代的巅峰,而一切就源自国防系统。后面我也接触过很多其他实时系统,比如心脏起搏器、地铁系统乃至 CT 扫描系统等等。总之但凡是大家能想象到的领域,我可能或多或少都有接触并参与其中。詹姆斯·韦伯太空望远镜目前在其设计中就用到了 UML,这真是太酷了。
问:回顾过去几十年的发展,你明显参与到一系列关键技术的发明当中,而相关成果如今也得到了广泛普及。这又是一种什么样的体验?
Grady Booch:前面我提到了所谓“软件工程黄金时代”的概念。这个时期包括函数式语言,或者更准确地讲,应该叫算法语言,比如 Fortran、COBOl、APL 以及 Lisp 等等。尽管 Lisp 在某种程度上应该算是一种多模语言,而我们拆分系统的主要方式则是依靠算法。因此,我们见证了结构化分析与设计技术的兴起,这在当时都有着非常重要的进步意义。
但这又带来了新的问题,因为当时的软件系统最大的短板在于其并非分布式,而采取的是单体式架构。那么,我们要如何才能构建起越来越大、可持续且经济可行的系统?随着我们看到分布式系统的兴起,软件工程的第一个黄金时代也开始发生变化。有趣的是,这种崛起并非发生在商业世界,反而率先出现在国防领域。ARPANET 阿帕网就是由政府部门提供资助,特别是 DARPA。
我之前曾介绍过,我在 1979 年注册了自己的第一个电子邮件地址,那时候使用电子邮件的用户还不多。实际上,这里也有个小故事。当 ARPANET 刚刚出现时,我正在空军学院任教。当时组织会印发一份小小的手册,里面列出了世界上所有的电子邮件地址。没错,全部电子邮件用户就只有几千人。
所以我能随时查阅他们到底是谁。这真是段神奇的经历。第一个分布式系统就是在这个领域开发完成的。事实上,在范登堡,我还开发过一套名叫遥测综合处理系统的项目,这是一个由大约 32 台微型计算机构成的封闭网络。微型计算机那会才刚刚流行起来。因此,如何将一个更大的系统拆分成多个分布式部分,成为困扰许多人的又一个重大问题。
当时这一切还没有进入商业领域,因此软件行业的人们开始意识到,单凭算法拆分所能做到的事情终究是有限的。结果就是,开发下一代软件的压力开始迅速涌现:分布式、实时、多语言、能够在各种计算机上运行的软件。我们必须解决分布式系统中方方面面的难题,包括它们可能会在不同时间出现故障,以及通信问题及其他相关挑战。
这让我们意识到,必须要以与以往截然不同的方式重新审视软件。研究期间发生的另一件大事,就是 Simula 和 Smalltalk 等语言的兴起,它们开始从根本上不同于以往的角度看待世界。时间来到 20 世纪 70 年代末,当时我 20 多岁,空军学院的一位前任教官问我,“Grady,你能帮助国防部学会使用 Ada 这种新型编程语言,以便将其应用于现代软件工程技术吗?”政府为什么会关心这个问题?因为当时软件对于国防部来说非常重要,甚至可以说对整个联邦政府来说都构成了重大难题,因为同时有几千种语言被付诸使用,而且数量还在快速增长。Fortran 和 COBOL 在某些场景下表现不错,但仍然无法适应全部应用需求。
所以我们决定开发一种新语言来统领所有语言,这就是 Ada 编程语言。Ada 远远领先于它出现的那个时代,这是一种受 Simula、Smalltalk 以及其他语言启发而来的新语种,在吸收了 Liskov 和 Guttag 等提出的抽象数据类型概念的同时,也引入了 David Parnas 的信息隐藏思想。所有这些概念在当时都还很新,但如今已经成为我们运营体系中的基础组成部分。
总而言之,当时整个软件行业并不了解要如何实现这样一个前所未有的目标。于是 Booch 方法,也就是面向对象的软件开发方法诞生了。从 1979 年到 1981 年左右,我在美国各地奔波,帮助联邦政府和承包商尝试以新的方式运用 Ada 这种新语言,这也标志着软件工程第二个黄金时代的开启。在当时,算法的复杂性已经不那么重要,人们更多开始关注系统工程问题,强调处理当时还刚刚出现的分布式系统。
而这也是 Booch 方法的精髓,其中蕴藏的正是我在帮助各类组织为新领域、新语言构建系统时积累下来的知识。
问:那您能不能解释一下什么是 Booch 方法?我只知道它跟面向对象编程有关,但作为这种方法的发明者,请您具体介绍一下这个概念及其重要意义。
Grady Booch:要说清这个问题,咱们就得从柏拉图讲起。我不是那个时代的人,但我读过不少柏拉图的文章,他的《对话录》讨论了如何更好地认识这个世界。我们到底该把世界看作是一个个原子、还是一个个过程?软件工程的第一个黄金时代,明显更关注过程和算法。
但同时还有另外一种与之平行的认识世界的方式,那就是通过原子来观察现实。我们可以将原子理解成软件工程中的类和对象。所以说,我其实是受到了抽象数据类型理论、柏拉图以及当时出现的许多其他有趣哲学概念的影响,这些概念促使我们以完全不同的方式看待这个世界。Booch 方法实际上就是在将这一切进行规范化,比如我们以基于类和对象、而非基于算法的方式拆分系统?同样的,我也受到了 Liskov、Parnas、Dijkstra 和 Hoare 等人的影响。这些名字现在的年轻人们可能不太熟悉,但他们代表的就是软件工程领域的第一代和第二代理论基础。
Booch 方法的本质就是提供一种认识世界的新方式,强调我们不应该只关注算法,而应该考虑数据和流程与算法组合而成的具有凝聚力的实体,也就是如今大家熟知的类。我们做对了一些事情,也做错了一些事情。我认为我们做得最好的是,类在抽象方面表现出色,而做错的部分则是过分强调了继承的概念。
继承的意义在于节省代码,因为这样我们就可以构建泛化机制。然而事实证明这并没有多大意义,因为我们最终创造出许多不同类型的抽象。但没关系,时间快进到当下,人们会不屑地表示“这有什么区别吗?”确实,生活在水中的鱼感受不到水的存在,业已存在的规范也压根不需要开发者额外去费神思考。
以 Redis 为例,大家可能都习惯了以它为基础再构建自己的项目。但如果认真分析,就会发现 Redis 提供的其实是一组抽象。这些抽象是基于类的,再被集成至相应的系统当中。简而言之,Booch 方法不再通过算法来认识世界,而是通过对象和类来认识世界。
我要强调的最后一点是,Booch 方法还暗含着从多个角度看待系统的概念,而这个概念在 UML 中并没有得到完全实现。
问:之所以需要专门澄清,是因为包括我在内,我们的大多数听众都是在 Booch 方法出现了很多年之后才开始自己的职业生涯,那时候类、变量和继承之类的概念已经相当常见,成为日常开发体验中的固有部分。但据我所知,最早的情况并非如此,那您能不能讲讲当时的应用环境和技术水平?到底是什么让 Booch 方法如此独特?是新颖、有趣还是创新?
Grady Booch:要回答这个问题,咱们还是得回到 20 世纪 50 年代,用一个类似的故事来说清楚。在算法编程语言的发展过程中,曾有那么一段时间,子程序这个概念引发了不小的争议?
为什么呢?因为执行函数调用至少会增加两到三条指令,所以计算成本很高。甚至函数调用和将某些东西拆分成子程序也会被视为架构异常。人们对这种效率低下的产物表达了强烈的抵触。很明显,现在看来这是一种相当短视的观点,毕竟我们需要承担一些技术成本来管理复杂性。同样的,最初面向对象的观点也受到了类似的抨击,因为人们在 COBOL 之类的算法语言中使用面向对象原则时,需要使用到所谓“common”的数据构造。
人们需要统筹这些 common 数据。也就是说,不同于以往立足语言的设计方式,现在大家需要从实践上考虑这些数据会以怎样的方式被哪些算法所使用。说回当初我任职过的范登堡空军基地,那里有个 32 台计算机的项目,每天我们都能在这些计算设备的侧面看到来自公共数据池的打印输出。由于频繁变化,它们相当于是把抽象概念直接呈现在开发者面前。
所以,人们希望依靠算法或者面向对象的方式进行拆分,但语言本身无法支持。也就是说,在开发出合适的语言之前,根本就没有行之有效的方式能把这些新观念结合起来。Booch 方法在很大程度上反映出了行业对于构建软件密集型系统的需求。它将注意力集中在类身上,将类的概念推广到众多现代语言,并围绕类建立开发方法。在如今的我们看来,这一切当然是理所当然的,毕竟各种主流编程语言都能让我们轻松做到这些。
这种回溯性的变革过程真的很让人着迷,特别是亲眼见证其从当初的探索性项目一路发展成为现在的普遍性方案。同样有趣的是,我们如今发明的革命性产物可能在 20 年后也会无处不在,对吧?
为什么 UML 不再用于工业界
问:确实是这样。您是因 UML 而闻名,也经常谈论自己与 UML 的关系。那能不能聊聊它是如何诞生的、最初的目标是什么、有谁参与进来、当时解决了哪些需求?
Grady Booch:1982 年,我在空军学院的两位同学 Paul Levy 和 Mike Devlin 也有参与,Paul 还曾是我在空军学院的室友。
他主修的是经济学,而 Mike Devlin 则主修计算机科学。Mike 跟我一起上过几节课。顺带一提,我第一次见 Mike 其实是在一门徒手搏击课上。虽然这种情况在一般的大学里不太常见,但我们军校出来的学生其实都要接受作战训练。
第一次遇见 Mike 的时候,如果我没见错,他在搏击对抗里打败了我。但在开发 UML 的时候,我自己在范登堡空军基地,而 Mike 和 Paul 则生活在湾区,主要负责卫星控制设施方面的工作。之所以主动选择他们,是因为他们参与的正是当时最大的 Ada 项目之一。所以我前往那边,帮助为该项目提供咨询。
他们二人后来也都去了斯坦福大学,所以我断定斯坦福大学一定很有潜力。之后他们又与顶尖风险投资家、苹果主要创始人 Arthur Rock 等取得了联系,并且为 Rational Software 的融资做出了贡献。1982 年,Mike 和 Paul 跟我聚在一起,说“要不咱们创办家公司吧。”说干就干,这家公司最终定名为 Rational Machines Inforporated,旨在为新兴的 Ada 编程语言构建一套软件开发环境。
我们都觉得这是个能赚大钱的机会。我们最初之所以选择制造硬件,是因为当时很多计算机都越来越价廉物美。Sun Microsystems 也开始大放异彩,但它们都没有足够的能力来完成我们既定的目标。因此 Mike 设计了一套系统,而我帮助建立了以此为基础的应用方法。
这套系统叫做 R1000,也是当时得到全球认可的主流 Ada 系统。我也不太确定,但业务大概顺风顺水经营了十年。时间来到 90 年代中期,我对一成不变的业务有点厌倦了,于是开始涉足其他领域。我发现 Booch 方法在商业领域很有吸引力。
当时我正在做一系列演讲。有一回,听众里的一位先生问了个很有见地的问题。后来我跟他单独见面,这位正是 Bjarne Stroustrup——即 C++语言之父。原本 Bjarne 当时正在做一个 C with Classes 的项目,后来 C++语言的前身。我们俩一拍即合。
我们发现双方在做的事情非常相似。实际上,我们就此决定一起在美国各地举办一系列讲座,在此过程中我也对他有了相当深入的了解。当时他写了一本关于 C++的书,从第一版的内容来看,他引用了我提出的很多想法。也就是在那个时候,我面向对象程序设计的书也出版了。
其实我也会经常引用他的著作。总之,Booch 方法可以说是跟 C++一同成长起来的。我觉得这相当有趣,还记得我当时曾经跟 Mike 和 Paul 举行过一次特别重要的会议,那是在丹佛联合航空公司的红地毯俱乐部。
他们见到我说,“嘿 Grady,我们正在考虑要不要让公司转向嵌入式系统。”我回答说,“可能你觉得好,但我觉得这主意不怎么样,因为这会错过一些重要的商业机会。总之你们自己决定,我要去做点不同的事情。”我的态度也让他们马上改变了想法。
我猜他们马上就意识到,我这么说是因为商业领域有一些更有前景的事情可做。当时大家都感觉到,单纯在国防领域发展业务已经不太走得通了,所以他们才想要进军嵌入式开发。在沟通之后,大家共同决定“那我们就试试怎么让 Booch 方法实践落地。”于是我们开始开发一套名叫 ROSE 的系统,即 Rational 面向对象软件工程,也是我们的第一款工具。顺带一提,初版原型是我用 Smalltalk 编写而成的。
这是个很棒的系统,要是当初能保留下源代码就好了。我记得我们在初次演示的几分钟之前,还匆忙又做了修改。从 ROSE 开始,我们正式从国防领域转向了商业领域。项目获得了巨大成功,因为当时许多人都意识到面向对象是种很强大的认识世界的方式,而 C++实际上也支持这一点。于是乎,这又带来了两个结果。
我们取得了商业成功,我们确实赚了很多钱;我们还开始收购其他公司,并着手补全完整的软件工程生命周期。
问:那能不能跟我们聊聊 Ratioanl Software 是怎么让这项商业冒险取得成功的吗?
Grady Booch:没问题。Rational Software 的 ROSE(即 Rational 面向对象软件工程)是一款个人生产力工具,能够在 IBM PC 上运行。但我猜其最终也被移植到了许多其他设备之上。
它的首个版本运行在 Windows 之下,基本上就是允许用户绘制 UML 图——抱歉,不是 UML 图,而是 Booch 图——旨在推理并批判性地考量整个软件设计思路。我们虽然也提供一些代码生成功能,但它主要还是一款设计工具,能够帮助组织概念化自己的设计思路。人们可以用它来有效记录、指定并构建自己预期中的系统。这样一款产品,也为我们带来了可观的商业收益。
手头了钱之后,我们就开始收购其他公司。我们收购了一家来自剑桥的小公司 Pure Atria,而后者由一位名叫 Reed Hastings 的人主导建立。
Reed 主动找到了我们,我们最终也收购了他的公司。对了,大家知道 Reed Hastings 是谁吧?他后来建立了 Netflix。
Reed 清楚地知道他自己不太擅长处理 CEO 的工作,所以他拿到钱后闲了几年,考虑自己到底要做什么。实际上,收购 Pure Astria 的资金也成了后来支撑 Netflix 的第一桶金。从这个角度看,我们生活的世界还真是很小。
总之,到 20 世纪 90 年代末我们事业的巅峰时期,IBM Rational 在某种程度上已经主导着软件工程领域,因为我们拥有涵盖开发生命周期中各个环节的工具。其背后的基本思路,就是增量与不可简化软件开发理念。早在我们现在经常讨论的持续集成和持续部署出现之前,我们就已经使用 Rational Machine 和其他自主工具实现了这些概念。我们率先提出了这些想法,而且构建出了相应的增量编译工具和类似技术。总之,我们在 90 年代就拥有一整套围绕这种方法建立的综合性工具集。
但随着新思路在市场上获得关注,越来越多的厂商加入进来,我们看到成百上千家企业也开始做面向对象的业务。这标志着软件工程第二个黄金时代的开始,在这个活跃的周期之内,各个组织都在努力运用新兴的伟大生产力工具。
当时我们已经有了 ARPANET、也有了个人计算机,那要如何为它们构建软件?更具体地讲,为其构建的软件应该具有哪些表现形式?使用我们这套极其强大且功能完备的工具,应当遵循怎样的系统设计最佳实践?在这样一个合理且有趣的空间之内,我们意识到自己在某种程度上已经开始主导市场。
在经营期间,我们又聘请了 Jim Rumbaugh。Jim 和我的任务是把他的 OMT(对象管理技术)方法跟我的方法结合起来。我们当时就是两位项目带头人。之后我们又收购了 Ivar Jacobson 博士创立的公司,原因是 Jim 和我都开始拥抱“用例”的概念。时至今日,用例同样是个大家耳熟能详的定义,可在 90 年代却是新鲜事物。
用例是 Ivar 在爱立信工作时的奇思妙想。当时我们与 Ivar 合作为蓬勃发展的蜂窝电话网络基站开发软件——这些项目在那时候非常重要。我们三个人因 Rational 而齐聚一堂,工作内容就是想办法把三个人的方法论结合起来,可回顾整个人生,我觉得再难找出三个如此水火不容的家伙了。
我甚至觉得很惊讶,就是我们三个凑在一起居然没有发生恶性暴力事件。我们的性子差别太大了,这里就不细讲了,我只想说,我们为自己创造的一切感到无比自豪。
最终,UML 由此诞生。所以我们决定这不应该只是我们自己的成果,我们应该让它成为全世界都能使用的成果。因此我们决定将它交付给对象管理组织,而 UML 1.0 也由此正式诞生。
在合作期间,我负责推动了大部分工作。我为项目编写了主体文档。当然,一切都是我们三个人配合完成,我并不想贬低其他人的贡献,但当时我承担的工作确实最多。不过在 UML 1.0 之后,我可谓身心俱疲,于是想要离开去做点新的东西。
所以我当时真的考虑过放弃,这时候出现了两个非常重要的人。其中一位就是 Philippe Kruchten。我们意识到自己的工作极其广泛,没办法同时关注方法论和符号系统。
因此,Jima、Ivar 和我继续共同研究符号系统,即 UML。而 Philippe 则主要与 Ivar 团队的部分成员合作研究方法论,由此诞生的就是 Rational Unified Process。请注意这里 Unified 统一的概念。Philippe 引入了我们在 Bouch 方法中提出的一个关键概念:通过多个角度认识世界。
Philippe 据此提出了 4+1 视图模型,这是他从构建加拿大空中交通管制系统的经验中发展而来——那是一套极其复杂的分布式系统。这些想法最终体现在了 IEEE、IEC、IOC 标准 420020 当中。作为一种架构描述,其基本含义就是在观察架构时,应当从多个视角进行考量:用例、逻辑视图、流程视图、实现视图与部署视图等。这是一个非常重要且深刻的概念。另一位参与其中的则是 Walker Royce,下面咱们就来聊聊有趣的 Walker 其人。
还是那句话,这世界真小。Walker 的父亲 Wynn Royce 曾写过一篇关于瀑布式开发生命周期的文章,而当时我有幸与他共事。Walker 主要研究螺旋模型与 Booch 方法。其实很多人对 Wynn 有误解,他本人并不支持瀑布式方法。
他当时直言,“这是个愚蠢的想法。实际上,看看 Parnas 的论文〈理性设计过程:为何以及如何进行伪造〉就知道了。顺带一提,Rational Software 这个名字就是从「理性设计」而来。文章里提到,从某种角度来讲,这其实就是我们今天所说的敏捷。所以早在 90 年代末和 2000 年初我们就已经发展到了这一步,当时 UML 1.0 已经得到广泛接纳,也是 Grady 用一生为之奋斗的目标。”
问:那从我的理解来讲,UML 的目标就是要描述一套系统?记得在大学里学习 UML 的时候,我们会用不同的方框来表示不同的类,而且各个类之间用箭头串连起不同类型的关系。只要认真看完整个图表,就能对正在构建的软件架构有所了解。
Grady Booch:没错,就是这么回事。其实只要看看 UML 1.0 标准的第一行,就会发现 UML 是一种可视化语言,旨在推理、可视化、指定并记录软件密集型系统中的工件。但标准中没有提到这是一种编程语言。实际上,我也一直强烈反对这种观点。UML 只是一种用于引导思考的语言——帮助我们思考并推理一套系统,并以面向对象的方式思考世界,特别是允许大家从多个角度建立起全面的理解。
顺带一提,如今的 DevOps 就只是将部署和实现视图融合了起来,只是那时候我们不会使用这个字眼。我们也同样有这样的审视角度,这正是 UML 1.0 最大的意义所在。其重点就是我们如何思考这些问题,以及如何通过推理找到答案。
我一直认为,画 UML 图的意义就在于废弃掉其中的大部分内容。可遗憾的是,现在很多人并没有这么做。在从 UML 1.0 到 2.0 的转变过程中,有一部分个人和企业总觉得,“我们应该让 UML 非常精确,我们想把它变成一种编程语言。”但在我看来,这实际反而彻底扭曲了 UML 诞生的意义。
我从来没想过要把 UMl 变成一种编程语言,这样做的后果只会让 UMl 变得更加复杂也更加臃肿。当时很多人的关注点不在于推理,而是用它来生成代码和做逆向工程。时至今日,我对逆向工程这类用途已经比较理解,道理完全讲得通。但把它变成一种编程语言肯定是个错误。我相信这个决定标志着 UML 衰落的开始,因为人们开始以错误的方式加以使用。
在巅峰时期,UML 在市场上的渗透率可能达到了 20%甚至 30%。现在想来,能有这样的普及度真的很酷。UML 影响到了使用它的系统,而且更重要的是,我为它能帮助人们以不同的方式思考软件设计而感到自豪。
问:你所说的巅峰时期有 20%到 30%的使用率,是说当时约有两成甚至三成的商业开发商都在用 UML?那具体是什么时候?
Grady Booch:没错,那大概是在 2000 年前后。但必须强调,微软在这段时期也发挥了重要作用,他们实际上与 Rational 开展合作并把 ROSE 产品集成到了 Visual Studio 当中。我们在西雅图专门派遣了团队负责这块工作。
这也是微软产品当时的一个主要卖点,能够帮助客户构建起复杂度更高的软件。所以没错,应该就是在 2000 年左右。但大家还记不记得当时还发生了什么?答案是,互联网正在迅速发展。ARPANET 已经转型升级成了互联网,众多企业在上世纪 90 年代后期开始接入网络。但新的挑战也随之而来,即我们要如何在网络之上构建分布式工作系统并从中盈利?这些系统应该是什么样子?微软的参与也正源于此,他们正帮助客户从独立 PC 转向分布式系统。另一方面,也出现了大量炒作之声,宣称互联网能够改善这、优化那,总之乱七八糟的。于是那段时间互联网领域出现了严重的投资泡沫。
千禧之后不久,预期中的反弹果然到来,市场出现了显著衰退。许多人意识到,他们斥巨资构建的成果在经济上并不一定具有可持续性。现在时间来到 2003 年,IBM 和微软仍在大量使用我们的工具,因为这些工具对于他们的客户非常重要。于是两大巨头都想出价进行收购,而最后 IBM 以 27 亿美元拿下了 Rational 的所有权。
于是我们就加入了 IBM,成为蓝色巨人的一部分。这个价格其实不难理解,毕竟当时我们在全球 14 个国家拥有 3500 名员工,年收入接近 10 亿美元,这对于当时的企业来说是个相当了不起的成绩。但现在让我们进入新的节点,聊聊 IBM 收购我们之后的故事。
加入之后,IBM 立即将我评选为院士,这是之前从未发生过的情况。毕竟 IBM 往往需要几年时间才会真正接纳一位新成员。几个月后,我接到一通电话,那头说“嗨,Grady,我是比尔,咱们当面聊聊吧。”
所以我就赶过去见他,那可是比尔-盖茨。我之前其实跟比尔也一起做过项目,当时比尔还担任微软的 CEO。他跟我打过招呼后,就把我带进了他的办公室。
我们原本只打算开个 30 分钟的小会,但最终会面持续了两个小时,这让他的员工们大为光火。他坐下来说,“Grady,这事还没有公开,但我打算辞去微软 CEO 职务,转而去做点其他事情。Grady,你知道我身兼两份职务,既是微软的 CEO,也是微软的首席架构师。”
他想让我担任企业首席架构师,而我的回答是,“比尔,这个提议很有趣,但请给我点时间让我考虑一下。之后我到处拜访,接洽了比尔的各位主要下属。但重要的是,我跟鲍尔默从未会过面。”
这是个危险的信号。大约就是在那段时间,我意识到微软其实是家运营状况极差的公司。他们的 Office 部门和 Windows 部门简直势同水火。最后,我通过招聘团队再次来到比尔面前,说“比尔,我很荣幸收到你的邀请,但实话实说,你的公司功能严重失调,而我肯定不是能够解决问题的理想人选。所以谢谢你的建议,但我恐怕无法接受。”
我记得自己好像还说过,“如果我接受职务,我们俩最终都会以悲剧收场。所以不如让我们各自安好吧。”于是我留在了 IBM,事实证明这是个正确的决定。接受邀约绝不会有什么好结果。
软件工程师兼漫画家 Manu Kornet 曾经创作过一幅关于微软的漫画,描绘的正是微软内部两个部门之间相互对峙的场景。没错,情况就是这样,他们亟需有人来打破僵局。
我是那种老好人,不擅长做出艰难的决断。我也不是那种会破坏气氛的人。总之,这事我真的干不了。
问:其实很多大学已经把 UML 列入教学课程了。但有趣的是,在行业当中,我并没看到有人真正把它用于实际开发——至少在我自己工作过的企业、合作过的初创公司、扩张中的组织以及行业巨头中都没有。我甚至发现很多人在提到 UML 的时候有种抵触情绪,而且经常认为它太正式了。毕竟我们都需要使用架构,但真的没人用方框和箭头把架构勾勒成图表。所以我很好奇,之前你谈到 UML 曾经被 20%到 30%的行业采用,那这为什么跟我的感受不同呢?
Grady Booch:这事要从当代架构的演变说起。
我有本书是专门讨论架构的,其中既涉及旧架构、也涵盖了新架构。今天很多开发者在说起软件架构时,都默认认为这些方案既合理且完备,有很多现成的素材可以使用。然而,在这些架构师讨论的各类系统当中,很多架构决策实际上已经替开发者做好了。比如说,假设我要构建一套涉及消息传递的系统,那可能会直接去用 RabbitMQ 或者 Redis 之类的成熟方案。
这些选项都已经替大家做出了架构决策。因此当代架构师的大部分工作,实际就是从大型框架和组件中做选择并将它们编排在一起。当然,这是一项非常崇高而且美妙的事业,框架本身也代表着 Meta 等大型系统的精髓。他们已经拥有数十年的架构和系统开发经验,他们在这些架构上构建的项目,很大程度上就是从这些 API 发展而来,而这些 API 并不需要更深层次的架构思维。关于这个问题,我想用一套三轴系统形象地解释一下。
沿着其中一条轴,体现的是不同的责任度等级。比如说对于一家初创公司,那我们只需要关注自己能不能赚钱,至于投资者的钱有没有回报根本不重要。所以说我可以编写一次性的软件,如果项目失败了,再去找其他风险投资家就行。所以我根本不需要考虑什么架不架构,花钱雇优秀的技术人员把它实现出来就行。
但如果我负责的是开发下一代洲际弹道导弹系统,整个项目投资数亿甚至上千亿美元,那就肯定得拿出更负责任的态度。毕竟此事非同小可,每一项决策都得深思熟虑。这就是所谓责任度轴。
接下来咱们再说说风险轴。假设我构建了一套系统,哪怕项目失败,那最差的结果也不过是找不到与之匹配的机床,那这肯定没什么大不了的。但如果我的项目发生故障就会导致人身安全面临威胁,那问题可就大了。在这种情况下,我们肯定会使用更规范的架构。
第三条轴则是复杂性。假设我构建的是一套市面上已经被用烂了的系统,那我啥都不用考虑。这就是提示词工程最擅长的领域了,AI 大模型就能快速搞定、根据提示词构建起应用程序。毕竟这些都有成熟的解决方案,我根本不需要什么 UML 这那的。但如果我要构建的是更复杂的东西,那在工程层面需要考虑的问题就多了。
我可以通过编写提示词来构建应用程序,毕竟所有工具都是现成且完善的,不需要繁琐的 UML 流程。但如果我开发的是一些之前并不存在的东西——假设我不是在构建某个语言模型,而是想要打造一组能够相互协同的语言模型,而且希望把它们跟非神经系统集成起来,那就必须考虑架构方面的问题了。这也正是 UML 的意义所在。在软件开发中其实也有舒适区,就是指那些无需依赖 UML 或者类似工具就能完成的工作。
但在另一方面,如果在这三条轴构成的三维空间中走得再远一点,就会发现其实到处都有人在用 UML。我之前提到了詹姆斯韦伯太空望远镜。除此之外,我还在跟很多肩负着重大风险、复杂性与责任度的金融服务机构,他们就需要在架构方面多下心思。
软件开发中的颠覆性变化和重大飞跃
问:那我可不可以这样理解,您是说软件架构自 90 年代和 2000 年初诞生以来已经发生了变化?
Grady Booch:肯定是的,当时的软件架构仍是新生事物。而且如果我们看看今天由风险投资资助的初创公司和大型科技企业,就会发现首先它们承担的风险并不大,毕竟出了故障也不会特别致命。另外,我们也可以使用更多已经存在多年并融入了架构设计的软件。比如说,我们可以使用 Redis 作为缓存机制,它功能完备而且可用度极高,根本不需要我们过多操心。
第三点是,很多初创公司根本不需要考虑责任这码事。实际上,他们甚至连审计流程都不怎么在意。毕竟体量不大、承担的责任也不重,所以他们基本想怎么做就可以怎么做,可以轻装上阵。
问:那我是否可以理解为,正是这些软件架构层面的变化,导致 UML 主张的形式化方法在初创公司和扩张阶段的企业中不太受欢迎?
Grady Booch:没错,实际上我认为一切的根源还是在于软件开发的经济学形态。让我们说回软件的第一个黄金时代。
那个时候,机器可要比人金贵得多。在使用机器之前必须深思熟虑,因为机器时间对使用者来说非常非常昂贵。因此算法分解和结构化分析设计之类的技术才会极具意义,因为我们离不开这样的优化。然而在当代,计算资源就如同身边的空气一样普遍,任何人都可以随时获取、随时使用。
我身后的桌子上就有四台安装着英伟达显卡的计算机,它们构成的私有云在算力上甚至超过了 20 世纪 70 年代整个世界的处理容量之和,简直太神奇了!而且只需要几千美元就能买到。计算经济学已经发生了巨大变化,以至于我们根本不需要考虑得太多,因为很多细节已经不再重要。我认为 AI 的崛起也在塑造新的经济形态,因为它让我能够随手构建一些成果、完全不必考虑任何设计层面的问题。
就连软件似乎都不再必需。我只需要用提示词构建出一次性的方案就行。在用完之后,随手丢掉即可。所以从这个意义上来讲,现实世界仍然是由经济学规律支配的。然而,仍会出现一些新的、独特且颠覆性的软件,其中还是少不了架构思维的引导。这很有趣,比如最近我就读到了亚马逊如何用形式化方法设计 Amazon Web Services S3 存储服务。
他们发布的博文详细介绍了整个项目实现过程。之所以采取形式化设计,是为了应对那些特别极端的情况。这类情况虽然只会以十亿甚至万亿分之一的概率发生,但就他们的设施规模来讲,这总会成为频繁出现的事件。总之我发现技术的发展反而让一些老办法有了新用途,这很有趣。
好吧,我得先控制一下自己,少聊点形式化方法的问题,毕竟这是另一个完全不同的方向了。回到亚马逊这边,如果访问他们的网站,就会发现他们是有自己一套围绕架构设计的语言存在。微软在 Azure 方面也有类似的东西。在我看来,这其实就是亚马逊的架构思维。
整个体系看起来类似于块状图,他们会说“我要构建这种东西,所以用这种特定符号进行标记。”类似的例子还有很多。总之,尽管人们已经做过足够多的探索、有了足够多现成的方案,但亚马逊和微软仍然非常重视架构的作用。
他们的网站会说,“如果想要构建这样的系统,请使用这些服务,另外请参阅我们网站上的相关参考示例。”所以虽然他们没有把架构随时挂在嘴边,但亚马逊和微软就是在强调架构的重要意义。只不过因为其中的模式已经相当成熟,所以人们不必经历重新发明轮子的过程,仅须选择方案、上手构建就行。
我认为这是业务发展趋于成熟的表现。我们已经从算法时代转向了每个人都能掌握的设计模式时代,如今又转向了亚马逊和微软自行编纂的全新架构模式时代。下面咱们再来聊聊形式化方法。其实形式化方法一直存在。
但根据我的经验,形式化方法是软件密集型系统中各个部分的必要元素。形式化方法只能涵盖特定领域。例如,微软开始在其驱动程序中使用形式化方法来验证其与硬件交互的正确性。这是个非常重要的进步。我自己就曾参与过一些项目,比如说“我有一套系统,关乎使用者的生命安全,现在需要对它做形式化分析。”可问题在于,这些形式化方法并没有考虑到现实世界中的因素,因为它不涉及时间和空间。
形式化方法处理的仅仅是功能。我一直认为形式化方法很有用,但也仅仅适用于系统中的某些部分,而不能作为架构本体的核心驱动因素。说到软件架构,如今软件架构师这类岗位已经不像过去那么受欢迎了,至少在初创公司和大型科技企业是这样。相反,我们有统一的架构师,但他们也越来越多被称为高级工程师、首席工程师或者杰出工程师之类。架构仍然存在,很多人也仍然参与架构设计,只是侧重点已经发生了转移。
问:说起软件架构设计,在这个概念刚刚诞生之时您就是首批软件架构师中的一员。那您能不能告诉我们,您是如何看待这个角色在过去几十年中的发展和演变的?
Grady Booch:我对软件架构师的理解主要受到两件大事的影响:首先我并不会称自己为架构师,但我确实在帮助客户设计他们所构建的系统。在这方面,我深受自己的一位好友,卡耐基梅隆大学教授 Mary Shaw 的影响。
如果我没记错的话,她好像在奥巴马执政期间获得了国家荣誉勋章。她还写过一本非常深刻的书,书名就叫《软件架构》,并在书中首次阐述了架构模式。Mary 是个特别有亲和力的人,也正是在那个时候,我开始理解架构的形式化机制。对我影响最大的反而是其他领域中的架构模式,特别是土木工程之类。
在国防领域,还有船舶结构设计、飞机结构设计以及类似的领域。“架构”这个词在工程界特别受尊重。所以在深入探讨之前,我们可能先要明确一个定义,那就是架构究竟是什么?
我之前曾经说过,一切架构都属于设计,但并不是所有设计都属于架构。架构代表的是塑造系统形式和功能的一系列重要设计决策,其中的“核心”则是以变更成本来衡量。软件架构和架构师的角色往往有着很重的心理负担,因为他们的决定往往会造成重大影响甚至是沉重的后果。
也就是说,架构师所负责的,就是在塑造系统的过程中做出一个个决策。当然,项目经理之类的角色也会参与决策。但其间最微妙的区别在于,架构师关注的不只是软件形态的决策,而更多体现在系统本身的形态上——即软件系统与其他系统乃至人类本身在自然世界中呈现出的样貌。就是这么一回事。
问:所以说架构师关注的是决策过程。那您觉得这个角色发生了变化吗?您有没有见到过企业聘用软件架构师,并授权他们灵活开展设计的黄金时代?我注意到这种放权的趋势正在减弱,很好奇您对此会怎么看。您有没有观察到类似的趋势,还是说这只是种误解?毕竟您接触过各行各业不同的客户。
Grady Booch:关于这个问题,我想分享另一个心得:软件工程的整个发展史,就是抽象水平不断提升的历程。我们也刚刚亲自见证了又一个抽象层次的出现,它为我们的系统构建提供了极其强大的框架。正如之前所提到,过去对我们来说属于最顶尖级别的架构决策,如今却已成为常规框架的固有组成部分。
所以现在架构师的决策变成了:我该使用哪种云服务、该选择哪种消息传递系统?这个决定涉及很多经济考量,而不仅仅是与软件相关的选择。我认为架构师的角色已经发生了重大变化,因为大家现在处理的是系统问题,而不再仅仅局限于软件本身。
问:不知道您有没有听说过解决方案架构这个职位。这个概念大约是十年前兴起的,相关职位非常有趣,而且专门针对云,这批专业人士就只关注云架构。如您之前所述,他们会做出经济决策,决定使用哪些服务——比如是选择亚马逊云科技还是 Google Cloud Platform。如果他们选择了亚马逊云科技,那还需要进一步判断到底使用 EC2 还是其他服务。这关注的明显就是系统性的问题。一般来说,作为一家初创公司,肯定会希望聘请在这方面有经验的专家——也就是那些知道哪里有陷阱,而且熟悉服务相关成本的人。聘请这类专业人士能够加快业务开发进度,因为他们已经做出了最关键的决定,可以指引企业确定哪些选项对当前正在构建的基础设施更有现实意义。
而之所以称其为系统性决策,是因为它们在经济上有着深远的长期影响。软件架构的另一个重要方面就是迁移,我发现大多数企业都把长期迁移视为一种沉重包袱。
这种迁移往往源自软件架构的变化,例如从单体式架构过渡到微服务架构,或者技术方案的转换(例如从 Node.js 转向 Go),又或是升级框架的主要版本(比如将 Angular 从一个版本迁移至另一个版本)。您觉得软件架构跟迁移有直接关联吗?您觉得软件迁移为什么这么困难,但又总之如影随行?甚至可以说除非到了宇宙消亡的那一天,否则这个问题永远得不到根治。
Grady Booch:这是因为我们一直在构建具备经济可行性的软件,而不断变化的技术趋势逼迫人们选择迁移。例如从 20 世纪 60 年代、70 年代和 80 年代的单体式设计,转向经济实惠的微型机普及时代下的分布式系统。虽然哪怕到了今天,我们也不可能一边用 iPhone,一边把所有高强度负载都交给大型机,但这种变化会促使大家考虑一种能够更好平衡处理位置的架构。如果边缘推理突然流行起来,那么软件架构也必然要随之改变。硬件因素和社会因素就是这样持续影响着系统结构,而这一切正是敦促我们进行迁移的核心驱力。
至于问题解决起来为什么很难,我再谈谈自己的另一个观点。代码确实是事实,但不是全部事实。除了代码之外,还有很多东西会影响到设计决策、设计准则以及我们对于具体开发方法的选择——包括影响命名约定及其他经常被忽视的微妙因素。有时候原有代码是完全准确的,但迁移之后却会导致其中重要信息的丢失。换言之,我们很难单凭代码就体会到当初开发者做出的那些设计决策。这些遗留代码的初代开发者可能已经离职、退休甚至去世,而接手的人根本无法理解他们当初做出选择时的具体背景。
所以面对各种奇怪的状况,大家开始怀疑为什么当初的开发者要做出这些决定,陷入迷茫与混乱。
问:您提到有些初始开发者可能已经去世了,这确实是后来者很少会考虑的问题。但回顾 40 或者 50 年前开发出来的系统,这就是冷冰冰的现实。比如当 Linux 最终退休之后,Linux 内核会是什么样子、又该如何发展?
Grady Booch:他其实一直在为 Linux 项目的概念完整性提供坚定且有力的支持,这就是一位优秀首席决策者应该做到的。始终把握概念完整性,这一点非常重要。当然,在核心决策者离开之后,项目肯定会出现漂移,这也很难避免。
这就是熵的概念。所有软件都会表现出一定程度的熵,这属于无法消除的内部应力。
问:在技术和架构方面,当下最典型的例子就是 AI。这是一项极具革命性和颠覆性的技术成果。作为一位已经在行业内工作了近 50 年的老兵,您觉得大语言模型和 AI 跟行业过去出现过的创新和大事件相比,在意义上有何差别?
对于我们这种在行业里也待过不短时间的从业者来说,大语言模型似乎可算是软件领域出现过的最大变革。但是回顾过去,您是否看到过在影响力或者变革速度方面能够与之相比肩的趋势?
Grady Booch:这是个好问题。我首先能够想到的应该是构建分布式系统,即不再将所有处理都放在单一系统之上。这是一场彻底颠覆我们系统构建方式的革命。在那个时候,我突然意识到我们可以打造一套微型计算机网络。最终,这种网络延伸并覆盖了微型计算机和边缘设备,包括当下人们寸步不能离的智能手机。
但在微型计算机时代,这种转变背后的巨大潜力和意义超出了大家的想象,我觉得人们直到很久之后才真正理解了其全貌。因为这要求我们重新审视自己构建系统的方式。我们发现不确定性显著增加,因为我们不知道该如何构建符合新时代特征的系统。我其实不清楚该如何处理消息传递:要使用 RPC 吗,还是有什么别的选择?
我该使用什么进行通信?要使用共享内存吗?这是一段前景不明的探索期,最后我们才想明白,这才是新时代下的常态。
问:发生这一切的具体时间点在哪里?是 90 年代左右还是 70 年代末、80 年代初?
Grady Booch:大概是在 80 年代末。为了便于理解,让我们先回顾一下历史。在 60 年代末和 70 年代初,整个计算世界都由大型机所统治。
但即使是在那时,人们就意识到这些机器并没有得到充分利用。因此第一套分时系统诞生了。大约就在同一时间,林肯实验室研究出的 Whirlwind 等系统开始将机器与现实世界连接起来。于是突然之间,实时计算成为了现实,最终使得两股非常有趣的发展趋势得以融合。
我们开始在大型机器中开发分时操作系统,设计与现实世界交互的机器。这些元素随着小型计算机的兴起而出现,尤其是在数字设备厂商和类似的公司里,小型化技术的普及(主要由国防部在半导体领域的投资所驱动)使得在办公桌上部署一台供一、两个人使用的计算机首次具备了经济可行性。这波趋势又进一步吸纳了 Whirlwind 等系统中体现的理念,并将其与当时正在构建的分布式系统结合起来。突然之间,我们有了将这些组件构建在一处的能力。
这就是 70 年代中后期的现实:我们亲眼见证了分布式系统的兴起。最后还有一点:客户端-服务器系统的普及。我们看到了哑终端(当时 IBM 也在做这件事)与大型机通信。然而,这些新机器的出现意味着我们可以将部分处理负载转移到边缘,而不必全部留给大型机。这股变革的力量促使我们重新思考系统设计。
问:那我这样理解对不对,当时的程序员已经习惯于在大型计算机上工作,而分布式计算的出现彻底改变了这种思维方式?就是说,年轻人开始接受分布式计算范式,但老一批程序员仍在坚持使用他们在大型机上跑通的方法,是这样吗?
Grady Booch:没错,之后随着 TCP/IP 和 HTML 等事物的出现,我们突然之间有了一份新的术语表,有了能够将这些元素绑定在一起的机制。
所以,我不敢说大语言模型跟当初分布式系统的普遍兴起是否同等重要,但二者确实有一定的相似之处。我想谈的第二件事是 GPU 的兴起,这波趋势最初来自游戏行业,当时他们需要解决的是个前所未有的问题:如何处理更多图像,并在游戏中创建出更加逼真的视觉元素。我们意识到这一切都被归结为矩阵计算,而英伟达正在强势进军这部分市场。
GPU 由此崛起,并在领域中占据了重要地位。直到吴恩达站出来,说“等等,用于游戏画面运算的 GPU 使用的数学,跟我们深度学习的技术是一样的。”瞬息之间,我们迎来了一场完美风暴,大量数据、强大硬件以及各类有趣的算法、反向传播机制成为可能。没错,这是一场完美风暴,是技术发展史上又一个激动人心的时刻。
对大模型的看法
问:大语言模型虽然有趣,但我们也必须小心谨慎。我们稍后再讨论这个问题。我想听听你对大语言模型的坦诚评价,包括它们的适用性、创新意义以及由此带来的权衡需求等。
Grady Booch:首先,为了避免大家以为我只是在随意点评自己完全不了解的东西,这里先介绍一下我跟 AI 的缘分。当我 12 岁还是 14 岁时,我对当时蓬勃发展的 AI 就很感兴趣。我一直对此念念不忘,也一直在追求并保持着对这一领域的关注。直到加入 IBM,我又真正参与到了其中。
在 Watson 项目上,我是以全职工作的态度参与的。当时领导 Watson 开发的 David Ferrucci 打电话给我说,“嘿 Grady,我打算做个讲座,但实在没空。你能替我顶上吗?”我回答说,“David,我很乐意,但前提是得让我自由选择主题。”
我选择的主题就是:Watson Jeopardy 的架构是什么?事实证明,这事之前确实没人认真讨论过。作为架构领域的专家,我与 David 的团队当面聊了好几个月,记录了 Watson Jeopardy 的现有架构。它并不是神经网络系统,而是一种管线架构,通过管线将许多统计系统整合在一起。
当时的 AI 完全基于预测统计方法,而不是现在大家熟悉的神经网络或者知识工程方法。因此我对架构的关注引起了 IBM 管理层的注意,这也是我第一次正式讨论 AI 架构。
问:如果我没记错的话,Watson 在“Jeopardy!”答题综艺中大获全胜,击败了所有人类选手。当时主流媒体、新闻媒体都在长篇累牍地报道此事。作为 AI 系统最典型的案例,Watson 能够在人类最擅长的一项任务中超越人类,所以很多人都会把 Watson 跟 Joepardy 联系在一起。
Grady Booch:没错,这也是 IBM 在 AI 领域发展轨迹中的一部分。在此之前 IBM 还有深蓝,它击败了当时最强的国际象棋选手卡斯帕罗夫。但那时候靠的还是算力的粗暴堆叠。
随后 Watson Jeopardy 出现了,并且在当时的自然语言处理领域击败了人类。IBM 在这一领域中开发出一套基于统计方法的系统,我们最终将这套系统出售给了其他公司。但无论如何,我们在特定阶段确实占据了自然语言处理的主导地位,而 IBm Watson Jeopardy 代表的就是那个时候 AI 成就的巅峰。因此公司问我,“Grady,这东西很酷,我们想把它转化成商业化产品。你能帮我们研究一下具体该怎么做吗?”
我之前曾经领导过一个为期约一年的认知系统研究项目。所以对于 IBM 具体该怎么做的问题,马上激发了我的好奇心。我认真研究了 Watson 能做什么,又观察了市场上的变化动态。那时候大约是在 2010 年左右。
面对新的十年,我向 IBM 管理层明确表示,虽然这项技术很酷,但也必须保持谨慎,因为我们很清楚有些事情它做不到。我反复强调,一定别过度炒作 Watson 的能力。记得跟罗睿兰会面时,我正好在做关于 Watson 项目的简报。
时任 CEO 的罗睿兰问了我个问题,突然有位副总裁介入并说起了自己的想法。我礼貌地回应说,“谢谢,但我觉得你说的不对”,之后继续解释起我的观点。
老实讲,如果我不是 IBM 院士,肯定会被当场解雇。但院士这个身份让我有底气这样表达。最终他们没有邀请我加入 Watson 项目组,我反倒挺高兴的,可以继续做其他工作。后来事情的发展果然不太顺利,而且哪怕我去了也改变不了太多。
所以我之于 IBM 有点像个局外人——虽然是内部员工,但一直做自己的事情。后来我们奥斯汀那边的一支团队接到了希尔顿酒店的邀请,他们想为酒店打造一台礼宾服务机器人。于是我们选择了来自法国南部的 Aldebaran 公司,他们专门制造三英尺高的机器人、名叫 Pepper。还有一款尺寸更小的型号,名叫 NAO。
他们还开发了一套机器人系统。这套系统很酷,能够基于 Watson 技术实现自动问答,但功能上仍有缺失。团队来找我说,“Grady,能不能帮帮我们?”我帮助他们完善了架构,并在几家希尔顿酒店进行了实验性部署。
当时那支团队的驻扎地离约翰逊航天中心不远,所以我又开始跟航天中心合作。我感觉很棒,因为我自己就是从空军那边出来的嘛。他们有一套名叫 Robonaut 2 的系统,这是一款人形机器人,部署在当时的国际空间站上。NASA 希望借此探索如何在火星环境中实现人机交互。
因此我们一群人坐下来讨论:“有哪些设计问题值得讨论,而且有助于推动我们解决难题?”我们都希望做点有难度的事情,而且都认为火星任务值得探索,因为其中涉及两个有趣的用例。其一,由于光速传播有其极限,所以不可能靠地面站进行遥控,设备必须能够自主运作。
这有点像《2001 太空漫游》中的 HAL,我们要构建自己的 HAL 来控制任务,但又得保证它不会“杀死所有人类”。但出于种种考虑,NASA 不太认同这个用例。我不清楚,反正他们决定。第二个问题是,当时 NASA 想把机器人部署在火星表面,帮助宇航员建立自己的科学实验和栖息地。
我记得有一天下午,我突发奇想,似乎找到了设计思路。当时大概是在 2014 年左右,我建立了一套神经符号架构,将其命名为“Self”自我。它融合了 Marvin Minsky 提出的心智社会、Rodney Brooks 的包容架构概念以及 Hofstadter 的奇异循环概念。将这三个概念结合起来,就形成了我们后来开发的 Self 架构。我们跟 NASA 又合作了一段时间,为 Robonaut 2 开发软件,比如说“嘿机器人,这有个科学过程,帮我整理过滤一下。”总之我们本质上就是在开发能够与人类直接交互的软件,同时也可以充当问答工具。为此,我们当时接触了新西兰一家名叫 Soul Machines 的公司。他们还曾参与詹姆斯-卡梅隆电影中的部分制作环节。
其实就是《阿凡达》三部曲啦,其中运用了一系列堪称伟大的技术,包括将摄像头放在演员身上来测量他们的肌肉运动。他们开发了一套模拟人体肌肉的神经模型,也拥有出色的硬件,但缺乏配套软件的支持。所以我们就在这方面为他们提供帮助。我们还跟一家名叫 Woodside 的澳大利亚石油与天然气企业合作,他们面临着与 NASA 类似的问题。他们主要为石油钻井平台构建系统,而这类平台的工作环境显然相当危险。
所以他们希望合作开发机器人,跟 NASA 的火星探索项目真的很相似。我们开发了一套名叫 CELF 的系统——简单来讲,这是一套神经符号系统。其中既有神经组件,也有符号部分,整个架构体系特别酷。在巅峰期,我们这边有 35 个人都在做这个项目。
但后来我们意识到 IBM 在全球设有六处实验室,于是我选择前往夏威夷毛伊岛生活和工作,而且直到今天仍然住在那边。至于 IBM 那边,则很快意识到 Watson 正在亏损,于是他们解雇所有团队成员。幸运的是作为一名院士,我仍然保住了自己的岗位。我继续在这个领域工作,这也成为我接触的第一波新型架构。
最近这六年左右,我一直在跟一组神经科学家合作,希望破解有机大脑的架构。我不再专注于跟软件相关的概念,而是开始研究皮质柱和下丘脑中的回路。我一直希望通过软件架构师的视角来评估这些有机系统究竟遵循怎样的架构。而这最终又回归到你提出的问题:我对大语言模型怎么看?我觉得它们非常非常酷炫。
但从其架构的本质来看,大语言模型其实是种相当不可靠的方案。这还是我收着说的,如果不客气一点讲,大模型实际就是毫无意义的生成工具、纯纯没脑子的随机鹦鹉。它们没有推理能力,也没有理解能力。
不过我也承认,大语言模型确实能生成一些相当连续的结果,也凭借基于互联网语料库的训练帮助人类探索极其复杂的潜在空间。所以我觉得大语言模型也是一场完美风暴——依托于数据、算法和硬件的大语言模型,让我们得以生成如此连续的输出。但我们也必须多加小心,Gary Marcus 和我一直在猛烈批评山姆-奥特曼等从业者,驳斥他们关于通用人工智能 AGI 即将来临的言论。
在我看来,这对 AGI 本身其实是种亵渎、也破坏了人类智慧的美感。坦率地讲,我绝不相信什么规模效应就足以支撑起真正的智能,反倒觉得这条路子正在走向死胡同。
我曾多次在线上跟马斯克交流过他对 AGI 的看法,毕竟多年来一直在承诺能够实现完全自动驾驶 FSD 功能。我觉得不行,因为那些模型从架构设计开始就有问题。在我看来,如果需要专门建造一座核电站才能承载起系统的运行能耗,那肯定是架构方面出了大错。所以我相信大语言模型有其行之有效的用例,但我们必须保持谨慎,因为它们也真的很危险。
我还曾经在 Galactica 立项之初就在 Twitter 上提出了批评,结果被对方屏蔽了。我说“这项目很棒,但也请你们想清楚它到底意味着什么。”对方不予理会,而我则不断批评,并最终被拉黑。但 Galactica 后来闹出的很多问题再次印证了我的看法。总之,我一直对大语言模型背后的风险抱有警惕。
问:我想明确一下,您似乎在说大语言模型不可能引领人类实现 AGI?但如果把大模型跟其他工具——比如神经网络或者神经共生系统——结合起来,会不会更接近实现此类智能系统?还是以您刚刚提到的项目为例,一台能够整理过滤条件并遵循指令的火星机器人,您觉得我们需要哪些前置条件才能实现这类智能?
Grady Booch:在回答之前,我还想补充一点。以日本为例,那里的人口老龄化和劳动力萎缩问题非常严重,美国也面临类似的情况,对于老年人的护理压力持续增长。因此,机器人技术的应用(不仅仅是纯人形机器人)变得越来越重要。这类解决方案已经在现实中具有明确而且迫切的需求。
所以没错,市场并不缺乏理想的应用场景。我一直觉得这是个系统工程问题。所以我才一直想用 Self 架构来解释神经符号系统的重要意义。现在我想聊点哲学,不知道你是否感兴趣。首先,人是有感知能力的,至少从表现上来看,人跟大语言模型有着本质的区别。
我为什么能下如此判断?因为这个猜测非常合理,与我交流的人拥有一套心智体系,通过多模态方式彼此交互。通过现实体验,我认定对方拥有感知能力,包括专属于自己的能动性、感受、行为和需求等等。
这很酷,把人和机器彻底区分开来。人类思维经过成千上万年的演进,发展出了一种以神经为基础的基本架构。然而,人工神经元根本不是人脑神经元的映射,而只能算是人脑神经元的“回声”。
如果认真看看大语言模型的架构,就会发现它们相对简单——分层简单粗暴,忽略了人类思维的精妙性与复杂性。在我们的大脑皮层中,有着数千万个皮质柱,但却只有大概七层深度。
爬行动物也有皮质柱,只是数量上要少很多。皮质柱似乎就是人脑当中的一个个“小矮人”,它们不辞辛劳地工作,帮助我们建立起世界预测模型。而通过与丘脑和其他类似结构的紧密缠绕,人类最终拥有了决定情绪和其他决策过程的发生区。
此外,我们的激素系统似乎也对这套架构有所影响,比如影响我们神经网络当中的其他信息传递方式。从同样的角度来看,大语言模型虽然非常有趣,但也只能算是我认为的真实神经元架构的一小部分。Gray 和我观察到,我们在规模效应下所能实现的收益正在迅速递减。OpenAI 团队和马斯克都认为规模效应将持续很长时间,但 Gray 和我则持相反意见:不,我们已经趋近于极限。
也就是说,接下来的发展必须调整思考方式。让我们说回架构议题。我想强调的最后一点是,节目开头咱们聊过我参与了具身认知项目。那么,具身是什么?
这是一种构建于现实世界内的系统,对现实做出反应并在现实中行动。大语言模型最缺乏的正是这一点。它们通过文本、音频乃至视频等纺织而成的静态信息进行运作,但在感官方面却太过稀疏。相比之下,人类的思维和智能则更加先进且成熟,因为它们始终与现实世界紧密关联。
从这个角度看,我觉得智能可以分成很多类别。而人类的智慧是跟身体一同发展而来。要实现这一点,就离不开一些极其复杂的架构。也正因为如此,我才拿出六年时间研究人脑中的神经元架构,因为我们对此的了解还不够深。我希望知晓这一切将如何影响我们设计软件架构的方式。
问:对了,您之前曾在 Twitter 上发表过一些有趣的内容。引用其中的原话,“我们需要一种标准方式对架构和大模型活动进行可视化,并且将一切人工神经网络都囊括进入——类似于 AI 版本的 UML。”如今一年时间过去,您观察到这个领域是否出现了发展态势?您为什么觉得大语言模型的架构问题如此重要?
Grady Booch:没错,我确实抱有这样的观点,也看到了相应的变化。所以在工作当中,我们一直尝试对大语言模型的运作施以监督,想要把最佳实践路径以可视化形式呈现出来。事实证明,这确实跟 UML 类似,毕竟现在的大模型就是黑箱、是一种自我封闭的消息传递系统。所以我想为其确定最佳表示方式。
大家应该也知道,不久之前 AlphaFold 刚刚公布了项目的源代码和权重参数。我把握住这一点,并打算以此为基础使用 UML 的交付成果来描述 AlphaFold 3 的架构,敬请期待。我觉得这方面还有很多工作可做。对于刚刚进入软件行业的软件工程师们,很多新人都觉得自己面临着充满挑战的就业市场。我个人给出的建议是:1)积累作品集:开发有助于展示你技能和兴趣的项目,什么都可以,无论是个人项目还是开源软件贡献;2)拓展人脉网络:积极参加行业聚会、会议,并在 LinkedIn 等平台上跟专业人士多交流,人脉网络往往就是开启工作机会的大门;3)终生学习:科技行业一直在不断发展,请务必通过在线课程、教材和阅读相关材料,保证自己随时了解最新趋势和技术;4)广撒网: 切勿自己局限在跟专业技能完全匹配的职位上,可以申请多种职位以增加被雇主注意到的几率;5)认真准备面试:演练常见的编程问题和系统设计面试,LeetCode 和 HackerRank 等平台都是很好的选择;6)坚持不懈:第一份工作的得来可能需要不短的时间,请一定坚持下来并在期间持续提升自身技能;7)寻找实习机会:寻求实习或者合约岗位以积累经验,这有助于大家成功过渡到后续的全职岗位。请记住,职业生涯的初期总是充满挑战,但只要坚持不懈并采取正确方法,相信各位一定能在软件行业找到属于自己的一席之地。
问:我有种感觉,AI 工具正在改变我们开展软件工程的方式。您经历了软件工程领域的一系列创新周期。对于刚刚起步的新人,您能不能就如何实现成功的软件工程职业生涯方面提供一点建议?
Grady Booch:没问题。当初 Copilot 和 ChatGPT 刚刚问世时,我收到过很多网友发来的消息。他们感叹,“天哪,难道我选错职业了?未来根本就不需要人类开发者。”其实并不是这样,无论使用哪种语言,市场永远需要能够做出明智决策的人。
软件工程是个抽象程度不断提升的领域,只不过与之配套的工具发生了变化。我当初学的是用汇编语言编程,但如今人们会使用抽象程度更高的语言来编程。所以关于这个问题,我想给大家提两点建议。
首先,不必焦虑、也不必恐惧。总会有一些很酷的工作在等着你去完成。实际上,我倒觉得现在是个好时代。在这样一个激动人心的历史时期,我们面对着如此多的机遇、酷炫的工具和超量供应的计算资源。所以总的来讲,真正限制我们的就只有自己的想象力。
因此,我鼓励大家先尽可能多去学习。另外,不要把自己限制在单一领域之内。虽然我们确实需要成为某个领域的专家,但计算世界是如此广阔,所以不妨考虑在一个还没人涉足的领域为自己打响名声,毕竟那里有很多很多机会在等待着我们。
第三点就是,希望大家能尽量享受从业的过程。我的意思是,如今的技术工具太新奇、太有趣、也太实惠了。一个人居然可以用如此低的成本做出那么多可能改变世界的尝试,这还不够神奇吗?最后我想跟大家说一句,就连我都不会觉得自己太老,我仍然在享受软件工程的乐趣。
除了之前提到关于研究人脑和使用大语言模型的事情之外,我目前还在兼顾两个项目,而且已经为此工作了很长时间。首先,我一直在尝试写一本关于软件架构的书。很高兴自己之前没有急着动笔,因为我现在比以前知道得更多。这是一本不同于以往的架构书,其中的内容不只是指导,而更多是要记录我曾参与合作的几家企业的现有架构。
所以我想把 AlphaFold 也囊括在内,还有 Photoshop。比如讨论 Photoshop 采用了怎样的架构、气候监测系统采用了怎样的架构、维基百科采用了怎样的架构等等。
总之,我想要记录人们当前所熟悉并且正在使用的系统架构,这些已经被忽视太久了。世界上存在这么多不同的架构形式,我要向大家介绍它们,毕竟哪怕是从业者大多也只接触过其中特定一种。现实世界其实更加广阔。
第二件事就是《软件架构指南》,出版社的编辑已经忍受了我十年,非常感谢有这么好的耐性。我希望自己能在去世之前把这本书写完。我在计算机历史博物馆董事会任职大约十年,期间一位新上任的 CEO 突然找来,问“Grady,你为什么不拍一部类似 Carl Sagan 的〈宇宙〉那样的纪录片呢?”
我回答说,“我不是 Sagan,但这个想法倒是有趣。”所以我在考虑创作纪录片的同时,决定写一本关于计算与人类社会发展历程的书,探讨计算的历史和人类的意义。其中希望探讨这样的问题:计算思维是什么样的?计算又如何改变个人、社群乃至整个国家?计算如何改变科学、艺术还有宗教?这又引出一个终极问题:在计算的背景之下,人类的意义应该是什么?这就是我目前正在进行的重大项目,希望能在去世之前把它写完。
好的,那咱们进入收尾的快速问答部分。我直接提问,您直接回答、不用考虑太多。
您使用过的第一种编程语言是什么?
Fortran。
您最近为哪个项目提交过代码,在项目中使用的是什么语言?
最近一次提交是 Self 项目,用的是 Python。
开发这事其实很累人,那您是怎么在劳心劳力的软件开发之余恢复精力的?
我生活在毛伊岛。每天从床上醒来的舒爽体验就足够了。
确实,那可是个度假胜地。对于想要更多了解软件架构的朋友,能不能为他们推荐两本书?
我个人最推荐的就是 Mary Shaw 的《软件架构》,其他任何选项在它面前都黯然失色,所以就先推荐这一本吧。
好的,非常感谢 Grady 能参加我们的节目。跟您聊得很开心,也很有启发。
我也很荣幸,感谢你的邀请。
参考链接:
评论