Is Software Engineering Real Engineering?
Software engineering has grown from a niche discipline to a cornerstone of the modern world. As it becomes increasingly critical in domains like energy, defence, healthcare, aerospace, finance, and infrastructure, the debate has intensified - is software engineering “real” engineering? This question is not simply academic—it touches on issues of responsibility, education, ethics, and the evolving nature of the engineering profession. While software engineering shares many foundational principles with traditional engineering disciplines, it also exhibits unique characteristics that both challenge and enrich the definition of engineering itself.
Shared Foundations with Traditional Engineering
Mathematician, physicist, and engineer are given a task - Prove that all odd numbers greater than 1 are prime.
Mathematician: "3 is prime, 5 is prime, 7 is prime, 9... hmm, 9 is not prime. Therefore, the statement is false."
Physicist: "3 is prime, 5 is prime, 7 is prime, 9 is an experimental error, 11 is prime, 13 is prime... Looks good, the hypothesis holds."
Engineer: "3 is prime, 5 is prime, 7 is prime, 9 is prime, 11 is prime... yep, works perfectly."
At its core, engineering is about solving real-world problems using scientific principles, constrained by practical considerations such as time, cost, and safety. Software engineering meets this definition in several key ways.
Design Under Constraints
Like civil or mechanical engineers, software engineers design systems under constraints—budget, computational limits, storage, time, and user requirements, non-functional requirements. They make trade-offs between speed and accuracy, performance and maintainability, or functionality and security. These are engineering judgments in the truest sense.
System Thinking and Modeling
Engineering involves abstract thinking, modeling, and simulation before implementation. Software engineers use techniques such as UML diagrams, data flow models, just as architectural blueprints that parallel CAD designs and physical simulations in other engineering fields. The design of a software system, especially at scale, requires the same kind of structured thinking as building a bridge or a power plant. Something software architects do nĐľt use as often as their building or structural counterparts is building models at scale. This is really important approach that we should consider in large implementations - small, throw-away PoCs on key aspects of the system.
Testing and Validation
Rigorous testing and validation are essential in all engineering disciplines. Software engineers employ unit testing, integration testing, and formal verification methods akin to stress-testing materials or validating an electrical circuit. In high-stakes industries like aviation or medicine, software must meet safety and reliability standards just like any physical component. The lesson we can take away here is we can do stress testing on a system and unlike other systems like a ship or an aircraft - software systems are not destroyed by such tests, so it is cheap and convenient to stress test a system. Do not neglect it on complex systems and/or systems with large amount of users.
Professional Responsibility
Engineering is not only about technical competence but also about ethics and accountability. Software engineers are increasingly being held to ethical standards, especially in domains involving privacy, AI, or critical infrastructure. Professional codes of ethics and accreditation programs (such as those offered by IEEE or ACM) mirror those in traditional engineering professions, although codes of ethics or standards in the profession are much less rigorously enforced in software engineering.
Unique Characteristics of Software Engineering
Despite its similarities to other engineering disciplines, software engineering has unique traits that distinguish it—and sometimes lead skeptics to question its status as “real” engineering.
Intangibility of the Product
Unlike a bridge or a turbine, software has no physical form. This lack of tangibility means issues like wear and tear don’t apply, and failure modes are often logical rather than physical. Debugging software involves tracing logic, not examining materials. This fundamental difference can make software seem more abstract or less “real” than traditional engineering work.
Rapid Evolution and Low Entry Barriers
Technology and tools in software evolve at a breakneck pace. Unlike civil engineering, where core principles and materials change slowly, a programming language or framework can become obsolete within a few years or a decade. Additionally, many successful software developers are self-taught or come from non-traditional backgrounds—unusual in most engineering fields that require formal certification. This means a more diverse group though processes and approaches applied by deferent people in the field.
High Degree of Flexibility
Software is often more malleable than physical systems. Engineers cannot easily modify a suspension bridge after it’s built, but a software system can be iteratively improved through updates. This leads to agile development methodologies, which contrast with the more rigid, plan-driven processes in fields like aerospace or structural engineering.
You should never plan or act in implementation of a software system or it's not going to meet the needs of a fast-changing environment.
You should not, however act as if the system is extremely malleable or you're never going to deliver it.
Creative Latitude
While all engineering involves creativity, software engineering often allows for an extraordinary range of solutions to the same problem. Multiple architectures, coding styles, or even algorithms can fulfill the same requirements. This creativity makes software engineering feel closer to a craft or art form than some branches of traditional engineering. The challenge that must be managed is choosing a common repeatable approach for a problem or coding style and sticking to it, since the width of creativity is also a risk of creating a hot mess of approaches, designs and coding styles.
Cyber Security
Security in software engineering happens when you design and engineer towards it and does not work when it's being bolted onto the software.
The nature of cyber threats evolves and usually a software product is exposed to a much more diverse and creative yet constantly evolving treats that should be addressed throughout the lifetime of the product.
The difference can be visualized by a diesel engine working for 20 years with minimal tweaks, while a system without security patches for two decades usually is ripe for being taken down by a cyber-attack and should not be relied on for core business activities.
Data Leaks Cannot be Cleaned Like Oil Leaks
Digital data is unique amongst assets of a company. It is not like physical assets that you can secure and if they are in your warehouse - it means they are not stolen. Digital data is easy to propagate, leak and virtually impossible to retrieve once it is accessible to a malicious or careless party. That makes software systems that deal with data a unique engineering product that is quite different from the regular fruits of engineering labor.
A New Paradigm of Engineering
So, is software engineering real engineering? The answer is yes—but with an evolving definition. It adheres to core engineering principles - design under constraint, system modeling, rigorous testing, and ethical responsibility. Yet it also pushes the boundaries of what engineering can be, embracing rapid iteration, abstract materials, and creative flexibility.
Rather than being excluded from the engineering family, software engineering should be seen as a new branch that challenges and expands traditional notions of the profession. As software continues to underpin critical infrastructure and societal functions, treating it with the same seriousness, rigor, and respect as other engineering disciplines is not only appropriate—it is essential.