豐色 衡宇 發(fā)自 凹非寺 量子位 | 公眾號(hào) QbitAI今天,“Linux三劍客”中一個(gè)非常古老的工具突然登上了GitHub今日熱榜: 
——這竟是因?yàn)?strong>80歲的原作者更新了。 是的你沒(méi)聽(tīng)錯(cuò),有人都80歲了還在改代碼! 這位大神,就是加拿大計(jì)算機(jī)科學(xué)家——布萊恩·柯林漢 (Brian Kernighan)。 與比爾蓋茨、Java之父、Python之父等大佬齊名的他,開(kāi)創(chuàng)的“Hello World”范式讓每一位學(xué)編程的同學(xué)刻煙吸肺: 不管你學(xué)的什么語(yǔ)言,第一個(gè)程序就是學(xué)會(huì)輸出它。 printf(“Hello World!\n”); cout << “Hello World!\n”; print “Hello World!” ……
此外,C語(yǔ)言的第一本編程著作,作者之一有他;Unix系統(tǒng)的早期開(kāi)發(fā)人員、AWK(Linux及Unix中的文本數(shù)據(jù)處理工具)的共同創(chuàng)造者名單中,他也赫然在列。 
如今老爺子已經(jīng)滿頭白發(fā),還活躍在“一線”—— 今年5月,AWK的GitHub倉(cāng)庫(kù)中,老爺子提交了新的pull request,給AWK添加了一直沒(méi)法做到的Unicode支持。 對(duì)此,網(wǎng)友的態(tài)度是這樣的: 
是什么讓這位大佬常年保持編程熱情的呢? 免試進(jìn)入貝爾實(shí)驗(yàn)室事情還得從柯林漢的大學(xué)時(shí)代說(shuō)起。 柯林漢于1942年出生于加拿大,本科就讀于多倫多大學(xué)工程物理學(xué)。 他形容這是一個(gè)給那些自己也不知道想學(xué)什么的人準(zhǔn)備的“大雜燴”專業(yè),但很幸運(yùn),剛上大一他就對(duì)編程開(kāi)始感興趣,學(xué)起了Fortran語(yǔ)言。 當(dāng)時(shí),計(jì)算機(jī)的發(fā)展還處于初期。他直到大三才見(jiàn)到全校唯一的一臺(tái)晶體管計(jì)算機(jī):IBM 7094。 由于太貴(時(shí)值300萬(wàn)美元),學(xué)生們并沒(méi)有機(jī)會(huì)碰到它。 
由此可見(jiàn)彼時(shí)工具的稀缺,所以正在學(xué)編程的柯林漢也就只是拜讀了丹尼爾·麥克拉肯的大作,獲得了“頗豐”的理論知識(shí),實(shí)際并沒(méi)有真正上手寫過(guò)一行代碼。 大一暑假,不知道他如何在一家石油公司找了個(gè)實(shí)習(xí),任務(wù)是用COBOL語(yǔ)言給精煉廠開(kāi)發(fā)優(yōu)化軟件。 鑒于這個(gè)語(yǔ)言他不熟,也沒(méi)有編程經(jīng)驗(yàn),所以最后也沒(méi)寫出個(gè)像樣的程序來(lái)。 雖然受了一點(diǎn)小挫折,但他對(duì)編程的熱情并沒(méi)有退卻,回到學(xué)校繼續(xù)研究。 大四畢業(yè)后,柯林漢決定繼續(xù)深造,并拿到了MIT和普林斯頓大學(xué)的offer。 由于去MIT要7年才能完成博士學(xué)業(yè),且每周需做30小時(shí)的研究助理工作,而普林斯頓只要3年且提供全額獎(jiǎng)學(xué)金,再加上柯林漢的好友就在普林斯頓,他毫不猶豫地選了后者。 在普林斯頓大學(xué),柯林漢讀的是電子工程專業(yè),因?yàn)楫?dāng)時(shí)同樣還沒(méi)有專門的計(jì)算機(jī)系。 這完全沒(méi)妨礙他前進(jìn)。 讀博期間,他先是得到了MIT的實(shí)習(xí)機(jī)會(huì),有幸在后來(lái)的圖靈獎(jiǎng)得主費(fèi)爾南多·科巴托(Fernando Corbató)門下干活,給一種叫作Multics的分時(shí)操作系統(tǒng)項(xiàng)目寫代碼。 轉(zhuǎn)年夏天,他又得到了貝爾實(shí)驗(yàn)室的實(shí)習(xí)機(jī)會(huì),在那里寫匯編語(yǔ)言。 為了方便在Fortran程序中做列表處理,他還寫出了一套函數(shù)庫(kù),他形容這份工作“十分過(guò)癮”。 轉(zhuǎn)眼到了博士畢業(yè),柯林漢被直接留校任教,并在沒(méi)有進(jìn)行面試和研究成果展示的情況下,成為了貝爾實(shí)驗(yàn)室的正式成員,足以見(jiàn)其優(yōu)秀。 而他和Unix的淵源也就此展開(kāi)。 Unix命名人我們現(xiàn)在的大部分服務(wù)器、手機(jī)系統(tǒng)和物聯(lián)網(wǎng)系統(tǒng)的底層基本都是基于Unix。 而三大系統(tǒng)之一的Linux也是一種類Unix系統(tǒng),可以說(shuō),Unix是現(xiàn)代操作系統(tǒng)的源頭之一。 
說(shuō)起來(lái)比較意外,這么一個(gè)重要的操作系統(tǒng),其初代版本被后來(lái)的圖靈獎(jiǎng)得主Ken Thompson僅花3周的時(shí)間就搞定了。 當(dāng)時(shí)的Unix還叫UNICS (Uniplexed Information and Computing System),后來(lái)被柯林漢改成了現(xiàn)在的名字。 Unix中有一個(gè)核心工具,叫做AWK,柯林漢就是其發(fā)明者之一(名稱中的“K”正是代表他)。 AWK作為一種文本處理語(yǔ)言,只做過(guò)濾和轉(zhuǎn)換文本行這一件事,卻成為Unix/Linux平臺(tái)上現(xiàn)有功能最強(qiáng)大的數(shù)據(jù)處理引擎之一。 在Linux系統(tǒng)中,它和grep、sed命令并稱為“三劍客”,并占據(jù)“老大”席位,掌握了它,處理日常操作可以6到飛起。 如今,AWK已經(jīng)分化出三個(gè)版本,依然受到人們的歡迎,誕生45年仍未“退休”。 除了AWK,柯林漢還發(fā)明了AMPL,一種描述并求解大規(guī)模復(fù)雜數(shù)學(xué)問(wèn)題的建模語(yǔ)言,支持世界上大部分的求解器。 還有編譯器Ratfor、文檔編制預(yù)處理器Pic、Grap和數(shù)學(xué)排版語(yǔ)言Eqn等這些重要研究成果背后都有他的身影。 除了寫代碼,柯林漢還很愛(ài)寫書,且誕生了不少經(jīng)典之作。 比如你想了解Unix的歷史,就可以看《Unix傳奇》,作為參與者和見(jiàn)證人之一,他寫的這本書可以讓沒(méi)有足夠?qū)I(yè)技術(shù)背景的人也能欣賞Unix的思想。 
△《Unix傳奇》而文章開(kāi)頭所說(shuō)的“Hello World”范式,則是出自于他與C語(yǔ)言之父丹尼斯·里奇(Dennis Ritchie)合寫的開(kāi)山之作《C程序設(shè)計(jì)語(yǔ)言》。 再比如柯林漢的第一本著作《The Elements of Programming Style》(《編程格調(diào)》),則留下了一個(gè)以他名字命名的定律——柯林漢定律,即: 調(diào)試一段代碼的難度是編寫它們的兩倍。按照這個(gè)定義,如果你的代碼寫得非常巧妙,那你可能沒(méi)有足夠的能力來(lái)調(diào)試它。
(相比于復(fù)雜代碼,簡(jiǎn)單的代碼更可取。因?yàn)檎{(diào)試復(fù)雜代碼的過(guò)程中,任何問(wèn)題都會(huì)十分棘手,甚至無(wú)法解決。) 解決問(wèn)題靠拖延?那么,柯林漢本身是個(gè)什么性格的人呢? 2021年他接受《程序員》采訪時(shí),曾被問(wèn)了這么一個(gè)問(wèn)題: 肯(Ken)用3周創(chuàng)造了Unix,道格(Doug)在幾天內(nèi)就提出了“管道(pipe)”的想法,你們工作效率這么高,有什么訣竅嗎?
(以上兩人都是他在貝爾實(shí)驗(yàn)室的同事) 對(duì)此,柯林漢連連擺手: 他們是“別人家的程序員”,我可從沒(méi)這么高效過(guò)!
老爺子說(shuō)了,遇到新問(wèn)題,他的解決方案通常簡(jiǎn)單粗暴,那就是盡可能地拖延,以及祈禱問(wèn)題消失,或者祈禱問(wèn)題自己解決自己。 
這個(gè)玄學(xué)辦法本身是不能解決問(wèn)題的,但這樣做,柯林漢有足夠時(shí)間消化問(wèn)題,然后想出對(duì)策。 而且,他其實(shí)會(huì)選擇直接動(dòng)手搞定問(wèn)題。 今年1月1日,柯林漢剛好過(guò)80歲生日。 上個(gè)月,油管頻道Computerphile對(duì)他進(jìn)行了采訪,大伙兒才知道,老爺子還在改代碼! 柯林漢說(shuō),沒(méi)有任何一種計(jì)算機(jī)語(yǔ)言或工具是萬(wàn)能的,AWK也不例外。 此前,AWK只適用于ASCII或8位輸入,不能處理Unicode(統(tǒng)一碼)。 
△圖源Youtube頻道Computerphile視頻幾個(gè)月前,柯林漢花了點(diǎn)時(shí)間,折騰了一下AWK——他稱它是“一個(gè)非常古老的程序”——現(xiàn)在AWK可以處理UTF-8輸入和輸出了。 現(xiàn)在,用戶已經(jīng)能用正則表達(dá)式提取日語(yǔ)字符以及類似的東西。 視頻中柯林漢還順口提了一嘴,他修補(bǔ)了一些“又快又臟”的東西,讓AWK可以處理CSV文件。 
△圖源Youtube頻道Computerphile視頻整個(gè)采訪過(guò)程,老爺子依然健談,精神面貌也不賴。 話說(shuō)回來(lái),精力充沛的他,對(duì)幾十歲的“古老程序”改改改,還有啥原因呢? 柯林漢的回答是這樣的: 今天的計(jì)算環(huán)境,和三、四十年前非常不同,內(nèi)存量也大大擴(kuò)充了,“這會(huì)改變你對(duì)AWK的思考方式,尤其是AWK運(yùn)行不起來(lái)的部分”。 所以,老爺子一直偷偷在后臺(tái)玩兒新版本的AWK,目的是盡可能做拓展,讓AWK更容易實(shí)踐和使用。 
這其實(shí)是柯林漢一以貫之的行事準(zhǔn)則,此前,他就在播客CoRecursive中表示過(guò): 如果做些能對(duì)自己有幫助,又對(duì)他人工作有所改善的事,何樂(lè)而不為呢?
有意思的是,世界上沒(méi)有萬(wàn)能工具,也沒(méi)有萬(wàn)能通才。老爺子自己就承認(rèn)說(shuō),他的bug是還沒(méi)完全搞懂Git怎么用。 所以他只能通過(guò)電子郵件,把更改發(fā)送給當(dāng)前的維護(hù)人員。 
△圖源柯林漢的郵件網(wǎng)友:Hacker永不退休80歲高齡還要修改幾十年前寫下的代碼,這位程序員屆卷王的故事再次引起了網(wǎng)友關(guān)注。 自面世起,AWK就廣受歡迎??吹紸WK在今天依然能得到完善,變得更強(qiáng),不少人對(duì)老爺子的敲代碼熱情表示respect。 

