清明节放假前工作最后一天,协助同事解决了一个BUG,这个BUG对于所属的程序而言,可以说不是痛不痒,完全不影响使用,只是看起来有点变扭而已。然而, 对我而言, 解决这个问题的思路却是比较有代表性的,颇有一种曲线救国的味道。

事情大概是这个样子的。有需求部门反应,我们部门负责的某个项目的页面上数据显示有问题。有10条数据,每页显示4条,那么正常情况下第1页应该显示4条,第2页4条,第3页2条。因为某一处代码抽风,现在数据被显示成了第1页4条,第2页3条,第3页3条。尽管不是什么大问题,但是我们写代码做产品向来秉承着精益求精的作风,只要是个问题, 就算再小,也要修正。然后, 一帮程序员手忙脚乱的想抓住这个BUG消灭之。为什么是一帮程序员?修个BUG用的着这么大动干戈吗?大家有所不知, 因为这个BUG的当事人是一位萌妹子,大家帮忙出主意修BUG是不假,但是去揩个油那也是真的。一阵忙活之后, 问题出在哪里是找到了,却没法子下手改。因为这个项目依赖一个第三方分页显示插件,程序本身的逻辑没有问题,问题出在这个插件里面。去修改这个第三方插件的BUG显然不太现实,靠谱的解决方法就是把这个插件给换了,但是项目的代码跟交互和这个插件结合的非常紧密, 哪能说换就换,再说当时已经是晚上七点了,这一搞非得到凌晨不可,因此,大家都像泄了气的皮球,无可奈何,这都放假了还出这档子事,明天还要去给祖宗上坟呢,加班和对先人不敬,到底应该选哪个呢?心塞塞呀!

本来这种闲事我是不太喜欢管的,但是因为这个妹子明天必需要回家,车票买好了, 所以要把这个问题解决就必须在今天晚上, 让一个妹子加班到凌晨,我有些于心不忍, 一个如花似玉的小姑娘, 半夜一个人回家, 要是碰到坏人, 场面不敢想象。 于是我也上前去凑热闹了,说不定能帮上忙呢。

了解了问题来龙去脉后,发现这个问题在自己的技术认知范围内的确没有靠谱的解决方案,除非修复插件BUG或将插件替换,但是这两种方案都不是短时间内可以完成的。我闭上眼睛思考,既然是个BUG ,那肯定不是必现的,如果不去触发这个BUG ,那也算是把问题解决了。我脑子中灵光一闪,似乎抓到了一丝线索。我开始调式程序,总共10条数据

设为每页显示4条,显示结果为4条3条3条

设为每页显示3条,显示结果为3条3条2条2条

设为每页显示2条,显示结果为2条2条2条2条2条,一切正常, 没有触发BUG

我找到了规律,不触发BUG的情况是数据总条数必须能被每一页显示条数整除,这也就意味着,每页4条不能变,那只要把数据总条数变为12就可以。为验证我猜想, 我在原有的基础上加了2条数据, 测试运行, 原来的BUG消失了, 分页显示变的正常了。找到解决方案,接下来的事情就简单了, 只要让数据总数保持为4的倍数,再加上一些收尾的工作,问题完美解决, 整个过程花了不到10分钟的时间。

插件的BUG还在那里,根本没有被修复,但是用户反馈的问题却修好了,能用的舒服,程序员也不用加班了,两全其美。事后我仔细思考,我没应用什么别人不会的高大上技术,只是转变了一下思路,就轻松巧妙的将问题解决了,很有一种四两拨千斤的感觉。那是不是也可以把这种解决问题的思路推广到其它方面呢?

回忆过去,我以前也经常以这种思路在解决问题,只是过程与成果并没有显得非常的尖锐和突出。

之前,我的一个网站被恶意攻击者注入垃圾信息,整个网站满屏不堪入目的内容。我迫切需要解决这个问题,但网站的源代码在家中电脑上,我没有办法通过修改程序漏洞解决问题。现在手头唯一拥有的是数据库操作权限,但是把数据删了,恶意程序立马又注入新的,治标不治本啊。正愁眉不展间, 脑中灵光一闪, 方案出来了, 我可以在那个被注入表上加一个before触发器, 触发器的程序检测被写入的记录, 假如是来自恶意攻击的数据,就执行回滚操作,不让数据写入表中。花了十分钟写了十几行SQL,问题解决。程序的BUG还在那里,注入者的机器人程序还在不停的攻击,但是管他呢,我的最终目的达到,用什么方法根本不重要。邓爷爷都说过:能抓老鼠的就是好猫

