Для новой задачи не всегда возможно (вернее, всегда невозможно) в поставленные сроки сформулировать корректное решение и обработать все возможные проблемы, поэтому вся разработка софта - итеративный процесс, начинающийся с базового прототипирования, в котором главное - достичь функциональности (решения) по какой-то мэйнстримной ветке, а уж затем прорабатывать побочные случаи