阅读更多

7顶
0踩

非技术

原创新闻 怎么减少编程中的 bug?

2016-02-18 10:51 by 副主编 mengyidan1988 评论(0) 有5854人浏览
为什么要编程?因为代码没在那里。创造一个世界是如此让人着迷,Linux 的创始者 Linus 这样表述对编程的喜爱之情:
引用

对于喜爱编程的人来说,编程是世界上最有趣的事,比下棋有趣得多!因为你可以自己制订游戏规则,而你制定什么样的规则,也就会随之出现与此规则相符合的结果。

在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。

你可以建筑一个这样的房子,有一个活板门,既稳固又实用。但是每个人都可以看出一个仅仅以坚固实用为目的的树上小屋和一个巧妙地利用树本身特点的美妙小屋之间的差异。这是一个将艺术和工程融为一体的工作。编程与造树上小屋有相似之外……

每个热爱编程的人都在编写代码的过程中享受着创造的乐趣,但是,伴随着编码的快感,bug 总是如影随形,开发无止境,bug 随身行。bug 是每个程序员没法绕开的障碍,它们就在那里,修复一个,增加一个,似乎永不减少,永远存在。


遭遇 bug 的时候,理性的程序员会说:这个 bug 能复现吗?
自负型:这不可能,在我这是好好的。
经验型:不应该,以前怎么没问题?
幻想型:可能是数据有问题。
无辜型:我好几个星期都没碰这块代码了!
乐观型:只需要改一行代码,不会影响其它程序的。
实践型:你重启一下服务试试。

无论你是哪种类型的程序员,遭遇 bug,内心都是崩溃的,尤其是产品经理或测试人员在使用或测试产品的过程中抓到你的一个 bug 之后那种如获至宝的表情和欢呼声,会让我们的心情久久不能平静。于情于理,防患于未然,减少编程中的 bug,对产品和程序员,都是最好的结果。

能不能一次编写出没有 bug 的程序呢?一般来说,并不能,除非你写一辈子 Hello World。我见过一些天才的程序员,他们差不多能做到这一点。接到任务之后,思考,冥想,在笔记本上画出数据结构或某个算法片段,腹稿打的差不多了就开始编程,用 Vim、Emacs 或 IDE 工具,大部分时候能够一气呵成,然后构建代码,构造测试数据,运行程序,在反复调试中修复几个编程过程中没有考虑到的问题,就可以提交到代码库了。他们的代码交给测试和其他开发者,少有人能挑出 bug,因为他们对代码有敏锐的感觉,能够在别人忽略的地方发现代码的坏味道,并给出巧妙而优雅的解决方案。他们是天生的代码创造者,这样的人往往效率高而且少有错误,以至于会被一些平庸的团队忽略,因为技术领导总是会下意识的去关注那些最容易出事的环节,但这些人才是团队真正的脊梁,不是那些四处救火者。如果你拥有这样的程序员,就算捡到宝贝了,要好好珍惜。

我不是天才的程序员,但在年轻时大量产出代码的时候,差不多也能做到类似的效果。没什么好的办法,只能下笨功夫,我会在编码之前尽可能把所有的可能性都想清楚,然后认真做好设计。我常常在工作时间完成代码的编写,下班后带着笔记本回家逐行 Review 自己的代码,对着设计图检查是否处理了各种异常和边界条件,并先于测试人员对自己的代码进行白盒测试和黑盒测试。另外,在编程方面我奉行不要在同一个地方摔倒两次的原则,每次自己程序出现的 bug 案例,我都会记录到 bug 库里,检查代码的时候逐一对照,确保不会犯重复的错误。

可能年轻的时候自尊心比较强,我难以忍受自己的程序被别人找出 bug,于是偷偷花费了两倍的时间来保证代码的质量,以至于团队的人认为我一次就能编写出高质量的代码。现在看来,我当时是个错觉制造者。

所以,减少 bug 的第一步,是提升自己的程序员素养,努力不给自己和别人找麻烦。

另外,团队协作也很重要,前期的技术方案和设计评审、代码审查,对减少一些重大的错误和弱智的 bug 都非常有好处。

与几个有经验的程序员一起评审一个技术方案,常常会发现一些重大的问题,比如为什么用缓存,为什么做持久化,高并发下怎么应对,这部分设计支持线程重入吗,这个循环为什么设置成10分钟,这个超时设置为什么是60秒,传输协议加密了吗,等等。很多方案可能会仅限于解决当前的问题,但有经验的程序员却能透过时间的重重迷雾,发现这个方案在未来某个时间点可能爆发的问题。这就是评审的力量。

技术方案和设计评审一般是先于代码的,开始编写代码了,Code Review(代码审查)就可以提上议事日程了。国内很多团队的技术人员内心是抵触代码审查的,他们常常想,在这个国家我们已经被审查的够多了,就不要再自己审查自己了,然后很多 bug 就产生了。

