ALT.NET Canada kicked off last night and was great fun. Bil has some initial coverage here complete with video. Mo Khan discusses his take on the fishbowl topic, “Why are fundamentals important?” I wanted to take a few paragraphs and give my two cents on the topic.
The fishbowl last night got too hung up on the particulars. The point that I personally wanted to make was that fundamentals are more important than APIs/technologies because fundamentals give you a framework within which to understand any API or technology. That’s not to say that specific technologies aren’t important. You won’t get too far in the .NET world not knowing the BCL.
I’m not a crotchety old programmer who is going to insist that you learn everything that I know about software “because I had to walk 2 km to school every day through blowing snow uphill – both ways!” I don’t expect you to (and wouldn’t want you to) spend years writing C++ code to understand just how bloody hard it is to get pointers right or manage memory. (Do I need a *& or an &* here? And is that one * or two **? If you don’t know what I’m talking about be thankful. Waste of brain cycles.)
As far as what I consider fundamental… OO and design patterns, definitely. But also high level knowledge of CPUs, memory, disk, and network. The fundamental building blocks upon which all software and hardware is created. (Working at a high level of abstraction is fantastic and much more productive, but even when working at such a high level, you need to understand – to pick an arbitrary example – that durable transactions require disk I/O and that disk I/O is an eternity in processor cycles.) You should also be familiar with Big-O notation, data structures, and algorithms. You should understand the services provided by a managed runtime (.NET, Java, etc.).
Are you a bad programmer because you don’t know how to implement a red-black tree from memory? Absolutely not. (I don’t personally remember either!) But you’re a good programmer for knowing that there are more data structures out there than an array. You have the fundamental knowledge to try solving problems in a myriad different ways.
Programming languages, runtimes, and APIs come and go. If you only understand those, you have a steep learning curve to climb every time technology changes – and it does. The fundamentals will always serve you well regardless of the technologies involved.