最近「Linux三劍客」中一個非常古老的工具突然登上了 GitHub今日熱榜:——這竟是因為 80歲的原作者更新了。是的,你沒聽錯,有人都80歲了還在改程式碼!這位大神,就是加拿大電腦科學家—— 布萊恩·柯林漢(Brian Kernighan)。
與比爾蓋茲、Java之父、Python之父等大佬齊名的他,開創的「Hello World」範例起手式,每一位學程式的同學都不陌生。不管你學的什麼語言,第一個程式就是學會輸出它。
printf(「Hello World!\n」);
cout << 「Hello World!\n」;
print 「Hello World!」
此外,C語言的第一本程式著作,作者之一有他;Unix系統的早期開發人員、AWK (Linux及Unix中的文字資料處理工具)的共同創造者名單中,他也赫然在列。
如今老爺子已經滿頭白髮,還活躍在「一線」——
今年5月,AWK的GitHub倉庫中,老爺子提交了新的pull request,給AWK新增了一直沒法做到的Unicode支援。
對此,網友的態度是這樣的:是什麼讓他常年保持程式熱情的呢?
免試進入貝爾實驗室
事情還得從柯林漢的大學時代說起。
柯林漢於1942年出生於加拿大,本科就讀於多倫多大學工程物理學。
他形容這是一個給那些自己也不知道想學什麼的人準備的「大雜燴」專業,但很幸運,剛上大一他就對程式開始感興趣,學起了Fortran語言。
當時,電腦的發展還處於初期。他直到大三才見到全校唯一的一台電晶體電腦:IBM 7094。
由於太貴 (當時值300萬美元),學生們並沒有機會碰到它。
由此可見彼時工具的稀缺,所以正在學程式的柯林漢也就只是拜讀了丹尼爾·麥克拉肯的大作,獲得了「頗豐」的理論知識, 實際並沒有真正上手寫過一行程式碼。
大一暑假,不知道他如何在一家石油公司找了個實習,任務是用COBOL語言給精煉廠開發最佳化軟體。鑑於這個語言他不熟,也沒有程式經驗,所以最後也沒寫出個像樣的程式來。
雖然受了一點小挫折,但他對程式的熱情並沒有退卻,回到學校繼續研究。
大四畢業後,柯林漢決定繼續深造,並拿到了MIT和普林斯頓大學的offer。
由於去MIT要7年才能完成博士學業,且每週需做30小時的研究助理工作,而普林斯頓只要3年且提供全額獎學金,再加上柯林漢的好友就在普林斯頓,他毫不猶豫地選了後者。
在普林斯頓大學,柯林漢讀的是電子工程專業,因為當時同樣還沒有專門的電腦系。
這完全沒妨礙他前進。
讀博期間,他先是得到了MIT的實習機會,有幸在後來的圖靈獎得主費爾南多·科巴托 (Fernando Corbató)門下幹活,給一種叫作Multics的分時作業系統計畫寫程式碼。
轉年夏天,他又得到了 貝爾實驗室的實習機會,在那裡寫彙編語言。
為了方便在Fortran程式中做列表處理,他還寫出了一套函數庫,他形容這份工作「十分過癮」。
轉眼到了博士畢業,柯林漢被直接留校任教,並在沒有進行面試和研究成果展示的情況下,成為了貝爾實驗室的正式成員,足以見其優秀。
而他和Unix的淵源也就此展開。
Unix命名人
我們現在的大部分伺服器、手機系統和物聯網系統的底層基本都是基於Unix。
而三大系統之一的Linux也是一種類Unix系統,可以說,Unix是現代作業系統的源頭之一。
說起來比較意外,這麼一個重要的作業系統,其初代版本被後來的圖靈獎得主Ken Thompson僅花3週的時間就搞定了。
當時的Unix還叫UNICS (Uniplexed Information and Computing System),後來被柯林漢改成了現在的名字。
Unix中有一個核心工具,叫做AWK,柯林漢就是其發明者之一(名稱中的「K」正是代表他)。
AWK作為一種文字處理語言,只做過濾和轉換文字行這一件事,卻成為Unix/Linux平台上現有功能最強大的資料處理引擎之一。
在Linux系統中,它和grep、sed命令並稱為「三劍客」,並佔據「老大」席位,掌握了它,處理日常操作完全可以。
如今,AWK已經分化出三個版本,依然受到人們的歡迎,誕生45年仍未「退休」。
除了AWK,柯林漢還發明了AMPL,一種描述並求解大規模複雜數學問題的建模語言,支援世界上大部分的求解器。
還有編譯器Ratfor、檔案編制前置處理器Pic、Grap和數學排版語言Eqn等這些重要研究成果背後都有他的身影。
除了寫程式碼,柯林漢還很愛寫書,且誕生了不少經典之作。
比如你想瞭解Unix的歷史,就可以看《Unix傳奇》,作為參與者和見證人之一,他寫的這本書可以讓沒有足夠專業技術背景的人也能欣賞Unix的思想。
而文章開頭所說的「Hello World」範式,則是出自於他與C語言之父丹尼斯·里奇 (Dennis Ritchie)合寫的開山之作《C程式設計語言》。
再比如柯林漢的第一本著作《The Elements of Programming Style》 (《程式格調》),則留下了一個以他名字命名的定律—— 柯林漢定律,即:
偵錯一段程式碼的難度是編寫它們的兩倍。按照這個定義,如果你的程式碼寫得非常巧妙,那你可能沒有足夠的能力來偵錯它。
(相比於複雜程式碼,簡單的程式碼更可取。因為偵錯複雜程式碼的過程中,任何問題都會十分棘手,甚至無法解決。)
解決問題靠拖延?
那麼,柯林漢本身是個什麼性格的人呢?
2021年他接受《程式設計師》採訪時,曾被問了這麼一個問題:肯(Ken)用3週創造了Unix,道格 (Doug)在幾天內就提出了「管道 (pipe)」的想法,你們工作效率這麼高,有什麼訣竅嗎?
(以上兩人都是他在貝爾實驗室的同事)
對此,柯林漢連連擺手:
他們是「別人家的程式設計師」,我可從沒這麼高效過!
老爺子說了,遇到新問題,他的解決方案通常簡單粗暴,那就是 儘可能地拖延,以及祈禱問題消失,或者祈禱問題自己解決自己。
這個玄學辦法本身是不能解決問題的,但這樣做,柯林漢有足夠時間消化問題,然後想出對策。
而且,他其實會選擇直接動手搞定問題。
今年1月1日,柯林漢剛好過80歲生日。
上個月,Youtube頻道Computerphile對他進行了採訪,大夥兒才知道,老爺子 還在改程式碼!
柯林漢說,沒有任何一種電腦語言或工具是萬能的,AWK也不例外。
此前,AWK只適用於ASCII或8位輸入,不能處理Unicode (統一碼)。
幾個月前,柯林漢花了點時間,折騰了一下AWK——他稱它是「一個非常古老的程式」——現在AWK可以 處理UTF-8輸入和輸出了。
現在,使用者已經能用正規表示式提取日語字元以及類似的東西。
柯林漢還順口提了一嘴,他修補了一些東西,讓AWK可以處理CSV檔案。
整個採訪過程,老爺子依然健談,精神面貌也不賴。
話說回來,精力充沛的他,對幾十歲的「古老程式」改改改,還有啥原因呢?
柯林漢的回答是這樣的:今天的電腦環境,和三、四十年前非常不同,記憶體量也大大擴充了,「這會改變你對AWK的思考方式,尤其是AWK執行不起來的部分」。
所以,老爺子一直偷偷在後台玩兒新版本的AWK,目的是儘可能做拓展,讓AWK 更容易實踐和使用。
這其實是柯林漢一以貫之的行事準則,此前,他就在播客CoRecursive中表示過:如果做些能對自己有幫助,又對他人工作有所改善的事,何樂而不為呢?
有意思的是,世界上沒有萬能工具,也沒有萬能通才。老爺子自己就承認說,他的bug是還沒完全搞懂Git怎麼用。
所以他只能透過電子郵件,把更改傳送給當前的維護人員。
80歲高齡還要修改幾十年前寫下的程式碼,這位程式設計師的故事再次引起了網友關注。
有的網友表示了對老爺子的感激。
還有人覺得,為改善程式設計師寫程式碼的環境不斷付出,是一件很鼓舞人心的事情。
當然少不了玩梗的人:Hacker永不退休!
最後,讓我們回到「Hello, world」。
這句「萬物開頭」其實最早是在柯林漢1974年撰寫的《Programming in C: A Tutorial》中首次出現,後來才被合寫進那本經典之作。
該書中兩位作者形成的寫程式碼風格,也被稱為 K&R風格(K&R即指柯林漢Kernighan和里奇Ritchie)。
有意思的是,柯林漢表示這本書是自己強行拉著丹尼斯寫的。
至於為什麼選擇用「Hello, world」而不是別的,柯林漢自己都記不清了。
在接受富比士雜誌訪談時,他模模糊糊回憶:可能是因為看了個動畫片,裡面有一個雞蛋和一隻小雞,小雞說了句:Hello,World!
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!