我和 Google、Facebook、Twitter、Airbnb 的中国工程师讨论过 Code Review,他们觉得没有代码审查是不可思议的。在这些公司的研发流程里,Code Review 是必不可少的一个环节,只有别人帮你做了 Code Review 并在代码上「打了戳」,你的代码才能进入 Code Base。在 Facebook,如果你 Review 了别人的代码,如果那个人休假了,你就要接手他的代码,出了任何问题都要唯你是问。

事实上,Code Review 才是真正的白盒测试,没有经过代码审查,仅凭测试很难保证代码质量。测试通过了但没有经过代码审查的代码仍然会出各种问题,这样的案例比比皆是。只有当另外一个人读了你的代码,并且表明能看懂时,这些代码才有真正有了鲜活的意义。代码审查的意义就是,在你的代码库合进代码库之前,至少有一个人读过你的代码。

很多人在做代码审查之前会调研大量的代码审查工具,就像一个人在跑步之前,要先准备好跑鞋、袜子、压缩裤、压缩上衣、鼻贴、眼镜、口罩、导汗带、魔术头巾、各种手表、冷却喷雾、肌内效贴布……然后一个月过去了,你问他跑了几次,他会很扭捏的告诉你,髌骨带还没有到!

没有工具一样可以做代码审查,你只需要偏转身体,在另一个程序员不忙的时候拍拍他的肩膀说,「来,看看我的代码,你能看懂吗?我准备把它们提交到代码库里」。然后阐述你的思路,倾听他的建议,并根据这次讨论的结果决定,是修改一下,还是继续提交到代码库。

不要小看这短短的20分钟,它可能会帮你避免的一些隐藏的和弱智的 bug。

很多团队都是因为代码审查过程或工具过于复杂放弃了Code Review,典型的因噎废食,其实使用 less、diff 和 git 等工具,基本上就可以做一次完整的代码审查了。如果你过于依赖工具和过程,那说明你并没有抓住问题的核心。

写了这么多,如何减少编程中的 bug 呢?不难,也不容易。对内,努力提高自己的程序员素养,不去浪费自己和别人的时间。对外,重视团队协作,进行方案评审和代码审查。做到这两点,你会发现,代码中的 bug 会越来越少的。

没有 bug 的代码,才是好代码!

本文来自:池建强的博客
7
0
评论 共 0 条 请登录后发表评论

发表评论

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

