Programming is like digital LEGO. You can create infinitely amazing things using a finite amount of blocks by combining these blocks in a way that makes sense (or doesn't, if that's what you are aiming for). I love Minecraft and LEGO for exactly that same reasons why I love creating things with code. I just realized that design is very similar to that.
Actually, any field or activity can be broken down into a finite amount of blocks. All these blocks are variables. You can combine different variables in some way and create something unique with them. For example, in graphic design you will work with compositional elements: color, space, shapes. If you randomly mix them and act as if you were blind, you are likely not going to get very far. However, if you structurally add them to one another, basing each of the decisions on the previous ones, you may create something decent!
Also each of the building blocks and environments you are working in has it's own constraints. Knowing not only the possibilities, but also limitations of the systems is important to get more out of building stuff. The more variables and constraints you know, the more power you gain — you can experiment with them, combine them in the very unexpected ways and create true masterpieces.