程序员写了一个新手都写不出的低级bug,被骂惨了。

本文转自:https://www.cnblogs.com/aobing/p/12189755.html

这篇文章算是读后总结,刚开始看这篇博客不理解啊,咨询了一下身边厉害的大佬。Oh Oh 原来是这样!!!

希望能给跟我一样的小白,一点点启发。

你知道的越多,你不知道的越多

点赞再看,养成习惯

本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。

前前言

为啥今天有个前前言呢?

因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)。

也有好几个号主发来问候,直接实名羡慕哈哈,丙丙以后也是被微信推荐过的男人了,你们也是有牌面的读者了。

前言

你们是不是以为丙丙这么忙了,肯定不会写技术文章给你们看了?

丙丙暖男来的,不过说实话年前估计是没啥时间写技术文章了,上周末两篇你们也看到了,不是年会就是首脑峰会,实在很忙。

这周也是一样,我们年底了项目也赶,我今天一列下个Q的计划,我的个乖乖,平均三天一个需求,什么鬼啊。

而且周四又有技术部的年会,我还是视频的导演(打杂仔哈哈),肯定需要确认很多细节,到时候我应该还可以周末水一篇给你们看(剧透下那一期会有我女神入镜)。

下周周二我就坐车回家了,打工仔回家过年了,我也叫我妈把我要回家的消息放出去了,估计媒人这会已经在路上了,到时候相亲我又可以水文章了,过年素材也好多呀,开心。

这一篇主要说一下我之前的一个很愚蠢的bug,本来只打算让他呆我笔记里面的,但是还是忍不住想要分享出来,让大家避免这种低级错误(其实我想水一篇多少有点技术内容的文章,免得写N篇全是水日常的文章,你们估计又要Diss我了)。

正文

我先描述一下bug的现象哈:

这两个输入框的值都是我从KV(Redis之类的存储中间件)里面获取到的,也是可以实时修改的,我自作聪明,想着KV里面如果没值,就默认取一个静态变量,这样有个兜底,在类加载的时候加载静态变量,我取的时候也效率高了。

这就也为我后面的Bug埋下了伏笔,问题是这个Bug烦就烦在他在预发环境是好的,线上却是坏的。

先看看代码怎么写的:

可以看到代码里面,我是在静态代码块去KV取值,如果有值就用KV的做初始值,没取到我也有默认值,我当时还在想自己的构思真巧妙,用KV比DB效率高,用常量去做兜底,不至于没配置的情况没有值,报空指针啥的。

当时一个劲给自己加油打气,一个劲的妙啊,不知道自己写了多蠢的代码。

这样写看似没什么问题,但是我这个值是可以修改的这就有问题了,而且我有几个地方还是取的变量,不是一直取的KV。

而且常量被我当变量用,也都违背了这玩意的初衷了。

我上线后,三歪就说:敖丙出大问题了,为啥我刷新一下值就不对了,再刷新值就回来了。

我惊恐万分,深知我写了BUG,我不着痕迹的擦去我鬓角的汗水,深呼吸了一下。

回答道:我代码还没写好呢,你怎么乱点,我告诉过你不要乱点的,现在你点坏了吧。

三歪好像真的以为他错了,委屈巴巴的啥也没说就默默离开了。

这个时候我马上打开电脑,也顾不上歪歪的感受了,思绪转的飞快,开始在闹海中构建整个值传递的链路。

我改了页面的值,之后我也改了这个静态变量和KV的值,但是我在线上发现我刷新页面一会是修改之后的,一会是修改之前的值.

这就奇怪了呀,主要是在预发还不能复现,这就很坑爹了,难受呀歪歪。

Tip:预发指的是,代码跟线上一样,数据库一样,环境配置不一样。

我把代码看了一遍又一遍,还是没发现问题。

在当天那个饱暖思淫欲的下午饭之后我,突然灵光一闪发现了问题的核心,预发是好的因为他是一台机器。

而我们线上的机器是负载均衡的,有两台机器,我修改一次只改了一台机器的值,另外一台没修改到。

那么问题就简单了,我们看下图:

预发情况,是单机,不管我怎么读怎么修改,每次数据都是准确的(这里我还没意识到其实每次去取变量是不对的)。

