整理优先:小改进,大回报,整洁代码设计指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

前言

什么是整理优先

“我必须修改这段代码,但它很乱。我应该先做什么?”

“也许我应该在修改之前整理一下代码。是整理一部分,还是根本不整理呢?”

这些都是你可能会问自己的问题,如果有简单的答案,我就没有必要写一本书来解决这些问题了。

本书内容包括:

●在修改代码之前,何时整理这些杂乱无章的代码。

●如何安全高效地整理杂乱无章的代码。

●如何停止整理杂乱无章的代码。

●整理为什么有效。

软件设计是一种人际关系实践。在本书中,我们从程序员与自己的关系开始谈起。为什么我们不花时间关心自己?为什么不花时间让工作更轻松?为什么我们会陷入整理代码的兔子洞[1],而忽视了能帮助用户的工作呢?

本书是为了让极客们在这个世界感到安全。良好的软件设计是提高软件开发效率的强大工具,但如果使用不当,它就会变成另一个压迫工具,拖累软件开发的效率。

本书以软件设计为主题。我希望使软件设计变得易于理解并得到重视,让大家以有益于日常工作的方式来理解和实践软件设计。

假设有一个包含很多行代码的长函数。在修改它之前,你需要阅读代码,了解其中的内容。在这个过程中,你会发现可以从逻辑上将代码分割成小块。提取这些代码块的过程就是整理代码的过程。其他类型的整理工作包括使用卫述句(guard clause)、使用解释型注释和使用辅助函数。

本书实践了它提出的理念——将这些整理技巧分成小块并指导你何时何地可以使用哪些技巧。所以,与其试图一次性掌握全部整理技巧,不如先尝试一些能解决你的问题的技巧。本书还讲述了软件设计背后的理论:耦合、内聚、现金流贴现和期权。

目标读者

本书面向程序员、资深开发人员、实践型软件架构师和技术经理。本书与编程语言无关,所有开发人员都可以阅读并将书中的概念应用到自己的项目中。

你将学到什么

读完本书,你将理解:

●系统行为变化与系统结构变化之间的根本区别。

●当单个程序员修改代码时,结构和行为交替变化的魔力。

●软件设计的工作原理和驱动因素。

你还能够:

●通过优先整理(有时是事后整理)来改善编程体验。

●安全小步地进行大改动。

●将设计作为一种具有不同激励机制的人类活动。

本书内容

本书分为三部分。

第一部分

整理就像一个小巧的迷你重构。每一个短章涵盖一个整理技巧。只要看到这样的代码,就将它改成那样的代码,然后将其发布到生产环境。

第二部分

该部分介绍整理过程的管理。整理的理念之一是它永远不应该成为一件大事。它不需要打报告、跟踪、计划和安排时间。之所以优先进行整理,是因为你需要改动代码,但代码很混乱,改起来很困难。即使作为日常工作的一部分,这仍然是一个需要用心改进的过程。

第三部分

在这一部分,我终于可以放飞自我,深入探讨让我兴奋的主题了。当我说“软件设计是一种人际关系实践”时,我在说什么?这些人是谁?如何通过更好的软件设计来更好地满足他们的需求?为什么软件成本如此之高?我们可以采取什么措施来解决这个问题,耦合?内聚?幂律?

我的目标是让读者从早上开始阅读,然后在当天下午就能进行更好的软件设计。之后每天都能稍微提升一点设计水平。很快,软件设计将不再成为软件交付价值链中的薄弱环节。

为什么是“经验性”软件设计

在软件设计中,“设计成什么样”似乎是争论最激烈的问题:

●服务应该有多大?

●代码库应该有多大?

●是事件还是显式服务调用?

●是对象、函数还是命令式代码?

这些争论掩盖了软件设计人员之间更根本的分歧:“什么时候”设计?下面是这一分歧的两个极端:

投机性设计

我们知道接下来要做什么,所以今天就可以开始设计,并且成本更低。此外,一旦软件投入生产,将再也没有机会进行设计,所以我们今天就设计出全部内容吧。

反应式设计

功能是所有人都关心的问题,所以我们今天要尽可能少地进行设计,这样才能回到功能开发上来。只有当功能几乎无法添加时,我们才会勉为其难地改进设计,而且只会改进到刚刚能够继续开发功能的程度。

我对“什么时候”这个问题的回答是“中间的某个时刻”。当发现某类功能很难添加时,我们就会进行设计,直到压力得到缓解。我们从刚刚好的设计开始,以启动反馈循环:

功能

用户想要什么?

设计

如何为程序员提供最好的支持,以实现这些功能?

经验性软件设计的时机取决于具体的情况。要为设计预留一些时间。回答“什么时候”这个问题需要设计嗅觉、谈判能力和鉴别能力。需要嗅觉和鉴别能力是缺点吗?当然,但这是一种无法避免的缺点。投机性设计和反应式设计同样需要鉴别能力,但软件设计师没有多少工具可用。

