关于本书

本书的核心思想是通过对不同方面的代码质量(又称非功能需求)进行比较,使你了解经验丰富的开发者的思维模式。

序之前的图展示了本书内容与专业开发人员所需的广泛知识之间的关系。首先,你要从学习一门编程语言的基础知识开始。在Java中,你需要了解类、方法、字段,等等。然而,本书并不会教你这些基础知识。你最好按照以下三个路径来学习。

编程语言的学习路径:学习语言的更多高级特性,如泛型和多线程等。

算法的学习路径:学习扎实的理论原则、标准算法和数据结构,以及衡量其性能的方法。

软件工程的学习路径:学习设计原则、方法论和有助于管理复杂性的最佳实践,尤其是在大型项目中。

本书用一条主线串联起了所有这些内容。我并没有把这些不同的方面分开讲授,而是根据每一章的需要进行混搭。

每一章都集中关注一个特定方面的软件质量,比如时间效率或可读性。我之所以选择这些方面,不仅是因为它们的重要性和普遍性,还因为它们可以被有意义地应用到一个小的代码单元(一个类)上。此外,我尽量把重点放在通用的原则和编码技术上,而不是具体的工具上。在适当的时候,我会指出可以帮助你评估和优化特定软件质量的工具和库。

目标读者

对于接受过较少正规训练的初级开发人员来说,本书是一个理想的起点,可以拓宽其软件开发的视野。具体来说,本书的目标读者有两种。

● 对于几乎没有接受过正规训练或者非计算机科学/计算机工程专业的开发者来说,本书提供了对计算机科学和工程技术的概览,阐述了所有重要编程任务都会涉及的权衡之术。

● 对于计算机科学或计算机工程专业的学生来说,本书为各种传统教学课程中的知识点做了一些补充,提供了一些实战案例。因此,它可以作为编程和软件工程课程的补充材料。

要在这两种情况下最大限度地利用本书,你应该熟悉以下内容。

● 基本的编程概念,如迭代和递归等。

● 面向对象编程的基本概念,如封装和继承等。

● 中级Java语言技能,包括泛型、标准集合和基本的多线程(线程创建和synchronized关键字)。

内容结构

下面是各章的简介和对应的代码质量。请不要忽略章末的所有实操练习。它们附带了详细的解决方案,并通过在不同的上下文中应用所学技巧来完善各章的核心内容。

第1章首先介绍要解决的编程任务(一个水容器类),接下来给出一个朴素的实现,展示了缺乏经验的程序员的常见误区。

第2章详细介绍一个参考实现(随后称之为Reference版本),它是在不同方面的质量之间进行平衡后的结果。

第3章聚焦在时间效率上,你会将Reference版本的运行时间缩短两个数量级(缩短到原来的约1/500),并发现不同的用例需要不同的性能权衡。

第4章对空间(内存)效率进行实验。与Reference版本相比,你将使用对象把容器的内存占用量缩小50%以上,然后放弃对每个水容器使用对象,从而将其内存占用缩小90%。

第5章通过监控来实现可靠性,介绍契约式设计的方法论,并展示如何基于方法契约和类不变式、通过运行时检查和断言来强化Reference版本中的类。

第6章通过单元测试来实现可靠性,介绍如何为类设计和执行测试套件,以及测量代码覆盖率的方法和工具。

第7章关注可读性,你将遵循最佳实践来重构Reference版本,编写出整洁且自描述的代码。

第8章研究并发和线程安全,你会重温线程同步的基本概念,并发现演进示例需要一些重要的技术来避免死锁和竞争条件。

第9章重点关注可复用性,你将使用泛型对Reference版本的类进行泛化,以兼容其他具有类似通用结构的应用。

附录A在讨论简洁性的同时,提出一个使用了递归的紧凑实现,其源代码的长度只有Reference版本的15%。不出所料,结果是无法阅读、难以让人满意的混乱代码,会让你立即被赶出任何代码审查会议。

附录B把最重要的几方面软件质量放在一起,给你一个终极的水容器类。

在线代码库

本书中的所有代码是按章组织的,都可以在一个公共的在线Git代码库中找到(在Bitbucket网站中搜索mfaella/exercisesinstyle)。大部分代码是同一个Container类的不同实现版本。每个版本都有一个名字,对应于它的包名。例如,1.8节中出现的第一个版本名为Novice。在代码库中,它对应的类是eis.chapter1.novice.Container。本书最后的表列出了主要的类及其描述。

本书的示例代码也可从图灵社区本书主页下载。

为什么选择Java,哪个版本的Java

众所周知,Java的发展速度越来越快,每隔半年就会有一个新版本发布。截至本书写作时,最新的版本是Java 12。

不过本书关注的重点并不是Java编程本身,而是如何培养一种评估和平衡各种软件质量的习惯,无论你使用哪种语言都用得上。本书的例子之所以用Java来写,只是因为我自己对Java比较熟悉,也因为它是最常用的语言之一。

本书讲授的原则在其他语言中也同样适用。使用的语言与Java越接近,你就越能不加修改地复用本书中的内容。例如,C#与Java非常接近,书中也确实有一些关于C#的备注,突出了相关内容在C#中的区别。

至于书中展示的、存储在在线仓库中的Java代码,99%是用Java 8写的。在一些地方,我使用了Java 9的少数工具,比如用静态方法List.of创建列表。

线上论坛

购买本书之后,你就可以免费进入Manning出版社的私有论坛。在这里,你可以对本书发表评论,提出技术问题,并得到作者和其他用户的帮助。此论坛的链接是https://livebook.manning.com/#!/book/seriously-good-software/discussion。你还可以在https://livebook.manning.com/#!/discussion上了解更多关于Manning论坛的信息和规则。

Manning出版社向读者承诺提供一个读者之间以及读者与作者之间进行有效对话的场所,但是并不保证作者的具体参与量,作者对论坛的贡献是自愿且无偿的。我们建议你尝试向作者提出一些具有挑战性的问题,从而保持作者对此论坛的兴趣。只要本书还在售,此论坛以及过往的讨论就都是可以访问的。

更多信息

扫描下方二维码,即可获取电子书相关信息及读者群通道入口。