写点什么

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

  • 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:586136
用户头像

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

关注

评论

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

解读阿里云搜索开发工作台如何快速搭建AI语义搜索及RAG链路

阿里云大数据AI技术

人工智能 自然语言处理 大模型 rag

获取闲鱼商品详情api

api开发

电信行业怎么定义?需要采购堡垒机吗?

行云管家

网络安全 数据安全 堡垒机 电信

Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)

SelectDB

数据湖 Doris Hudi LakeHouse 湖仓一体

崖山异构数据库迁移利器YMP初体验-Oracle迁移YashanDB

YashanDB

yashandb 崖山数据库 崖山DB

硅纪元视角 | Stability AI推出Stable Video 4D,40秒生成8角度动态视频!

硅纪元

Stable Video 4D Mistral Large 2 “Frame”眼镜 HoloDreamer

和鲸科技参与第17届中国R会议,分享有组织科研的模型生命周期管理

ModelWhale

人工智能 R 数据科学 AI4S

强调数据价值,创建现代化全面预算管理系统

智达方通

企业管理 数据价值 数字化升级 全面预算管理系统

【论文速读】| MoRSE:利用检索增强生成技术填补网络安全专业知识的空白

云起无垠

人类历史上首届AI选美,谁吃到了第一波AI审美红利?

脑极体

AI

人工智能|ReACT 推理提示

测吧(北京)科技有限公司

测试

Apache Doris 2.1.5 版本正式发布

SelectDB

倒排索引 Doris 半结构化数据 湖仓一体 物化视图

华为云Serverless可观测性解决方案打造高效、可靠的云原生应用

华为云开发者联盟

云原生 可观测 华为云开发者联盟 企业号2024年7月PK榜

大庆正规等保测评机构有几家?在哪里?

行云管家

等保 等保测评 大庆

如何定量分析 Llama 3,大模型系统工程师视角的 Transformer 架构

Baidu AICLOUD

Transformer llama GPU 利用率 推理并发

从0到1:理发店预约剪发小程序开发笔记(上)

CC同学

ETL数据集成丨将PostgreSQL数据库数据实时同步至PostgreSQL

RestCloud

postgresql 数据同步 ETL 数据集成平台 数据库同步

文献解读-临床试验-第二十二期|《新抗原负荷作为中国非小细胞肺癌II/III患者的预后和预测标志物》

INSVAST

基因测序 基因数据分析 临床试验

得物App弱网诊断探索之路

得物技术

ios android 企业号2024年7月PK榜

缓存框架 Caffeine 的可视化探索与实践

vivo互联网技术

Caffeine 缓存可视化 动态下发

利用 Databend 生态构建现代数据湖工作流

Databend

技术路线速通!用飞桨让京剧人物照片动起来

百度Geek说

百度飞桨 企业号2024年7月PK榜

最新资讯!2024可信云大会重磅发布《可观测性能力建设指南》!

乘云数字DataBuff

白皮书 可观测平台 可信云大会

人工智能|ReACT 推理提示

霍格沃兹测试开发学社

AI应用行业落地100例 | 移民公司Envoy Global引入AI员工赋能,效率飙升80%,开启服务新篇章

硅纪元

LED租赁屏市场

Dylan

LED LED display LED显示屏 市场 舞台表演

极盾故事|某农商行数据安全制度和数据分类分级建设

极盾科技

数据安全 数据分类分级

数据恢复easyrecovery是磁盘工具吗 easyrecovery数据恢复软件怎么用

阿拉灯神丁

磁盘 EasyRecovery 数据恢复软件 硬盘数据恢复 软件包

Apache Doris + Paimon 快速搭建指南|Lakehouse 使用手册(二)

SelectDB

数据湖 Doris LakeHouse 湖仓一体 paimon

在 Go 中如何让结构体不可比较?

伤感汤姆布利柏

Solana行情为何坚挺?强劲基本面和ETF预期吸引资本流入

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

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