但是线上不一样,服务器启动的时候给每台机器赋值了,这样的情况如果只是读是没问题的(怪不得静态常量都是private的,能修改的话基本上都有这个问题)。

但是如果修改,你修改的请求只是打到了一台机器上,如果下次负载均衡请求到了这个机器,那么你很幸运,结果是对的,但是往往负载均衡算法就是那么公平,雨露均沾这样的情况 1/2的请求,都会拿到错误的结果。

而且这个地方的问题还有一个就是,应该是修改KV之后,修改变量,我有的地方取的是变量,因为我想每次反正都改了,取也没事。

其实正确的做法是我每次去都读KV就好了,只有KV为空的时候才去读静态变量,作为一种兜底方案,不应该去改变常量的值。

而且大家要知道,我修改KV成功万一修改常量的时候出错了呢?你取常量的值就不对了。

所以查询,修改应该这样做:

主要是想提醒大家,谨慎操作静态常量,能不变就不变,不要写这么骚的操作了,我这算少的很多 40、50台线上机器的服务,这种问题是真的难发现。

我是万万没想到,我居然写出这种代码,下次再写出来,只能让歪歪不要乱点了,免得又点坏了哈哈。

自我理解:

两个服务器的初始值都是”敖丙,鸡蛋”,其中有一个服务器把常量改了并同步到kV(相当于redis中), 第二个服务器还是初始值【没有去KV(redis)中取最新的数据】

bug产生原因:静态代码块只加载一次,数据不是从KV(redis)中更新的,所以会出现不一致的问题。

解决方法:我每次去都读KV就好了,只有KV为空的时候才去读静态变量,作为一种兜底方案,不应该去改变常量的值。【原文的解决方法】

原文地址:https://www.cnblogs.com/minmin123/p/12195649.html

时间: 2024-09-28 13:48:12

程序员写了一个新手都写不出的低级bug,被骂惨了。的相关文章

如何区分一个程序员是“老手“还是“新手“?

除多年编程经验之外,还有什么能区分一个程序员是“老手”还是“新手”?编程技巧当然是一部分,但它绝非是全部. 聪明的程序员可能比他们的同行拥有更出众的编程技巧,但那不足以说明他们就是“老手”.同样,仅仅因为拥有10年编程经验也并不意味着他们就是高手.在工作岗位上,拥有多年编程经验也不能说明问题.即便没被炒鱿鱼,那也不能提升你的价值. 下面列举的事情是大多数高级程序员都会做的. 1.至少掌握一门编程语言 我相信有些优秀的程序员只懂(并精通)一门编程语言,但在某种程度上而言,这其实会限制一个人的思维.

如何区分一个程序员是“老手“还是“新手“

除多年编程经验之外,还有什么能区分一个程序员是"老手"还是"新手"?编程技巧当然是一部分,但它绝非是全部. 聪明的程序员可能比他们的同行拥有更出众的编程技巧,但那不足以说明他们就是"老手".同样,仅仅因为拥有10年编程经验也并不意味着他们就是高手.在工作岗位上,拥有多年编程经验也不能说明问题.即便没被炒鱿鱼,那也不能提升你的价值. 下面列举的事情是大多数高级程序员都会做的. 1.至少掌握一门编程语言  我相信有些优秀的程序员只懂(并精通)一门编程

小白程序员怎么由量变到质变写出高质量代码

小白程序员怎么由量变到质变写出高质量代码?很多老程序员从事开发多年,有这样一种感觉,查看一些开源项目,如Spring.Apache Common等源码是一件赏心悦目的事情,究其原因,无外两点: 1.代码质量非常高; 2.命名特别规范: 要写高质量的代码,不是一件容易的事,需要长年累月的锻炼,是一个量变到质变的过程,但要写好命名,只需要有比较好的英语语法基础和一种自我意识即可轻松达到. 1.切忌使用没有任何意义的英语字母进行命名. 2.切忌使用拼音,甚至是拼音首字母组合. 3.要使用英文,而且要使

程序员到底是一个什么职业?

为什么有人在技术造神 大家应该已经感受到,技术圈这两年已经和娱乐圈创业圈差不多的氛围了,这其实是有原因的. 最主要的原因是,创业公司和创业媒体越来越多,他们需要大量的程序员投身到创业这个高风险的行业中,而造神,正是让程序员们自动跳进火坑的绝佳办法.不是说程序员不能创业,我是说,创业媒体们故意模糊了创造和创业的界限,把程序员们的创造冲动偷换概念,鼓吹了太多不适合的人去创业. 另一个原因是,招聘成本高涨,CTO们为了能提升影响力,不得不频频出席各种大会刷脸.文笔好的再做做自媒体和技术社群,既能强化个

大部分程序员心中有一个管理者的梦想,但在技术路线上"半路夭折"

当我们大学的时候还在为如何学好技术发愁的时候,那时的我们在内心深处"埋下了"一个小小的理想,我一定要学好技术,成为一个优秀的程序员.对于在IT行业摸爬滚打6年的我,想起以前的小小理想有些莫名的心酸和感动.看看周围正在前行的朋友和已经倒下的朋友,大家都在艰难的前行,至少大部分人已经脱离最初的想法,最终的想法转向了统一的话题"如何脱离技术,去做管理,因为钱多,发展好".其实这并不是不对,因为大家需要生活,需要养家糊口,这个是没有问题的.但是会带来一个现象就是全行业把做技

@程序员,承认吧,都是你的错!

老读者都知道的,我没干过什么大事,无非就是敲敲代码.写写文章.还有就是及时吃饭.睡觉.打豆豆. 这不,就有个哥们看不惯我了,再见之后还要撂下这句狠话:"你这种人是干不了大事的." 好吧,我承认,都是我的错!我真没想过要干什么大事.我觉得打打杂,扫扫地挺好的.我估计我来到这个世界上的时候,父母也没对我抱太大的期望,否则清华北大没录取我这事会把他们气疯掉的.事实上,即便我只考了个大专,他们仍然没有抛弃我.放弃我. 不知道大家有没有看过<西西里岛的美丽传说>,漂亮的女主人公(女神

为什么程序员的业余项目大多都死了?

为什么程序员的业余项目大多都死了? 我们都有这样的业余项目:项目创建一半就弃之于坟墓,未完成的梦想遗体就这样扔之于文件夹中.游戏.应用程序.可视化数据等等.现在所谓伟大的点子最后只能沦落为空气中卑贱的尘埃. 这是一个可悲的事实,因为业余项目原本应该成为一个传奇.在它们最辉煌的时刻,能够让你朝思暮想,夜不成寐,眼中只有一个它.很少很少的一部分人会够保持下去,沉溺于此.它们让你觉得自己还活着,它们比sex更好. 但大多数的业余项目往往没有那么幸运.被抛弃,然后静静地,死去. 我们会说自己没有时间.生

聊聊程序员如何学习英语单词:写了一个记单词的小程序

背景: 关于英文对程序员的重要性,就不多说了! 英语的学习,有很多,今天也不聊多,只聊英语单词! 关于单词的记忆,找过很多方法,下载过很多软件. 如图(其它不好用的都卸载了): 上图算是我以前用过软件,注意,是以前哦~~~ 意思就是没有坚持下来~~~~ 随时间的推移,最后它们还是被我遗忘了~~~ 为什么???不能:坚持!坚持!坚持! 学习思考: 一直在找方法: 1:下载过联想记忆法.背文章记单词,词根,各种视频~~~ 2:连单词的数据库都网上下载了一份了,期望从数据库的直接记忆单词快些~~~ 通

【程序员创业】商业计划书怎么写才能与众不同?

内容简介 1.新颖的商业计划书 2.巧用思维导图 新颖的商业计划书 一般来说,商业计划书肯定是越详细越好. 通常,我们写商业计划书总是包括以下几个部分: 公司介绍 商业模式 市场分析 竞争分析 团队介绍 融资计划 这样的“保守”写法固然不容易出错,但是很多客户经常要阅览N个商业计划书. 如果都是这样的形式,难免会审美疲劳.就像写简历,也要设计得与众不同一样.不然人力部门每天看好多份类似的简历,怎么能在芸芸众历中相中我们的呢? 客户或者政府要欣赏你的商业计划,或者说要看到你的商业计划书时眼前一亮,