开源应用程序架构(第一卷)
介绍

艾米·布朗和格雷格·威尔逊

木工是一门精细的技艺,人们可以花一生的时间学习如何精通它。但木工不是建筑:如果我们从木板和斜接接合处后退一步,建筑整体必须经过设计,而设计既是艺术,也是技艺或科学。

编程也是一门精细的技艺,人们可以花一生的时间学习如何精通它。但编程不是软件架构。许多程序员花费数年时间思考(或与之作斗争)更大的设计问题:这个应用程序应该可扩展吗?如果是,应该通过提供脚本接口、某种插件机制,还是完全以其他方式实现?客户端应该做什么,服务器应该做什么,“客户端-服务器” 还是一个思考这个应用程序的有效方法?这些不是编程问题,正如楼梯的位置不是木工问题一样。

建筑架构和软件架构有很多共同点,但有一个关键区别。虽然建筑师在他们的培训和职业生涯中会学习数千座建筑,但大多数软件开发人员只会深入了解少数几个大型程序。而且,他们通常是自己编写的程序。他们从未见过历史上伟大的程序,也从未读过经验丰富的从业人员对这些程序设计的评论。因此,他们会重复彼此的错误,而不是在彼此的成功基础上进行构建。

本书是我们试图改变这一现状的尝试。每一章都描述一个开源应用程序的架构:它的结构如何,它的部分如何交互,为什么这样构建,以及从中学到的哪些经验教训可以应用于其他大型设计问题。这些描述由最了解该软件的人员编写,他们拥有多年或几十年的经验,设计和重新设计复杂的应用程序。这些应用程序本身的规模从简单的绘图程序和基于 Web 的电子表格,到编译器工具包和数百万行的可视化软件包。有些只有几年历史,而另一些则即将迎来 30 周年纪念。它们的共同点是,它们的创建者对设计进行了长时间的思考,并愿意与您分享这些想法。我们希望您喜欢他们写的内容。

贡献者

埃里克·P·奥尔曼(Sendmail):埃里克·奥尔曼是 sendmail、syslog 和 trek 的最初作者,也是 Sendmail, Inc. 的联合创始人。早在“开源”这个词出现之前,甚至成为一种“运动”之前,他就一直在编写开源软件。他是 ACM Queue 编辑评审委员会和加州表演艺术委员会的成员。他的个人网站是 http://www.neophilic.com/~eric.

基思·博斯蒂克(Berkeley DB):基思是加州大学伯克利分校计算机系统研究小组的成员,在那里他担任了 2.10BSD 版本的架构师,并是 4.4BSD 及其相关版本的主要开发人员。他获得了 USENIX 终身成就奖(“火焰”),该奖项表彰对 Unix 社区的独特贡献,以及加州大学伯克利分校授予的杰出成就奖,表彰其将 4BSD 版本开源。基思是 Berkeley DB(开源嵌入式数据库系统)的架构师和最初开发人员之一。

艾米·布朗(编辑):艾米拥有滑铁卢大学数学学士学位,曾在软件行业工作了十年。她现在写作和编辑书籍,有时是关于软件的书籍。她住在多伦多,有两个孩子和一只非常老的猫。

C. 蒂图斯·布朗(持续集成):蒂图斯曾在进化建模、物理气象学、发育生物学、基因组学和生物信息学领域工作过。他现在是密歇根州立大学的助理教授,在那里他扩展了兴趣领域,包括科学软件的可重复性和可维护性。他也是 Python 软件基金会的成员,并在 http://ivory.idyll.org 上写博客。

罗伊·布莱恩特(Snowflock):罗伊作为软件架构师和首席技术官已有 20 年,他设计了包括电子工作台(现为国家仪器的 Multisim)和 Linkwalker 数据管道在内的系统,该数据管道在 2006 年赢得了微软全球高性能计算获奖客户奖。在出售了他的最新创业公司后,他回到多伦多大学攻读计算机科学研究生,研究重点是虚拟化和云计算。最近,他在 2011 年 ACM 的 Eurosys 会议上发布了他的 Kaleidoscope 对 Snowflock 的扩展。他的个人网站是 http://www.roybryant.net/.

罗素·布莱恩特(Asterisk):罗素是 Digium, Inc. 开源软件团队的工程经理。自 2004 年秋季以来,他一直是 Asterisk 开发团队的核心成员。此后,他参与了几乎所有 Asterisk 开发领域,从项目管理到核心架构设计和开发。他在 http://www.russellbryant.net 上写博客。

