【CSDN编者按】:代码审核是软件开发文化的主要组成。这项实践对我们尤其重要,因为我们的目标是交付可靠的产品,而所有伟大的产品都离不开整洁的代码。

原文链接:https://2muchcoffee.com/blog/why-code-review-is-a-must-have-for-your-product/

编译 | 弯月    责编 | 丁恩华

头图 | CSDN 下载自东方IC

出品 | CSDN(ID:CSDNnews)

在本文中,我们就来分享一下代码审核的最佳实践,以及为什么代码审核对于团队与产品的成功至关重要。如果你没有实施代码审核,或者你觉得可以进一步提高代码审核水平,我们希望本文对你有所帮助!

为什么要实施代码审核?

代码审核是指对计算机源代码系统化地审查,常用软件同行评审的方式进行,目的是找出及修正在软件开发初期未发现的错误,提升软件质量及开发者的技术。如果你想检查初级开发的代码、提高代码可读性、在团队内分享知识,那么应该优先考虑代码审核。以下是我们的代码审核准则。

代码审核的内容

查看代码的结构、风格、逻辑、性能、测试覆盖率、设计、可读性、功能性。虽然结构与逻辑的检查可以交给自动检查,但功能与设计则需要人工审查。

带着问题审核代码可以让你关注正确的问题。例如,在审核代码时,你需要考虑以下几个问题:

  • 我理解代码的功能吗?

  • 代码的运行方式符合我的预期吗?

  • 代码满足了项目需求吗?

在代码审核之前完成构建与测试

不要假定代码可以正常运行,你应该自行完成构建与测试。在测试代码的时候,确保你的构建很正确。如果项目有构建系统,你应该使用。如果持续构建系统报告说代码可以成功构建,那么你也应该可以做到。注意,如果 CI 构建失败,你应该要求代码构建成功,才能发布。

在编译完代码后,你应该运行测试。

注释很重要

每个逻辑语句都应该通过注释描述程序员的意图。假设你从事的项目遵守这项约定,但你没有看到注释,那么就应该要求他们添加上去。只是添加注释还不够,注释必须说清楚代码的实际意图。

提供有帮助的反馈

建设性的反馈才是代码审核的核心。如果不想做陈述的话,你可以提问。在提出建设性反馈的同时,不要忘记给予赞扬。当面给出反馈有助于正确地沟通。代码需要审核,而你需要审核同事的代码。将审核作为一种学习的过程,对每个人都有好处。

考虑代码在生产环境中的运行

设计很重要,集成也很重要。这些代码如何在实际的系统中运行?它怎样处理错误的输入以及用户错误?它可以很好地兼容其他代码吗?简而言之,代码必须严谨。

检查文档、测试与构建文件

好的代码不仅包括代码,还有周围所有的一切。每次改版都应该包含下列各项:

  • 覆盖新代码的测试。严格审核这些代码,确保如果有问题的话,测试会失败。

  • 新代码的文档。良好的代码离不开良好的文档。不要将文档工作留到后面再说,文档本身应该一起出现在新版本中。

  • README更新。README.md、BUILDING.md、CHANGELOG.md等文件应该反映出最新的变化。实际上,这些文件很少需要变化,但你应该确保这些文件的更新。

提建议的时候应该说明优先级

代码应该:

  • 第一,功能优先;

  • 第二,整洁且易于维护;

  • 第三,优化。

最终,代码都应该满足上述要求,但是满足的顺序也很重要。如果代码不能正常运行,那就不要着急担心风格的问题了。同理,如果代码有问题,或者风格很糟糕,那么优化只会让情况更糟。

落实审核结果

在提出修改意见之后,你应该准备好再审核一次。确保必要的修改都落实了,而且所有发现的问题都得到了解决。

另外,你需要确保投入足够的精力跟进后续的审核,就像是第一次审核一样。重新核对此处介绍的准则。

审核人员也不完美

