Есть два подхода, у них есть приверженцы, некоторые из них считают других невеждами или занудами, в зависимости от подхода, которого они придерживаются.

Первый подход - семь раз отмерь, один раз отрежь. Это когда перед тем как добавить фичу, процесс её добавления продумывается до мельчайших деталей, пишется подробное ТЗ, его можно передать кодеру, который не умеет думать, но умеет читать на русском языке и писать на нужном языке.

Второй подход - что тут думать, прыгать надо. Это когда услышал что надо сделать, открываешь исходники, говнякаешь, через 30 минут себя останавливаешь, смотришь на промежуточный результат, если что-то выходит - хорошо, продолжаем, если нет - выкидываем и начинаем заново.

Я считаю, что эти подходы нужно умело сочетать, пользуясь интуицией. Например, так:

def solve_task(task, timeout):
    if task.time_spent > timeout:
        raise TimeoutError(task)
    result = think(task, minute(task.time_spent + 1))
    if result.status = GOOD_IDEA:
        result = do_it(task, minute(30))
    else:
        result = do_it(task, minute(15))
    return result if result.status == DONE else solve_task(task, timeout)

Главное – не стоит бояться (п)оказаться занудой, который для того чтобы покакать пишет техническое задание (которым потом можно подтереться), равно как и (п)оказаться невеждой, который не способен формулировать свои мысли и надеется на авось. Главное – решить задачу как можно быстрее. Каким способом вы пытаетесь этого добиться - не важно, важен результат.

Почти вся работа в программировании по большей части - уточнение формулировки задачи. Продумывание архитектуры - устранение неточностей. Это повышает точность задачи, но часто занимает время. Попытка действовать наобум - срезание углов, вероятность того, что получится то что надо - мала, того что при этом оно не испортит остальную систему ещё меньше, но она есть и если это случится - оно займёт меньше времени.

Update: прочитал про стратегию штанги в “Антихрупкости”. Это она в чистом виде!