前年闲的蛋疼的时候,看过天津卫视的一档节目《非你莫属》,就来一堆面试者,上面几个壕。选人。记得有一期是给程序猿做的。当中有一个程序猿(好像是媛)傻不啦叽的说,哎呀,我每次DEBUG找到程序BUG的时候。最开心了。然后一个BOSS。好呀,你好可爱啊,好喜欢敲代码啊,来我这儿吧。

我认为找个BUG有啥好开心的,这不是傻不啦叽是什么。

但事实是我发现,非常多人找BUG,或者说解决程序里缺陷的问题是十分欠缺的。

为什么解决这么简单的事情程序猿会认为这么难?并且以此为乐呢?而解决BUG。或者说DEBUG的本质是什么?



DEBUG:就是找到BUG,然后把它DE了,就是DEBUG。

DEBUG的第一步,也是最重要的一步就是找到BUG。而”找“不就是”find“,而”find“不就是”search“。”search“不就是”搜索“吗?所以DEBUG本质上就是搜索,搜索的目标就是你程序中的BUG。那么你DEBUG能力的强弱,DEBUG的速度、效率、精确度。全然取决于执行于你大脑中是否有明白的搜索算法,以及你当前搜索算法的好坏。

当你明白了,相信了,DEBUG的过程只是就是在你大脑里执行一个DEBUG算法的时候,事情就变得很easy。照着你的算法做就好了。

举几个DEBUG中常见的情况:

1. 曾经和人pair写代码,解决程序里bug的时候。发现有不少人debug时喜欢。这个文件看一看,那个文件看一看。东一下。西一下。这个就是在大脑里全然没有一个明白的搜索bug的算法。

这样的情况,搞了好久,可能最后还是能解决,但仅仅能说是”笨蠢萌“。

2. 和第一个样例恰恰相反。还有还有一种方式是,我就呆呆的在那儿较劲。憋,憋,憋,憋不住了。呀。不知道哪儿有问题。这也是不正确的。

2. 在遗留系统中。某些文件,某些类的代码上千行,这个时候,出现了bug,要解决问题。有人就一行一行的看,一行一行的加断点。

最后,经过好长时间以后,最终攻克了。当然也挺好的。可是。这个过程是什么?你做的事情事实上本质上就是算法复杂度为O(N)的查找算法。这样的方法比”笨蠢萌“好一点,属于”呆萌“的阶段。由于,众所周知,仅仅要使用了二分查找。算法复杂度就能到O(logN),所以,假设你的代码是1000行。你在第500行加一个断点。看看第500行的时候有没有问题,假设有。那么就在0~500行之间找,假设没有,就在500~1000之间找。以此类推。这样。1000行的代码。理论上你的效率能够提升100倍(当然实际上没有那么夸张)。在以前的一个遗留项目里。以前有一个bug,一对pair找了两三天没照出来,我花了1~2个小时,就准确定位了问题(构建的时间比較长)。

这就是效率的提升,本质上,仅仅是採用了更好的搜索算法而已。Nothing
New。

3. 有人抱怨,debug速度慢,是由于对于一些基础的东西没有了解。

比方说,对于一个新的第三方库不熟悉等等,假设熟悉了,就能够非常快的解决这个问题,完毕debug。那么,这个场景说明了什么。说明的是当你採用了启示式算法进行搜索,而你的启示式算法的启示函数,事实上就是你对于过往的基础知识的熟悉程度。

你越熟悉。你被启示的就越快,就越能更快的找到问题。你不熟悉,就仅仅能更慢。

最理想情况下,你对全部的事情了如指掌,你能够O(1)的时间发现问题。可是。即使知识不熟悉。不能全然的阻止你去发现问题,由于你至少能够O(logN)嘛。

上面举的样例,可以说明,debug和搜索算法的关系。所以,再啰嗦总结一下,我觉得正确的debug的方式就是明白你的bug搜索算法。估算它的效率。而且运行它。

好了,我们是不是每次都要採用O(logN)的方式debug呢?我们能不能做的更好呢?

我自己是很讨厌,以及歧视,以及厌恶,以及不屑,以及恶心断点debug的方式呢,断点debug的方式在大多数时候是让程序猿变得更笨的好方法。尽管在有些时候,也不得不手工debug。

那。how to play?

非常easy,自己主动化測试,通过写单元測试。集成測试,当我们出现故障的时候,这些測试能够有助于帮助我们缩小我们搜索的范围。当然。回归啊,乱七八糟的东西我也就不说了。

DEBUG,就是搜索BUG,让后把它DE了。

脑法之中的一个 --- DEBUG与搜索算法的更多相关文章

  1. C语言之函数调用17—递归法之中的一个般函数的调用(2)

    //递归法 /* ================================================================== 题目:求F(60),当中F(n)定义例如以下: ...

  2. C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等

    C# Dictionary源码剖析 参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/ ...

  3. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  4. VC断点失败的原因之中的一个

    VC断点失败的原因之中的一个 flyfish 2014-10-23 情景 再debug状态下仅仅有一个cpp文件.命中不了断点. 提示 能够 同意源码与原始版本号不同 不採用,防止出现未知的隐患 问题 ...

  5. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...

  6. 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...

  7. 包管理器Bower使用手冊之中的一个

    包管理器Bower使用手冊之中的一个 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Bower介绍 Bower是一个适合Web应用的包管理器,它擅长 ...

  8. WP系统推广难的原因之中的一个之我见

    个人也觉得如今的Android市场几家独大,竞争太激烈.利润空间挤压太严重,有实力的厂家不如尝试剑走偏锋,在其它大佬都还没跟进的时候,把市场投向WP.先入为主,不失为良策! 话说Microsoft不开 ...

  9. zookeeper+kafka集群安装之中的一个

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cheungmine/article/details/26678877 zookeeper+kafka ...

随机推荐

  1. js中typeof的用法汇总

  2. ZeroMQ使用学习记录(转)

    ZMQ简介 ZMQ(ØMQ.ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架.它提供的套接字可以在多种协议中传输消息,如线程间.进程间.TCP.广播等.你可以 ...

  3. Java的身份证号码工具类

    /** * Copyright (C) 2009-2010 Yichuan, Fuchun All rights reserved. * Licensed to the Apache Software ...

  4. leetcode题解:Search for a Range (已排序数组范围查找)

    题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...

  5. BeagleBone Black板第四课:简单LED控制实验

    BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...

  6. EffectiveJava(15)强化对象和域的不可变性

    概念: 不可变类是其实例不能被修改的类,不可变类比可变类更加易于设计 实现和使用.它们不容易出错,而且更加安全. 优点 1.不可变对象只有创建时状态. 2.不可变对象本质上是线程安全的,它们不要求同步 ...

  7. Android JNI/NDK开发教程

    JNI/NDK开发指南:http://blog.csdn.net/xyang81/article/details/41759643

  8. Laravel服务/服务提供者/容器/契约和门面

    1.服务是什么? 服务是提供了一些功能的类,比如发送邮件,写日志. 2.Laravel服务提供者是什么? 服务提供者中指明了这个提供者可以提供哪些服务(注册服务),以及服务注册后默认调用一些方法(bo ...

  9. Laravel之控制器

    一.简介 将所有的请求处理逻辑都放在单个routes.php 中肯定是不合理的,你也许还希望使用控制器类组织管理这些行为.控制器可以将相关的 HTTP 请求封装到一个类中进行处理.通常控制器存放在ap ...

  10. Linux——vi命令的使用

    vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command m ...