代码大全

Aleksandr Shitik
Aleksandr Shitik

我撰写自己的文章和书籍,并评论电影和书籍。 在宇宙学与天文学、IT、效率与规划方面的专家。

代码大全
Steve McConnell
类别: 编程
出版年份: 2010
阅读年份: 2020
我的评分: 最高
阅读次数: 1
总页数: 893
摘要(页): 0
原始出版语言: 英语
其他语言的翻译: 俄语, 中文

绝对推荐阅读这本书,不仅适合编程初学者,也适合在这个行业工作多年的人。这本书和我之前读过的Robert Martin的《代码整洁之道》很像,但在我看来,这本书的例子更好,涵盖的主题也更丰富。

首先,我会简要描述本书的所有主要章节,并附上我个人的一些小评论。之后,我会写一个总体结论,列出书籍的优点和缺点。剧透一下:这本书非常好,优点远远多于缺点。

软件开发基础

本书的这一部分完全专注于编程的基本概念,以及编程由哪些部分组成,软件开发具体包括什么内容。这里讨论了需求定义、开发、测试、维护等阶段。当然,它们被描述得更详细也更有趣,因此阅读起来不会无聊。尽管这一章节首先对那些刚刚开始程序员职业生涯的人来说最为有用。为了让这一部分更易理解,章节中使用了比喻和类比(例如,建筑类比)。与许多类似的书籍一样,这里也提到了在软件开发不同阶段犯错的代价(目前只是浅显提及,后面会更详细展开)。另外,本章的优点之一是,它已经提到了开发方法可以是不同的:迭代式(螺旋式)和瀑布式。简要描述了每种方法的优缺点。像Scrum或Agile这样的现代流行术语和方法论,这里没有涉及,但作者提到的方法,对新手来说已经足够了。最后,作者还提到了软件应具备的一些重要特性,如可扩展性、可维护性、可移植性、容错性、安全性等。

高质量代码

如果你认为,在读完不少但也很有趣的材料之后,就能马上进入关于编写酷炫代码和讨论函数、变量命名、Tab和空格使用等话题的章节,那你就错了。接下来是整整一章关于软件设计。我不会说这里讲的是完整的架构设计——比如洋葱架构(如果我们谈的是单体应用)或微服务架构。更准确地说,这里强调的是系统整体描述、在系统框架内划分大型模块,然后再设计单独的类,最后这些类用方法的形式描述。这是一种带有图表和流程图的抽象编程方法。我无法保证这种带流程图和图解的方法如今在各地仍被广泛采用。我唯一真正接触过这种方式的地方,是在学院和大学里。在工作中,我从未画过流程图,我的朋友和同事们也没有这么做。此外,这一部分还涉及面向对象编程(OOP),对于函数式编程来说,这一切可能就没那么简单和直观了。因此,这一章读起来很有趣,但它在实际工作中的应用程度仍值得商榷。

这里更多是关于如何解决小型和中型任务,而不是完整项目的开发。没有提及具体技术,处处使用抽象概念,遵循SOLID原则。顺便说一句,OOP的介绍得相当不错。当然,你可以专门读一本关于这个主题的书,但对于新手来说,这些内容已经足够了。相当多的篇幅还专门讨论了类和方法的命名规范。解释了何时应该创建单独的方法,何时又不需要。稍微提到了异常和错误处理。对新手来说,本书的另一个亮点是介绍了伪代码编程。我也喜欢把这称为“纸上编程”。对于不知道如何完整实现某个算法的新手来说,这尤其有帮助。

变量

从这一章开始,我建议所有程序员,即便是已经有多年开发经验、完成多个项目的人,也应该仔细阅读。

整整一百页的内容。也许你会想:关于变量还能讲这么多?但确实有,而且非常实用。本章一开始就用一个关于数据类型(包括树、堆等结构)的测试题吸引读者。展示了各种语言中变量初始化的好例子和坏例子。还通过清晰的图示解释了作用域(scope)的概念。列出了一些通用建议,比如如何最小化变量作用域。

还涉及数据生命周期、临时变量命名、状态(开关)、不同语言中的命名约定。讨论了合适且普遍接受的缩写、标准前缀、合理的名称简化方式。

章节末尾,更详细地介绍了数据类型及其限制:浮点数、枚举、常量、自定义数据类型、数组、结构体、指针。

操作符

