Saturday, January 30, 2010

Things I Wish I Knew...


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.]

2 comments:

  1. Most of those points are things that I've come to realize that I didn't fully understand back in college. Internships helped with understanding customers, but the merits of testable and elegant code were mostly foreign. Code was just code, and was presented as such -- you write and rewrite it until it appears to meet requirements, then you manually test it to verify correctly. Too little time was spent on the thinking, the planning, the testing, and the fact that there's a set of design patterns that have been proven to work well.

    Of course, that stuff all takes time and experience to really learn. But I would have loved for the professional development class to haven given me at least an awareness about these things, instead of being strictly about writing resumes and interviewing. If these classes could give pointers about learning software craftsmanship and doing a good job (not just getting a job), I think they'd be much more valuable to would-be software engineers.

    ReplyDelete
  2. I like the "professional development" class idea. A class whose sole focus is to bring to the forefront sets of ideas typically unseen until out of college would be a great help to future software developers and the organization's they would eventually serve.

    Of course, it wouldn't be enough for a student to really learn the necessary skills, but the introduction would be helpful and instructive.

    ReplyDelete