当前位置: 首页 > 编程日记 > 正文

程序员老在改Bug,就不能一次改好吗?

640?wx_fmt=jpeg

作者丨伍杏玲

来源 | 程序人生(ID:coder_life


程序员的日常三件事:写Bug、改Bug、背锅。连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含Bug。

但是真的有这么多Bug要改吗?就不能一次改完吗?

程序员听这问题后要拍键盘了,还!真!不!能!


用户使用场景的不确定性


在日常生活中,即便每个物品都有使用说明书,可一千个用户就有一千种使用方式。例如用诺基亚手机砸核桃,用iPad当切菜板,所以说程序是确定的,但用户的使用场景是不确定性的。

各种不按套路出牌的操作会给系统带来挑战,例如网上有个段子说:

一个人走进一家酒吧,要了一杯啤酒

一个人走进一家酒吧,要了一杯咖啡

一个人走进一家酒吧,要了0.7杯啤酒

一个人走进一家酒吧,要了-1杯啤酒

一个人走进一家酒吧,要了2^32杯啤酒 

一个人走进一家酒吧,要了一杯洗脚水

一个人走进一家酒吧,要了一杯蜥蜴

一个人走进一家酒吧,要了一份asdfQwer@24dg!&*(@ 

一个人走进一家酒吧,什么也没要 

一个人走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来 

一个人走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿 

一个人走进一家酒吧,要了一杯烫烫烫的锟斤拷 

一个人走进一家酒吧,要了NaN杯Null

一个人冲进一家酒吧,要了500杯啤酒咖啡洗脚水野猫狼牙棒奶茶 

一个人化装成老板走进一家酒吧,要了500杯啤酒并且不付钱 

一万个人在酒吧门外呼啸而过 

一个人走进一家酒吧,要了一杯啤酒 ';DROP TABLE 酒吧 

一个人跳进一家酒吧。 

一个人蒙着眼睛,倒退着走进一家酒吧。 

一个人走进一家酒吧,要了一杯美国啤酒,一杯德国啤酒,一杯比利时啤酒,一杯青岛啤酒。

一个体重五百吨的人走进一家酒吧。

一个酒量五百吨的人走进一家酒吧。

一个酒量为零的人走进一家酒吧。 

一个人走进一家酒吧,点了一杯啤酒,一边喝一边用指尖把啤酒逼出体内。 

一个人来到一家酒吧门口,拿出电脑,敲了几个命令,2^32 - 1 个测试工程师走进一家酒吧。 

一个人戴着墨镜,手持两把 Uzi 冲进一家酒吧,对着室内一顿扫射,然后要了一杯啤酒。 

一个人走进一家酒吧,要了一杯Nil,一杯Null和一杯None 

一个名叫exception的人走进一家酒吧,被丢了出来 。

我走进酒吧要了一杯">_ <”

我盗用老板身份走进了酒吧进了后台放了一瓶我自己的酒。

我走进酒吧在吧台放了一杯' or 1=1。

最后酒吧炸了。

软件设计中最大的现实是:设计难以完全覆盖现实。

一个简单的搜索框,测试用例高达几十个。可以说只要用户在使用系统,系统就存在Bug。

而程序员在编程时只能按照需求与经验覆盖大部分用户的使用场景,剩下的只能是见一个Bug灭一个。


需求的不确定性


之前有“AI都会编程了,要程序员干嘛”的言论,造成很多程序员产生焦虑纷纷要转行。

等等,说这话的人肯定没问过产品经理。

互联网公司的两大谎言一是程序员说的“没问题,上线吧”,二是产品经理说的“就按这个做”,现实是“我还要改几十版哦”。

产品经理自己没想明白需求要做成什么样子呢,在AI做出一个百分百正确无Bug的软件前,它学会给产品拍砖的可能性会更大。

随着产品不断迭代,不断增加的代码自带Bug时,还可能会给原有程序引入Bug。有时候涉及底层代码的修改,一旦出问题,有可能会带来多米诺骨牌效应。

还有时候是程序好好跑着,Bug从天上来。例如圣诞节阿里的Antd彩蛋Bug,又如在2005 年日本瑞穗证券的交易员输入错的股价,想撤销可被系统拒绝,导致造成400亿日元的损失。后来证实系统出Bug了,这个Bug是在2000年埋的。

所以很多公司会严格要求在程序修改后必须经过严格的回归测试,来验证对其他业务流程有没有影响。


程序员不是机器


程序员是人,不是机器,人做事是主观判断性去做的,再加上“禀赋效应”:心里头自动地给自己写的代码添一层滤镜,觉得自己写的代码没有问题,所以程序员总找不出自己的Bug。

这导致程序员日常的第四件事是:挖坑填坑。有人大手一挥,一大段代码不写注释,或业务方法不用公共定义,不拆分类,一个方法写了一千行,从此没人敢动这些烂代码。也有人默默地“感谢”前任给他有活干,一点点地将坑填上。

还有对开发流程的漠视也是导致系统Bug多的原因。有开发心想“我只是改了两行代码,不影响业务流程”,心想提给测试太麻烦了,便自顾上线了。

结果线上就出Bug了。

所以公司才设定各种软件开发规范来减少Bug的产生,例如提测前开发之间的Code Review和需经过测试人员的测试才能上线。

程序不是一蹴而就地做出来的,Bug也不是一时半会能改完的。毕竟“写程序不像是造一座桥,而是造一座城。”

(本文为 AI科技大本营转载文章,转载请微信联系原作者)


公开课预告


如何用AI技术为黑白老照片上色?本次公开课中,百度高级研发工程师李超将讲述对抗生成网络相关,学术界的研究现状和应用场景,以及GAN在百度视觉+百度PR+新华社合作的焕彩项目中的应用。


640?wx_fmt=png


推荐阅读

  • AI找Bug,一键快速预测

  • 春节停车难?用Python找空车位

  • Python告诉你:为何年终奖多发一元,到手却少两千多?

  • 送你一份春节看片攻略~

  • 原子互换:一统公链江湖的神来之笔

  • 春晚鬼畜 B 站日排行最高,赵本山:我的时代还没有结束!

  • “离开360时,它只给了我一块钱”

  • 5G大规模商用来临之前,你必须知道的几个知识点

  • 女程序员:我敲代码养家,老公负责貌美如花!


640?wx_fmt=png

相关文章:

一场库文件的远程修复

一场库文件的远程修复系统环境RHEL 4.7一、原因&#xff1a;发现每天早上7点1分备份的数据库文件时间不对&#xff0c;登录上去后date下发现时间是正确。二、尝试解决&#xff1a;1&#xff09;setup->Timezone configuration-> Asia/Shanghai保存后&#xff0c;发现由原…

linux驱动:音频驱动(四)ASoc之machine设备

linux驱动&#xff1a;音频驱动&#xff08;四&#xff09;ASoc之machine设备

Sql server Insert执行的秘密(下) 带外键的INSERT分析

2019独角兽企业重金招聘Python工程师标准>>> 这一篇分析一下带外键表的INSERT的例子。 本文所用的数据表结构如上图所示&#xff1b;其中Blog表上BlogID是自增的主键&#xff0c;并在CreateUserID和CreateTime列上分别建有两个非唯一索引。 我们要往Blog表中插入一…

熬夜写代码,不如换女装入GitHub获上千Star?

作者 | 琥珀出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;程序员如何以合规手段快速获得 GitHub 上千 Star&#xff1f;新年刚过&#xff0c;GitHub Trending 上一个名为“Dress”的开源项目迅速蹿红&#xff0c;并成功掀起了不少程序员及吃瓜群众的热议。项目地址…

CCNp笔记(EIGRP)

EIGRP<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />特性1属于混合路由协议具有距离矢量路由协议的特性&#xff0c;又有链路状态路由协议的特性。2属于高级距离矢量路由协议3快速收敛4保证100%无环路5增量更新6支持默认4条最多…

linux驱动:音频驱动(五)ASoc之codec驱动

linux驱动&#xff1a;音频驱动&#xff08;五&#xff09;ASoc之codec驱动

科大讯飞市值腰斩背后,AI产业集体思考如何落地?

作者丨郭敏本文经授权转载自钛媒体&#xff08;ID&#xff1a;taimeiti&#xff09;【导语】在过去的一年里&#xff0c;科大讯飞受到了多方质疑&#xff0c;质疑的声音不外乎盈利疲软、靠政府补助、技术优势逐渐变弱等&#xff0c;种种质疑背后&#xff0c;其实整个 AI 产业从…

zabbix系列之邮件告警(三)

设置邮件告警有两种方式&#xff1a;1&#xff09;、通过Linux自带的mail发送告警邮件2&#xff09;、通过第三方邮箱发送&#xff08;如QQ邮箱、163邮箱等&#xff09;告警邮件1、修改 zabbx_server.conf 文件,指定脚本路径&#xff0c;没有则添加[rootcentos1 ~]# vim /usr/l…

Python告诉你:为何年终奖多发一元,到手却少两千多?

作者 | shenzhongqiang来源 | Python数据与分析&#xff08;ID&#xff1a;ML_Python&#xff09;年终奖多发一元&#xff0c;到手却要少两千多&#xff0c;甚至更多。听到这个消息的时候&#xff0c;大家是不是觉得有点意外&#xff0c;意外之余还有点淡淡的忧伤&#xff1f;上…

[译]一个系统管理员眼中的DevOps

前言 原文发表在Patrick Debois大神的官网上&#xff0c;传送门>> 通篇围绕运维工作进行阐述&#xff0c;始终是在强调运维人员和开发人员需要通力协作&#xff0c;这大概也是DevOps理念的核心价值所在吧&#xff01;大概是因为作者来自比利时吧&#xff01;翻译的时候还…

linux驱动:音频驱动(六)ASoc之codec设备

linux驱动&#xff1a;音频驱动&#xff08;六&#xff09;ASoc之codec设备

屏蔽“网页上有错误”提示,屏蔽java script 错误的代码

<script>window.onerrorhide_error_message;functionhide_error_message(){returntrue;}</script>代码再简写一点&#xff0c;就是&#xff1a; <script type"text/java script ">window.onerrorfunction(){returntrue;}</script >原来只要让…

linux驱动:音频驱动(七)交叉编译alsa库及工具集alsa-utils

0、编译时用到的库 libunistring0_0.9.3-5_i386.deb libgettextpo0_0.18.1.1-5ubuntu3_i386.deb gettext_0.18.1.1-5ubuntu3_i386.deb 1、下载源码 alsa-lib-1.0.27.tar.bz2 alsa-utils-1.0.27.2.tar.bz2 一、交叉编译alsa lib 1、su 进入root用户 2、进入/home/MY/evm-lin…

Python一键转Java?“Google翻译”你别闹

作者 | 若名出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近日&#xff0c;Reddit 上有网友放出了一张疑似 Google 翻译添加了能让编程语言间互相转换的图片&#xff0c;立即引发数千名程序员网友的跟帖热议。图片显示&#xff0c;Google 翻译中添加了编程语言进行…

我所感兴趣的iOS10新特性

###SiriKit Siri API 的开放自然是 iOS 10 SDK 中最激动人心也是亮眼的特性。SiriKit 为我们提供一全套从语音识别到代码处理&#xff0c;最后向用户展示结果的流程。Apple 加入了一套全新的框架 Intents.framework 来表示 Siri 获取并解析的结果。你的应用需要提供一些关键字表…

如何将三万行代码从Flow移植到TypeScript?

作者 | David Gomes译者 | 弯月责编 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【编者按】在内存安全中&#xff0c;类型安全是很重要的一个命题。为了确保JavaScript项目运行的类型安全&#xff0c;本文的作者介绍了2016年时使用Flow的经历&#xff1…

CRM——插件流程回顾

1. Django项目启动 自动加载文件 制作启动文件1. 注册strak 在apps.py 类里面增加如下 def ready(self):from django.utils.module_loading import autodiscover_modulesautodiscover_modules("stark")2. 在已经注册的app中创建stark.py文件 加载2. 在stark中模仿Adm…

Linux驱动:TI达芬奇系列kernel中cup类型的判断,以cpu_is_ti81xx()为例

cpu_is_ti81xx() 为真 cpu.h (arch\arm\plat-omap\include\plat) 1、 # define cpu_is_ti81xx() is_ti81xx() # define cpu_is_ti814x() is_ti814x() 2、 #define IS_TI_CLASS(class, id) \ static inline int is…

IT人请注意你的身体![转]

IT人请注意你的身体![转]IT一直是很多人的梦想&#xff0c;外行的无数人挤破了脑袋想进这个圈子&#xff0c;在一般人看来&#xff0c;他们是时代的宠儿&#xff0c;他们可以不修边幅&#xff0c;他们工作时间可以身着便装&#xff0c;他们可以不受早九晚五的束缚&#xff0c;他…

WF4.0实战(六):控制WPF动画

这个例子改造了王晓冬老师的&#xff1a;用WF流程控制WPF动画。 本文用一个小例子演示了在WF中定义两个操作步骤,用来控制WPF页面元素的动画。王冬老师当时使用的是WF3.0,现在我改成WF4.0。 先看效果&#xff1a; 活动&#xff1a; 流程&#xff1a; 实现&#xff1a;实现很简单…

嵌入式学习:存储器总结

1、nor flash&#xff1a;NOR采用的并行接口&#xff0c;其特点读取的速度比之NAND快乐很多倍&#xff0c;其程序可以直接在NOR里面运行。但是它的擦除速度比较慢&#xff0c;集成度低&#xff0c;成本高的。现在的NOR的容量一般在2M左右&#xff0c;一般是用在代码量小的嵌入式…

10门必看的机器学习免费课程

整理 | 琥珀出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;文本将介绍来自全球10所著名学府的机器学习和数据科学领域的免费公开课程&#xff0c;范围涉及从入门机器学习到自然语言处理等。1、机器学习华盛顿大学链接&#xff1a;https://courses.cs.washington.ed…

golang实现给图片加水印

2019独角兽企业重金招聘Python工程师标准>>> 最近跟在写golang图片加水印的方法&#xff0c;这里用的是一些基本的功能。 package mainimport ("fmt""image""image/draw""image/jpeg""image/png""os" …

编译android不再需要jdk1.5

2019独角兽企业重金招聘Python工程师标准>>> 今天编译Android的时候发现jdk不是1.5都可以通过。 转载于:https://my.oschina.net/zengsai/blog/4103

来自程序员的福利!用Python做一款翻译软件

来源 | Ahab杂货铺&#xff08;ID&#xff1a;PythonLearningCamp&#xff09;前两天吃了平哥的一波狗粮&#xff0c;他给女朋友写了一个翻译软件&#xff0c;自己真真切切的感受到了程序员的浪漫。在学习requests请求的时候做过类似的Demo&#xff0c;给百度翻译发送一个post请…

海思3536:osdrv编译过程中报错及解决方法

1、安装交叉编译工具 1.1 cd toolchain/arm-hisiv300-linux/ 1.2 tar -xvf arm-hisiv300-linux.tar.bz2 1.3 修改cross.install&#xff1a;使用bash 1.4 sudo ./cross.instal 1.5 执行source /etc/profile&#xff0c; 安装交叉编译器的脚本配置的环境变量就可以生效了 2…

Vmware linux 无法上网

流程如下&#xff1a; 1)点击 VM->Settings Hardware选项卡下面 2&#xff09;点击Network Adapter 设置如下图所示&#xff0c;首先我们在虚拟机中将网络配置设置成NAT&#xff0c; 3、进入Windows操作系统&#xff0c;然后右键点击我们的电脑&#xff0c;进入到管理界面 …

编程25年后,现实将我打回菜鸟程序员的起点

在从事了 25 年的编程工作后&#xff0c;我却发现自己没有什么具体的东西可以展示给大家。我需要克服完美主义思想和对被批评的恐惧&#xff0c;向大家展示真实的自己。作者 | DeChamp译者 | 苏本如责编 | 仲培艺出品 | CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;下面…

MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

通过前面几篇&#xff0c;我们已经完成了内容类型&#xff0c;列表定义&#xff0c;列表实例的开发。本篇继续讲解列表中的一个重要环节——事件接收器开发。 我们的场景是&#xff1a;我希望之前做好的订单列表这个内容类型自动地具有某些事件特征&#xff0c;例如当用户在添加…

海思3536:kernel编译和mpp_single编译过程报错及解决方法

### 1、编译kernel 1.1 cd kernel/linux-3.10.y 1.2 cp arch/arm/configs/hi3536_full_defconfig.config 1.3 make ARCHarmCROSS_COMPILEarm-hisiv300-linux- menuconfig 1.4 make ARCHarmCROSS_COMPILEarm-hisiv300-linux- uImage 1.4.1 弹出选择板子型号&#xff1a;39&…