写点什么

书评:简洁代码──敏捷软件工艺指南

  • 2009-06-15
  • 本文字数:2329 字

    阅读完需:约 8 分钟

作为开发人员,我们的首要任务是写出能够工作的代码。但是,仅仅“能够工作”还不足矣,为了能够持续提供真正的价值,代码一定要简洁。在《简洁代码:敏捷软件工艺指南》一书中,Robert C. Martin 提供了大量示例来帮助我们识别代码中可以改进的地方,并提供了相应的办法来逐步改进这些代码。

什么是简洁代码?

在第一章,Martin 以极富说服力的方式表明,简洁代码不仅仅是人们所希望的,并且是必须的。如果代码不简洁,开发的速度就会越来越慢。直到有一天,修改代码所引发的不确定性、痛苦感和挫败感会使团队宁愿重写所有代码。但是,如果重写的代码不能比原来的代码更简洁,那么同样的问题还会存在,几年后整个团队依然会在开始的地方打转。

每个人对简洁代码的理解会有些许不同。Martin 总结了诸多知名开发人员对简洁代码的描述,如Bjarne Stroustrup、Grady Booch、“Big” Dave Thomas、Michael Feathers、Ron Jeffries 以及Ward Cunningham。虽然他们定义简洁代码的侧重点不尽相同,但其中仍有共通之处:简单、无重复、易读、优雅。具有这些特征的代码易于维护,可以打破开发速度下降然后重写的怪圈,并能够持续提供真正的价值。

细枝末节

第二章至第六章涵盖了代码级别的考虑:选择有意义的命名、函数要优雅并有良好的可读性、要写有用的(并避免差劲的)注释、格式化代码以增加可读性,以及选择何时使用聪明的对象,何时使用简单的数据集。

Martin 将理论、说明与代码进行了有效地结合。这几章包含了太多的大师智慧,无法在此一一列举。其中散布的许多闪亮的语言,简明但含义深远(截取自第二章至第六章):

“问题不在于代码是否简单,而在于代码能够在多大程度上脱离上下文仍能表达意图。”

“作为代码的作者,我们的目的是让代码尽可能的易于理解。我们希望读者能够快速阅读我们的代码,而不是细细地研究。我们希望读者能够通过代码直接理解我们的想法,而不是辛苦的挖掘代码背后的含义。”

“编写函数的第一个原则是,函数要短小;第二个原则是函数要更短小。”

“不要害怕使用较长的命名,有意义的长命名要好于莫名其妙的短命名,同时也好于冗长的注释。”

“好名字的价值如何估计都不为过,记住 Ward 原则:当每一个子程序都只做它应该做的,你就拥有了简洁代码。编写简洁代码过程中,有一半的任务是为短小的函数选择正确的命名,函数越短小、越内聚,就越容易给它起一个有意义的好名字。”

“副作用其实就是说谎,你的函数本来要做一件事,但是却偷偷做了其他的事”

“编程的艺术一直就是语言设计的艺术,编程大师将系统看成是故事而不是程序,他们使用他们选择的编程语言来创建一个更复杂更具有表达性的语言,来讲述这个故事。”

这几章将简洁代码的哲学以集中一致的方式串联在一起,并提供了实用的建议,以便在现实中应用这些哲学。

高层决定

第七章和第八章涵盖了错误处理和第三方代码接口。我认为第七章 (由 Micheal Feathers 撰写) 特别有用。错误处理是系统中很难做好的地方之一,而且通常在软件设计相关的文档中也仅仅是作为陪衬出现。Feathers 引入了一种实用的方式,将错误处理与主流程代码相隔离的同时,保证两部分代码的清晰和可读性。

第九章涵盖了单元测试。说明了为什么保持测试代码简洁与保持生产代码简洁一样重要,以及如何保持测试代码的简洁。(“记住三件事:可读性、可读性、可读性”)这一章非常短,但是包含了很多正反两面的例子。

第十章至第十二章涵盖了高层设计:类、系统和演化式设计。第十章主要讲述了单一职责原则(SRP),这个原则在 Martin 的另一本书《敏捷软件开发:原则,模式与实践》中也曾讨论过。这里没有讲的那么深,但却是个学习的好起点。第十一章在系统级别讨论了简洁代码,如依赖注入和面向方面编程技术。第十二章提醒我们要利用测试和重构,来驱动高层设计与底层决定。

第十三章涵盖了并发。这一章并没有太深入的讨论并发,只是一些表面的东西,但是仍然有很多好的建议。

案例分析

第十四至十六章,Martin 将前几章的内容联系起来,每一章开始先介绍一个真实世界的代码范例,这些代码既不精妙绝伦也没那么糟糕透顶,然后教我们用重构一点一点的将代码变得更简洁。

