Google和腾讯推广的代码可读性是什么?

2022 年 3 月 13 日 InfoQ

作者 | 黄国峰
来源 | 经授权转载自 大话研发效能 公众号
本文介绍了代码可读性(Readability)的概念和它为什么重要;同时分享了 Google 和腾讯在推广代码可读性方面的做法,供读者在技术管理中参考。
代码可读性是什么

代码可读性(Readability),顾名思义就是代码有多容易被人读懂,我们可以通过代码作者以外的开发人员需要多少时间能理解 1 个代码单元(代码单元指 1 个类或 1 个函数),来衡量这个代码单元的可读性。对代码的理解有两个层面:

  • 理解一个代码单元(1 个类或 1 个函数)的作用;

  • 理解一个代码单元的实现逻辑;

如果要使用(调用)1 个代码单元,至少要理解到第 1 层面;如果需要改进或重构,则需要理解到第 2 层面。

为什么代码可读性重要
  • 代码可读性是团队协作开发的前提;

  • 代码可读性是软件可维护性的前提;

  • 代码可读性是代码评审的前提,也是代码评审中的核心关注点之一;

假设你在开发 1 个业务功能,需要一个图片转换功能(把 DXF 图转换为 SVG 图),你读过系统已有的代码(包括 API 文档),没有发现看起来像这样功能的类或函数,你只好新写一个函数。但实际上已经有同事曾经写过相同功能,函数名叫“toImage()”,这个函数名无法体现其真实功能。

这就是一个典型的由于代码可读性低,降低了重用性,导致开发资源浪费的例子。

再假设在一个运输系统有一个调度函数,业务逻辑非常复杂而原有代码非常混乱难懂,原来的程序员已经离职。现在老板让你基于某种新场景加 1 种调度策略,并且要求尽快完成,那么你最佳的应对策略可能就是重新写一个调度函数,通过 if-else 语句把新的调度策略引入进来。

很显然,这会导致代码逐步腐烂,形成一个“屎山”,最终不可维护。

即使是在新的软件编码过程中,团队成员之间也不可避免互相调用或在同一个代码单元(类或函数)中共同开发。而这前提都是快速读懂原有代码。

因此,在团队开发中,软件可读性影响整个软件编码的协作成本,更影响交付后的软件维护成本。

最后,可读性低的代码,几乎无法进行代码评审。代码评审的两大作用:团队知识共享、软件质量把控,都需要基于代码可读性的前提。

代码可读性的认证与标准
可读性认证

Google 和腾讯对于代码可读性(Readability)都非常重视,都有一个认证体系。以腾讯为例,腾讯的代码可读性体系分为:

  • 0 级:Foundation,参加了培训并通过了考试;

  • 1 级:Wet-hands,参加了 Wet-hands 训练营,并通过了考试;

  • 2 级:Workalone,通过项目日常的 CR(代码评审)并积分排队,并通过最终的评定;

  • 3 级:Approver,优秀的代码可读性证书持有者,高水平代码的捍卫者 & 布道者。


可读性标准

