... is in taking simple pieces of logic and connecting them in a manner that gets you the result you want. It isn't voodoo science; it isn't magic.
The real difficulty is when you have a result that needs a huge number of pieces of logic to be linked to in a tricky manner. Note that the individual pieces are quite simple.
If you look at it this way, all major software development issues stemming from programming is not clearly grasping the links (structure/architecture). If knowing is half the battle, not knowing is being blindsided by a burly Hun before you even knew the battle had begun.