You're Doing It Wrong!

Nov 24, 2013

If you are building a bridge you can't ignore gravity, the design has to hold up the load. If you are making a Souffle, you need to follow the instructions precisely to make it come out right. If you are writing software however there isn't a single way to get it right (assuming you can even define what right is).

This doesn't stop people from insisting that their way is the only way and that if you don't agree You're Doing It Wrong!

One advantage of having been a working programmer for 3 decades is you get a long term view of how ideas in programming have grown over the years. Because communication is so easy these days ideas gain traction and people try them out much quicker than when I started. The flip side is that people are much quicker to insist that they hold the One True Way and that you clearly are stupid if you disagree.

Before the internet unleashed the ability of instant communication you learned about new stuff from far fewer sources and often the lead times were measured in months or even years. I always read magazines and a few journals, went to computer shows or just talked with other programmers around me, and generally learned about changes in the industry at a really glacial pace. Unlike today we often had to figure stuff out for ourselves because there wasn't anywhere to ask a question.

I remember reading the famous issue of Byte magazine which discussed Smalltalk and basically introduced OO concepts to a whole generation of programmers. Yes, a paper magazine with a lead time of 3 months. I had no access to Smalltalk and there was no C++ as yet (which first appeared as a C preprocessor). When I started working on Deltagraph in late 1988 I decided to try some OO programming so I made a really bizarre extension to C which gave me inheritance and polymorphism but oddly enough no objects. Today it seems laughable but it did allow me to create multiple graphics export types from a single driver (basically subclasses of an abstract class). Of course I had no clue how a real OO language would operate since I didn't have one.

Today I read about new ideas every day. Especially in the open source world (which of course also didn't exist back then outside of the academic world) not a day goes by without a new programming language, framework or other idea. Trying to simply remember the names is impossible, much less being able to distinguish useful improvements from inventive noise. There are also so many different kinds of programming today so what is pointless for some might be a real breakthrough for others.

When I started in my first job we had two platforms, mainframe and supermini, plus the actual hardware on the F-16. Today the web is fragmented, the mobile world is fragmented, the desktop world is fragmented, and the stupid mainframes are still around. Programming when I started that first year was either batch or (barely) interactive. Today it's hard to find any two programmers who do the same thing on the same type of application with the same tools. Yet it's all still programming.

So today there is no barrier to telling the world how to do something. The problem is perspective; taking your single or few data points and assuming it works for everyone in every situation. The world of programming is both incredible wide and deep and thinking that what you know is applicable to a broad audience is pretty common today. Back when I started you might have the same attitude (at my first job we had all sorts of experts come and tell us stuff, all of which sank like a stone) but it was hard to spread it very far.

The truth you learn over time is that there are a very few good ideas applicable to everyone, a fair number of ideas applicable to specific areas, and a whole lot of noise. I think today interpreting whether ideas are useful and applicable to your situation is a lot harder than it was when I started due to the enormous quantity.

My current position and the previous two have almost nothing in common. First I was a Java architect involved in building high performance batch systems; then I worked at an MMO/FPS game company optimizing a cross-platform client in C/C++; currently I write iOS apps in Objective-C for a travel company. Three radically different worlds yet all are programming (the first was mostly doing R&D). Each company was also organized differently and had extremely different business models and expectations. Being successful at each job required very different skills for me and the other programmers.

Could I have done each job in such a way to make everyone with an idea of how to write software happy? I am sure, no. I bet the same is true of everyone who reads this. If you exposed how you and your team or company write software there would be a whole host of critics who would condemn everything you do as stupid and some who might agree with you. That's the thing about programming, there is no one single way and everyone's a critic. In the end what matters is, does it work for us? If you read about something new, is it worth doing? Will it make us better, or just different? Or will it screw us up entirely?

You can't get too excited about new ideas, most of them are probably not worth doing or only help a narrow few. But you can't just ignore new ideas either or you will wind up hopelessly obsolete. Over the years I've changed repeatedly, sometimes temporarily in the wrong direction, or too early. Yet I've also learned to be careful not to jump on a bandwagon with both feet either. That's the truly hard part of being a modern programmer, knowing when to change and when to run away. The speed at which you often have to make decisions these days is what is so much harder today. I could learn about OO programming and barely use it for 5 years before it started to matter. Today you might need to learn something new today and use it immediately.

There are no absolutes in programming even today; you have to figure out if it applies or works for you or even is worth considering, and try to ignore all the folks screaming at you to do it their way. You aren't doing it wrong if it works for you, but you will be doing it wrong if you blindly follow advice without thinking.