I have to say it: there is a severe lack of skill in the technology world today, even among senior-level developers. Perhaps I just have too high of standards, but when I see a person working in technology, I kind of expect them to have the requisite skill set for the job. It always amazes me when I see a developer, even a senior-level developer, who doesn't know the basics of their own system (i.e. an ASP.NET developer who doesn't understand CSS positioning or a .NET developer who doesn't understand the framework design guidelines). They may have degrees and have years of experience, but they have no actual skill. It's always concerned me a bit that people have so little skill, but I wasn't able to put the problem into words until recent. Well, that's not completely true. An old friend of mine put it into words years ago, but it wasn't until this week that I was reminded of my own story.
Last week I was in a bookstore looking at a few design patterns books and a "1960s NASA engineer" type of guy in a white shirt and tie came up next to me, dressed in extremely casual blue jeans and a black shirt, looking at similar books. I noticed he picked up a rather lame design patterns book, so I took it upon myself to hand him the GoF book saying "This one is the classic". He thanked me and started to flip through it. A minute later I realized that I couldn't resist asking: "So, what exactly are you looking for?" He mentioned he was looking for a book demonstrating a state machine. I grabbed another book, flipped the pages a bit and handed it to him saying "page 486". His response was "Wow, thanks... so, where did you go to school?" I have to admit that I've gotten many questions in bookstores, but I've never been asked that one FIRST. The way he asked the question wasn't so much out of sincere curiosity, but more out of arrogance. It felt like wanted to compare his degrees to my own. I simply replied "School? What? You're looking at it...", pointing to the wall of computer books. He immediately shut up and stepped away. I'm not sure if that qualified me as a leper or if I just castrated the man's sense of academic accomplishment, but, regardless, that conversation was over. However, a few moments later I found a book I was looking for and said "AHA! This will make them think!" The same man curiously asked "What do you mean?" I explained that I was looking for a book to recommend to developers to help then get a clue about software architecture. The man gave the look of familiar with my situation and said something I haven't thought about in years: "Oh yeah... I know exactly what you mean. Some people just don't get the difference between a coder and a professional." At that point I had my flash back to a time of my life almost 6 years earlier... back when I was a coder. It was a lifetime ago and I had all but repressed until recently.
After that, I spent a tremendous amount of time going back to the books and learning more about technology. In high school I had some of the lowest grades in my classes because I spent my nights reading video game programming, graphics programming, C/C++ programming, computer history, networking theory, Novell NetWare, and web development books. In college, the pattern was being repeated in a the same familiar way. I spend a ton of time studying all kinds of new technologies, one of which being XHTML/CSS design, all to the destruction of my meaningless academic career. After finally breaking free from the tight bondage of academia I went to work for a few places as a PHP developer. After one of two complete waste-of-time contractor positions I finally realized that it was time to cross over to .NET. So, I spend an incredible amount of time studying .NET concepts, ASP.NET, the Framework, and C# technologies. After a month I took and passed the 70-315 (ASP.NET) exam and the 70-229 SQL Design exam a week later. From there I went to study the 70-320 (.NET components) and 70-228 material (SQL Administration). Around that same time I realized that Mozilla finally released a product that didn't suck. Not only did this product not suck, it was by far and away the most revolutionary piece of technology since the Internet itself: Mozilla Firefox 1.0. With that I also started studying web standards much more deeply. Being former Linux hacker, I wasn’t and still am not brained washed by the Microsoft extremist cult, so I've always been open to having the best technology regardless of vendor.
As you can see from my story I know what it’s like to be a coder and I know the temptation to remain as a coder. You think “your way” works and therefore you shouldn’t change it. In fact, you probably hate other technologies, because their way isn’t "your way". I can understand that too, but really it’s just a misunderstanding of that other technology. My first ASP.NET application (a photo gallery) had absolutely no declarative code and was written with 100% Response.Write statements (I often tell people "make sure your first project in any technology is NOT a production one"; this is why). I didn’t have the first clue what I was doing and, being a longtime classic web developer, I could not get that “magical” ASP.NET postback through my head. Building that same application today would consist of an elegant ASP.NET custom control and two or three web forms. I also understand what it’s like to say “...but this is how I do it in this other technology”, when in a reality that’s a completely meaningless statement. Each technology has its own paradigms, naming schemes, guidelines, concepts, and languages. Just because you are a Java rock star, doesn’t mean you will be able to do anything in .NET for at least 6 months. The same goes for VB rock stars and PHP rock stars (as odd as it sounds, in my experience PHP developers have the hardest time learning .NET where as VB developers excel rather quickly-- this goes to show how hard it can be to un-link and old technology from your mind). I also know what it’s like to ask yourself “how can I do this?” That’s what a coder asks where as a professional asks “How has this been built before in this technology; what is my precedence?” In case you didn’t know, software development has been around for decades. If you are running around trying to come up with a way to do something, you may be wasting your time as it’s probably been done before, the debates have probably already happened, people have probably already learned from their mistakes; you just have to accept what they've done for you, within limits, of course (i.e. C++ design patterns transfer to C#, but obviously not OOP style as .NET doesn’t allow multiple implementation inheritance).
So, if you find yourself in a place where most of your development is done doing things “your way” or the way “you have always done it” or if you ever ask “how can I do this”, maybe it’s time to break down and take some time out of your life to convert from being a coder to a professional. It is definitely an investment, but with many great books out today (not all are so great), you could probably convert from being a coder to some level of professional programmer rather quickly (it took me a bit longer because I didn't have any role models to work under and I had no idea what the scope of the training was). There is an old computer science saying that goes something like this: "Anyone can write code that a computer can read, it takes a professional to write code a human can use." We should all think about that and possibly post it on our walls.
To aide in the process of converting from a coder to a professional programmer, a few months ago I wrote up my requirements for a Senior-Level developer or Architect on my blog. It should give you a shell outline for some of the technologies and topics you seriously need to have under your belt to be a professional.