10.1 訊息傳遞與物件模型:模擬真實世界的軟體生物學#
Alan Kay 的問題:如何為「會成長的軟體」而設計?#
Alan Kay(1940–)1970 年加入 Xerox PARC(帕洛阿圖研究中心)。PARC 是 1970s 科技史最傳奇的地方:雷射印表機、乙太網路、滑鼠、圖形介面——全在一個實驗室。它成立於 1970,Xerox 高層的動機是防禦性的:「我們的影印機帝國未來會被『辦公室數位化』摧毀,所以要在自己的地盤上把未來發明出來。」
PARC 的制度值得單獨記錄:寬鬆、跨學科、不考核短期產出、僱用哲學家與認知科學家——資本主義史上最成功的「純研究部門」之一。但諷刺的是 Xerox 商業化幾乎全敗(蘋果 1979 年參觀後拿走了 GUI 靈感)——「發明」與「商業兌現」需要完全不同的組織能力,PARC 是最經典的案例。
Kay 的目標從一開始就不是「程式語言」,而是Dynabook——一台兒童可用的可程式化平板電腦(概念上就是 2010 的 iPad + 編程環境)。語言只是工具,他問的是:
軟體如何像生物一樣:由許多自治單元組成、透過互動成長、可以不推倒重來地進化?
物件的本源:訊息傳遞,而非資料封裝#
Kay 反覆強調(他晚年多次澄清)Smalltalk 的核心思想是:
「物件導向的本質是訊息傳遞——像生物細胞或網際網路一樣:每個單元自治,單元之間只靠訊息協作。」
在 Smalltalk 中,呼叫不是「執行某函數」而是「向某物件發送一條訊息」:
list select: [ :each | each > 10 ].
canvas draw: aShape at: aPoint.
select: 是發給 list 的訊息;list 決定如何回應。發送方不知道、也不應知道內部如何實現——這比「封裝」激進得多:
| 概念 | 一般 OOP(C++/Java) | Kay 的 Smalltalk 理念 |
|---|---|---|
| 物件 | 資料 + 方法的捆綁 | 自治的電腦(一個「小機器」) |
| 呼叫 | 函數呼叫 | 發送訊息(可能不被理解) |
| 繼承 | 代碼複用 | (次要,Kay 認為被高估了) |
| 隱喻 | 組織代碼 | 生物系統/社會系統 |
理論根源:訊息傳遞思想與 Carl Hewitt 的 Actor 模型(1973)、以及 Erlang(1986,愛立信為電信交換機設計——電信產業的容錯需求獨立演化出了同樣的答案)一脈相承。Erlang 的「Let it crash」哲學、Actor 模型在 2010s 雲端時代大放異彩(Akka、微服務)——Kay 的生物學隱喻在分散式系統中被驗證為工程真理。
Simula 的起點與 Smalltalk 的超越#
Kay 承認 Simula 67(8.2)是直接靈感——他在艦艇模擬程式中體會到「物件」的威力。但 Smalltalk 的超越在於把物件變成整個環境的哲學:
- 一切皆物件:整數、類別、編譯器、視窗——包括類別本身也是物件(可反射、可修改)
- 動態性:類別可以在執行期修改,系統不停機——活體系統(live system)
- 完全自舉:Smalltalk 環境用 Smalltalk 寫成(虛擬機+映像 image 的概念——今天的 JVM/.NET 是其直接後裔)
Smalltalk 的社會實驗:兒童與程式設計#
Kay 的 Dynabook 願景包含一個教育學賭注:兒童能透過「造東西」學會思考(建構主義,源自 Seymour Papert——LOGO 語言與皮亞傑傳統)。PARC 的實驗把 Smalltalk 給孩子用,孩子們做出動畫、音樂、遊戲——這些錄像在 1970s 震驚了教育界。
這條教育線的命運:1980s 微機時代來臨時,學校選擇了 BASIC 與 LOGO(便宜),Smalltalk 需要專用工作站(數萬美元)。Kay 的願景要到 2006 年 OLPC 與 Etoys/Squeak 才部分兌現——而 iPad 2010 年問世時,Kay 的評語是著名的遺憾:「它是個很棒的消費設備,但不是創作工具——不能編程的電腦只是家電。」五十年後,Dynabook 的靈魂(可編程性)仍未成為主流消費電子的標配。
物件模型的技術影響#
| 發明 | Smalltalk 中的原點 | 現代形式 |
|---|---|---|
| 虛擬機 + 位元組碼 | Smalltalk-80 VM | JVM、.NET CLR、WASM |
| JIT 編譯 | Smalltalk 的動態翻譯 | HotSpot、V8 |
| IDE 的「活體」形態 | 瀏覽器(檢查一切物件) | 調試器、REPL、Chrome DevTools |
| MVC 模式 | 1979(Trygve Reenskaug 在 PARC) | 一切 GUI 框架 |
| 反射與元程式 | 類別是物件 | Java 反射、Ruby 元程式 |
| 重構工具 | 環境級重構 | IDE 重構、Codemod |
MVC 值得停一下:Reenskaug 提出模型—視圖—控制器分離——「一份狀態,多種呈現,互動以事件流回」。這個 1979 年的模式,是今日前端框架(React 的單向資料流、MVVM、Redux)的共同祖先。