Programming advice via art advice
Lately I've been getting into art again. I'm trying to learn figure drawing and character design. This requires learning lots of technical things: human anatomy, clothes, art techniques (making good lines), color theory, perspective etc. It's a lot. I've found that there's one piece of art advice I run into over and over:
For a long time I felt the same about art as many people probably feel about programming: using references feels like cheating.
I'm not coming up with something from my own brain. I'm just copying something I can see from a photo or a model. REAL artists surely sit down and imagine a universe, and make it real.
Well no. Barring going completely abstract and weird, everyone draws from things they've experienced. Especially for new artists, using references is essential. Your memory probably isn't as good as you think it is. You don't want to solidify bad habits by drawing something inaccurately. Most of the time I've tried drawing something unfamiliar from memory, it's ranged from a minor to major disaster.
How do you know what anything in the world looks like without seeing it? Like... how do you know what a dog looks like? How do you know where the legs attach to the body, what color it is, what texture, what size? The answer is that you saw or otherwise experienced a lot of dogs in your life until you remembered. If you really wanted to draw "without reference", you'd have to be a brain in a jar in a dark room.
Even with a lifetime of looking at dogs, you almost certainly still have to look some things up though. What's the exact proportion of head to body size for some breed of dog? What's the pattern of spots? What are the fine details of the ear? How does a dog move when it runs? How do the muscles stretch and contract?
And you might even need help with some of the basics. I sure do! Maybe you need to fit the dog into a weird perspective and you use a perspective guide for that. Maybe the lighting is hard to figure out and you need to look at a model or photo to see where the shadows go. Maybe there was just a really cool idea, some colors or composition choice or whatever, from someone else's art that inspired you, and you keep it nearby while you draw.
Getting this stuff right has to come from research. Yes, experienced artists have studied and practiced so much that they internalize a lot of that information - they've memorized it, either deliberately through careful study or accidentally through repeated exposure. It saves them time, and it lets them devote more of their effort to the creative bits and less to bookkeeping. Does it make them a strictly better or more "real" artist though? I wouldn't say so.
Another thing that comes from experience is knowing where to find answers you don't have. Maybe you know of a tool or technique that a less experienced artists hasn't run into yet. Maybe you have a really good collection of references that you can always pull from. Maybe you just know who to ask. I would say that contrary to references being "cheating", being better at research makes you a more efficient and effective artist.
"Art" comes from information being filtered through a human brain before it hits the paper, and some of that process is bound to involve creativity whether you use no references or tons of references. Maybe you interpret the information a certain way. Maybe you put different bits and pieces of information together to make something unique. Maybe the art is in the choice of subject matter or the manner of presentation.
Programming is the same
Unless you came up with theory of computation from scratch, wired a bunch of circuits together and wrote a program for it, you're using things other people made. The operating system, the compiler/interpreter, algorithms — all likely came from someone else. How would you know about any of that without reading about it somewhere?
Programming is when you take all that information, filter it through your brain, and end up with something useful. Some of that process is bound to be creative work. Creativity comes from the choice of tools, the choice of algorithms, even the choice of which problem to solve in the first place.
"I used code from Stack Overflow, I suck". Well, at least you know that Stack Overflow exists! You knew what to search for to find that snippet of code. Maybe you don't even know how the code works, but you must've known how to test it to make sure it worked. Being good at research, finding answers, and using other people's code and tools effectively, are an essential skill for a programmer!
Spinning your wheels trying to solve a problem that many other people have already solved is often a waste of time. There are algorithms that I wouldn't even feel comfortable implementing without a lot of effort and testing, and if I'm trying to solve a bigger problem, I'd rather work on that rather than rolling my own everything.
Having a lot of these things memorized so you don't have to search for it surely makes someone more efficient, but I wouldn't say it makes them a strictly better or more "real" programmer.