Дивіться також спробу Рона Джеффріса створити розв'язувач судоку з TDD , який, на жаль, не спрацював.
Алгоритм вимагає значного розуміння принципів проектування алгоритму. З цими принципами дійсно можна поступово йти з планом, як це робив Пітер Норвіг .
Насправді, для алгоритмів, що вимагають нетривіальних зусиль проектування, майже завжди зусилля мають приросту. Але кожен "приріст", який є крихітним в очах дизайнера алгоритмів, виглядає як квантовий стрибок (запозичити вашу фразу) людині, яка не мала такої ж експертизи чи знань з цією сімейством алгоритмів.
Ось чому основна освіта теорії CS у поєднанні з безліччю практики програмування алгоритмів є однаково важливою. Знаючи, що певна "техніка" (невеликі будівельні блоки алгоритмів) існує довгий шлях до здійснення цих поступових квантових стрибків.
Однак є кілька важливих відмінностей між поступовим прогресом в алгоритмах і TDD.
Одна з різниць згадувала JeffO : Тест, що підтверджує правильність вихідних даних, є окремим від тесту, який стверджує ефективність між різною реалізацією одного і того ж алгоритму (або різними алгоритмами, що намагаються дати одне і те ж рішення).
У TDD додається нова вимога у вигляді тесту, і цей тест спочатку не повинен проходити (червоний). Тоді вимогу виконують (зелений). Нарешті код відновлюється.
У розробці алгоритму вимога зазвичай не змінюється. Тест на перевірку правильності результатів пишеться спочатку або незабаром після завершення чергової (дуже впевненої, але повільної) реалізації алгоритму. Цей тест на правильність даних рідко змінюється; ніхто не змінює його на збій (червоний) як частина обряду TDD.
Однак у цьому аспекті аналіз даних суттєво відрізняється від розробки алгоритму, оскільки вимоги до аналізу даних (як вхідних наборів, так і очікуваних результатів) визначаються лише в людському розумінні. Таким чином, вимоги часто змінюються на технічному рівні. Ця швидка зміна ставить аналіз даних десь між розробкою алгоритму і загальною розробкою програмного забезпечення - хоча все ще важкий алгоритм, вимоги також змінюються "занадто швидко" на смак будь-якого програміста.
Якщо вимога змінюється, вона зазвичай вимагає іншого алгоритму.
У розробці алгоритму зміна (підтягування) тесту порівняння продуктивності на збій (червоний) є нерозумною - це не дає тобі уявлення про потенційні зміни в алгоритмі, які б покращили продуктивність.
Тому в розробці алгоритму і тест на правильність, і тест на продуктивність не є тестами TDD. Натомість обидва є регресійними тестами . Зокрема, тест регресії на правильність заважає вносити зміни в алгоритм, які порушують його правильність; тест на ефективність заважає вносити зміни в алгоритм, які змусять його працювати повільніше.
Ви все ще можете включити TDD як особистий стиль роботи, за винятком того, що ритуал "червоний - зелений - рефактор" не є строго необхідним або особливо корисним для продуманого процесу розробки алгоритму.
Я б стверджував, що вдосконалення алгоритму насправді є результатом здійснення випадкових (не обов'язково правильних) перестановок на діаграми потоку даних поточного алгоритму або їх змішування та співставлення між відомими раніше реалізаціями.
TDD використовується, коли є кілька вимог, які можна поступово додавати до вашого тестового набору.
Крім того, якщо ваш алгоритм керується даними, кожен фрагмент тестових даних / тестових випадків можна додавати поступово. TDD також буде корисна. З цієї причини "TDD-подібний" підхід "додавання нових тестових даних - поліпшення коду, щоб він обробляв ці дані правильно - рефактор" також буде працювати для роботи з аналітикою відкритого типу, в якій цілі алгоритмів описані в людині -центричні слова та його міра успіху також судяться у визначених людиною термінах.
Це спрямовано на те, щоб навчити спосіб зробити його менш непосильним, ніж намагатися задовольнити всі (десятки чи сотні) вимог за одну спробу. Іншими словами, TDD увімкнено, коли ви можете продиктувати, що певні вимоги або цілі розтягування можна тимчасово ігнорувати, коли ви реалізуєте деякі ранні проекти вашого рішення.
TDD не замінює інформатику. Це психологічна милиця, яка допомагає програмістам подолати шок від необхідності задоволення багатьох вимог одночасно.
Але якщо у вас вже є одна реалізація, яка дає правильний результат, TDD вважає свою мету виконаною і код готовий для передачі (рефакторингу або іншому користувачеві-програмісту). У певному сенсі він спонукає вас не передчасно оптимізувати свій код, об'єктивно подаючи сигнал про те, що код "досить хороший" (пройти всі тести на правильність).
У TDD також є акцент на "мікропотребах" (або прихованих якостях). Наприклад, перевірка параметрів, твердження, викид та обробка виключень тощо. TDD допомагає забезпечити правильність контурів виконання, які часто не виконуються у звичайному процесі виконання програмного забезпечення.
Окремі типи коду алгоритму містять і ці речі; вони піддаються TDD. Але оскільки загальний робочий процес алгоритму не є TDD, такі тести (на перевірку параметрів, твердження та викид та обробку винятків), як правило, пишуть після того, як код реалізації вже був (принаймні частково) написаний.