I'm happy in my present situation, but working at Microsoft has always been in the back of my mind. So, when a recruiter for the Business Solutions division tracked me down, I was certainly going to find out more. The project sounded interesting enough, so when he asked if he could take it to the next level and ask some technical questions I said, "why not?" The questions he asked basically ranged from basic stuff everyone should know to basic stuff anyone who got a CS degree should know. I've been writing code just about every day for the past 15 or so years, starting with ASM. When I started out, I had an 8086 Zenith laptop with a CGA monitor that couldn't really do much of anything else. I actually wrote programs for quite some time inside the command line debugger until I managed to find some cheap assembler program at a local computer swapmeet. As a kid, I spent so much time programming that my mom would ground me from the computer, not from going out. My first first fight was with my programming buddy that "stole" my code and changed my copyright with a hex editor (Yeah, I learned that software piracy was a bitch before I could drive). Later, I got a bigger machine and moved on to C and then C++ and did a ton of work with the STL since those were still the days when Windows was still a DOS program :). These days, I write code literally from the time I wake up at 5:30 AM till I sleep (which usually results in far less than 8 hours of sleep). It's not that I have to. I just really enjoy it. I'll hit the clubs or go out on the town every once and a while, but most nights I'd rather be coding. But... I didn't get a CS degree. To the dismay of my teachers who all had their own ideas of what I should do, I was actually going to get a Theology Degree... I never could kick the programming habit though and ended up dropping out after two years to start a consulting company.
Although I've written and optimized pretty damn complex code like H.263 video compression, path finding AI, etc., worked on teams with people that had shipped products for Macromedia and Microsoft, and shipped a few products personally, I haven't had to write my own heap class and I certainly wouldn't be using some of these slow ass sorts in my own apps (but hey, the .NET framework itself uses a quicksort which is pretty easy to implement). I faired well on the majority of the questions (like "what's the difference between a mutex and a critical section"), but it really made me feel silly that I couldn't instantly pull the answers off the top of my head to a couple of them. Why? Because it was basic stuff. Not the kind of stuff you may ever have to do in practice, but the kind of stuff you would definitely have learned if you went to school. If you didn't go to school, you have some programming chops, and some basic math skills, it's the type of stuff that you could teach yourself in a few hours. It reminds me of when I was in Junior High. We took a test to measure everyone's math skills for placement. I always enjoyed math, so I figured I would ace the thing. And I aced half of it. The complex math section. Somehow, I managed to get one of the highest scores on the complex math section, but totally screw up on the basic math section. Fortunately, the complex math score is the one that mattered, but I was always perplexed by how the hell I managed to score like that. In the end, I told myself I needed to slow down and double check the simple stuff. Treating it like it's braindead easy just makes you make braindead stupid mistakes.
This weekend I decided to go and close this little knowledge gap. I was going to start reading POSA 5 this weekend, but that can wait till next. The process has been suprisingly fun. I expected it to be pretty lame, but I was up till 4 am last night optimizing my radix sorts and heap sorts. It wasn't till my girlfriend's snores on the couch woke me up from my trance that I realized how fast the time was flying. If you didn't go the academic route, I highly recommend the excercise. Yeah, you might feel a little silly doing it, but it should be pretty easy to work through--and if you are a nerd like me, you might even enjoy it.
We'll see what happens next. Maybe I won't like the team or the offer. Maybe they won't like me. Maybe I already shot myself in the foot. In any case, I am sure as hell going to prevent that same foot from getting shot in the future :)
In junior high, I wrote a GUI using GCC and Allegro for a report about Bill Gates. We used to call him the "super nerd". The one that was so smart that it didn't matter he was a nerd. It would be funny to end up at his old company one day... though I don't think it would suprise anyone I grew up with.