阅读更多

0顶
1踩

行业应用

原创新闻 代码审查拯救世界?

2016-08-31 09:31 by 副主编 mengyidan1988 评论(0) 有8252人浏览
引用

原文:Saving the world with a code review
作者:Roy van Rijn 翻译:王嘉怡 责编:仲培艺

代码审查是指阅读代码来检查源代码与编码标准的符合性以及代码质量的活动。现在,越来越多的团队倡导要进行代码审查活动,而本文作者通过一幅漫画,来诠释其对代码审查的理解,观点可能不符合大家的常规心理。以下为译文:

一天早晨,本文作者在Twitter上面看到这样一条推文:
引用
Why code reviews are important? pic.twitter.com/8KyMo7Syis
— Arun Gupta (@arungupta) August 28, 2016

该条推文下面放了Oppressive Silence网站上的一组漫画:



通过代码审查解决?

我想问的主要问题:
引用
代码审查期间真的会发现问题或bug吗?

我的回答可能不会惊艳到你,下面我从四个方面来回答这个问题,至少这样的问题不应该发生在我(或者任何其它有经验的程序员)身上。

1.静态变量/全局状态(Static variables/global state)

第一个非常明显的错误是把变量isCrazyMurderingRobot设置成static并且是可变的。程序员在下面就很难推论和跟踪这个变量,任何程序员都可以给它赋值,这是完全不可接受的,没有任何理由把该变量设置成可变的静态类型。

重要提示:如果你要设置变量,特别是可变变量,那么,你应该把它的作用域范围最小化。

2.Final方法参数

如果你把全局状态的问题解决了,那么代码很有可能是这样的(转换成Java代码):
private void interact_with_humans(boolean isCrazyMurderingRobot) {
    if(isCrazyMurderingRobot = true) {
        kill(humans);
    } else {
        be_nice_to(humans);
    }
}

任何时候,只要把一个参数传递到一个方法中,都应该把该参数设置成final。方法里的参数应该是不可变的。这可能意味着,方法应该拥有属于自己的(作用域)可变变量。