评价一个代码的可读性,一般参考以下原则:

  • 一致性原则

  • 可读性优先于性能

  • SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)

  • 高内聚、低耦合

  • 最小作用域

  • DRY(Don't Repeat Yourself)

  • KISS(Keep It Simple, Stupid)

  • YAGNI(You Ain't Gonna Need It)

  • SSH(Shit Stop Here) 我们不会每次代码评审都用到所有原则,但一致性原则(即使错也要错成一个样子)、可读性优先于性能这 2 个原则几乎是需要时刻谨记的。而当我们面对历史代码的时候,我们应该考虑 SSH(Shit Stop Here)原则。


基于上述原则,我们在评价一个代码单元的可读性时,会依次看几个方面:

  • 设计问题:包括功能性设计(如是否解决了正确的问题、是否正确的解决方案)、整体设计、安全性问题

  • 实现问题:包括命名、一致性、代码逻辑、复杂度、作用域、惯用法、错误处理等

  • 规范问题:包括 MR 信息、注释、命名、魔法数字等等,这部分一般依据不同语言有所不同。

Google 和腾讯是怎么提升代码可读性的

答案:代码评审!

Google 主要通过代码评审制度来确定代码的可读性,没有任何代码可以不经过代码评审就进入代码库。腾讯某 BG 从 2020 年开始全面推广代码审查制度,并推行代码可读性认证体系。

因此,可以说代码可读性的提升取决于代码评审制度的执行。原因很简单,代码评审,就是让第二个人来“读”代码。

代码评审的作用:

  • 发现代码中的问题或缺陷——其实这是最不重要的一点,毕竟一眼就能看出来的问题,往往不是难以测出来的问题;

  • 让开发人员写出更整洁的代码——当你知道有人要读你的代码的时候,你会有压力让代码尽量整洁些易读些;

  • 传播知识:

    1. 对团队成员编码能力的提升有极大帮助。回想一下,上课的时候老师讲完 45 分钟,我们最多只能记住 30%,但通过做作业和老师的批改,我们才能记住大部分的知识点。

    2. 让重要代码有后备维护人员。很多团队里,一个开发人员负责一个模块,每个人都只关注自己的模块。长此以往,每个人模块都只有 1 个人熟悉和了解,一旦这个同事休假——但愿不是离职,其他人都束手无策了。

后    记

代码是资产,还是负债?资产:资产是指由企业过去的交易或事项形成的、由企业拥有或者控制的、预期会给企业带来经济利益的资源。负债:是指因为过去的交易或事件,使得未来必须要牺牲的经济利益。衡量一份代码,是资产还是收益,可以通过下面的公式:

软件带来的收益 - 软件维护成本 > 0

而代码可读性,在降低软件维护成本上,至关重要。

今日好文推荐

我国互联网遭境外网络攻击;俄罗斯或将多家外企“国有化”;Linux内核被发现易于利用的漏洞|Q资讯

TikTok美国数据或将由甲骨文存储,字节跳动无权访问

我放弃了年薪200万的岗位,因为“复制粘贴”的技术活让人厌恶

作业帮基于 StarRocks 画像系统的设计及优化实践

点个在看少个 bug 👇

登录查看更多
0

相关内容

一个旨在提升互联网阅读体验的工具。 readability.com/
北约《军事系统的网络安全风险评估》技术报告
专知会员服务
98+阅读 · 2022年4月18日
腾讯等《2022年金融科技十大趋势展望》,68页pdf
专知会员服务
63+阅读 · 2022年3月31日
【干货书】C++实战编程指南,附549页pdf与Slides
专知会员服务
82+阅读 · 2021年4月23日
专知会员服务
91+阅读 · 2020年12月26日
【2020新书】高级Python编程,620页pdf
专知会员服务
235+阅读 · 2020年7月31日
【2020新书】如何认真写好的代码和软件,318页pdf
专知会员服务
63+阅读 · 2020年3月26日
领域驱动编程,代码怎么写?
阿里技术
0+阅读 · 2022年3月15日
如何将你的代码可视化?
AI前线
0+阅读 · 2022年3月11日
改 3 行代码不应该花一整天的时间
InfoQ
0+阅读 · 2022年1月25日
改3行代码不应该花一整天的时间
AI前线
0+阅读 · 2022年1月15日
Android项目架构设计深入浅出
阿里技术
1+阅读 · 2022年1月7日
6000字,快速理解低代码
人人都是产品经理
2+阅读 · 2022年1月3日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
8+阅读 · 2008年12月31日
Arxiv
11+阅读 · 2018年10月17日
VIP会员
相关资讯
领域驱动编程,代码怎么写?
阿里技术
0+阅读 · 2022年3月15日
如何将你的代码可视化?
AI前线
0+阅读 · 2022年3月11日
改 3 行代码不应该花一整天的时间
InfoQ
0+阅读 · 2022年1月25日
改3行代码不应该花一整天的时间
AI前线
0+阅读 · 2022年1月15日
Android项目架构设计深入浅出
阿里技术
1+阅读 · 2022年1月7日
6000字,快速理解低代码
人人都是产品经理
2+阅读 · 2022年1月3日
相关基金
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
1+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
0+阅读 · 2009年12月31日
国家自然科学基金
8+阅读 · 2008年12月31日
Top
微信扫码咨询专知VIP会员