I might as well get this one out before I write other software engineering posts.
You might have noticed that I rarely use computer programmer when talking about people crafting software. This is simply because crafting quality software requires a lot more than knowing how to code programs.
Recall the waterfall model:
As mentioned in my post, it’s flawed, but only for its flow. The steps, from System Requirements up to Operations, are still applicable in the creation of all client-based software systems.
As you can see, Coding (or in technical terms, Construction), while still a very important part of software development, is just one of the seven steps in development. Of course it doesn’t take only 1/7th of the total project effort, but in practice it only takes 50-20% of the total effort: the larger and the less agile the project, the less effort is spent on construction.
That said, in the context of software development, the term programmer is sometimes used as a pejorative, implying that the person’s only job is to code programs based on designs handed down to him by Analysts or Software Architects. In other words, he’s just a grunt.
I personally don’t consider the term to be a pejorative, especially since I personally don’t mind getting my hands dirty with grunt work. So yes, I’m proud to be a computer programmer. However, I won’t use that term in my posts because, as I said above, it’s too narrow.
In place of “computer programmer”, you would see me use the terms software developer and software engineer interchangeably.
Both terms solve the problem posed by “computer programmer”, namely, that both titles span the entire software development life cycle. Software developers are not limited to computer programming. They can also be analysts that gather and process the user’s requirements, or architects that design from a much higher standpoint than analysts. They can also be in specialized roles other than programming like QA Testers and DBAs. They can even be Project Managers, a role that don’t have any direct relationship to the crafted system itself.
The only practical difference between the two terms is that some people shy away from software engineer because as it stands software engineering is still mostly a misunderstood buzzword rather than a serious profession. You have guys saying “I’m a software engineer!” but fail to grasp the basic concepts of software engineering from project management (e.g. Brook’s Law, Peter Principle) down to construction (e.g. basic OOP concepts).
But then again I’m unfazed by that concern. I’m still hoping that the day will come that our profession would be a lot more respectable than it is now, so for that dream, I’ll be using the two terms interchangeably.