另请参见罗恩·杰弗里斯(Ron Jeffries)尝试使用TDD创建Sudoku求解器的尝试,不幸的是这没有用。
算法需要对算法设计原理有深入的了解。有了这些原则,确实有可能像Peter Norvig一样逐步制定计划。
实际上,对于需要轻而易举的设计工作的算法,几乎总是在本质上是渐进的。但是,每个“增量” 在算法设计者看来都是微不足道的,对于那些没有专门知识或知识的人来说,这似乎是一个巨大的飞跃(借用您的话)。
这就是为什么CS理论的基础知识与大量算法编程实践相结合同样重要的原因。知道存在一种特定的“技术”(算法的小组成部分),是实现这些渐进式量子飞跃的漫长道路。
但是,算法的增量进度和TDD之间存在一些重要的区别。
JeffO提到了一种差异:验证输出数据正确性的测试与断言相同算法的不同实现(或争夺相同解决方案的不同算法)之间的性能的测试是分开的。
在TDD中,以测试的形式添加了新的要求,并且该测试最初不应通过(红色)。然后满足要求(绿色)。最后,代码被重构。
在算法开发中,要求通常不会改变。结果正确性验证测试要么首先编写,要么在算法的草拟(高度自信但缓慢)实现完成后不久编写。数据正确性测试很少更改;TDD仪式的一部分不会将其更改为失败(红色)。
但是,在这方面,数据分析与算法开发有明显的不同,因为在人们的理解中,数据分析要求(输入集和预期结果)仅是宽松定义的。因此,需求在技术水平上经常变化。这种快速的变化使数据分析介于算法开发和通用软件应用程序开发之间,尽管仍然占用大量算法资源,但对于任何程序员而言,需求也“太快了”。
如果需求发生变化,通常会要求使用其他算法。
在算法开发中,将性能比较测试更改(加强)为失败(红色)是很愚蠢的-它不能使您对可以改善性能的算法潜在更改有任何了解。
因此,在算法开发中,正确性测试和性能测试都不是TDD测试。相反,两者都是回归测试。具体而言,正确性回归测试可防止您更改会破坏其正确性的算法。性能测试可防止您对算法进行更改,使其运行速度变慢。
您仍然可以将TDD合并为个人工作方式,除了“红色-绿色-重构”仪式不是严格必要的,也不是对算法开发的思想过程特别有益。
我认为,算法的改进实际上是由于对当前算法的数据流程图进行了随机(不一定是正确的)排列,或者是在先前已知的实现之间进行了混合和匹配。
当有多个需求可以逐步添加到测试集中时,将使用TDD 。
另外,如果您的算法是数据驱动的,则可以逐条添加每个测试数据/测试用例。TDD也将是有用的。因此,“添加新的测试数据-改进代码以使其正确处理此数据-重构”的类似于“ TDD”的方法也适用于开放式数据分析工作,其中算法的目标在人类中进行了描述。以人类为中心的词语也可以判断以中枢为中心的单词及其成功程度。
它宣称教的方式,使其少压倒性不是试图以满足在单一的尝试要求所有(几十或几百个)。换句话说,当您在实施解决方案的某些早期草案时可以指示某些需求或延展目标可以暂时忽略时,将启用TDD 。
TDD不能替代计算机科学。它是一种心理拐杖,可以帮助程序员克服必须立即满足许多要求的烦恼。
但是,如果您已经有一个实现正确的结果的实现,则TDD会认为其目标已实现,并且代码已经准备好交付(重构或交给另一个程序员用户)。从某种意义上说,它鼓励您不要过早地优化代码,方法是客观地向您发出代码“足够好”(通过所有正确性测试)的信号。
在TDD中,也着重于“微观需求”(或隐藏的品质)。例如,参数验证,断言,异常抛出和处理等。TDD帮助确保在软件执行的正常过程中很少执行的执行路径的正确性。
某些类型的算法代码也包含这些内容。这些都适合TDD。但是由于算法的一般工作流程不是TDD,因此此类测试(关于参数验证,断言以及异常引发和处理的测试)倾向于在(至少部分)编写实现代码之后编写。