这些代码示例既不会简单的不真实,也没有超出问题本身的复杂度,你不会认为它们只是例子代码,而且经过认真阅读很容易弄懂。它们可以帮助你更深入的理解如何应用本书中的原理。

在书里读到重构应该以“小步骤”完成是一回事,在一个具体的例子中体验敏捷开发人员是如何选择那些微小的步骤是另一回事。这几章给本书增加了很多价值,它将书中的理论与实践联系起来。这些案例使我感到我是在与一个真实的、聪明并富有经验的开发人员一起结对编程,这是 Martin 清晰写作风格的体现。

代码味道与启示

第十七章将“代码的味道”和启示列成一张表。它将本书的精华思想用一种直接的、面向问题的方式表现出来,在短短 29 页中形成了一个非常好的参考。

总结

每个在乎软件质量和专业技艺的开发人员都应该阅读此书。对于经验较少的开发人员,他们可以从中获益良多,这是一本需要慢慢品尝的书,它包含了许多好的建议。Martin 使用了大量示例和清晰简练的语言,即使没有经验的开发人员读得比较慢,但却不会迷惑。

有经验的开发人员也可以一读此书。它可以督促你去做那些已经知道要做(但却不总是去做)的事,提醒你一些已经遗忘的事,并教给你一些还不知道的事。最重要的是,它给出了一个全新的视角,来看待那些每天都要去做成百上千次、看起来平淡无奇的决定。

查看英文原文 Book Review: Clean Code: A Handbook of Agile Software Craftsmanship


感谢李剑对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009-06-15 11:585668
用户头像

发布了 63 篇内容, 共 24.4 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

第七周

cqyanbo

使用APICloud AVM多端组件快速实现app中的搜索功能

YonBuilder低代码开发平台

前端 APP开发 APICloud 跨端开发 跨端框架

优酷 IPv6 演进和实践指南

阿里巴巴终端技术

ipv6 移动网络

大数据培训:Flink 快照分析

@零度

flink 大数据开发

Mysql数据库表中有索引为什么还是查询慢?

慕枫技术笔记

数据库 2月月更

幂等最佳实践

得物技术

数据 幂等 API 一致性 请求

数字货币或将消灭银行!未来3至5年,银行业可能将崩溃?

CECBC

MongoDB在vivo评论中台的应用案例

MongoDB中文社区

mongodb

Tapdata 在线研讨会:如何快速上手 Tapdata Cloud?

tapdata

数据库 Cloud

8分钟了解TDengine的WAL机制

TDengine

数据库 tdengine 开源 物联网

全方位构建信创生态体系,焱融科技完成海光 CPU 生态兼容性认证

焱融科技

云计算 分布式 高性能 文件存储 生态

Kubernetes集群监控平台(kube-prometheus-stack/Metrics Server)搭建教程

山河已无恙

Kubernetes Kubernetes 集群 2月月更

面试突击23:说一下线程生命周期,以及转换过程?

王磊

“区块链”将彻底改变人类社会文明,颠覆世界最强大的企业

CECBC

【C语言】 初始函数 & 数组

謓泽

数组 C语言 函数 2月月更

Linux系统编程-进程间通信(消息队列)

DS小龙哥

消息队列 2月月更

元宇宙时代NFT的价值衡量

CECBC

java培训:JVM参数配置

@零度

JVM JAVA开发

报名开启 | 2月25日,索信达监管合规产品线上发布会

索信达控股

前端培训:Vue3 的自定义指令

@零度

Vue 前端开发

MongoDB University 中文字幕视频上线!

MongoDB中文社区

mongodb

模块七课程作业

李晓笛

架构实战营

来喷一下所谓无影云电脑

乌龟哥哥

无影云电脑 2月月更

如何利用友盟平台定位安卓端的程序异常 | 社区征文

liuzhen007

移动开发 新春征文 2月月更

什么字体更适合程序员?

lencx

程序员 字体设置 主题

架构实战营第 4 期第 7 课作业:王者荣耀商城异地多活架构设计

owl

「架构实战营」

Go学习笔记——同构复合类型

为自己带盐

Go 学习笔记 2月月更

模块七作业-王者荣耀商城异地多活架构设计

CH

架构实战 「架构实战营」

数蛙DG-IoT开源平台

dgiot

物联网 2月月更 2月日更 dgiot dgiot物联网

艾瑞咨询:青云科技入选中国开源软件产业图谱

青云技术社区

云计算 开源 混合云

深入解析 Flink 细粒度资源管理

Apache Flink

大数据 flink 开源 编程 实时计算

书评:简洁代码──敏捷软件工艺指南_研发效能_Ryan Cooper_InfoQ精选文章