【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

可读性代码:为什么、怎样以及什么时候

  • 2018-10-10
  • 本文字数:1868 字

    阅读完需:约 6 分钟

如果你对开发团队进行问卷,大多数人会说“我们想要可读性高的代码”。你甚至发现有些人认为可读性比功能更重要。但是,当要求人们对可读性做出定义时,他们的意见就会出现分歧。Laura Savino 在 Explore DDD 2018 大会上的演讲就是以这个作为前提。她阐述了为什么我们想要可读性高的代码、可读性究竟意味着什么,以及什么时候必须优先考虑可读性。

Savino 拥有小学法语教师的背景,后来成为 iOS 开发人员和导师,因此,她能够提供更多有关比较自然语言和编程语言的见解。刚开始学习新编程语言的程序员通常先学写一个基本的“Hello,world!”应用程序。同样,“Bonjour”、“Hola”或“Guten-tag”可能是学习法语、西班牙语或德语的人学会的第一个单词。

正如程序员将迅速学会“Hello,world!”,口语也会很快进入中间阶段。Savino 举了一个例子,在法语课上问一个同学是否愿意在课后和你一起去喝咖啡(Voulez-vous prendreuncaféavelve moiaprèslescours?)。即使他拒绝了(Désolé,je ne peux pas prendredecaféprèslescours),在别人看来这是有史以来最无聊的谈话,但你自己却感觉飘飘然:你说了一个句子,然后有人理解它,因为你收到了适当的回应,而你了解回应是什么意思。这就像在 iOS 应用程序中显示数据一样——它不是那么吸引人,但当你第一次成功完成这个任务时,你的肾上腺素会飙升。

学习语言的高级阶段超越了对语法的思考。你的目标已经超越了只是相互理解,你现在需要深入细节。这时候编程语言与人类语言之间的类比开始不再奏效,或者至少需要更深入的分析。

在进行代码评审时,经常会有人说,“我无法理解这些代码”,而另一个人(可能是作者)反驳说,“但这种方式更具可读性”。Savino 用这个例子来说明“可读性取决是谁在阅读代码”。让可读性变得复杂的是代码有两种不同的受众:其他开发人员和计算机。因为计算机如果无法读懂我们的代码,它们很快就会告诉我们,我们自然会基于计算机的反馈做出调整。我们承认这种偏见的存在,有时候会在代码周围加上人类可读的注释。但是,Savino 警告说,“注释并不能带来具备可读性的代码”。

Savino 解释了解读文本或代码与流利阅读之间的区别。她使用 E. E. Cummings 的诗“ when serpents bargain for the right to squirm ”作为例子,一个美丽而复杂的作品需要阅读多次才能真正开始理解其中的含义。当你在阅读代码时遇到不熟悉的术语时需要经历类似的过程——查找一个,然后是下一个,然后是下一个,你就像进了一个兔子洞,直到你忘记了最初想要理解的内容为止。Savino 警告说,虽然可以从深刻的理解中获得快乐,但“写诗与开发软件不是一回事”。

相反,流利的阅读是一种快速而正确的理解,不会占用你的工作记忆。多年的阅读经验让你能够快速浏览文章并仍然能够理解其中的内容。Savino 认为,阅读可读性高的代码也是如此。当代码很容易阅读时,大脑可以腾出一部分发现其中可能出现的问题,让代码评审更加高效。

在给出了高可读性代码为什么如此重要的原因之后,Savino 探讨了如何写出高可读性代码的技术。在与语言不流利的谈话对象沟通时应该避免使用俚语,并使用明确的表达方式。在代码中,方法的命名可以用 beginApp(),而不是 releaseTheHounds(),并在每一步给出变量和调用结果,而不是将函数调用链接在一起。

Savino 还探讨了我们的本能模式匹配能力。在抽象层面,需要使用“斜视测试”来查看代码的一般性结构,看看是否有任何异常的东西。在更低的层面,尽量避免使用看起来相似的字符和符号,包括!、I、l 和 1,这些可能会导致反模式匹配。最后,如果你正在做一些与众不同的东西,那就以一种可以让它从脱颖而出的命名方式。

对于作家来说,最好的建议是“了解你的受众”。Savino 说,当你的受众是阅读你的代码的人时,你应该更进一步,并信任他们。当有人告诉你代码不够清晰时,相信他们,然后问他们因为缺少了哪些信息导致代码难以阅读。用他们的反馈来提高代码的可读性。

最后,Savino 提到了一些可读性需要成为主要驱动因素的例子。简单地说,一段代码越重要,它的可读性就应该越高。Savino 引用了美国宇航局喷气推进实验室的编码指南,该指南指出,“任务关键代码不应该只是可以辩证的,还必须是绝对正确的”。与人类沟通有关的一个更为实际的场景是火灾逃生标志,在逃离火灾时,人们不需要额外的努力看懂这些标志。