相关推荐

  • 数据库操作简易工具

    该工具可以用于打开SQLSERVER、MYSQL等数据库,而不用安装SQLSERVER自带的编辑器工具

  • Mysql数据库基本操作与简单管理

    char如果存入数据的实际长度比指定长度要小,会补空格至指定长度,如果存入的数据的实际长度大于指定长度,低版本会被截取高版本会报错。设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库存的是123.456,但总个数还以实际为准,即6位。例如decimal(8,4)总共能存8位数字,末尾4位是小数,字段最大是9999.9999(小数点不算在长度内)格式:decimal(m,d)表示最多m位数字,其中d个小数,小数点不在长度内。m总个数,d是小数位。m是总个数,d是小数位。

  • 常见的数据库操作

    1.查看当前 DMBS 中有哪些数据库show databases; (首先进入数据库)2.查看当前数据库中有哪些表 show tables;3.查看表的结构(信息)describe 表名;如:describe orders;1.创建数据库create database 数据库名; create database test;2.删除数据库drop database 数据库名; drop database db;3.使用数据库use 数据库名; use test;1.创建表create table 表名(

  • 数据库基本操作大全

    一 数据库的实体完整性,参照完整性,自定义完整性 二 Mysql 的端口为3306 SQL语句不区分大小写。通常我们遵循关键字大写,表名的首字母大写,其余的列名等小写的习惯。 三 数据库 1创建数据库 create DATABASE 数据库名 create DATABASE IF NOT EXISTS 数据库名 SET PASSWORD FOR'root'@'localhost'= PASSWORD('123456'); 修改密码 select user,ho...

  • C#操作数据库简介

    如果一门程序设计语言不支持数据库操作的话,其很难在现在的世界中存活下来。 C#语言提供了丰富的数据库操作类库,极大地方便了对数据库的操作。在C#中,常用的有三种 访问数据库的模式分别为:SqlClient模式、OleDb模式和Odbc模式。其中SqlClient模式是微软老大哥专门为其产品Sql Server数据库而设计的,所以如果欲使用Sql Server数据库开发应用程序的话,建议使用这种模

  • 数据库增删改的简单操作

    数据库 我的上一篇Blog简单列举了几种查询的方式方法等,写的很没有思路我觉得我需要重新梳理一下思路跟大家讨论下数据库 数据库的操作归根结底是增删改查的操作 那么再操作增删改查之前肯定的是我们需要有一个数据库供我们去操作,而且有相关的环境。我最早的那篇blog有关于mysql的软件下载并且没有积分要求需要的朋友可以移步https://blog.csdn.net/weixin_41950282...

  • 数据库的基本操作全集

    数据库 常见数据库: 数据库管理系统(DBMS)是为管理数据库而设计的计算机软件系统,一般具有存储、截取、安全保障、备份等基础功能,目前主流的数据库管理系统有:Oracle、MySQL、SQL Server、DB2和Sybase。 一、Oracle Oracle数据库是甲骨文公司推出的一款关系数据库管理系统,是当前数据库领域最有名、应用最广泛的数据库管理系统之一,Oracle产品覆盖了大、中、小型...

  • 简单数据库操作

    1.查询 SELECT 字段名 FROM 表名 SELECT 字段名 FROME 表名 WHERE ... 2.插入 INSERT INTO 表名 (局部字段) VALUES 值 INSERT INTO 表名 VALUES (全部字段) 3.删除 DELETE (FROM) 表名 WHERE ... 4.修改 UPDATE 表名 SET 字段1=数值1,字

  • 数据库数据的简单操作

    总的来说就是插入(INSERT)、修改(UPDATE)和删除(DELETE)这3个基本的DML命令的使用。

  • 数据库简单操作

    一.SQL语言组成部分 数据控制语言(DCL):进行安全管理 GRANT: 授权 REVOKE: 回收权限(不影响回收用户从其他用户获取权限 DENY: 回收权限(功能与REVOKE相似,不同之处在于收回权限以后还禁止从其他用户处申请权限) 数据定义语言(DDL):执行数据库任务 GREAT:创建数据库或者数据库对象 ALTER:对数据库或者数据库对象进行修改 DROP:删除数据库或者数据库对象 数据操作语言(DML):操作数据库中的对象 seclect: 从表或者视图中检索数据 insert: 向

  • 最简单的商品模块数据库设计

    不同的商品有不同的属性,这应该是刚开始开发商城系统的首要问题,如何设计产品模块是关键,我天资愚钝,没法看懂百度上很多大神的设计,所以自创了一种很拙劣的设计,但勉强还能用,在此记录下来 1.商品表(goods)\ gooId(商品编号) gooName(商品名称) gooPrice(价格) typeId(商品类型编号,也就是属于哪种类型的商品) 。。。。(基本的商品属性。省略) 2

  • MySQL数据库的简单操作

    1、启动数据库:net start mysql2、登陆数据库  mysql [-h主机地址(客户端和服务器在同一台机器上,因此输入localhost或IP地址127.0.0.1都可以,如果本地登陆可以省略登此参数)] -u用户名(一般为是root) -p密码3、查看所有数据库:show databases;4、使用某数据库:use 数据库名;5、创建数据库(如果没有重名数据库存在):create ...

  • 数据库基本操作

    一、数据库基本操作 1.数据库的基本操作 -- 1.数据库的基本操作 使用test数据库 USE test; -- 查看当前test数据库中所有表 MySQL命令 SHOW TABLES; -- 查表的基本信息 SHOW CREATE TABLE student; -- -- 查看表的字段信息 desc student; 2.数据表的基本操作 -- 2.数据表的基本操作 -- 创建学生数据表 CREATE TABLE student( id int, name VARCHAR(2

  • 简单的数据库指令及操作

    进入数据库:mysql -u root -p mysql服务的启动与关闭: 在root权限下: 启动 service mysqld start 关闭 service mysqld start 1.create database xxx;创建数据库 2.show database;显示数据库 3.use xxx;使用xxx库 4.show tables;显示当前库中的表 5....

  • 数据库-简单操作

    插入数据 格式:insert into 表名(字段1,字段2,..字段n)values(值1,值2,..值n); 1.在指定的字段插入数据 例如:insert into member(id,regname,pwd) values(1,'jury','123456'); 2.默认在所有字段插入数据(不指定具体字段) 例如:insert into member values(1,'mary'...

  • 数据库的简单操作

    一,数据库 二,数据库的表,列,字段,数据之间的联系 三,数据库增、删、查、改的简单操作 一,数据库(电子化的文件柜/Data) 数据库“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 二,数据库的表,列,字段,数据之间的联系 表:记录的组合 表示同一类事物的组合。(表是数据库最基本的对象,用于存储用户数据,关系数据库的所有操作最终都是围绕数据表运行的) 字段:某一个事物的一个特征,或者说是属性。 列:大部分情况下,列和字段是相

Global site tag (gtag.js) - Google Analytics