相關閱讀 |
>>> 技術話題—商業文明的嶄新時代 >>> | 簡體 傳統 |
英文原文:The Deep Insights of Alan Kay
如果你還沒聽說過 Alan Kay(艾倫·凱)這個名字,你也很可能聽說過他的諸多名言中的一句,最流行的是他在 1971 年的這句金玉良言:預測未來的最佳方式就是去創造它。
給不了解他的人們介紹一下,Alan 取得了計算機科學領域最杰出的專業成就之一:他因為在面向對象編程(OOP)領域的工作獲得了京都獎(號稱日本的諾貝爾獎)和圖靈獎。同時他也是個人計算(PC),圖形用戶界面(GUI), 面向對象編程(OOP)的先驅者之一,和有史以來最具影響力的語言之一 Smalltalk 的發明者。
Alan Kay 寫的很多文章(鏈接1、鏈接2)中都犀利地觀察到思路延伸的力量,對此他回顧了當時獨辟蹊徑的 Xerox PARC 和 ARPA 研發環境,在那里的收獲是“愿景重于目標”和“投資于人而不是項目”,結果吸引了一些杰出人才在一起培育不同的觀點,而這些不同的觀點是取得進展所必需的。對此他認為:
一個觀點就值 IQ 80 分。
回顧過去,他認為:
ARPA/PARC 的歷史表明,愿景、適當的資金、精妙的思路和流程的組合幾乎可以魔幻般地使新技術破繭而出,這些新技術不僅可以擴大人類文明,也能給社會產生巨大的財富。
這些杰出人才在PARC確實發明了成為當今很多個人計算和編程領域基石的一系列不同凡響的技術,包括:
而在ARPA則產生了 ARPANET 這一神作,也就是我們現在說的互聯網(Internet)的鼻祖。
關于軟件工程
有意思的是 Alan 現在還認為計算機革命并未真正發生,軟件工程正在向和摩爾定律相反的方向發展,當硬件容量逐年遞增的時候,軟件則在無謂地持續膨脹,他認為這很可能。
歸因于虛弱而難于擴展的思路和工具、懶惰和缺少知識,等等
這個發展形勢在一首搞笑單行詩里表現的淋漓盡致:
Andy 給予的一切,都被 Bill 奪走
指當時 Intel 的 CEO Andy Grove 每推出一款性能更高的芯片,當時微軟的 CEO Bill Gates 都會通過升級軟件使新硬件帶來的更高性能消失于無形。
為了改善當前軟件開發的窘境,Alan 領導了向著徹底改造編程技術的 STEP 研究課題,目標是實現摩爾定律在軟件代碼表達效率上的飛躍,途徑是
把開發系統所需要編寫的代碼量減少到原先的百分之一,千分之一,萬分之一甚至更少。
他在 2011 年關于編程和擴展的一席發人深省的講話中再次提到了這個問題,指出軟件工程已陷入停滯,成為了迷失的學科,無法跟上硬件和其他科學技術領域發展的步伐。巨大的代碼庫已經類似于一個垃圾場,大到任何人都無法看懂產生 Vista 或者 Word 的 1 億行源代碼,而本來只需要一小部分代碼就夠了。他給出的既能產生深遠影響又最小化代碼量的優雅軟件典型包括了 Internet, TCP/IP,LISP 解釋器, Nile(矢量圖的數學 DSL)和 OMeta(面向對象的 PEG )。
他指出 Internet(TCP/IP)是為數不多的幾個設計得當的大規模軟件項目之一,實現了其靈活性和復雜度之間的平衡,雖然只有不到 2 萬行代碼,卻產生了一個能管理數以十億計個節點的靈活、動態的系統,自從它在 1969 年 9 月被啟動以來從來沒有停止過。這是如此罕見以至于人們不覺得 Internet 是通常意義上人類開發的軟件:
Internet 是如此之優秀,大部分人把它當做一種和太平洋一樣的自然資源而不是人造的東西。上一次出現有如此規模而又能如此容錯的技術是什么時候?Web 和它比就是一個笑話。Web 是一堆業余愛好者搗鼓出來的東西。
Nile/OMeta DSL 是他的另一個例證,展示了如何從頭開始只用幾千行而不是在商業化版本中數以百萬計的代碼來建造一個系統,實現同樣的功能。
我有興趣進一步了解,關于我們如何改善現有軟件開發水平以及現有語言、方法和工具有哪些缺失,Alan 是否有更深遠的見解。
關于面向對象編程
我一開始對 Alan 的研究重點是探索他原創的面向對象編程的愿景中蘊含的思考,這些思考也受到了他作為微生物學家背景的影響:
我把對象想象成生物細胞或者和網絡上的單個計算機,它們之間只能通過消息進行通訊。
也有他作為數學家背景的影響:
我的數學背景使我意識到每個對象可以有多個代數與之關聯,這些代數關系可以構成家族,而這些概念會非常非常有用。
他在研究 Lisp 語言后,被其極致的后期綁定(late-binding)和強大的元(meta)能力所影響:
第二個階段就是完全理解 LISP,并利用這種理解做出更好、更小、更強大和更延遲綁定的基礎架構。
從那時起他就成為了用于未來軟件工程的動態語言的堅定倡導者:
直到真正的軟件工程實現之前,下一個最佳實踐就是在各個方面都采用具備極致端遲綁定的動態系統進行開發。
主要是因為動態系統更容易適應變化:
延遲綁定使得在項目開發過程后期中產生的想法能被植入項目,和傳統的早期綁定系統(如C, C++, JAVA 等)相比,它所需的工作量是成指數級減少的。
如果系統具備了增量式直接修改和更快的迭代時間的潛力:
一個關鍵的思路是在測試乃至修改的時候還保持系統運行。即便是主要的修改也應該是增量式的,只需要幾秒鐘時間就可以生效。
這就是現在靜態類型語言的不足:
如果你在和大部分人一樣用著早期綁定的編程語言,而不是延遲綁定的,那么你你真的開始被你已經做完的東西綁住了。你無法那么輕松地重構你做的東西。
奇怪的是,他對于 OOP 的思想竟然局限在這么狹隘的范圍:
OOP 對我來說只意味著消息機制(messaging)、本地存留(local retention),保護機制(protection)和隱藏狀態過程,以及極端延遲綁定一切東西。Smalltalk 和 LISP 都能做到這一點。 可能也有別的系統能做到這些,但我沒有注意到它們。
就是說 OOP 居然不需要繼承關系,這可不是我們今天所理解的概念:
很抱歉我很久之前給這個主題打上了“對象”的烙印,因為這樣讓很多人關注了更小的想法。
而在主流 OO 語言中真正缺少的大概念是:
真正的大概念是“消息機制”
他提倡應該關注消息機制和模塊間的松耦合和交互,而不是模塊內部的對象組成:
做出非凡和可成長的系統的重中之重是設計好模塊之間如何通訊,而不是模塊應具有什么樣的內部屬性和行為方法。
而靜態類型系統很蹩腳:
我不是反對類,但我沒聽說過哪個類的系統不是一塌糊涂,所以我還是喜歡動態類。
其他一些流行的編程語言采用了 Smalltalk 的消息傳遞機制和延遲綁定,并實現了自己的基于消息的構造方法,包括:Objective-C 的 forwardInvocation,Ruby 的 method_missing,和最近 GoogleDart 的 noSuchMethod.
破舊立新
關于發展計算機科學最好的方法,Alan 有個有趣的理論:
我相信科學計算唯一能夠存在的類型類似于修建橋梁的科學。一些人負責修橋,其他人負責拆橋并提出更好的理論,人們必須持續不斷地修建橋梁。
他認為每隔幾個月就推倒重來是有好處的,并且看得出來他想消滅他自己的 Smalltalk 并重新開始:
眾所周知,70 年代末我試圖消滅 Smalltalk。在那之前有幾年它是世界上最棒的東西。它以一種比以前做的任何工具都更緊湊更優雅的方式順應了當時的需求。但時過境遷了。當我們學會更多,對我們想做的事情有更大的雄心,我們就會意識到 Smalltalk 里有各種各樣的東西無法按應有的方式擴展。例如里邊的反射。它是第一個真正能看到自己的編程語言,但現在我們知道如何更好地實現各種級別的反射,所以我們必須實現它。
關于消息機制
作為對于遠程服務消息機制的長期擁護者,我已經受益于基于消息的服務一段時間了。所以我對 Alan 關于這個主題的思考特別感興趣:
我可以看到通過全方位思考高效率的僅通過消息進行的虛擬機通訊,我們可以構建一個更全面的基礎系統。它能夠提供擴展性,成為我現在所在研究機構 ARPA-IPTO 正在研究的大規模網絡體系的虛擬版本,并且擁有強大的“代數”屬性(例如多態性)。
對于 Internet — 在他看來”可能是能夠正常運轉的唯一的真正的面向對象的系統“, 他想說的是:
對于我來說,關于真實對象的語義上最棒的一件事是,它們才是“歸根結底的計算機(RCATWD)”。這個概念總是保持著代表任何事物的能力。而舊的認識方式很快歸結到兩樣不是計算機的事物 — 數據和流程 –上,那么突然之間這種對象的概念失去了實現優化和改善行為的決策的能力。 換句話說,如果總是和真正的對象打交道,就可以總是保持模擬任何你想要的東西的能力,并且可以把對象送到任何地方去……RCATWD 也對傳送的雙方向提供了完美的保護。我們可以在 Internet(可能是能夠正常運轉的唯一的真正的面向對象的系統)的硬件模型中看到這一點。你只要遵從消息表單的傳統,就可以幾乎完全自由地獲得編程語言的擴展性。我在 70 年代的想法是我們當時在做的 Internet 加上個人計算是一個真正好的可擴展設計,并且我們可以做出一個虛擬機的虛擬 Internet,它可以由硬件機器提供緩存。這個想法沒有實現真是太糟了。如果“真正的對象”是 RCATWD 的,那么每個對象都可以用最適合其內在特性的編程語言來實現,這將對“多語言編程”這個概念產生全新的詮釋。
如果把所有東西當成對象,通過消息機制就可以讓互操作性的水平提高到一個史無前例的水平,減少代碼間不必要的摩擦,使不同編程語言之間的無縫通訊成為可能,這將產生一個全新的多語言世界,在那里你可以隨意地選擇實現每個域(domain)最適合的編程語言。
關于遠程過程調用(RPC)以及它是如何在架構設計和系統構建過程中扭曲開發者的思路的,他提到:
從非數據角度去看待對象的人數量很少,包括我自己、Carl Hewitt, Dave Reed 和其他一些人, 基本上這撥人都曾經是 ARPA 社區的,不同程度地參加過 ARPAnet 到 Internet 的設計,在這個設計中計算的基本單元就是一整臺計算機。但是人們可以看到一個觀念可以僵化到什么程度:從七十到八十年代都有很多人試圖用“遠程過程調用”應付,而不是從對象和消息的角度去考慮問題。世界的輝煌就如此擦肩而過了。
Carl Hewitt 是 Actor Model 的發明者,Dave Reed 參與了 TCP/IP 的早期開發和 UDP 的設計。
關于 LISP
他對于 LISP 的高度評價反復出現在他的論文和訪談中,他說 LISP 給予了他見過的最深刻的見解之一,所以他認為 LISP 是
人類設計出來的最棒的一個編程語言
大部分從計算機科學專業畢業的人都不懂 LISP 的重要性。 LISP 是計算機科學里最重要的 idea,沒有之一。
令人傷感的是,我的大學里沒有開設這門課。不過因為學習新的編程范例并且探索不同的觀點是提高開發技能很好的方法,我打算開始去學一學 LISP!
Alan Kay 不為人知的一面
我想以一些不為人知的故事結束這篇文章,這些故事是關于 Alan 所在的神奇研究團隊背后的推動力,從大約 40 年前開始,他們在計算機科學前沿奮斗不止的目標是:
為了幫助兒童–由此而到整個人類社會–學習和吸收“全面的科學知識”。
這個目標要回顧遠到 1968 年,當他第一次遇見 Seymour Papert,LoGo 語言(一種面向教育領域進行了優化的語言)的作者。
那就是,看待如何運用技術來增強孩子們學習的能力。一種方法是教他們如何在軟件里建造和模擬他們自己的真實世界模型,并讓他們實驗、修補、評價和觀察這些模型的行為特征。
一個目標是改變兒童接受教育的傳統方式,不再給他們灌輸事實,而是鼓勵他們自己去觀察真實世界的特征,讓教師按看待有自己權利的物種的方式去看待孩子,
而不是把孩子看作 ”必須通過教育來挽救的有缺陷的成年人“。
這種有效的學習方法被稱為建構主義者學習法, 由 Papert 在他 1987 年建構主義的出版物”小學科學教育的一個新機會“中定義。
Alan 在 1968 年就設想了 Dynabook 的概念,并在 1972 年一篇名為”適合各年齡段兒童的個人計算機“的論文中發表了這個概念。這個項目早在 1972 年就引發了圖形用戶界面和 Smalltalk 的研究項目。
在 1995 年他幫助建立了 Etoys 計算環境,這是一個富媒體創作環境(構建于 Squeak / Smalltalk 之上),用于幫助孩子們通過構建過程學習一些強有力的想法(powerful ideas)。
在 2001 年他成立了觀點研究院(the Viewpoints Research Institute),這是一個非盈利公眾福利機構,致力于為全世界的兒童改善強有力的想法的教育(powerful ideas education)。
在 2006 — 2007 年間,給每個孩子一個筆記本項目為所有 OLPC XO-1 教育機器預裝了 Squeak Etoys 多媒體創作系統。
<全文完,略有刪節>
譯者注:翻譯水平有限,對 OO 的理解也很膚淺,請大牛們多多指正,謝謝。
網載 2013-03-13 23:21:24
稱謂:
内容: