Сначала думает, с чего начать, то есть как подступиться.
Затем думает, как бы оптимизировать, чтобы получилось минимум кода и максимум производительности и функциональности. Может проанализировать и придти к выводу, что если сейчас бросить наполовину сделанную программу и начать делать по другому пути, то в итоге всё равно быстрее закончишь. Это бывает, к примеру, в тех случаях, когда программируешь какой-нибудь витиеватый разветвлённый алгоритм, а потом понимаешь, что можно и эту работу поручить компьютеру, чтобы он сам его строил.
Затем думает "Надо загуглить как запрограммировать такую-то функцию."
Затем думает "Где же всё-таки таится ошибка".
Затем, после компиляции, находит баг и думает "Опять где-то ошибка".
Ещё на некоторых этапах создания сложной программы думает: "Интересно, а смогу ли я её доделать или запутаюсь?"
А может и так: "Да ну всё нафиг, всё равно не окупится." и бросает на пол пути (если конечно работает на себя, а не наёмный).