"Understanding the audience and their interaction" is commonly referred to by programmers as "usability engineering" (in design terms, it's also known as
interaction design, which is a sub-discipline of industrial design.) It's a talent very similar to programming, and one almost all programmers are good at, for the same reasons they're good at programming: it involves structural analysis of the actions users are performing, getting into the mindset of users, a lot of problem solving and "polishing off burrs" to optimize and automate workflows.
On the other hand, communications design—what you call "pretty colors and interface"—is an entirely different set of skills, honed mainly by years of critical exposure to different visual aesthetics and artisanal practice in replicating those aesthetics to understand their composition. It's an orthogonal skill to programming—but, once it has been done and a suitable aesthetic created for a piece, it's pretty easy for a programmer to take the results (a "theme"), break it down structurally into re-usable components, and then apply those components to solve their problems. The bit the programmer is untrained at, the understanding of what works with what, has already been performed by the designer.