Ontwikkeling is het iteratief creëren van iets nieuws en nuttigs.
Wanneer we aan ontwikkeling denken, komt vaak productontwikkeling in gedachten. Dit verschilt van productie, dat individuele producten voortbrengt; in plaats daarvan omvat het het creëren van de ontwerpspecificaties of mallen voor producten.
Zo worden de blauwdrukken of mallen die door nieuwe productontwikkeling zijn gecreëerd, herhaaldelijk gebruikt in fabrieken om talrijke identieke producten te vervaardigen.
Er zijn ook toepassingen zoals het ontwikkelen van individuele vaardigheden of het ontwikkelen van de samenleving en naties. Deze impliceren niet slechts een toename van wat men bezit, maar het vermogen om de ontwikkelde capaciteiten herhaaldelijk te gebruiken en daarvan te profiteren.
Hoewel de economische kracht van individuen en samenlevingen kan fluctueren als gevolg van economische omstandigheden, zijn ontwikkelde capaciteiten fundamenteel permanent.
Zelfs als ze afnemen, wordt dit beschouwd als achteruitgang in plaats van de op- en neergaande schommelingen van economische welvaart.
Daarnaast is er ook de ontwikkeling van technologie en kennis. In tegenstelling tot de capaciteiten van individuen of specifieke samenlevingen, hebben deze de eigenschap dat ze gemakkelijk deelbaar zijn.
En onder de producten, capaciteiten, kennis en technologieën die het resultaat zijn van deze ontwikkelingen, kunnen sommige bijdragen aan verdere ontwikkeling.
Door dergelijke nuttige resultaten te ontwikkelen, wordt de reikwijdte van de ontwikkeling verbreed en verbeteren de efficiëntie en kwaliteit.
AI-gestuurde Softwareontwikkeling
Over het algemeen vereiste ontwikkeling aanzienlijke tijd en moeite. Vooral naarmate de samenleving vordert en diverse zaken geavanceerder worden, wordt het creëren van nieuwe dingen nog moeilijker.
Met de komst van generatieve AI verandert deze situatie echter. Momenteel ondergaat softwareontwikkeling dramatische veranderingen dankzij de hoge programmeermogelijkheden van generatieve AI.
In dit landschap wordt een toekomstvisie waarin autonome agenten gebaseerd op generatieve AI centraal komen te staan in softwareontwikkeling als software-engineers, al werkelijkheid.
We bevinden ons momenteel in een overgangsfase. Hoewel we de ontwikkeling niet volledig aan generatieve AI kunnen toevertrouwen, kan het vakkundig benutten van generatieve AI de softwareontwikkeling krachtig vooruithelpen.
Dit wordt AI-gestuurde softwareontwikkeling genoemd.
Ontwikkelingsgedreven Ontwikkeling
Wanneer generatieve AI softwareontwikkeling efficiënter maakt, kan het niet alleen de ontwikkeling van de uiteindelijke doelsoftware stroomlijnen, maar ook de ontwikkeling van software die de ontwikkeling zelf ondersteunt.
Zoals eerder vermeld, verbreden outputs die ontwikkeling vergemakkelijken de reikwijdte ervan en helpen ze de efficiëntie en kwaliteit te verbeteren. Bovendien kunnen ze, indien effectief gecreëerd, hergebruikt worden in andere ontwikkelingsprojecten.
Daarom kan door het ontwikkelen van software die de ontwikkeling ondersteunt tijdens het softwareontwikkelingsproces, de algehele efficiëntie worden verhoogd, en kunnen deze activa worden benut voor toekomstige ontwikkeling.
Traditioneel was het ontwikkelen van dergelijke hulpsoftware een gangbare praktijk, maar het vereiste eigen ontwikkelingstijd en -inspanning, wat zorgvuldige overweging en gerichte uitvoering noodzakelijk maakte.
Door generatieve AI te gebruiken, kan men snel eenvoudige software creëren om kleine taken die in gedachten komen te automatiseren. Als de taak duidelijke verwerking inhoudt, kan generatieve AI het programma nauwkeurig genereren met vrijwel geen fouten.
Als gevolg hiervan is het ontwikkelen van software ter ondersteuning van de ontwikkeling tijdens het softwareontwikkelingsproces gemakkelijker geworden dan voorheen.
En door hier dieper over na te denken, ontstaat een ontwikkelingsstijl waarbij nuttige tools voor ontwikkeling voortdurend tijdens het proces worden gecreëerd, waardoor de ontwikkelingsmethodologie zelf wordt getransformeerd.
We zullen dit "ontwikkelingsgedreven ontwikkeling" noemen.
Om ontwikkelingsgedreven ontwikkeling te beoefenen, heeft men de gewoonte nodig om objectief naar de eigen softwareontwikkeling te kijken, te overwegen welke delen door software en welke delen alleen door mensen kunnen worden afgehandeld, samen met de vaardigheid om dergelijke hulpsoftware te ontwikkelen.
Bovendien kan generatieve AI worden geïntegreerd in deze softwaretools. Door het in de software in te bedden, kan, in tegenstelling tot generatieve AI-agenten, de reikwijdte van de verwerking tot op zekere hoogte worden beperkt en kunnen paden worden gedefinieerd.
Hoewel AI-agenten vergelijkbare resultaten kunnen bereiken via prompts, kan software met ingebedde generatieve AI gemakkelijker de nauwkeurigheid verhogen door zowel programma's als prompts te combineren.
Als een dergelijke ontwikkelingsgedreven ontwikkeling kan worden beoefend, zal het tweede project verbeteringen laten zien in zowel kwaliteit als kosten in vergelijking met het eerste. Bovendien zullen bij elk volgend project – het derde, vierde, enzovoort – de verbeteringen blijven toenemen.
Dit is volkomen anders dan simpelweg generatieve AI gebruiken om software te ontwikkelen. Er zal na verloop van tijd een aanzienlijk verschil ontstaan tussen teams die simpelweg generatieve AI-tools beheersen en teams die ontwikkelingsgedreven ontwikkeling beoefenen.
Refactoring-gedreven Testen
Er is een concept genaamd Test-Driven Development (TDD), waarbij tests eerst worden ontworpen op basis van specificaties, en daarna software wordt ontwikkeld om die tests te doorstaan.
Aanvankelijk dacht ik ook dat door gebruik te maken van generatieve AI het gemakkelijk zou zijn om testprogramma's voor geautomatiseerd testen te ontwikkelen, waardoor TDD haalbaar zou worden.
Toen ik echter begon met het toepassen van ontwikkelingsgedreven ontwikkeling, kwam ik tot de overtuiging dat het denken over tests voordat ze worden geïmplementeerd niet altijd de meest geschikte benadering is.
Vooral voor software zoals webapplicaties die subjectieve aspecten omvatten, zoals bruikbaarheid en visueel ontwerp, waarmee men direct interageert, realiseerde ik me dat het daadwerkelijk draaien en interactie hebben met de software voorrang heeft boven gedetailleerde tests.
Dit komt omdat als er aanzienlijke ontevredenheid is op UI/UX-niveau na interactie, er een mogelijkheid bestaat om fundamentele onderdelen zoals het framework, de basisarchitectuur, het datamodel of de use cases te willen wijzigen.
In mijn huidige persoonlijke softwareontwikkelingsproject merkte ik problemen op met de flexibiliteit en prestaties van functies, en uiteindelijk heb ik twee frameworks vervangen door andere.
Ook moest ik de verwerking op sommige gebieden volledig herzien vanwege inefficiënt geheugengebruik.
Het is op deze momenten van refactoring dat testen voor het eerst een bewuste overweging wordt.
Als dit in een vroeg stadium van ontwikkeling is, of als de functies en specificaties toch aanzienlijk zullen veranderen, zijn tests mogelijk overbodig.
Als de ontwikkeling echter al behoorlijk gevorderd is en er veel items zijn om te controleren, zijn tests nodig om te bevestigen dat refactoring geen functionele gebreken of omissies heeft geïntroduceerd.
Daarom is de benadering van het maken van testprogramma's wanneer de ontwikkeling tot op zekere hoogte is gevorderd en refactoring noodzakelijk wordt, geen slecht idee.
Op dit punt is het van cruciaal belang om niet voor alle code tests te maken, maar om je te richten op het testen van volwassen delen die in de toekomst waarschijnlijk niet veel zullen veranderen, terwijl vloeibare delen zonder geautomatiseerde tests worden gelaten.
Dit kan Refactoring-gedreven Testen worden genoemd.
Conclusie
Generatieve AI transformeert softwareontwikkeling ingrijpend.
In een vorig artikel schreef ik over het belang om een "Omnidirectionele Engineer" te worden, die systemen kan ontwikkelen die verschillende domeinen, infrastructuren en uitvoeringsomgevingen combineren, en verder gaat dan de traditionele full-stack engineer.
Ik schreef ook een artikel waarin ik suggereerde dat we een tijdperk van "Ervaring- & Gedrag-centrische Ontwikkeling" ingaan, waar de focus niet ligt op het afstemmen van specificaties op implementatie, maar op het verbeteren van de gebruikerservaring door middel van softwaregedrag.
Ontwikkelingsgedreven ontwikkeling en refactoring-gedreven testen zijn precies wat leiden tot deze nieuwe horizonten in softwareontwikkeling.