罗桑吉拉·卡尼诺-科宁(持续集成):在软件行业艰苦工作了 13 年后,罗桑吉拉回到大学攻读密歇根州立大学的计算机科学和进化生物学博士学位。在她的空闲时间,她喜欢阅读、远足、旅行,以及编写开源生物信息学软件。她在 http://www.voidptr.net 上写博客。

弗朗切斯科·塞萨里尼(Riak):弗朗切斯科·塞萨里尼自 1995 年起每天都在使用 Erlang,在爱立信参与过各种交钥匙项目,包括 OTP R1 版本。他是 Erlang Solutions 的创始人,也是 O'Reilly 的 Erlang Programming 一书的合著者。他目前在 Erlang Solutions 担任技术总监,但他仍然抽出时间在英国的牛津大学和瑞典的哥德堡 IT 大学教授研究生和本科生。

罗伯特·钱斯勒(HDFS):罗伯特是雅虎!软件开发高级经理。在卡内基梅隆大学攻读分布式系统研究生后,他参与过编译器(Tartan Labs)、印刷和成像系统(Adobe Systems)、电子商务(Adobe Systems、Impresse)和存储区域网络管理(SanNavigator、McDATA)的开发。回到分布式系统和 HDFS 后,罗伯特发现许多熟悉的问题,但所有数字都多出两到三个零。

詹姆斯·克鲁克(Audacity):詹姆斯是一名基于爱尔兰都柏林的合同软件开发人员。目前,他正在开发电子设计工具,但在之前的工作中,他曾开发生物信息学软件。他对 Audacity 有许多大胆的计划,他希望至少有一些计划能够实现。

克里斯·戴维斯(Graphite):克里斯是一位软件顾问和谷歌工程师,在过去 12 年中一直在设计和构建可扩展的监控和自动化工具。克里斯最初在 2006 年编写了 Graphite,并从那时起一直领导着这个开源项目。当他不写代码时,他喜欢烹饪、创作音乐和做研究。他的研究兴趣包括知识建模、群论、信息论、混沌理论和复杂系统。

朱莉安娜·弗雷雷(VisTrails):朱莉安娜是犹他大学计算机科学副教授。在此之前,她是贝尔实验室(朗讯科技)数据库系统研究部门的技术人员,也是 OGI/OHSU 的助理教授。她的研究兴趣包括来源、科学数据管理、信息整合和 Web 挖掘。她获得了 NSF CAREER 奖和 IBM 教师奖。她的研究获得了美国国家科学基金会、能源部、美国国立卫生研究院、IBM、微软和雅虎!的资助。

贝克·格维奇(VTK):贝克是 Kitware 科学计算总监。他负责领导 ParaView 的开发工作,ParaView 是一款基于 VTK 的屡获殊荣的可视化应用程序。他的研究兴趣包括大型并行计算、计算动力学、有限元和可视化算法。

安迪·格罗斯(Riak):安迪·格罗斯是 Basho Technologies 的首席架构师,负责管理 Basho 开源和企业数据存储系统的设计和开发。安迪于 2007 年 12 月加入 Basho,拥有 10 年的软件和分布式系统工程经验。在加入 Basho 之前,安迪曾在 Mochi Media、苹果公司和 Akamai Technologies 担任高级分布式系统工程职位。

比尔·霍夫曼(CMake):比尔是 Kitware, Inc. 的首席技术官和联合创始人。他是 CMake 项目的主要开发人员,并且在大型 C++ 系统方面有 20 多年的经验。

凯·霍斯特曼(Violet):凯是圣何塞州立大学的计算机科学教授,但偶尔他会休假去工业界工作或在国外教学。他是许多关于编程语言和软件设计的书籍的作者,也是 Violet 和 GridWorld 开源程序的最初作者。

埃米尔·伊沃夫(Jitsi):埃米尔是 Jitsi 项目(以前称为 SIP Communicator)的创始人兼项目负责人。他还参与了 ice4j.org 和 JAIN SIP 项目等其他计划。埃米尔于 2008 年初获得斯特拉斯堡大学博士学位,此后一直专注于 Jitsi 相关活动。

大卫·库普(VisTrails):大卫是犹他大学计算机科学博士候选人(将于 2011 年夏季毕业)。他的研究兴趣包括可视化、来源和科学数据管理。他是 VisTrails 系统的主要开发人员,也是 VisTrails, Inc. 的高级软件架构师。

