前言

时间的车轮一直向前不停,试图在时光洪流中碾碎一些久远的记忆。虽然记忆中的人离我越来越远,但是故事却越来越深刻。

当在博客园看到这次的正文题目是“最难忘的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变量都是作为形参进来的。

  1. 先解析包头内容,来确定包体中有多少条数据,这里对应的是totalContents

  2. 解析每条协议数据公共部分,一共占54个byte。

  3. 根据上面的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:谢谢实习时候爱学习的自己的更多相关文章

  1. 【反思】一个价值两天的BUG,无论工作还是学习C语言的朋友都看看吧!

    博文原创,转载请联系博主! 使用C语言也有两个年头了,BUG写出来过不少,也改过不少BUG.但是偏偏就是有这么一个BUG让我手头的项目停工了两天,原因从百度找到谷歌,资料从MAN手册找到RFC也没有找 ...

  2. 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.0隆重发布

    v3.3.0 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国  itest项目地址   https://www.oschina. ...

  3. 开源敏捷测试管理& 开源BUG跟踪管理软件itest(爱测试) V3.3.1小改紧急发布及正实现功能预告

    v3.3.1 下载地址 :itest下载 码云源码地址 https://gitee.com/itestwork/itest 开源中国  itest项目地址   https://www.oschina. ...

  4. 二本非科班,秋招,实习,面试,offer之路

    不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...

  5. AI要被祭天了!删Bug,删着删着把全部代码都删了

    近日,美国版的“大众点评”,本想训练 AI 来消除 bug,结果它把所有内容删除了... Yelp 在其最新更新的 App 中写道: “我们为本周使用该app遇到问题的用户致歉.我们训练了一个神经网络 ...

  6. [中英对照]The Art Of Reporting Bugs | 报bug的艺术

    前言:因为最近要给兄弟Team分享一下如何有效地报告bug, 故多做一做功课.下面给出一篇博客的中英文对照翻译. The Art Of Reporting Bugs | 报bug的艺术 My init ...

  7. 数学口袋精灵感受与BUG

    232朱杰 http://www.cnblogs.com/alfredzhu https://github.com/alfredzhu/ 组长,团队 230蔡京航 http://www.cnblogs ...

  8. [Mac A]为什么国外程序员爱用 Mac?

    from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...

  9. CSS3学习总结

    (写在前边~)过了这么长时间,才写博客,最近实在是太忙了,做了两个项目,一个项目用于练手,自我感觉做的很漂亮,一个项目是一套完整的页面体系,答辩时候老师给了100分和99分,并让我打包上传,我很是感动 ...

随机推荐

  1. OGG-如何只同步最近某个时间范围的数据

    一.需求,某客户希望使用OGG只同步时间大于2021-02-01日期之后的数据变换 需求如标题所示,如何使用OGG进行配置? 客户环境需要同步的表有几百G,表数据太大了;如果同步所有数据,目标库空间存 ...

  2. 霍尔效应实验 execl数据处理

    execl 函数 =POWER() /*幂次*/ =ROUND() /*保留小数点后几位*/ =SQRT() /*开平方根*/ =POWER( x, 1/3 ) /*开立方根*/ =COUNTA() ...

  3. NX CAM 读取加工参数

    '取加工几何试图程序组 Function GetGemoGroup_Name(ByVal camObjectTag As NXOpen.Tag) As String Dim theGemoGroupT ...

  4. perl合并文件

    使用Perl合并文件 有时需要将整个目录下的小文件合并到一个文件中,以便查阅检索 特性 整个目录完全遍历,自动存入单个文件顺序遍历文件 待合并的目录 合并后的文件内容 syscfg/test1 sys ...

  5. [no code] Scrum Meeting 博客目录

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 Scrum Meeting博客目录 我们在这个课程的目标是 远程协同工作,采用最新技术 ...

  6. 在Vue前端项目中,附件展示的自定义组件开发

    在Vue前端界面中,自定义组件很重要,也很方便,我们一般是把一些通用的界面模块进行拆分,创建自己的自定义组件,这样操作可以大大降低页面的代码量,以及提高功能模块的开发效率,本篇随笔继续介绍在Vue&a ...

  7. Noip模拟37 2021.8.12

    T1 数列 真是考场上不是数学的乱推柿子,想定理,是数学的没想出来.. 比较悲伤... 列柿子不用动脑子,就是没有想出来$EXgcd$解不定方程,淦.. 解处一组解后利用比较显然的性质: $x+\fr ...

  8. stm32串口学习笔记

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  9. 一文带你掌握【TCP拥塞窗口】原理

    ❝ 关注公众号:高性能架构探索.后台回复[资料],可以免费领取 ❞ 学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小 ...

  10. Ubuntu鼠标变十字 不能点击

    出现这种情况,应该是bash 直接运行了python文件 系统中出现了一个import 进程. python文件中除了注释应该是import在最前边 ps -ef|grep import 可以查看系统 ...