What is software engineering
Tags: programming, coding, theory, concepts
Published: 2021-07-29 15:41:03


In this article, I'll share my personal take on the difference between software development and *software engineering* (SE). It is a personal opinion, so take it with a grain of salt.

This content is part of my <a href="https://dev-concepts.dev" rel="noopener">Dev Concepts series</a>.

![Engineering](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lh92p1dwieuuopbg7cbo.jpeg)

## So what is it about?

Many people may tell you that both terms refer to the same concept. Personally, I don't agree. The way I see things, software development is the "what" (i.e., the activity) and software engineering is _broader_; it corresponds to the "what" _and_ the "how" (i.e., the _process_, the approaches, the methodologies, etc).

**NOTE:** Before going any further, I want to clearly state that the term "engineering" might be wrongly interpreted. Software engineering takes inspiration from engineering and tries to apply similar structured approaches to software development, but fundamentally, Software development/engineering is and will remain a _creative_ endeavor. The software world is complex. Even if we try to apply engineering techniques to professionalize the way we work, it is hard to predict software development time, to provide verifiable proof that a piece of software does what it should be doing, etc.

I like the definition of the IEEE standards body:

> Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software (IEEE 610.12-1990)

To create software, we perform various activities, and _how_ we approach those activities has a *_huge_* impact on the results and on the overall quality. Writing code is only a part of the story. There are many more activities around coding. For instance, before coding, we need to understand user needs (i.e., their requirements). Then, we need to clarify the business rules (e.g., is X accepted or not, when, how, _why_), the workflows (e.g., what happens before/after X), the data models (i.e., what concepts/data will the application manipulate), the data flows, etc. Still before coding, we also need to _architect_ and _design_ the solution so that it is built on solid grounds.

The coding part itself is also critical of course, and there are many dimensions/things to take care of. Security is also something of the utmost importance. Finally, once code has been written for an application, it needs to be built, tested/validated, released, deployed, monitored, maintained, etc. My <a href="https://dev-concepts.dev" rel="noopener">Dev Concepts series</a> as a whole discusses those topics.

Luckily, there's actually a generally accepted _standard_ defining a set of _phases_ for software development projects. It is called the Software/System Development Life Cycle (SDLC). Personally, I think that all software developers should clearly understand the SDLC and apply it in their projects, whether big or small.

Next to the software development phases, there are other things to consider like the software development approaches/methodologies (e.g., Agile, XP, etc) and project management techniques (e.g., PMBOK), which greatly impact the way we work, and collaborate with each other.

To finish this short post, I'll leave you with a wonderful quote from Margaret Hamilton, one of the pioneers of software engineering:

> Software during the early days of this project was treated like a stepchild and not taken as seriously as other engineering disciplines, such as hardware engineering; and it was regarded as an art and as magic, not a science. I had always believed that both art and science were involved in its creation, but at that time most thought otherwise. Knowing this, I fought to bring the software legitimacy so that it (and those building it) would be given its due respect and thus I began to use the term “software engineering” to distinguish it from hardware and other kinds of engineering; yet, treat each type of engineering as part of the overall systems engineering process. When I first started using this phrase, it was considered to be quite amusing. It was an ongoing joke for a long time. They liked to kid me about my radical ideas. Software eventually and necessarily gained the same respect as any other discipline. (Margaret Hamilton, Lead software engineer of the Apollo Project)

## References

* [The Mythical Man-Month: Essays on Software Engineering](https://www.amazon.com/Mythical-Man-Month-Software-Engineering-Anniversary/dp/0201835959?tag=dsebastien-20) by Frederick Brooks. That book has deeply influenced me as a crafter
* [Software engineering @ Wikipedia](https://en.wikipedia.org/wiki/Software_engineering)
* [What is software engineering](https://www.guru99.com/what-is-software-engineering.html)
* [Software engineering glossary: IEEE Software Engineering glossary @ MIT](http://www.mit.jyu.fi/ope/kurssit/TIES462/Materiaalit/IEEE_SoftwareEngGlossary.pdf)
* [SDLC @ Wikipedia](https://en.wikipedia.org/wiki/Systems_development_life_cycle)

## Conclusion

In this short article, I've introduced the notion of software engineering. It's just an idea, a simple *concept*. And that's the magic; if you learn the concepts one by one, then you'll quickly become one of us, a software crafter. It's not that hard; it's like everything, it just takes time.

That’s it for today!

PS: If you want to learn tons of other cool things about product/software/Web development, then [check out the Dev Concepts series](https://dev-concepts.dev/), [subscribe to my newsletter](https://dsebastien.net/news), and [come say hi on Twitter](https://twitter.com/dSebastien)!