海蓉·匡(HDFS):海蓉·匡是 Hadoop 项目的长期贡献者和提交者,她在该项目上投入了大量精力,目前在 Facebook 工作,之前在雅虎!工作。在进入工业界之前,她曾是加州理工州立理工大学波莫纳分校的助理教授。她获得了加州大学欧文分校的计算机科学博士学位。她的兴趣包括云计算、移动代理、并行计算和分布式系统。

H. 安德烈斯·拉加-卡维利亚(Snowflock):安德烈斯是一位软件系统研究员,在虚拟化、操作系统、安全、集群计算和移动计算方面进行实验性工作。他拥有阿根廷的理学学士学位,以及多伦多大学的计算机科学硕士和博士学位,可以在线找到他:http://lagarcavilla.org.

克里斯·拉特纳(LLVM):克里斯是一位软件开发人员,拥有广泛的兴趣和经验,特别是在编译器工具链、操作系统、图形和图像渲染领域。他是开源 LLVM 项目的设计者和首席架构师。有关克里斯及其项目的更多信息,请参见 http://nondot.org/~sabre/.

艾伦·劳迪西纳(Thousand Parsec):艾伦是韦恩州立大学计算机科学硕士研究生,在那里他研究分布式计算。在他的空闲时间,他编码、学习编程语言和玩扑克。您可以在 http://alanp.ca/ 上找到更多关于他的信息。

丹妮尔·梅德利(Telepathy):丹妮尔是一位澳大利亚软件工程师,在 Collabora Ltd. 为 Telepathy 和其他魔法项目工作。她拥有电子工程和计算机科学学士学位。她还收藏了大量的毛绒企鹅。她在 http://blogs.gnome.org/danni/ 上写博客。

Adam Marcus (NoSQL): Adam 是麻省理工学院计算机科学与人工智能实验室的一名博士生,专注于数据库系统与社交计算的交叉领域。他的近期工作将传统的数据库系统与 Twitter 等社交流以及 Mechanical Turk 等人工计算平台联系起来。他喜欢从他的研究原型构建可用的开源系统,并且更喜欢跟踪开源存储系统,而不是在海滩上漫步。他的博客地址为 http://blog.marcua.net.

Kenneth Martin (CMake): Ken 目前是 Kitware, Inc. 的董事长兼首席财务官,该公司是一家总部位于美国的研发公司。他于 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 年获得计算机科学硕士学位,并在一家金融初创公司工作了 3 年。在空闲时间不拖延的情况下,他会在 Mercurial、Python、Gentoo Linux 和一个 Python CouchDB 库上进行黑客攻击。他住在美丽的阿姆斯特丹。他的个人网站地址为 http://dirkjan.ochtman.nl/.

Sanjay Radia (HDFS): Sanjay 是 Yahoo! Hadoop 项目的架构师,也是 Apache 软件基金会的 Hadoop 提交者和项目管理委员会成员。在此之前,他在 Cassatt、Sun Microsystems 和 INRIA 担任高级工程职位,负责开发用于分布式系统和网格/实用计算基础设施的软件。Sanjay 拥有加拿大滑铁卢大学的计算机科学博士学位。

Chet Ramey (Bash): Chet 参与 bash 项目已有 20 多年,过去 17 年一直担任主要开发人员。他是俄亥俄州克利夫兰凯斯西储大学的长期员工,并从那里获得了理学学士和理学硕士学位。他和家人以及宠物住在克利夫兰附近,他的在线地址为 http://tiswww.cwru.edu/~chet.

Emanuele Santos (VisTrails): Emanuele 是犹他大学的研究科学家。她的研究兴趣包括科学数据管理、可视化和 provenance。她在 2010 年获得犹他大学的计算博士学位。她还是 VisTrails 系统的首席开发人员。

Carlos Scheidegger (VisTrails): Carlos 拥有犹他大学的计算博士学位,目前是 AT&T 实验室 - 研究的科研人员。Carlos 在 2007 年的 IEEE 可视化会议和 2008 年的 Shape Modeling International 会议上获得了最佳论文奖。他的研究兴趣包括数据可视化和分析、几何处理和计算机图形学。

Will Schroeder (VTK): Will 是 Kitware, Inc. 的总裁兼联合创始人。他接受过计算科学家的培训,并且是 VTK 的主要开发人员之一。他喜欢编写优美的代码,尤其是涉及计算几何或图形的代码。

