《程式員》于2000年創刊,其理念為技術改變世界,創新驅動中國,2021年,全新的《程式員》2.0重新起航,以專業的內容為立足點,以音視頻、圖文專欄等豐富的多媒體形式為載體,立足當下,放眼未來,為讀者帶來全方位的技術和產業解讀,
本文為《程式員》2.0第一期內容,與UNIX的開發者之一、UNIX命名者布萊恩·克尼漢(Brian W. Kernighan)暢談技術與人生,

作者 | 《程式員》編輯部
在軟體歷史中,UNIX是一個傳奇,自1969年在貝爾實驗室的閣樓中誕生以來,UNIX的發展遠遠超出了創造者們的想象,它帶動了許多創新軟體的開發,影響了無數程式員,如果沒有它,Linux、macOS和Android系統可能不會存在,人們依賴的導航軟體、智能家電、智能手機、物聯網也會缺失,
近日,《程式員》采訪了UNIX的研發者與命名者布萊恩·克尼漢(Brian W. Kernighan)教授,他也是AMPL(數學編程語言)與AWK(文本處理工具)的共同創造者之一,曾和C 語言之父丹尼斯·里奇(Dennis MacAlistair Ritchie)共同寫作了C語言的第一本著作《C程式設計語言(The C Programming Language)》,我們和布萊恩·克尼漢教授聊了聊UNIX的成功之道,以及作業系統的未來走向,在訪談中,我們驚訝于這位大師的真實和坦誠,也為這跨越半個世紀的史詩般的程式人生所深深感動,
重點速覽:
- 談貝爾實驗室的吸引點:貝爾實驗室研究環境的獨特之處在于沒有“繁重的作業量”,大家都在做自己認為有趣或重要的事情,沒有要求、沒有產品,也沒有可交付的成果,所以一切進度壓力都是員工自己給自己的,
- 談程式員該培養何種技能:一是學習如何寫,二是學習如何說,專業的程式員應該可以熟練掌握幾門語言,并且熟悉5-10種其他的語言,
- 談獨行俠與多人協作:如今的系統規模和環境都龐大且復雜,因此獨行俠式的天才能發揮的作用是十分有限的,但許多大型系統在開始時的規模都非常小,核心貢獻者也非常少,大多數編程語言都是由兩三個人創建的,
- 談C語言中的指標設計:空指標可以說是一個“錯誤”,但我認為,更應該說這是一個在當時很合理的設計選擇,這種設計選擇的代價極其高昂,
- 談面向物件編程:面向物件編程在許多語言中得到了很好的支持,在有的語言中則完全沒有支持,它僅僅是一種編程技術,適合解決某些型別的問題,但或許不是解決其他問題的正確方法,
- 談現代作業系統:現代作業系統需要服務一個更加復雜的世界,所以它們相應地也會更加復雜,
- 談人工智能:利用AI自動生成代碼在某些情況下會有幫助,當我們對某些特定的計算任務理解得足夠透徹,以至于可以自動化生成代碼時,我們就已經取得了很大的進步,
- 談開源:開源使我們可以在他人的作業基礎上進行構建,實作共同進步,我希望開源可以繼續成為世界的重要組成部分,
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傳奇:歷史與回憶》(UNIX:A History and a Memoir)一書寫于2019年,該書的中文版業已問世,你寫這本書一共花了多長時間?有什么想對中國讀者說的嗎?
Brian:這本書的大部分內容是我在2019年夏天的一個長假期間在英國寫的,寫作的程序其實很快,因為我很了解這個主題,而且我還得到了多年來參與UNIX開發的各位朋友和同事的寶貴支持,整個寫作程序都非常有趣,既可以追憶過去的美好時光,也可以和很久沒接觸的朋友聯系,
我衷心希望中國的讀者能在這本書中識訓樂趣,今天的世界與UNIX早期的世界已經大不相同了,但人還是一樣的,書里總結了很多經驗:UNIX是如何產生的、富有創造力的人該如何合作、以及公司該如何有效地管理他們,我認為,這些經驗教訓同樣適用于今天,也或多或少地適用于不同國家的開發者,
《程式員》:關于UNIX的歷史,你還有什么要補充的嗎?
Brian:我很幸運,UNIX早期的日子對我而言是非常美好的,貝爾實驗室的環境很好,我身邊有很多了不起的同事,他們在各個領域不斷地創新,UNIX就是在這種獨特的環境中誕生的,從這個意義上來說,我認為UNIX是獨一無二、不可復制的,但在其他地方一定有人也同樣幸運,可以像UNIX那樣為改變世界作出貢獻,我希望我的讀者都是這樣的幸運兒,
從Unix開發者Brian W. Kernighan,到OpenCV創始人Gary Bradski,再到Vue.js作者尤雨溪……《程式員》2.0第一期以「開發者的黃金十年」為主題,與多位國內外知名的技術領袖和新銳代表進行了深度對話,希望為中國開發者打開新時代的「機遇之窗」,
除了技術引領,我們也希望透過技術對行業進行深入洞察,因此,《程式員》2.0第一期也邀請到了來自快手、滴滴、貝殼找房、作業幫等知名企業的技術負責人,用案例實踐為讀者闡述直播、出行、居住、在線教育等多個行業變革背后的技術架構和技術引擎,
掃描下方二維碼,添加小助手,即刻加入《程式員》2.0「讀者群」,搶先一步獲取雜志最新資訊,精彩內容不再錯過,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275394.html
標籤:AI