审核代码是一项艰巨的任务,所以不要忘记审核人员也不完美。你可能会漏掉一些问题,发现不了一些 bug,性能缺陷也可能进入生产环境……简单来说,出现有问题的代码也很正常!

如果你不熟悉代码或者概念,则可以要求其他审核人员提供反馈,但是不要害怕担任审核的工作。四只眼睛总比两只眼睛看得清楚。

如果你发现自己在审核中犯了错,最佳处理方式是承认错误。在审核系统的注释中说明,或填写问题/bug票。

代码审核检查列表

代码的格式、架构、非功能性需求、面对对象分析以及设计原则是关键因素,可以确保新产品开发的的可维护性、可读性、可扩展性以及实用性。

如下代码审核检查列表可以让你了解到,在代码审核期间,你需要考虑哪些方面:

初级问题

  • 文档:编程标准是否要求注释,代码中有注释吗?注释正确吗?是否有附加价值?是否有人复制粘贴了一块代码,却忘记了更新注释?

  • Lint:简单或常见的错误;不符合最佳实践,或者不符合语言或框架推荐的风格。

  • 编程标准:团队或公司是否有一套编程准则或规定?这些代码符合这些标准吗?

  • 无意中留下来的代码:未使用的变量,需要完成的工作列表。代码被注释出去了,但没有删除。

  • 语言惯例:代码是否符合语言和框架的惯例?

  • 风格的统一性:这些代码的风格是否与其他代码统一?

  • 格式

  • 拼写

中级问题

  • 吹毛求疵:感觉不太对的地方。代码看起来有点取巧或者像权宜之计。虽然可以正常工作,但是为了以防万一,你应该了解代码背后的思想。最后,你需要添加注释,否则下一个阅读代码的人也会觉得有点奇怪。

  • 常见的误区:即你从以往的挫折中学到的经验教训。可能是某个框架、库或者共享组件不是特别可靠或实用。也许是某个客户提出了独特的要求。

  • 可读性与可维护性:半年后还能读懂这些代码吗?如果原本的作者离开公司,你可以维护和更新这些代码吗?

  • 命名:函数/方法/类的命名恰当吗?它们的用途清楚吗?在不看注释的情况下,能够明白方法的用途吗?

  • 方式过于陈旧:最佳实践会随着应用程序的生命周期发生变化。有时,你甚至意识不到自己采用了某种过时的方法,直到在代码审核中被发现。

  • 重复发明轮子:这个任务可以利用某些已有的代码完成。你可以重新实现一些工具代码,或者也可以利用共享库。

  • 复杂度:代码太过于复杂,难以理解。所有功能都被塞到了几个巨型的类中,或者分散到太多类中,而这些类之间的联系也非常薄弱。

  • 不恰当的耦合:这段代码与其他代码有连接,但这种耦合不恰当。可能是因为某个常用的库组件与它的消费者之间存在紧密的耦合。

  • 面向公众的问题:API中的拼写错误,或者公共API的URL结构不符合准则。

  • 覆盖率:单元测试是否覆盖了新功能?还有其他需要覆盖的重大测试用例吗?

  • 方法的统一性:同一个区域的代码使用了两种不同的方法处理同一个问题。

  • 极端情况:在某些情况下,这段代码可能会出问题或者出现未定义的行为吗?

  • 性能:这段代码进入生产环境后会引发问题吗?

高级问题

  • 引入新方法:PR引入了新模式、库或者工具。这种方法合理吗?有文档记录吗?我们需要采用这种新方式吗?这种新方法增加的工作量值得吗?

  • 征兆和设计模式:代码结构不合理,或者代码出现了不好的征兆。可能是因为应用的模式不正确,或者可能使用其他模式更好。

  • 不符合需求:代码没有解决应该解决的问题,或者没有解决业务需求。

  • 镀金:为了将来的稳定性,代码变更涉及太多额外的代码,但你可能并不需要。

  • 架构问题:在深入细节之前,先看看整体的架构是否正确。

  • Bug

