When I was a young child an adult friend of mine took me over to his house and showed me his Commodore 64 computer. From the moment I saw the music software and the other things that he could do on his computer, I was hooked.
From that moment on, I played with computers whenever the opportunity arose. Before long, an uncle of mine, who was a computer programmer, sent me a Radio Shack TRS-80 computer. My interested piqued, I started programming in BASIC, going to the library to get programming books, and saving my money for computer parts. My interest for computers never died.
Years Later
Years later I found myself studying computer science (CS) at Eastern Washington University. I enjoyed it. Aside from some occasional frustration at my inability to easily do a homework assignment, I loved it!
Then, a bit of realization struck, which I didn't fully understand at the time:
- I never heard version control systems mentioned
- The instructor's used #include <iostream.h> instead of #include <iostream.h>
- Unit tests were unheard of
- Test-driven development wasn't considered
I Wish I Knew...
Having reflected on some of the insights I had earlier, I've realized many different things that I wished I knew when I started in school. I almost think they should have been obvious, but I had no mentor to ask and no prior knowledge to inform me. Here's a few of the things I wish I knew long ago:
- Computer Science is not a programming degree. Although much of what is learned in computer science is useful when programming, knowing everything they teach in CS doesn't make you a good programmer.
- Programming is an art. Programmers need a sense of aesthetics. They need to see how different pieces fit together to form a beautiful and functional whole.
- Good code is beautiful code. Just as a good writer's sentences are flowered with adjectives and adverbs that form vivid images in his readers' minds, good code helps its reader understand and envisage the whole intent of the code. Each variable and name is like an adjective or adverb that adds clarifying definition to the whole.
- Programming is rarely engineering. Unfortunately perhaps, requirements are rarely what they seem. A good programmer communicates, questions, and suggests whatever might be the best for her customer; she doesn't assume the customer knows what she wants.
- Universities can't teach you everything. And, they don't even try. A CS degree program doesn't try to teach you everything you'll need to know, because much of it can't be taught. At best, the professors can encourage the student to go off and do research on their own. It takes hard work, and lots of practice to be a good programmer. Although you need not go through trial and error to make a test pass, it takes trial and error to perfect your skills, and there's nothing that you can do about it. Put in your 10,000 hours. Do it fast, and do it right. Read, study and learn on your own.
Countless other details could be added to the list above. I'm sure there are many more which I have yet to consider, but I hope this will help some future student.
What do you wish you had known?
[Image courtesy Guy with the Bolex on Flickr.]