Code Review 最佳实践
文章将了以下内容:
- 3w:why、what、when 进行 code review
- code review 之前的准备
- 执行 code review
- CRs 示例
1.为什么进行CR
- 代码编写者会规范自己的代码,也会觉得复查别人的代码有一种自豪感;
- 有益于分享知识
- 项目中的其他人知道全部的功能
- 写代码的人使用的算法或技术会被全员学习
- 加强团队内沟通
- 保证代码风格统一,减少bug
- 简洁的代码不止易于复查,也能减少bug
2.复查什么
这个需要在时间和质量之间做选择。有的团队可能仅关注合并和主分支的功能,其他团队可能会对所有代码进行审查。
但是无论范围是什么,需要确定的是,所有人的代码都需要被复查。即使是毫无瑕疵的代码,在审查的过程中,其他人会学到很多编码的好习惯。
3.上线时再进行吗
一般来说复查是在自测、集成测试之后,需要把代码合到主分支之前进行。
4.复查之前的准备
- 提交者声明代码范围、内容的多少
- 完整的、自测通过之后的代码
- 代码重构不应该影响原有功能,相反,增加功能时也不应该重构其他代码。
- 重构的代码会不重视
- 大量的重构会不好做
遴选,刷新提交等 git 功能
5.提交声明(commit message)
- 总结
- 描述做了什么以及怎么做的
6.复查人
- 1-2个熟悉项目的人,其中一个应该资深
- 不应该引入其他问题,像代码风格之类的讨论
7.code review
- 代码功能
- 提交的代码实现了功能吗
- 问问题
- 实现
- 你会如何实现
- 可以抽象吗
- 像对手一样去复查,但是态度要友好
- 考虑已实现库,减少重复造轮子
- 实现是否改动了依赖,为什么
- 易读性
- 你花多长时间读懂了?
- 是否符合团队的编码风格
- 是否有未完成的todo
- 可维护性
- 看测试代码
- 是否向后兼容
- 是否需要集成测试
- 提交反馈:是否有逻辑问题?
- 文档是否更新了
- 安全性
- 符合安全规范
- 注释:简洁、友好
8.反馈
- 要有反馈,即使是一句
done - 如果有修改,需要再次
review
9.复查示例
9.1 命名不一致
class MyClass {
private int countTotalPageVisits; //R: name variables consistently
private int uniqueUsersCount;
}
9.2 方法声明不一致
interface MyInterface {
/** Returns {@link Optional#empty} if s cannot be extracted. */
public Optional<String> extractString(String s);
/** Returns null if {@code s} cannot be rewritten. */
//R: should harmonize return values: use Optional<> here, too
public String rewriteString(String s);
}
9.3 重复造轮子
//R: remove and replace by Guava's MapJoiner
String joinAndConcatenate(Map<String, String> map, String keyValueSeparator, String keySeparator);
9.4 bugs
//R: This performs numIterations+1 iterations, is that intentional?
// If it is, consider changing the numIterations semantics?
for (int i = 0; i <= numIterations; ++i) {
...
}
9.5 架构考虑
otherService.call(); //R: I think we should avoid the dependency on OtherService. Can we discuss this in person?
Code Review 最佳实践的更多相关文章
- Code Review最佳实践
我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题.包括像Google.微软这些公司,Code Review都是基本要求,代 ...
- Code Review最佳实践(转)
我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题.包括像Google.微软这些公司,Code Review都是基本要求,代 ...
- 如何对Code Review的评论进行分级
我曾写过一篇关于Code Review的文章<Code Review 最佳实践>,在文章中建议对Code Review的评论进行分级: 建议可以对Review的评论进行分级,不同级别的结果 ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- Code Review 程序员的寄望与哀伤【转载】
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- 转: Code Review 程序员的寄望与哀伤
转自: http://www.cnblogs.com/mindwind/p/5639008.html 一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产 ...
- 15个最佳的代码评审(Code Review)工具
代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能.代码审查程序以各种形式,如结对编程,代码抽查等.在这个列表中,我们编制了1 ...
- 有人实践过 Phabricator 以及 Arcanist 作为 code review 的工具么?(转)
作者:覃超链接:http://www.zhihu.com/question/19977889/answer/13539702来源:知乎 平时就经常实践. 整个公司的code review就是使用这个. ...
- 漫谈Code Review的错误实践
从刚开始工作时到现在,已经写了7年的代码,大部分代码都被人review过,自己也review了很多人的代码.在上一家公司的时候,我负责的一轮面试是专门进行Code Review的练习和经验谈. 通过在 ...
随机推荐
- [Android systrace系列] systrace入门第一式
转载请注明出处:https://www.cnblogs.com/zzcperf/p/13978915.html Android systrace是分析性能问题最称手的工具之一,可以提供丰富的手机运行信 ...
- CentOS下Mysql简易操作
Mysql mysql的root密码重置 编辑mysql主配置文件 vim /etc/my.cnf 添加..grant参数 [mysqld] skip-grant 重启mysql服务 service ...
- C#(二)基础篇—操作符
2020-12-02 本随笔为个人复习巩固知识用,多从书上总结与理解得来,如有错误麻烦指正 1.数学操作符 int a=2,b=3,c=0; float d=0; c=a+b; //c=5 c++; ...
- C#(一)基础篇—类型与变量
于今日起学习巩固C#基础 2020-12-01 本随笔用于个人回忆理解,记录当天学习过程,内容多从书中整理与自我学习了解,如有问题麻烦指正 以后有时间会单独分版块叙述 不管什么语言,都从一个Hello ...
- SpringBoot中的Tomcat是如何启动的?
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- 2020.11.30【NOIP提高A组】模拟赛反思
90,rk42 T1 考试的时候觉得可以贪心,就每次找到最大的,然后以它为根去遍历每个子树,求出其最大值,然后删去这个点.一直持续直到边删完,时间复杂度\(O(n^2)\),然后想了想链的情况,没有打 ...
- DRF使用Serializer来进行序列化和反序列化操作
在serlizers中添加 # -*- coding: utf-8 -*- from rest_framework import serializers from .models import * c ...
- Apache Flink 如何正确处理实时计算场景中的乱序数据
一.流式计算的未来 在谷歌发表了 GFS.BigTable.Google MapReduce 三篇论文后,大数据技术真正有了第一次飞跃,Hadoop 生态系统逐渐发展起来. Hadoop 在处理大批量 ...
- moviepy音视频剪辑VideoClip类set_position方法pos参数的使用方法及作用
☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑VideoClip类set_position方法用于多个剪辑合成一个剪辑时设置调用剪辑实例的拷贝在合成剪辑的位置. 调用语法: set ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性
老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...