你的团队应该针对是否以及何时需要可读代码展开讨论。你的目标应该是所有团队成员都能流利地阅读代码。Savino 最后鼓励每个人进行“更少的解读,更多的创造”。

查看英文原文 Readable Code - Why, How and When You Should Write It

2018-10-10 05:461138
用户头像

发布了 731 篇内容, 共 432.0 次阅读, 收获喜欢 1996 次。

关注

评论 1 条评论

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

如何用scrum敏捷工具做迭代规划及迭代执行。

顿顿顿

Scrum Sprint 敏捷开发管理工具 敏捷工具 迭代规划

安装Zookeeper和Kafka集群

Java你猿哥

Java kafka zookeeper SSM框架 Java工程师

面试了个985毕业的大佬,回答“性能调优”题时表情令我毕生难忘

做梦都在改BUG

Java 性能优化 性能调优

“淄”味当道,工赋十足

Openlab_cosmoplat

开源社区 双碳

从源码角度深入解析Callable接口

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

Kurator v0.3.0版本发布!助力企业实现多云异构管理

华为云开发者联盟

开源 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

深度学习基础5:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测

汀丶人工智能

人工智能 机器学习 深度学习 损失函数

4 月 22 日丨【云数据库技术沙龙】技术进化,让数据更智能

NineData

MySQL 数据库 程序员 开发者 Clickhouse

Scrum敏捷研发和项目管理

顿顿顿

Scrum 敏捷开发 敏捷开发流程 leangoo 敏捷开发管理工具

Gradio:快速构建你的webApp

AIWeker

Python 三周年连更 Gradio

剖析多利熊业务如何基于分布式架构实践稳定性建设

百度Geek说

分布式 稳定性 多利熊 企业号 4 月 PK 榜

白活了!谷歌架构师10年心血汇成的《24种设计模式》,这才是正解

做梦都在改BUG

Java 设计模式

火山引擎 DataLeap下Notebook系列文章一:技术选型之路

字节跳动数据平台

notebook 数据研发 企业号 4 月 PK 榜

带你一同认识和使用JPA框架进行开发你的应用服务

Java你猿哥

Java SSM框架 jpa Java工程师

火山引擎DataTester:让企业“无代码”也能用起来的A/B实验平台

字节跳动数据平台

AB testing实战 无代码 A/B 测试 企业号 4 月 PK 榜 企业增长

测试环境治理之MYSQL索引优化篇

京东科技开发者

MySQL 性能优化 测试环境 企业号 4 月 PK 榜

浅谈离线数据倾斜

京东科技开发者

hive sql 数据倾斜 Spark java 企业号 4 月 PK 榜

清单推荐:常见的研发效能度量指标(科学管理版)

LigaAI

研发管理 技术管理 效能度量 研发效能度量 企业号 4 月 PK 榜

【架构与设计】常见微服务分层架构的区别和落地实践

京东科技开发者

架构 微服务 DDD 分层架构 企业号 4 月 PK 榜

火山引擎云原生数据仓库ByteHouse技术白皮书V1.0 (Ⅲ)

字节跳动数据平台

数据仓库 云原生 白皮书 数据仓库服务 企业号 4 月 PK 榜

JDK8到JDK17有哪些吸引人的新特性?

京东科技开发者

Java jdk8 jdk17 java 8 的新特性 企业号 4 月 PK 榜

网络编程懒人入门(十五):外行也能读懂的网络硬件设备功能原理速成

JackJiang

网络编程 即时通讯 IM

最近,我们做了一次“实景”容灾演练

云布道师

阿里云

阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似

做梦都在改BUG

Java 源码 synchronized ReentrantLock

字节面试官:你没有高并发、性能调优经验,为什么录取你?

做梦都在改BUG

Java 高并发 性能调优

华为云新一代iPaaS全域融合集成平台全新升级

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

从零学习SDK(7)如何打包SDK

MobTech袤博科技

Kubernetes集群调度增强之超容量扩容

京东科技开发者

Kubernetes k8s 集群 企业号 4 月 PK 榜 超容量扩容

接口设计文档的12个注意点

做梦都在改BUG

Java 后端开发 接口设计

Apifox 更新 | WebSocket 接口调试功能上线!

Apifox

程序员 开发工具 Apifox API 接口工具

全量通过,华为云GaussDB首批完成信通院全密态数据库评测

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

可读性代码:为什么、怎样以及什么时候_语言 & 开发_Thomas Betts_InfoQ精选文章