1. 代码审核的副作用

然而,代码审核也有一定的副作用,每个开发人员都应该仔细考虑。

2. 对事不对人

代码审核最常见的问题之一是,有时人们会觉得被某些评价冒犯到了。这也不奇怪,代码审核是提供反馈的机会,难免会以批评的形式出现,而批评本身就很棘手。审核代码的人一不小心就会给出批评,而批评很容易被误解成人身攻击。

建设性的批评有助于成长,但是为了有效地提出批评,提出方与接收方都应该谨慎地沟通。

3. 语气

提出意见的人必须注意语气。虽然有些批评并不是针对个人,但是往往会被误解。

4. 错误的时间,错误的场合

有时,代码审核意见会跑题。不是说人们讨论的话题不对,而是说他们讨论的问题不属于代码审核的范畴。

5. 风格

例如,很多PR的评论都为多少个空格而争论不休。其实,这种问题完全可以通过编程准则消灭于无形。

6. 架构

还有一种情况是,代码审核的评论涉及系统的更高层,可能需要展开架构层面的讨论。如果代码中存在任何架构问题,审核人员当然有责任将其找出来。最终的代码审核并不是全面讨论如何解决问题的最佳场所。理想情况下,这些问题应该在动手编写代码之前就得到了解决。

7. 忽视

代码审核还有一个常见的问题是:人们不及时地审核。PR在提交之后需要等很久才能得到评论。出现这种情况的原因有很多:

  • 代码变更量过大。当代码变更量过大时,审核代码的人会感觉到压力。变更量完全由编写的人决定。当然,有时候无法避免大型变更。遇到这种情况,应该组织一次面对面的代码审核会议。这种方式比一长串的评论更有效。

  • 代码审核的形式。事实上,无论代码变更量有多少,有时就应该组织代码审核会议。虽然花费的时间更多,但是可以及时地获得有效的反馈。

总结

一旦建立切实的流程后,代码审核就会变成学习的良机,整体的代码质量也会得到提升。持续成功需要团队贯彻流程,并教导初级开发,但是,为了培养健康的代码审核文化,一切努力都值得。

更多精彩推荐
☞官宣!前微软研发经理邹欣加入 CSDN 担任副总裁,CSDN 重磅招揽一流人才
☞猖狂!微软、思科源码惨遭黑客 100 万美元打包出售
☞Deno 冲上榜首,Vue.js 首次屈居第二,JavaScript 2020 年度“新起之秀”都有谁?
点分享点收藏点点赞点在看

