一個很可能是迄今為止最有名的黑客如何寫出一本軟件行業的圣經式著作?
2015 年已經過去了 15 天,你的書單準備好了嗎?從本期開始,敏捷商業智能公眾號將定期為大家推送書評和鑒書欄目 #Henry 讀書筆記 #
何春濤( Henry He )是永洪 BI 創始人,一名大數據資( ku )深 (bi) 創業者,他為大家推薦的是一本軟件從業者必讀的經典書:《大教堂與市集》( The Cathedral and theBazaar )。
這本書是美國史上最有名的黑客之一的埃里克·斯蒂芬·雷蒙( Eric Steven Raymond )所撰寫的軟件工程方法論。以 Linux 的核心開發過程以及作者自己主持開發的開放原始碼軟件── Fetchmail 為討論案例。這本書早在 1999 年就出版了,很快一版再版,被軟件從業者奉為圣經。
雷蒙不僅是個黑客天才,文筆還很不錯,他一生共寫了 5 本書,最有名的就是這本。他出生于美國波士頓,那里正是黑客文化發源地 MIT 的所在,也是斯托爾曼發動自由軟件運動的大本營。雷蒙在 1982 年完成第一個開放源代碼軟件項目,是 INTERCAL 編程語言的主要創作者之一,曾經為 EMACS 編輯器作出貢獻,還是著名的 Fetchmail 程序的作者。
下面是這本書的主要內容。
世界上的建筑可以分兩種:一種是集市,天天開放在那里,從無到有,從小到大;還有一種是大教堂,幾代人嘔心瀝血,幾十年才能建成,投入使用。
當你新建一座建筑時,你可以采用集市的模式,也可以采用大教堂的模式。一般來說,集市的特點是開放式建設、成本低、周期短、品質平庸;大教堂的特點是封閉式建設、成本高、周期長、品質優異。
而在軟件行業,雷蒙相信大多數重要軟件(操作系統和真正大型工具如 Emacs 編輯器)需要像建造大教堂那樣,在與世隔絕的環境下,由天才式專家或幾個行家里手精心打造,不成熟時絕不發布 beta 測試版。
于是他的問題就來了:有沒有可能用修建集市的方式,造出一所大教堂?
1993 年,在雷蒙開發 Fetchmail 程序時,當時的 Linux 團體有各種不同的方法( Linux 歸檔站點接受任何人的建議和作品),顯得有點雜亂無章。但 Linux 世界不僅沒有在一片混亂中分崩離析,反而越來越強大。
當時 Raymond 在家中收發郵件時遇到了困難,這次他沒有編出一個新的 POP3 客戶與現存的那些競爭,而是突發奇想效仿 Linus 的做法: Linus 并不是從頭開始寫 Linux 的。 Raymond 首先做的是尋找一個合適的 POP 雛形,然后對它進行重寫。他首先選擇了 Fetchpop ,后來又改用 Popclient ,并繼承了 Popclient 的用戶基礎。然后,他像 Linus 那樣把用戶當作協作開發者,把做好的程序早發布、常發布、聽取用戶的建議。最后,在 Raymond 認為條件成熟時,他正式將 Popclient 更名為 Fetchmail 。最后 Fetchmail 的強大的功能使他獲得了成功。 Raymond 感到 Linux 的這種開發風格確實能工作,并且工作得很好。他為此而感到欣喜不已,同時也想讓更多的人來分享他對 Linux 的體驗。
在大教堂模式下,原始碼在本模式是公開的,但在軟件的每個版本開發過程是由一個專屬的團隊所控管的。他舉了以 GNU Emacs 及 GCC 兩個軟件作為例子。
而在市集模式下,原始碼在本模式也是公開的,不過卻是放在網上供人檢視及開發。作者以 Linux 核心的創始者林納斯·托瓦茲帶領 Linux 核心的開發為例,亦引用 fetchmail 的開發為例。
市集模式的強大之處是在于,越多人看到原始碼,錯誤就越能被揪出來。大教堂模式的軟件開發讓程序除錯的時間大幅增加,因為只有少數的開發者可參與修改工作。市集模式則相反。
大部份的開放原始碼及自由軟件的開發計劃后來都受到雷蒙影響,開始采用市集模式,甚至原來采用大教堂模式的 GNC Emacs 及 GCC 也是如此。
最后跟大家分享下雷蒙的總結。他指出,集市要變成大教堂有幾個前提條件:
1 )你不能從零開始建設集市,你必須先有一個原始項目。
2 )你的原始項目可以有缺陷,但是它必須能運行。
3 )你必須向用戶展示一個可行的前景,且讓潛在的合作者相信在可預見的將來它會變成一個真正漂亮的東西。
4 )項目的主持者本身不一定是天才,但他一定要能夠慧眼識別出他人的優秀想法。
5 )項目的主持者必須要有良好的人際關系、交流技能和人格魅力。這樣才能吸引他人,使別人對你所做的事感興趣,愿意幫助你。
以上是一些必要條件,他還總結了一些成功的充分條件。
1 )項目首先必須是你自己感興趣的,但是最終能對其他人有用。
2 )將用戶當作合作者。
3 )盡快地和經常地做出改進,多聽取用戶的意見。
4 )健壯的結構遠比精巧的設計來得重要。換句話說,結構是第一位的,功能是第二位的。
5 )保持項目的簡單性。設計達到完美的時候,不是無法再增加東西了,而是無法再減少東西了