Review的概念与意义

是什么让Google的程序如此优秀

让Google的程序如此优秀的一个最重要的事情看起来是非常的简单:代码审查

在Google,没有程序,任何产品、任何项目的程序代码,可以在没有经过有效的代码审查前提交到代码库里。

从代码审查里能得到什么?

•在代码提交前,用第二群眼睛检查一遍,防止bug混入。这是最常见的理解,也是它最不重要的一点。

•代码审查的最大的功用是纯社会性的。如果你在编程,而且知道将会有同事检查你的代码,你编程态度就完全不一样了。你写出的代码将更加整洁,有更好的注释,更好的程序结构——因为你知道,那个你很在意的人将会查看你的程序。

•还有一个非常重要的好处。代码审查能传播知识。通过代码审查,至少会有两个人熟悉这些程序——作者,以及审查者。审查者并不能像程序的作者一样对程序十分了解——但他会熟悉程序的设计和架构,这是极其重要的。

代码审查最重要的一个原则:代码审查用意是在代码提交前找到其中的问题——你要发现是它的正确。在代码审查中最常犯的错误——几乎每个新手都会犯的错误——是,审查者根据自己的编程习惯来评判别人的代码。

代码审查的第二个易犯的毛病是,人们觉得有压力,感觉非要说点什么才好。如果你总是力图找出一点什么东西来批评,你这样做的结果只会损害自己的威望。你的评论将不再被人重视。

第三是速度。你不能匆匆忙忙的进行一次代码审查——但你也要能迅速的完成。你的同伴在等你。

Review的概念

›在软件开发过程中邀请同行对工作产品进行审查,以图尽早查找出工作产品缺陷,进行质量控制的的一种质量活动。

Review的意义
›降低返工(rework)的成本。

›越早开展对项目越有价值,推荐开展100% review,在代码完成一个类/函数和文档完成一个Story的分析设计时进行一次review。

代码审查九字真言:
1. 看见了If,就想Else。
2. 看见malloc,就去找Free。
3. 函数调用要小心,需要看看返回值。
4. 看到for循环,就找边界值。
5. 看见return要注意,要去前面找资源。
6. 看见数组把神提,问题往往在下标。
7. 不要小看字符串,长度是个大问题。
8. 得到函数不要急,看看变量初始化,各种路径要小心。
9. 赋值函数最危险,变量没有初始化。
九句句真言不孤立,相互结合显神威。

下面总结了在一个简单列表中最容易保持的11项实践方式:

1、一次评审少于200--400行的代码。

2、目标为每小时低于300-500LOC的检查速率。

3、花足够的时间进行正确缓慢的评审,但是不要超过60-90分钟。

4、确定代码开发者在评审开始之前就已经注释了源代码。

5、为代码评审和获取制度建立可定量化的目标,这样您才能改进流程。

6、使用检查列表,因为它可以极大地改进代码开发者和评审者得作品。

7、确认缺陷确实得到修复了。

8、培养良好的代码评审文化氛围,在这样的氛围中搜索缺陷被看做是积极的活动。

9、警惕“老大哥”效应。(作为一个开发员,您可以自动假设“老大哥正看着您呢”是真的,如果评审制度是由评审支持工具自动评价的,更是这样的。)

10、最少评审一部分代码,就是您不能评审全部的代码,以从Ego Effect(自我效能感)中受益。

11、采用轻量级,能用工具支持的代码评审。

Review的概念与意义

时间: 2024-12-22 14:18:08

Review的概念与意义的相关文章

重载模块概念及意义

# -*- coding: utf-8 -*- #python 27 #xiaodeng #重载模块概念及意义 #正如我们所看见的那样,模块程序代码默认只对每一个过程执行一次,要强制使模块代码重新载入并重新运行,你需可以要求python #这么做,也就是调用reload内置函数. #导入模块只会在第一次被导入时,加载和执行该模块中的代码 #之后导入只会使用已加载的模块对象,而不会重新加载执行文件中的代码 #reload函数会强制已加载的模块的代码重新载入并重新运行.此文件中心的代码的赋值语句会在

C++--继承的概念和意义、继承中的访问级别、不同的继承方式

一.继承的概念和意义 Q:类之间是否存在直接的关联关系?由这个问题由此联想到生活中的例子:组合A.组合关系:整体与部分的关系组合关系的描述--代码示例 #include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout <&

C++--模板的概念和意义、深入理解函数模板、类模板的概念和意义

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.

第49课 多态的概念和意义

1. 函数重写回顾 (1)父类中被重写的函数依然会继承给子类 (2)子类中重写的函数将覆盖父类中的函数 (3)通过作用域分辨符(::)可以访问到父类中的函数 Child c; Parent* p = &c; c.Parent::print(); //从父类中继承 c.print(); //在子类中重写 p->print(); //父类中定义 2. 面向对象中期望的行为 (1)根据实际的对象类型判断如何调用重写函数 (2)父类指针(引用) ①指向父类对象时,则调用父类中定义的函数 ②指向子类对

设计模式的学习(一)-软件设计模式的概念与意义以及23种设计模式的简单介绍

有关软件设计模式的定义有很多,有些是从模式的作用出发,也写是根据模式的特点,本文根据大多数教材定义,从以下两个方面来说明. 软件模式的概念.软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用,多数人知晓,经过分类编目.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及对该问题的解决方案.也就是说,它是解决特定问题的一系列套路,是前辈们代码设计经验的总结,具有一定的普遍性,可以反复使用.目的是为了提高代码的可重用性,代码的可读性和

快速理解DevOps概念和意义-兼谈SRE

最近几年,由于负责的范围的变化.工作逐渐从某个IT领域或者部门,开始关注到整个IT体系的运转和管理.中间也遇到不少困难,同时也有机会去从更高的层面去学习和实践IT治理.文章主要是总结一下我对DevOps相关的理解和认识. 为什么会有DevOps,解决了什么问题: 现代企业其实都是通过IT系统进行管理和运营的,在变化迅速和竞争激烈的领域,IT系统的新需求数量越来越多,软件发布的频率越来越高,不少互联网公司24小时内会发布几十个到上百个release到生产环境.与此同时,业务对IT服务和系统的稳定性

第43课 继承的概念及意义

1. 类之间的组合关系 (1)组合关系:整体与部分的关系 [实例分析]组合关系的描述 #include <iostream> using namespace std; //内存类 class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout << "~Memory()" << endl; } }; //硬盘类

方差、协方差、协方差矩阵的概念及意义

期望 离散型随机变量的一切可能的取值xi与对应的概率Pi(=xi)之积的和称为该离散型随机变量的数学期望(设级数绝对收敛),记为 E(x).随机变量最基本的数学特征之一.它反映随机变量平均取值的大小.又称期望或均值. 若随机变量X的分布函数F(x)可表示成一个非负可积函数f(x)的积分,则称X为连续性随机变量,f(x)称为X的概率密度函数(分布密度函数). 方差 方差是各个数据与平均数之差的平方的平均数.在概率论和数理统计中,方差(英文Variance)用来度量随机变量和其数学期望(即均值)之间

第43课 继承的概念和意义

面向对象的高端课程都是和继承相关的,例如设计模式. 思考: 类与类之间是否存在直接的关联关系? 生活中的例子: 组合关系的程序描述: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Memory 7 { 8 public: 9 Memory() 10 { 11 cout << "Memory()" << endl; 12 } 13 ~