Margo Seltzer (Berkeley DB): Margo 是哈佛大学工程与应用科学学院的赫歇尔·史密斯计算机科学教授,也是 Oracle 公司的架构师。她是 Berkeley DB 的主要设计者之一,也是 Sleepycat Software 的联合创始人。她的研究兴趣在于文件系统、数据库系统、事务系统和医疗数据挖掘。她的职业生涯在线地址为 http://www.eecs.harvard.edu/~margo,她的博客地址为 http://mis-misinformation.blogspot.com/.

Justin Sheehy (Riak): Justin 是 Basho Technologies 的首席技术官,该公司是 Webmachine 和 Riak 的创建者。在加入 Basho 之前,他是 MITRE 公司的首席科学家,也是 Akamai 的系统基础设施高级架构师。在这两家公司,他都专注于健壮的分布式系统的多个方面,包括调度算法、基于语言的形式化模型和弹性。

Richard Shimooka (Battle for Wesnoth): Richard 是安大略省金斯顿女王大学国防管理研究项目的助理研究员。他也是《战锤:西诺斯之战》的副管理员和秘书。Richard 撰写了几部作品,考察了社会群体(从政府到开源项目)的组织文化。

Konstantin V. Shvachko (HDFS),一位经验丰富的 HDFS 开发人员,是 eBay 的 Hadoop 首席架构师。Konstantin 专注于大型分布式存储系统的高效数据结构和算法。他发现了一种新型的平衡树 S-tree,用于对非结构化数据进行最佳索引,并且是基于 S-tree 的 Linux 文件系统 treeFS 的主要开发人员,treeFS 是 reiserFS 的原型。Konstantin 拥有俄罗斯莫斯科国立大学的计算机科学博士学位。他也是 Apache Hadoop 项目管理委员会的成员。

Claudio Silva (VisTrails): Claudio 是犹他大学的计算机科学教授。他的研究兴趣在于可视化、几何计算、计算机图形学和科学数据管理。他在 1996 年获得纽约州立大学石溪分校的计算机科学博士学位。后来,他将在 2011 年加入纽约大学理工学院,担任计算机科学与工程教授。

Suresh Srinivas (HDFS): Suresh 在 Yahoo! 担任软件架构师,负责 HDFS 的开发。他是 Apache 软件基金会的 Hadoop 提交者和 PMC 成员。在加入 Yahoo! 之前,他在 Sylantro Systems 工作,为托管通信服务开发可扩展的基础设施。Suresh 拥有印度国家科技学院卡纳塔克邦的电子与通信学士学位。

Simon Stewart (Selenium): Simon 住在伦敦,在 Google 担任软件测试工程师。他是 Selenium 项目的核心贡献者,是 WebDriver 的创建者,并且对开源充满热情。Simon 喜欢啤酒和编写更好的软件,有时两者兼而有之。他的个人主页地址为 http://www.pubbitch.org/.

Audrey Tang (SocialCalc): Audrey 是一位自学成才的程序员和翻译员,常住台湾。她目前在 Socialtext 工作,职位是“无标题页面”,并且是 Apple 的本地化和发布工程承包商。她之前设计并领导了 Pugs 项目,这是第一个可工作的 Perl 6 实现;她还曾在 Haskell、Perl 5 和 Perl 6 的语言设计委员会任职,并且为 CPAN 和 Hackage 做出了大量贡献。她的博客地址为 http://pugs.blogs.com/audreyt/.

Huy T. Vo (VisTrails): Huy 将于 2011 年 5 月从犹他大学获得博士学位。他的研究兴趣包括可视化、数据流架构和科学数据管理。他是 VisTrails, Inc. 的高级开发人员。他还担任纽约大学理工学院的助理研究教授。

David White (Battle for Wesnoth): David 是《战锤:西诺斯之战》的创始人兼首席开发人员。David 参与过几个开源视频游戏项目,包括他也共同创立的 Frogatto。David 是 Sabre Holdings 的性能工程师,Sabre Holdings 是旅行技术领域的领导者。

Greg Wilson (editorial): Greg 在过去 25 年中一直在高性能科学计算、数据可视化和计算机安全领域工作,并且是几本计算机书籍(包括 2008 年获得 Jolt 奖的《优美代码》)和两本儿童书籍的作者或编辑。Greg 于 1993 年获得爱丁堡大学的计算机科学博士学位。他的博客地址为 http://third-bit.comhttp://software-carpentry.org.

Tarek Ziadé (Python Packaging): 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 绘制。该照片的许可协议为 知识共享署名-非商业性使用-相同方式共享 2.0 通用许可协议

献辞

献给 Brian Kernighan,
他教会了我们所有人很多东西;
以及献给世界各地的良心犯。