As developers we live in an interesting profession. To put it in more scientific terms our industry is an anomaly, a singularity, if you will. Our industry is certainly fast paced, in fact, with the exception of maybe the biotech industry we probably move faster than any other. Our industry though, arguably, has a much broader effect on the other industries that it is involved with. Our industry is somewhat of a meta-industry, being an integral part of almost every industry that exists today.
Very few companies that operate today don’t need developers. If they are too small to hire developers, then they probably have contracted work out to consulting firms that have created, or integrated, software for them. Banks need developers, retail store chains need developers, waste management companies need developers, the postal service needs developers, everyone needs developers. And this has created a huge demand for developers, which is good for you and for me. We enjoy high wages, good working conditions, and the flexibility of working almost anywhere in the world. Our product is virtual, yet real, and can be created and distributed anywhere in the world in seconds. This allows us to work far from where our products are consumed and, because of software that our own industry has created, this is often enabled by extremely simple means.
And yet, our industry is like the wild west. We have very few established best practices, and we often have even less rigor in our processes. Some companies write software as if they were building a glass castle, while others write software as if they are shoveling dirt onto a pile. All of this has created an industry that is like no other. No other industry is as exciting, or as risky. No other industry succeeds like we do, and no other industry fails as spectacularly as we do. No other industry produces companies that so quickly rise to stardom, or just as quickly implode on themselves.
All of this makes our industry the most dynamic and exciting industry around, and one that I wouldn’t trade for any other. But many of these factors have led to a huge problem that we are all currently facing. The huge demand for developers, coupled with the relative youth of our industry, has created hordes of developers who simply don’t understand what they are doing. They do not understand how computers work, or how a compiler works. They use dictionaries and stacks all the time, but they don’t understand that these are classic data structures, and not something that Microsoft just made up. And the problem isn’t that they don’t know these things, it is that they don’t want to know these things.
People need to start understanding that just being smart does not make you a good developer. Being smart certainly does not hurt, but in order to be a good developer you have to be smart and want to learn. You can be a successful developer without wanting to learn, but you cannot be a good developer without wanting to learn. I feel as if I am a relatively smart person, yet if I walked into an architecture firm and told them that I wanted a job, and that I was qualified because I had used AutoCAD a few times, then they would laugh at me. In the programming industry right now, this kind of thing seems to happen regularly. I am quite often regaled with stories of developers and products that people have worked with in the past where someone did something so inconceivable that one wonders how anyone could ever think such a thing was a good idea. In fact, entire sites have been devoted to this very topic.
People’s resumes are so loaded up with fluff that reading it you would have thought that they had singularly solved world hunger and walked on water while working as a Programmer Analyst at their last job. And the reason that people can get away with this sort of thing is that in order to question experience, you have to be experienced. I don’t consider myself very experienced, but in the past I have had to look over resumes that I couldn’t believe had landed people jobs in the past. And the hourly rates that these people wanted were, well, outrageous. I don’t know how you can sit in someone’s office and ask for 45 dollars an hour but not be able to explain the difference between an interface and an abstract class. (No, I’m not saying 45 dollars an hour is outrageous, what I am saying is that 15 dollars an hour is outrageous when you can’t explain to me the difference between “private” and “protected” access modifiers.)
I think the problem is that most developers have no incentive to do better. If someone can do as little as possible, make a good income, and still have a stable job then they clearly don’t have any external forces to push them toward bettering themselves. Some people need external forces, but our industry is operating in a time when these forces are not very strong. So right now we have to rely on developers to have an internal drive to explore and learn, and this is something that I am starting to feel cannot be taught or learned.
Another problem is that most employers don’t push their employees to learn, and don’t provide any learning time on the job. Now, most employers will probably think it is ridiculous to provide an employee with time on the job for learning, but I think it is ridiculous not to. In an industry where being more efficient is the name of the game, don’t you want employees to more thoroughly know products before they start constructing solutions that your business will rely on? How many times have you seen an application built with some cool new technology that was really neat and powerful, yet the application was built in some amazingly obscene way that negated the power of the tool? I would bet that you’ve seen it more than once. Anyone who has worked with asp.net has probably seen the developers who put huge blocks of code in the html as if they were developing in asp.classic.
Now, all of this may be coming off as if I consider myself to be a godly programmer among mere mortals, but I sincerely hope that this isn’t the case. Just for the record though, I do not consider myself to be an amazing developer. I am not a genius, and I would
probably flunk an interview somewhere like Google if I got one. I don’t remember the exact difference between a binary and binomial heap (I do now that I just looked it up). I remember Dijkstra’s and Prim’s algorithms, and that they had to do with finding shortest paths and minimum spanning trees, but I couldn’t begin to implement them without looking it up. What I do know is that I have never had to use any of this in my job (although it would be awesome if I had to, because it would probably be a challenge), and I also know is that I would never fault someone for not knowing these things. But I would fault them for not wanting to know these things.
I would have to say that the knowledge which has been the most important to me are general application design skills. Or, “application architecture” skills if we want to sound really important. But I learned very little about application architecture in college. Everything I know about good application design I have learned from reading Fowler, McConnell, Martin, Hunt, Thomas, Evans, Nilsson, Glass, etc… I have also learned huge amounts from reading many many people’s blogs and from several people that I have worked with. All of the algorithms and data structures would be worthless if I didn’t know how to integrate them into a larger project. And I feel that without this external drive for me to perfect my craft, I would be a pretty lousy programmer. Although, I might actually be a lousy programmer, assuming Dunning and Kruger are correct.
What I hope that you take away from this is that not every programmer needs to be a crazy mathematical genius who knows every algorithm and data structure known to man (although I think Steve Yegge would argue differently). A good programmer doesn’t even need to be an incredible genius. What a good programmer needs is the knowledge that they don’t know everything there is to know, and that they need to be constantly searching for a better way.