摘要 : Linux 可以說是 IT 發(fā)展史上圣杯級(jí)別的產(chǎn)品,它的故事沒有終點(diǎn)。幾十年過去了,Linux 散落在歷史長(zhǎng)河中的點(diǎn)點(diǎn)滴滴,依然像耀眼的珍珠一樣在時(shí)間的深水河中發(fā)出璀璨的光芒。如果你是一個(gè)開發(fā)者,多讀讀 Linux 相關(guān)的技術(shù)書;如果你是互聯(lián)網(wǎng)從業(yè)者,多讀讀 Linux 相關(guān)的故事和傳奇。如果你兩者都不是,多讀讀 MacTalk 就好了。
十五年前,我第一次在工作中使用 Linux 的時(shí)候,并不知道這個(gè)操作系統(tǒng)會(huì)對(duì)我的生活和職業(yè)產(chǎn)生多么大的影響。十五年后,我在「Linus,一生只為尋找歡笑」一文中寫到:
當(dāng)大家使用 Google 搜索時(shí),使用 Kindle 閱讀時(shí),使用淘寶購物時(shí),使用 QQ 聊天時(shí),很多人并不知道,支撐這些軟件和服務(wù)的,是后臺(tái)成千上萬臺(tái) Linux 服務(wù)器,它們時(shí)時(shí)刻刻都在進(jìn)行著忙碌的運(yùn)算和數(shù)據(jù)處理,確保數(shù)據(jù)信息在人、軟件和硬件之間安全的流淌。
Linux 不僅僅從技術(shù)層面影響人們的生活,其本身就產(chǎn)生了很多有意思的話題和文化,我讀了不少 Unix/Linux 相關(guān)的書籍,很多技術(shù)內(nèi)容已經(jīng)忘得一干二盡,但那些話題、模式和文化,卻像醇香的好酒、美麗的傳說,歷久彌新,不斷的為我?guī)硭伎己蛦l(fā)……
1、最初的想法,并不是決定性的
Linux 并不是憑空創(chuàng)造出來的,當(dāng)年林納斯(Linus)只是覺得迷你版 Unix 操作系統(tǒng) Minix 的終端太難用了,既不能登錄學(xué)校里的 Unix Server,也沒法上網(wǎng)。這種功能缺陷對(duì)林納斯這樣的極客來說是無法接受的,于是他決定從硬件層面開始,重新為 Minix 設(shè)計(jì)一個(gè)終端仿真器。
當(dāng)時(shí)是三月,也可能是四月,就算彼得蓋坦街上的白雪已經(jīng)化成了雪泥我也不知道,當(dāng)然我也并不關(guān)心。大部分時(shí)間我都穿著睡衣趴在相貌平平的計(jì)算機(jī)前面噼噼啪啪的敲打鍵盤,窗戶上的窗簾遮得嚴(yán)嚴(yán)實(shí)實(shí),把陽光和外部世界與我隔離開來。
經(jīng)過不眠不休的編程之后,終端仿真器做出來了,但那個(gè)時(shí)候林納斯已經(jīng)意識(shí)到自己的雄心壯志遠(yuǎn)不止于此,神山上的另一座圣杯「操作系統(tǒng)」已經(jīng)向他發(fā)出了召喚,于是始有 Linux。
另一個(gè)偉大的操作系統(tǒng) Macintosh,同樣起步于一個(gè)微小的項(xiàng)目,期間歷經(jīng)換帥、更名、爭(zhēng)吵、妥協(xié),最終與 NextStep 經(jīng)過長(zhǎng)達(dá)四年的整合才形成現(xiàn)代的經(jīng)典操作系統(tǒng) OS X(參見《MacTalk·人生元編程》)。
幾乎所有成功的產(chǎn)品都是邊走邊看做出來的。偉大的夢(mèng)想,常常始于微不足道。
所以,很多人問我如何找到一份長(zhǎng)期穩(wěn)定的工作時(shí),如何開啟一個(gè)能夠帶來巨大成功的項(xiàng)目時(shí),我只能說,最初的想法,并不是一切,開始去做就好了。
2、好的軟件產(chǎn)品,常常源于開發(fā)者自身的需求
林納斯為給自己開發(fā)終端仿真器最終做出了讓其名垂青史的 Linux 操作系統(tǒng),沃茲因?yàn)闊釔塾?jì)算機(jī)設(shè)計(jì)出了 Apple I,喬布斯想把1000首歌裝進(jìn)口袋推出了 iPod。
如果有什么工作能讓你保持長(zhǎng)久的熱情,那一定是做自己需要的產(chǎn)品。當(dāng)年我們?cè)诮o程序員開發(fā)工具平臺(tái)的時(shí)候,我要求每個(gè)工具研發(fā)人員都使用我們自己開發(fā)出來的工具,而不是僅僅把工具推給測(cè)試人員和項(xiàng)目組的程序員。過了一段時(shí)間,我發(fā)現(xiàn)那個(gè) IDE 突然增加了很多「善解人意」并「出人意料」的功能。
如果有一天放下現(xiàn)在的工作,我一定會(huì)找一件足以讓我窮盡半生去探索和追求的事情,用「術(shù)」解決問題,用「道」創(chuàng)造解決問題的方法,順便改變生活。
3、優(yōu)秀的程序員知道如何編程,卓越的程序員知道合理復(fù)用
林納斯并沒有嘗試從零開始編寫 Linux,而是以重用 Minix 的代碼和理念作為開始,雖然在 Linux 最終的版本中幾乎所有 Minix 代碼都被移除或重寫了,但它在 Linux 成長(zhǎng)初期確實(shí)起到了類似腳手架的作用。
卓越的程序員通常都很懶,我們把這種懶叫做「建設(shè)性懶惰」,因?yàn)樗麄冎?,很多時(shí)候我們要的都是最終的結(jié)果,而不是勤奮的過程。如果有可以復(fù)用的基礎(chǔ),顯然比從零開始更具有建設(shè)性。
在開源社區(qū)澎湃發(fā)展的今天,我們有了更多的技術(shù)選擇。所以,當(dāng)你拿到一個(gè)輪子的需求時(shí),去社區(qū)里找找問問,如果有可以復(fù)用的東西,就不要再費(fèi)勁去造一個(gè)新輪子,況且你無法保證自己造的輪子比舊輪子好用。
我從來不是卓越的程序員,我只是模仿他們。
4、如果你有正確的態(tài)度,有趣的事情自然會(huì)找到你
林納斯從寫下第一行 Linux 代碼的開始,就保持了一個(gè)開放的態(tài)度,可以說,Linux 一誕生就被打上了開源的烙印,這一點(diǎn)對(duì)其后續(xù)的發(fā)展起到了至關(guān)重要的作用。因?yàn)殚_放和開源,Linux 吸引了全球的開源愛好者和頂級(jí)黑客,無數(shù)卓越的程序員為 Linux 貢獻(xiàn)了源代碼,同時(shí),林納斯在開源協(xié)作方面也展現(xiàn)出了編程之外的天賦,他井井有條的運(yùn)作著龐大的開源社區(qū),回復(fù)郵件,發(fā)起討論,閱讀代碼,合并分支,Linux 操作系統(tǒng)在開源社區(qū)的推動(dòng)和林納斯的調(diào)教下以驚人的速度發(fā)展。
從來沒有一款如此復(fù)雜的軟件系統(tǒng)是以這種松散的方式構(gòu)建的。幾千名散落在世界各地的開發(fā)者,憑借著脆弱的互聯(lián)網(wǎng)建立關(guān)系,他們利用業(yè)余時(shí)間,構(gòu)建出了一個(gè)鬼斧神工般的操作系統(tǒng),隨即這個(gè)系統(tǒng)又成為互聯(lián)網(wǎng)的基石,其間滄海桑田,讓人嘆為觀止。
一切都源于開放的態(tài)度。我對(duì)這一點(diǎn)深有體會(huì),從寫下第一條 MacTalk 推送開始,我只想向世界傳遞我的訊息,結(jié)果各種有趣的人和事紛至沓來。但行好事,莫問前程。
為什么要登山?因?yàn)樯皆谶h(yuǎn)方。為什么要閱讀?因?yàn)闅v史在書里。為什么要寫作?因?yàn)樗枷肓魈试谛念^和指尖。就是如此。
5、如果你對(duì)一件事情不感興趣了,最好的做法是找到一個(gè)有能力的接棒者
每個(gè)人的興趣都會(huì)轉(zhuǎn)移,林納斯也不例外。在 Linux 進(jìn)入穩(wěn)定發(fā)展的階段,他把更多的精力放到了開源社區(qū)上,但是這并沒有降低 Linux 操作系統(tǒng)的代碼質(zhì)量,因?yàn)樗业搅烁嗟捻敿?jí)源代碼貢獻(xiàn)者。
在軟件開發(fā)的項(xiàng)目中我們同樣會(huì)遇到類似的問題。某個(gè)功能的開發(fā)者突然對(duì)該功能失去了興趣,這時(shí)候我們就有責(zé)任為這個(gè)功能找到一個(gè)可以勝任的接棒者,而不是強(qiáng)迫原來的開發(fā)者在原地踏步。
很多時(shí)候,我們厭倦了一件事情,并不是能力缺失,而是因?yàn)橐呀?jīng)洞悉了這件事的所有秘密,于是轉(zhuǎn)身離去,開辟新的征程……
6、把早期用戶當(dāng)做你的合作者或開發(fā)者,這是提高代碼質(zhì)量和產(chǎn)品質(zhì)量的有效途徑。
林納斯把 Linux 的源代碼放到網(wǎng)上之后,很快就收獲了一批既是開發(fā)者又是合作者的用戶,他選取了其中五人組成了核心開發(fā)小組,除了 Linux 內(nèi)核建設(shè)的最終決定權(quán)屬于林納斯之外,一切都是開放的,這五個(gè)人承擔(dān)了絕大多數(shù)關(guān)鍵的開發(fā)和組織工作,在各自的領(lǐng)域組織自己的用戶和開發(fā)者,推進(jìn) Linux 有條不紊的向前發(fā)展。
這些合作者和開發(fā)者就像筑巢的蜂群一樣,圍繞著 Linux 辛勤的工作,看起來雜亂無章,實(shí)際上細(xì)致嚴(yán)密,因?yàn)槿魏稳说墓ぷ鞫荚陉柟庀逻M(jìn)行,沒一個(gè)錯(cuò)誤的產(chǎn)生和修復(fù)是隱藏在暗影中的。一個(gè)人的代碼出了漏洞,立刻有另一個(gè)人沖上去打補(bǔ)丁,打完之后,兩人交換眼神,握手,然后轉(zhuǎn)身投入下一輪的開發(fā)和測(cè)試中。
通常一個(gè)幾十人的項(xiàng)目組就能把整個(gè)公司搞的雞犬不寧,這種事我們見的太多了,但是林納斯卻依賴自己的早期用戶構(gòu)建了歷史上最大的合作項(xiàng)目,成千上萬的開發(fā)者依賴郵件列表和相互之間制定的規(guī)則進(jìn)行交流和研發(fā),同時(shí)開展的項(xiàng)目經(jīng)常超過4000個(gè)。
如果你找到了產(chǎn)品的早期合作者用戶,那么你的項(xiàng)目已經(jīng)成功了50%。 「即便是高層次的設(shè)計(jì),如果能有很多合作開發(fā)者在你產(chǎn)品的設(shè)計(jì)空間周圍探索,也是很有價(jià)值的。設(shè)想下一灘雨水是怎么找到下水口的,或者說螞蟻是怎么發(fā)現(xiàn)食物的。探索在本質(zhì)上是分散行動(dòng),并通過一種可擴(kuò)展的通信機(jī)制來協(xié)調(diào)整體行為。一個(gè)外圍的游走者可能會(huì)在你旁邊發(fā)現(xiàn)寶藏,而你可能有點(diǎn)過于專注而沒能發(fā)現(xiàn)」。
現(xiàn)在很多創(chuàng)業(yè)項(xiàng)目在早期發(fā)布的時(shí)候常常采用邀請(qǐng)制,這其實(shí)是獲取早期合作者用戶的最佳時(shí)期,合理的選擇用戶并通過郵件列表、群組和線下交流活動(dòng)等方式不斷獲取反饋,并讓用戶參與其中,會(huì)大大提高你的產(chǎn)品質(zhì)量和代碼質(zhì)量。我參與過的早期項(xiàng)目中,有道云筆記·協(xié)作版算是做的不錯(cuò)的,可惜的是,產(chǎn)品版本正式發(fā)布之后,這種參與和反饋感漸漸消失了。
更多的創(chuàng)業(yè)產(chǎn)品只是把邀請(qǐng)用戶當(dāng)做普通用戶看待,意義寥寥。正確的做法應(yīng)該是把所有潛在的合作者用戶加入你的郵件列表或特定群組,每次發(fā)布新版本時(shí),向郵件列表發(fā)送朋友對(duì)話般的通知(而不是例行郵件),鼓勵(lì)他們參與,聽取他們的意見,征求他們關(guān)于設(shè)計(jì)決策的看法,當(dāng)他們發(fā)來補(bǔ)丁和反饋時(shí)給他們以熱情回應(yīng)。
你會(huì)有回報(bào)的。
7、最好的領(lǐng)導(dǎo)就是「不要試圖去領(lǐng)導(dǎo)」
林納斯是一個(gè)懶惰的程序員,所以他很早就認(rèn)識(shí)到,好的領(lǐng)導(dǎo)者,并不是大包大攬,也不是讓下屬去完成領(lǐng)導(dǎo)部署的任務(wù),而是讓他們做自己真正想做的工作。好的領(lǐng)導(dǎo)者不應(yīng)該總是去試圖領(lǐng)導(dǎo)別人,他們要及時(shí)反思,修正自己的思路和決策,聽取別人的意見,并把一些決策權(quán)交給他人。
作為整個(gè) Linux 項(xiàng)目的領(lǐng)軍人物,林納斯只是在操作系統(tǒng)內(nèi)核的爭(zhēng)端上進(jìn)行仲裁和決策,其他時(shí)候,大部分是集思廣益,多頭并進(jìn)。林納斯說:
我有時(shí)會(huì)贊同他們的工作,有時(shí)會(huì)批評(píng)他們的工作,但是大多數(shù)時(shí)候我都是放任自流的。如果兩個(gè)人同時(shí)維護(hù)了相同的功能,我會(huì)接受兩份工作成果,評(píng)估哪一份更可行。如果兩者競(jìng)爭(zhēng)激烈,那么我會(huì)同時(shí)拒絕他們,直到其中一位開發(fā)者失去了興趣。
如果你是一位創(chuàng)業(yè)公司的領(lǐng)軍人物,要常常反思的不是「我是不是做的太少了」,而是「我是不是管的太多了」。
8、及早發(fā)布,快速發(fā)布,并傾聽用戶的聲音
很多人都習(xí)慣性的認(rèn)為,除非是很小的項(xiàng)目,早發(fā)布和頻繁發(fā)布的做法有益無害。因?yàn)樵缙诋a(chǎn)品大都問題多多,過早發(fā)布會(huì)耗盡用戶的耐心和開發(fā)者的雄心。這種看法直到互聯(lián)網(wǎng)時(shí)代才開始有所改變。各大互聯(lián)網(wǎng)公司為了搶占先機(jī),開始無快不破,雖然第一代產(chǎn)品存在很多問題,但是他們會(huì)通過迅猛的迭代速度,快速推出第二代和第三代產(chǎn)品去彌補(bǔ)缺陷、贏得用戶和占領(lǐng)市場(chǎng)。
其實(shí)這種策略 Linux 系統(tǒng)在上個(gè)世紀(jì)90年代就開始采用了,林納斯在早期(1991年)發(fā)布內(nèi)核的頻率甚至超過了一天一次!他把用戶當(dāng)做了自己的合作者,他不斷傾聽用戶的聲音,以持續(xù)發(fā)布來回報(bào)用戶,用自我滿足感激勵(lì)那些黑客和頂尖高手。有些人會(huì)提出問題,有的人會(huì)發(fā)現(xiàn)問題,有的人會(huì)解決問題,這一切都會(huì)淹沒在 Linux 頻繁發(fā)布的版本浪潮里……
當(dāng)然,在那個(gè)年代,林納斯能做到這一點(diǎn),和他自己的才能與設(shè)計(jì)天賦不無關(guān)系?!洞蠼烫煤图小芬粫袑?duì)林納斯的描述是:
他更像是一個(gè)工程實(shí)施上的天才,他具備一種避免 bug 和防范開發(fā)走入死胡同的第六感,而且有一種能發(fā)現(xiàn)從 A 點(diǎn)到 B 點(diǎn)最省力路徑的真本事,事實(shí)上,Linux 的整個(gè)設(shè)計(jì),都透露著這種特質(zhì),并反映了林納斯那種本質(zhì)上保守而簡(jiǎn)潔的設(shè)計(jì)取向。
在移動(dòng)互聯(lián)網(wǎng)時(shí)代,及早發(fā)布、快速發(fā)布還會(huì)帶來另一個(gè)附加值:如果你的 App 能夠一周更新一次,那么用戶永遠(yuǎn)不會(huì)忘記這些 App 和開發(fā)者,他們知道這些 App 的后面有一群鮮活的生命在不斷的進(jìn)行產(chǎn)品改進(jìn)、性能調(diào)優(yōu)、功能增強(qiáng),通過頻繁的發(fā)布,用戶是能夠感知到這些數(shù)據(jù)之外的東西,并給你豐厚的回報(bào)。
9、如果一個(gè)問題解決不了,那么要問問自己,是不是提出了正確的問題。
當(dāng)你發(fā)現(xiàn)自己在開發(fā)中四處碰壁的時(shí)候,當(dāng)你發(fā)現(xiàn)自己苦苦思索也難以確定下一個(gè)特征的時(shí)候,當(dāng)你發(fā)現(xiàn)自己輾轉(zhuǎn)騰挪也無法解決一個(gè)老問題的時(shí)候……停下來,喝杯咖啡吹吹風(fēng),你會(huì)發(fā)現(xiàn),過了今天問題還是解決不了。
通常這時(shí)候,你不該再問自己是否找到了正確答案,而是是否提出了正確的問題,也許是問題本身需要被重新定義。
在不損失效能的前提下,不要猶豫,扔掉那些過時(shí)的特性吧。為了挽救 IE6的用戶,還不如去為那些愿意使用高級(jí)瀏覽器(支持 HTML5)的用戶提供更好的服務(wù)。
10、設(shè)計(jì)上的完美并不是沒有東西可以加了,而是沒東西可以減。
有時(shí)候,我們?cè)谲浖O(shè)計(jì)的時(shí)候會(huì)盡可能讓自己表現(xiàn)的聰明而有原創(chuàng)性,這讓我們?cè)谇靶械臅r(shí)候常常忽略那能夠直達(dá)目的地的小徑,我們被藍(lán)色湖泊上飄蕩著霧氣吸引,在高山上怒放的美麗花朵之間徜徉,而忘記了真正的目標(biāo)。
在應(yīng)該保持軟件健壯性和簡(jiǎn)單性的時(shí)候,設(shè)計(jì)者常常下意識(shí)把它弄得既華麗又復(fù)雜。應(yīng)該用自動(dòng)內(nèi)存管理的時(shí)候使用了引用計(jì)數(shù),能夠最簡(jiǎn)實(shí)現(xiàn)的時(shí)候使用了各種設(shè)計(jì)模式,也許在潛意識(shí)里,很多程序員認(rèn)為,使用了復(fù)雜技巧并難以讀懂的代碼才是好代碼。
對(duì)于產(chǎn)品的設(shè)計(jì)和實(shí)現(xiàn)來說,增加功能和代碼是最容易做到的,反而是代碼減無可減,功能砍無可砍,最難實(shí)現(xiàn)。如果你的產(chǎn)品減少任何一個(gè)功能都會(huì)帶來完整性和體驗(yàn)缺失的話,這款產(chǎn)品的功能就已經(jīng)接近完美了,代碼同樣如此。
無論是產(chǎn)品設(shè)計(jì)還是編程實(shí)現(xiàn) ,永遠(yuǎn)記住這樣一個(gè)原則:KISS (keep it simple and stupid),簡(jiǎn)單即為美。
……
Linux 可以說是 IT 發(fā)展史上圣杯級(jí)別的產(chǎn)品,它的故事沒有終點(diǎn)。幾十年過去了,Linux 散落在歷史長(zhǎng)河中的點(diǎn)點(diǎn)滴滴,依然像耀眼的珍珠一樣在時(shí)間的深水河中發(fā)出璀璨的光芒。如果你是一個(gè)開發(fā)者,多讀讀 Linux 相關(guān)的技術(shù)書;如果你是互聯(lián)網(wǎng)從業(yè)者,多讀讀 Linux 相關(guān)的故事和傳奇。如果你兩者都不是,多讀讀 MacTalk 就好了。