debug,菜鸟必备的求生技能
突然想写个关于 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,菜鸟必备的求生技能的更多相关文章
- centos7系统管理和运维实战——运维必备的网络管理技能(1)
运维必备的网络管理技能 一.网络管理协议: 1.简单的两个概念: DHCP(动态主机配置协议):如果网络结构要更改,需要从新初始化网络参数,手机用动态主机配置协议可以避免这个问题.客户端可以从D ...
- 「编程羽录」上线,程序员必备的这些技能你能get到嘛?
大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...
- 现代Web应用开发者必备的六大技能
过去,应用开发需要注重大量的专业知识,程序员只需关注单一的语言(比如COBOL.RPG.C++等),并利用该语言创建应用.而如今,时代在变迁.Web不再是单单关注独立的一面.相反,一个现代化的Web应 ...
- DevOps 工程师成长日记系列一:必备知识与技能组合
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...
- 刚接触Linux,菜鸟必备的小知识点(一)
身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...
- 菜鸟必备教程,ajax与xml交互传输数据。
今天,公司让学习ajax,然而我并不会,着急到爆炸,boom~~啥卡拉咔.看着教程一步一步摸索,写出来交互页面,写代码真的好惆怅啊. 额,不说废话,下面是源代码. 首先是ajax的代码,注释真的很重要 ...
- 超赞!UX写手必备技能
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 今天,小编非常荣幸能与大家一起分享一些优秀UX 写手必备的成功技能: 1.开篇抓住用户的心 MBE曾 ...
- Java架构师必备技能:docker使用大全
前言 java工程师成长为架构师是一个艰难且耗费心力的过程,不仅仅需要熟悉java体系内相关的技术,同时要掌握许多运维相关的操作技能,随着k8s逐渐成为微服务持续集成开发难以越过的基础设施之后,d ...
- 实训随笔2:Git Gui——拯救菜鸟的工具
熟练使用git进行多人协作开发,是程序猿必备的专业技能之一,可惜我等实在太菜搞不来复杂的命令行. 幸好除了Git Bash还有一个Git gui存在——专门为了拯救我们这些菜鸡程序猿而存在的工具. 下 ...
随机推荐
- Android中的Sqlite中的onCreate方法和onUpgrade方法的执行时机
1.今天在做数据库升级的时候,遇到一个问题,就是onCreate方法和onUpgrade方法的执行时机的问题,这个当时在操作的时候,没有弄清楚,很是迷糊,后来看了相关的博客由于转发受限所以copy了一 ...
- EasyUi 复杂多表头设置
columns: [ [ { field: 'Test', title: '测试', rowspan: 3, width: 100, sortable: true }, { title: '测试1', ...
- 定位JVM内存溢出问题思路总结
JVM的内存溢出问题,是个常见而有时候有非常难以定位的问题.定位内存溢出问题常见方法有很多,但是其实很多情况下可供你选择的有效手段非常有限.很多方法在一些实际场景下没有实用价值.这里总结下我的一些定位 ...
- docker命令相关
进入容器 容器已经启动 docker exec -it ece7b58a2a04 /bin/sh 容器未启动 docker run -it zzzzz/edas:v1 sh 检查容器 docker i ...
- 代码: !AJAX
http://www.cnblogs.com/cwp-bg/p/7668840.html ajax和jsonp使用总结 2017-10-17 var requestUrl="http://l ...
- 一个判断I2C总线通信异常原因的方法
此问题由某客户提出,应用处理器 AP与 MCU进行 I2C通信,通信会经常发生异常,需要定位原因. 首先需要定位的是因为哪个器件发的波形不正确导致通信异常,所以我们在 I2C 线路上增加了以下处理,增 ...
- django admin 设置(转载https://www.cnblogs.com/wumingxiaoyao/p/6928297.html)
Django admin 一些有用的设置 Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸 ...
- java 流转换BASE64的一些问题
java 转换BASE64过程中,出现很多结尾为空的问题!暂时不清楚为什么会这样- ``` java //根据url地址转换成BASE64 public static String getURLIma ...
- iptables随笔
iptables 分为四表五链 四表: filter表 nat 表 mangle 表 raw 表 五链 INPUT 链 OUTPUT 链 FORWARD 链 PREROUTING(路由前) POSTR ...
- TXLSReadWriteII2 读取数据
TXLSReadWriteII2 按行读取数据(写得复杂了点,实际项目中的,可以自己简化) procedure TformMain.LoadGeneralObject(_type, _col, _ro ...