前言
木工是一门严苛的技艺,人们可以为之付出毕生精力以求精通。不过木工还不是建筑架构: 如果我们从楼梯三角板、斜接规这些细节回溯,建筑必须要作为一个整体去设计;设计是一门技艺或科学,同时也是一门艺术。
编程同样是一门严苛的技艺,人们可以为之付出毕生精力以求精通。不过编程还不是软件架构。多少程序员年复一年地思索乃至斟酌着一些更博大的设计问题:此应用是否应具备可扩展性?如果答案是肯定的,那么应该借助一个脚本接口来实现,还是通过某些插件机制,抑或采取完全不同的其它什么办法?什么该交给客户端去做?什么该留给服务器端?客户端-服务器架构对此应用是否适用?这些问题都不是编程问题,正如在何处放置楼梯并不是一个木工问题。
建筑架构与软件架构之间有许多相通的地方,但仍有一点关键区别。建筑师在其职业生涯要研习成千上万的建筑,而大多数软件开发者仅了解只手可数的几个大型程序,多半还是他们自己写的。他们从不看历史上伟大的程序,也不阅读有老手程序员写的程序设计评论。结果,他们重复着别人的错误,而非站在别人的肩膀上。
我们编写本书的目的就是尝试改变这种现状。本书的每章都介绍一个开源应用程序的架构:从程序的构成、内部组件的交互,到架构形成的原因,以及适用其它大型设计问题的经验教训总结。文章都是由那些最了解软件的人执笔,这些人有着几年甚至几十年的复杂应用程序设计或重构经验。这些应用程序的覆盖面从简易绘图程序和基于网页的电子表格,到编译工具包和数百万行代码的可视化软件包,有些只有几年的历史,有些则接近三十年。这些软件的共同点是,其作者思虑周详,设计严谨,且乐于分享他们的思想。我们希望你能享受他们的文字。
贡献者
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通用协议授权使用。