二分法

作者: 杨梅泡酒 | 来源:发表于2017-04-27 23:29 被阅读293次

    解决问题的方法千万种,二分法是千万种的一半

    昨日团队遇到一个技术问题。临近八点下班时,当在测试服务器做一键构建发布时,遇到一个之前从未发生过的构建时错误。根据给出的错误提示,问题发生在将所有js脚本文件合并成一个文件时,出现了大括号不匹配。

    在js脚本中,大中小括号都是成对出现,如同汉语中的双引号一样,少了其中一个就会产生语法错误。语法错误在软件开发中算是比较低级错误,对于开发人员来说,经验越少越容易犯这个错误,不过一些技术大牛也偶尔发生。感谢一些前辈的努力,提供了不少语法检查工具,让苦逼的技术开发者可以避免或少犯这些低级错误。

    然而要是所有的低级错误都可以避免,那么软件开发行业就不会有那么多坑了,那么苦逼了,程序员也将是最好美好的职业。如同历史总是重演一样,低级错误也是不断发生,今天又让我们团队给赶上。

    项目利用git作为版本管理工具,改天一共有25个修改版本记录,每个修改版本都有不少js文件的变动。昨日的构建完全没有问题,那么这个问题在哪次版本修改中产生的呢?面对这样的情形,你如何能快速找到有问题的js文件,并定位具体的代码行/块?在继续往下读的时候,务必思考30秒,想想你自己会怎么做。

    思考30秒

    病急容易乱投医,团队心理有点着急,当时已是晚上八点,大家早已做好准备下班的心情,毕竟辛苦忙碌了一整天。大家开始纷纷根据自己对问题与错误信息的解读,发表了各自的原因猜想。是不是配置文件出了问题?是不是哪个页面文件出了问题?是不是服务器上的代码版本发生冲突?……事情往往就是这样,越着急就越难找到有效的方法来解决问题。在这么着急的混乱情形下,我跟大家说,“大家先不要着急,这个问题解决。”

    作为团队负责人,知道当时大家的心情比较着急,急着把问题解决 ,早点回家休息,况且肚子都是空的,晚饭还没有吃。如何从25次的版本提交记录定位问题呢?突然,脑海想起,这不正是一个典型的查找问题吗?

    查找,是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。

    查找是个常见的问题,实现的方法有好几种,每种方法各有自己优劣势。如果将查找算法的效率作为一道技术面试题,一些人可能要思考一些时间,然后blabla地可以说上十几分钟。现在不是做面试,不是考查写代码能力,也不是讨论理论的效率问题,而是需要立马解决眼前这个棘手的麻烦。自己想到了二分法查找算法。

    二分法查找算法,也称折半查找算法:在一组排好序的数据中查找某个数K,首先将整组数据平分为两组,根据条件判断K在两组中的哪组,然后继续在存在K的数组中做同样的二分查找,直到找到K为止。

    Git版本库是严格按照版本提交的时间来显示,符合排序数据的前提条件。那么只需要将版本从git库检出(感谢版本控制工具的发明者,尤其是git,否则作为技术狗真要苦海无边,哭死),然后一一做构建验证是否成功,便可以确定哪次修改提交的版本存在问题,然后同前一个版本比对所有修改过的js脚本,就可确定问题的代码所在位置。面对25个的修改版本,利用二分查找的算法,选取第12个版本作为起始版本来做构建验证。自己检出第十二个修改版本,构建,结果显示失败。接着检出第十一个修改版本,构建,结果仍然是失败。接着自己检出第十个版本,构建结果显示成功。那么可以肯定问题出现在第十一个版本。在比对第十一个与第十个版本的所有js文件修改变化之后,找到了具体的错误代码。最终用了九分钟的时间就解决了这个问题!如果当时没有采用二分法的思路来解决问题,从最后一个版本依次往前做检出及构建,那么需要花45分钟(每次检出与构建需要3分钟)。采用二分法足足节约了36分钟!这些时间可以看一集《人民的名义》了,虽然自己不看。

    这事让自己认识到有时方法比努力重要。有人整日讨论努力对成功的重要意义,但希望这些人也不妨也去多思考方法的重要性,我一向不太相信单纯努力就能把事做成。

    大家都知道复利的强大威力,得到上的《通往财务自由之路》的作者李笑来,对复利这个东西推崇备至,写了几篇有关的文章专门做论述。复利为什么强大?就在于初始的量十分渺小,在经过一定时间的不断递增,最后的结果超乎人的想象。1元钱,每日增长1%,按照复利计算,一年365天之后,你有37.78元!关于复利的魔力,有个经典的故事:

    有一个古老的故事,它显示了复利效果的威力。传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。国王觉得很容易就可以满足他的要求,于是就同意了。但很快国王就发现,即使将国库所有的粮食都给他,也不够百分之一。因为即使一粒麦子只有一克重,也需要数十万亿吨的麦子才够。尽管从表面上看,他的起点十分低,从一粒麦子开始,但是经过多次乘方,形成了庞大的数字。

    2的63次方是多少?答案是:

    一个超级庞大的数

    也就是第64格的小麦数量惊人,让人瞠目结舌。但倒过来看这个故事。假使要从9223372036854775808粒小麦中找到其中的一粒,需要多久?如果不讲究方法,这几乎是个不可能实现的任务。但如果采用二分法,那么这个过程是完全可操作与可控的:将小麦平均分为两堆,每堆再平分为两堆,依次进行下去,最终就可以快速找到那粒金色小麦。

    在面对大量选择时,人类天生有种二分法的思维,仿佛藏在每个人的基因中。远古时代,面对比自己强大凶猛的动物,你只有两个选择,跑还是不跑。再比如你需要购买一辆新车,面对市场上大量的品牌与车型,你可能无所适从,你会怎么做?在预算的范围内,你会快速删去一批你不喜欢的品牌与车型,之后再次进行同样的筛选,最后你总会在两款车型中犹豫与选择。在其他很多领域与情形,也都有类似的选择过程。

    人生就是一个不断二分选择的结果。正如弗洛斯特的诗歌《林中路》所描述的那样:

    黄色的树林里分出两条路,

    可惜我不能同时去涉足,

    我在那路口久久伫立,

    我向着一条路极目望去,

    直到它消失在丛林深处.

    但我却选择了另一条路,

    它荒草萋萋,十分幽寂,

    显得更诱人,更美丽;

    虽然在这两条小路上,

    很少留下旅人的足迹.

    虽然那天清晨落叶满地,

    两条路都未经脚印污染.

    啊,留下一条路等改日再见!

    但我知道路径延绵无尽头,

    恐怕我难以再回返.

    也许多少年后在某个地方,

    我将轻声叹息将往事回顾:

    一片树林里分出两条路——

    而我选择了人迹更少的一条,

    从此决定了我一生的道路.

    如果觉得此文对你有启发,请帮忙点个赞,同时分享给你的朋友们。

    无戒写作训练营三期第十五天。学号77。

    相关文章

      网友评论

        本文标题:二分法

        本文链接:https://www.haomeiwen.com/subject/vyngzttx.html