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