# What is software development

Software development is _everywhere_. But do you understand what it is about? Is it really clear for you?

![Software development](https://cdn.hashnode.com/res/hashnode/image/upload/v1627573277445/JQZaLaxLS.jpeg)

In this article, I’ll explain what software development is, as seen from where I stand, fifteen years into the IT industry.

## So what is it about?

Fundamentally, creating software means writing *source code* that, once transformed into *machine code* (i.e., code executable by a computer) by a *compiler* (i.e., sort of translator) gives instructions to the computer so that it can fulfill some useful function. Those instructions define the behavior of the software. For example: how it reacts to certain events, whether it accepts specific user input or not, what happens when the user clicks here or there, etc.

To write code, software developers/engineers (two terms that are usually used interchangeably) use different programming languages and various tools such as Integrated Development Environments (IDEs).

We can consider a few basic types of software:

* Web applications/websites: What most software developers work on; applications that execute in a Web browser and are written using HTML, CSS, and JavaScript.
* Software applications: desktop or mobile applications, tools/utilities, editors, etc (e.g., text editors, Web browsers, videogames, source code editors, etc)
* System software: software that supports the execution of other software (e.g., operating systems like Linux, Windows, macOS), and that allows to interact with physical devices (e.g., device drivers for printers, USB devices, motherboard chipsets, network adapters, etc). I won't be covering this kind of software as it's not my field of expertise
* Embedded systems software: software that is embedded in a physical device (e.g, firmware) and that controls the device (e.g., a robot vacuum). Usually, this kind of software is written using low-level programming languages (e.g., Assembly, C, C++, Rust) and has very limited resources available (memory & processing). I won't be covering this kind of software either

We could refine and distinguish between many more sub-types, but it doesn't matter too much for our discussion. If you're curious, then take a look at the following resources:

* [Software categories @ Wikipedia](https://en.wikipedia.org/wiki/Software_categories)
* [Different types of software with examples](https://squareboat.com/blog/different-types-of-software-with-examples)
* [Types of computer software](https://www.educba.com/types-of-computer-software)
* [A Detailed Guide to types of software applications](https://www.fingent.com/blog/a-detailed-guide-to-types-of-software-applications)
* [Software types examples](https://yourstory.com/mystory/what-software-types-examples)

Applications can be as simple as the famous "Hello world!", and be developed by a single person, or as complex as the Linux kernel (25+ million lines of code), Microsoft Windows (50+ million lines of code), and be developed by hundreds or even thousands of software developers (which is mind-blowing when you think about it!).

Another thing to consider is that applications are not always _monoliths_ and can be composed of different parts/sub-systems, communicating with each other through different means. Those parts can even be executed on different machines; in that case, we talk about *distributed systems*.

Writing the code is only a part of the story though. Before doing anything, software developers first need to understand and analyze what actually _needs_ to be done.

Software developers sometimes create software that humans don't directly interact with, but at the end of the day, humans are always somewhere in the loop. You should never ever lose sight of that fact. Whatever you do, always keep in mind that you need to satisfy the end-users.

> A perfect solution that solves the wrong problem is just as useless as an unusable one. (A wise person)

## References

* [Software @ Wikipedia](https://en.wikipedia.org/wiki/Software)
* [Software development @ Wikipedia](https://en.wikipedia.org/wiki/Software_development)
* [Software development @ IBM](https://www.ibm.com/topics/software-development)

## Conclusion

In this short article, I've introduced the notion of software development. 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://mailchi.mp/fb661753d54a/developassion-newsletter), and [come say hi on Twitter](https://twitter.com/dSebastien)!


