Interview: What is Software Engineering?

Interviewer: Welcome Tim.

Me: Thank you, glad to be here.

Interviewer: What is Software Engineering? Is it just coding or is there more to it?

Me: Software Engineering is the application of Engineering principles to building software. These are principles common to all Engineering disciplines.

Interviewer: Ah I see. What are these principles?

Me: I set out to find out exactly what was similar between all Engineering disciplines cutting through the jargon and framing for each, and this is what I’ve found:

  • Requirements gathering and feasibility study — Talk to the people and find out what they require. If it’s impossible (we want a continuous road from Nairobi to Dubai) then it’s infeasible, and it all ends there. Else the Engineers come up with proposals on how to bring into reality what is required. Much liaising with everyone happens here, as the people keep refining their requirements and the Engineers come up with updated proposals. This stage takes a long time, but finally the proposal that satisfies the people and the budget is approved.
  • Detailed design and prototyping — A detailed design of the solution is made. This needs to be thorough, and complete. Computers [3] help (the Engineers at Baalbek [1] and Giza [2] didn’t need them, but who knows what was going on those days). A scaled down prototype is then made (Computers really help here as a full model and it’s environment can be simulated and design faults and enhancements found and fixed/implemented). If the people like it, then the project moves on. Now the Engineers apply two crucial principles.
  • Modularity — The solution should me modular, made of components that can be replaced/upgraded and still work perfectly with the neighboring components. This enables maintainability, expansion and upgrading. An example is a car: It’s made up of thousands of components often from different manufacturers, and they all work together because each component implements the interface __ expected by it’s neighboring components.
  • Testing — Each component must be tested to ensure it does what it’s supposed to, and is resilient to unexpected input.
  • Documentation — The whole process from start to finish is documented. From meeting minutes to the blueprints to receipts and everything in between.
  • Maintenance — Because of Entropy [4], all systems need maintenance. With the above principles having been observed, it flows smoothly. Documentation is updated after maintenance.

Each Engineering discipline goes deeper into each of these principles, each with tools and processes of how they synthesize science into technology, and build a product people can use. Rod Stephen’s book [5] has a great overview of Software Engineering.

Interviewer: I see. So what’s the difference between a programmer and a Software Engineer?

Me: A Software Engineer is a Programmer that develops software observing Engineering principles. The software produced is modular, tested and documented. This enables it to be developed by team, and later to be maintained by a different team, and later handed over to a different team for an upgrade. Of note is that the process used to arrive at the detailed design enables the software is implemented with the best technologies for the current requirements (programming language, database et cetera). If new technologies later emerge that enable implementing a more performant solution, a proper design and all around documentation makes it straight forward to implement the upgrade.

Interviewer: Thanks for hanging out with us today Tim.

Me: Thanks for having me.


[1] Baalbek
[2] Great Pyramid of Giza
[3] Computer Aided Design
[4] Second Law of Thermodynamics
[5] Beginning Software Engineering