下面的代码变化:
private void interact_with_humans(final boolean isCrazyMurderingRobot) {
    if(isCrazyMurderingRobot = true) {
    // Compilation error: 'Cannot assign a value to final variable 'isCrazyMurderingRobot'

在告诉我错误之前,这段代码根本不会编译,好了,世界得救了!

3.静态代码分析

这样的bug在我的代码中根本不会发生,因为我们在整个项目中都启用了静态代码分析。例如FindBugs这款软件,它会立即揪出这种bug。

看一下FindBugs里的特定检查:
引用

QBA: Method assigns boolean literal in boolean expression (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)

This method assigns a literal boolean value (true or false) to a boolean variable inside an if or while expression. Most probably this was supposed to be a boolean comparison using ==, not an assignment using =.

在现代编程中,静态代码分析工具是必不可少的。

4.Yoda conditions

另外一个好习惯使我的代码中永远都不会发生这样的bug,采用Yoda模式来编写If语句。原因是它会在cartoon里完全阻止这个bug。
在cartoon中,这个if语句会由“疯狂谋杀机器是真的吗?”转变为:“真的要疯狂谋杀机器人吗?”

如果这样做,代码应该是:
private void interact_with_humans(boolean isCrazyMurderingRobot) {
    if(true = isCrazyMurderingRobot) {
    // Compilation error: 'Variable expected'

结论/拯救世界

所以,你认为Arun的观点是正确的吗?代码审查会发现这个bug吗?对还是不对呢?

人类擅长推理、思考、富有创造性、并且发现错误,但语法编译对人类来说是一件可怕的事情。在代码审查期间,你可能仅仅发现一些拼写或基础错误(typo)但并未真正发现bug。难道第二双眼睛就可以发现了吗?
  • 大小: 188.6 KB
0
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 分享信息加密技术

           2011年CSDN由于网站安全措施不给力,导致的密码泄露事故,使用户数据库被黑客“拖库”,而当时CSDN对于密码的存储方式是以明文的方式存储,导致密码泄露,成为地下黑市交易的商品。所以大型网站已经越来越注重自身数据库的安全,维护敏感数据的安全更是重中之重,信息加密技术的发展也趋于完善。加密技术可以大致分为三类:1.单项三列加密,2.对称加密,3.非对称加密。       一.单项散...

  • ASP.net中md5加密密码的方法

    void Page_Load(Object sender,EventArgs e){//获取要加密的字段,并转化为Byte[]数组byte[] data=System.Text.Encoding.Unicode.GetBytes(source.Text.ToCharArray());//建立加密服务System.Security.Cryptography.MD5 md5 = new Syste

  • ASP.net中md5加密的方法

            MD5简介:         MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值

  • ASP.NET MD5 加密

    //小写 public static string GetMD5(string str) { byte[] b = System.Text.Encoding.Default.GetBytes(str); b = new System.Security.Cryptography.MD5CryptoServiceProvider().ComputeHash(b); string md5r = ""; ...

  • 代码审查过程

    对我而言,把代码产品化而没有合适的审查流程,就像是一场抽抽乐游戏。代码当然也有可能会挺好,不过总还是有一定概率某人的哪块积木没抽好,然后一切就轰然崩塌。无论是采用持续集成服务、结对审查、QA审查,还是...

  • [我的翻译]代码审查过程

    对我而言,把代码产品化而没有合适的审查流程,就像是一场抽抽乐游戏。代码当然也有可能会挺好,不过总还是有一定概率某人的哪块积木没抽好,然后一切就轰然崩塌。无论是采用持续集成服务、结对审查、QA审查,还是...

  • 为什么说 AI 将拯救整个世界?

    幸运的是,我带来了一个好消息:人工智能不仅不会毁灭世界,而且还有可能会拯救世界。 AI 是什么? 首先,我们来简单地介绍一下人工智能(AI)是什么。AI 是通过数学和软件代码教计算机如何以类似于人类的方式理解...

  • 人工智能会取代程序员吗?

    同时,人工智能也被调用来拯救“无代码/低代码”工具,以更好地帮助开发人员掌控这些环境并实现其应用。 Mendix及其Mendix Assist是最早看到AI作为发展辅助潜力的参与者之一。去年五月,Appian宣布其低代码平台使用...

  • ASP.NET下实现密码MD5加密

    在大学期间,做项目从来不管密码是不是明文存储,如今到了公司,肯定就不一样了。至于CSDN居然用明文存储密码,显然是脑残行为。所以现在做系统,密码全部加密,好在.NET中已经提供了现成的MD5加密算法,调用一个简单的函数就搞定了。 1、引用命名空间 using System.Security.Authentication; 2、编写加密函数,这里就给出一个例子,估计还有很多

  • Asp.Net 密码加密技术

    asp.net 密码加密技术,主要应用与对客户的密码进行加密,保护客户信息! 首先看一下页面部分的代码<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestEncrypt._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML

  • 五种糟糕的代码实践,程序员注意避坑

    本文将向你展示五种糟糕的代码实践,它们足以让所有程序员深恶痛绝。1将变量命名变成解谜游戏图译:parseDBMXML 代指什么:A、解析 DBM XML 。B、解析 DB MXML。C、解...

  • 算法能拯救烂片吗?好莱坞正用AI决定拍什么样电影

    作者 | James Vincent译者 | Monanfei;编辑 | 琥珀出品 | AI科技大本营(id:rgznai100)电影世界充满了耐人寻味的事情。众所周知...

  • 世界五大黑客:代码创造他们,他们改变世界!

    图灵开发出一台具有划时代意义的设备,后世将其称为图灵机,其当时的功能在于破解纳米德国开发出的 Enigma 加密系统——从个人成就的角度出发,他以一己之力在第二次世界大战中拯救了无数英国民众。遗憾的是,由于...

  • Jeff Dean的传奇人生:超级工程师们拯救谷歌

    而在结构底层则存在着软件与硬件的过渡结构,在这里天马行空的代码序列开始转向由电与硅组成的实体世界。 在作战室中度过的第五天,Jeff 与 Sanjay 开始怀疑其中的问题不是出在逻辑层面,而属于物理范畴。他们将...

  • 这五种糟糕的代码实践,程序员要学会规避

    点击上方“程序猿技术大咖”,关注并选择“设为星标”回复“加群”获取入群讨论资格!作者丨Marcin Gajda译者丨马可薇策划 | 万佳来源|InfoQ本文将向你展示五种糟糕的代码...

  • 世界五大黑客:代码创造他们,他们改变世界! ...

    图灵开发出一台具有划时代意义的设备,后世将其称为图灵机,其当时的功能在于破解纳米德国开发出的 Enigma 加密系统——从个人成就的角度出发,他以一己之力在第二次世界大战中拯救了无数英国民众。遗憾的是,由于...

  • 为什么区块链不只是一场疯狂的投机把戏,而是对我们这个世界真的有意义?

    为什么区块链不只是一场疯狂的投机把戏,而是对我们这个世界真的有意义?Token 的价值在哪? 下面这场对话,可能是我读过关于区块链最好的文章之一,与大家分享一下吧. 这是一场 A16Z 的投资人 Chris Dixon 和 ...

Global site tag (gtag.js) - Google Analytics