还有一次,碰到一个不靠谱的需求,需求方发给我一个网站,说对这个网站不满意,让我改上面的功能。网站源代码没有,网站服务器权限没有,总之是什么都没有,完完全全是一个别人家的网站,让我改上面的功能,这尼玛任性的可不是一点点,真把程序员当神仙了。换作别人,估计一巴掌就把需求给搧回去了。但偏偏是我,真就把这个问题给解决。你们是不是以为我把人家网站的服务器给黑了,把代码down下来,改成自己想要的样子。当然不是,我是一个法律意识很强的程序员,不会干这种蠢事。我的做法是为那个网站开发一个chrome浏览器插件,插件里面有想要的功能。只要用户装上这个插件,每当访问这个网站,插件功能就被激活,供用户使用。可以把这个插件想象成游戏的外挂,只是功能没那么复杂。

上面讲的这些便是软件开发中湾道超车,曲线救国的做法。我对于程序开发理解是,写程序就是解决问题,问题摆在那里,不哭不闹不动不跳,因为在我眼里它就是死的。而解决问题的方法却是活的,只要愿意去发掘,就会有无数种, 而且这无数种方法中,优劣好差各不相同,程序员要做的就是在这么多方法中选择一种最合适的。通常情况的问题,程序员并不用为选哪一种方法而纠结,因数解决问题的方法就像电梯里的美女,一眼就能看的到,连选的力气都能省掉。然而, 在极端情况下, 解决问的方法匮乏, 而且都是歪瓜裂枣, 要找到合适的真的不容易 。在这种情况下,光靠脑子灵活眼光独到还不够,程序员需要能在这些烂方法中找到一种最好的,然后驾驭之。会找好方法和驾驭这个被找到的方法,这是两种能力,相互依赖,相辅相成,如能掌握并融会贯通,那么程序员的战斗力将会被发挥到极至。

我自己也在一直朝这个方向努力,所以我解决问题的指导方针是,用php不行我用java,用nodejs不行我用go;用电脑网页不行我用windows客户端,用手机网页不行我用手机原生应用;目标是解决问题,至于解决问题用什么方法,我从来不会被某一种技术给绑死。很多同学认为, 学这么多语言这么多技术有什么用, 有的语言技术已经如万能仙丹一般, 没有什么问题不能解决的, 如Java。 然而, 我觉得掌握多种技术带来的好处并不仅仅是掌握技术的本身, 更重要的好处在于解决问题时不会受到局限,说的直白一点就是会有更多的方案可供选择,可供选择的方法多了,那自然就有更大的可能选择一种更好的方案,这便是前面说的两种能力中寻找方法的能力。然而,光会寻找方法还不够,还需要能驾驭这种方法,这便是一个深度问题了,想必所有程序员都知道,浮于表面的学习某样技术,意义不大,打嘴炮吹牛逼的程序员会被人看不起,只有真正能解决问题的程序员才值得尊敬。因此,如能做到这两点,你解决问的方法在别人眼里就是神奇的不可思议。

最重要的是,这种方式持续久了,解决问题的思维习惯就会发生变化,思维习惯的变化致使考虑问题的方式变的不同,考虑问题的方式变的不同致使解决问的方法变的不同,解决问题的方法变的不同致使解决问题得到效果变的不同。从此, 你便是别的程序员眼中的超人。

