Whenever I am tasked with looking over a fellow developers code I always keep the following in mind, in order to ground myself:
your program (n): a maze of non-sequiturs littered with clever-clever tricks and irrelevant comments. Compare MY PROGRAM. my program (n): a gem of algorithmic precision, offering the most sublime balance between compact, efficient coding on the one hand, and fully commented legibility for posterity on the other. Compare YOUR PROGRAM.
I found this on Jeff Atwood's blog last year, and it pretty much sums up every programmer that I have ever met even my self.
What made me think of this and want to share it with my readers was a posting I saw on Lazycoder's blog today. Which was a reposting of a Reddit comment. I am going to break down the comment with my own comments on the subject, because I feel it is important for people, especially young software developers, to fully understand the wisdom in this comment that was posted on Reddit.
I’m sorry, but this is just nonsense. People are forever coming along and proclaiming that software engineering is in a state of crisis. And always their reasoning is that (other) programmers aren’t smart enough.
You will find many software developers, in your career, who have a martyr complex. They see them selves as gods gift to the computer, and their code could only be matched if Einstein, Mozart, and Michaelangelo could be combined in to one person of complete brilliance. Of course this is all crap and their code usually is far below average. In reality they just don't have enough time, to study up and learn new techniques, between playing WOW and filling out their fantasy football charts. So they need a scape goat and it is usually that their co-workers are slacking off, or they aren't "smart enough" to keep up with their brilliance.
If you can't figure out who this guy, that I described above, is in your office, chances are YOU are "that guy".
They, of course, are special magical code gunslingers with superhuman intelligence, members of the top 5%. (Surely software engineering is blessed to have 90% of its practitioners located in the top 5%!) But the truth is that there is no crisis, and there never has been. The only problem, and the reason software projects keep failing, is that of unrealistic expectations.
I believe there are unrealistic expectations, because many project managers were former coders, and in my experience half of them that I have worked for are "that guy" that I mentioned above. However the blame as I see it is a project managers complete ignorance in how to set expectations with his boss.
My personal philosophy, even before I had the words, has always been "under promise, over deliver". That is how you become a rock star in your field, no matter what it is.
Software is hard. Really hard. This should not be surprising to anyone who understands that it is really the field of assembling instructions for doing… anything. Anything that people want to get done. It’s sort of a meta-field that encompasses almost all other fields, with more being added every day. Of course it’s hard. The only real question is why people consistently underestimate its difficulty, especially why they underestimate the difficulty of any particular software engineering task.
One word: Hollywoodization. In Hollywood all programming is done through a GUI that doesn't look any different than the kids games of dragging the square object in to the square hole.
Also project managers conveniently forget their stints as software developers, because their yearly bonus relies on releasing the code, by using 80% of the staff that is required and doing it in 80% of the time it would normally take.
It's always about numbers and money.
I think there are a number of reasons for this: 1. “It fits in the little box, how big can it be?” Humans, particularly those who aren’t technical, have a tendency to judge difficulty with their eyes.
There is nothing more true than this statement. Politicians have a statement for this: Perception is reality. The perception is that small things go in small places, in reality these people don't take in to account the vastness of a hard drive or the internet. That is why companies such as IBM spend millions of dollars in advertising to explain how a whole server room can fit in one rack of blade servers.
2. “It’s just a word processor.” Everyone understands what they are building, what the set of instructions is supposed to do, and they probably know how to do it by hand, albeit very slowly. They tend to assume that writing the software is just a matter of telling the computer to do the same thing, but faster. What they do not realize is that they don’t really know how their brain works at all, and that all the details which they can just leave to their giant neural net when doing it by hand, have to be figured out and brought consciously to the software.
Programmers have an acronym response for this mentality: SMOP which means Small Matter of Programming. It is an inside joke, because most programmers understand there is nothing small even with the smallest feature request. New features have a rippling effect through the whole application especially when your widget was never designed to do what it is now being asked to do.
3. The Cult of Smart. Programmers, on the other hand, have figured out that software is complicated, and that being smart really helps; in fact, nothing is a substitute for it. This causes them to emphasize it, convince themselves that they have an abundant amount of it, and to convince themselves that results are not the result of them learning about problem domains, and building better and better versions iteratively, but just the inevitable consequence of bringing their enormous brain to bear. This leads to things like the “Agile Methodology”, as in “I’m so Agile I don’t need a Methodology.” Instead of realizing that you have throw one away (usually more like ten), they think they can be so magically smart they don’t have to.
This mental break down usually happens with "that guy" mentioned above. He might have started out as a decent programmer, buy somewhere in his career he got one too many pats on the back and it all went to his head. He stopped searching out for new knowledge and become content with his current set of knowledge. Or he got distracted in an unrelated field because he felt he was at the top of the software development field, and while he was collecting paychecks for software development, and focusing on his distraction, the software development field passed him by, but he was too distracted to notice.
Either way this person lost sight of what originally brought them to software development and kept them thirsting for every protocol and every byte they could consume. Most of these guys never get the chance to get back in the game either. So stay focused and do what you love. If you love hockey and software development is only your 9-5 make sure you don't fall in the trap of thinking you are at the top of your game in software development because you don't have the time or ambition to learn anymore. And fully understand that the software development field is going to pass you by.
4. Expectations based on hardware. Chips are square. A linear decrease in CMOS transistor size results in a quadratic increase in the number that can be packed on a chip. Code is linear. A linear decrease in the amount of time it takes to produce X amount of code is merely a linear increase in the amount of code that can be produced. This results in an ever-widening design productivity gap, where capacity forever recedes away from our ability to exploit it. We can waste some of that excess capacity to save programmer time (this is why high-level languages have an expanding role in the field), but this is never going to go away. It isn’t that software is inherently blighted. It’s that hardware is inherently blessed.
Amen to that... There is no scientific break through that is going to help one software developer add 30 new features to a well developed application in 18 months. Software developers don't have "magic bullets" that introduce instant yield like argon-injected-krypton LASERS to make our software 35% smaller. In fact most software development is a total 180 from hardware development. In hardware everything gets smaller and uses less power, however in software everything gets bigger and uses more power.
Even with this all said and new software developers learning these facts of life in their profession, nothing is going to change, 30 years from now the same problems are going to face the same people. Half of the "problem" comes from the kind of people that the software development field attacks, and the other half comes from poor education of college vs. real life. In college the focus is on perfection, in real life the focus in is on turn around time. If you haven't realized it yet perfection and turn around time are usually poler opposites of each other.
So if you are to take anything away from this rant, take this, do what you love, and become the best at it. And if what you love isn't your 9-5 job, deeply understand this and get out of the way of people who's 9-5 job is what they love.
Well I hope this rant amused some of your and educated others. I guess I just had a lot to get off my chest.