A. 为什么每个程序都会有bug
这个涉及到高级的悖论,人是制造部出来完备的体系的,所以书写的程序系统一定有BUG,不论你这么修复中是会产生新BUG
B. 程序员为什么要一直改bug 不能一次性写好吗
程序写代码就像造一座大楼,如果即便经过严格的设计论证,装配高质量的部件,最后还有系统性地验收,让你去造这么一座大楼,你能保证不管是窗户安没安好,还是地基挖浅了挖深了,还是墙皮脱落,都一个问题没有?
回想早年的小程序,执行某一个具体的任务,明确的输入输出,一般是不会有bug的。
但现在的软件开发,早就已经不是一个人在战斗了,大部分的工程,开发规模5人左右居多,另外稍大的软件工程动辄几十人,更有甚者几百人的团队规模并行作业。你试想一下,要保证这么多人的产出都符合设计要求,势必需要合适的开发流程,需要更多的项目管理的技巧和方法。这就对个人以及团队的提出了非常高的要求了。
软件工程的方法论中,要求软件开发者尽可能多地在软件测试阶段发现bug,而不是交付之后。
但是楼主说的能不能让软件开发出来没有bug,我觉得把下面这几个事情做好,还是有可能的。
1、花尽可能多的时间,和客户沟通软件需求,了解每一项需求的用意。
2、确保软件需求不能随意变动,因为很多情况下一个需求的变化,程序会带来很多问题,有可能连底层结构都需要跟着一起变动。频繁的需求变动,加上开发周期和成本的约束,带来的结果就是软件质量的不可控。
3、确保软件测试质量,完成全覆盖测试,设计系统需要的全部用例并保证全部通过。
总结下,软件项目在实际开发过程中风险点还是很多的,通过合理的控制,可以降低和减少bug。但是软件本身是为人的需求而生,只要需求在变化,软件是永远都需要跟着去维护和更新的,所以只要有不可控的因素(需求分析,系统设计,系统详细设计,编码,单元测试,集成测试,系统测试,验收等)任何一个环节任何一个人产生问题,反映到最后的软件产品上就是一个bug。
另外Bug分很多类,一类是对用户来说不能正常使用,能被用户感知到的错误。一类是用户能正常使用,但是有各种异常的错误。一类是使用没有任何问题,但是不符合产品预期的问题。其他应该还有很多,这里我们一一讨论。
对用户来说不能正常使用,能被用户感知到的错误。
其中一种情况是程序员和测试人员的问题,所有功能在上线前,工程师和QA人员应该测试,回归完功能。能被用户感知到使用流程有问题的话,一定是相关人员能力或者线上意识某一方面欠缺,也是最不能容忍的。
另外一种情况是黑天鹅事件,什么网线被挖断,机房被炸,服务器爆炸什么的。。。。。。 ,这个说实话,出了在软件架构上做冗余,目前没有什么特别好的办法。
2. 用户能正常使用,但是在用户看不到的地方有各种异常的。
一个功能模块几乎不可能是独立的,它必然牵扯到其他模块。对于你所依赖的模块,你没办法保证这些模块是100%可用的。这个时候可能虽然有错误,但是只要不影响主要流程,我们依然可以正常使用。但这个时候对于外部依赖的异常处理,很考验工程师的能力。
举个例子,有可能你看到的点赞数比你实际收到的点赞数少。这个是由于点赞统计在什么时候失败了一次,某些用户可能认为这个是bug,但是其他可能不会在意(当你有10001赞的时候,你在意少了1个么?)
3. 使用没有任何问题,但是不符合产品预期
这个更多的是研发和产品经理对于需求理解的不一致。因为文字是有二义性的,况且人和人对相同文本的理解本来就可能出现偏差,这就导致了需求理解的不一致,最终导致了线上产品不符合预期。对于内部人员来说,这个也算BUG。
说了那么多,最主要的核心在于实现功能的是人。人不像机器,不可能不犯错;同样的,不可能存在没有bug的程序,像大家使用的windows,穷尽无数优秀的工程师,给予用户优秀的桌面体验的同时,也有你可能完全看不到的数千个bug。想要完全避免几乎是不可能的。所有也不存在一次性就写好的情况,鬼知道产品经理什么时候改需求呢~
C. 为什么软件里总会有那么多Bug
1. 人的天性
大多数——当然不是全部——软件 bug 源于我们自己犯的错误。虽然有些是因为软件编码工具和编译器发生了意外,但是大部分的错误得归咎于我们自己。
无论我们受到的 SDL 培训和安全工具有多么强大,只要我们还是人,我们就会犯错。如果你想问为什么电脑软件会有这么多的漏洞,归根到底是因为,人的天性就是容易犯错。
也就是说,我们在减少人为错误方面做得还不够。有很多程序员因为没有受到足够的 SDL 培训(有的甚至干脆就没有培训),所以根本就没有安全编程的理念。有时候我特别奇怪:有那么多的程序员以写安全软件为生,却居然不懂如何安全地编程。别不信,我敢打赌,你正在运行的银行安全软件中的 bug 不会比它能提供的保护措施少,搞不好甚至更多。
但是即使是那些经过严格训练的程序员还是不可避免出现 bug。举个例子,前不久有个自鸣得意的家伙发明的使用 HTML 标记字段确定颜色的缓冲区在浏览器中溢出了。不像以前还要输入 FFFFFh 之类的东西,黑客甚至可以直接执行颜色域的代码,从而导致浏览器过度消耗资源、缓冲区溢出。看到没有,这就是漏洞!而且很少会有人能预料到这种情况。
2. 不断增加的软件复杂性
就其本质而言,软件越复杂,就意味着代码行数越多。只要你在编程,那么即使你有多擅长写代码,也一定会有错误和 bug 出现。有人曾说,如果你能做到每 50 行代码中只出现一个错误,那你就已经做得相当好了。大多数程序员差不多每隔 5 至 15 行就会犯错。想象一下,这么说吧,一般性的 Linux 内核拥有超过 1500 万行的代码,有多少 bug 你自己算吧!
即使没有编码错误,互联网时代应用程序的整体互动性也是漏洞被攻击的途径。大多数程序员不得不和其他 API 协作,保存和检索文件,在多种设备上正常工作。所有这些过程都会增加被成功击破的概率。
而要防守的话,则需要写更多的代码,因为得抵御各种不同的攻击渠道。这么说吧,如果有一个只有 30 条汇编语言指令的恶意程序,那么针对相应的防守,你可能至少得写 50000 条汇编语言指令!
3. Fuzzers 也是人写出来的
新近冒出来的 Fuzzers 软件主要用于扫描软件漏洞。Fuzzers——以及其他用于寻找编码错误和漏洞的任何程序——都是人写出来的,还是这句话,是人就会犯错误。例如 Fuzzers 是不会发现颜色属性的缓冲区溢出这种情况的,这是因为我们在写 Fuzzers 的时候没有考虑这一方面。不过当我们意识到这一点并对 Fuzzers 进行更新之后,就能做到去查找各种类似的缓冲区溢出条件的字段。简而言之,我们要 Fuzzers 做什么,它才会去做什么。
4. 缺乏对供应商的问责
许多安全专家抱怨,只要我们不能找到证据起诉供应商的软件缺陷,我们就永远不会变得更安全。我赞同这一点,增加对供应商的问责有助于降低安全风险,但是同时却有可能会减缓进度。不过如果软件公司比现在更能担当起责任来,那么我想我们能在手机上、电脑上能自由自在冲浪的感觉会更爽。
但是成功源于功能和速度,而非安全。社会现状决定了我们必须牺牲一部分安全和保障去换取新鲜感。这不一定是坏事——因为能让我们成功得更快。但是这样一来我们就不得不承担这样做的后果。不过到目前为止,我们还是心甘情愿为了添加更酷的新鲜玩意儿而面对更多的风险。
5. 缺乏对黑客的问责
现实是上面没有一条能很快解决。但是软件出现漏洞就其本身而言,真不是什么大问题。说它脆弱是因为这些软件在面对恶意攻击的时候毫无抵挡之力。除非我们能制止黑客的猖獗行径,否则恶意软件将会一直困扰着我们。
D. 程序员为什么要一直改bug,不能一次性写好吗
软件可能在使用过程中没有任何问题,但不符合产品的预期下图源自“How projects really work?”,很形象的突出了客户需要的产品和最终得到的产品不一致。
所以软件想要变得成熟,Bug收集和处理机制是非常有必要的,比如:会影响客户使用的优先级高的Bug要优先修复。Bug是软件的影子,也是程序员的噩梦实际上不能存在没有bug的软件,Bug和软件如影随形。就像我们使用的Windows,穷尽无数优秀的软件工程师来设计给用户优秀的桌面体验,但也有各种层出不穷的bug。
程序员对Bug有多爱就有多恨,Bug无处不在,即使再牛逼的程序员也逃脱不了Bug的魔掌。想要完全避免Bug几乎是不可能的,所以也不在一次性就写好的程序。以上个人浅见,欢迎批评指正。认同我的看法,请点个赞再走,感谢!喜欢我的,请关注我,再次感谢!
E. php程序员写的代码为什么总有bug
弱类型以及即编即译等等灵活的特性,注定PHP必须要有牺牲一定的稳定性的前提来达到。换句话说,通常JAVA中一些BUG可以通过编译机制可以尽早的扼杀早摇篮之中,即使是运行期的错误,也可以通过编译机制找到。同时,强类型语言的严谨的代码编写风格,也不容易出现由弱类型语言中那些让人又爱又恨的类型自动转换发生的意想不到的行为。
最终,我可以认为PHP为了快速开发,做出了他应有的牺牲。把更多的代码控制权力交给程序员,而不是交给机器,这也意味着代码的有效性考验着作为程序员本身的编程能力。更可能是程序员本身对编程思想的理解程度。不过,PHP大多数都是用来开发web站点,而且还有很庞大的社区,以及许多优秀的框架,这些都可以帮助PHP程序员在开发中减少不必要的麻烦。
BUG不可避免,BUG与否决定在你!
个人经验,少年,你如果要开发应用的话,这个年代不用框架,就等于自己为自己增加N倍的难度。在下推荐几款框架给你吧:
LARAVAL (强力推荐),YII,codeigniter.......
F. 程序bug出现的原因是什么
原因是多方面的,比如程序逻辑不严谨、程序变量类型设置不当、程序算法不完善等。
G. 软件存在bug是程序员把代码打错了造成的吗
从你的描述来看,软件存在bug,不是程序员把代码打错了,而是代码设置不合理,比如需求不合理,软件的操作上,设计上原本就存在逻辑漏洞,多个单体能够正常工作的模块结合到一起产生问题,异常场景没有考虑到等等,很多原因都可能产生bug。
H. 为什么总有无数的Bug困扰着程序员 – 码农网
下面就是为什么我们的软件之所以依然充满漏洞的5大原因:
1.人的天性
大多数——当然不是全部——软件bug源于我们自己犯的错误。虽然有些是因为软件编码工具和编译器发生了意外,但是大部分的错误得归咎于我们自己。
无论我们受到的SDL培训和安全工具有多么强大,只要我们还是人,我们就会犯错。如果你想问为什么电脑软件会有这么多的漏洞,归根到底是因为,人的天性就是容易犯错。
也就是说,我们在减少人为错误方面做得还不够。有很多程序员因为没有受到足够的SDL培训(有的甚至干脆就没有培训),所以根本就没有安全编程的理念。有时候我特别奇怪:有那么多的程序员以写安全软件为生,却居然不懂如何安全地编程。别不信,我敢打赌,你正在运行的银行安全软件中的bug不会比它能提供的保护措施少,搞不好甚至更多。
但是即使是那些经过严格训练的程序员还是不可避免出现bug。举个例子,前不久有个自鸣得意的家伙发明的使用HTML标记字段确定颜色的缓冲区在浏览器中溢出了。不像以前还要输入FFFFFh之类的东西,黑客甚至可以直接执行颜色域的代码,从而导致浏览器过度消耗资源、缓冲区溢出。看到没有,这就是漏洞!而且很少会有人能预料到这种情况。
2.不断增加的软件复杂性
就其本质而言,软件越复杂,就意味着代码行数越多。只要你在编程,那么即使你有多擅长写代码,也一定会有错误和bug出现。有人曾说,如果你能做到每50行代码中只出现一个错误,那你就已经做得相当好了。大多数程序员差不多每隔5至15行就会犯错。想象一下,这么说吧,一般性的Linux内核拥有超过1500万行的代码,有多少bug你自己算吧!
即使没有编码错误,互联网时代应用程序的整体互动性也是漏洞被攻击的途径。大多数程序员不得不和其他API协作,保存和检索文件,在多种设备上正常工作。所有这些过程都会增加被成功击破的概率。
而要防守的话,则需要写更多的代码,因为得抵御各种不同的攻击渠道。这么说吧,如果有一个只有30条汇编语言指令的恶意程序,那么针对相应的防守,你可能至少得写50000条汇编语言指令!
3.Fuzzers也是人写出来的
新近冒出来的Fuzzers软件主要用于扫描软件漏洞。Fuzzers——以及其他用于寻找编码错误和漏洞的任何程序——都是人写出来的,还是这句话,是人就会犯错误。例如Fuzzers是不会发现颜色属性的缓冲区溢出这种情况的,这是因为我们在写Fuzzers的时候没有考虑这一方面。不过当我们意识到这一点并对Fuzzers进行更新之后,就能做到去查找各种类似的缓冲区溢出条件的字段。简而言之,我们要Fuzzers做什么,它才会去做什么。
4.缺乏对供应商的问责
许多安全专家抱怨,只要我们不能找到证据起诉供应商的软件缺陷,我们就永远不会变得更安全。我赞同这一点,增加对供应商的问责有助于降低安全风险,但是同时却有可能会减缓进度。不过如果软件公司比现在更能担当起责任来,那么我想我们能在手机上、电脑上能自由自在冲浪的感觉会更爽。
但是成功源于功能和速度,而非安全。社会现状决定了我们必须牺牲一部分安全和保障去换取新鲜感。这不一定是坏事——因为能让我们成功得更快。但是这样一来我们就不得不承担这样做的后果。不过到目前为止,我们还是心甘情愿为了添加更酷的新鲜玩意儿而面对更多的风险。
5.缺乏对黑客的问责
现实是上面没有一条能很快解决。但是软件出现漏洞就其本身而言,真不是什么大问题。说它脆弱是因为这些软件在面对恶意攻击的时候毫无抵挡之力。除非我们能制止黑客的猖獗行径,否则恶意软件将会一直困扰着我们。
但是我依然深信,将来有一天我们的互联网会有更好的普遍标准出台,我们能在现实中及时地将那些损害大家利益的家伙绳之以法。不过在此之前,我们还是得不断地写补丁,在黑客的狂轰滥炸下苟延残喘。
I. 有哪些事情是程序员都知道,但大多数人不知道
1. 原来Bug是永远改不完的程序员的日常三件事:写Bug、改Bug、背锅。调侃程序员时,就经常会说:“哟,又在写Bug。”。
文章图片2
图片来源于网络,如有侵权请联系作者删除
2. 原来程序员工作后不继续学习是要被时代淘汰的互联网行业作为高薪行业之一,与其他行业不同,它的入行门槛低,赚钱快,只需要会写代码就能入行。许多年轻人受到“高薪诱惑”,纷纷涌入程序员这个赛道,让这个本来就很拥挤的行业竞争变得更加激烈残酷。
文章图片3
图片来源于网络,如有侵权请联系作者删除
3. 原来程序员不能一直死磕技术在互联网行业,技术虽然是核心竞争力,但是技术永远是为业务服务的,两者结合最终才能创造出价值。作为一名程序员,技术固然很重要,只有对算法进行了深刻理解、掌握了数据结构、数据库、操作系统等知识,才能做出改变整个行业工作方式的框架出来,甚至连产品设计、业务功能都要凭借技术才能做到。
4. 原来程序员不穿格子衫、头发黝黑曾经流行这样一种说法:程序员支撑起了全世界的格子衬衫产业。一个程序员必备的四件套:格子衫、黑框眼镜、牛仔裤、运动鞋。
文章图片4
图片来源于网络,如有侵权请联系作者删除
5. 原来程序员只是一份普通的职业每个程序员都只是普普通通打工者的一员,每天要面对脑力和体力的双重暴击,如果不小心编写出了错误的程序,就会看到满屏的错误警告。还有,不是每个程序员逻辑都很好……作为程序员,经常面对被人误解的丧、还要保持懒得辩解的忍……
文章图片5
图片来源于网络,如有侵权请联系作者删除
6. 程序员其实可以朝九晚六不加班。
7. 很多时候体力活大于脑力活。
8. 很多时候处于底层,相对于业务方,产品,测试等等。
9. 挥洒代码大多数时候都是复制粘贴。
10. 大多数bug不是代码问题,是用户环境或者网络原因。
文章图片6
图片来源于网络,如有侵权请联系作者删除
11. 有些人就等着被辞退,然后重新找工作,既涨工资又拿补偿。
12. 上班时间是上班时间,下班时间是自己时间,拉屎喝水尽量在上班时间干。
13. 看到网上有公司老板问问题,加班之类的,记录下公司名,保存到黑名单,绝不入坑。
J. BUG的来历
所谓“(Bug)”,是指电脑系统的硬件、系统软件(如操作系统)或应用软件(如文字处理软件)出错。硬件的出错有两个原因,一是设计错误,一是硬件部件老化失效等。软件的错误全是厂家设计错误。那种说用户执行了非法操作的提示,是软件厂商不负责的胡说八道。用户可能会执行不正确的操作,比如本来是做加法但按了减法键。这样用户会得到一个不正确的结果,但不会引起bug发作。软件厂商在设计产品时的一个基本要求,就是不允许用户做非法的操作。只要允许用户做的,都是合法的。用户根本就没有办法知道厂家心里是怎么想的,哪些操作序列是非法的。
从电脑诞生之日起,就有了电脑BUG。第一个有记载的bug是美国海军的编程员,编译器的发明者格蕾斯·哈珀(Grace Hopper)发现的。哈珀后来成了美国海军的一个将军,领导了着名计算机语言Cobol的开发。
1945年9月9日,下午三点。哈珀中尉正领着她的小组构造一个称为“马克二型”的计算机。这还不是一个完全的电子计算机,它使用了大量的继电器,一种电子机械装置。第二次世界大战还没有结束。哈珀的小组日以继夜地工作。机房是一间第一次世界大战时建造的老建筑。那是一个炎热的夏天,房间没有空调,所有窗户都敞开散热。
突然,马克二型死机了。技术人员试了很多办法,最后定位到第70号继电器出错。哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。”
从此以后,人们将计算机错误戏称为虫子(bug),而把找寻错误的工作称为(debug)。