According to a lot of universities, software development is still a mix of computer science and electrical engineering. It was only in May 2012 that NCEES announced that they would be offering a Principles of Engineering exam in Software, starting this coming April.
The foundational work of Software Engineering has been happening for decades. The invention of calculators and computers and all the innovation on the hardware side of things; pieces of software that have become critical to the Internet (think about apache or memcache or even Linux); and revolutionary design patterns (think about map-reduce or the c10k problem). Over time, I think best practices emerge in a way that allows us to have high standards for software engineers; to be able to certify and license software engineers just like any other type of engineer.
Now, our field is fascinatingly different! And this difference is going to lend itself to some friction with other fields of engineering. Here's a couple ways we're unique:
- You can learn this stuff on your own! You can practice this stuff on your own! You can't build a house without permits and inspections, but you can (usually) build a site or app with zero regulation.
- And because of that: people who aren't licensed or certified, or who haven't gone through any sort of formal education program, can still change the way we do things. Ideas matter more than anything else, and anyone can have and promote them.
- We aren't rooted in the physical sciences. This means that it's not a matter of truth or falsehood; not a matter of applying the laws of physics to the bridges we're building; etc. We weigh things against performance, productivity, consistency, and code volume. There's more than one way to do everything, and so to some extent, rigid implementation policies don't quite make sense as much as they would in other fields.
- We generally believe in the Internet, in the free exchange of ideas, and so there isn't just one way to learn things. You aren't required to learn a certain amount about a certain set of subjects; you can pick and choose. And you can learn from anything: Google, books, classes, peers, you name it.
There are arguments that programming isn't engineering. I think the points in that article are actually spot-on ... for now. I generally think of software engineering as having a couple key requirements, some of which are exactly the distinctions called out in that article:
- deep, full-stack knowledge of software, hardware, computers, and networks;
- ability to translate customer requirements into a technical design and schematic;
- broad understanding of the field, to draw from our vast collective experience;
- practical understanding of an ever-expanding body of computer science theory;
- experience applying that knowledge to real-life situations and making tradeoffs.
I long for a world where the term "engineer" is only conferred on a person who has a proven understanding and ability at all of the above. I long for a world where continued education is a requirement for software engineers. I long for a world where we balance the science of engineering with the art of engineering -- balancing universal truths against situational realities. And, I long for a world where the ability to achieve these requirements is accessible to everyone, not just through a formal university program. (Something like Ops School is a great step forward here.)
To me, that's what differentiates an engineer from a "hacker" (someone who knows how to make a computer do a thing; but doesn't really have any of the requirements above) or a "programmer" (knows how to write code) or a "developer" (who may have portions of the first two above). Tom Limoncelli described the three phases of a system administrator in a similar way: you have a technician, an engineer, and a researcher. There are different roles, responsibilities, and requirements for each.
This seems to be a somewhat common pattern: technicians, engineers, scientists. In Software Engineering, we end up with programmers, engineers, and researchers. This is fantastic! For this field to grow, it must break apart into separate disciplines and career paths. And this is a sign that we're bursting past the "one size fits all" bucket. I'm looking forward to seeing and participating in that growth over the years to come.