有的網(wǎng)友表示了對(duì)老爺子的感激。 
還有人覺(jué)得,為改善程序員寫代碼的環(huán)境不斷付出,是一件很鼓舞人心的事情。 
當(dāng)然少不了玩梗的人。 Hacker永不退休!

One More Thing最后,讓我們回到“Hello, world”。 這句“萬(wàn)物開(kāi)頭”其實(shí)最早是在柯林漢1974年撰寫的《Programming in C: A Tutorial》中首次出現(xiàn),后來(lái)才被合寫進(jìn)那本經(jīng)典之作。 
該書中兩位作者形成的寫代碼風(fēng)格,也被稱為K&R風(fēng)格 (K&R即指柯林漢Kernighan和里奇Ritchie)。 有意思的是,柯林漢表示這本書是自己強(qiáng)行拉著丹尼斯寫的。 至于為什么選擇用“Hello, world”而不是別的,柯林漢自己都記不清了。 在接受福布斯雜志訪談時(shí),他模模糊糊回憶: 可能是因?yàn)榭戳藗€(gè)動(dòng)畫片,里面有一個(gè)雞蛋和一只小雞,小雞說(shuō)了句:Hello,World!

參考鏈接: [1]https://www./watch?v=GNyQxXw_oMQ [2]https:///gadgets/2022/08/unix-legend-who-owes-us-nothing-keeps-fixing-foundational-awk-code/?comments=1 [3]https://www./2022/08/23/universal_unix_tool_awk_gets/ [4]https://www.cs./~bwk/ [5]https:///brian-kernighan-unix-bell-labs1/ [6]https://baijiahao.baidu.com/s?id=1696979082867013424&wfr=spider&for=pc [7]https://github.com/onetrueawk/awk/commit/9ebe940cf3c652b0e373634d2aa4a00b8395b636
|