По большому счёту, когда говорят РУТ, нередко предлагают заменить написание спецификаций на разработку тестов.
Это особенность не РУТ, а "экстремального" программирования. Вполне можно сочетать РУТ с более привычными спецификациями.
Или по крайней мере совместить два этих процесса во времени, чтобы затем совместить разработку кода и тестирование.
Акцент тут не на распараллеливании. Если в проекте нет нужного количества людей, эти действия могут выполняться и последовательно. Главное, чтобы тесты опережали код, и как следствие - весь добавляемый код проходил тестирование.
Однако сдвиг и совмещение фаз по времени вовсе не сокращает трудозатраты.
Есть другие данные относительно зависимости стоимости исправления ошибки от времени ее обнаружения - чем раньше, тем проще. При грамотном применении РУТ большинство ошибок обнаруживаются и устраняются немедленно (сам подход запрещает реализацию новой функциональности, пока не прошли все имеющиеся тесты).
Для оценки гибкости нужно смотреть на процесс разработки как на информационный поток, систематически снижающий неопределённость. А в этом потоке оценивать устойчивость информационных структур (например, артефактов) к изменениям и смотреть, какая доля трудозатрат была положена на создание временных, быть может одноразовых, а то и вовсе никогда не используемых артефактов.
Боюсь, дослушав эту фразу до конца, многие разработчики спросят: "А с кем это вы сейчас разговаривали?". Предложите
практически приемлемую методику оценки устойчивости информационных структур к изменениям, тогда рекомендация действительно приобретет ценность.
Я согласен с Вадом (было у нас частное обсуждение вне форума), что комплекс тестов плохо заменяет спецификации.
Я тоже согласен. Именно поэтому наша гипотетическая история начинается с игрушечной спецификации, а не с набора тестов взамен нее. И тесты пишутся по одному, а не сваливаются на разработчика всем скопом в качестве задания.
Тесты - это тоже программы, но почему-то при обсуждении РУТ качество тестов остаётся за скобками.
Неверно. Неоднократно акцентируется внимание на том, что тест обязан быть
элементарным (четыре простейших фазы) и по возможности иметь
линейную логику (к сожалению, в Unity это не всегда возможно, если задействованы исключения). Фактически вызов модуля и сравнение результата с эталоном, ничего более. Могут вкрасться опечатки, конечно. Но от них и спецификации не застрахованы.
Наконец, важный вопрос сочетания тестов и архитектуры решения.
Речь в статье исключительно о модульных тестах (сиречь тестах отдельных модулей в условиях изоляции от других). Они принципиально не пригодны для тестирования архитектуры. Гораздо уместнее для этого применить, скажем, интеграционные или функциональные тесты. Но о них речь впереди, если дойдет дело.
Какие-то тесты не зависят от архитектуры (и с их помощью можно оценить адекватность архитектуры требованиям), какие-то тесты прямо зависят от архитектуры (хотя бы на уровне форматов данных и порядка событий).
Как было сказано выше, это совсем другие тесты, они пишутся по-другому и используют другие инструменты. Это все интересно, но к данной теме не имеет отношения.
По поводу прототипирования - зачастую это работа на выброс (и к тому же в другой среде разработки), поэтому нет необходимости применять РУТ к прототипам - качество здесь просто не нужно. А если, как часто бывает, прототип касается пользовательского интерфейса, применение РУТ здесь и вовсе неуместно.
P.S. Давайте и мы последуем мудрому правилу двигаться небольшими итерациями, а то каждый пост получается больше самой статьи и сразу обо всем на свете.