本章讨论了代码的顺序组织、条件语句和循环的使用。这一章节同样有100页,因此内容丰富。比如,详细比较了在不同语言(C、C++、C#、Java和Visual Basic)中循环结构的实现和性能差异。还涉及递归和goto语句的话题。

代码优化

本章包含以下章节:

  • 软件质量
  • 协作式构建
  • 开发人员执行的测试
  • 调试
  • 重构
  • 代码优化策略
  • 代码优化方法

开头再次提到软件的需求和特性——几乎与书中前面提到的一样。谈及缺陷发现和修复的成本。本章总体上偏理论,代码示例不多。提到了结对编程。正如我在第一章评论中提到的,本章的内容也稍显过时,有争议。例如提及了测试话题。顺便说一句,我很快会对另一本专门讲测试的书做个评测。不过与一般书籍不同,这里作者从另一角度切入。他讲述了测试中的常见错误,比如边界值分析。介绍了测试覆盖率工具(当时已经存在)、一些测试工具、TDD以及一些公认标准。

本章更有趣的部分,从重构开始。再次用不同语言(C、C++、C#、Java、Visual Basic)的for循环测试,展示了相同结构在不同语言中的执行效果和资源消耗差异。编译器类型也起着关键作用。有一张有趣的表格,展示了不同语言编写代码的相对性能。除了C、C++、C#、Java和Visual Basic之外,还加入了PHP和Python的对比。尤其频繁的是对C++和Java常见操作性能的对比。这些测试现如今是否还具参考价值,尚难说,因为编译器已有新版本,各种语言也加入了新特性,甚至像PHP这样的解释器也在不断重写和优化。但本章的核心观点,不是单纯对某个算法或基础函数(如计算平方根)的耗时比较,而是强调相同的代码(函数)在不同语言中可能表现完全不同(有的慢,有的快)。

最后,还举例说明了如何通过使用更合适的数据类型来提升算法执行速度(同样是跨多种语言的比较示例)。

系统性问题

本章节包括以下内容:

  • 程序规模如何影响构建
  • 构建管理
  • 集成
  • 编程工具

这里有什么有趣的?例如,提出了团队规模如何影响效率的问题,还列出了根据团队不同,程序员编写的代码占整体代码的比例。还讲述了项目代码行数与错误密度的大致关系。或许图表和数据有些争议,但值得一读。我甚至首先建议管理人员阅读这一章。

总体来说,这是一个理论性较强的章节,几乎没有代码。同时还提到了项目实施过程中需求变更的问题,以及这对项目进度的影响。此外,还列出了与程序员和团队相关、能够影响开发速度的主要因素,作者将其归纳为:

  • 程序员的经验和能力;
  • 团队的积极性;
  • 管理质量;
  • 代码复用的程度;
  • 人员流动率;
  • 需求的变动性;
  • 以及其他因素。

还涉及了与程序员沟通和关系建设的话题。例如,程序员如何安排自己的时间。也就是说,那时就已经关注到“倦怠”这一现象。此外,这里还提到一个带有“宗教性”争议的话题——如IDE的选择、命名和代码风格、是否使用代码规范工具等。

文中讨论了集成的话题——包括分阶段、增量式、T型集成等方法。描述了每种方法的优劣。不过内容有些过时,因为没有提到现代CI/CD的一些实践。

编程技巧

总结来看,这是书中一个综合性章节,涵盖了许多其他部分,并引用了前面阅读过的内容。这里细化了一些通用建议,并给出了大量代码示例——从注释的编写到类与方法的使用。我不认为这一章可以看作全书的总结,更像是对前文的补充。章节最后,作者还分享了他对“懒惰、严谨”等品质的看法和建议。最后列出了长长的参考书目,至少表明这本书在写作时经过了专业、细致的打磨。

总结

这本书接近900页,但别让这个数字吓到你,因为依我看,书中内容甚至比罗伯特·马丁的作品还要优秀。下面列出这本书的主要优点和缺点:

缺点:

  1. 书本篇幅巨大,不是每个人都能坚持读完。
  2. 出版时间较早,所以部分示例和话题可能已经过时。例如,未提及一些现代编程语言,而当今应用部署和软件开发技术也已发生巨大变化。

优点:

  1. 结构清晰,逻辑性强。
  2. 阅读轻松流畅。
  3. 每章末尾有简明的要点总结。
  4. 经常展示“糟糕代码”并逐步优化成“优质代码”。
  5. 代码示例涵盖多种语言,并对比了不同语言的算法实现。

这本书无疑是优秀的。我认为,这是编程领域中最值得推荐的一本理论书,无论是初学者还是有经验的开发者都应阅读。

Вверх