# Software engineering

Software engineering is een deelgebied van de informatica dat zich bezighoudt met alle aspecten van het bouwen van complexe maar betrouwbare software tot informatiesystemen. Het is een vakgebied dat zich bezighoudt met methodes om een vraag of probleem in de werkelijkheid om te zetten naar een computerprogramma.
Iemand die bedreven is in software engineering is een software engineer (soms ook software-ingenieur genoemd). Het vakgebied is beslist breder dan alleen het programmeren, maar vaak noemen programmeurs zich onterecht software engineer vanwege de negatieve connotatie verbonden met de term "programmeur".

## Algemeen

Het vakgebied Software Engineering omspant het hele spectrum van de ontwikkeling van software voor complexe systemen, van het bepalen van de eisen tot aan de oplevering. Het bestaat in grote lijnen uit de volgende hoofdonderdelen:
* Het proces: welke eisen worden aan een systeem gesteld, en hoe wordt het ontworpen?
* De structuur: wat is een goed ontwerp voor een systeem, en hoe ziet een goede architectuur er uit?
* De technologie: welke technologie is nodig, welke producten kunnen we inzetten?
* De organisatie: wie gaat het bouwen, kunnen we het outsourcen?
Software engineering wordt ook wel gedefinieerd als: "de toepassing van een systematische, gedisciplineerde, kwantificeerbare aanpak bij de ontwikkeling, uitvoering, en onderhoud van software". Een andere omschrijving is "de gedisciplineerde toepassing van technische, wetenschappelijke en mathematische principes en methoden gericht op de economische productie van kwalitatief hoogwaardige software." Het is een breed en veelomvattend vakgebied, waarin zowel logisch, wiskundige theoretische aspecten als engineering- en managementaspecten een rol spelen.
In het verleden werd softwareontwikkeling gezien als een louter wiskundige bezigheid. De in 2002 overleden Edsger Dijkstra bijvoorbeeld zag het ontwerpen van computerprogramma's als een wiskundige opgave, die met formele bewijzen opgelost moesten worden. Dit is zeer zinvol voor theoretische opgaven en voor het bewijzen van de juistheid van een complex algoritme. Modernere softwaremethodologieën als eXtreme Programming (XP) en agile modeling beschouwen software engineering meer als een spel van communicatie en innovatie. Ideeën van de gebruiker of opdrachtgever dienen via de programmeur vertaald te worden in technische oplossingen. Hierbij speelt communicatie een zeer belangrijke rol.

## Software

Software zijn computerprogramma's en bijbehorende documentatie zoals specificaties, ontwerpmodellen en gebruikershandelingen. Softwareproducten kunnen ontwikkeld worden voor een specifieke klant of voor de algemene markt. Softwareproducten zijn hierom generiek, ontwikkeld voor een groep mogelijke klanten, zoals bij Excel of Word, of maatwerk, ontwikkeld voor een enkele klant volgens hun specificatie. Nieuwe software kan worden ontwikkeld door de ontwikkeling van nieuwe programma's, het op maat maken van generieke software systemen of het hergebruik van bestaande software.

## Softwareproces

Het softwareproces of softwareontwikkelingsproces is het geheel van activiteiten gericht op de ontwikkeling van software. Dit proces loopt vanaf het ontwerp tot de ingebruikname en het onderhoud en soms zelf het hergebruik. De algemene activiteiten in ieder softwareproces zijn:
* Specificatie: wat het systeem moet doen en de ontwikkelingsvereisten
* Development/ontwikkeling: de ontwikkeling en productie van het softwaresysteem
* Validatie: de controle of de software voldoet aan de klanteneisen
* Update bij gebruik: aanpassen van de software aan veranderende eisen.
Dit software-procesmodel is vastgelegd in formele softwareprocesmodellen en ontwerpmethodologieën.

## Stadia van softwareontwikkeling