翻车事故频发,原来是开发者漏了这一步!相关推荐

  1. “人脸识别”事故频发,“猪脸识别”却很靠谱!阿里巴巴赌对了

    伴随着科技的发展,大家开始逐渐重视自己的隐私,对于"人脸识别"这一新兴技术也抱有很多的质疑,而且"人脸识别"事故频发,被他人盗用的风险目前还是极大的. 现在的人 ...

  2. 电动车爆炸事故频发!如何基于EasyGBS技术实现电动车禁入电梯的智能化防控?

    一.现状背景 全国各地因电动车违规停放.充电导致的火灾事故频发,教训十分惨痛,一件件电动车在电梯爆炸起火的新闻让人心惊肉跳.因此近期,公安部.应急指挥部等多个部门下发了<关于规范电动车停放充电加 ...

  3. Facebook的Aquila遭查,无人机事故频发皆因哪般

    Facebook无人机因"结构故障"遭查,而细数历来的无人机事故,原因都出在哪里?为了降低无人机威胁性,人们也是纷纷出招. 今天,根据外媒报道,Facebook无人机Aquila的 ...

  4. 蓄电池爆炸、起火等事故频发?机房这一步至关重要

    动力环境监控是集监控.管理.复盘等于一体,远程管理机房,利用了多种功能,减少机房的安全隐患. 现在国内外有很多知名的厂商都有推出自己的动力环境监控品牌,那么选择什么样的动力环境监控才是最优保障和性价比 ...

  5. 煤矿事故频发 安防拿它怎么办

    据中国之声<新闻纵横>报道,5月7日上午11时左右,湖南省株洲市攸县黄丰桥镇吉林桥煤矿井下发生一起气体中毒事故.目前死亡18人,在医院接受救治37人. 现场图 而类似的煤矿安全事故此起彼伏 ...

  6. 智能驾驶事故频发,AEB为何无法「兜底」安全

    2020年6月,一辆特斯拉Model 3在中国台湾地区某高速公路发生事故,当时车辆开启了Autopilot功能,时速约为110Km/h.当时,驾驶员并未注意到前方有货车侧翻,在撞击前2秒系统才进行了紧 ...

  7. 校园安全事故频发 安防建设从本质抓起

    3月22日,河南某小学发生了一件令人心碎的悲剧,学生们在上厕所时发生踩踏,目前已经有两个孩子不幸遇难,另有20余名学生受伤:3月24日下午,在广西贵港桂平市木乐镇广仁村路段,一辆大货车与放学后横过公路 ...

  8. 云平台屡次停摆,核心系统事故频发?您的运维系统该升级了!

    3月3日凌晨,阿里云出现宕机故障,受宕机故障影响,华北不少互联网公司 APP.网站纷纷瘫痪,一大波程序员.运营和运维不得不从被窝里爬起来干活.网友"上海蓝盟网络夏立成"调侃,&qu ...

  9. 特斯拉Autopilot事故频发,真正意义上自动驾驶还要多久问世?

    这并不是特斯拉 Autopilot 首次发生事故致死案例. 来源:未来汽车科技的 新能源汽车更替传统汽车是时代趋势,作为业内先驱,身处聚光灯下的特斯拉不可避免会受到大众关注,例如涉及它的每一次交通安全 ...

最新文章

  1. 如何用体验赢取用户信任?让 Waymo 来教教你
  2. 解决AttributeError: module ‘scipy.misc‘ has no attribute ‘imread‘报错问题
  3. abap--关于sap地址,传真,邮箱的地址读取
  4. 【数据集下载神器】体验1000+优质数据集极速下载
  5. [python3.3]Python异步Socket编程【TCP】
  6. c语言枚举和结构体的区别,全面了解结构体、联合体和枚举类型
  7. 10截图时屏幕变大_最全的MAC端截图工具推荐,寻找适合自己的截图工具
  8. 深入理解 Python 异步编程(上)
  9. 哨兵1号(Sentinel-1)与陆地探测1号(L-SAR)对比
  10. 软件开发工作量评估:基于FPA功能点分析法的深入解读
  11. html边框流动效果,采用css实现流动的边框
  12. Kubernetes(14):cordon暂停调度/uncordon恢复调度/drain驱逐
  13. sklearn笔记18决策树gini系数
  14. 如何利用手机访问电脑本地的localhost?
  15. vue 数字动画递增_数字滚动动画效果 vue组件化
  16. Cisco Firepower 9300 Series FTD Software 7.2.0 ASA Software 9.18.1
  17. 路由器端口转发数量限制_路由器可以同时处理的设备数量是否有限制?
  18. new操作符的实现原理
  19. POJ 2482 Stars in Your Window 线段树+扫描线
  20. word 公式等号对齐和编号居右

热门文章

  1. leetcode978. Longest Turbulent Subarray
  2. Python实现小球游戏
  3. selenium操作webdriver(一)
  4. 03 Python爬虫之Requests网络爬取实战
  5. iTOP-4412开发板基于Linux-C测试程序的编译和运行
  6. WPF 自定义BarChartControl(可左右滑动的柱状图)
  7. Laravel 开发环境搭建
  8. 洛谷1056 排座椅 解题报告
  9. UML/ROSE学习笔记系列二:UML的概念模型
  10. 弹出菜单快捷键的使用方法