> [原文鏈接](http://www.aosabook.org/en/intro1.html)
木工是一門嚴苛的技藝,人們可以為之付出畢生精力以求精通。不過木工還不是建筑架構: 如果我們從樓梯三角板、斜接規這些細節回溯,建筑必須要作為一個整體去設計;設計是一門技藝或科學,同時也是一門藝術。
編程同樣是一門嚴苛的技藝,人們可以為之付出畢生精力以求精通。不過編程還不是軟件架構。多少程序員年復一年地思索乃至斟酌著一些更博大的設計問題:此應用是否應具備可擴展性?如果答案是肯定的,那么應該借助一個腳本接口來實現,還是通過某些插件機制,抑或采取完全不同的其它什么辦法?什么該交給客戶端去做?什么該留給服務器端?客戶端-服務器架構對此應用是否適用?這些問題都不是編程問題,正如在何處放置樓梯并不是一個木工問題。
建筑架構與軟件架構之間有許多相通的地方,但仍有一點關鍵區別。建筑師在其職業生涯要研習成千上萬的建筑,而大多數軟件開發者僅了解只手可數的幾個大型程序,多半還是他們自己寫的。他們從不看歷史上偉大的程序,也不閱讀有老手程序員寫的程序設計評論。結果,他們重復著別人的錯誤,而非站在別人的肩膀上。
我們編寫本書的目的就是嘗試改變這種現狀。本書的每章都介紹一個開源應用程序的架構:從程序的構成、內部組件的交互,到架構形成的原因,以及適用其它大型設計問題的經驗教訓總結。文章都是由那些最了解軟件的人執筆,這些人有著幾年甚至幾十年的復雜應用程序設計或重構經驗。這些應用程序的覆蓋面從簡易繪圖程序和基于網頁的電子表格,到編譯工具包和數百萬行代碼的可視化軟件包,有些只有幾年的歷史,有些則接近三十年。這些軟件的共同點是,其作者思慮周詳,設計嚴謹,且樂于分享他們的思想。我們希望你能享受他們的文字。
**貢獻者**
Eric P. Allman (Sendmail):Eric Allman是sendmail,syslog和trek的原作者,也是Sendmail公司的聯合創始人。在開源軟件剛剛得名而尚未形成一場“運動”之前,他就已經在編寫開源軟件。他是ACM Queue的編輯審查委員會成員,也是Cal Performances的理事會成員。他的個人網站是 http://www.neophilic.com/~eric。
Keith Bostic (Berkeley DB):Keith是加州大學伯克利分校計算機系統研究小組的成員之一, 他是BSD 2.10發布版的架構師,以及BSD 4.4相關發布版的主要開發者之一。他曾獲得USENIX終身成就獎(火焰獎),即Unix社區對他個人的貢獻給與肯定。他還曾因開放BSD4的源碼而獲得加州大學伯克利分校頒發的的杰出成就獎。Keith還是開源嵌入式數據庫系統Berkeley DB的架構師,也是早期開發者之一。
Amy Brown (editorial):Amy擁有滑鐵盧大學數學專業的學士學位,并在從事軟件行業十年。現在她從事寫作和編輯,有時參與軟件相關的書。她現居多倫多,有兩個孩子和一只老貓。
C. Titus Brown (Continuous Integration):Titus從事演化建模,物理氣象學,發育生物學,基因組學和生物信息學的工作。他現在是密歇根州立大學的助理教授,并將自己的興趣拓展到多個新領域中,包括科學軟件的重現性和可維護性。他也是Python軟件基金會的一個成員,博客在 http://ivory.idyll.org。
Roy Bryant (Snowflock):Roy作為一名從業20年的軟件架構師和首席技術官,設計的系統包括Electronics Workbench(即現在National Instruments的Multisim)和Linkwalker Data Pipeline--2006年曾獲微軟全球高性能計算最佳客戶獎。在賣掉最近一家創業公司后,他回到多倫多大學攻讀計算機科學專業的研究生,研究方向是虛擬化和云計算。最近他在2011年的ACM歐洲計算機系統會議上發表了對Snowflock的Kaleidoscope擴展。他的個人網站是 http://www.roybryant.net/。
Russell Bryant (Asterisk):Russell在Digium公司擔任開源軟件團隊的工程經理。自2004年秋季以來他一直是Asterisk開發團隊的核心成員。從那時起,從項目管理到核心架構的設計和開發,幾乎Asterisk開發所有領域都有他的貢獻。他的博客在 http://www.russellbryant.net。
Rosangela Canino-Koning (Continuous Integration):Rosangela在軟件工程領域潛心修行13年后,回歸大學校園,去密歇根州立大學攻讀計算機科學與進化生物學的博士學位。她的業余生活豐富多彩,愛閱讀、遠足、旅游以及鉆研(hack)開源的生物信息學軟件。她的博客在 http://www.voidptr.net。
Francesco Cesarini (Riak):Francesco Cesarini自1995年起就使用Erlang語言作為日常開發語言,在愛立信完成了許多交付項目,包括OPT R1發布版。他是Erlang Solution公司的創始人,也是O'Reilly出版的《Erlang程序設計》一書的作者之一。他如今是Erlang Solution的技術總監,但仍在抽時間去諸如英國牛津大學和瑞典哥德堡信息技術大學等校指導研究生和本科生。
Robert Chansler (HDFS):Robert是雅虎軟件開發部的高級經理。在卡梅隆大學完成了分布式系統方向的的研究生學習后,他從事過編譯器(Tartan Labs),打印及成像系統(Adobe Systems),電子商務( Adobe Systems,Impresse),以及網格化存儲管理(SanNavigator, McDATA)等項目。當回到分布式系統和HDFS,Rob發現許多熟悉的問題,而總數有3到4位數之多。
James Crook (Audacity):James是居于愛爾蘭都柏林的一名職業軟件開發人。雖然之前他開發的是生物信息軟件,但目前他正在開發電子設計工具。關于Audacity他有許多大膽的計劃,他希望至少其中一些計劃能夠付諸實現。
Chris Davis (Graphite):Chris是一名軟件顧問,也是一名Google軟件工程師,12年多一直致力于設計搭建可伸縮監測及自動化工具。Chris最初于2006年開始編寫Graphite,也是從那時起開始引領開源項目。當他不在寫代碼的時候,他熱衷于烹飪、創作音樂以及科研。他的研究興趣點包括知識建模,群論,信息論,混沌理論和復雜系統。
Juliana Freire (VisTrails):Juliana是在猶他州立大學計算機科學系副教授。此前她曾是貝爾實驗室(朗訊科技)數據庫系統研究部門的技術組成員,亦曾在俄勒岡健康科技大學研究生院任副教授。她的研究興趣包括數據起源,科學數據管理,信息集成和Web挖掘。她是國家科學基金職涯獎和IBM導師獎的獲得者。她的研究資金來源于國家科學基金會,能源部,美國衛生協會,IBM,微軟及雅虎。
Berk Geveci (VTK):Berk是Kitware公司的科學計算部主任。他負責領導研發團隊致力于一個獲獎的基于VTK的可視化應用程序--ParaView。他的研究興趣包括大規模并行計算,計算動力學,有限元,可視化算法。
Andy Gross (Riak):Andy Gross是芭蕉科技的首席架構師,負責管理芭蕉開源和企業數據存儲系統的設計與開發。2007年10月他進入芭蕉之時,在軟件工程與分布式系統工程領域已有10年經驗。在進入芭蕉之前,他曾在麻吉傳媒、蘋果和阿卡邁科技擔任高級分布式系統工程師。
Bill Hoffman (CMake):Bill是Kitware公司的聯合創始人兼首席技術官。他是CMake項目的核心開發人員,已經從事大型C++系統開發20年以上。
Cay Horstmann (Violet):Cay在圣何塞州立大學計算機科學系任教授,但有時會休假去企業工作,或者去國外執教。他是編程語言和軟件設計方面諸多書籍的作者,也是Violet和GridWorld開源程序的原作者。
Emil Ivov (Jitsi):Emil是Jitsi(以前名為SIP通訊)項目的創始人和領導者。他還與其他發起人共同參與了諸如ice4j.org和JAIN SIP等項目。Emil于2008年初在斯特拉斯堡大學取得博士學位,此后一直主要專注于Jitsi相關的活動。
David Koop (VisTrails):David是猶他州立大學計算機科學系的博士候選人(將于2011年夏取得博士學位)。他的研究興趣包括可視化,數據起源和科學數據管理。他是VisTrails系統的主程,也是VisTrails公司的高級軟件架構師。
Hairong Kuang (HDFS):(鄺海蓉)長期以來一直是Hadoop項目的捐助者和提交者,無論在現在的Facebook還是在之前的雅虎,她都為Hadoop激情奉獻。她曾在波莫納的加州州立理工大學任助理教授。她于爾灣市加州大學計算機科學系獲得博士學位。她的興趣包括云計算、移動代理、并行計算,和分布式系統。
H. Andrés Lagar-Cavilla (Snowflock):Andrés是一名在虛擬化、操作系統、安全性,集群計算和移動計算等領域從實驗性工作的軟件系統研究員。他曾在阿根廷取得理學學士學位,并于多倫多大學取得碩士和博士學位。他的資料在http://lagarcavilla.org。
Chris Lattner (LLVM):Chris是一個興趣廣泛、閱歷豐富的軟件開發者,特別是在編譯器工具鏈、操作系統、圖形圖像渲染領域。他是LLVM開源項目的設計師和首席架構師。更多有關Chris以及他的項目的信息在http://nondot.org/~sabre/。
Alan Laudicina (Thousand Parsec):Alan是韋恩州立大學計算機科學系的一名碩士研究生,專攻分布式計算。他通過寫代碼、學習編程語言和玩撲克度過業余時間。你可以在http://alanp.ca/找到更多關于他的信息 。
Danielle Madeley (Telepathy):Danielle是一名澳大利亞軟件工程師,現在在Collabora公司從事Telepathy開發以及其他神奇的工作。她擁有電子工程和計算機科學學士學位。她還廣泛收集長毛絨企鵝。她的博客在 http://blogs.gnome.org/danni/。
Adam Marcus (NoSQL):Adam是麻省理工大學計算機科學和人工智能實驗室的博士研究生,專注于數據庫系統與社會計算的交叉學科研究。他最近一項工作是用傳統數據庫與Twitter這樣的社交數據流以及亞馬遜土耳其機器人這樣的人群計算平臺相結合。他喜歡從他自己的研究原型構建可用的開源系統,喜歡在海灘漫步,更喜歡跟蹤開源存儲系統。他的博客在 http://blog.marcua.net。
Kenneth Martin (CMake):Ken是Kitware--一家總部設在美國的研發公司--的現任董事長兼首席財務官。他于1998年作為合伙人之一創立了Kitware公司,從此他幫助公司一步步發展到現在研發供應商龍頭老大的地位--其客戶群橫跨諸多政府和商業部門。
Aaron Mavrinac (Thousand Parsec):Aaron是溫莎大學電氣和計算機工程專業博士學位候選人,目前從事攝像機網絡、計算機視覺和機器人方向的研究。他拿出了部分業余時間投入到Thousand Parsec及其他自由軟件的開發工作,用Python和C寫代碼,還有太多自己不擅長的雜事。他的網站是 http://www.mavrinac.com。
Kim Moir (Eclipse):Kim在渥太華的IBM Rational軟件實驗室工作,他是Eclipse和Runtime Equinox項目的發布工程主管,也是Eclipse架構委員會成員。她的興趣在編譯優化,Equinox和組件化軟件構建。工作之余,她經常為了準備參加下一屆公路賽,與比賽對手一路飚車。她的博客在 http://relengofthenerds.blogspot.com/。
Dirkjan Ochtman (Mercurial):Dirkjan自2010年計算機科學專業碩士畢業后,一直在一個金融創業公司工作了三年。他業余時間也不閑著,鉆研(hack)Mercurial,Python,Gentoo Linux和一個Python寫的CouchDB庫。他生活在美麗的阿姆斯特丹。他個人網站的網址是 http://dirkjan.ochtman.nl/。
Sanjay Radia (HDFS):Sanjay在雅虎是Hadoop項目的架構師以及Hadoop開源參與者,也是阿帕奇軟件基金會的項目管理委員會成員。之前他曾在Cassatt、Sun、INRIA等公司擔任高級軟件工程師,負責開發分布式系統軟件和網格/效用計算基礎軟件。Sanjay在加拿大的滑鐵盧大學計算機科學系取得博士學位。
Chet Ramey (Bash):Chet參與bash項目已經20多年了,在過去的17年一直是主力開發人員。他是俄亥俄州克里夫蘭凱斯西儲大學的終身教員,他也是在這里取得了理工學士和碩士學位。如今他和家人以及寵物住在克利夫蘭附近。他的個人主頁是http://tiswww.cwru.edu/~chet。
Emanuele Santos (VisTrails):Emanuele是猶他大學一名從事科研工作的科學家。她的研究興趣包括科學數據管理,可視化和數據起源。她于2010年在猶他大學取得計算專業博士學位。她也是VisTrails系統的首席開發者。
Carlos Scheidegger (VisTrails):Carlos擁有猶他大學計算專業博士學位,現在是AT&T研究實驗室的研究員。Carlos在2007年的IEEE可視化大會和2008年的圖形建模國際會議上均獲得最佳論文獎。他的研究興趣包括數據可視化與分析、幾何處理和計算機圖形學。
Will Schroeder (VTK):Will是Kitware公司主席和合伙人。他是一名科班出身的計算科學家,也是VTK的核心開發者。他樂于寫漂亮的代碼,尤其是涉及計算幾何學或圖形學的代碼。
Margo Seltzer (Berkeley DB):Margo是哈佛大學應用科學與工程學院的史密斯學者教授,也是甲骨文公司的架構師。她是Berkeley DB的主力設計師之一,也是睡貓軟件公司的合伙人之一。她的研究興趣包括文件系統,數據庫系統,交易系統,以及醫療數據挖掘。她的職業生涯介紹在http://www.eecs.harvard.edu/~margo,博客在 http://mis-misinformation.blogspot.com/。
Justin Sheehy (Riak):Justin是Webmachine和Riak的幕后創作公司--芭蕉科技的首席技術官。在進入Basho公司之前,他是MITRE公司的首席科學家和阿卡邁基礎軟件的高級架構師。在這兩家公司里,他都專攻健壯分布系統的多個層面,包括調度算法、基于語言的形式化模型和彈性理論。
Richard Shimooka (韋諾之戰):Richard是安大略省金斯頓女王大學國防管理研究計劃的助理研究員。他也是“韋諾之戰”的副主管兼秘書。Richard已經寫了幾部關于社團組織文化研究的作品,涉及面從政府部門到開源項目。
Konstantin V. Shvachko (HDFS):HDFS的資深開發者,也是億貝的主力Hadoop架構師。Konstantin專攻用于大規模分布式存儲系統的高效數據結構和算法。他發現了一種新型平衡樹--S-樹,用于為非結構化數據建立最優化索引。他同時也是reiserFS的原型--treeFS(一種基于S-樹的Linux文件系統)項目的主程。Konstantin擁有俄羅斯莫斯科國立大學計算機科學博士學位。他也是Apache Hadoop項目管理委員會的成員之一。
Claudio Silva (VisTrails):Claudio是猶他州立大學計算機科學系教授。他的研究興趣包括可視化,計算幾何,計算機圖形學和科學數據管理。他于1996年在紐約州立大學石溪分校計算機科學系取得博士學位。2011年末,他將加盟紐約大學理工學院,擔任計算機科學與工程系的全職教授。
Suresh Srinivas (HDFS): Suresh是雅虎的軟件架構師,從事HDFS的開發工作。在Apache軟件基金會,他是Hadoop項目的參與者和項目管理委員會成員。加盟雅虎之前,他在Sylantro Systems工作,為托管式通信服務開發可伸縮的基礎軟件。Suresh擁有印度卡納塔克邦國家科技研究院電子通訊專業的學士學位。
Simon Stewart (Selenium): Simon住在倫敦,是谷歌的軟件測試工程師。他是Selenium項目的核心捐助者,是WebDriver的締造者,開源控。Simon喜歡喝啤酒,也喜歡精益求精的寫軟件,有時也同時做這兩件事。他的個人主頁是 http://www.pubbitch.org/。
Audrey Tang (SocialCalc): Audrey住在臺灣,系自學成才的程序員兼翻譯員。她現在讀寫網工作,職位是“無業人員”,同時在蘋果公司兼任本地化和發布工程的外包人員。她之前曾設計和主導Pugs項目,這是Perl 6的第一個實現版本。她也曾效力于Haskell、Perl 5、Perl 6的語言設計委員會,并對CPAN(Perl綜合檔案網)和Hackage做出了無數的貢獻。她的博客在 http://pugs.blogs.com/audreyt/。
Huy T. Vo (VisTrails): Huy于2011年5月在猶他大學獲得博士學位。他的研究興趣包括可視化,數據流架構和科學數據管理。他是VisTrails公司的高級開發人員。他還被聘為紐約大學理工學院的研究助理教授。
David White (Battle for Wesnoth):David是韋諾之戰的創始人和開發主管。他與了幾個開源的視頻游戲項目,包括Frogatto,他也是此項目的合伙創始人之一。David在旅游科技領域的領頭羊Sabre Holdings公司任性能工程師。
Greg Wilson (editorial):Greg從事高性能計算,數據可視化和計算機安全領域的工作已經超過25年了,他或著或編,出了好幾本計算機書籍(包括曾獲2008年震撼大獎的《代碼之美》)和兩本少兒讀物。Greg于1993年在愛丁堡大學取得計算機科學專業博士學位。他博客在 http://third-bit.com,還有http://software-carpentry.org。
Tarek Ziadé (Python打包):Tarek生活在法國勃艮第。他是Mozilla的高級軟件工程師,負責用Python構建服務器程序。在業余時間,他努力主導著Python打包項目。
**致謝**
我們要感謝以下審校人:
| Eric Aderhold | Muhammad Ali | Lillian Angel |
| Robert Beghian | Taavi Burns | Luis Pedro Coelho |
| David Cooper | Mauricio de Simone | Jonathan Deber |
| Patrick Dubroy | Igor Foox | Alecia Fowler |
| Marcus Hanwell | Johan Harjono | Vivek Lakshmanan |
| Greg Lapouchnian | Laurie MacDougall Sookraj | Josh McCarthy |
| Jason Montojo | Colin Morris | Christian Muise |
| Victor Ng | Nikita Pchelin | Andrew Petersen |
| Andrey Petrov | Tom Plaskon | Pascal Rapicault |
| Todd Ritchie | Samar Sabie | Misa Sakamoto |
| David Scannell | Clara Severino | Tim Smith |
| Kyle Spaans | Sana Tapal | Tony Targonski |
| Miles Thibault | David Wright | Tina Yee |
我們也要感謝Jackie Carter,他在早期的編輯階段曾助我們一臂之力。
封面圖片是Peter Dutton拍攝的《自由街48號壁畫》,由Chris Denison繪于緬因州波特蘭市。這幅照片根據知識共享組織的[BY-NC-SA 2.0通用協議](http://creativecommons.org/licenses/by-nc-sa)授權使用。
**致**
致:令我們獲益匪淺的Brian Kernighan,
以及全世界困于牢籠的異見人士!
- 前言(卷一)
- 卷1:第1章 Asterisk
- 卷1:第3章 The Bourne-Again Shell
- 卷1:第5章 CMake
- 卷1:第6章 Eclipse之一
- 卷1:第6章 Eclipse之二
- 卷1:第6章 Eclipse之三
- 卷1:第8章 HDFS——Hadoop分布式文件系統之一
- 卷1:第8章 HDFS——Hadoop分布式文件系統之二
- 卷1:第8章 HDFS——Hadoop分布式文件系統
- 卷1:第12章 Mercurial
- 卷1:第13章 NoSQL生態系統
- 卷1:第14章 Python打包工具
- 卷1:第15章 Riak與Erlang/OTP
- 卷1:第16章 Selenium WebDriver
- 卷1:第18章 SnowFlock
- 卷1:第22章 Violet
- 卷1:第24章 VTK
- 卷1:第25章 韋諾之戰
- 卷2:第1章 可擴展Web架構與分布式系統之一
- 卷2:第1章 可擴展Web架構與分布式系統之二
- 卷2:第2章 Firefox發布工程
- 卷2:第3章 FreeRTOS
- 卷2:第4章 GDB
- 卷2:第5章 Glasgow Haskell編譯器
- 卷2:第6章 Git
- 卷2:第7章 GPSD
- 卷2:第9章 ITK
- 卷2:第11章 matplotlib
- 卷2:第12章 MediaWiki之一
- 卷2:第12章 MediaWiki之二
- 卷2:第13章 Moodle
- 卷2:第14章 NginX
- 卷2:第15章 Open MPI
- 卷2:第18章 Puppet part 1
- 卷2:第18章 Puppet part 2
- 卷2:第19章 PyPy
- 卷2:第20章 SQLAlchemy
- 卷2:第21章 Twisted
- 卷2:第22章 Yesod
- 卷2:第24章 ZeroMQ