Programming has a lot to do with design. Don’t mistake my use of the word ‘design’ for ‘aesthetic’ or ‘art’ — I’m referencing the inherent meaning of design. The organization, the structure, the intentional placement of everything for the purpose of usefulness and longevity. If design isn’t involved in programming than I’m in the wrong career and have been for a long time.
With design comes the principle need of understanding. Design can not be effective unless it’s directed at solving a problem. A problem can not be solved unless it’s understood. Complexity contributes to misunderstanding. You can see where this is going.