In de softwareontwikkeling wordt gewerkt met verschillende stadia, om zo een indicatie te kunnen geven wat verwacht kan worden van de software. Release to manufacturer zou het laatste ontwikkelingsstadium moeten zijn, maar is dat bij zeer grote softwareprojecten vaak niet. In dat geval komen er naderhand bugfixes beschikbaar, die soms zelfs upgrade genoemd worden en waar geld voor betaald moet worden.
Onderstaand geeft een globaal, schematisch inzicht in de diverse stappen die een softwareproduct doorgaans doorloopt (als uitgangspunt vergelijke men de stappen die diverse Windows-versies hebben doorlopen).
Opmerking: sommige softwareontwikkelaars hanteren afwijkende naamgeving en systematiek.
* Alfa - een eerste aanzet tot een werkende versie van de software, die doorgaans nog bugs bevat die verbetering en testen behoeft.
* Bèta - een vervolgversie waarin in principe alle eigenschappen van de software zouden moeten werken. Deze versie wordt soms aangeboden aan externe testers, die dan bugs kunnen rapporteren.
* RC - de 'release candidate', die een mogelijk publiceerbare versie van de software bevat. Ook deze RC wordt doorgaans nog stevig getest om bugs en gebruikersfeedback te kunnen verwerken
* RTM - 'release to manufacturing'; de software die in principe gereed is om aan producenten te verstrekken (zie boven).
* Final - het softwareproduct is in omloop gebracht.
* Service packs en updates - aanvullingen en verbeteringen op de software, die in de Final kunnen worden ingesloten middels een updateproces
* Upgrade - een nieuwe versie van de software, die doorgaans vele verbeteringen en nieuwe functionaliteit bevat.
De diverse stadia gaan doorgaans vergezeld van een versienummer, dat uit een of meer cijfers bestaat. Hoe hoger het cijfer, hoe verder in de ontwikkeling het product is. Vaak zijn alfa-versies genummerd met een nul, gevolgd door een eventuele subversie: voorbeeld: versie 0.9 geeft aan dat het product bijna een volledig werkende versie is. Versie 0.9.5 is dan vaak een verbetering van versie 0.9, die echter nog niet geheel voldoet aan alle eisen.

## Benaderingen in software engineering

Er worden verschillende soorten modellen gebruikt in de software engineering, die bepaalde toestanden en processen van verschillende perspectieven uitlichten. Met de tijd zijn hier allerlei perspectieven ofwel benaderingen ontwikkeld:
* Het functioneel perspectief, onder andere het werkstroomperspectief
* Het gegevensstroomperspectief
* Het objectgeoriënteerd perspectief
* Het actorenperspectief
* Het ontologisch perspectief.
Met de ontwikkeling van de zogenoemde IDEF (Integration DEFinition) in de jaren tachtig is een aanzet gemaakt met integrale definities. Een alternatieve uitwerking is de Unified Modeling Language (UML).

### Modellen in software engineering

Modellen in de software engineering zijn vereenvoudigde representaties van elementen en relaties van de softwareontwikkeling. Er zijn verschillende soorten modellen:
* Algemene modellen van het software ontwikkelingsproces, zoals het watervalmodel, het V-model, en het iteratieve model.
* Datamodellen en databasemodellen
* Objectmodellen van het te ontwikkelen informatiesysteem
* Specifieke project modellen.
Elke benadering in de software engineering heeft deze soorten modellen veelal anders uitgewerkt.

## Deelgebieden

Deelgebieden van de software engineering zijn:
* Requirements Engineering: domeinanalyse
* Softwareontwikkelmethode: software-architectuur, software-evolutie, software-re-engineering, softwareconstructie
* Kwaliteitscontrole
* Projectmanagement
* Formele methodes (onder meer formele specificatietechnieken)

## Opleidingen

In tegenstelling bijvoorbeeld tot de Verenigde Staten zijn er in Nederland nog weinig zuivere opleidingen in software engineering. De beste optie is momenteel informatica.

### In Nederland

Een "Master of Science in Software Engineering" (M.Sc.) wordt aangeboden door de algemene en technische universiteiten met een informaticaopleiding, zoals de Universiteit van Amsterdam, de Universiteit Twente, de Radboud Universiteit Nijmegen, de Open Universiteit etc. De Technische Universiteit Eindhoven biedt hier een "Professional Doctorate in Engineering: Software Technology" (P.D.Eng.)

### In Vlaanderen

De Universiteit Antwerpen biedt een masteropleiding aan die rechtstreeks verder bouwt op de bacheloropleiding in de informatica. De Universiteit Gent en Katholieke Universiteit Leuven bieden een gelijkaardige masteropleiding aan voor ingenieursstudenten. De Vrije Universiteit Brussel voorziet dan weer een hybride masteropleiding, die kan gevolgd worden via een gespecialiseerde bachelor in de computerwetenschappen of via een generieke bachelor in de ingenieurswetenschappen met een profiel computerwetenschappen.

## Software engineers

Software engineers zijn wetenschappers, technici en/of innovatoren op het gebied van de software engineering. Een voorbeeld van enige specialisten.
* Theo Bemelmans
* Grady Booch
* Jan Dietz
* Michael A. Jackson
* Mario Jeckle
* Rudy Rucker
* James Rumbaugh