I sort of take issue with your assertion that you just come up with a complete solution to a problem. As someone who has been doing intermediate programming since the 70s, and being familiar with the iterative release-and-patch cycles for even the seemingly most simple tasks, I think that you may have oversimplified a little!
First and foremost, any program is going to solve several problems. The hardest problem is always reducing user freedom to the point that you can predict their inputs. Design is very similar to this.
The algorithms you develop are not the only possible solution to that particular problem and, in most cases, there are a very many possible routes to take: programming is an expressive medium with many dialects and languages, and programmers have styles.
If you peruse the math stackexchange(s) you will find people who post a mathematical solution that exactly captures the problem and expresses it in a way that people instantly grock because it comports well with their personal experience, and then they reduce it to the more standard simplified form that is in the crib sheets and is taught. This is a good example of variable presentations of a solution to a problem and how the simplest, most elegant is not always the first form.
So, how do you start?
Yes, some knowledge of color theory is helpful, but you don't need to know very much of it. In fact it has very little value outside of defending your ideas from a hostile audience (read: critique). The most important thing to know is: how will these colors work in black and white (kind of zen)? Am I dooming my client over 80% CMYK flood rate on all their jobs? Will they be able to afford the printing if I call for a foil stamped emboss/deboss with UV and 100% CMYK flood on plastic stock?
Technical knowledge of type is important, but you do not need to be a font creator to make use of them. The most important thing to be aware of is space. For type, this is leading (line spacing) and tracking/kerning (inter-word and inter-letter spacing respectively).
To be sure, to be the number one designer in the world, you probably need to have a deep knowledge, but to be above average? You need a basic cursory knowledge of the form and a desire to do better.
The best designs typically have no more than 2 of anything, communicate exactly and only what needs to be communicated, and do not crowd the space. Most of what good design is comes from the basic idea that space is luxury, and density is desperation.
Two font faces, two colors (white paper? pick black and one more), two halves. Two. You want more? Justify it to yourself, but make you do it.
After that, the only question you need to ask yourself is "am I embarrassed to submit this?" If yes, iterate.
The best place to start with learning design on the side is to go find some "designer's design books" or magazines about top-end design. By doing it, you can learn the technical aspects without need for a problem to solve. Then you get out a ruler and notebook, take notes, and then reproduce everything in it that you can. Then you will know space and composition and restraint.