最难忘的一次bug:谢谢实习时候爱学习的自己
前言
时间的车轮一直向前不停,试图在时光洪流中碾碎一些久远的记忆。虽然记忆中的人离我越来越远,但是故事却越来越深刻。
当在博客园看到这次的正文题目是“最难忘的bug”,脑海里瞬间浮现起到2017年的11月8号那天。真的很快,已经过去四年了,这么多年,在Java开发、大数据开发中遇到过形形色色、自认为不可能发生的Bug,也曾伤过神、生过气,但最终只是成为了工作经验的给养。但惟有那次很小的一个bug,让我记忆犹新。
那次,改变了我对工作、责任的认知,让我有了团队归属感。那时候的我还是一个只会一点Java的实习生,现在已然成为三年经验的大数据从业者了。
问题
"测试","升级","割接"。2017年11月8日,这三个名词第一次出现在我的认知里,第一次实践在工作中。
从七月份进入公司实习以来,一直在整理各种文档,后来承担了大数据部分运维的工作。那时候的感觉就是,开发的理想真的离我越来越远。
升级目标
当时是做信令数据的接入,20多种信令,每种信令有50 ~ 100个字段。对端厂家根据规范将每个字段转换成二进制格式,例如unsigned int、int、double、byte、short各种数据类型。
这样的话,每种信令数据根据包含字段的数据类型,就可以计算出长度,然后放入byte[]或者byteBuffer中。例如byte类型就占1个字节,int类型占用4个字节。
根据定义的传输规范,我们将一个数据包分为包头和包体。根据包头可以区分出包体里面是响应数据还是应答数据,然后将包体内的二进制数据解析成对应类型明文即可。
此次升级除了字段个数增加,之前老版本中一个包体中只有一条数据,也修改成一个包体会有N条不同协议的数据。
问题
11月8日晚六点,组长对旁边的大佬说:“测试怎么样?"
大佬:“测试地没啥问题。”后来才知道和对端联调的时候没有测试充分。
那天的我本来是可以下班走的,然后我的第一任项目经理就叫住了我,让我积极参(chong)与(shu)一下。作为一个实习生,那时候正好在自学Java、大数据,加上也不敢拒绝,就留下陪他们加班。
然后晚上11点割接的时候,二进制数据解码后写入Kafka的数据先开始正常,接着就是齐刷刷的乱码,然后就大家就慌了,就开始找问题。
我们三个人都挤在一个工位上,大佬在中间找问题,我和组长就在一人一旁地看着。
乱码分析
那时候我连这个程序是干啥的都不知道,也准备躺平了。刚实习哪见过几千行的代码,就一愣一愣的看着他们在翻着程序。
凌晨五点的时候,我和组长就发现每个协议的解码方法中off变量都是作为形参进来的。
先解析包头内容,来确定包体中有多少条数据,这里对应的是totalContents。
解析每条协议数据公共部分,一共占54个byte。
根据上面的lte_type来区分是哪个协议的数据,然后传入到对应的方法中对字段进行解码。下面是模拟之前老程序中一个协议数据的解析代码逻辑。
off变量的作用是记录每个字段在byte[]中的起始位置,这样才能正确的解析出每个字段。之前一个包体中只包含一条数据的时候,off传入到dataHander()后,将byte[]从off解析到数组尾部即完成了数据的解析,这时候的off是不要记录的。
但是当一个包体包含多条不同协议数据的时候,当第一条数据顺利解析完成后,因为传入解析方法的形参off虽然已经在方法内部进行了自增,但是未能作用于外部的实参off变量中,所以当解析第二条数据的时候off已经不再正确。
画个图加深理解:
在第三步传入协议方法的时候,虽然在方法内解析每个字段的时候off都自增了,但是却没有对外部的off进行修改,所以才会导致乱码。
为什么会乱码呢?
乱码说白了就是二进制无法转换成对应的字符。因为里面会有一些ascii码,而我们知道ascii是用一个byte表示,能够表示128(2的七次方)个字符,取值范围为0-127,即二进制范围为00000000 ~ 01111111,当off错位之后,这个byte表示的数字大于127的时候,就会因为找不到对应的字符,所以就会乱码。
结语
或许在很多人眼中,这就是个小错误。但对我来说,却是工作生涯的一个起点。经过这一次升级之后,后面也参与了这个程序的JVM调优、Kafka瓶颈测试的工作。对我后面的工作思维方式帮助了很多。
四年过去了,他们也在新的地方,成立了新的团队。而我,也慢慢成长为一名大数据工程师,也成为这个团队的负责人。或许有一天,我也会离开,或许会因为钱、或许会因为平台、亦或许会因为一个人。
这一次、很深刻,就像一份没带给你伤痛的感情一样。我也觉得初入社会,遇到这样的一群人、遇到这样的一件事很幸运。
最后,愿我们永远十八岁。
最难忘的一次bug:谢谢实习时候爱学习的自己的更多相关文章
- 【反思】一个价值两天的BUG,无论工作还是学习C语言的朋友都看看吧!
博文原创,转载请联系博主! 使用C语言也有两个年头了,BUG写出来过不少,也改过不少BUG.但是偏偏就是有这么一个BUG让我手头的项目停工了两天,原因从百度找到谷歌,资料从MAN手册找到RFC也没有找 ...
- 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.0隆重发布
v3.3.0 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国 itest项目地址 https://www.oschina. ...
- 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.1小改紧急发布及正实现功能预告
v3.3.1 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国 itest项目地址 https://www.oschina. ...
- 二本非科班,秋招,实习,面试,offer之路
不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...
- AI要被祭天了!删Bug,删着删着把全部代码都删了
近日,美国版的“大众点评”,本想训练 AI 来消除 bug,结果它把所有内容删除了... Yelp 在其最新更新的 App 中写道: “我们为本周使用该app遇到问题的用户致歉.我们训练了一个神经网络 ...
- [中英对照]The Art Of Reporting Bugs | 报bug的艺术
前言:因为最近要给兄弟Team分享一下如何有效地报告bug, 故多做一做功课.下面给出一篇博客的中英文对照翻译. The Art Of Reporting Bugs | 报bug的艺术 My init ...
- 数学口袋精灵感受与BUG
232朱杰 http://www.cnblogs.com/alfredzhu https://github.com/alfredzhu/ 组长,团队 230蔡京航 http://www.cnblogs ...
- [Mac A]为什么国外程序员爱用 Mac?
from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...
- CSS3学习总结
(写在前边~)过了这么长时间,才写博客,最近实在是太忙了,做了两个项目,一个项目用于练手,自我感觉做的很漂亮,一个项目是一套完整的页面体系,答辩时候老师给了100分和99分,并让我打包上传,我很是感动 ...
随机推荐
- Vue3学习(六)之使用Vue3进行数据绑定及显示列表数据
一.写在前面 说来还是比较惭愧的,从周二开始事就比较多,周三还电脑坏了,然后修电脑等等一些杂事,忙的团团转,因为周二.周三自己走的过多了,导致不敢直腰,周四卧床一天. 之前都听说<陈情令> ...
- javascript-jquery对象的css处理
一.css基本属性处理 1.css()方法:获取css属性值.$("选择器").css(name);//获取匹配选择器的元素指定css属性值. 2.css()方法:设置css属性值 ...
- 关于takin-data,你想知道的都在这里(一)启动命令篇
通过docker部署体验takin的小伙伴都应该知道,在安装部署手册中有提到:在启动surge-deploy任务前,需要将启动命令中的ip参数替换为docker容器所在宿主机的ip,很多小伙伴都在这里 ...
- [Git系列] Git 基本概念
版本控制系统 版本控制系统是一种帮助软件开发者实现团队合作和历史版本维护的软件,一个版本控制系统应具备以下列出的这几个基本功能: 允许开发者并发工作: 不允许一个开发者覆写另一个开发者的修改: 保存所 ...
- Noip模拟80 2021.10.18
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...
- 2021.8.19考试总结[NOIP模拟44]
T1 emotional flutter 把脚长合到黑条中. 每个黑条可以映射到统一区间,实际操作就是左右端点取模.长度大于$k$时显然不合法. 然后检查一遍区间内有没有不被黑条覆盖的点即可. 区间端 ...
- Java-基础-LinkedList
1. 简介 LinkedList 同时实现了List和Deque接口,也就是说它既可以看作是一个顺序容器,又可以看作是双向队列. 既然是双向列表,那么它的每个数据节点都一定有两个指针,分别指向它的前驱 ...
- MIPI归纳---为什么阻抗为100欧姆
根据LVDS(Low Voltage Differential Signaling)电平定义的. LVDS差分信号PN两线最大幅度是350mV,内部一个恒流源电流是3.5mA.于是终端匹配电阻是100 ...
- 零基础入门stm32基本定时器详解
一.基本定时器介绍 在STM32中,基本定时器有TIM6.TIM7等.基本定时器主要包含时基单元,提供16位的计数,能计数0~65535.基本定时器除了计数功能以外,还能输出给DAC模块一个TRGO信 ...
- Register Abstraction(9)
This post will explain how to use the UVM Register Abstraction Layer (RAL) to generate register tran ...