脑法之中的一个 --- DEBUG与搜索算法
前年闲的蛋疼的时候,看过天津卫视的一档节目《非你莫属》,就来一堆面试者,上面几个壕。选人。记得有一期是给程序猿做的。当中有一个程序猿(好像是媛)傻不啦叽的说,哎呀,我每次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与搜索算法的更多相关文章
- C语言之函数调用17—递归法之中的一个般函数的调用(2)
//递归法 /* ================================================================== 题目:求F(60),当中F(n)定义例如以下: ...
- C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等
C# Dictionary源码剖析 参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/ ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- VC断点失败的原因之中的一个
VC断点失败的原因之中的一个 flyfish 2014-10-23 情景 再debug状态下仅仅有一个cpp文件.命中不了断点. 提示 能够 同意源码与原始版本号不同 不採用,防止出现未知的隐患 问题 ...
- 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!
乐高Mindstorm EV3智能机器人(下面简称EV3)自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后,就吸引了全球广大机器人爱好者的眼球!E ...
- 使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之中的一个 员工管理源代码分享 在開始解说之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery ...
- 包管理器Bower使用手冊之中的一个
包管理器Bower使用手冊之中的一个 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Bower介绍 Bower是一个适合Web应用的包管理器,它擅长 ...
- WP系统推广难的原因之中的一个之我见
个人也觉得如今的Android市场几家独大,竞争太激烈.利润空间挤压太严重,有实力的厂家不如尝试剑走偏锋,在其它大佬都还没跟进的时候,把市场投向WP.先入为主,不失为良策! 话说Microsoft不开 ...
- zookeeper+kafka集群安装之中的一个
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/cheungmine/article/details/26678877 zookeeper+kafka ...
随机推荐
- ios unit test 工程选择release时候报错Undefined symbols for architecture i386
Undefined symbols for architecture i386: "_OBJC_CLASS_$_ItemReturn", referenced from: objc ...
- 设计模式之状态模式(PHP实现)
github地址:https://github.com/ZQCard/design_pattern /** * 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计 ...
- VS快捷键说明
转载:http://blog.csdn.net/tianzhaixing2013/article/details/51811608 Ctrl+E,D —-格式化全部代码 Ctrl+E,F —-格式化选 ...
- 浙大PAT考试1077~1080(2014上机复试题目)
题目地址:点击打开链接 还是太弱. . 英文太差.,, 预计要等待被虐了.. 1077 找最长的公共后缀,暴力就能够写: #include<iostream> #include<cs ...
- ElasticSearch的Rest的访问方式查询总量
由于安装ElasticSearch插件会影响ES的性能,所以会尽量减少ES的插件安装 可以通过ElasticSearch-Sql插件 然后将生成的执行参数拷贝 { "query": ...
- CentOS6.5安装ganglia3.6
参考来源: 1.http://yhz.me/blog/Install-Ganglia-On-CentOS.html 2.http://blog.csdn.net/sdlyjzh/article/det ...
- MVC EasyUI 时间格式化
用 return Json(dr, JsonRequestBehavior.AllowGet); 会返回一个json 数据格式,在用 EasyUI 输出表格内容时会遇到时间输出不是我们想要的格式, ...
- SELinux的Docker安全性
原文译自:http://opensource.com/business/14/7/docker-security-selinux 这篇文章基于我今年在DockerCon一个讲座,它将讨论我们当前听到的 ...
- 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-3 读写注册表
读写注册表和读写文件一样,里面涉及的输入类型比较复杂,需要参考官方范例 sSubKey是指注册表的路径 sValName是指注册表要写入的名值对的名称 eValType是一个枚举类型(而且不是什么常规 ...
- Effective C++ Item 25 考虑写出一个不抛异常的swap函数
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛 ...