天天财汇 购物 网址 万年历 小说 | 三峰软件 小游戏 视频
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页 淘股吧 股票涨跌实时统计 涨停板选股 股票入门 股票书籍 股票问答 分时图选股 跌停板选股 K线图选股 成交量选股 [平安银行]
股市论谈 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
商业财经 科技知识 汽车百科 工程技术 自然科学 家居生活 设计艺术 财经视频 游戏--
  天天财汇 -> 科技知识 -> 为什么程序员总是发现不了自己的Bug? -> 正文阅读

[科技知识]为什么程序员总是发现不了自己的Bug?

[收藏本文] 【下载本文】
为什么程序员总是发现不了自己的Bug?
关注问题?写回答
[img_log]
程序员
为什么程序员总是发现不了自己的Bug?
甲:你这杯子不好用啊,接一点点水就满了,还不如我之前用手捧呢!


我:你把他倒过来试试;
甲:还是不行啊,这次一点水不能装了


我:不是,我的意思是你给他翻过来
甲:这不是一样啊!


甲方需求:要喝水。
乙方解决方案:给了客户一瓶矿泉水。
甲方反馈:喝不到水,能看到水,但是喝不到。
乙方调查后答复:请拧开矿泉水盖子后再喝水。
甲方反馈:拧开盖子后水全撒地上了,还是喝不到水。
乙方调查后回复:请保持瓶口垂直向上的状态下拧开盖子,再喝水。
甲方反馈:保持瓶口向上拧开盖子,能看见水,但是还是喝不到水。
乙方调查后回复:请不要舔瓶子外面,从瓶口处喝水。
甲方反馈:能喝到了,只能喝一点点,然后就再也喝不到了。
乙方调查后回复:请一面喝水一面慢慢倾斜瓶子,并且保持瓶口在嘴的范围以内喝水。
甲方反馈:太麻烦了,我就是想喝个水,怎么这么多限制。你们这产品用户友好度太差了,bug还这么多,尾款不给了。
突然这么多人评论,就再补一些,也算是给抬杠的人群回一下。
我自己以前是程序员,现在是甲方,所以我深刻体会到了要想一个程序没bug,必须得从开发方到需求方到使用方,所有在路径上的人都是极度理性且智商在线的才有可能。
因为程序是讲逻辑的,实际工作和生活不一定讲逻辑。我原回答里的例子看着是在说甲方SB,实际上我是说从开发方到需求方到使用方(需求方和使用方很多时候都不是同一波人)的所有人。之所以“从瓶子外面舔瓶子来喝水”这种操作不是因为使用方脑子抽了,而是因为现实工作情况下,这种开发方根本想不到的case就是会出现。
举个栗子。
现在正在为某单位开发一套项目管理系统,需求方是某单位的管理部门,使用方是某单位下面遍布全球的各个项目部,开发方是某软件公司。
在海外做项目嘛,在当地做采购是很正常的,所以就要跟当地的供应商签合同,合同要连金额一起录入系统。然后合同分批执行,当地供应商给项目上送材料,项目上登记入库,当合同全部执行完,总付款金额跟合同金额一致,该供货合同才可以被设置为执行完成。
上面这个流程,就算是天王老子来了,你也不能说这个逻辑有错误,对吧?
然后超出逻辑的就来了。
有个国家叫智利,这个国家在南美的国家里算发达国家,国内通用货币叫比索。但是前些年智利通货膨胀比较严重,所以政府设定了一种记账货币叫智利发展单位(UF),用于贷款、税收、合同签订等各种情况,UF只是记账单位,没有实体货币,实际执行的时候跟比索的比例按当时的情况就会有波动。
情况就可以想象得到了,在智利的某项目,合同签订的时候录入的单位是UF,执行的时候分批入库的时候登记的是比索,合同执行完了之后总入库金额跟合同说什么都对不上。
项目上先是跟开发方吵,开发方表示我不背锅,特殊需求没有收集到不是我们的锅,你们找管理部门改需求。管理部门表示这是公司财务要求,你找财务。财务表示你们为啥出入库登记要用比索,每次出入库换算成UF不行么?项目部表示送货的就给了比索价值,我咋知道咋录入。
吵了好几天,最后改代码适配了这个特殊需求才算完。
整个过程中,没有哪方有错误,要说要分锅,最大锅算是管理部门的,没有提前预知和协调特殊需求。但是项目上不说,谁会想到这种地方还有这种需求呢?
但是在使用方(注意不是需求方)看来,这TM就是bug,并不妨碍我给开发方打差评。
真的,软件工程和项目管理是门学问,并不是光写代码就能搞明白的。