代码BUG之曲线救国相关推荐

  1. AI一分钟|阿里云解释故障原因:触发了一个未知代码Bug;清华蝉联ISC18超算竞赛总冠军...

     ▌阿里云发说明解释昨日故障原因:触发了一个未知代码Bug 今日凌晨,阿里云官方微博针对昨日出现的大规模故障问题作出官方回应.声明称,在运维上的一个操作失误,导致一些客户访问阿里云官网控制台和使用 ...

  2. Nature论文爆出千行Python代码Bug,或影响百篇学术论文

    你的论文借鉴了 Nature 文章的代码?对不起,论文可能要重新写了. 在 10 月 8 日发表于<ACS Publication>期刊的一篇论文中,来自夏威夷大学的 Jayanti Bh ...

  3. 因合约代码Bug,约2.2亿元11539枚以太币被永久锁定

    上周五,一个叫AkuDreams的3D动画NFT项目在荷兰拍卖会上遭遇了Bug惨案,因智能合约代码bug,投标者的 11539.5 枚以太币被永久锁定,且无法退款.该加密货币价值 3400 万美元,约 ...

  4. 代码 bug 嗅探器:Sanitizer

    代码 bug 总在不经意间出现,导演了一出出 crash 的悲剧.为了扼杀 bug 于襁褓之中,本文介绍的主角 Sanitize 挺身而出,致力于解决内存泄露.缓冲区溢出和未定义行为. 本文将从原理来 ...

  5. 自动检索、修复Python代码bug,微软推出DeepDebug

    视学算法报道 机器之心编辑部 还在为不断的 debug 代码烦恼吗? 本地化 Bug 并修复程序是软件开发过程中的重要任务.在本篇论文中,来自微软 Cloud+AI 部门的研究者介绍了 DeepDeb ...

  6. 使用了这个神器,让我的代码bug少了一半

    最近一段时间,我们团队在生产环境出现了几次线上问题,有部分比较严重,直接影响用户功能的使用,惹得领导不高兴了,让我想办法提升代码质量,这时候项目工程代码质量检测神器--SonarQube,出现在我们的 ...

  7. 我用Transformer修复代码bug

    来源:机器之心 本文约3900字,建议阅读7分钟 本文介绍了一种预训练模型transformer进行自动debug的方法. 本地化 Bug 并修复程序是软件开发过程中的重要任务.在本篇论文中,来自微软 ...

  8. Java并发编程实战 代码bug,Java并发编程实战(1)- 并发程序的bug源头

    概述 并发编程一般属于编程进阶部分的知识,它会涉及到很多底层知识,包括操作系统. 编写正确的并发程序是一件很困难的事情,由并发导致的bug,有时很难排查或者重现,这需要我们理解并发的本质,深入分析Bu ...

  9. 修过的一个android framework原生系统代码bug

    "坑"描述: 在对我们自己研发的一款android终端进行camera拍照压力测试时,发现当拍照张数达到几万张时,查看内存占用情况,发现内存泄露. 填"坑": ...

最新文章

  1. 各互联网大厂办公室恋情政策盘点:最不能碰的部门竟是HR!
  2. 共享windows目录给vm linux,将windows中的文件夹共享给Linux虚拟机
  3. win10 HADOOP_HOME and hadoop.home.dir are unset
  4. 新手使用vue-router传参时注意事项
  5. DNS(三)--子域授权和视图
  6. [剑指offer]面试题第[67]题[Leetcode][JAVA][第8题] 字符串转换整数 (atoi)[字符串]
  7. 如何用c语言倒序输出字母,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  8. 华为张熙伟:鲲鹏计算产业已汇聚30万开发者
  9. MyCat分布式数据库集群架构工作笔记0010---高可用_Mycat主--从复制配置下
  10. 不同浏览器对URL最大长度的限制(转)
  11. 一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
  12. 软件项目管理EAC、ETC的计算
  13. cisco 路由器 ADSL拨号上网配置
  14. Android中控件设置英文文本内容时区分大小写
  15. 双十一淘宝抢购脚本,seleium模块
  16. JVM调优-GC基本原理和调优关键分析
  17. U盘 如何自定义U盘图标并彻底隐藏配置文件
  18. React类式组件基础内容补充
  19. 工作中可能会使用到的数据结构和算法
  20. Android-四大天王

热门文章

  1. python爬楼梯问题_爬楼梯算法的数学思路
  2. Zip4j 压缩包加密压缩与解压
  3. MFC鼠标绘制直线段并使用编码裁剪算法
  4. [附源码]java毕业设计图书借阅系统
  5. 字节校园精选 66 道高频经典笔面试题(含多种思路)(上)
  6. 初学者的R markdown设置
  7. 伤疤好了有黑印怎么办_疤痕留下黑印怎么办 不妨试试这四种方法
  8. 2021年想转行产品经理,应该如何入门?
  9. 计算机考研英语一和英语二的区别,考研英语一和英语二的区别,考研党知道了吗?...
  10. 12月份参加工作的年假怎么休_请问我的年假可以在12月份休吗?单位说可以12月1日就不用上班了,我可以上到12月28日吗?...