# Softwareontwikkelaar

Een softwareontwikkelaar is een persoon die zich bezighoudt met het programmeren van software. Met de term kan ook een volledig bedrijf bedoeld worden. Een softwareontwikkelaar wordt ook wel programmeur, computerprogrammeur of applicatieontwikkelaar genoemd.
Een bedrijf dat software uitgeeft wordt een softwarebedrijf of een softwarehuis genoemd. De term applicatieontwikkelaar wordt bijna uitsluitend gebruikt voor een persoon die op een toegepast niveau programmeert, waar het aanspreken van bestaande software-componenten belangrijker is dan het begrijpen van technische details achter software.
In de begindagen van de computer hield een programmeur zich nog bezig met de hardware en programmeerde zij (het waren meestal vrouwen) de computer door het maken van de verbindingen, bijvoorbeeld door het plaatsen en verwijderen van stekkers en verbindingen. Tegenwoordig bestaan er programmeertalen die de programmeur veel hulpmiddelen aanreiken.
Het wetenschappelijk veld dat zich bezighoudt met softwareontwikkeling wordt software engineering genoemd. Dit is een vakgebied binnen de informatica.

## Ontwikkelproces

Het ontwikkelen van software is het totale proces van het schrijven van software. Dit bestaat uit een aantal stappen waarvan het eigenlijke programmeren stap twee, drie en vier beslaat. Niet voor ieder te ontwikkelen programma zijn alle stappen gebruikelijk, of zelfs maar relevant (lang niet ieder programma heeft een zo uitgebreide gebruiksinterface dat deze afzonderlijk geëvalueerd zal worden).
* Het probleem vaststellen.
* Het probleem opsplitsen in deelproblemen waar nodig/mogelijk.
* Mogelijke oplossingen bedenken voor alle deelproblemen, nagaan welke deelproblemen met reeds eerder ontwikkelde programmatuur kunnen worden opgelost.
* Gebruikersinterface vastleggen.
* Een testversie maken met alleen de gebruikersinterface.
* Gebruikersinterface testen op gebruiksvriendelijkheid.
* Functionaliteit programmeren (soms met gebruik van verschillende programmeertalen).
* Programmacode documenteren.
* De door mensen leesbare code in uitvoerbare code omzetten, door middel van compileren.
* Het deelprogramma testen om te kijken of het in alle toelaatbare omstandigheden werkt. Anders terug naar stap 7.
* Deelprogramma's samenvoegen en weer (uitgebreid) testen om te kijken of het totale programma ook in alle toelaatbare omstandigheden werkt. Anders terug naar stap 7.
* Gebruikershandleiding schrijven.
Deze stappen worden in grotere projecten doorgaans niet door dezelfde personen genomen. Bovendien worden niet al deze stappen uitgevoerd voor elk stuk software. Voor typische server software geldt over het algemeen dat er geen gebruikersinterface is in de betekenis zoals die hierboven wordt gebruikt.
De ervaring leert dat in dit traject het feitelijk programmeren, ook wel de implementatie genoemd, slechts 30 tot 35% van de tijd in beslag neemt. Een andere ervaring is dat waar 1 programmeur 1 maand voor nodig heeft, doen 2 programmeurs in 2 maanden; de stap naar teamwerk is een heel grote stap die in een niet al te groot project vaak averechts werkt. Een veelgebruikte benaming voor dit verschijnsel is de 'mythical man month'. Een vergelijking die vaak wordt gebruikt is dat 1 zwangerschap niet sneller kan verlopen door 9 vrouwen tegelijkertijd zwanger te laten zijn. Dit verschijnsel is een manifestatie van de onmogelijkheid om een bepaalde taak in kleinere taken onder te verdelen. Op een bepaald moment is de inspanning om te communiceren met de andere leden van een team zo groot dat de productiviteit van het totale team terugloopt als er meer mensen aan het team worden toegevoegd.
Berucht is ook de 80/20-regel: 80% van de applicatie wordt geschreven in 20% van de tijd. 80% van de tijd is nodig om de resterende 20% functionaliteit te ontwikkelen. In de praktijk betekent dit ook zoveel als: software is nooit af.

## Ontwikkelmethodes

Een softwareontwikkelmethode wordt gebruikt om het ontwikkelproces systematisch aan te pakken. De hierboven beschreven stappen hebben binnen de verschillende ontwikkelmethodes hun eigen plaats. Ontwikkelmethodes zijn in te delen in categorieën:
* watervalmethodes
* iteratieve methodes.
Een watervalmethode bestaat uit een aantal stappen die na elkaar worden doorlopen. Het eindresultaat van een stap is het beginpunt voor de volgende stap. Dit is de klassieke manier om automatiseringsprojecten aan te pakken. Een nadeel van deze methode is de doorlooptijd die nodig is om tot het eindresultaat te komen. Bovendien wordt uitgegaan van de veronderstelling dat bij de start van een project alle eisen en wensen bekend zijn. In de praktijk is dit over het algemeen niet het geval.
Iteratieve methodes lijken op watervalmethodes, maar gebruiken iteraties om delen van de functionaliteit te bouwen. Zo kan bijvoorbeeld eerst de functionaliteit rond de invoer van gegevens worden gemaakt en getest, waarna verder wordt gegaan met een iteratie waarin de uitvoer wordt gebouwd. Door deze onderverdeling in kleinere delen is het gemakkelijker om in te spelen op wijzigende eisen en wensen. Daarbij is de planning beter te controleren.
In de praktijk zijn verschillende methodes te combineren. Niet elke stap uit een bepaalde methode is verplicht. Wel wordt elke stap methodisch uitgevoerd, het mag nooit zoiets zijn als 'we rommelen maar wat aan, en als het werkt zijn we blij', wat bij amateur-programmeurs wel regelmatig voorkomt.
Voorbeelden van softwareontwikkelmethodes zijn eXtreme Programming en Rapid Application Development.

## Hulpmiddelen
### Programmeren

Voor het maken van de software gebruikt de programmeur verschillende hulpmiddelen:
* een teksteditor om de brontekst te schrijven.
* een of meerdere codegenerators om vanuit een eenvoudige brontekst of database brontekst automatisch te genereren.
* een compiler om (delen van) het programma naar machinetaal te vertalen, eventueel een assembler, soms een interpreter.
* een archiver en een linker om alle delen samen te voegen zodat een uitvoerbaar programma of een programma bibliotheek ontstaat.
* een verscheidenheid aan test-tools om regressie testen mee uit te voeren, aan profiling te doen en meestal een debugger waarmee de programmeur gericht technische fouten op het spoor kan komen en verhelpen.
* een versiebeheersysteem voor het bijhouden van wijzigingen in - en verschillende versies van onderdelen van de software.
* een defect-database om problemen te managen (zoals Bugzilla).
Een programmeur maakt vaak gebruik van een geïntegreerde ontwikkelomgeving (IDE) waarin teksteditor, compiler, debugger en vele andere softwareontwikkelgereedschappen geïntegreerd zijn.
Veel IDE's zijn voor slechts één technologie, vaak van dezelfde leverancier, geschikt. Enkele IDE leveranciers bieden hiervoor een oplossing, waarmee in één IDE met verschillende compilers of debuggers gewerkt kan worden.

### Projectmanagement

Om het hele softwareontwikkelproces te beheersen wordt vaak gebruikgemaakt van algemene projectmanagementsoftware, zoals programma's om Gantt-charts te maken, kosten te beheersen en communicatie binnen een groep te faciliteren (Group Support Systems). Om bij te houden welke fouten zijn gevonden en opgelost wordt vaak een issue tracker gebruikt.