前年闲的蛋疼的时候,看过天津卫视的一档节目《非你莫属》,就来一堆面试者,上面几个壕。选人。记得有一期是给程序猿做的。当中有一个程序猿(好像是媛)傻不啦叽的说,哎呀,我每次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. hdu1013(C++)

    9的余数定理:一个数各位数字的总和除以9的余数与它本身除以9的余数同等 大数问题:防止大数,用字符串来存入数据,再转化为数字 #include<iostream>#include<s ...

  2. wireshark问题现象分析

    讲的非常透彻:建议学习 wireshark问题现象分析1:参考博客1 https://blog.csdn.net/u012398362/article/details/52276067 wiresha ...

  3. ARCGIS FLEX API加载google地图、百度地图、天地图(转)

    http://www.cnblogs.com/chenyuming507950417/ Flex加载google地图.百度地图以及天地图作底图 一  Flex加载Google地图作底图 (1)帮助类G ...

  4. ICA (独立成分分析)

    介绍 独立成分分析(ICA,Independent Component Correlation Algorithm)简介 X=AS X为n维观测信号矢量,S为独立的m(m<=n)维未知源信号矢量 ...

  5. java 通过流的方式读取本地图片并显示在jsp 页面上(类型以jpg、png等结尾的图片)

    Java代码: File filePic = new File(path+"1-ab1.png"); if(filePic.exists()){ FileInputStream i ...

  6. 【Hadoop】Hadoop mr wordcount基础

    1.基本概念 2.Mapper package com.ares.hadoop.mr.wordcount; import java.io.IOException; import java.util.S ...

  7. zabbix分组报警

    生产上需要在出现报警情况下,不同的主机发送报警给不同的用户 下面实例为分组为dev(开发组)和ops(运维组) 1.把主机进行分组 创建主机群组 配置-->主机群组-->创建主机群组,创建 ...

  8. 测试用例 自动生成工具PICT与AllPairs

    通常我们在设计或编写测试用例时,存在一个"痛点":要么设计的测试用例存在遗漏,难以100%覆盖测试需求:要么被测系统过于复杂,设计的测试用例过多,导致前期的设计和后续的执行工作量过 ...

  9. 关于websocket和ajax无刷新

    HTTP无状态: Ajax只能实现用户和服务器单方面响应(单工机制). 如果设置为长轮询(ajax设置多少秒进行一次请求,时间间隙可能会有延迟,且浪费资源) 如果设置为长连接(客户端请求一次,服务器保 ...

  10. Rosbridge 的使用

      参考文献: http://rosclub.cn/post-569.html ROS与Android的窃窃私语   1.简介 ROSbridge 顾名思义,是一个ROS当中的中间件,ROS 桥,是用 ...