To reiterate much of what you said, a complex problem can usually be broken down into discreet blocks with each block being simple to fully grasp. Decomposing the complexity often reveals a much simpler structure that can be reassembled into a system that provides the same desired outcome, but in a more understandable and logical way. As an example, when you see "spaghetti code", there is typically a poorly designed data structure that requires complex code to "fix" the underlying issue. It is much better to have a good data model and bad code, than a bad data model and great code.