《Effective Debugging:软件和系统调试的66个有效方法》——第14条:考虑对软件进行更新

简介:

本节书摘来自华章计算机《Effective Debugging:软件和系统调试的66个有效方法》一书中的第2章,第14节,作者[希]迪欧米迪斯·斯宾奈里斯(Diomidis Spinellis),爱飞翔 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第14条:考虑对软件进行更新

接下来,笔者要说几个很多人都意想不到的bug来源。并非所有错误都是由于你自己所写的代码而造成的,用来处理这些代码的编译器或解释器、你所使用的程序库、你所依赖的数据库和应用程序服务器,以及上述工具所在的操作系统,也有可能要对程序中的bug负有责任。笔者编写本书时,Linux的源代码里面包含2700多条带有XXX字样的注释,该标记通常意味着可疑的内容,这其中有一些肯定是bug。

于是,有些bug就可以通过更新软件来解决。如果你要发布的打包应用程序里面出现了隐晦的bug,那么使用新版的编译器或程序库或许能够帮助你修复这个bug。如果你要发布基于软件的服务,那么对中间件、数据库及操作系统进行更新也是很有好处的。至少应该尝试用最新的版本来构建、链接或运行程序代码,以尽量消除因第三方组件而引入bug的概率。然而,有时采用稍微保守一些的升级策略也是很有道理的,这就是说,尽管我们知道旧版软件不太完美,但是基于某些原因,我们还是决定继续使用这些软件。有很多中间件本身编写得就有错误,或是向后兼容性不太好,因此,有经验的用户通常会较为谨慎地进行升级,他们会升级到能够解决其问题,而且发布时间第二早的那个bug修复版本上面(如6.4.3版)。此外,新版软件也会引入新的bug与兼容性问题,因此在升级的时候至少要给自己留一条退路,也就是要拟定一套明智的后退计划,如果升级失败,或是升级到的版本无法解决你所面对的bug,那么可以根据该方案退回原有的版本。我们可以在沙盒中更新第三方的代码,例如,可以对虚拟机进行复制,在复制出来的镜像里面进行更新,如果更新后的效果不好,那么直接把这份镜像丢掉就行了,这是一种可靠且较为简便的办法。尽管更新软件对解决bug确实有一定的帮助,但无论如何都不要对此抱有过高的期望。

除非你能够证明外部代码确实有错,否则最好是先假设它们正确无误。有些bug看上去好像是由第三方代码所引发的,然而在大多数情况下,其实是由于你自己的问题而造成的。30年的调试历程中,笔者在自己的代码里面修复了数以千计的bug,与之相对,由于某款流行的商业编译器生成了错误的代码而导致的bug只出现了一次,由于程序库而导致的bug只出现了几次,由于操作系统的功能不稳定而导致的bug只出现了一次,由于描述系统调用的文档有错而导致的bug只出现了几次,由于工具和其他系统软件而导致的bug也只出现了几十次。因此,对软件进行更新的最大意义,就在于给我们提供一个新的起点,令我们可以下定决心来好好清理自己的代码。

要点

  • 在更新之后的环境里面重新尝试你所编写的代码,看看这次会不会出错。
  • 不要对更新软件所带来的效果抱有过高的期望。
  • 要考虑因第三方组件而引发bug的可能性。
相关文章
|
机器学习/深度学习 人工智能 云计算
2023年中国算力大会,阿里云荣获三项荣誉!
2023年中国算力大会,阿里云荣获三项荣誉!
2023年中国算力大会,阿里云荣获三项荣誉!
|
传感器 人工智能 算法
AI技术在智慧城市建设中的应用与前景
传统的城市规划和管理面临诸多挑战,如交通拥堵、资源浪费、环境污染等。随着人工智能技术的发展,其在智慧城市建设中的应用成为解决这些问题的关键。本文将探讨AI技术在智慧城市建设中的应用现状与前景,从智能交通管理、智能能源利用、智慧环境监测等方面进行分析,展望AI技术为智慧城市带来的巨大潜力与发展方向。
572 27
|
人工智能 搜索推荐
AIGC在学生测试评估中的应用
AIGC在学生测试评估中的应用
495 3
AIGC在学生测试评估中的应用
|
消息中间件 编解码 Java
flink 写入Elasticsearch 踩坑小结
flink 写入Elasticsearch 踩坑小结
|
机器学习/深度学习 人工智能 算法
人工智能语音信号预处理
人工智能语音信号预处理
629 3
|
存储 移动开发 编解码
html5的新特性详解
HTML5是构建和呈现互联网内容的语言描述方式,HTML5在HTML4的基础上增加了许多新特性,使其更具语义化、更加标准化,同时也提高了用户体验和开发效率。以下是HTML5的部
|
Web App开发 Windows
Windows【Chrome浏览器 01】首次安装的谷歌Chrome浏览器出现无法打开此页面问题处理(详细图文步骤)
Windows【Chrome浏览器 01】首次安装的谷歌Chrome浏览器出现无法打开此页面问题处理(详细图文步骤)
447 0
|
存储 网络协议 Unix
NAS(Network Attached Storage)
NAS(Network Attached Storage)是一种网络存储设备,它可以通过网络连接提供数据存储和共享服务。NAS通常具有独立的操作系统和文件系统,可以通过网络协议(如NFS、CIFS、FTP等)提供文件共享、备份、存储等功能,这些功能可以被多个设备或用户同时访问和使用。
933 1
|
监控 算法 安全
以unity3d为例解读:游戏数据加密
以unity3d为例解读:游戏数据加密
1006 1
以unity3d为例解读:游戏数据加密
|
弹性计算 调度
阿里云服务器ECS通用型和共享型有什么区别?
阿里云共享型和通用型的区别,实际上是共享型和独享型云服务器的区别,只有CPU计算性能是有差别的,共享型云服务器的CPU计算性能不如独享型,ECS共享型云服务器在高负载时可能导致计算性能波动不稳定,而通用型云服务器计算性能稳定。除了CPU计算性能,其他的如公网带宽、系统盘及内存等都是无差别的
570 0
阿里云服务器ECS通用型和共享型有什么区别?