# Introduction

## What is Software Engineering
> **Definition according to Ian Sommerville**<br/>
> Software engineering is an _engineering discipline_ that is concerned with all aspects of 
> _software production_ from the early stages of system specification through to maintaining 
> the system after it has gone into use.

| ...Ingenieurdisziplin...                                                                       | ...alle Aspekte der Softwareproduktion...                                                                                |
|------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
| Ingenieure lassen Dinge funktionieren!                                                         | nicht nur die Softwareentwicklung                                                                                        |
| Sie wenden Theorien, Methoden und Werkzeuge dort an, wo diese angemessen sind                  | beinhaltet auch Aktivitäten wie _Projektmanagement_, Entwicklung von Werkzeugen, Methoden und Theorien zur Unterstützung |
| Lösungen **müssen** innerhalb organisatorischer und finanzieller Einschränkungen funktionieren |                                                                                                                          |


## Iron Triangle: Organizational and Financial Constraints
![image_38.png](image_38.png)
- visualisiert Einschränkungen im Projektmanagement
- verkündet:
    1. Qualität der Ergebnisse eines Projekts ist durch folgende Faktoren eingeschränkt:
        - Kosten (_verfügbar: Budget, Ingenieure, ..._)
        - Zeit (_verfügbar: Zeit, Fristen_)
        - Umfang (_Funktionen, bereitgestellte Funktionalität_)
    2. PM kann zwischen Einschränkungen handeln
    3. Änderungen in einer Einschränkung erfordern Änderungen in anderen zur Kompensation, oder die Qualität wird leiden
- Die Realität ist komplexer
    - Geld in ein vollständig ausgelastetes Projekt zu stecken, kann es verlangsamen

## Software Development Lifecycle (SDLC)
```mermaid
stateDiagram
    1: Requirement Analysis
    2: Design
    3: Implementation
    4: Testing
    5: Maintaining/Operations
    1-->2
    2-->3
    3-->4
    4-->5
    5-->1    
```
### Requirement Analysis
  - Understand what your client wants and/or needs 
### Design
  - Design a solution that meets [functional/non-functional](IntroductionOOAD.md#requirements-in-software-engineering) requirements
### Implementation
  - Actually build the system meeting required quality goals 
### Testing
  - Ensure that the whole system meets all requirements
### Maintaining/Operations
  - The system serves its purpose (earns money)

## Software Quality
### Requirements in Software Engineering
| **Functional Requirements (FR)**                                                   | **Non-Functional Requirements (NFR)**                                                                                             |
|------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------|
| Systemfunktionen, Anwendungsfälle, ...                                             | Eigenschaften des Systems als Ganzes, nicht im Zusammenhang mit der Funktionalität (_bspw. Sicherheit, Performance, Wartbarkeit_) |
| Können unterschiedlich detailliert erfasst sein (je nach Komplexität des Projekts) | Beeinflussen die gesamte Architektur eines Systems, nicht nur einzelne Komponenten                                                |
| FRs sind meist höchste Prio des Clients, aber auch am einfachsten zu verhandeln    | Wenn ein NFR scheitert, kann das ganze System nicht funktionieren                                                                 |
 

### Eight Quality Characteristics
![image_39.png](image_39.png)

### Maintainability
- Modularität
- Wiederverwendbarkeit
- Analysierbarkeit
- Modifizierbarkeit
- Testbarkeit

>_Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live_
>
> ~_John F. Woods_