純純的Linus
Linus Torvalds 傳記 By 池建強
時間 2014-07-10 16:55:27 Chenjunlu's Blog原文http://www.chenjunlu.com/2014/07/linus-torvalds-biography/
在很久很久以前,我寫過一個 Linus 的系列,當時收穫了一籮筐的好評,我一邊清點戰果,一邊手撫刀鋒信誓旦旦的要把這個系列一口氣寫完,然後……這口氣延續了很長時間,直到今天,由於不可抗拒的原因,我需要把這個坑填滿。
而你們,我最親愛的讀者,我最信任的人們,居然沒有人提醒我完成這個系列,你們對得起誰?今天我把之前寫的五篇文章通讀了一遍,去除了碎碎念和無畏的文字,形成了半篇完整的文章。讀的過程中我時不時擊節讚歎:這部分寫的太他媽好了,還有那兒……這也從側面證明了,我在寫作的道路上依然是一個二把刀!
下面請欣賞這篇長文,如果能讀到最後……
每個人桌面上一臺電腦,這曾經是無數計算機先驅的夢想,這個夢想很早就實現了,在1997年,喬老師和比老師就說過,「比爾,我們共同控制了100%的桌面系統市場」,當然喬老師沒說的是,比老師控制了97%,喬老師還不到3%。時至今日,喬老師走了,比老師頹了,移動終端把傳統的 PC 市場衝擊的七零八落。普通使用者都知道了Windows、Android、OS X 、iOS、BlackBerry等等,但是,他們依然不瞭解的是另一款在計算機發展史上起到了革命性作用的作業系統:Linux!
當大家使用 Google 搜尋時,使用 Kindle 閱讀時,使用淘寶購物時,使用 QQ 聊天時,很多人並不知道,支撐這些軟體和服務的,是後臺成千上萬臺 Linux 伺服器,它們時時刻刻都在進行著忙碌的運算和資料處理,確保資料資訊在人、軟體和硬體之間安全的流淌。可以這麼說,世界上大部分軟體和服務都執行在 Linux 作業系統之上,神馬雲端計算、大資料、移動網際網路,說起來風起雲湧,其實沒有 Linux 全得趴窩(微軟除外)。
但是,Linux 和它的締造者 Linus Torvalds 一樣低調,這麼牛逼的一個物件,居然只有程式設計師知道它的傳奇,這不科學!所以我準備在這個系列中寫寫Linus Torvalds:他是 Linux 和 Git 的締造者,他是一個傳統的黑客,與沃茲一樣,少年成名,崇尚自由,一生只為尋找歡笑,他,是一個真正的程式設計師。
注:為了防止大家把 Linux 和 Linus 搞混,我在後面的文章中統一採用 Linus 的中文譯名:李納斯。
李納斯在2001年出過一本自傳,叫做《Just for Fun》,是他和大衛·戴蒙合著的,當年我有幸讀到這本書,瞭解了很多李納斯的生平軼事,那時我就琢磨,這個天才已經達到人生的巔峰了吧,結果這位兄臺並未停止前進的步伐,轉手就在2005年搞出了分散式版本控制系統 Git,目前幾乎全世界的程式設計師都在用 Git管理他們的程式碼,著名網站 Github 就是基於 Git 構建的。無論是 Linux 還是 Git,得一即可得天下,結果這哥們以一己之力發起了倆專案,而且都是主力開發人員。最終的結果是,成全了程式設計師,陶冶了使用者,造福了一方百姓。正如李納斯自己所言:「My name is Linus, and I am your God.」
Linus(一)——生命的意義
1969年末,李納斯出生於芬蘭的赫爾辛基市,算是趕上了60後的尾巴。小時候他是個其貌不揚的孩子,除了一個鼻子長的「富麗堂皇」之外乏善可陳。他為了讓鼻子看上去小一些,經常戴上眼鏡就不願意摘下來,這個策略和現在的很多大臉女生購買三星的 Galaxy Note 手機有異曲同工之妙。幼時的李納斯不修邊幅邋里邋遢,不怎麼費勁數學和物理就學得極好,社交圈卻一塌糊塗,他母親經常和別人說,這孩子非常好養,只要把他放到一個有電腦的小黑屋裡,然後再往裡扔點薯條和義大利麵,就行了。李納斯對此表示認同。
李納斯把年幼的自己定位成 Nerd(書呆子),但是從他的自傳裡我卻感受到了這位天才的有趣之處。他在書的前言裡寫到:
我對生命的意義有種理論。我們可以在第一章裡對讀者解釋生命的意義何在,這樣就可以吸引住他們。一旦他們被吸引,並且付錢買了書,剩下的章節裡我們就可以胡扯了。(注:做人要厚道啊)
關於生命的意義,李納斯的解釋是,有三件事具有生命的意義。它們是你生活當中所有事情的動機。第一是生存,第二是社會秩序,第三是娛樂。生活中所有的事情都是按這個順序發展的,娛樂之後便一無所有。因此,從某種意義上來說,生活的意義就是要達到第三個階段。你一旦達到了第三個階段,就算成功了。但首先要越過前兩個階段。
為什麼李納斯會這麼說呢,我摘段原文給大家看看,非常有趣:
李納斯:我給你舉個例子來說明這一觀點。最明顯的是性,它開始只是一種延續生命的手段,後來變成了一種社會性的行為,比如你要結婚才能得到性。再後來,它成了一種娛樂。
大衛:性為什麼是娛樂?
李納斯:好吧,我是在對牛彈琴。我舉一個別的例子。
大衛:別別,還是說說性吧
李納斯:它是在另一個層次上的blablabla……
大衛(自言自語):哦,參與就是娛樂,而不是在一旁觀看。好,我明白了。
那生存、社會秩序和娛樂又是如何與技術扯上關係的呢?
Linus(二)——天才也瘋狂
李納斯是這麼解釋的,技術的誕生同樣是為了人類的生存,而且是為了讓人生活的更好。汽車讓人跑的更快,飛機讓人飛得更高,網際網路讓人懂得更多,手機讓人通訊更快,一旦這些技術成了規模,就要併入社會秩序,然後下一個階段就是娛樂,別看手機現在就是個打電話的工具,但是很快會進入娛樂階段……(12年後的今天,手機已經徹頭徹尾變成了一個娛樂工具,打電話反而成了附屬功能)。
李納斯說:「一切事物都將從生存走向娛樂,但這並不意味著在某個區域性地區沒有倒退的現象,而且毫無疑問許多地方都有這種情況。有時事物的發展往往分裂的。」
從這些內容我們可以看出,李納斯有自己的一套理論,而且能自圓其說,其實每個人都有自己的理論,一件事做或者不做,都是自己說服自己,每一次進步,要麼是推翻自己的理論,要麼是完善自己的理論。李納斯在很小的時候就建立了自己的理論領地,那就是數學、物理、邏輯,最後是計算機,所以他絕不是自己描述的 Nerd,而是一個大智若愚的牛娃,就像射鵰裡的郭靖一樣,看著傻,其實比誰都精,腦子裡裝的都是十年二十年後的事兒。而且李納斯比郭靖牛的地方是,就一個啟蒙老師,還是自己的外公,和郭靖一比,高下立判!李納斯基本上就是個自學成才的典範。
李納斯的外公是赫爾辛基大學的一位統計學教授,數學家。他有一臺Commodore VIC-20計算機(Commodore 是與蘋果公司同時期的個人電腦公司,曾經創造過一系列輝煌,1994年破產),這臺電腦的主要功能就是沒有功能,你唯一能做的事情就是用 Basic 語言在上面編寫自己的程式,老爺子當年就是這麼做的,比如做一些數學運算和公式計算等。但是老爺子年老眼花,也不願意打字,於是就把自己的外孫李納斯放在腿上,讓他幫助錄入寫在紙片上的程式。這種很有場面感的場景一再出現後,李納斯除了對數學有了初步的認識,同時也把計算機玩的嫻熟,很快他就在外公的指導下開始編寫自己的程式。
評:很多大師級的人物,很小的時候就能在某個領域內頭角崢嶸,展現出一些東西,然後經過長期的練習和創作,最終成為一代傳奇。在這個過程裡,環境是很重要的,逆境出人才基本上是個偽命題,這句話唯一的作用就是遇到困難時給自己打打雞血。李納斯就是個高知子弟,10歲人家就開始玩計算機了,我們10歲在幹什麼,打沙包麼?甩方寶麼?即使你在計算機方面有出眾的天賦,但18歲以前連計算機的面兒都沒見過,你就只能默默的牛逼了。等你真正開始展現出自己才華的時候,人家作業系統已經開發出來了,一入世就差別人十年的身位,除了冷冷的絕望,你還能感受到什麼?
所以現在人們沒事就北上廣深杭,不是喜歡人多嘴雜空氣差,而是在這些一線城市可以接觸更多的人和事物,見更高的山,渡更寬的河。不是為了情懷,而是擁有格局。見都沒見過,還同一個起跑線呢,一跑就得趴窩。所以,無論這些地方環境多惡劣,競爭多激烈,來的永遠多過走的,不為別的,只是為了緩解些許絕望的感覺……
李納斯用外公的計算機學會了 Basic 語言,並開始編寫各種簡單有趣的遊戲,然後他又發現了 Basic 並不是計算機唯一能理解的語言,在它的下面,還有一種語言是由0和1組成,可以直接被計算機識別,於是李納斯又開始用機器碼程式設計,這次他可以控制更多計算機的細節,他與機器變得更加親密。然後李納斯就開始上中學了,中學的幾年於他而言,其實沒有太大變化,因為那些年他幾乎都是坐在電腦前面度過的,在這個階段,他熟練的掌握了組合語言。
終於有一天,李納斯向程式設計世界挺進的步伐變得緩慢下來,因為他上大學了,原因之一是他必須集中精力讀書,原因之二是找不到什麼專案去做。還有一件事,李納斯開始服兵役了,那段時光對他來說是如此特殊:
在手執武器上了一個月的「體育課」之後,我便覺得在我有生之年完全有資格從此一動不動,享受平靜的生活了。惟一可做的事情就是把編碼打入鍵盤,或者手裡端著一瓶比爾森啤酒!
Linus(三)——改變一生的書籍
終於,讓李納斯痛苦不堪的兵役終於結束了,除了敲鑼打鼓歡慶重生之外,他開始繼續擴充自己的程式設計之路,這時候,生命中最重要的一本書出現了,書的名字叫做《作業系統:設計和實現》,作者是 Andrew S. Tanenbaum。用李納斯的原話表述就是「這本書把我推上了生命的高峰」。
那個時代 Unix 已經開發出來了。最早 Unix 是用匯編寫的,開發過程中 Unix 的兩位創始人Ken Thompson 和 Dennis Ritchie覺得用匯編寫程式實在是太苦逼了,男人應該對自己好一點!於是老哥倆決定用高階語言來完成下一個版本,他們首先嚐試了Fortran,失敗!然後又基於BCPL(Basic Combined Programming Lanugage)建立了 B 語言,B 語言可以被認為是那個時代的解釋型語言,不能直接生成機器碼,效率上完全沒法滿足系統的需求,再次失敗!我們都知道,一再失敗的情況下總會有一位英雄人物挺身而出,這次是 Dennis Ritchie,他從失敗的大坑中爬起來拍拍土抹抹淚,繼續對 B 語言進行改造。這次 Dennis 為 B 增加了資料型別,並讓 B 語言能夠直接編譯為機器碼,然後又為這門語言起了個極其響亮的名字:「New B」,讀一讀神清氣爽,念一念氣衝雲霄,從此一代語言巨星冉冉升起,40年後依然排在兵器排名榜第一位,怎一個牛字了得!當然,Dennis可能考慮了十幾年後中國人民的感受,把「New B」改為了 C 語言,並用 C 語言重新編寫了 Unix 的核心,Unix 與 C 從此珠聯璧合,長相思守,再也無法分離。
作業系統、Unix 和 C 語言可以說是李納斯心目中神山上的三座聖盃,為了至高無上的榮耀,他首先要攀上峰頂,把這三座聖盃捧在手中,然後再琢磨建造自己的宮殿的事兒。在那一年的夏天,李納斯開始了高強度的閱讀和學習,用他的話說就是做了兩件事,「一件事是什麼都沒做,另一件事是讀完了719頁的《作業系統:設計和執行》。那本紅色的簡裝本教科書差不多等於睡在了我的床上」。
李納斯認為,Unix 是一個簡潔、乾淨的作業系統,在 Unix 上的大部分任務都是通過一些基本操作完成的,這些操作被成為「System Call」,顧名思義,這些操作就是你對系統的呼叫,系統通過響應你的呼叫完成工作。比如 fork、clone(建立子程式),比如 open、close、read、write(檔案訪問)。這些基本的系統呼叫通過組合可以完成大部分功能。同時,Unix 還提供了極為強大的IPC(程式間通訊)方式:pipe(管道)。很多工作在GUI(圖形介面)軟體環境下的讀者,最常用的IPC操作可能是複製、貼上、滑鼠拖拽,這些操作雖然簡單,但是必須由人來完成,想要自動化就很困難。而這些在 Unix 上實現起來就像大自然一樣自然,你只需要在程式之間開闢出一段緩衝區作為管道,然後父程式和子程式就可以通過這個管道實現程式間通訊了。舉個例子,以前給大家介紹的查詢歷史命令的指令碼,就利用了管道的功能,如下:
history | grep apache
這行命令的含義就是查詢包含 apache 的歷史命令,其中特殊字元【|】用來告訴命令列直譯器(Shell)將前一個命令的輸出通過「管道」作為接下來的一行命令的輸入,就這樣,一個簡單的程式間通訊就完成了。
總之,李納斯在讀完這本書之後,就像郭靖修習了九陰真經全本一樣,對機器和程式碼的世界有了更為透徹的認知,接下來的事情就是等待一個打造傳奇的機會。
等待的過程中,李納斯也沒閒著,他又開始程式設計了。好的程式設計師對程式設計的喜愛是溢於言表的,以下摘錄一些李納斯的程式設計感想:
對於喜愛程式設計的人來說,程式設計是世界上最有趣的事,比下棋有趣得多!因為你可以自己制訂遊戲規則,而你制定什麼樣的規則,也就會隨之出現與此規則相符合的結果。
在電腦世界中,你就是創世者,你對所發生的一切擁有最終的控制。如果你功力深厚,你可以是上帝――在一個較小的層面上。
你可以建築一個這樣的房子,有一個活板門,既穩固又實用。但是每個人都可以看出一個僅僅以堅固實用為目的的樹上小屋和一個巧妙地利用樹本身特點的美妙小屋之間的差異。這是一個將藝術和工程融為一體的工作。程式設計與造樹上小屋有相似之外……在程式設計中,實用的考慮往往被置於有意思、美觀優雅或有震撼力的考慮之後。
在程式碼的世界裡,李納斯就是一個詩人!
Linus(四)——Linux 誕生
Unix 始於上個世紀60年代,在70年代得到了迅猛的發展,這時候的李納斯還躺在祖父公寓裡的搖籃裡睡大覺,如果不是後來 Unix 王國自亂陣腳,出現陣營分裂和法律糾紛,可能 Linux 系統根本都不會出現。真實的情況是,Unix 浪費了大把的時間和機會,似乎就是為了等待這個大鼻子、頭髮紛亂的芬蘭小子長大,然後一決高下。李納斯贏得了自己的時間,他一刻不停的磨練自己的技藝,在清晨的微光中練習演算法,在赫爾辛基的雪山上編譯程式碼,隨時隨地補充的糧草和武器。二十一年之後,李納斯撫著雪亮的刀鋒上路了,他要去追尋屬於程式設計師的最高榮耀。
1991年一月,李納斯花費了三千五百美元,分期付款購買了一臺雜牌組裝電腦,記憶體4兆,CPU 33兆赫,還有一臺14英寸的顯示器,然後又買了 MINIX 作業系統,用十六張軟盤把這個作業系統裝到了計算機裡。之後,李納斯又用了一個月的時間,瞭解了 MINIX 的好和不好,並把這個系統改裝成了自己得心應手的「戰鬥機」,開始了戰鬥的人生。就是在這臺電腦上,催生了 Linux 的初始版本。
Linux 的誕生離不開 MINIX,MINIX 是 Mini Unix 的縮寫,是 Andy Tanenbaum 教授編寫的迷你版的 Unix 作業系統,原始碼可以提供給大學和學生,用於作業系統教學,採用了微核心設計。其中的程式碼還作為《作業系統:設計與實現》的示例程式,這本書我們在 Linus(三)中提到過,給了李納斯極大的啟發。
李納斯使用了 MINIX 之後,發現這個系統有很多缺陷,比如效能問題、核心問題、檔案系統問題,最大的問題是終端模擬器,也就是我之前總提到的 Terminal,登入學校裡的 Unix Server 和上網時,李納斯都需要終端,但是 MINIX 無法滿足這個需求。如果普通人遇到這種問題,估計就是發會呆然後洗洗睡了,或者說「你行你上啊」,李納斯不是普通人!
他決定拋開 MINIX,從硬體層面開始,重新設計一個終端模擬器。牛人就是不同凡響,這個決定表明了李納斯需要從 BIOS、CPU等硬體層面重新開發出一套系統,除此之外,還需要了解如何把資訊寫入顯示器,如何讀取鍵盤輸入,如何讀寫調變解調器,早期儲備的組合語言和 C 語言能力終於派上了用場……
兩個月之後,終端模擬器完成,對此李納斯非常驕傲:
對於我了不起的成就,薩拉(妹妹)是瞭解的。我把終端顯示給她看,她盯著顯示器看了大約五秒鐘,看著上面是一串A和一串B,說了聲「很好」,然後就沒有然後了。我意識到我的成就並不輝煌,這猶如你指給人看你鋪設的一條長長的柏油馬路,但想向別人解釋這條馬路的意義是完全不可能的。
當時是三月,也可能是四月,就算彼得蓋坦街上的白雪已經化成了雪泥我也不知道,當然我也並不關心。大部分時間我都穿著睡衣趴在相貌平平的計算機前面噼噼啪啪的敲打鍵盤,窗戶上的窗簾遮得嚴嚴實實,把陽光和外部世界與我隔離開來。
Linux 作業系統就這樣開始了,一發不可收拾。李納斯的當時程式設計狀態是這樣的:程式設計――睡覺――程式設計――睡覺――程式設計――吃飯――程式設計――睡覺――程式設計――洗澡――程式設計……
實現了終端模擬器之後,李納斯馬不停蹄,開始新增磁碟驅動和檔案系統,那一年李納斯還在上課,但是課程很簡單,他唯一的課外活動就是參加每週三晚的同學聚會,這個長著大鼻子的技術天才,常常會因為擔心自己缺乏社交能力和容貌醜陋而失眠,對那時的他來說,唯一有趣的事情就是把驅動程式寫出來。於是他咬咬牙對自己說,還得幹下去。(看來沒有女神的好處就是可以寫個作業系統出來,然後把自己叫做 上帝)。
隨著工作的進展,終端模擬器正在開始向一個作業系統的方向發展,李納斯顯然也看清楚了這一點。
在整個創造 Linux 的過程中,我們沒有看到李納斯使用了什麼樣高階工具,估計那時也沒有,整個系統基本上是一行行程式碼敲出來的,純手工打造,這些先賢的程式設計功底和效率讓我們歎為觀止,所以,現在,我決定開啟終端,輸入 vi,然後鍵入:to be continued,感受一下李納斯當年程式設計的風采……
隨著李納斯不斷的敲擊鍵盤,他的終端模擬程式也不停的擴張,從剛開始的小樹苗長成了一株盤根錯節的大樹,樹根牢牢的抓住土地,枝丫努力的伸向天空,花朵和果實開始在高遠的天空中爍爍發光,所有的細節都在李納斯的掌控之中。懂行的技術人員都看得出來,這個大鼻子的芬蘭小子是準備開發一個作業系統啊。
是年6月份,李納斯基本確定了要開發一個作業系統核心的計劃,並開始著手蒐集 Unix 作業系統標準的相關資料。1991年7月3日,格林威治時間上午10點鐘,李納斯在 MINIX 新聞組發出了一封求助郵件,尋求有關 Posix 標準的幫助,他在郵件中寫道:
目前我正在 MINIX 系統下做一個專案,對 POSIX 標準很感興趣。有誰能向我提供一個機器可讀的最新的 POSIX 規則?如果能有個 FTP 地址就更好了。
這份公開的郵件是標識 Linux 問世的最早證據。郵件發出後不久,有人就寄來了厚厚的 POSIX 標準,同時赫爾辛基工學院的 Ari Lemke 也對李納斯的郵件做出了響應,為李納斯提供了一個 FTP 地址,用來上傳他即將完成的作業系統。
注:POSIX 全稱是可移植作業系統介面(Portable Operating System Interface)。IEEE 最初制定 POSIX 標準,是為了提高 UNIX 環境下應用程式的可移植性。隨著技術的發展,POSIX 開始不侷限於 UNIX 系統,後續的 Linux 和 Windows NT 都部分的遵循了該標準。POSIX 在李納斯開發的過程中起到了燈塔的作用,直接後果就是 Linux 系統從一開始就走在了正規軍的康莊大道上,基本沒有跑偏過。Linux 幾乎可以適配各種型別的硬體體系結構。
標準和 FTP 地址都有了眉目,李納斯開始實現各種 System Call,以便讓 Shell 執行起來。這段時間的工作讓李納斯時常感到灰心喪氣,看著增加的程式碼量,工作似乎前進了一大步,但是檢驗一下功能又彷彿沒有任何進展。有時候他還不得不放棄之前的想法和已經完成的程式碼實現,另闢蹊徑重頭再來,即使是在天才面前,程式碼也能讓人歡喜讓人憂。
終於 Shell 已經可以在新的作業系統上工作了,李納斯開始編寫拷貝(cp)和列表(ls)等程式。Shell 程式一旦完成,就好像完成了從0到1的飛躍,一切都變得無比順利,李納斯面前彷彿出現了一條陽關大道,一切都豁然開朗了,他說,要有光,於是就有了光。對於這種狀態,李納斯表示:「我很滿意」,並且開始用「Linux」稱呼這個作業系統。
這種滿意非常重要,因為那個夏天李納斯除了伏在電腦面前噼噼啪啪的敲擊鍵盤,什麼都沒做。芬蘭四月到八月的日子是一年中最美好的時光。人們到佈滿小島的海上航行,去海灘上曬日光浴,到夏日小木屋中消遣時光。但是李納斯,他只是在永無休止的編寫程式,忘記了白天和黑夜,黑色的窗簾遮蔽了燦爛的陽光,也遮蔽了外面的世界。他唯一的想法就是,得趕緊把這該死的系統做出來!
1991年8月25日,李納斯在MINIX 新聞組上發郵件做了一個調查,想知道大家希望這個新的作業系統具備什麼特徵。
1991年9月17日,李納斯把已經完成的新作業系統上傳到了Ari Lemke提供的 FTP 伺服器上,並準備用「Freax」作為作業系統的最終代號,結果遭到了Ari Lemke的激烈反對。Ari Lemke對李納斯說:
「李哥,您咋會想到用這麼變態的名字命名作業系統呢?原來的Linux不挺好的嘛」
「那樣不會顯得自戀麼?」
「您這樣就不對了,作業系統是開天闢地的大事,人民群眾都等著用您的名字命名呢,看看他們的眼神,您能辜負他們的期望嗎?Linux 天生不就是用來了 Unix 遙相呼應的麼?這是命,得認!」
「這……那我就不推辭了啊」
以上為意譯,不過基本上和古代皇帝的黃袍加身是一個意思。新的作業系統最終以「Linux」命名,並在10年後名揚天下,20年後統治伺服器領域,可謂 Linux 恆久遠,Linus 永流傳。
Linux 核心0.01版本終於釋出了,雖然漫長的開發過程才剛剛開始,但李納斯終於可以鬆口氣了:
瞧,我真的做出了點什麼。我沒有在騙你們。這就是我所做的……
創造作業系統,就是去創造一個所有應用程式賴以生存的基礎環境――從根本上來說,就是在制定規則:什麼可以接受,什麼可以做,什麼不可以做。事實上,所有的程式都是在制定規則,只不過作業系統是在制定最根本的規則。——李納斯
Linus(五)——繼續前行
Linux 從一誕生就被打上了開源的烙印,這一點對 Linux 的後續發展起到了至關重要的作用。從1991年核心0.01版本釋出,到1994年1.0版本閃亮登場,世界各地無數的開發者為 Linux 提交了程式碼,李納斯為 Linux 建立了討論組 comp.os.linux,全世界愛好開源和 Linux 的程式設計師與黑客都在上面討論問題,他們就像群蜂築巢一樣,不斷的通過個體和群體的力量交替推進 Linux 的飛速發展。
李納斯對自己說:嗯,沒有任何東西可以阻擋 Linux 的普及!
這種感覺估計很多程式設計師都體會過,當你設計的演算法得出了正確結果的時候,當你自以為解決了一個海森堡 bug(Heisenbug,表示不可重現)的時候,當你完成了一段精妙程式碼的時候,你摘下厚重的眼鏡,推開鋪滿灰塵的書桌,開啟辦公室唯一的窗戶,迎著夕陽把一隻廢棄的圓珠筆扔出窗外,然後衝著天空大喊:還有誰~~~?這是一種拔劍四顧心茫然的情懷。
李納斯還不止於此。他不僅單槍匹馬寫出了 Linux 的核心,而且做出了開源的決定。他把 Linux 放到了網際網路上,並且允許那些希望使用和改進它的人們根據開源協議修改和提交原始碼。這兩點對網際網路的影響是極其深遠的,估計李納斯當年也沒有想到,當時的兩個小小的漣漪,經過時間和空間的放大,十幾年後形成了一股網際網路巨浪,到現在 Linux 依然處於風口浪尖。
對於 Linux 取得的成功,李納斯將其歸結為是由自己的缺點導致的:
1、 我很懶散 2、 我喜歡授權給其他人
其實這兩個所謂的缺點,正是優秀程式設計師和領導者必備的要素,它們讓 Linux 成為世界上最大的開源協作專案,為喜愛 Linux 的人們帶來了最美好的技術和應用,現代的網際網路幾乎是執行在 Linux 之上的,可以說,李納斯改變了世界,你每一次伐開心後在淘寶上買包包,都有李納斯貢獻的力量!
Linus(六)——來到矽谷
1996年的春天,Linux 順利釋出了2.0版本。是年李納斯27歲,這個芬蘭小子已經慢慢厭倦了芬蘭平淡無奇的日子和不眠不休的程式設計生活。對於一個技術天才來說,創造一套新的技術體系就像藝術家完成一個雕像一樣,當一塊粗礪的岩石在他的親手打磨下逐漸顯山露水,展現出其完美容顏的時候,後續的修修補補會讓這些天才產生倦怠的感覺。他們需要更快的劍,更高的山和更強大的對手。尤其是期間李納斯訪問過兩次美國之後,這種感覺變得愈發不可阻擋了。
說起來美國確實是個神奇的國度,這樣一個移民國家中,居住了各種從不同國度不遠萬里跨海而來的種族,每個種族無論在基因上還是文化上都具有原來國家的特質,這些特質相互融合與對抗,讓這塊大陸上的人民更銳意進取,更開放,更自由,他們願意去追求和接納美好的事物,最終一不留神把美國搞成了世界文化的大熔爐,而開放的文化和環境又極大的激發了人們的想象力和創造力,近代和現代的科技成果幾乎全部源於美國,要麼是美國人搞的,要麼是外國人在美國搞的。所以有時候我們也不用顧影自憐,嘲笑自己沒有國產的作業系統和程式語言,因為其他國家也沒有,或很少有,芬蘭好不容易出了個天才少年,也沒好好珍惜,最終落了個「流落」異國他鄉的下場。
李納斯一到美國就被這塊新大陸吸引了,一切都是那麼的新鮮和美好,他的感受與你第一次出國後在微信朋友圈發的「天是那麼的藍,雲是那麼的白」是一樣一樣的。李納斯在自傳中寫道:
我所參觀的摩門教堂已有一百五十年的歷史,卻被照顧的很好,清洗後的教堂顯示出亮麗的白色。要是在歐洲,所有的教堂都顯得老舊不堪,像是蒙上了一層歲月的斑痕。看著這潔白亮麗的教堂,我腦海裡產生的唯一聯想竟然是迪斯尼樂園。因為它看起來太像是童話故事中的城堡,而不太是一個教堂了。
我記得自己徒步走過了金門大橋。在橋的這頭時,我望著對岸的馬林海岬,恨不得立刻就到對岸去徜徉在那美麗的群山之間。但等我真走到那邊時,我幾乎不願意再挪動雙腿……那時的我絕對想不到,在時隔六年以後的今天,我會坐在海風吹拂的海岬峰頂,一面俯瞰太平洋、舊金山灣、金門大橋和籠罩在霧中的舊金山城,一面對著大衛的錄音機講述著這一切。
從美國回到芬蘭之後,李納斯對自己說,我要去美國。
當李納斯透露出自己的就業計劃之後,馬上有多家公司遞來橄欖枝,其中包括著名的 Linux 公司 Red Hat。這種感覺是如此美妙,就像你剛剛掏出一支香菸,面前已是千百個打火機舞動。但是李納斯本著不加入任何一家 Linux 公司的原則,拒絕了 Red Hat,參加了另一個名不見經傳的公司的面試,這家公司叫做 Transmeta,中譯名「全美達」,你們可以從維基百科上查到這家公司,不過我打賭,知道這家公司的讀者不會超過千分之一,這並不是我們們孤陋寡聞,因為美國人民剛開始也不知道這家公司在幹嘛,全美達官網在1997年中上線,兩年半後網站的建設情況是「This web page is not yet here」,又過了很久人們才從內部員工透露出的一點資訊得知,這家公司似乎是搞處理器的。這是我所知道的唯一一家保密措施強過蘋果的公司,如果不是李納斯,這家公司就像是根本沒有存在過。
就是這樣一家公司,面試了在開源社群名滿天下的技術天才、Linux 作業系統的締造者李納斯,並且將其招至麾下,一待就是六年。從某種程度上,這六年嚴重的影響了 Linux 作業系統前行的腳步,因為李納斯沒有足夠的時間開發 Linux 了。
雖然根據 Transmeta 與李納斯的協議,他可以繼續從事 Linux 的開發,而且他確實也想這麼做,比如白天為 Transmeta 工作,編寫 X86 解釋程式,晚上繼續 Linux 的偉大事業。不過真實的情況是,晚上丫睡著了……
關於加班和睡眠,李納斯是這麼解釋的:
很多人都認為加班加點的工作才算真正的工作。我可不這麼想。無論是 Transmeta 的工作還是 Linux 的工作,都不是靠犧牲寶貴的睡眠時間換來的。事實上,如果你想聽真話,我要說,我更喜歡睡覺。
總之,李納斯第一次從網際網路上消失了,很多悲觀的開發者紛紛奔走相告,李納斯這小子是不是被招安了?丫開始為商業公司幹活了,Linux 作為自由軟體是不是已經瀕臨死亡了?每當這時候李納斯就會出來給大家打打氣說,哥還在呢,只不過剛睡醒……
關於李納斯的這段經歷,曾經在矽谷工作過的一位朋友給我提供瞭如下文字,大意是這樣的:
每次想起李納斯這段經歷,我都要感慨萬千。第一次得知李納斯虎落矽谷的事是在2002年夏天,當地的水星報記者先是把李納斯大吹一通,然後說他從芬蘭老家搬到美國,就職於 Transmeta 已五年有餘,但 H1 移民仍然停留在勞工卡初級階段,六年期滿就要打道回府了。
當時這份報紙的讀者大概有一半人有 H1 經歷,然後這一半人裡的一半都知道 Linux 是啥東東,但是從未聽說過 Transmeta 是何方神聖,這貨居然把一代技術英雄扣在那兒為一個名不見經傳的小資本家作苦力,導制全球開源事業停滯不前,真是膽大包天啊!於是很多讀者跑到水星報去說,象李納斯這樣的天才願意移民到美國,布什親自開飛機去接都不為過,怎麼可以被移民局壓了五年呢balabala……
還好,李納斯在2003年離開了這個叫做「全美達」的公司,受聘於開放原始碼開發實驗室(OSDL : Open Source Development Labs, Inc),重新統領開源世界的各路英豪,全力開發 Linux 核心,Linux 再次煥發出勃勃生機,這一次,它要引領的是網際網路的技術浪潮……
Linus(七)——關於財富
李納斯對待財富的態度就是「視金錢為糞土」,是真的糞土。
那種默然的態度讓人感覺非常可怕。當一個人隨便動動手掛掛名籤個字就能獲取上千萬美金的時候,他依然和自己的妻女一家人擠在聖克拉拉一棟兩層樓的公寓套房裡,過著一個普通程式設計師的生活,同時不斷改進已經遍佈全球的 Linux,這是什麼精神?這是毫不利己專門利人的國際主義戰士的精神。
寫到這我不禁想起了綠茵場上的冰王子博格坎普,當他接到幾十米外的長傳,用標誌性的慢速停球過掉撲上來的後衛,輕釦,過掉另一個後衛,顛球,閃過最後的防守,面對守門員的時候不是大力抽射和仰天長嘯,而是把球搓出一道完美的拋物線,球越過門將,緩緩落入網窩,然後博格坎普,低著頭慢慢的走開,留給對手的是優雅與實用並世無雙的技藝,和令人絕望的背影!
默然的感覺,懂了撒?
很多程式設計師創業成功或跟隨創業成功之後,自以為功成身退,最早扔掉的就是程式碼和編譯器,然後購豪宅當天使滿世界貼旅遊照片,你們感受一下,這個境界是完全不可同日而語的。(請勿對號入座,如有誤傷,必是友軍所為)
事實上李納斯在拿到第一筆真正的財富之前,一直處於日子緊巴巴的狀態。當時另兩位帶頭大哥比爾·蓋茨和史蒂夫·賈伯斯早已名滿天下傢俬萬貫,同時有大量的技術人員、商人和公司通過 Linux 及其相關技術獲取了鉅額財富,對此,李納斯的態度是:「和我有毛關係」,他似乎對一大群才氣不高的程式設計人員能夠享受到大筆的財富並不在意。這種情況一直持續到所有的有識之士都坐不住了:李納斯,你再也不能這樣下去了!
倫敦的一位企業家希望李納斯在他羽翼未豐的 Linux 公司做個董事會成員,報酬是一千萬美金。李納斯說,不用。企業家驚呆了,當他喃喃自語「臥槽你特麼知道一千萬美金是啥概念嗎」的時候,李納斯已默默走遠。
Red Hat 公司為了感謝李納斯的卓越貢獻,為他提供了一些期權,李納斯的回覆同樣是,不用了,我不會給你獨家的授權許可的。Red Hat 的人差點瘋掉:「李爺期權您就收著吧,我們什麼都不要行了吧」「唔這樣啊,那就放這吧」,這就是李納斯!
正是這筆期權讓李納斯收穫了第一筆鉅額財富,因為 Red Hat 1999年8月11日在納斯達克上市了。李納斯先是意識到自己從身無分文突然變成了擁有五十萬美元的土豪,然後是一百萬,五百萬,李納斯終於變得亢奮起來,原來期權也是錢啊!終於不用再為生計發愁了,對著這個事情,李納斯的定義是:我真是最幸運的傢伙!
事實上李納斯從來沒有想過 Linux 能夠獲得如此巨大的成功。他只是為了自己方便寫了一個作業系統核心並想借此獲得一點回報而已,「假如我事先知道了要做到如 Linux 這般成功需要做多少基礎和瑣碎工作的話,那我肯定會相當沮喪的。這意味著你首先要非常優秀,並且你所做的大部分決定都導致了正確的結果。」
任何理智的人在登山之前凝望著高聳入雲的山峰和崎嶇艱險的山路時,都會陷於沮喪之中。解決辦法就是先邁出第一步再說,然後,但行好事,莫問前程。
Linux 不僅給李納斯帶來了名聲和財富,同時給大眾帶去了巨大的好處。年輕一代中最聰明的程式設計師和黑客都在使用 Linux 的產品,正是開放的 Linux 給這些天才的程式設計師帶去了巨大的創作熱情和喜悅,他們在 Linux 平臺上完成了一個又一個傑出的作品,這些技術形成的生產力,對網際網路的發展起到了巨大的推動作用,直到今天。
Linus(八)——巨星碰撞
在 Linux 出現之前,桌面作業系統的市場基本上是由比老師和喬老師控制的,雖然喬老師控制的少了一些。Linux 出現之後,桌面作業系統的格局並沒有太大變化,但是伺服器端市場的變化卻是翻天覆地的。原本比爾希望通過 Windows NT 和 Server 系列在伺服器領域複製桌面作業系統的輝煌,從而千秋萬載,一統江湖。然而,世界的發展永遠是多元的,沒人能通過一己之力改變歷史發展的多維性,比爾·蓋茨也不行。於是 Linux 出現了,並以星星之火可以燎原之勢一舉拿下伺服器作業系統的半壁江山。
一方是商業公司和封閉的策略,另一方是自由軟體和開放的協議,這場戰爭一開始支援率就是一邊倒的,李納斯就像對抗風車的堂·吉訶德,但是他自己不僅沒有遍體鱗傷,還在沒怎麼親自出場的情況下把微軟這個軟體風車搞得狼狽不堪,這種情況發生在現實生活中絕對是老百姓喜聞樂見的,李納斯成了自由軟體世界裡的英雄和領袖,但也就此與微軟結下了世仇,比爾和李納斯許下了永世不相見的誓言。
有些加盟微軟的朋友告訴李納斯,他們曾見到他的頭像被釘在了微軟公司的飛鏢靶心上。李納斯對此的評價是:一定是我的大鼻子太好瞄準了。
李納斯與另一位業界巨頭蘋果之間就沒這麼激進了,畢竟 Linux 和 OS X 師出同門,都是從老前輩 Unix 那兒畢業的,坐在一起還能嘮嘮家常,事實上李納斯和賈伯斯確實有過一次歷史性的會面。
李納斯來到矽谷不久,就收到了一封來自喬老師祕書的郵件,郵件中寫到:「聽聞小李飛刀光臨矽谷,蓬蓽生輝,老喬不才,重回蘋果,以期振昔日之雄風,如得小李相助,必將如猛虎加之羽翼而翱翔四海,天下可得。期待會面。」(當然是意譯)
李納斯看完之後不明白賈伯斯要幹什麼,只是覺得很厲害的樣子。畢竟李納斯還坐在外公腿上撥弄電腦鍵盤的時候,蘋果的沃茲已經純手動打造出蘋果的第一代個人電腦 Apple I 了。李納斯決定去見一下兒時的偶像,並瞭解一下蘋果的新作業系統。
兩代科技巨星的會面被安排在蘋果總部 Infinity Loop,賈伯斯帶著原 Next 公司技術總監 Avie Tevanian(Mach 之父)接見了李納斯,雙方進行了友好而親切的會談,然後會談的結果和某國常規會談一樣,就是沒有結果。
其時賈伯斯十年放逐迴歸蘋果,舉手投足已是大宗師氣勢,他對李納斯說,我大蘋果雖然現在看起來有點頹,不過海盜精神永存,我們已經準備好重新起航了。目前個人電腦領域仍然只有兩個玩家:微軟和蘋果。如果 Linux 和蘋果能夠珠聯璧合,那一切將是最好的安排,所有的開源愛好者都能夠用上優雅與極客並存的 MacLinux 了。然後 Mach 之父 Avie Tevanian 向李納斯詳細介紹了整合 Mach 和 Linux 核心作為 OS X 混合核心的計劃,之後龐大的 OS X 體系將構建在 Mach 和 Linux 核心的基礎之上。 同時喬老師表示,基於 Mach 和 Linux 的核心系統將採用開源的方式運作,這樣全世界的開源愛好者都可以為 Mac 和 Linux 開發程式。
這幾乎是一個完美的雙贏方案,喬老師都被自己描繪的藍圖打動了,永遠年輕,永遠他媽的熱淚盈眶!誰能拒絕蘋果公司和賈伯斯如此完美的邀請呢?
李納斯能!
賈伯斯認為自己的扭曲現實力場加上蘋果巨大的市場潛力一定會讓李納斯怦然心動,沒想到這個芬蘭小子在計算機面前待久了,水米油鹽不進,任憑賈伯斯口吐蓮花,我自巍然不動。首先李納斯對 Mach 就不感冒,他認為 Mach 幾乎犯下了所有的設計錯誤,它讓系統變得複雜而效率低下;其次李納斯覺得賈伯斯可能沒意識到,Linux 的潛在使用者要比蘋果系統多;第三李納斯樂觀的認為,雖然 Linux 的目標不是佔領桌面作業系統,但是顯然「我們很快就能做到這一點了」。所以李納斯當時的反應是:
為什麼我要關心這些?我為什麼要對蘋果公司的故事感興趣?我不覺得蘋果公司裡有什麼有趣的事情。我的目標也不是佔領什麼桌面作業系統的市場。(嗯,雖然 Linux 馬上就要做到這點了,但這從來就不是我的目標)
現在看來,李納斯當時對 Linux 在桌面作業系統的前景過於樂觀了,雖然他天縱奇才桀驁不馴,但是也無法預測到 OS X 和 iOS 在十年後引領移動開發的浪潮。不過即使知道 OS X 未來的大發展,心高氣傲的李納斯也不會接受蘋果的收編,因為 Linux 一直是獨立和自由的軟體圖騰。
無論如何,這次非正式的會談沒有達成任何實質性的效果,但是對後來的 IT 格局產生了巨大的影響。蘋果不再關注 Linux,而是轉向了 BSD。2001年蘋果任命 FreeBSD 的發起人之一,老牌 BSD 黑客 Jordan Hubbard 為 BSD 技術經理,後升為 Unix 技術總監,負責 OS X 作業系統底層核心 Darwin 的研發,最終,Mach 與 BSD 技術整合在一起,形成了混合核心。另外,蘋果開始覺得開源專案也不是那麼靠譜,後續他們先後研發並開源了優秀的編譯器專案 LLVM 和 Clang,一舉替換了整條 GCC 編譯鏈,為 OS X 和 iOS 的效能優化和語言特性提供了巨大的幫助。這也算是蘋果對那些牛叉哄哄的開源人士的回擊:看,我們也可以做開源,而且比你們做的好。
Linux 則繼續在開源、獨立、自由的方式下一路狂奔,雖然在桌面作業系統領域的成就乏善可陳,但是在伺服器端大放異彩,目前幾乎整個網際網路都是執行在 Linux 及其衍生產品之上的,可以說沒有 Linux,網際網路不可能得到如此迅猛的發展。
十年以後,移動網際網路時代來臨。OS X 上長出了 iOS,Linux 上則誕生了 Android,這兩個移動開發領域的雙子星都有一個老祖宗,那就是 Unix。一次話不投機的會談讓 OS X 和 Linux 分道揚鑣,在十幾年後的今天,它們又以一種不同的方式相見了,世界永遠都是多元的,可能冥冥中自有天意吧。
Linus(九)——Linus 和 Git
很多人在完成了類似 Linux 這樣巨集偉的軟體產品之後,基本上就止步不前了。但是李納斯卻從未停歇創新的腳步。2003年加入開放原始碼開發實驗室之後,李納斯重新全職投入 Linux 核心的研發,並開始醞釀自己的另一個跨時代的產品。
2002年,Linux 核心開發團隊開始採用 BitKepper 作為程式碼版本管理工具。BitKeeper 是一套分散式的版本管理工具,它滿足了 Linux 核心開發的技術需求。但是 BitKeeper 只是暫時對 Linux 等開源軟體團隊免費,並不是自由軟體。2005年 BitMover 公司不再免費贊助 Linux 開發團隊。對此李納斯表示非常遺憾,但遺憾之後他並沒有自怨自艾傷心落淚,而是憤怒的與其他幾個小夥伴花了幾個星期完成了一套新的分散式程式碼管理工具,命名為 Git。兩個月之後,Git 釋出了官方版本,並在不同的專案中應用,自由軟體社群給予了 Git 廣泛的支援。
與 SVN 和 CVS 等軟體不同的是,Git 更關注檔案的整體性是否有改變,Git 更像一個檔案系統,它允許開發者在本地獲取各種資料,而不是隨時都需要連線伺服器。Git 的最大的特點就是離線分散式程式碼管理,速度飛快,適合管理大型專案,難以置信的非線性分支管理。
2005年 Git 釋出之後,技術日臻成熟,很多大公司都開始採用 Git 管理自己的專案程式碼,2008年2月 Github 公司基於 Git 構建了協作式原始碼託管網站 Github,目前該網站是這個星球上最大的原始碼集散地,幾乎所有的優秀程式碼都託管在 Github 上。Git 已經成為程式設計師使用最多的原始碼管理工具!
對於 Git 的成功,李納斯表示:
Git的設計其實很簡單,它有一個穩定而合理的資料結構。事實上,我強烈建議圍繞著資料來設計程式碼,而不是反其道而行之,我覺得這可能就是 Git 如此成功的原因。 壞程式設計師總是擔心他們的程式碼,而優秀的程式設計師則會擔心資料結構和它們之間的關係。
從 Git 誕生到今天已經有9個年頭了,Git 始終沒有背離其設計的初衷:高效能、簡單的設計、非線性高併發分支的支援和完全的分散式。
對於李納斯來說,Git 現在是他的主要消遣工具之一。他很喜歡在 Git 上程式設計的感覺,因為再也不用擔心鎖定問題、安全問題和網路問題,這種感覺真是太美妙了!
我們繼續期待李納斯的第三個偉大的作品!
Linus(十)——生活的意義
李納斯認為生活意義的全部就在於:生存,社會交往和尋找樂趣。因為我們所做的一切事情,最終似乎都是為了我們自己的樂趣。而進化作為主線始終貫穿其中。
李納斯對進化的理解是:
你知道在整個太陽系,人類已知的最複雜的工程是什麼嗎?——不是Linux,不是Solaris,也不是你的汽車。是你,還有我。想想你和我都是怎麼來的——不是什麼超複雜的設計,沒錯,憑運氣。除了運氣,還有:
通過分享「原始碼」實現自由的可用性和授粉機制,生物學家把它稱作DNA。
毫不手軟的使用者環境把我們不好的版本輕易地替換成更好的可執行版本,從而使種群更加優秀(生物學家把這叫做「適者生存」)。
大量的無方向的並行開發(試錯法)。
我從未如此嚴肅過:我們人類永遠都無法複製出比我們自身更復雜的個體,而自然選擇卻不假思索的做到了。不要低估適者生存的力量。不要錯誤地認為你可以做出比大量的平行試錯反饋環更好的設計,那樣就太抬舉你的智力水平了。說實話,太陽照常升起,這和任何人的工程技巧或者程式設計風格都沒有關係。
李納斯一生只為尋找歡笑,但是他卻取得了無數的成就和榮譽:
1997年,在芬蘭赫爾辛基大學電腦科學系,李納斯接受了他的碩士學位。兩年後,他在斯德哥爾摩大學接受名譽博士學位,並在2000年在他的母校獲得了同樣的榮譽。
1998年,李納斯接受了電子前哨基金會先鋒獎。
2004年,李納斯被《時代》雜誌選為世界上最有影響力的人之一。
2006年,《時代》雜誌歐洲版評選李納斯為過去60年最有革命性的英雄人物之一。
2012年4月20日,託瓦茲被宣佈成為兩位獲獎者之一,和山中伸彌共同獲得當年的千禧技術獎。該獎被普遍形容為相當於在技術領域的諾貝爾獎。
2012年4月23日,李納斯進入網際網路協會(Internet Society,ISOC)的網路名人堂。
李納斯憎惡分明,經常口不擇言,比如他對 C++的評價是:C++是一門糟糕的語言。而且有一群不合格的程式設計師在使用C++,他們讓它變得更糟糕了。他對自己的兩個產品命名的解釋是:我是個自大的混蛋,我所有的專案都以我的名字來命名。開始是Linux, 然後是Git(英國俚語,飯桶的意思)。
不過我最喜歡李納斯說過的一句話是:Talk is cheap, Show me the code。他一直用自己的程式設計人生詮釋著這句話。2006年的時候,Linux 核心程式碼的2%依然是李納斯完成的,他是程式碼貢獻最多的人之一(是年37歲)。到了2012年,他對核心的貢獻主要是合併程式碼,程式設計變少了,但是他依然對是否將新程式碼併入到 Linux 核心具有最終決定權。
李納斯用自己精彩的程式設計人生和對自由軟體的熱愛演繹了現代社會中一個書呆子的勝利。如果你愛一個人,就讓他去程式設計吧;如果你恨一個人,就讓他去程式設計吧。程式碼讓我們歡笑,也讓我們憂傷,讓我們沉默,也讓我們高歌。對於程式設計師來說,程式碼是這個世界上最美妙的音樂,會程式設計的孩子,都是好孩子!
相關文章
- 純鹼
- 純鹼的節奏
- JAVA KMP 純模板JavaKMP
- 簡單純粹
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- C++純虛數的使用C++
- 純粹的數學之美
- 純正的nodejs程式除錯NodeJS除錯
- 孩子特有的純真
- 純前端文件預覽前端
- 純手寫web框架Web框架
- 純CSS 毛玻璃效果CSS
- 021--C++養成之路(純虛擬函式和純抽象類)C++函式抽象
- windows安裝純CPU版的pytorchWindowsPyTorch
- VicWord 一個純php的分詞PHP分詞
- 如何建立一個“純淨”的物件物件
- 原生純淨的Boot腳手架boot
- [譯] 更可靠的 React 元件:提純React元件
- 讓自己純粹一點
- 純真破解工作室
- 純淨搭建簡歷工具
- 純css之隔行換色CSS
- [譯]純程式碼建立 UIViewUIView
- 純css模擬下雪效果CSS
- 純Swift專案-序篇Swift
- 讀js純粹筆記JS筆記
- PyCharm 建立純Python專案PyCharmPython
- 圖片輪播--純cssCSS
- 純手寫Arraylist集合框架框架
- fong - 純typescript的node gRPC微服務框架TypeScriptRPC微服務框架
- 純CSS實現Tab欄的切換CSS
- 關於PaaS的純乾貨總結
- 純原生元件化-模組化的探索元件化
- Win10系統純淨版好用嗎?Win10純淨版系統的弊端介紹Win10
- 張錫純 經典名方
- 評價指標(純手寫)指標
- javascript純函式是什麼JavaScript函式
- React Native純乾貨總結React Native