Computer programming constructs, tests and revises programs that express computations in an executable or interpretable form. It connects a problem specification to data representations, algorithms, interfaces and error handling. Writing syntax is one part; deciding what results and failures should mean is also part of the task.
For example, computing an arithmetic mean requires representing the observations, accumulating their sum and dividing by the count. The computer program must also define what happens for an empty input, unavailable data or a number representation that cannot hold an intermediate result. Choosing an algorithm and testing ordinary examples does not automatically settle those boundary cases. A useful implementation makes its assumptions visible and supplies evidence through tests, analysis or proofs appropriate to the claim.
Articles by others on the same topic
What makes Ciro especially mad when programming is not the hard things.
Especially when you are already a few levels of "simple problems" down from your original goal, and another one of them shows up.
This is basically the cause of Hofstadter's law.
But of course, it is because it is hard that it feels amazing when you achieve your goal.