这群程序员不惜连自己也坑!

一旦软件出现bug,除了“杀掉程序员祭天”,唯一能做的就是尽力消灭它们。毕竟,bug不仅会让软件崩溃,还有可能被黑客用来恶意攻击。
你看,这个“程序”就是无bug的……
但凡有过一点正式开发经验的程序员,写个简单的hello world都能写出bug的恐怕不多见吧。
别说hello world了,一个简单的、不涉及“隐秘”机制的百行小程序,绝大多数资深程序员也可以直接写成0 bug。

你对计算原理/语言机制理解越深,对你来说“隐秘”的东西就越少,写出高质量代码的机率就越高。
但是,哪怕只是在知乎上敲一篇1000个字的灌水文,有几个可以保证无语法错误、无错别字且标点符号使用正确呢?
这还是在机器替你写字,使得“提笔忘字”“书写错误”之类错误无法存在的前提下:这样你都不能保证全对……那么不仅大小写敏感、而且逻辑更为曲折复杂、容不得半点含糊的计算机程序呢?
因此,bug无可避免。

PS:
还有一种情况,你的程序本身是无bug的;但支持环境比较坑……
这种正常来说不算程序bug;但实践中,你可能没办法坐等OS/浏览器等厂商修改——然后你只好积极行动起来,在自己的程序里为别人的错误擦屁股……
这在业界被称为workaround: Workaround - Wikipedia
正常来说,workaround是临时的;并且,如果不是诸如0day之类特别关键、刻不容缓的问题,搞workaround往往是出力不讨好的——丑陋,易错,含糊,难以理解;而且等OS/浏览器等的原始厂商修了它自己的bug,你原本好好运行的workaround往往反而会引起问题。

尤其是,有时候OS/浏览器厂商修复速度比较慢、致使某种workaround反倒成为“主流技术”;那么当“正统”修复方案和workaround冲突时,OS/浏览器厂商往往不得不将错就错,以免捣毁那些用了workaround的实现……
这类复杂情况暂不讨论;提它主要是为了说明,搞清楚bug的真正发生点是极为重要的。修不到bug的根源、滥用workaround,度过的是眼前的难关,牺牲的却是整个项目的稳固性。
类似的,尽量把程序写的“大众化”一点,没有必要不碰新特性,也可以在很大程度上避免“遭遇官方bug”问题——如果你自己理解上再有点偏差,用新特性就和作死无异了。

不过……有的人敲字灌水都错字连篇,有人手写几十上百万字的小说,随便截一段都差不多能进语文课本……
所以,人与人还是有极大差别的。
不能因为“Linus也写bug”甚至“Linus也写过低级bug”,就认为“我写个100个整数里找最大值的简单程序出三十个bug也是正常的”——初学者搞出这事,正常;专业人员嘛……出一个都不正常。

不仅如此。
既然“写长篇出bug正常,发条短信就那么十几个字,错一个都不应该”;那么我们把长篇拆开成若干章,一章只写3000字呢?再把一章拆开成若干段,一段只写数百个字呢?
这就是为何写程序要先做模块设计、然后再把模块按职责拆分成类、类按功能拆分成函数、最后还要求一个函数不要超过一屏(大约80行)的原因了。
经过拆分之后,一个一个函数填写实现、然后再一个一个函数做单元测试,测完再组合起来搞功能测试、集成测试……
这样写程序,当然还是无法杜绝bug出现;但出bug的机率就微乎其微了。

而且程序和长篇小说不同。
小说里的角色,尤其是主角和主要配角往往是贯穿始终的,这就使得小说章与章之间存在很多内部联系;稍微搞不好就会导致前后失去呼应(比如主角一会儿伤在左手一会儿伤在右臂、或者前面挖个坑/设个伏笔后面却忘了用,等等)。
而程序里面,不同模块甚至不同函数之间,应该是毫无瓜葛的,每一个都可以摘出来独立成库——有瓜葛就说明用了全局变量/静态对象,或者通过参数/约定等传递了过多的东西——这就叫“低耦合”。
做到了“低耦合”,你就可以把一个复杂的大程序当一组简单的短文甚至短信写。这样自然就很难出错了。

当然了,有些情况下,程序逻辑非常复杂且无法拆分(所谓“无法约分的复杂性”),这种代码就必须端起十二分小心来(即便如此,bug出现率仍然要远高于其他代码)。
一般来说,我们要把程序拆成“不可约分”的一组最小单元来写。这个“不可约分”就是术语说的“高内聚”:这段程序只做一件事,这件事已经没法拆的更简单了,只能把它们放在同一段代码里一举解决掉。

因此,写程序时,事先的“谋划”非常重要。一个有经验的资深工程师,可以在动手前就把一个复杂的大项目拆成一堆几乎互不关联的小程序,然后逐一实现它们、实现完再把它们组合起来就行了。
显然,“谋划”好了,一个程序的难度降低若干个数量级都是可能的。
综上。程序出现bug,既是必然情况,也和程序本身的难度、规模,程序员的水平、责任心乃至公司正规程度息息相关。如果你跟我一样都喜欢java,也在学习java的道路上奔跑,欢迎你加入java学习群:527999065 群内每天都会分享java最新业内资料,共同交流学习,让学习变(编)成(程)一种习惯!

猜你喜欢

转载自blog.csdn.net/qq_28263265/article/details/82942945