A poor programmer uses the first abstractions and ideas to come into their head, and runs with it.
A mediocre programmer uses ideas and abstractions they've heard about being good ideas for this scenario, and just runs with it, occaisionally rewriting as needed.
A good programmer carefully figures out what abstractions and ideas are appropriate for the job at hand, studying and rewriting until they're sure they've gotten them right, and uses them.
A master programmer uses the first abstractions and ideas to pop into their head: they've been at this long enough to know the right approach.