불행히도 작동하지 않은 TDD로 Ron Jeffries의 스도쿠 솔버를 만들려는 시도를 참조하십시오 .
알고리즘은 알고리즘 설계 원칙에 대한 상당한 이해가 필요합니다. 이러한 원칙을 통해 Peter Norvig와 같은 계획을 통해 점진적으로 진행할 수 있습니다 .
사실상 사소한 설계 노력이 필요한 알고리즘의 경우 거의 항상 노력이 점진적으로 증가합니다. 그러나 알고리즘 디자이너의 눈에는 아주 작은 각 "증분" 은이 특정 알고리즘 제품군에 대해 동일한 전문 지식이나 지식을 가지고 있지 않은 사람에게 양자 도약처럼 보입니다 (구문을 빌리기 위해).
이것이 CS 알고리즘의 기본 교육과 많은 알고리즘 프로그래밍 실습이 똑같이 중요한 이유입니다. 특정 "기술"(작은 알고리즘의 빌딩 블록)이 존재한다는 것을 아는 것은 이러한 점진적인 양자 도약을 향한 먼 길입니다.
그러나 알고리즘의 점진적 진행과 TDD 사이에는 중요한 차이점이 있습니다.
차이점은 JeffO 가 언급 한 것 입니다. 출력 데이터 의 정확성을 검증 하는 테스트 는 동일한 알고리즘의 다른 구현 (또는 동일한 솔루션을 제공하기 위해 경쟁하는 다른 알고리즘)간에 성능 을 주장하는 테스트와는 별개입니다 .
TDD에서는 테스트 형식으로 새로운 요구 사항을 추가하며이 테스트는 처음에는 통과하지 않습니다 (빨간색). 그런 다음 요구 사항이 충족됩니다 (녹색). 마지막으로 코드가 리팩터링됩니다.
알고리즘 개발에서 요구 사항은 일반적으로 변경되지 않습니다. 결과 정확성 검증 테스트는 먼저 작성되거나 알고리즘의 초안 (고신뢰하지만 느리게) 구현이 완료된 직후에 작성됩니다. 이 데이터 정확성 테스트는 거의 변경되지 않습니다. TDD 의식의 일부로 실패 (빨간색)로 변경되지 않습니다.
그러나이 측면에서 데이터 분석 요구 사항 (입력 세트 및 예상 결과 모두)은 사람이 이해하기에 느슨하게 정의되기 때문에 데이터 분석은 알고리즘 개발과 분명히 다릅니다. 따라서 요구 사항은 기술 수준에서 자주 변경됩니다. 이러한 빠른 변화는 알고리즘 개발과 일반적인 소프트웨어 응용 프로그램 개발 사이의 데이터 분석을 가능하게합니다. 여전히 알고리즘이 무겁지만 요구 사항도 프로그래머의 취향에 따라 너무 빠릅니다.
요구 사항이 변경되면 일반적으로 다른 알고리즘이 필요합니다.
알고리즘 개발에서 성능 비교 테스트를 실패 (빨간색)로 변경 (조임)하는 것은 어리석은 일입니다. 성능을 향상시키는 알고리즘의 잠재적 변경에 대한 통찰력을 제공하지는 않습니다.
따라서 알고리즘 개발에서 정확성 테스트와 성능 테스트는 모두 TDD 테스트가 아닙니다. 대신 둘 다 회귀 테스트 입니다. 특히 정확성 회귀 테스트는 정확성을 잃을 알고리즘을 변경하지 못하게합니다. 성능 테스트를 통해 알고리즘이 느리게 실행되도록 알고리즘을 변경할 수 없습니다.
"적색-녹색-리 팩터"의식이 알고리즘 개발 의 사고 과정에 특별히 필요 하지 않거나 특히 유익 하지 않다는 점을 제외하고는 여전히 TDD를 개인 작업 스타일로 통합 할 수 있습니다 .
알고리즘 개선은 실제로 현재 알고리즘의 데이터 흐름도에 임의의 (정확하지는 않지만) 순열을 만들거나 이전에 알려진 구현 사이에서 그것들을 혼합하고 일치시킴으로써 발생한다고 주장합니다.
테스트 세트에 점진적으로 추가 할 수있는 여러 요구 사항이있는 경우 TDD가 사용됩니다 .
또는 알고리즘이 데이터 중심 인 경우 각 테스트 데이터 / 테스트 사례를 증 분식으로 추가 할 수 있습니다. TDD도 유용 할 것입니다. 이러한 이유로 "새로운 테스트 데이터 추가-이 데이터를 올바르게 처리 할 수 있도록 코드 개선-리팩터링"의 "TDD- 유사"접근 방식은 개방형 데이터 분석 작업에도 적용되며 알고리즘의 목표는 사람에게 설명됩니다. 중심 단어와 그것의 성공 측정도 인간이 정의한 용어로 판단됩니다.
한 번의 시도로 수십 또는 수백 가지의 모든 요구 사항을 충족시키는 것 보다 압도적 인 방법을 가르쳐야합니다 . 다시 말해, 솔루션의 초기 초안을 구현하는 동안 특정 요구 사항 또는 스트레치 목표를 일시적으로 무시할 수 있음을 지시 할 때 TDD가 활성화됩니다 .
TDD는 컴퓨터 과학을 대체하지 않습니다. 그것은이다 심리적 목발 프로그래머는 한 번에 여러 요구 사항을 충족해야하는 충격을 극복하는 데 도움이됩니다.
그러나 올바른 결과를 제공하는 구현이 이미있는 경우 TDD는 목표를 달성했으며 코드를 리팩토링하거나 다른 프로그래머 사용자에게 전달할 준비가 된 것으로 간주합니다. 어떤 의미에서, 코드가 "충분히 좋다"는 신호를 객관적으로 제공함으로써 (모든 정확성 테스트를 통과하기 위해) 코드를 조기에 최적화하지 않는 것이 좋습니다.
TDD에서는 "미세 요구 사항"(또는 숨겨진 품질)에 중점을 둡니다. 예를 들어 매개 변수 유효성 검사, 어설 션, 예외 발생 및 처리 등 TDD는 일반적인 소프트웨어 실행 과정에서 자주 실행되지 않는 실행 경로의 정확성을 보장합니다.
특정 유형의 알고리즘 코드에도 이러한 것들이 포함되어 있습니다. 이들은 TDD에 적합합니다. 그러나 알고리즘의 일반적인 워크 플로는 TDD가 아니기 때문에 구현 코드가 이미 (적어도 부분적으로) 작성된 후에 이러한 테스트 (매개 변수 유효성 검사, 어설 션 및 예외 발생 및 처리)가 작성되는 경향이 있습니다.