Software engineering

For non-trivial system, we can't just do it by sitting down and developing. When start developing bigger systems, people realized that they were not able to build the software that they need. Majority of software projects were either never delivered or never successfully used.

This bring us to software engineering. Software engineering is an important and critical discipline, concerned with cost effective software development. This is based on a systematic approach that uses appropriate tools and techniques, operates under specific development constraints. And most importantly, follow a process.

Software development process (Life cycle models)
Software development is fundamentally going from an abstract idea in somebody's head to a concrete system that implements that idea. This is a very complex process. It can be overwhelming. So, unless we are talking about a trivial system, it's very complex for us to keep in mind all the different aspects of the systems, and to do all the different steps required to build this system, automatically. So that where software processes come to the rescue.

A software process is nothing but a way of breaking down this otherwise unmanageable task into smaller steps. Smaller steps we can handle and can be tackled individually. There's not just one single process, but there are multiple possible processes, depending on your context, on the kind of applications that you are developing. In this course, we will only focus on 4 main software processes.

Software phases
Software processes are characterized by several phases, called software phases. The first of these phases is called requirement engineering, and that's the phase in which we talk to the customer. And we try to understand what kind of system we need to build. Then we use this information to define our design. The design is the high level structure, that then can become more and more detail, of our software system. Once we have defined our design, we can more on to the next phase, the implementation, in which we write code that implements the design we just defined. After implement the code, we need to verify and validate the code. We need to make sure that the code behaves as intended. And finally, we need to maintain the code, and maintenance involves several activities, for example, adding new functionality or eliminating bug from the code or responding to problems that were reported from the field after we released the software.

Tools
We look at how tools can improve software phases, and can support development tasks in general. Tools and automation are fundamental in software engineering.