Обычно программист работает не над всей программой а над маленькой задачей по улучшению уже готовой программы. Например, нужно добавить пару кнопок которые будут что-то делать. Или нужно исправить проблему (баг) в программе, например: одна кнопка смещена влево, или не всегда срабатывает пункт меню.
Из таких маленьких доработок и исправлений получается готовая программа.
Для того, чтобы решить текущую задачу программист изучает код, который уже есть, прикидывает в уме варианты решений, советуется с коллегами и выбирает некое оптимальное решение, которое будет полностью удовлетворять требованиям ТЗ, потребует минимальных исправлений в коде, а также, будет понятно другим программистам.
Избрав решение программист приступает к кодированию, т.е. вносит правки в код и начинает отладку своих исправлений, если всё работает как ожидается, то потом свои исправления показывает другим коллегам, которые их одобряют или просят исправить замечания, а уже потом эти правки кода внедряют в основную кодовую базу и тестирование начинает проверять это исправление (доработку)...
У программиста всегда есть план, но на начальных этапах он приблизительный и не очень подробный, а по мере погружения в задачу из этого плана выкристализовывается решение, которое остается закодировать.