我喜欢用“经验性”这个词来描述这种风格,因为它似乎澄清了我对投机性设计和反应式设计时机的区分。“它的基础、关注点和验证方式是观察或经验,而不是理论或纯逻辑。”这听上去没有问题。

我是如何写出本书的

在读大学时,我参加了一门软件设计课程,当时课程使用的是Ed Yourdon(已故)和Larry Constantine合著的Structured Design这本书。我当时并不理解书中的内容,因为我还没有遇到书中讨论的问题。

到了2005年,我已经设计了很多软件。我觉得自己对设计有了相当好的把握。为了庆祝那本书出版30周年,Stephen Fraser在OOPSLA(大型面向对象编程会议)上组织了一个讨论小组,成员包括Ed和Larry,以及Rebecca Wirfs-Brock、Grady Booch、Steve McConnell和Brian Henderson-Sellers。

如果不想被甩在一旁,我就得做些功课。于是我打开那本发黄的Structured Design开始阅读。我完全入迷了,几个小时后才抬起头。

我记得小组讨论进行得很顺利。大会的一大亮点是与Ed和Larry共进早餐,他们非常聪明,和他们相处很是轻松自在。图P-1是他们很久以前在我的课本上留下的签名。

图P-1:Ed Yourdon(“不要相信这本书里的任何内容!”)和Larry Constantine(“……包括上面这句!”)的题词

那时那本书已经很老了,使用纸带和磁带的示例已经不再适用,汇编语言与新高级语言之间的讨论也不再适用。然而,书中的基本原理还是正确的。我发誓要将那些内容带给大家。

在这几年间,我曾多次尝试撰写一本软件设计书籍,但都以失败告终。直到2019年,我意外地拥有了两周完全计划外的时间。我决定看看在这两周里我能写多少内容。

写了一万字之后,我学到了一个重要的教训——我无法在一本书中解决所有的软件设计问题。在我起草的内容中,小规模的设计场景不断出现:对于一些混乱的代码,是应该先修改还是先整理呢?

我的写书生涯一向如此。选择的主题感觉对一本书来说太小了。开始写作,然后发现这个主题实际上对一本书来说太大了。于是选择一个更小的子主题,继续写作,然后发现这个子主题还是太大了。然后再重复这个过程。

因此,你现在手里的这本书是这个近20年誓言的第一批成果。我发现在讨论“应该优先整理吗?”这个问题时,能够触及我作为设计师内心深处的许多话题。我期待你的反馈,期待能继续深化我对软件设计乐趣和价值的理解。

O'Reilly在线学习平台(O'Reilly Online Learning)

40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。

我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问https://oreilly.com

如何联系我们

对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。

美国:

O'Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

要询问技术问题或对本书提出建议,请发送电子邮件至errata@oreilly.com.cn

本书配套网站https://oreil.ly/tidy-first上列出了勘误表、示例以及其他信息。

关于书籍、课程、会议和新闻的更多信息,请访问我们的网站https://oreilly.com

我们在LinkedIn上的地址:https://linkedin.com/company/oreilly-media

我们在Twitter上的地址:https://twitter.com/oreillymedia

我们在YouTube上的地址:https://youtube.com/oreillymedia

致谢

如果没有许多人的帮助,这本书就不会出现在你手中。以下是部分给我帮助的人。

感谢Anna Goodman、Matan Zruya、Jeff Carbonella、David Haley、Kelly Sutton,以及我在Gusto的其他学生提供的早期技术反馈。感谢Maude Lemaire、Rebecca Wirfs-Brock、Vlad Khononov和Oleksii Torunov对原始稿的技术反馈。感谢https://tidy first.substack.com网站上的付费用户,他们给了我写作的时间,并在我起草各章时给我反馈。

感谢O'Reilly的专业制作团队成员Melissa Duffield、Michele Cronin、Louise Corrigan,是他们让整个过程尽可能顺利。感谢Tim O'Reilly冒险出版这本小薄书。

感谢Keith Adams和Pamela Vagata的技术交流、鼓励和鸡尾酒。感谢Susan的鼓励和鞭策。感谢我的孩子们:Beth、Lincoln、Lindsey、Forrest和Joëlle。

感谢我的软件设计导师和同事:Ward Cunningham、Martin Fowler、Ron Jeffries、Erich Gamma、David Saff和Massimo Arnoldi。

最后,感谢Ed Yourdan和Larry Constantine很久以前就弄清了这一切。


[1]《爱丽丝梦游仙境》中的爱丽丝掉入兔子洞中后进入了奇幻世界,这里用兔子洞暗指未知的、不确定的领域。