突然想写个关于 debug 的文章,来纪念我2天前被自己坑的蠢事……

  前两天,项目的四期送去电科院审查了。因为一些不可描述的原因,我很不喜欢四期。做起来就很烦~临近验收,发现了个比较严重的bug,记录里有 附件 的记录保存后再查看都会导致记录无法查看。下午我在那边找了2小时,也没定位到问题具体在哪边。最后只想着要把附件这个属性隐藏掉,不给别人选了。后来晚上去吃个饭,回来扫了眼控制台,突然发现了问题所在。原来附件里 .xxx 的小数点被过滤器给拦截了。于是很快就改好了问题,然而却要等待升级,然后就通宵了,遭了波重。

  想起培训时,看起来有点虚胖,脸色有点苍白,永远很乐观的讲师会一再的和我们强调,debug 能力将会是伴随程序员整个职业生涯的法宝。到了项目里就是干活的,没人会给你安上 “新人”的角色,什么新人不新人的都是你们自己以为的。到时陌生的框架与业务逻辑要怎么看?全靠 debug。

  记得培训时,MVC之间的逻辑,从前台走到后台,对于初次接触的人来说简直难到飞起来了。听了2天课也不是很懂。于是周末在家 debug,看数据在内存走来走去了2天。再去上课,突然就感觉自己懂了不少。debug 代码的过程,就好比抄书一样,并不是不 debug 时就看不懂代码了。而是 debug 时人会更专注的去看代码,不知不觉之间就会理解代码的意思。

  那时,我以为我懂debug了,不就是三个层嘛,不是这层出错了就是那层出错了,太简单了!

  然而那时写的项目是在太简单了,简单到起个服务,我那电脑最多几十秒就起来了。然而进了项目,仅我们组我负责的模块,起个项目就至少10来分钟了。量一大了,就突然间不会 debug 了,感觉自己像个无头苍蝇一般。

  那时,我debug时不喜欢进 debug 窗口,项目经理常常喷我,诶,你不进这个窗口你怎么看呀?什么什么的……那时我说,进了这个窗口,代码的窗口太小了,看得不爽。

  然而现在我也爱上了debug视图。很有用,下方控制台会打印信息,左边的视图可以清楚的看到变量在每一行有什么变动的视图,上面可以控制断点……

  我的同事,和我一样也是培训班出生。可能这就是蛇鼠一窝?然而他们的只有3个半月,说是老师上课根本没教过 debug 怎么用,java就用syso,前台就用alert 来打断点……想想还是有点坑的,不过他们的机构也是能把自己的学员都硬给推走,给个入门的渠道,也算是,还剩点良心吧!

  培训时没有学过debug的结果就是,把那会欠下的学习加班补回来。其中一人在学校时就自学过,培训时也是他们班学的挺好的,适应起来还好。另一人就惨了,本来就不怎么会,只能硬着头皮学……

  公司是以赚钱为目标的,资本是压榨每个最大的劳动力。每个人都会很忙,没有人有太多空闲的时间去教你怎么用一个东西的。顶多授之以鱼,帮你一时,而这也是种情分。若是别人不帮你呢?也没什么怨言。

  我来时,正是项目最后一个老员工待的最后一周,他把版本交接给了我对面那人。然而却是我和另一人一人一半接过整个项目。业务什么都不懂,技术吧,学的就那样。6个月,顶多是能干活。那能怎么办呢~公司雇人来就是解决问题的。

  就 debug 一点一点理解业务逻辑。刚来的第一个版本,问题狂报,我们组还上了个安全代码。前台加密后台解密,搞得好多地方漏加密或是多解密。模块摊掉了就。没办法,只能硬解决,一步一步跟着代码走,看看变量传到后台时是什么样的,发现是加密后的,然后在后台加一层解密。有时被加了两层密,就搜前台……

  之后,现场的电话也给我打起来了,长这么大,第一次被人叫 X工 的称呼。工人吗……其实确实和上世纪纺织厂的工人没什么区别。只是多了点改变世界的妄想,可能看那句叫 “write code,change world” 的标语看多了,产生错觉了吧!

  有段时间,很怕手机响起。因为一响就意味着现场报问题了。一直都怕打电话,感觉打起电话说话很尴尬。这几个月下来已经不怕了。

  再过段时间,开始试着解决现场报过来的问题。让他们把日志发过来,我就看……发现其实和控制台报的信息一模一样。记得有个问题看了,当时看了没看出什么名堂来。因为是只有一个现场报这个问题,不是很紧急。10多天后改另一个问题时断点经过那边,突然发现了其中的玄机。和现场实施配合解决了,真的让人很开心。问题是这样的,只有他们现场的环境的字段输入数字时,不自动补3个0,其他现场都会补。然后我们这边的 “设计”说,他们现场有问题,就他们经常会报一些稀奇古怪的问题出来~上一任开发都被他们现场烦死得了~

  结果是因为配置页面与我们这边有差异引起来的差错,现场实施说,困扰现场许久的问题解决了,谢谢!

  是的,在我看来很小的问题,在现场会被许多用户用到的。改善一点点,对于经常使用那边功能的用户来说都是很大的改变了。软件变好,网页使用方便是会被用户感受到的,就像微信,版本更新会引发大量推文与分析。

  本想写个纯 debug技术 的文章的,想想我也没用很久,就结合自己经历带着写了点。总的来说,我认为 debug 就是排查错误的能力中的一部分,它是必要组成部分,却不是全部。来了问题,首先是要冷静,不能烦躁,烦躁起来会遗漏掉一些看似不起眼的信息。就像我前两天,没第一时间看控制台,在那急躁了起来。最后就很坑。

  来了问题,先分析问题产生的原因,是脏数据或异常操作?不同环境之间的差异,先排查自己能确定的部分如配置信息或代码里有没有加开关之类的,最后再去怀疑现场服务问题。事实上,现场服务起的往往没错。找bug时,先看控制台,再看网页上的报错,往往报错信息就告诉自己该怎么做了。想法设法的进断点,进了断点,问题就不是问题了。只是进断点之前的前置条件需要许久时间。

  用的多了,自然就会了。想想还是感谢那时培训时,讲师跟我们讲了很多debug的技巧,不然前段时间才进公司的这段日子,会更难熬过来吧!

  

  

