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.
Loved the article? Hated it? Didn’t even read it?
We’d love to hear from you.
Nicely summarized, Justin. I feel your pain, man. I am not the smartest bulb in the box either. But I love my craft and I treat it like a real profession. I spent a week with Juval Löwy back in October at the Architect’s Master Class. It was a great week. Juval’s teaching was very good but I think that hanging out with 35 other people like me was just as important.
Juval gave us some interesting things to think about. His key argument was that our profession is pretty much a joke if you think about it honestly. We have no real standards, no code books like the civil engineers have. If an elevator breaks and injures people, for example, the lawyers sue everyone except the people who make the software that drives the elevator. In Juval’s opinion, this is because software development is so far from being a discipline that it’s beyond the reach of redress or reform.
I wouldn’t go as far as Juval does but I wonder what others feel about his claim?
Good points… I actually had a similar thought recently about funding and how people equate that to good programmers and smart people…
Or my less articulate rant of the same vein 😉
Love the site! Keep it up…
@Kevin I think Juval has some valid points, but like you, I wouldn’t go quite so far. If development was held to the same level as structural engineering, then sure we could consider ourselves a real profession, but no one could possibly afford to develop anything. It would crush our whole profession under the weight of litigation.
In terms of elevator software though, if the elevator software was to blame I am quite sure that the company who wrote it would be sued. I don’t think the fact that it is software would stop a lawyer from filing suit.
@Kyle Nice posts, pretty hilarious. I’m curious as to what DB questions you were asked though. I know I would totally fail an interview like that, I am terrible at interviewing and I often forget things when someone asks me out of the blue.
Good points, and I agree with the majority of them, especially the assertion that right now, programming is like the Wild West. We are still shooting from the hip and being rewarded for it, but this cannot go on forever. Eventually software development will have to settle down to a craft with a history, with rules, and with standards. Let’s not forget that the first installations of electricity in houses involved running bare or poorly insulated wires over ceramic insulators on the outside of walls. Today there are reams of electrical standards and regulations.
You are right about what it takes to become what I would term a "responsible" developer. It is not absolutely necessary that we all understand byte code, but we should all be striving to learn better ways of doing things. This is what has been my driving force in becoming a software developer…I try to learn something new everyday. Not everyone has that sort of built in thirst for knowledge.
To put it another way, a crane operator may not now how every piece of the crane’s engine works, but he had better know its limits and operating procedures perfectly. Failure to understand the implications of choices you make on your job can have serious consequences.
Keep up the good writing. I will check back often.
Great post. I agree with you that many developers "don’t want to know these things." However, I don’t think employers pushing employees will accomplish anything much. For example, in our company, we have various technology groups, online forums, blogs, etc. But you often see some employees displaying enthusiasm and interest, and some others who don’t participate as much. It is the old saw about taking a horse to the water, but not being able to make it drink.
I think the right strategy for companies is to find people who are really interested in learning. Even if they don’t get the opportunity for learning during the working hours, they spend most of their spare hours catching up. I often ask a question in interviews about what the person has learnt in the last few months or what books/blogs they read. Often, this seems a very easy way to filter out bad candidates.
Wow, I couldn’t have said most of it better myself… and it was like reading something that I might have written. Lots of good points, including the comment on the youth of our craft (think software (a few decades) vs. physical buildings (a few centuries)) and more importantly, the need for all of us to be working hard each day to continue learning so that we can improve what we do.
This article made me feel all warm and fuzzy about my intellectual shortcomings. Thanks : )
Nice post! I can feel your pain. I’ve been exactly there, interviewing and working with people who have no desire to learn anything beyond what barely sufficient to get the job done. In fact, I wrote an article a while ago about this: http://www.buunguyen.net/blog/the-wrong-attitude-of-learning-on-the-job.html.
Very nice article Justin. Being smart or talented helps but is by far not enough in most fields. One also needs desire and passion. Unfortunately nobody can teach desire.
It’s just the nature of the employment market, and will probably only get worse.
A few people out there are interested in coding because of the extreme and never-ending challenge it presents. They get a buzz out of finding neat solutions to complex problems, and better ways to do things and just the process of learning itself. Some of them take it too far, but plenty don’t.
But there aren’t enough of them to fill the growing developer requirements, or they’re doing other jobs with similar challenges. So those who fill the gaps are probably in the main people who got to the end of high school and couldn’t think of anything better to do and went into ‘I.T.’ by default (‘after all, bill gates is rich …’).
So the few who are ‘into that kind of thing’ are a shrinking population (relatively). And since they probably don’t go into management (by choice or just by quantity), they’re also possibly not recognised or rewarded. In fact, probably penalised and marginalised in other ways as well for being so involved in their craft.
For example, does a HR ‘manager’ have any useful output from their peoplesoft thing on things like this? Or are they just lumped together with other ‘resources’ which consume money?
Does it really matter though? I’d wager that even COBOL coders know more about their machines and performance issues than do Java or .NET programmers. Modern hardware is so fast and loaded with memory in many cases it doesn’t matter if you use a hash table or a linked list for an associative array for example. So long as the job gets done the programmer can move onto the next crappy task on their list (and fix it later if it runs too slow). So why would you bother wanting to know how they’re implemented?
Is it even part of a more deliberate push to dumb-down programming? Driven by HR or management? This whole software ‘engineering’ nonsense that coding is only the last tiny part of implementing the design (which someone smarter than the coder did) can’t help either (well that was the going thing when I went through uni, I don’t know if it is still being peddled). It is almost as though programmers aren’t supposed to be smart of inquisitive, they’re just supposed to do what they’re told and be quick about it. HR also pushes the training course approach. Training courses are mostly junk but without certificates they have no neat little check-boxes they can put next to your name so they can work out how much they should pay you.
Sorry – i’m rambling here. But given that the whole industry is really geared toward this outcome, it isn’t surprising that this is what is happening.
This is funny. I started developing software professionally 14 years ago. 4 years ago, I walked into an Architecture firm and said I wanted to start designing houses. (well, started my own firm and called it home design to avoid not being licensed, but you get the idea) I found a mentor and spent 14 hours a day studying everything to do with architecture and building codes. 6 weeks later I was designing houses, 6 months later commercial structures. Intelligence had nothing to do with it (although a good memory for detail does help). It was, as you point out, a passion for learning and the realization that I didn’t know everything. Learning and humility trumps IQ every time.
Even more interesting, over the past six months I have moved back into software engineering. My experience becoming an "architect" was the best thing I could have done to increase the quality of my code. Standards, patterns, readability and good communication are now much higher on my list than when I thought I knew everything.
Finally, if anyone was wondering, programming is definitely more fun and pays a hell of a lot better.
@Kyle Yeah, when will people start to realize that everyone has gaps in their knowledge? Just because I deal day in and day out with something doesn’t mean that someone else does. Once in an interview I was asked to quote the syntax for opening a DB connection, firing off a command, and then reading the contents out with a data reader.
My response was "All of that code should be hidden away in a data layer, I haven’t had to write code to do that in years." I went back and looked at some code to do it, and it quickly came back to me, but off the top of my head I couldn’t remember the exact syntax. But for the interviewer, he probably writes that code daily, and can’t possibly imagine that someone didn’t have it memorized.
Interesting post. I do agree it’s important to understand how a computer works in order to program well.
One problem I see is that so many developers work in small groups without many resources that there is no wonder why there are so many security breaches. There does not seem to be much verification and certification done for software as there is for hardware products.
@maggie Agreed, but at the same time, the amount of research and money poured into hardware dwarfs what companies often spend to develop software. In my opinion software needs to stay lean in order to be affordable to the wide swath of companies that need it, and we instead need better tools that allow us to write better, safer code.
I agree though that as an industry, far too resources are spent toward making software robust, even in small groups.
Nice Article, agree with it, would be interested in comparing results from senior, mid level, and entry level developers and see who does things right, or more right than others.
if anybody has free time, read "Zen and the Art of Motorcycle Maintenance", I am a Software Engineer finishing Masters Degree this summer, this book was written in 1968 and is surprisingly accurate today. Not about software, but a lot about how to think differently about the world around you, nice side effect of developing software…..
My programming instructor from our local community college forwarded your blog to me. Great read, thanks. I am a 32 year old student trying to get into the world of programming and I certainly have that drive to improve and learn as you mentioned in your article. I definitely wouldn’t have had it in my late teens and twenties. We have a local group called the Microsoft Developers of Southwest Michigan (www.devmi.com). At this point, much of what they talk about is over my head, but it’s slowly starting to make sense. I hope one day I can make that 45 dollars/hr you talked about, doing something I really enjoy. Hopefully taking the time to go the extra mile and learn from people like you and local groups will one day get me there.
Thanks for the insightful article. Sometimes when I feel like I’ll never make it, it’s nice to see an article like this.
I have a "newbie" question. Maybe not appropriate for this string of comments, but I’ll ask. Are Windows applications, by and large, going away, in favor of web-based applications?
I work at Pfizer (pharmaceutical company) and talking to the programmers, they are going away from all their Windows based apps and switching everything over to .NET.
Does anyone know what’s happening? Feel free to email me. Thanks!
@Jim I guess what they are talking about is that they are getting rid of their native Win32 apps and moving over to writing on the .net framework. Their old stuff was probably written in C++ or some other unmanaged language.
Or they could mean that they are moving away from desktop apps and moving to web based apps. The way you have it worded is somewhat ambiguous.
Great article. I totally agree with you.
That’s all I can say. I always thought I was alone in this mindset, but now I know that there are people who feel the same as I do. Awesome. Thank you. Thank you.
And if I failed to mention this before: Thank you!
This reminds me of Dijkstra’s comment that ‘Software Engineering takes as its charter: ‘How To Program if You Cannot”. Anyhow yr point is still good. You definitely don’t need to be particularly smart to do much of the developing that gets done these days – for most stuff the path is pretty well-worn by now (ooh! a website! with a database behind it!) so it’s just a question of staying more or less on-task and being detail-oriented.
Being mentally flexible enough to switch gears and learn the latest alphabet stew helps, too.
With regard to the differences between the performance of linked lists and hash tables:
Sure in many common cases it doesn’t matter but I think the point is you need to know WHY it doesn’t matter (and the reverse – when will it matter?). If you don’t that is the sort of lack of knowledge that will leave you with major structural problems in your software which you have to ask someone who does understand these things to solve for you. It can cut both ways too…
Great article. Eloquently articulates a few things I’ve observed since becoming a developer, and makes good points about things I hadn’t thought of as well.
Also, I now know the Dunning–Kruger effect is the name of a phenomenon I’ve thought about for some time; that’s another nice little bit of trivia.
I actually got through the whole article and thought I was doing quite well (being a new-ish developer) and then you tell me about the Dunning–Kruger effect. Thanks for putting a name on something I had suspected! I’m now questioning myself.
I’d like to see you write the companion to this article titled
“Being Dumb does not a good developer make”.
I’ve spent a lot of time programming in corporate America, and I’ve seen all types of developers. I see the smart college kid that just learned the latest OOP language, and I’ve sitten next to a COBOL programmer that learned VB becuase his job was obsolete.
One constant that I’ve seen, smart helps, learning constantly helps, but dumb developers write poor code, and they write it slowly.
But at least they may me look good since I’m in the cube next to them
Leave a comment