Software Developer / Engineer. What’s the difference?

10 Jun

Recently I was asked “What’s the difference between a software developer and a software engineer?”

The answer? Well it depends on who you ask. So after a little thought here is what I consider each one to be. It is by no means meant as a true definition, just a way I’ve categorized myself over the years.

First I’m going to expand the question a little bit beyond just the two titles “Software Developer” and “Software Engineer”, I’m also going to add in “Coder” and “Programmer”. Again, this is just how I categorize them, others will most certainly give different answers.

A person who can read some code, make changes, and to some degree understand how those changes affect the output. Back in the 90’s I used a sprite animation library called SpriteWorld. I didn’t really understand how it worked at first, but I could alter some code and change the sprites appearances, the layout of a tile-map, background images, etc. Notably, I wasn’t capable of writing a whole game myself.

Programmer: A person who writes code and understands it well enough to build a basic set of functionality. After working with SpriteWorld and other graphics libraries (GraphicsBuffers, QuickDraw) for awhile, I understood enough to write my own graphics routines (blitters). I was far from a graphics expert, but I knew the ins and outs of blitting (copying, masking, and altering bits for graphics). At this point I was capable of writing a part of a program, or a demo. But still unable to build a fully featured app.

Software Developer: A person capable of building simple programs. At this level you understand nearly all code you look at, at least to some large degree. Even in languages your not as familiar with. You are fully capable of making a multi-screen app and, when necessary, can debug the app when problems arise (they surely will). I wrote parts of games in the 90’s but I didn’t publish my first full game (Consumed) until 2008.

Software Engineer: A highly proficient Software Developer that is capable of managing a complex system. A person who is not only able to build a fully functioning app but is experienced enough to know how to build it in a way that is easy to refactor, self documenting, and as a result easier to debug. They know that consideration and forethought on the front end can save days of work and headaches down the road. They devote themselves not to making the cleverest code, but to making their code obvious. They know the best piece of code is the one you never have to write.

I’ve progressed through these stages in my career. If I’m being honest with myself, today I would place myself in the software developer camp. I’ve shipped multiple apps, and I support them. I can understand most of the code I read, even in languages I’m unfamiliar with. Over the past few years I’ve learned a lot about software architecture. These days I’m considering things like, object ownership, immutability, unit testing, cache invalidation, documentation, infrastructure, error handling, and so on.I learn so much every year, month, day, that I wish I’d learned sooner. I constantly wish I knew then what I know now. But that’s likely a large part of what keeps me programming. The fact that there is always something new to learn just around the corner has kept me coming back for twenty years and I expect it’ll keep me coming back for at least twenty more.

What am I? I’m a student of code.