В большинстве случаев, когда я начинаю проект по программированию / дизайну, у меня есть хорошее представление не только о том, что я хочу, чтобы он делал сначала, но также и о некоторых направлениях, которые, вероятно, изменят требования. Это определяет выбор начальных функций (которые определяют разработку через тестирование) и может дать мне повод разделить классы в направлении, которое, я думаю, будет полезно позже.
Если вы просто начнете выбирать тестовые наборы случайным образом из обширного списка функций, которые вы рассматриваете, то направление развития ваших начальных классов также будет несколько случайным. Поэтому я думаю, что для того, чтобы стать опытным разработчиком, сначала нужно тщательно выбирать направления - не обязательно с большим количеством формального анализа, но, по крайней мере, инстинктивно о том, какие функции будут иметь значение для архитектуры по мере роста проекта.
Одним из основных моментов XP и TDD является то, что вы не хотите тратить слишком много времени на функции и направления, которые не требуются в соответствии с вашими первоначальными требованиями, поскольку заказчик передумает, когда увидит, что Вы уже сделали это, так что вы не хотите тратить слишком много времени на обдумывание. Но часть развития ваших навыков и инстинктов как разработчика - это тренировка и повышение вашей способности предсказать, что неизвестное может оказаться важным позже.
OTOH, обещание XP и рефакторинга заключается в том, что вы можете исправить проблемы при первоначальной факторизации проблемы, когда требования подталкивают вас в этом направлении. Я думаю, что это правда, но вы все равно будете более ценным вкладчиком, если сможете принять правильные решения с первого раза. И сделать так, чтобы это выглядело как удача - «Испытания заставили меня учесть это таким образом» - это часть навыка.