脑法之中的一个 --- 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 字体类型设置 倾斜加粗等
后面加-Bold就是加粗 加-Oblique就是倾斜等 还有不懂请看http://iosfonts.com/ iPhone 5.0 iPad 5.0 Font Families: 58 Font Fa ...
- Sync 攻击原理及防范技术
据统计,在所有黑客攻击事件中,SYN攻击是最常见又最容易被利用的一种攻击手法.相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SY ...
- SpringBoot 框架整合webservice
spring boot集成web service框架 题记: 本篇博客讲的spring boot如何集成 spring web service,如果您想用Apache CXF集成,那么可能不适合您.为 ...
- osg节点统计方法(点数 面数) 【转】
void statusNode(osg::ref_ptr<osg::Node> node,int& verNum,int& faceNum){ osg::ref_ptr&l ...
- python读写文件write和flush
打开文件用open,该函数创建一个文件对象,这将用来调用与之关联的其他支持方式. file object = open(file_name [, access_mode][, buffering]) ...
- asp.net自制分页页码条控件
用过微软的服务器控件分页的人都知道~那卡的一A啊~ 遂想自制分页页码条控件以备不时之需. 走你~ public static class PageShow { /// <summary> ...
- [ElasticSearch]Java API 之 词条查询(Term Level Query)
1. 词条查询(Term Query) 词条查询是ElasticSearch的一个简单查询.它仅匹配在给定字段中含有该词条的文档,而且是确切的.未经分析的词条.term 查询 会查找我们设定的准确值 ...
- JavaScript 判断浏览器及版本
/* 智能机浏览器版本信息: alert("语言版本: "+browser.language); alert(" 是否为移动终端: "+browser.vers ...
- UITextView 设置边框
UITextView * txtView = [[UITextView alloc] initWithFrame:CGRectMake(10, 50, 200, 50)]; txtVi ...
- ClassLibary和WPF User Control LIbary和WPF Custom Control Libary的异同
说来惭愧,接触WPF这么长时间了,今天在写自定义控件时遇到一个问题:运行界面中并没有显示自定义控件,经调试发现原来没有加载Themes中的Generic.xaml. 可是为什么在其他solution中 ...