橡皮鸭程序调试法

转自:http://write.blog.csdn.net/postedit


面,让我来为你介绍一个程序调试大法——“橡皮鸭程序调试法”,这个方法在调试界是很出众的,实施起来相当方便和简易,几乎可以随时随地地实验,几乎不需要借助任何的软件和硬件的支持,你甚至可以把你的程序打印出来,在纸面上进行调试。

那么,为什么这个方法要叫做橡皮鸭呢?因为橡皮鸭子是西方人在泡澡时最喜欢玩的一个小玩具,所以,这个东西应该家家户户都必备的。因为,这个方法由西方人发明,所以,就被取名为“橡皮鸭”了。

好了,话不多说,下面是整个调试方法的流程。

  1. 找一个橡皮鸭子。你可以去借,去偷,去抢,去买,自己制作……反正你要搞到一个橡皮鸭子。
  2. 把这个橡皮鸭子放在你跟前。标准做法是放在你的桌子上,电脑显示器边,或是键盘边,反正是你的跟前,面朝你。
  3. 然后,打开你的源代码。不管是电脑里的还是打印出来的。
  4. 对着那只橡皮鸭子,把你写下的所有代码,一行一行地,精心地,向这只橡皮鸭子解释清楚。记住,这是解释,你需要解释出你的想法,思路,观点。不然,那只能算是表述,而不是解释。
  5. 当你在向这只始终保持沉默的橡皮鸭子解释的过程中,你会发现你的想法,观点,或思路和实际的代码相偏离了,于是你也就找到了代码中的bug。
  6. 找到了BUG,一定要记得感谢一下那个橡皮鸭子哦。

什么?你觉得这个方法太“愚蠢”,太“弱智”了?是的,看上去,会这样做的人脑子好像是有点毛病。不过,我要告诉你的是,这个方法的确有效。因为,这就是“Code Review”的雏形!下面让我来给你解释一下。

Once a problem is described in sufficient detail, its solution is obvious.

上面这句话的意思是

一旦一个问题被充分地描述了他的细节,那么解决方法也是显而易见的。

我相信在座的各位都有过这样的经历,当你死活都找不到问题的原因的时候,当你寻求他人的帮助时,对别人解释整个你的想法和意图或是问题背景的时候,你自己都没有解释完,就已经找到问题的原因了。这样的经历,相信大家一定有过。这就是这个方法的意义所在。

所以,“橡皮鸭”只是一个形式,其主要目的是要你把自己写的代码做“自查”,也就是自己解释给自己听。当然,为了不让你像个“精神分裂”的程序员,引入“橡皮鸭”是很有必要的(虽然这样还是有点精神病,但比起精神分裂来说算是好的了,嘻嘻)。所以,真实的本质是Code Review。关于代码评审,大家可以看一下我的这篇文章《Code Review中的几个提示》,你会明白其中更多的东西的。

最后,我想和大家说一下道具“橡皮鸭”。是的,在我们的身边,你不一定能找得“橡皮鸭”,但你可以找到你你的同事,你的朋友,来做这个“橡皮鸭”,当然,他们并不一定有“橡皮鸭”好使,因为你的那些同事或朋友一定会在你解释的时候,随意地发表意见和看法,相当的令人annoying。《Code Review中的几个提示》和《结对编程的利与弊》也谈到了一些,供你借鉴。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

标准IO概述和操作

标准的IO: 标准的输入: 通过键盘录入数据给程序. 标准的输出: 在屏幕上显示程序数据. 在System类中有两个常量: InputStream in System.in; PrintStream out System.out; 标准流的重定向操作: 标准的输入: 通过键盘录入数据给程序. 重新指定输入的源不再是键盘,而是一个…

十条不错的编程观点

转自:http://coolshell.cn/articles/2424.html 在Stack Overflow上有这样的一个贴子《What’s your most controversial programming opinion?》,翻译成中文就是“你认为最有争议的编程观点是什么?”,不过,在400多个主…

数据结构上机实验之二分查找

题目描述 在一个递增的序列里,查找元素是否存在,若存在输出YES,不存在输出NO.输入 本题多组数据,首先输入一个数字n(n>100000),然后输入n个数,数据保证数列递增,然后再输入一个查找数字。输出 若存在输出…

IO之 Properties类加载文件

配置文件:资源文件(以.properties作为拓展名的文件)/属性文件: 做项目开发,为何使用配置文件? 把所有的数据存储在代码中,写死了,”硬编码”. 比如:在Java中需要连接数据库,必须拥有数据的账号和密码. 此时我们就得在Java代码中编写,类似的代码: String username”root”…

Makefile系列学习(博客)

http://blog.csdn.net/haoel/article/category/9198/3

数据结构实验之查找六:顺序查找

题目描述 在一个给定的无序序列里,查找与给定关键字相同的元素,若存在则输出找到的元素在序列中的位序和需要进行的比较次数,不存在则输出"No",序列位序从1到n,要求查找从最后一个元素开始,序列中无重复元素。 输入 连续多组数据输…

IO之数据流

数据流,提供了可以读/写任意数据类型的方法: DataOutputStream: 提供了 writeXxx(xxx value)方法. DataInputStream: 提供了 readXxx()方法. 注意: writeXxx和readXxx必须要对应起来, writeByte写出的数据,此时只能使用readByte读取回来.

可视化的状态机(FSM)

状态机这个概念已经在网上的博客和论坛中都已经说烂了,随便一搜都有一大堆。相关的废话就不多说了,在这里主要是分享一下如何可视化的设计状态机,如何增强项目的灵活性。这里通过一个生活中的电梯来了解一下状态机。 电梯逻辑如下图&#xf…

数据结构上机实验之顺序查找

题目描述 在一个的序列里&#xff0c;查找元素是否存在&#xff0c;若存在输出YES,不存在输出NO.输入 本题多组数据&#xff0c;首先输入一个数字n&#xff0c;然后输入n(n<1000)个数&#xff0c;然后再输入一个查找数字。输出 若存在输出YES,不存在输出NO.示例输入 4 1 3 5…

dll加载问题的解决方法

在使用LoadLibrary() 和LoadLibraryEx()加载dll文件的时候&#xff0c;会产生下面的错误&#xff1a; this application has failed to start because XXXXX.dll was not found. Re-installing the application may fix this problem. 其中xxxxx是你所调用的dll的文件名。 这类…

IO之 随机访问文件(RandomAccessFile)

随机访问文件(RandomAccessFile): 表示可以在该文件的任何位置写出和读取数据. API中文解释&#xff1a; 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引&#xff0c;称为文件指针&…

数据结构实验之排序二:交换排序

题目描述 冒泡排序和快速排序都是基于"交换"进行的排序方法&#xff0c;你的任务是对题目给定的N个&#xff08;长整型范围内的&#xff09;整数从小到大排序&#xff0c;输出用冒泡和快排对这N个数排序分别需要进行的数据交换次数。 输入 连续多组输入数据&#xff…

关于通过dll导出类模板和函数模板

动态链接库中导出模板函数 C 支持函数模板&#xff0c;利用函数模板&#xff0c;可以简化我们的程序代码。我在自己的代码中也经常用到函数模板&#xff0c;但是以前一直以为函数模板是要放到头文件中的&#xff0c;否则调用模板函数时&#xff0c;编译器会找不到函数模板的定义…

数据结构实验之排序三:bucket sort

题目描述 根据人口普查结果&#xff0c;知道目前淄博市大约500万人口&#xff0c;你的任务是帮助人口普查办公室按年龄递增的顺序输出每个年龄有多少人&#xff0c;其中不满1周岁的按0岁计算&#xff0c;1到2周岁的按1岁计算&#xff0c;依次类推&#xff0c;大于等于100岁的老…

C++模板之隐式实例化、显示实例化、隐式调用、显示调用和模板特化详解

模板的实例化指函数模板&#xff08;类模板&#xff09;生成模板函数&#xff08;模板类&#xff09;的过程。对于函数模板而言&#xff0c;模板实例化之后&#xff0c;会生成一个真正的函数。而类模板经过实例化之后&#xff0c;只是完成了类的定义&#xff0c;模板类的成员函…

交叉排序

题目描述 输入N个数&#xff0c;把所有奇数位置上的数从小到大排序&#xff0c;把偶数位置上的数从大到小排序。输入 输入的第一行是一个正整数N(2<N<100)。 第二行是N个用空格隔开的整数。输出 输出只有一行N个数&#xff0c;是按要求排序后的序列&#xff0c;用空格隔开…

c++模板显示实例化,显示具体化,隐式实例化

函数模板是C新增的一种性质&#xff0c;它允许只定义一次函数的实现&#xff0c;即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度&#xff0c;同时也便于修改&#xff08;注&#xff1a;使用模板函数并不会减少最终可执行程序的大小&#xff0c;因为在调…

IO之 管道流

管道流: 实现两个线程之间的数据交互. PipedInputStream PipedOutputStream PipedReder PipedWriter 中文API解释&#xff1a; PipedInputStream public class PipedInputStreamextends InputStream管道输入流应该连接到管道输出流&#xff1b;管道输入流提供要写入管道输出流的…

AOE网上的关键路径

题目描述 一个无环的有向图称为无环图&#xff08;Directed Acyclic Graph&#xff09;&#xff0c;简称DAG图。 AOE(Activity On Edge)网&#xff1a;顾名思义&#xff0c;用边表示活动的网&#xff0c;当然它也是DAG。与AOV不同&#xff0c;活动都表示在了边上&#xff…

IO之NIO

NIO:New IO: 从JDK1.4开始提出的,新的IO,可以把一块磁盘文件映射到内存中,我们再去读取内存中的数据. 存放在java.nio包中. Java NIO&#xff08;New IO&#xff09;是从Java 1.4版本开始引入的一个新的IO API&#xff0c;可以替代标准的Java IO API 现在主要运用于服务器中…