⑴ 为什么程序会有bug
所谓“(Bug)”,是指电脑系统的硬件、系统软件(如操作系统)或应用软件(如文字处理软件)出错。硬件的出错有两个原因,一是设计错误,一是硬件部件老化失效等。软件的错误全是厂家设计错误。那种说用户执行了非法操作的提示,是软件厂商不负责的胡说八道。用户可能会执行不正确的操作,比如本来是做加法但按了减法键。这样用户会得到一个不正确的结果,但不会引起bug发作。软件厂商在设计产品时的一个基本要求,就是不允许用户做非法的操作。只要允许用户做的,都是合法的。用户根本就没有办法知道厂家心里是怎么想的,哪些操作序列是非法的。
从电脑诞生之日起,就有了电脑BUG。第一个有记载的bug是美国海军的编程员,编译器的发明者格蕾斯·哈珀(Grace Hopper)发现的。哈珀后来成了美国海军的一个将军,领导了着名计算机语言Cobol的开发。
1945年9月9日,下午三点。哈珀中尉正领着她的小组构造一个称为“马克二型”的计算机。这还不是一个完全的电子计算机,它使用了大量的继电器,一种电子机械装置。第二次世界大战还没有结束。哈珀的小组日以继夜地工作。机房是一间第一次世界大战时建造的老建筑。那是一个炎热的夏天,房间没有空调,所有窗户都敞开散热。
突然,马克二型死机了。技术人员试了很多办法,最后定位到第70号继电器出错。哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布帖到“事件记录本”中,并注明“第一个发现虫子的实例。”
从此以后,人们将计算机错误戏称为虫子(bug),而把找寻错误的工作称为(debug)。
⑵ 为什么老程序员的效率如此高
程序员老师傅的解决问题能力要比初级甚至是普通的程序员都要高出很多倍,所以每个软件公司都会在保留1,2个经验丰富的资深级软件工程师,这样在遇到项目或者产品难点的时候能够力挽狂澜,这种水准的程序员也是很多公司追求的对象,而且和年龄没有太直接的关系,编程最终的就是给出解决问题的方案,从解决问题的角度出发解决方案还是非常多,但是在不同的人会给出不同的解决方案,但是有经验的程序员在解决问题的时候就会思考的比较多,不容易导致引入新的问题。
编程能力最直接的表现不是写代码的能力,因为随着时间的推移时间积累够了代码能力自然就上去了,很多程序员在工作多年之后虽然代码能力得到极大的提升,但是还是不具备独立的框架或者功能复杂的模块设计能力,所以很多人在工作多年之后工资一直不能得到上涨,这是主要原因编程的关键还是思路问题,关键点还是在于有正确的解决问题的思路,思路的切实性是需要经过项目实战的积累。
所以优秀的程序员一定是身经百战的经历过项目的洗礼,只有经历过项目才能真正意义上懂得编程是怎么回事,而且每次经历的项目都能够获取足够多的营养出来,越是优秀的程序员经历过项目之后知识体系构建越是完善,越是老程序员越是觉得程序深奥之初,所以老程序员轻易不动手都会思前想后把事情搞明白之后才去真正动手,所以讲老程序员真正动手写代码的时间还是非常短,大部分的时间都是在构思其可行性,真正动手的时间会非常短所以大家看到老程序员大部分的时间都是在看代码或者看一些资料,甚至有些人很少看到老程序员在大块的时间写代码。
越是老程序员对于编程语法看的越是淡薄,编程语言到了一定层面就是工具般的存在,就是为了编程思想服务,如果还在为了编程功能实现代码而烦恼证明了还在初级的学习阶段,度过了这个阶段之后就要考虑如何驾驭架构以及如何锤炼自己的编程思想了,编程的学习过程是需要循序渐进的不要觉得距离自己老程序员有非常遥远的距离,从开始入行就要慢慢去积累不断打磨自己的思想,希望能帮到你。
25年老程序员,20年CTO,来解答一下:
1、经验、教训使然,所谓亏吃多了,也就不吃亏了。
2、长久工作,养成了一定良好的习惯。
3、代码量到一定程度,自然而然会更熟练。
4、一些非技术的经验知识,还是需要时间来积累。
5、老程序员的思维经过多年的训练,更有利于直达本质。
6、他们的方案可行性更高,这样减少返工。
7、代码质量高,测试通过率高,考虑的因素更周全。
8、代码改起来更容易,找问题也相对容易。
9、对任务的理解更全面,能够从更多的角度去设计程序,权衡效率、速度、性能、扩展性等各方面的因素。
10、也不是所有的老程序员都能这样,这个还是跟这人的学习能力有关系,所以大家是能3年变成老程序员,还是10年,就看自己的个人努力了。
在IT编程开发的过程中,老程序员开发的效率会非常高。比如:一个网站模板,新程序员可能要花上一个星期的时间才可以完成,而老程序员却可能只需要1-2天就可以做好。这是为什么?莫非他们天生就有神相助。非也,这所以会这样,据我分析,主要有以下几点。
因为长期的编写代码,所以,会碰到非常多的问题,然后就会去解决这些问题,这就让老程序员有了丰富的实战经验。反观新程序员,碰到一个问题,因为以前没碰到过,所以要花大量时间去解决。而老程序员碰到问题,因为以前解决过,所以,很快就会弄好。
在IT编程中,很多的代码都是可以用来搬运的。因为长期的工作,老程序员会把一些功能代码记录或储存下来,以备后期使用。也就是说,他们就像记笔记一样,把一些功能代码记下来,以备不时之需。所以,在新的编程中需要用到时,他们就可以直接拿来就用,自然效率就高,开发就快。
老程序员在编写代码时,一般都会对代码的规范和格式比较重视,使用代码清晰有条理,阅读代码时就不费力气,而且还会做好每个功能代码的注释。这样,不管是对现有开发,还是对后期维护,都是非常有利的。如有代码出现bug,可以很容易地找到,这同样节省了大量的时间。
老程序员在编写代码时,会先从大处着手,把大的框架给弄好,然后,再对整个编程的细节有针对性地编写。这就好比开发一个高楼大厦,开发商会先把主体框架搭建好,然后,再一层一层地去弄每一层楼的细节。这样,往往目标会更加清晰,只要按步就班地执行计划,就可以很快完工。
熟能生巧
为什么老程序员的效率如此高?
首先, 敲代码的效率 != 工作效率
并不是老程序员效率就高,而是程序员要提高效率需要一些方法,这些 方法的学习和掌握需要一定的时间 ,结果就是老程序员的效率会相对要高一些。
所使用的编程语言的熟练程度我经常会看到一些新手程序员在写代码的时候需要频繁的去查看文档或者是网络搜索各种接口的用法,有时写一个功能要查个几十次,很多时间都浪费在了搜索上,真的写代码的时间很少。
而一个在这门语言浸淫了几年甚至是十几年的程序员,对这些接口了若指掌,使用的时候信手拈来,还知道接口里面的实现机制,可能会碰到哪些坑也一清二楚,减少了很多bug的出现。
你是不是有把那些接口拿出来反复琢磨,去研究它的源码,认真地了解它呢?
对编程工具的掌握程度工欲善其事,必先利其器。
一个好的编程工具有很多可以帮助程序员减少工作量的功能,比如代码重构、自动格式化、语法检查、代码提示和补完等等,掌握这些也能大大提高开发效率。
随着IDE的发展和进步,现在很多工具都不需要太复杂的学习就可以操作,所以这个是一个投入小而回报很高的事。
业务需求的熟悉程度代码是为业务服务的,我们首先得理清楚业务逻辑,才能知道要怎么写代码,而新手对业务不熟悉的时候,光是弄明白业务需求是什么可能都需要不少时间,有时候还可能会错误理解需求,导致写出的代码文不对题,只能重写。
所以多思考,多问,多讨论,不会花太多时间却会减少很多时间的浪费。
调试的效率写出来的代码还需要经过测试,如果有bug就需要调试了。
很多新手只重视写代码的工作,对于怎么调试却忽略了,有的人甚至只会使用打印功能一步步通过排查找bug,并且对写出来的代码没有概念,连bug大概可能在什么地方也不清楚。
老练的程序员不只是靠打印,有时候只看报错信息就能知道bug大概在什么位置,配合上打印还有断点功能很快就可以找到bug的位置,更不要说他们很清楚怎么写出容易调试的代码。他们会在写代码的时候就对可能出问题的边界条件进行检查,并且会利用自动化测试来减少工作量。
写代码之前的构思新手很容易犯的一个错误就是拿到功能需求马上就开始写代码,可能写到一半会发现前面的代码有问题需要推翻重来,或者是写错了方向。
老程序员写代码之前会先进行构思,把功能需求拆解,分成不同的小模块,甚至会在纸上把这些想法画下来,基本上在这一步就把问题已经解决了,写代码只是把解决方案用代码表达出来而已。
所以,如果你也想做一个十倍程序员,记得不要只是埋头写代码,还要刻意去练习这些提高效率的好方法!
在写代码前,代码差不多已经刻在脑子里了,写代码的时候,总觉得双手敲键盘的速度赶不上脑子的速度,写出的代码几乎不需要调试,你说效率高不高?
因为老程序员经历多了,一些常规性的BUG基本不会出现,对用户需求也能做到最大的完善,还有对需求增加和修改有个大概了解,会提前预留接口和模块,还有对用户的硬件有了解,在程序上会有相对优化。所以老程序员写的程序不一定美观,也不一定最简化,但是可能是最合适的,可惜中国的程序员刚成熟就要面临失业。年轻的程序员啥都不懂,片面追求性能,美观简洁的程序,在兼容性和实用性上大打折扣,不顾用户的使用情况和硬件情况,项目一上线问题多。
老程序员分为两种,一种是年纪老,常常被换做“老X”,一种是能力老,常被人换做“x老师”。
老程序员之所以效率高,离不开几点:
程序员是一份高强度的脑力工作,能成为老程序员者,智力,体力无一不是同龄人中佼佼者。能够更加效率的工作自然是理所应当,方符合家有一老,如有一宝的普世价值。
祝广大码农早日修炼成为这样的老程序员。
老程序员,码代码速度并不见得比年轻人快。但老程序再面对需求时,能很快抓住技术关键点,难点,重点,如何突破都了然于胸。当出现问题,老程序员有经过实践的诊断定位排错的逻辑思路与手段 。其实这些熟能生巧是一方面,学习与实践 领悟是另外的方面。年轻人观察能力强 悟性高,也会青出于蓝
老成员就是图书馆,硬盘存满了各种经过调试且运行过的程序,只需要复制粘贴,效率肯定高
⑶ 为什么总是有清不完的bug
为什么总是有清不完的bug?现代网络上面存在很多不同bug,这让很多人不是很理解,因为网络技术越来越成熟,按说应该bug越来越少,可是看起来似乎越来越多,其实这里面有很多原因,只不过很多人不熟悉网络运行知识,下面给大家具体解释一下:
三、网络时代相互攻击,从而造成了很多bug:
目前互联网之间攻击的事情很多,国家之间都会相互指责,因此也会产生很多侍搭手bug,这也是bug,无法控制的一个重要因素。
⑷ 程序员遇到百度不出来的bug都是怎么解决的
笔者不同意下面网友的回答。程序员如果解决bug的水平停留在网络,那么本质上只是一个“面向搜索引擎的代码搬运工”,是不合格的程序员。
程序员对面bug,正确的“打开方式”是像福尔摩斯和柯南那样,寻找线索、运用逻辑推理来缩小问题可能的根因范围,最终精准定位。
常用的方法有:
1. 坏境上下文变换法
2. 工具调试法
3. 版本回溯对比法
4. 代码审计法
……
没有编程问题是stack overflow和Google解决不了的,假设你在编程中遇到了问题,你自己解决不了、你周围的的人都解决不了的时候,我觉得stack overflow、Google是你最好、也是最后的帮手。
作为一个程序员,我觉得Google、stack overflow是你必须要学会使用的两个工具,这两个工具本身并没有使用门槛,只不过因为一些众所周知的原因,很多人不能使用Google和stack overflow这两款工具。
Google主要还是方便,而且很多编程问题都需要用到英文搜索,当然现在网络在专业能力上也提升明显,不过跟Google也还是有比较大的差距,因此我还是强烈建议要学会使用Google,这会帮你在工作、学习上事半功倍。假设Google确实因为某些原因没办法很好的使用,我也建议你至少要会使用Bing搜索。
现在可以说stack overflow上没有你找不到的问题了,从IDE环境安装问题,到各类编程语言问题。算法问题,数据结构问题,调试,重构等等,几乎这里就没有你找不到的答案,可以说在stack overflow上你可以找到任何解决方案,并且上面的回答者基本上都是非常有经验,而且都是实际中遇到的问题分享出来的,这个工具一定要会使用。同理,除了stack overflow这个专业的垂直程序员问答社区,你也可以使用Quora这个综合问答社区,这上面也能找到很多问题的答案。
一些比较优秀的文本编辑器: Emacs/Vim,Visual Studio Code,Sublime Text,Atom,Ultraedit,Hbuilder等。
一些比较非常出色的IDE集成开发环境: visual studio,IntelliJ IDEA,PhpStorm,Haskell for Mac ,eclipse,WebStorm,GoLand,CLion,Android Studio,Xcode,QT等。
macOS平台比较好的第三方包管理工具: Fink,Macports,Homebrew等。
一些比较好的终端工具: Zoc7,iTerm2,Cmder,terminus,hyper等。
一些比较好的笔记软件、markdown工具、效率工具: Evernote,有道云笔记,为知笔记,Ulysses,MWeb,FileZilla,Snipaste,Kantu等。
虚拟机软件、容器软件: Parallels Desktop,VMWare Fusion,Virtual Box,Docker等。
我是个程序员,职务是linux底层驱动工程师。平时的主要工作是调试驱动,但产品遇到诸如死机、重启、不开机之类的问题时,也要参与查找原因。一部分问题,确实可以查看相关的log,然后网络这些log的关键字来解决;但更多的问题,牵扯的条件太多,并不是简单的网络就能解决的。
观察了周围同事们的做法,我总结出以下几种解决方法:
网络因为竞价排名的原因,搜索出来的结果有很多广告的成分,所以有时候要翻好几页才能看到一条相关的答案,有些甚至要翻几十页。
因为网络搜索使用的是SEO技术,即普通用户可以通过优化网站内容来提升关键词排名。
而这就会导致一个问题:你搜索关键词后展现出来的结果是有人想要让你看到的,并不是质量最好的。
也就是说,网络搜索结果被人为干预了。所以网络一直被网民所诟病。
但网络搜索不出结果,未必是网络的原因,也有可能是自己输入的搜索词不准确造成的。所以对于网络,我们要做到如下几点:
除此之外,网络搜索还有点小技巧,粥左罗《万字干货,彻底讲透搜索技巧,10倍提升你的搜索力(免费教程)》这篇文章写得非常好,我整理几点,仅供参考:
01 过滤目标内容
命令:“+”“-”
用法:通过“+”和“-”来对搜索结果进行过滤
比如在关键词后加上“-推广 -推广链接”就可以排除搜索结果中包含相应字样的链接。如果你发现广告还没有排除干净,你也可以再加上“-广告”通常就能彻底的消灭广告。
02 搜索包含某关键词的内容
命令:“intitle”
用法:通过“intitle”命令指定搜索结果中要包含的关键词,注意“intitle”后边连接的冒号是英文状态下的。
03 搜索某一个格式的文件
命令:“filetype”
用法:通过“filetype”命令可以限制我们要搜索文件的类型,注意“filetype”后边接的冒号也是英文状态下的。
04 搜索特定时间范围的内容
命令:“时间..时间”
用法:通过“时间..时间”命令可以限制我们要搜索的文件的时间,注意两个时间的中间顿号没有空格。
相对网络,谷歌、必应对于技术搜索,就相对准确许多,所以当你网络搜索不到时,尝试下别的搜索引擎,说不定会有新发现。
现在程序员使用的机器语言,都是国外的,更准确的说,都是美国的。所以很多论坛、资料等,都是英文。如果你只会用中文来搜索,某些小众的问题,当然搜不到啦。
所以,要学会使用英文关键字来搜索。
有时候甚至要去国外的一些论坛来搜索想要的答案,这就要求要有一定的英语阅读能力,不能一看到英文帖就放弃。
有时候不管你如何搜索,都找不到自己想要的答案,该怎么办呢?这种情况下,就只能硬着头皮尝试自己解决了。
或者,寻求同事或朋友的帮助,寻求大脑风暴,说不定就会有思路。
如果有些问题是因为新器件带来的,还可以找到器件供应商,让他们安排技术支持帮忙查找原因。
除此之外,还可以把问题整理好,写清发生的条件、复现步骤、测试方法、相关的LOG截图等资料,去一些技术论坛发求助帖,寻找大牛的帮助。
做技术时间久了,发现有些问题确实无解,根本没有办法去解决它。
这时候,我一般会尝试把它绕过,就是说,想办法让它无法复现,虽然问题还是存在,但是能把它掩盖过去。
比如有些驱动在开机启动时会加载不正常,那么就让它晚点启动,或者手动加载。这也不失为一种解决问题的方法。
以上就是我的建立,希望对你有帮助。
首先作为一个程序员,一个优秀的程序员最最最重要的能力就是解决问题的能力。这里解决问题的能力当然就包含了解决 bug 能力了
毕竟,程序员这一生,可能会写无数个 bug ,没有说哪个程序员敢保证自己写的程序没有 bug 。 所以,写了 bug ,遇到 bug 并不可怕,可怕的是你没有解决 bug 的能力 。
作为一个程序员,解决 bug 的途径有哪些呢?我们来一起聊一聊!
其实,每个程序员在学习编程的时候,都会使用编程工具,而现在的开发工具,其实功能都很强大。如果你自己合理利用编程工具,都了解和懂得开发工具的一些技巧,其实不仅仅能够提高开发效率,而且还能够帮助你解决很多编程中的实际问题。
debug 调试,大部分你常用的开发工具,都会有调试模式的,简而言之,就是你编程的时候,遇到了不是自己所想的结果的时候,你可以使用 debug 模式,来一步一步的调试,在调试模式下一般每一步都会显示所执行的结果,你可以看看在哪一步出错了,执行的结果与你预想的结果不对,那么你就能够找到问题所在了。
还有就是,开发工具的控制台,都会提示出报错信息的,现在的开发工具,都会直接告诉你哪一行,报了什么错。其实,很容易定位到错误的。你只需要在编程的过程中积累经验,知道报什么错,用什么方法来解决就行啦。
可是,提示的报错信息,我不知道用什么方法来解决的时候,该怎么办呢?这就是你需要积累的,也是问题中所描述的,就是通过搜索引擎来找答案。
不对,这里不应该是合理使用搜索引擎,应该是学会正确使用搜索引擎。比如:网络,你就不要用了,搜出一堆重复的信息,而且广告也多。作为程序员,建议你使用谷歌搜索。
其实,你在编程中所遇到的几乎所有的问题和 bug ,别人也同样遇到过,因为不管是经验丰富的老程序员,他技术再牛逼,也是初学者过来的,也都踩过你踩的坑。所以,互联网是个好地方,里面包含了你想要的问题的答案。
你只要把报错信息往搜索引擎上一放,回车一下,很多关于这个 bug 的答案就出来很多,你只需要找到跟你一样的 bug ,就能找到答案了。
在这里必须提一下这个网站,所有的程序员有必要学会使用这个网站,其实,你编程中所遇到的问题,这个网站上几乎都是由解答的。
Stack Overflow 可以说是最好的软件程序类问答网站了,给软件开发人员工作和学习提供了非常大的便利,以至于像小白,离了 Stack Overflow 简直都不会写程序了。
所以,建议大家一定要学会使用这个网站,对你编程肯定会有非常大的帮助的。
通过上面的方法,几乎应该能够解决到你所遇到的问题,但是,实在找不到答案的话,你可以问经验比你丰富的老程序员,实在解决不了,那就换种方法吧!
网络,谷歌,debug,断点调试,业务上的bug就需要问下同事或者产品。如果能知道大致范围,哪一部分错了,就换一种方法呗,一般都不会只有一种方法。
1.reload
2.restart
3.rewrite and then goto 2 or 4
4.reboot
5.rm -rf /
6.原谅我编不下去了[捂脸][捂脸][捂脸][捂脸][捂脸][捂脸][捂脸]
找bug跟医生看病的思路是一样的,要对症下药。得先把问题的根源找到,找到根源以后问题就容易处理了。搜索引擎找不到的问题,说明这个问题不是一个常见的问题,具有独特性,那么从bug出现的路径上一步一步去排查。必要时可以用排除法,尽可能的缩小排查范围。另外,当软件的业务逻辑比较繁多复杂的时候,一个结构清晰的架构能为你节省不少找bug的时间。还有,充分的单元测试能够帮你减少出bug的机会。以上均为个人看法,欢迎讨论!
一般程序员能碰到的bug无外乎其他上游程序员写库时手抖留下些不匹配或者容易溢出的问题,搜一下差不多能解决问题。如果是自己写的,那无非就是时序错误类型错误之类的,用break point一行行的调就好了。
再复杂点的bug就是程序员拿高薪的根本了,只可意会,不可言传~
仅仅靠搜索引擎、其他网站那必然无法解决大量问题,因为很多问题是跟业务逻辑相关的,是没有直接答案的。比如 游戏 开发有个界面一直无法显示,这个问题就不是网络可以解决的。问题需要调试分析,这和破案非常像,但在开发过程中更有利的是问题有机会可以重现。破案是逆向工程,需要反推。解决代码问题不仅仅可以反推,也可以通过阅读代码正向分析。下面说说如何debug一个业务逻辑问题。回到刚刚的例子,有个界面一直出不来,我们如何快速去定位:
1.思考这个问题发生的可能性。比如 游戏 内大量界面都是正常的,那么可以对比正常界面代码和异常界面代码的区别,这是对比法。
2.假设创建正常界面和这个异常界面的逻辑代码是一样的,那么问题就落到了这两个界面内部,继续在内部重复上面的对比法进行判断,直到锁定最终位置。
上面说的方法基本上可以杜绝卡在一个简单问题上,这是摆脱新手的一个过程。选择使用对比法或者其他方法的前提都是基于观察和对项目的认识,所以,搜集“案发现场”是最关键的。
其他的问题,不属于逻辑的,像其他网友说的那样,有些通过到github、stackoverflow等地方解决的。这些问题也不是直接就去查找的,它通常也有个分析过程。比如你使用了一个库,但是目前它不支持你的模块。对于新手,就是直接网络或者google了。实际上这样的问题也是有“案发现场”的。对于作者提供的api接口的统一性和便捷程度去推断作者在相关支持模块的位置以及命名以及拓展,再尝试在文件夹中搜索。如果都找不到,再去Google上获取更多的信息。重复推断、分析,决定如何拓展或者绕过。
综合上面的几种问题,可以看到的是都离不开对现场的观察和推理分析。这种能力也被称为经验。但是一般情况下你看不到它们这个分析过程,你能做的就是在实际环境中反复逼迫自己去思考,去训练。这个推理的培养,不仅仅是对事情,也是对人。
我在入行 游戏 开发的前期,也是类似的情况。卡在不同种类的问题上,有些在简单逻辑,有些在别人的代码支持上。后面解决的问题多了,就会发现里面共通的思维方式。常用的一些方法如下:
1.对比法,比较正常与异常代码区别
2.二分查找法。分段注释找问题,也会用在很多方面。比如最近版本突然出了一个奇怪bug,可以通过svn还原来定位。这个还原不是一个一个版本还原,而是用二分法去还原。
3.增加信息。在怀疑的位置或者过程添加日志或者打断点辅助自己更好的推理。
4.相似推理。比如一个引擎在api、性能使用程度上都非常友好,那么它在别的地方也有可能相对表现比较好。这时候如果有个功能我们的实现需要很复杂才能完成,那么就有可能是我们用错了。相似推理不一定都能正确,但会提供一些帮助。
以上。
⑸ 程序员为什么要一直改bug 不能一次性写好吗
程序写代码就像造一座大楼,如果即便经过严格的设计论证,装配高质量的部件,最后还有系统性地验收,让你去造这么一座大楼,你能保证不管是窗户安没安好,还是地基挖浅了挖深了,还是墙皮脱落,都一个问题没有?
回想早年的小程序,执行某一个具体的任务,明确的输入输出,一般是不会有bug的。
但现在的软件开发,早就已经不是一个人在战斗了,大部分的工程,开发规模5人左右居多,另外稍大的软件工程动辄几十人,更有甚者几百人的团队规模并行作业。你试想一下,要保证这么多人的产出都符合设计要求,势必需要合适的开发流程,需要更多的项目管理的技巧和方法。这就对个人以及团队的提出了非常高的要求了。
软件工程的方法论中,要求软件开发者尽可能多地在软件测试阶段发现bug,而不是交付之后。
但是楼主说的能不能让软件开发出来没有bug,我觉得把下面这几个事情做好,还是有可能的。
1、花尽可能多的时间,和客户沟通软件需求,了解每一项需求的用意。
2、确保软件需求不能随意变动,因为很多情况下一个需求的变化,程序会带来很多问题,有可能连底层结构都需要跟着一起变动。频繁的需求变动,加上开发周期和成本的约束,带来的结果就是软件质量的不可控。
3、确保软件测试质量,完成全覆盖测试,设计系统需要的全部用例并保证全部通过。
总结下,软件项目在实际开发过程中风险点还是很多的,通过合理的控制,可以降低和减少bug。但是软件本身是为人的需求而生,只要需求在变化,软件是永远都需要跟着去维护和更新的,所以只要有不可控的因素(需求分析,系统设计,系统详细设计,编码,单元测试,集成测试,系统测试,验收等)任何一个环节任何一个人产生问题,反映到最后的软件产品上就是一个bug。
另外Bug分很多类,一类是对用户来说不能正常使用,能被用户感知到的错误。一类是用户能正常使用,但是有各种异常的错误。一类是使用没有任何问题,但是不符合产品预期的问题。其他应该还有很多,这里我们一一讨论。
对用户来说不能正常使用,能被用户感知到的错误。
其中一种情况是程序员和测试人员的问题,所有功能在上线前,工程师和QA人员应该测试,回归完功能。能被用户感知到使用流程有问题的话,一定是相关人员能力或者线上意识某一方面欠缺,也是最不能容忍的。
另外一种情况是黑天鹅事件,什么网线被挖断,机房被炸,服务器爆炸什么的。。。。。。 ,这个说实话,出了在软件架构上做冗余,目前没有什么特别好的办法。
2. 用户能正常使用,但是在用户看不到的地方有各种异常的。
一个功能模块几乎不可能是独立的,它必然牵扯到其他模块。对于你所依赖的模块,你没办法保证这些模块是100%可用的。这个时候可能虽然有错误,但是只要不影响主要流程,我们依然可以正常使用。但这个时候对于外部依赖的异常处理,很考验工程师的能力。
举个例子,有可能你看到的点赞数比你实际收到的点赞数少。这个是由于点赞统计在什么时候失败了一次,某些用户可能认为这个是bug,但是其他可能不会在意(当你有10001赞的时候,你在意少了1个么?)
3. 使用没有任何问题,但是不符合产品预期
这个更多的是研发和产品经理对于需求理解的不一致。因为文字是有二义性的,况且人和人对相同文本的理解本来就可能出现偏差,这就导致了需求理解的不一致,最终导致了线上产品不符合预期。对于内部人员来说,这个也算BUG。
说了那么多,最主要的核心在于实现功能的是人。人不像机器,不可能不犯错;同样的,不可能存在没有bug的程序,像大家使用的windows,穷尽无数优秀的工程师,给予用户优秀的桌面体验的同时,也有你可能完全看不到的数千个bug。想要完全避免几乎是不可能的。所有也不存在一次性就写好的情况,鬼知道产品经理什么时候改需求呢~
⑹ 程序员为什么要一直改bug不能一次性写好吗
作为一名程序员,我也总是在调试,Bug总是防不甚防的出现,这个过程真是有趣又痛苦,最后我觉得习惯就好,一次性写出完美代码是每个程序员不可实现的梦想。
程序员作为一项工作,是有任务有指标的,比起慢慢写出完美程序解决所有问题,大家更喜欢快速看到一个可以执行解决部分问题的程序,此时完成比完美更重要。
没有哪个程序员可以写出完美的代码,即使高能又伟大的公司也做不到这一点,想想看你的手机软件是不是经常提醒你该更新了,连微软都在三天两头的让你打补丁,不是吗?
⑺ 程序员如何让自己的程序少出BUG(转)
软件测试心得
,而且还经常写一些工作上的事,现在感觉自己老了似的,开始转型了,会选择写一些总结而不是琐碎,也许这是我以后当领导的征兆吧。
程序员是善于思考的一个职业,做过这行的都知道,写一个程序的过程都要经过构思、设计、写代码、测试到最后运行这几个步骤。慢慢地,这个习惯也被搬到了生活中,现在我才觉得,我平时做事这么的冷静善思考原来是工作影响的原因。
象我一样,大多程序员都有一个毛病,或者说一个习惯,自己编写过的代码都不愿意测试,他们凭着自己的习惯,理论上完成了代码的编写就认为自己的工作结束了,剩下的工作应该交给测试人员了。但实际上来讲,如果代码存在BUG,造成软件在运行期出错,那么测试人员和客户肯定会发现这些BUG的,再等到测试人员或者客户把BUG反馈回来的时候代价就已经很大了,不仅仅是时间的浪费,更重要的还有1、影响了客户对产品以及公司的信任度,2、影响了程序员自己的声誉,3、影响了代码的可读性以及质量,4、增加 了DEBUG的难度,5、对程序员的心理造成一定的影响。
首先,程序员应该克服自己身上的一些缺点,这是很重要的一点,因为每个程序员都有自己的编程习惯,而且每个程序员对自己刚刚完成的程序都会信心百倍的说“绝对没问题”,实际上这种想法很正常,因为每段代码都是通过程序员认真谨慎的思考和设计之后才写出来的,在设计时已经排除了很多问题,所以程序员不会将自己认为不正确的判断写到程序里,但这仅仅是理论上的想法,但人哪有不反错的时候。其实程序员在读其他人写的程序的时候,就会很谨慎,仔细找到程序上的错误,但对自己的代码就很难这样做,如果把这种谨慎应用到自己的代码上来,BUG会减少到最少。软件工程所说的各阶段工作想必大家都清楚,前期的设计以及需求分析才是一个软件工程的重点,这里也是花费时间最多的地方,当对要写的程序有了一个清晰的轮廓之后再动手编写代码。
第二,刚刚提到的前期设计,是指在编写代码之前所作的工作,这要求程序员对系统的整个结构以及逻辑有很清楚的理解,这也要求对系统的需求做到位。我没有写过文档,所以这里不谈文档了。思路清晰很重要,但每个人并不能将系统的整个设计思路都记在脑袋里,那最好就写下来,特别是一些复杂的逻辑结构关系还有复杂的算法。
第三,代码的编写,要尽量减少拼写的错误,严禁使用关键字作为变量来使用,要尽量做到代码模块化,并且保证其正确性和可重复使用性。因为是模块组成的,写过之后可以将每个模块部分单独测试,因为代码量少了质量自然提高了。对顺序执行要求很高的函数尽量不采用调用子函数的方法,让程序按顺序走吧。
第四:代码检查以及系统功能测试,这是保证代码质量的最后一步了,我们可以写一些代码模块或者小工具来进行测试工作,跟踪变量值的变化,使用一些小技巧在这个阶段都是必要的,这里和测试人员的测试不同之处在于:仍然让程序员的注意力放在其自己的代码范围内,减小了排错的难度。
按照如上步骤来走的话,那么我想你的系统应该足够健壮了。
把对待别人代码的态度放到自己的代码上来,也就是反复的Review自己的代码检查逻辑错误也是相当好的办法。别把自己辛苦写的代码看的很值钱,在团队中尽量与别人分享、Review代码这是实际工作的经验。
作为一个优秀的程序员要具备这些习惯,看自己的代码就象对待自己的一样,爱惜、呵护是必须的,同时也要象园丁一样及时修剪多于的树枝来让自己的代码走正确的道路。
⑻ 程序员为什么要一直改bug,不能一次性写好吗
软件可能在使用过程中没有任何问题,但不符合产品的预期下图源自“How projects really work?”,很形象的突出了客户需要的产品和最终得到的产品不一致。
所以软件想要变得成熟,Bug收集和处理机制是非常有必要的,比如:会影响客户使用的优先级高的Bug要优先修复。Bug是软件的影子,也是程序员的噩梦实际上不能存在没有bug的软件,Bug和软件如影随形。就像我们使用的Windows,穷尽无数优秀的软件工程师来设计给用户优秀的桌面体验,但也有各种层出不穷的bug。
程序员对Bug有多爱就有多恨,Bug无处不在,即使再牛逼的程序员也逃脱不了Bug的魔掌。想要完全避免Bug几乎是不可能的,所以也不在一次性就写好的程序。以上个人浅见,欢迎批评指正。认同我的看法,请点个赞再走,感谢!喜欢我的,请关注我,再次感谢!