他自己发现的bug,他开发的时候就改掉了呀,其他人根本不知道好不好。
其他人知道的才是他没发现的bug。
实际上要是测的更全面一点,还能发现测试没有发现的bug,甚至是任何人都没有发现的bug。
我们组的产品代码有一个参数是国家代码,比如中国就是CN美国就是US这样。按理说没啥问题吧,结果有一次突然报错了
因为传进来了挪威,缩写是NO,yaml转完直接变成false了
我想起来我在一次组会上和导师的幽默对话
导师:“你这个ppt还需要改改,整体逻辑还是不好”
我:“具体改哪部分呢?”
导师(托腮):“你先把你觉得不好的地方改掉”
我:“我要是觉得不好我做ppt时就不这么做了”
然后一个课题组的人都在憋笑……
我没憋住……
很久以前,我们小组在写一个 Android 项目,当时都是萌新不懂。字符串全他娘的用硬编码,就是所谓的常量字符串。好家伙,有几个界面,就有多少处硬编码。像按钮上的 "Confirm" "Cancel" "Yes" "No" "Home",这种都写了不下几十,上百处。
然后 Google 市场上有人仿我们的程序,提取我们的 apk 反编译、然后改成他自己的项目。然后我们的同事在国内安卓论坛上,看到有人骂娘,说这应用的原作者真是xxx,到处乱写字符串,老资天天加班改代码,改不完,以为改完了,一运行,他们的测试说还有几处没改,还是显示 "Confirm",要改成 "确认",“取消”,“首页”之类的。
然后,我们自己看帖子都被骂笑了,因为当时水平太次,真的不知道用 xml 来写字符串资源是标准规范。
你说这算BUG吗?对我们不算,因为当时我们做 Google 市场,只需要考虑 英语用户。
但是真他妈的好笑,现在回想起来,太好玩了。
现在技术学得越多,越没意思,写得工工整整的代码,BUG越来越少,但一点意思也没有。怀念当年无知无畏~
送礼物
还没有人送礼物,鼓励一下作者吧
你开了个咖啡店,咖啡机、咖啡豆、杯子、店员、水电都准备好了,然后进来一个客人要-1份Null口味的锟斤拷。
因为程序员在用自己的产品时,总是会按他写代码的逻辑去用,会巧妙的避开所有的bug。
送礼物
还没有人送礼物,鼓励一下作者吧
有一次给一个客户做演示,其中一个环节是:点一下按钮就创建一个流程。结果这老兄啪啪就是一个双击,我觉得也没问题啊,双击事件我又没做响应。但系统竟然创建了两个一模一样的流程!
我根本想不到:竟然有人可以以低于双击的识别频率,在按钮消失前再点一次!
震惊之余问了下,这兄弟打过电竞的。
所以呢,有些bug是超出程序员的认知范围的啊,从来都没想过会有这样的问题,又该如何避免、如何设计测试呢?!
===========统一答复下
1、我是系统工程师,但这个东东的前端也是我自己写的,所以对web界面的行为逻辑确实缺乏经验
2、web界面全部是动态生成的:
徐晓轶:jxTMS设计思想之web界面2 赞同 · 0 评论文章
对于web界面,我的思路从一开始就是:文本定义、json描述、动态绘制、极致简单。所以这个按钮的点击事件是统一编写好的,就是触发后端的cmd事件,然后关闭按钮。
3、我不打游戏,对手速真的没概念,我自己从来都点不出这种效果:(
4、因为这个bug,所以现在的按钮点击事件都是先禁止,然后处理
送礼物
还没有人送礼物,鼓励一下作者吧
程序员写的程序有100个bug,其中98个在他自己调试的时候就已经改了,还有俩调试时没暴露出来。
然后你在这问为啥程序员总是不能发现自己程序的bug。
你能发现你自己做的杯子,会被客户用杯底装水喝这个BUG么?
一个测试工程师走进一家酒吧,要了一杯啤酒;
一个测试工程师走进一家酒吧,要了一杯咖啡;
一个测试工程师走进一家酒吧,要了0.7杯啤酒;
一个测试工程师走进一家酒吧,要了-1杯啤酒;
一个测试工程师走进一家酒吧,要了2^32杯啤酒;
一个测试工程师走进一家酒吧,要了一杯洗脚水;
一个测试工程师走进一家酒吧,要了一杯蜥蜴;
一个测试工程师走进一家酒吧,要了一份asdfQwer@24dg!&*(@;
一个测试工程师走进一家酒吧,什么也没要;
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来;
一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿;
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷;
一个测试工程师走进一家酒吧,要了NaN杯Null;
一个测试工程师冲进一家酒吧,要了500T啤酒咖啡洗脚水野猫狼牙棒奶茶;
一个测试工程师把酒吧拆了;
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒并且不付钱;
一万个测试工程师在酒吧门外呼啸而过;
一个测试工程师走进一家酒吧,要了一杯啤酒';DROP TABLE 酒吧;
测试工程师们满意地离开了酒吧。
然后一名顾客点了一份炒饭,酒吧炸了。
——内容源自网络,侵删
不是程序员,喜欢电脑和编程。
老婆是做少儿教育的,那天给我展示了一个很古老的 flash 游戏,屏幕上显示 0-9 的若干数字1秒,随后数字变成白板圈圈,然后让玩家按照大小顺序点击。一直做对的话,会越来越难。用来测试小朋友的专注力和记忆力的。
她希望我能写个程序把它现代化一下,让更多的设备可以运行这个游戏。Flash 用起来不方便。
我最终写了个网页,用 html5+css3+ts 复刻了游戏逻辑。陆陆续续写了半年。

0
跑起来了,她很满意效果,不满意效率。于是问我是怎么弄出来的,我打开 visual studio code,得意地给她展示代码。


老婆: “左边这列数字...不会是你写了几行吧?”
我:“是啊。”
老婆:“你半年才憋出来350行?”


我:“.....不是这么算的。”
老婆:“一天写两行?这样的?这里还有空行,这几行只有几个单词?为啥要这么久?时间都花在哪里了?”
我:“因为写起来有 bug,要修 bug。修 bug 花时间。其实时间的大头花在修 bug 上。”
老婆:“修 bug?就是写错了呗。那你一开始就不要写 bug、不要写错不就好了吗...”
简单来说,程序 bug 并不是单纯写错了。而是“写出来的程序没有按照程序员的设计运行”。写错了的叫错误,程序会崩溃,跑不了。而 bug 是,程序本身正常运行,但是没有按照我设计的思路运行。比如我要10个苹果,程序给了我三个梨子;或者我踩油门,车子没动,天窗打开了。
程序复杂度稍微一提升,各种逻辑错综复杂,牵一发动全身。很多 bug 并没有那么直观,一眼瞪上去根本看不出来,只有跑了才知道。有的更甚,正常跑,99.99% 都没事,只有很特殊的那 0.01% 的例子里才会产生 bug。比如我要10个苹果,一般来说,程序都会给我10个苹果,但是在星期二下午四点,如果恰好下中雨的话,向它要苹果,它会给我675个榴莲。
所以,bug 是程序逻辑复杂的产物。比如之前的例子,如果需求不是“给我10个苹果”,而是“给我一些能吃的东西”,那么吐出3个梨子和675个榴莲的程序就不算 bug。不想要 bug,那需求就必须简单粗糙;又要对付复杂精细的需求,又要没有 bug,世界上没有那么好的事情。
相关阅读:
陈默:写小程序,体验乙方的快乐生活5 赞同 · 1 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【一】3 赞同 · 2 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【二】1 赞同 · 0 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【三】2 赞同 · 0 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【四】1 赞同 · 0 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【五】1 赞同 · 0 评论文章


陈默:试图复刻《瞬时记忆》的小游戏【六】1 赞同 · 0 评论文章


陈默:试图复刻《瞬时记忆》的小游戏【七】1 赞同 · 0 评论文章
陈默:试图复刻《瞬时记忆》的小游戏【八】2 赞同 · 0 评论文章
陈默:JavaScript 算法思考:返回一个面积中的随机位置5 赞同 · 0 评论文章


陈默:JavaScript 算法思考:返回一个面积中的随机位置【续】1 赞同 · 0 评论文章


陈默:简单的 JavaScript 算法思考,随机返回 n 位的 1-9 不重复数字组合2 赞同 · 2 评论文章


你写了一个处理图片的程序封装成库给其他人使用,自己测试读取一张图片正常没问题,然后交给别人
然后
别人传入了一个空指针给你
别人传入了一个数据流给你,但是这个数据流并不是图片
这个接口被同时多次多次爆显存了,或者里面有些全局变量没考虑到线程安全问题,或者你用的第三方框架里有线程不安全问题
当然了这些坑踩多了就习惯了,就知道下次加判断,关键是第一次这些坑总要踩,这样的第一次反复发生,哪怕是一个非常成熟的程序员也没法把所有的非预期情况考虑完
小朋友,等你上学了,考试时就会发现,做错的题总是被判卷老师先发现
为什么这么多考生都发现不了自己的错题?
是因为他们都不想考高分吗?
自己写了个LLM生成的框架,结果采样之后每次输入的新token把之前所有的token都加上了,正确率居然还行,所以过了快半年才发现。。。改完之后正确率直接提高了一倍,速度提高了快10倍。。。
「程序员小漫画」 之 It's not a Bug, It's a Feature!


(禅道洋葱小漫画)
甲:这杯子只能装水么,能装其他东西么,比如我想装墨水。
我:可以的
甲:好的,成功装了墨水,但是,为啥杯子黑了,而且为啥后面装水,水有味道。
我:......
你是一个屠户,经营肉铺几十年,颇有家资,今天来了一个满脸横肉的壮汉,要十斤寸金软骨,细细的切做臊子
这有个有意思的图片


送礼物
还没有人送礼物,鼓励一下作者吧
这个问题如果是这样的,就好理解了。
程序员写完代码,做完自测,提交功能测试给QA,QA测试了一遍,发现有10个Bug,然后问程序员,
“你为什么总是发现不了自己的Bug?”
这个时候,程序员肯定会说,
“我要是能发现自己的Bug,还要你QA干什么?”
程序员并不是没有发现自己Bug的能力,而是他把自己发现的“Bug”,已经偷偷的修完了,剩下的Bug就靠QA来帮忙兜底了。
程序员既当开发,又做测试,行不行?
其实也行,很多初期互联网创业公司的产品,就是这么发布上线了,根本没有专业的测试人员,都是大家帮忙一起多用用,发现Bug再即刻改掉。
程序员写的代码功能,为什么一定要让其他人来帮忙测试和check?
主要有两个点。
一个是,程序员在写代码时,基本上都是带着既定的思路和逻辑。
程序员会按照自己预设的方式去构建程序,这时候的思维就像是进入了一条单行道,只能顺着自己最初的想法往下走。
当代码运行出现问题时,由于先入为主的观念,很难跳脱原来的思维框架去审视代码,也就很难发现代码里隐藏的“坑”。
这个可以理解为“当局者迷,旁观者清”。
还有一个是,一个项目的开发任务通常是有时间限制的。
程序员要在规定时间内完成所有的功能开发,精力会主要集中在实现功能上。为了赶进度,程序员也很少会花时间对代码进行全面细致的检查。
等到自己初步自测完,把代码交出去,经过QA的全面扫描之后,那些被忽视的Bug才会暴露出来。
程序员发现自己的Bug有“困难”,但程序员也会有一些应对方式。
比如,代码审查,让其他程序员帮忙检查代码,从不同的视角发现问题。
还有单元测试,通过编写测试用例,来验证代码的正确性。
不过这些方法不能完全杜绝Bug的出现。
所以,QA很重要,QA的存在也非常有必要。
以上,完。
送礼物
还没有人送礼物,鼓励一下作者吧
有一个更有趣的现象是,如果一个程序员做了个小工具给他人使用,如果是其他程序员就用得好好的,但是到了非程序员手中往往一上来就会出各种bug。原因应该是同为程序员对这个工具怎么做的有大概感知,会潜意识中保证自己的操作用法在作者考虑范围内,但非程序员就不一定了。
因为程序员永远都想不到客户的奇葩用法。
例如:给了客户瓶饮料,客户可能会打开瓶盖直接喝,也可能用吸管喝,但有的客户要用勺子喝,瓶口太小,勺子伸不进去,然后BUG就出现了。
“什么Bug,不能复现的就不叫Bug。”
“什么,你说你复现过?那你有截图和日志吗?”
“没有?还让我看看?你怎么证明这不是你眼花导致的呢?”
“没眼花?你怎么证明你没眼花?”
测试折腾半天复现了,还怼在你面前。
“复现了就复现了,程序有Bug是正常的,别吵,我在想问题。”
假装敲了敲键盘,回过头群里和领导汇报。
“赵哥,这个是一个偶现的bug,复现概率不高,原因是balabala,如果要改的话影响范围很大,得需要一周工时,我们要改吗?”
That’s not a bug. That’s a feature.
从几个方面说一下程序员要面对的问题:
情景一:《菜逼产品的业务》
客户:我要一辆4个轮子,加油就能走的东西
产品:客户要一台汽车!
程序员:发动机要多少马力的?
产品:(客户)要多少马力的 亲?
客户:什么是马力?
产品:(程序员)什么是马力?
程序员:就是动力,马力是单位!
产品:(客户)亲,就是动力的意思,马越多越好。
客户:那行,那我要两匹马的!
产品:(程序员)客户说要两匹马力的!
程序员:那也不是车啊,两匹马力什么都不够干的啊。
产品:客户咋说就咋弄嘛
----交付----
客户:你这有bug,这车装点东西就跑不动了!
情景二:《中级的产品经理》
产品:客户要一台两百匹马力的车,车身铸铁部分采用率达到百分之八十,还有要风阻最低的车身设计,汽油要92的,冰箱彩电都需要安排上...
程序员:嗯嗯,可以可以,人员调配也没有问题,技术也都可以实现。
----临近交付----
产品:计划有变,需求不变,但是去掉两个轮子。
程序员:摩托?
产品:不是,还是车,就是去掉两个轮子,明天上线。
程序员:怎么去?车架都是四个轮子做的,去掉两个车也不稳啊,平衡车?做的时候也没有考虑会改成平衡车啊,也没有重力感应,现在改太晚了啊?
产品:就去掉两个轮子这么费劲吗?那我不管,那是你们技术的问题。
----交付----
产品:你这有bug,这车根本停不住啊。
情景二:《测试》
程序员:从一地的黄豆里把绿豆挑出来的需求做完了,提测了看一下吧。
测试:好的。
程序员:(收到一条严重BUG)?我看看什么内容,放入一个黄瓜之后无法将黄瓜下的黄豆挑出。
程序员:这个BUG什么意思?需求说环境中只有平铺的黄豆和绿豆,怎么还弄个黄瓜进来啊?
测试:那谁也不能保证客户放个黄瓜进来啊。
程序员:那我们去问问产品看看需求吧。
产品:有道理哈,那再加一个识别绿豆和黄瓜吧。
测试:你这有bug,你这需求考虑的不全面。
程序员:你们不觉得这个《黄豆与绿豆》 的程序里出现一个黄瓜很奇怪吗?
情景四:《程序员眼里的bug》
1、两匹马力的车怎么开动那?
有了,减轻车的重量!
测试,车动了。
单体测试,有风,车上天了。
凸(艹皿艹 )车体太轻了,轮子改成硅胶的增加抓地力吧。
单体测试,通过。
交付,你这车拉不了东西啊。
两匹马力,拉你m。
2、四个车轮子改成两个轮子?
有了,两个轮子放在前面!
测试,车动了。
单体测试,车开快了,会翻过来。
凸(艹皿艹 )两个轮子不好保持平衡啊!在前面加动态配重车速越快配重越重就不会翻了。
单体测试,通过。
交付,你这车根本停不住啊,一停就往前翻。
这么短时间哪有那么全面的解决方案啊,再给点时间考虑进去就好了呀。
3、黄豆里去掉绿豆?
使用视觉软件进行RGB颜色转换,筛出来绿色多的部分并进行定位!
测试,绿豆被挑出去了。
单体测试,灯光昏暗的地方识别不出来。
凸(艹皿艹 )怎么还灯光情况不一样啊!加个灯光辅助,先处理明暗情况,保证环境可以识别黄豆绿豆。
单体测试,通过。
测试,这里要是放个黄瓜,黄瓜下的绿豆就识别不出来了。
程序员呆呆的看着《黄豆与绿豆》程序的标题陷入了沉思。
你以为的bug:
1+1=3
实际上的bug:
1+;ljjk;akpm 报错
1+一 报错
1+1?id=-1' union select 1,database(),3 --+ 报错
在前公司给进出口的文员做过一个脚本,其中一个功能是根据用户输入的发票号从局域网共享盘复制文件到本地,发票号是六位数字,一个发票号对应多个文件名中包含发票号的文件,我用发票号+通配符判断文件是否存在,存在的话再复制
交给文员测试,过了20分钟左右她跑过来说脚本还在运行,让我去看看,我过去一看差点吓死,她在发票号的位置输了六个星号,部门的文件都被复制了上万个了,问她为什么用星号测试不用已有的发票号,她说如果随便按几个字符,她习惯输星号
还好是复制不是剪切,在那之后,我写的所有脚本都会验证数据类型
其他的也就算了,你先告诉我“任意键”在哪里!?
[收藏本文] 【下载本文】
   科技知识 最新文章
百度为什么越来越垃圾了?
百度为什么越来越垃圾了?
为什么程序员总是发现不了自己的Bug?
出现在抖音评论区里边的算命真不真?
你认为 C++ 最不应该存在的特性是什么?
为什么 Windows 的兼容性这么强大,到底用了
如何看待Nvidia禁止使用翻译工具将cuda运行
为何苹果搞了十年的汽车还是难产,小米很快
该不该和AI说谢谢?
为什么突破性的技术总是最先发生在西方?
上一篇文章      下一篇文章      查看所有文章
加:2025-05-14 13:27:13  更:2025-05-14 14:26:21 
 
 
股票涨跌实时统计 涨停板选股 分时图选股 跌停板选股 K线图选股 成交量选股 均线选股 趋势线选股 筹码理论 波浪理论 缠论 MACD指标 KDJ指标 BOLL指标 RSI指标 炒股基础知识 炒股故事
网站联系: qq:121756557 email:121756557@qq.com  天天财汇