# 如何进行实验

已故的伟大的 Edsger Dijkstra 曾经充分解释过：计算机科学不是一门实验科学\[ExpCS],并且不依赖于电子计算机。当他提出这个观点时，他指的是19世纪60年代。\[Knife]

> ...危害已经出现：主题现在已经变成了“计算机科学” - 这实际上，像是把外科手术引用为“手术刀科学” - 这在人们心中深深植入了这样一个概念：计算机科学是关于机器和它们的外围设备的。

编程不应该是一门实验科学，但大多数职业程序员并没有保卫 Dijkstra 对于计算机科学的解释的荣耀。我们必须在实验的领域里工作，正如一部分，但非所有的物理学家做的那样。如果三十年后，编程可以在不进行任何实验的前提下进行，这将是计算机科学的一个巨大成就。

你需要进行的实验包括：

* 用小的例子测试系统以验证它们遵循文档，或者在没有文档时，理解它们的反应；
* 测试一些小的代码修改去验证它们是否确实修复了一个 bug；
* 由于对一个系统不完全的理解，需要在两种不同情况下测量它们的性能表现；
* 检查数据的完整性；
* 对困难的或者难以重现的 bug，收集解决方案中可能提示的统计数据。

我不认为在这篇文章里我可以讲述实验的设计，你会在实践中学习到这方面的知识。然而，我可以提供两点建议：

第一，对你的假设或者你要测试的断言要非常清楚。把假设写下来也是很有用的，尤其是如果你有点迷惑或者与其他人合作时。

第二，你会经常发现你必须设计一系列的实验，它们中的每个都基于对最后一个实验的理解。所以，你应该设计你的实验尽量去提供最多的信息。但不幸的是，这会让实验保持简单变的困难 - 你必须通过经验来提升这种权衡的能力。

Next [团队技能 - 为什么评估很重要](https://braydie.gitbook.io/how-to-be-a-programmer/zh-traditional/1-beginner/team-skills/01-why-estimation-is-important)
