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:
- 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
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
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!