牛!Hello World 發明人 80 歲還在寫代碼
年齡從來不是界限,除非自己拿過來為難自己。
今年 80 歲的 UNIX 核心開發者之一、UNIX 命名者 Brian W.Kernighan,在夏季很多人都在開啟學術休假之際,找到了一些空閑時間。
在這個時間段,他閃現了 1977 年時與好友一起開發的文本處理工具、Linux 及 UNIX 環境中最強大的數據處理引擎 AWK 在 GitHub 的倉庫上(https://github.com/onetrueawk/awk),瀟灑地寫了數百行代碼,提交了最新的 pull request,留言告訴開發者這些代碼可以讓 AWK 實現 Unicode 的支持。
然后事了拂衣去,深藏功與名。
直至近日國外的一個專門聚焦于計算機領域的 Computerphile 頻道在采訪 Brian W.Kernighan 問及他最近主要在干什么時,這位普林斯頓大學計算機科學系教授才低調地分享了近況。
在今年 5 月,他給一位老朋友發了一封郵件,提及自己正在進行在 AWK 工具支持 Unicode 的一些嘗試,Kernighan 說道,“我已經做了相當多的測試,但顯然還需要更多的測試......一旦我找到了方法,我將嘗試提交一個 pull request。我希望我能更了解 Git,但盡管有你的幫助,我仍然沒有正確的理解,所以這可能還需要一段時間。”
UNIX 的開發者之一、UNIX 命名者布萊恩·克尼漢(Brian W. Kernighan)
AWK 是一種數據驅動的腳本語言,它與 grep、sed 一起被稱為 Linux “三劍客”,它也是 UNIX 管道功能和系統間互操作性的關鍵。在功能上,AWK 能為開發者帶來極大的便利,如通過創建非常簡短的程序來讀取輸入的文件、為數據排序、處理數據、對輸入進行計算、生成報表等。
正如上文提及的,AWK 誕生于 1970 年代的貝爾實驗室,其名稱源自研發它的三位計算機科學家,分別是 Alfred Aho、Peter Weinberger、Brian W.Kernighan,其中 K 指的就是 Brian W.Kernighan。
"AWK 只適用于 ASCII,或者 8 位輸入,但它根本沒有真正處理 Unicode,這一直是一個尷尬的問題," Kernighan 在 Computerphile 的采訪中無奈的說道,“直到幾個月前,我花了一些時間來處理一個令人難以置信的老程序。我把這個問題又翻了出來,并解決了它,如今它可以處理 UTF-8 的輸入和輸出,這樣你就可以有正則表達式。"
這一波連續的操作,驚呆了所有的開發者,不僅讓 AWK 這款在更新上沉寂許久的工具再度出現在大眾視野,登上 GitHub Trending 的第 8 位,同樣 Brian W.Kernighan 對技術追求的精神更讓人欽佩。
對于 Brian W.Kernighan 本人,被外人所熟知的是,他還是開發者入門必須敲下的 Hello World 示例代碼的發明者,連 UNIX 的名字也是他取的。在《新程序員 001》中,我們與 Brian W. Kernighan 暢談技術與人生,整個過程中,我們驚訝于這位大師的真實和坦誠,也為這跨越半個世紀的史詩般的程序人生所深深感動。
以下是 CSDN 的《新程序員》與布萊恩·克尼漢(Brian W. Kernighan)教授訪談記錄:
50 年程序人生
《新程序員》:你曾說是理查德·漢明(Richard Hamming)啟發你寫了《UNIX傳奇:歷史與回憶》(UNIX:A History and a Memoir)這本書。那么,在你的職業生涯中,哪個人對你的影響最大呢?
Brian:我主要想提三個人。首先是迪克·漢明(Dick Hamming,漢明碼發明者,“迪克”是“理查德”的非正式稱呼),是他激發了我寫這本書的靈感,并給我提供了各種各樣的好建議,他是我的人生摯友。
其次是道格·麥克羅伊(Douglas McIlroy,著名數學家,UNIX 開發者),他是我見過的最聰明的人之一(我見過非常多的聰明人)。1967年,我在貝爾實驗室第一次實習時就是在他的手下,他曾對我的博士論文的內容和寫作提出了很好的優化建議,我們一起共事了近30年,他在任何領域都是我的“智多星”——編程、寫作、科學、技術、數學等等。
第三個人是林申(Shen Lin)。1968年,我在貝爾實驗室第二次實習期間,和林申一起研究了“圖劃分問題”(Graph Partitioning Problem),這后來也成為了我博士論文的基礎。1969年,當我以正式員工的身份回到貝爾實驗室時,我又和林申一起研究了“旅行商問題”(Travelling Salesman Problem)、以及其他組合優化的問題,甚至還一起完成了一些網絡設計工具。他具備一種驚人的能力,在上手一些小例子之后,就能總結出普適的方法論。如果沒有他,我是無法順利完成論文的。
《新程序員》:從實習到退休,你在貝爾實驗室工作了 30 年,那里最吸引你的是什么?如今在技術領域,跳槽已然成為一件十分普遍的事情,你對此有什么看法呢?
Brian:在貝爾實驗室的時候,我先是實習,然后轉為全職。那是個神奇的地方,在那里,有數以千計的一流科學家和工程師在研究多個領域中有趣又有關聯的各類問題。公司(AT&T,貝爾實驗室的母公司)具備開放、合作的環境和長遠的眼光,所以我們可以用很長的時間(甚至數年)去完成自己想要完成的任何事。因此,大家自然而然地就會在那里一直工作下去,沒有理由要離開。
如今,這種環境已經不存在了,但同時工作機會卻很多,尤其是對于程序員來說,所以人們在短時間內頻繁地更換工作就不足為奇了。雖然這并不是我個人的工作風格,但似乎對很多人而言都是理所應當的。我倒是覺得,盡管這種工作流動性在短期內有一定的好處,但可能也會帶來一些長期的負面影響,比如許多公司內部都缺乏連續性,喪失了一以貫之的企業文化和傳承。
貝爾實驗室給當今企業的啟示
《新程序員》:談到企業文化(Organization Culture),這也是 UNIX 成功的一個重要原因。在這方面,你認為其他企業和實驗室可以從貝爾實驗室中學到什么?假設現在你帶領的團隊工作量很大,并且員工都分散在不同的時區,你將如何確保代碼質量?
Brian:貝爾實驗室研究環境的獨特之處在于沒有“繁重的工作量”,大家都在做自己認為有趣或重要的事情,沒有要求、沒有產品,也沒有可交付的成果,所以一切進度壓力都是員工自己給自己的。因為所有人都生活在同一個地區,因此不存在時區問題。當然,有些人習慣于傳統的白天工作,而有些人則習慣在夜間工作,還有一些人的工作時間很長(比如Ken Thompson),所以他們有時會和白天的人同步,有時會和夜間的人同步。因為所有的程序員都很優秀,所以代碼本身的質量也很高,而且所有的代碼都在文件系統中,任何人都可以讀取并修改;但唯一的要求是,如果你修改了一個程序的代碼,那么你就要對這個程序負責,從而提醒大家要謹慎。
《新程序員》:你曾說,貝爾實驗室創造的所有偉****明都得益于其開放的氛圍和充足的資金支持,但如今的公司往往只注重短期效益。這是否意味著將越來越難以見證 UNIX 這樣偉****明的誕生?目前,公司在研發方面還有其他可行的方式嗎?
Brian:我確實認為,過多地聚焦在短期目標和錢上是現今企業的一個問題。當然,企業必須要完成特定的工作并交付相應的產品,這樣才能有收入維持企業的運轉。但是,如果一切都以短期目標來衡量的話,就沒有辦法去充分地仔細考慮其他選擇,或者尋找更好的行事方式以及為未來投資。然而,和很多事情一樣,這是一個權衡利弊的過程,我們不難發現,許多優秀甚至偉大的產品都來自研發風格截然不同的公司。
《新程序員》:你在書中提到,偉大的項目往往是由個人建立起來的,然而現在的公司往往都更強調合作和頭腦風暴。你認為兩者之間是否存在“矛盾”?還是說前者是只適用于“天才”的行事方式?
Brian:在UNIX的早期階段,程序規模要小得多,所以對團隊的關注度并沒有那么高。同一個項目可能會由兩個人共同完成,但如果三人一組的話就有點多了。工作中必然會產生合作,合作的過程是有機的,而不是由管理層刻意創造的。現在所說的頭腦風暴在過去也有:人們探討各自的想法,在黑板上寫寫畫畫,編寫程序來測試想法。
如今的系統規模和環境都龐大且復雜,因此獨行俠式的天才能發揮的作用是十分有限的。但許多大型系統在開始時的規模都非常小,核心貢獻者也非常少。我們可以想一想編程語言及其編譯器、Linux或各種主要開發工具。不難發現,我們大多數的編程語言都是由一兩個或兩三個人創建的。Linux也是從一個人開始發展起來的。
《新程序員》:UNIX在發展過程中經歷了版本分叉、標準競爭和訴訟,這些也是當今企業不得不面對的成長之痛,你對這些企業有什么建議嗎?
Brian:我認為一個企業總是會很自然地想要通過創造新的、有用的系統、工具、語言和功能來吸引客戶,并且用這些東西來留住自己的客戶。從短期來看這沒什么錯,但從長遠來看,我認為選擇合作會更好。
優秀程序員所具備的能力與素質
《新程序員》:作為一位“傳奇程序員”,你也曾和許多同樣具有傳奇色彩的程序員合作過,那在你看來,一名優秀的程序員應該具備什么樣的素質呢?
Brian:其實說實話,我是一個非常普通的程序員,但我有幸與一些十分杰出的程序員合作過,比如肯·湯普森(Ken Thompson,UNIX 創造者)和丹尼斯·里奇(Dennis Ritchie,C 語言創始人)。尤其是肯(Ken),他似乎具備一種發現事物的統一性和通用性的天賦,這使他的代碼簡單、干凈且功能強大。他的工作效率高得令人難以置信,能夠在短時間內寫出大量優秀的代碼,而且他可以把這些東西全都記在腦子里。他是我認識的最好的程序員。
《新程序員》:肯(Ken)用3周的時間創建了 UNIX,道格(Doug)在幾天內就提出了“管道(pipe)”的想法,是什么讓你們有如此高的工作效率?
Brian:因為他們是“別人家的程序員”,我從來沒有這么高效過!當然,肯(Ken)和道格(Doug)(以及其他一些人)確實是有天賦的,但我認為,他們的生產力有一部分來自于他們過去大量的工作經驗,對于一些工作他們已經形成了條件反射,從而可以非常有效地創造新事物。
《新程序員》:在遇到麻煩或新問題時,你的解決風格是怎樣的?是如何建立自己的思維體系的呢?
Brian:這個問題很籠統。我沒有什么特別的方法,但如果可能的話,我會盡可能地拖延,祈禱問題消失或自行解決。當然,這種方法也不一定總會奏效,但它確實讓我的潛意識有機會來消化這個問題,這對編程是非常有幫助的。
《新程序員》:對于軟件工程師來說,在職業生涯的不同階段需要培養什么樣的技能或心態呢?
Brian:下面這兩個技能,不僅僅是對軟件工程師,對每個人而言都很重要。一是學習如何寫,二是學習如何說。如果你能寫好、說好,并且能有效地把技術語言傳達給非技術人員的話,這將在你一生的職業生涯中發揮難以想象的價值。同時,我還認為,要對“有趣”或“值得學習”的事物保持開放的心態。不要讓自己變得狹隘,要保持廣泛的興趣。法國偉大的科學家路易斯·巴斯德(Louis Pasteur)曾說過:“機會是留給有準備的人”。所以,你看的東西越多,想的東西越多,探索的東西越多,你就越有可能在某件事上變得越幸運。
未來操作系統猜想
《新程序員》:一般來說,我們將 MULTICS 和 UNIX 的誕生看作是現代操作系統的起源。你認為操作系統發生了哪些變化?你對現在的主流操作系統,比如Windows、macOS、Android、iOS 等有什么看法?
Brian:對這個問題我其實沒有什么看法。但是由于現代操作系統確實需要服務一個更加復雜的世界,所以它們相應地也會更加復雜。例如,現在的處理器通常都是多核的,所以多處理成為了操作系統的一部分,這與50年前截然不同。現在內存比以往要大得多,外設也更多。網絡也逐漸凸顯了其重要性。就我個人而言,因為我用的是MacBook,所以使用macOS系統,但我大部分時間只用它來運行標準的UNIX命令。我有一部Android手機,但是手機編程太不好玩了,所以我也就沒怎么嘗試了。
《新程序員》:隨著云計算、人工智能和量子計算的發展,會不會對操作系統提出新的要求和挑戰?會不會出現新的操作系統概念?
Brian:因為我不是很了解量子計算,所以可能沒辦法給出有價值的看法。但我認為人工智能并不會改變我們對操作系統的看法。如果云計算使用起來更容易一些的話,人們可能會說它只是50、60年前出現的MULTICS和UNIX等分時操作系統的現代實現。所以我想說,這并不是一個新概念,只是一個舊概念的新版本。
《新程序員》: 你曾預言,對于編程而言,語言將會更容易且更安全。就這一點而言,這特定的“語言”會是什么呢?Rust 或者是更多面向應用程序的語言,比如JavaScript、TypeScript、Dart、Swift、Julia 或其他語言?
Brian:如今的大部分編程語言都更安全、簡單,這是批量的而非單一的。每種語言都有其最適合的任務類型,比如適合嵌入式系統和高效庫實現的C語言,適合大型系統的C++,以及適合作為簡單通用語言的Python,等等。我想,專業的程序員應該可以熟練掌握幾門語言,并且熟悉5~10種其他的語言。舊的語言永不會消亡,它們中的大多數都還在繼續發展,當然,有一些程序的嵌入式系統基礎太大、太復雜,難以重寫。但是,人們在創造新語言方面有著無窮的創造力,他們希望這些新的語言能夠取代舊的語言,但這從未實現過。
《新程序員》:指針(Pointer)是 C 語言的重要組成部分,程序員需要對內存進行管理,這對于初學者甚至是高級程序員都是十分困難的。ALGOL 的創建者之一東尼·霍爾(Tony Hoare)稱,空指針(null-pointer)是他的一個“10億美元的錯誤”,你認為它在語言設計上是一個錯誤嗎?
Brian:在1972年前后C語言被創造出來的時候,計算機的速度比今天慢了一百萬倍,內存也比今天少了一百萬倍。此外,C語言的目的是取代匯編語言來編寫關鍵的系統程序,最終取代操作系統本身。因此,這種語言必須簡單且高效,它必須使程序員能夠表達所有的計算,包括訪問位置為0的內存。當然,大多數程序員從來不會刻意這么做,都是不小心做的(我們都做過很多次)。所以空指針可以說是一個“錯誤”,但我認為,更應該說這是一個在當時很合理的設計選擇。只不過隨著計算機的功能越來越強大,當然,也隨著越來越多天賦不如丹尼斯·里奇(Dennis Ritchie)和肯·湯普森(Ken Thompson)的程序員編寫C代碼,最終證明,這種設計選擇的代價極其高昂。
《新程序員》:你曾提到過:“在計算領域中只有兩個真正的問題:計算機太難使用和太難編程”。你認為人工智能(自動生成代碼)的進步會讓編程變得更簡單嗎?
Brian:現在談論現代人工智能的發展還為時過早,但我猜想利用AI自動生成代碼在某些情況下會有幫助。當我們對某些特定的計算任務理解得足夠透徹,以至于可以自動化生成代碼時,我們就已經取得了很大的進步,編譯器就是一個很好的例子。所以我想也會有類似的情況,一個程序可以從程序中學習如何編寫新的程序。但是!別問我細節。
《新程序員》:你是否能預見面向對象編程(Object-Oriented Programming)未來的發展?或者說它是否已經進入了穩定停滯期?
Brian:面向對象編程只是組織計算的一種方法,但肯定不是唯一的方法。它在許多語言中得到了很好的支持,在一些語言中得到了部分支持,而在有的語言中則完全沒有支持。但我并不認為它是一種獨立的事物,僅僅是一種編程技術,它適合解決某些類型的問題,但或許并不是解決其他問題的正確方法。當然,當人們真的要使用它時,仍然要好好地加以利用,以避免深度且脆弱的類層次結構,這需要技巧和練習。
《新程序員》:你如何看待“開源”的發展及其對世界的影響?它在未來將走向何方?在這個過程中,特別是對于中國的開發者來說,有哪些值得期待的呢?
Brian:開源是一件非常好的事情,并且對軟件行業的發展至關重要(現在幾乎所有東西都和開源有關)。如今我們其實已經取得了很大的進步,主要的軟件系統,如操作系統、編譯器和工具都可以作為高質量商品免費提供。開源使我們可以在他人的工作基礎上進行構建,實現共同進步。雖然我無法準確地預測未來,但我希望開源可以繼續成為世界的重要組成部分。而且,我強烈希望中國的程序員們能夠為現有的項目作出貢獻,并創建出更多的新項目。
One More Thing
《新程序員》:關于 UNIX 的歷史,你還有什么要補充的嗎?
Brian:我很幸運。UNIX早期的日子對我而言是非常美好的。貝爾實驗室的環境很好,我身邊有很多了不起的同事,他們在各個領域不斷地創新。UNIX就是在這種獨特的環境中誕生的。從這個意義上來說,我認為UNIX是獨一無二、不可復制的,但在其他地方一定有人也同樣幸運,可以像UNIX那樣為改變世界作出貢獻。我希望更多人都是這樣的幸運兒。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。
負離子發生器相關文章:負離子發生器原理






