这是《开源应用程序架构》系列的第四卷,也是第一本标题中没有“开源应用程序”字样的书。
该系列的前三卷是关于大型程序必须解决的大问题。对于职业生涯初期的工程师来说,可能很难理解并构建比几千行代码大得多的程序,因此,虽然阅读关于大问题的文章很有趣,但它们也可能难以从中学习。
《500 行或更少》侧重于程序员在构建新事物时,在小范围内做出的设计决策。您将在本书中阅读的程序都是为此目的从头开始编写的(尽管其中一些程序的灵感来自作者之前参与过的更大项目)。
在阅读每一章之前,我们建议您先思考一下如何解决问题。您认为作者会认为哪些设计考量或约束很重要?您期望看到哪些抽象?您认为问题将如何分解?然后,在阅读章节时,试着找出哪些让您感到惊讶。我们希望,通过这种方式,您将比仅仅从头到尾阅读每一章学到更多东西。
在不使用廉价技巧的情况下,编写一个源代码少于 500 行的有用程序本身就是一个挑战;编写一个可以在印刷书籍中整齐呈现时用于教学目的的程序,更具挑战性。因此,编辑在将源代码移植到书籍时,偶尔会对一些源代码格式进行修改。每一章的原始源代码可以在其项目文件夹的 code
子目录中找到。
我们希望本书中作者的经验能帮助您在自己的编程实践中走出舒适区。
---Michael DiBernardo
Michael DiBernardo(编辑): Michael DiBernardo 是 Wave 的工程师兼交付总监,也是 PyCon Canada 的前主席。他在 mikedebo.ca 上写作。
Amy Brown(编辑): Amy Brown 是一位驻多伦多的自由编辑。她专门从事科学和学术编辑,以及与自出版作者合作。她与 Greg Wilson 共同编辑了《开源应用程序架构》系列书籍。
Dethe Elza(Blockcode): Dethe 是一位极客爸爸,审美程序员,导师,也是 Waterbear 可视化编程工具的创造者。他是温哥华制造者教育沙龙的联合主持人,希望用机器人折纸兔子填满世界。
Malini Das(CI): Malini 是一位软件工程师,热衷于快速(但安全地!)开发,以及解决跨职能问题。她曾在 Mozilla 工作过,担任工具工程师,目前正在 Twitch 提升自己的技能。
Dustin J. Mitchell(Cluster): Dustin 是 Mozilla 的开源软件开发人员和发布工程师。他曾在各种项目中工作,例如 Puppet 中的宿主配置系统、基于 Flask 的 Web 框架、防火墙配置的单元测试以及 Twisted Python 中的持续集成框架。
Daniel Rocco(Contingent): Daniel 热爱 Python、咖啡、手工、黑啤、对象和系统设计、波旁威士忌、教学、树木和拉丁吉他。他很高兴能够以 Python 为生,他一直在寻找从社区中其他人那里学习的机会,并通过分享知识做出贡献。他是 PyAtl 的常客,演讲主题包括入门主题、测试、设计和闪亮事物;他喜欢看到人们在分享令人惊讶或美丽的想法时,眼中闪烁着喜悦的光芒。Daniel 与一位微生物学家和四个有抱负的火箭学家住在亚特兰大。
Brandon Rhodes(Contingent): Brandon Rhodes 在 20 世纪 90 年代后期开始使用 Python,并且在 17 年间一直在维护供业余天文学家使用的 PyEphem 库。他在 Dropbox 工作,为企业客户开设过 Python 编程课程,为像新英格兰野生花卉协会的“Go Botany”Django 网站这样的项目提供过咨询,并且将在 2016 年和 2017 年担任 PyCon 大会的主席。Brandon 认为,写得好的代码是一种文学形式,格式优美的代码是一件平面设计作品,而正确的代码是思想最透明的形式之一。
A. Jesse Jiryu Davis(Crawler): Jesse 是纽约 MongoDB 的高级工程师。他编写了 Motor,一个异步 MongoDB Python 驱动程序,并且是 MongoDB C 驱动程序的首席开发者,也是 PyMongo 团队的成员。他为 asyncio 和 Tornado 做出贡献。他在 emptysqua.re 上写作。
Guido van Rossum(Crawler): Guido 是 Python 的创造者,Python 是网络内外主要的编程语言之一。Python 社区称他为 BDFL(终身仁慈独裁者),这是一个直接来自 Monty Python 小品的称号。
Dann Toliver(Dagoba): Dann 喜欢构建事物,例如编程语言、数据库、分布式系统、聪明的友好人类社区以及他两岁的孩子用积木搭建的小马城堡。
Taavi Burns(DBDB): 作为 Countermeasure 中最新加入的贝斯手(有时也担任男高音),Taavi 努力打破陈规……有时只是通过无视它的存在来实现。在他的职业生涯中,他所经历过的各种工作场所证明了这一点:IBM(从事 C 和 Perl 工作)、FreshBooks(所有工作)、Points.com(从事 Python 工作),以及现在的 PagerDuty(从事 Scala 工作)。除此之外,当他不骑着他的 Brompton 折叠自行车四处闲逛时,你可能会发现他正在和儿子一起玩 Minecraft 或者和妻子一起进行跑酷(或者攀岩,或者其他冒险活动)。他用大陆式针法编织。
Leo Zovic: Leo(在网上更广为人知的名字是 inaimathi)是一位正在康复的平面设计师,他曾经专业地编写过 Scheme、Common Lisp、Erlang、Javascript、Haskell、Clojure、Go、Python、PHP 和 C。他现在写关于编程的博客,玩棋盘游戏,并在一间位于安大略省多伦多的基于 Ruby 的初创公司工作。
Christian Muise 博士(Flow shop): Muise 博士是麻省理工学院计算机科学与人工智能实验室基于模型的嵌入式和机器人系统小组的研究员。他感兴趣的领域包括人工智能、数据驱动项目、制图、图论和数据可视化,以及凯尔特音乐、雕刻、足球和咖啡。
Yoav Rubin(CircleDB): Yoav 是微软的高级软件工程师,在此之前是 IBM 研究院的研究员和首席发明家。他现在从事云数据安全领域的工作,而之前他的工作重点是开发基于云或 Web 的开发环境。Yoav 拥有神经科学领域医学研究硕士学位和信息系统工程学士学位。
Cate Huston(Image filters): Cate 是一位专注于移动端的开发者和企业家。她曾在英国、澳大利亚、加拿大、中国和美国生活和工作,担任过 Google 的工程师、IBM 的 Extreme Blue 实习生以及滑雪教练。Cate 在全球范围内发表关于移动开发的演讲,她的文章发表在各种网站上,例如 Lifehacker、The Daily Beast、The Eloquent Woman 和 Model View Culture。她与他人共同策划 Technically Speaking,在 Accidentally in Code 上写博客,并且在 Twitter 上是 @catehstn。
Allison Kaptur(Interpreter): Allison 是 Dropbox 的工程师,在那里她帮助维护着世界上最大的 Python 客户端网络之一。在 Dropbox 之前,她是 Recurse Center 的引导员,Recurse Center 是纽约程序员的写作静修所。她在 PyCon 北美会议上谈论过 Python 内部结构,并且喜欢奇怪的错误。
Erick Dransch(Modeller): Erick 是一位软件开发者,也是 2D 和 3D 计算机图形的爱好者。他曾从事过视频游戏、3D 特效软件和计算机辅助设计工具的开发。如果涉及到模拟现实,他很可能想了解更多。你可以在 erickdransch.com 上找到他。
Carl Friedrich Bolz(Object model): Carl 是伦敦国王学院的研究员,他对各种动态语言的实现和优化有着广泛的兴趣。他是 PyPy/RPython 的核心作者之一,并且参与过 Prolog、Racket、Smalltalk、PHP 和 Ruby 的实现工作。
Marina Samuel(OCR): Marina 是 Mozilla 的工程师,也是多伦多大学应用计算(人工智能)专业的现任硕士生。她希望有一天能够制造出能够接管世界的机器人。
Dessy Daskalov(Pedometer): Dessy 本职工作是工程师,出于热情,她成为了一名企业家,同时也是一名开发人员。她目前是 Nudge Rewards 的首席技术官和联合创始人。当她没有忙于和团队一起构建产品时,你可能会发现她正在教别人编程、参加或主持多伦多科技活动,或者在 dessydaskalov.com 和 @dess_e 上在线活动。
Eunsuk Kang(Same-origin policy): Eunsuk 是麻省理工学院软件设计小组的博士生。他获得了麻省理工学院计算机科学硕士学位(2010 年),以及滑铁卢大学软件工程学士学位(2007 年)。他的研究项目主要集中在开发用于软件建模和验证的工具和技术,并将其应用于安全和安全关键系统。
Santiago Perez(Same-origin policy): Santiago 是麻省理工学院软件设计小组的博士生。他获得了麻省理工学院计算机科学硕士学位(2015 年),以及 ITBA 的本科学位(2011 年)。他曾在 Google 工作过,开发框架和工具,以提高工程师的生产力(2012 年)。他目前大部分时间都在思考设计和版本控制。
Daniel Jackson(Same-origin policy): Daniel 是麻省理工学院电子工程与计算机科学系的教授,领导着计算机科学与人工智能实验室的软件设计小组。他获得了牛津大学物理学硕士学位(1984 年),以及麻省理工学院计算机科学硕士学位(1988 年)和博士学位(1992 年)。他是 Logica UK Ltd. 的软件工程师(1984-1986 年)、卡内基梅隆大学计算机科学助理教授(1992-1997 年),并且从 1997 年起一直在麻省理工学院任教。他对软件工程有着广泛的兴趣,特别是在开发方法、设计和规范、形式化方法以及安全关键系统方面。
Jessica B. Hamrick(Sampler): Jess 是加州大学伯克利分校的博士生,她通过将机器学习中的概率模型与认知科学中的行为实验结合起来,研究人类认知。在业余时间,Jess 是 IPython 和 Jupyter 的核心贡献者。她还拥有麻省理工学院计算机科学学士学位和硕士学位。
Audrey Tang(Spreadsheet): Audrey 是一位自学成才的程序员和翻译员,她与 Apple 合作,作为独立承包商从事云服务本地化和自然语言技术工作。Audrey 之前设计并领导了第一个可运行的 Perl 6 实现,并且担任过 Haskell、Perl 5 和 Perl 6 的计算机语言设计委员会成员。目前,Audrey 是一名全职的 g0v 贡献者,并领导着台湾第一个电子规则制定项目。
Leah Hanson(静态分析):Leah Hanson 是 Hacker School 的骄傲校友,她热衷于帮助人们学习 Julia。她会在 blog.leahhanson.us 上发布博客,并在 @astrieanna 上发推文。
Ned Batchelder(模板引擎):Ned 是一位拥有丰富经验的软件工程师,目前就职于 edX,负责构建开源软件以教育世界。他是 coverage.py 的维护者,也是波士顿 Python 的组织者,并在多个 PyCons 上做过演讲。他的博客地址是 nedbatchelder.com。他曾经在白宫吃过饭。
Greg Wilson(Web 服务器):Greg 是 Software Carpentry 的创始人,这是一个面向科学家和工程师的计算技能速成课程。他在行业和学术界工作了 30 年,是多本关于计算的书籍的作者或编辑,包括 2008 年 Jolt 奖得主 *Beautiful Code* 和 *The Architecture of Open Source Applications* 的前两卷。Greg 于 1993 年从爱丁堡大学获得计算机科学博士学位。
如果没有 Amy Brown 和 Greg Wilson 的辛勤工作,*The Architecture of Open Source Applications* 系列就不可能存在。如果没有我们庞大的技术审稿团队的不可思议的努力,这本书也不可能问世。
Chris Seaton、John Morrissey 和 Natalie Black 在技术审阅方面功不可没,他们付出了超出预期的努力。他们审阅的质量和深度帮助我们在多个卡点上推进书籍的进展。
我们非常感谢 PagerDuty 提供的资金支持。
如果您想报告错误或将内容翻译成其他语言,请 打开一个问题。
封面字体是来自 exljibris foundry 的 Museo,由 Jos Buivenga 设计。
封面照片由 23 张单独的聚焦叠加的钟表齿轮组件图像组成。照片由 Kellar Wilson 拍摄。
本书使用开源软件构建(封面除外)。LaTeX、Pandoc 和 Python 等程序特别有用。