debug,菜鸟必备的求生技能的更多相关文章

  1. centos7系统管理和运维实战——运维必备的网络管理技能(1)

    运维必备的网络管理技能 一.网络管理协议: 1.简单的两个概念:    DHCP(动态主机配置协议):如果网络结构要更改,需要从新初始化网络参数,手机用动态主机配置协议可以避免这个问题.客户端可以从D ...

  2. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

  3. 现代Web应用开发者必备的六大技能

    过去,应用开发需要注重大量的专业知识,程序员只需关注单一的语言(比如COBOL.RPG.C++等),并利用该语言创建应用.而如今,时代在变迁.Web不再是单单关注独立的一面.相反,一个现代化的Web应 ...

  4. DevOps 工程师成长日记系列一:必备知识与技能组合

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...

  5. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

  6. 菜鸟必备教程,ajax与xml交互传输数据。

    今天,公司让学习ajax,然而我并不会,着急到爆炸,boom~~啥卡拉咔.看着教程一步一步摸索,写出来交互页面,写代码真的好惆怅啊. 额,不说废话,下面是源代码. 首先是ajax的代码,注释真的很重要 ...

  7. 超赞!UX写手必备技能

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 今天,小编非常荣幸能与大家一起分享一些优秀UX 写手必备的成功技能: 1.开篇抓住用户的心 MBE曾 ...

  8. Java架构师必备技能:docker使用大全

    前言   java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...

  9. 实训随笔2:Git Gui——拯救菜鸟的工具

    熟练使用git进行多人协作开发,是程序猿必备的专业技能之一,可惜我等实在太菜搞不来复杂的命令行. 幸好除了Git Bash还有一个Git gui存在——专门为了拯救我们这些菜鸡程序猿而存在的工具. 下 ...

随机推荐

  1. git tag 常用操作

    1.获取最新tag(获取不到就多获取几次) git fetch origin  或者 git fetch origin <tagname> 2. checkout tag到本地分支(如果看 ...

  2. 开源ERP系统Odoo搭建文档

    本文参考链接地址: https://devecho.com/v/209/ https://www.cnblogs.com/wxylog/p/6386974.html 什么是Odoo 为什么选择Odoo ...

  3. 刘志梅 201771010115 《面向对象程序设计(java)》 第八周学习总结

    实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 接口定义:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义:由常量和一组抽象方法组成:接 ...

  4. html5 + vue

    偶然与巧合 舞动了蝶翼 谁的心头风起 前赴而后继 万千人追寻 荒漠唯一菩提 似擦肩相遇 或擦肩而去 命运犹如险棋 无数时间线 无数可能性 终于交织向你

  5. 学习 MeteoInfo二次开发教程(一)

    来自气象家园:http://bbs.06climate.com/forum.php?mod=viewthread&tid=6631 按照教程,没有太大问题,有些是对c#操作不熟悉导致. 1.添 ...

  6. centos7安装redmine3.4

    前言:安装要求 Ruby解释器 给定Redmine版本所需的Ruby版本是: Redmine版本 支持的Ruby版本 使用Rails版本 4.0 ruby 2.2(2.2.2及更高版本),2.3,2. ...

  7. 一些恶作剧的vbs程序代码

    恶作剧的vbs代码,这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处,最多关机重启一下就可以了,将下面的任意一段代码保存为*.vbs即可 循环弹窗: do msgbox "hi&q ...

  8. SecureCR 改变背景色和文字颜色

    1.打开SecureCR链接Linux服务器,Options->Session Options->Emulation->Terminal 选择Linux (相应的服务器系统)ANSI ...

  9. setDaemon 守护线程

    setDaemon(True): 将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起.这个方法基本和join是相反的. 当我们 在程序运行中,执行一个 ...

  10. __get__ __set__ __delete__描述符

    描述符就是一个新式类,这个类至少要实现__get__ __set__ __delete__方法中的一种class Foo: def __get__(self, instance, owner): pr ...