导入
错误的原因及发现
本课程探讨了错误产生的原因,然后讲解了如何发现这些错误。
众所周知,任何运行计算机程序的设备都可能存在软件缺陷。从最简单的设备到最复杂的系统,软件缺陷无处不在。调试和修复软件缺陷是程序员日常工作中较为不受欢迎的任务之一。
缺陷产生的原因
软件缺陷的产生原因多种多样。以下是一个不完全列表,大致涵盖了从程序设计阶段到实际编码过程中的各种因素:
-
程序的需求和规格可能不够清晰。在设计阶段,程序真正应该实现的功能可能并不明确。
-
程序员可能误解了部分需求。
-
编程语言表达能力不足。即使母语使用者也可能因人类语言的语法复杂而困惑,编程语言中非自然的语法和规则也容易导致程序员出错。
-
程序员可能基于错误的假设进行开发。例如,可能认为 3.14 足够精确地表示 π。
-
程序员可能对某个主题掌握的信息不准确或完全不了解。例如,可能不知道在特定逻辑表达式中使用浮点变量并不可靠。
-
程序可能遇到未预料的情况。例如,在程序通过 foreach 循环遍历目录文件时,该目录下的某个文件被意外删除或重命名。
-
程序员可能犯一些低级错误。例如,变量名拼写错误,意外与另一个变量名重复。
遗憾的是,目前仍没有一种软件开发方法能够保证程序永远正确运行。这依然是软件工程领域的一个热门话题,每隔十年左右就会出现一些有前景的解决方案。
发现缺陷的过程
软件缺陷会在程序生命周期的不同阶段,由不同类型的工具和人员发现。以下是缺陷可能被发现的时间点,按时间先后顺序排列:
-
编写程序时
- 由程序员自己发现
- 在结对编程过程中由另一位程序员发现
- 由编译器通过编译提示发现
- 作为构建过程一部分的单元测试发现
-
代码审查时
- 由在编译时分析代码的工具发现
- 由其他程序员在代码评审过程中发现
-
运行程序时
- 由在运行时分析程序执行过程的工具发现(例如 valgrind)
- 在质量保证测试中,通过断言检查失败或观察程序行为发现
- 在程序发布前由测试用户(Beta 用户)发现
- 在程序发布后由最终用户发现
越早发现缺陷,造成的经济损失、时间浪费,甚至在某些情况下的人身安全风险就越小。此外,事后由最终用户发现的缺陷,其根本原因往往比在开发早期发现的缺陷更难追溯。
下一课将讲解如何利用单元测试来捕捉缺陷。