Balance of abstraction
I like writing code, it is what is called "coding" nowadays. You write code, encode your thoughts into it.
What I like even more than "coding" is programming – that’s where the real creative process lives.
While writing code can be considered an implementation detail (you can essentially use any Turing-complete language to write any program), the level of elegance, robustness, design soundness, all of these depend on the way you do your programming.
So when we do the act of programming we create abstractions. I have caught myself all very often that it is hard to determine the right level of abstraction in the beginning.
Make it too abstract and you will have difficulties understanding that intertwined mess of a program later, possibly in several years time.
Make it too concrete and soon you will notice that your rigid structure cannot accommodate the new requirements.
The trick is to find the balance, almost like when a musician must feel when to add a pause that will enhance the composition instead of compromising it.