- A person or thing that develops or innovates.
- A person trained and skilled in the design, construction, and use of engines or machines, or in any of various branches of engineering.
- A person skilled in the design and programming of computer systems
Why are these definitions important? Well, I'm sure you've noticed a number of titles that get thrown around in the world of software - programmer, coder, web dev, software dev, software eng, architect, levels such as I, II, and III, or junior, journeyman, mid, and senior. There's can be a huge amount of grey area between companies and job requirements for all of these titles. Lately the most controversial of all these potential titles is software engineer, with most of the opposing argument coming from other engineering fields such as mechanical engineering, architecture (structural engineers?), network engineers and other highly-skilled and often rigorously-screened fields.
Many engineers in other fields are required to pass exams and obtain specific certifications before they can find proper employment in their field. A number of them are also required to keep their certifications up to date, meaning they need to study and retake the exams after some time - perhaps for the rest of their career.
Software engineers do not have any such requirement, except maybe in specialized or critical areas such as Microsoft Certified Professionals or development of government systems (I don't know the details there, so I can't speak to it for certain). This is a point of frustration for engineers of other fields, and perhaps a flaw of the software engineering field, because there is no true way to test the skills of all software engineers to confirm that they have all the knowledge needed for all of the duties they may face on the job. Many engineers feel that this brings down the weight of the title "Engineer," especially if a particular software engineer or their product has failed.
And while I'm speaking about failure: When an engineered project fails in software development, unless you're building pacemakers or spaceship shuttle systems, there is not a massive impact on lives. We move on, try to learn from our mistakes, and that's it. Not so with other engineering fields - bridges or buildings collapsing looks very bad on your resume.
Now that we have the big debate covered, what's actually the difference between a Software Developer and a Software Engineer? According to Felim O'Donnell of Liberty IT, "a developer takes functional specification and delivers the code required within tight parameters, essentially completing the task in isolation, without understanding or oversight of the project as a whole. On the other hand, an engineer is someone who thinks about the design, goes back to the business with questions and suggestions, and thinks about the impact on the business and the end user. They always ask 'Why?' and, 'Is there a better way to do this?'" Source: Are you a software developer or a software engineer? by Jenny Darmody
I imagine there is some overlap into the other engineering fields with O'Donnell's definition; in my experience engineers tend to be people who want to make an impact in the world and help others. The end goal is to build something that will leave our global communities a little better than before.
With that, I will close with a short statement: Personally I believe most of us have a little bit of "engineer" in us. Those who are curious to learn and improve our skills are constantly asking "why" and "how can I do this better?", and by that definition we all perform some engineering to some degree. We may consider the best language or tool for a particular feature we've been asked to build if we have that freedom, and hopefully we ask qualifying questions when we've been given a large-scale assignment to truly understand the process.
As O'Donnell said: "What makes all the difference is the person's mindset and appetite to learn."