News

Back to Basics

I recently saw a statistic that made me think a bit: out of 50,000 developers entering the US job market each year, only about 35,000 have any academic training in software development. (These numbers, mind you, predate the current economy, but I suspect the proportions remain the same even tough the absolute numbers may have changed). Now, I'm not about to argue that developers who came from paths other than a computer science degree are bad developers; I've known too many brilliant self-taught developers to make such a silly statement. But if you've gone from poking at a computer to writing code for yourself to writing code for a living, you might not even know what you're missing.

Looking back to my own CS training (which was more years ago than I really care to admit in public), three things have stayed with me and proven useful over the intervening years. Fortunately, you can learn plenty about these things even without formal classwork:

  • Algorithms
  • Data structures
  • Language exposure

Algorithms - the low-level routines that make up our programs - are obviously very important. If you have a list of items to sort, you need to have some plan for sorting it. If you have a big block of text to search for a particular string, you need to come up with a way to perform the search. To some extent, today's high-level languages protect you from needing to come up with these algorithms yourself; there are ways to sort and search baked right into the language or into the framework you're using. And if you need something obscure (like a way to perform a Fourier transform) you can always look it up. So what's the benefit of learning about algorithms? You learn how to analyze them. Thinking at the level of algorithms will make you very aware of the tradeoffs in your code. It can also help you spot brewing trouble before it spills over. Once you understand the difference between an O(log n) and an O(n2) algorithm, you can start looking for the patterns and optimizing your code almost without thinking about it.

Data structures cover all the ways that you can stash data in your code. Do you need a linked list? A doubly-linked list? A hash table? A balanced tree? Even if your framework provides the alternative structures "for free" do you know the differences and tradeoffs? A good grounding in data structures will help you avoid writing extra code or saddling your programs with performance issues that could have been easily avoided.

Language exposure. You won't find this one on the list of courses for a CS degree, but it might be the most important skill of all. Before I got out of school I'd programmed in a dozen languages, from 6502 assembler to Pascal to VAX assembler to Lisp to C and beyond. Some of these languages are mainstream, others have next to no commercial potential. But the point of language exposure is not to teach you the details of the language you'll be using in your job, but to show you that the design of programming languages can and does vary. If you learn how to write C#, always write C#, and never step out of the C# universe, your C# skills may be excellent. But you'll be missing out on other ways to do things, and less prepared to move to a more rewarding position if one comes up. An all-purpose developer is more highly valued by most employers than a C# developer.

So, if you missed the coursework, what should you do to make up the lack? I have two recommendations. The next time you're thinking about getting training on some specific technology (such as OLAP processing with SQL Server or whatever), take a combined data structures and algorithms course instead. You may be able to do this at a local community college; otherwise, there are excellent textbooks in the field that you can work through on your own. Second, don't let yourself get trapped in a language dead end. Even if your work is exclusively in one language, learn a second at home in your own time. In fact, it's a good discipline to dig into one new computer language every year. You just might find one that fits your current job so perfectly that you can save the day by introducing it!