Naar inhoud springen
Dit artikel is vanuit het Japans vertaald met behulp van AI
Lees in het Japans
Dit artikel is in het Publiek Domein (CC0). Voel je vrij om het vrij te gebruiken. CC0 1.0 Universal

Ontwikkelingsgedreven Ontwikkeling en Refactoring-gestuurde Testen

Ontwikkeling draait om het herhaaldelijk creëren van iets nieuws en nuttigs.

Wanneer we "ontwikkeling" horen, denken we vaak aan de ontwikkeling van nieuwe producten. Dit verschilt van het vervaardigen van individuele producten; het impliceert als het ware het creëren van de blauwdrukken of mallen van het product.

Daarom worden de ontwerpen en mallen die ontstaan zijn door de ontwikkeling van nieuwe producten herhaaldelijk in fabrieken gebruikt om identieke producten in massa te produceren.

Er zijn ook andere toepassingen van het woord "ontwikkeling", zoals het ontwikkelen van individuele vaardigheden, of het ontwikkelen van een samenleving en een natie. Dit impliceert niet alleen een toename van wat men bezit, maar eerder het vermogen om de ontwikkelde vaardigheden herhaaldelijk te gebruiken en er profijt van te trekken.

Hoewel de economische macht van individuen en samenlevingen kan fluctueren met de economische omstandigheden, zijn ontwikkelde vaardigheden over het algemeen permanent.

Zelfs als ze afnemen, wordt dit gezien als een achteruitgang, niet als een fluctuatie zoals economische welvaart.

Bovendien is er de ontwikkeling van technologie en kennis. In tegenstelling tot de capaciteiten van individuen of specifieke samenlevingen, hebben deze het kenmerk dat ze gemakkelijk kunnen worden gedeeld.

En onder de resultaten van deze ontwikkelingen – producten, capaciteiten, kennis en technologieën – kunnen sommige nuttig zijn voor verdere ontwikkeling.

Door zulke nuttige resultaten te ontwikkelen, wordt de reikwijdte van de ontwikkeling uitgebreid, en verbeteren ook de efficiëntie en kwaliteit.

AI-gedreven Softwareontwikkeling

Over het algemeen vergde ontwikkeling aanzienlijke tijd en moeite. Vooral naarmate de samenleving vordert en diverse zaken geavanceerder worden, wordt het steeds moeilijker om nieuwe dingen te creëren.

Met de komst van generatieve AI verandert deze situatie echter. Momenteel ondergaat softwareontwikkeling een dramatische transformatie, profiterend van de hoge programmeermogelijkheden van generatieve AI.

Een toekomstige visie, waarin autonome agenten op basis van generatieve AI centraal komen te staan in softwareontwikkeling als software-engineers, wordt nu al werkelijkheid.

We bevinden ons momenteel in een overgangsperiode. Hoewel we de ontwikkeling niet volledig kunnen overlaten aan generatieve AI, kan het vakkundig inzetten van generatieve AI softwareontwikkeling krachtig vooruithelpen.

Dit wordt AI-gedreven Softwareontwikkeling genoemd.

Ontwikkelingsgedreven Ontwikkeling

Wanneer generatieve AI de softwareontwikkeling stroomlijnt, kan het niet alleen de ontwikkeling van de uiteindelijk beoogde software efficiënter maken, maar ook de ontwikkeling van software die de ontwikkeling zelf ondersteunt.

Zoals eerder vermeld, vergroten ontwikkelingsondersteunende resultaten de reikwijdte van de ontwikkeling en dragen ze bij aan verhoogde efficiëntie en kwaliteit. Bovendien kunnen ze, indien effectief gecreëerd, hergebruikt worden in andere ontwikkelingsprojecten.

Door tijdens het softwareontwikkelingsproces nuttige software te ontwikkelen, kan de algehele efficiëntie uiteindelijk worden verhoogd, en kunnen deze middelen ook worden benut voor toekomstige ontwikkeling.

Traditioneel was het ontwikkelen van dergelijke ontwikkelingsondersteunende software een gangbare praktijk in het vakgebied, maar het vergde op zichzelf ontwikkelingstijd en -inspanning, wat een zorgvuldige beoordeling en gerichte implementatie noodzakelijk maakte.

Door gebruik te maken van generatieve AI kan snel eenvoudige software worden gecreëerd om kleine, ad-hoc taken te automatiseren. Voor taken met duidelijke processen kan generatieve AI met vrijwel geen fouten nauwkeurige programma's genereren.

Dit maakt het gemakkelijker dan ooit om tijdens softwareontwikkeling software te ontwikkelen die de ontwikkeling ondersteunt.

En bij dieper nadenken ontstaat een ontwikkelingsstijl waarbij tijdens het ontwikkelingsproces voortdurend nuttige tools worden ontwikkeld, waardoor de ontwikkelingsmethode zelf transformeert.

Dit zullen we Ontwikkelingsgedreven Ontwikkeling noemen.

Om ontwikkelingsgedreven ontwikkeling te praktiseren, is het de gewoonte nodig om de eigen softwareontwikkeling objectief te observeren en te overwegen welke delen aan software kunnen worden gedelegeerd en welke delen alleen mensen kunnen doen, samen met de vaardigheid om dergelijke ontwikkelingsondersteunende software te ontwikkelen.

Bovendien kan generatieve AI worden geïntegreerd in deze softwaretools. Door deze in de software in te bedden, kan, in tegenstelling tot een zelfstandige generatieve AI-agent, de verwerkingsomvang worden beperkt en een duidelijk pad tot op zekere hoogte worden gedefinieerd.

Hoewel AI-agenten vergelijkbare resultaten kunnen bereiken door middel van prompting, kan software die generatieve AI integreert gemakkelijker de nauwkeurigheid vergroten door zowel programma's als prompts te combineren.

Als ontwikkelingsgedreven ontwikkeling kan worden toegepast, zullen de tweede projecten verbeteringen in zowel kwaliteit als kosten laten zien ten opzichte van de eerste. Bovendien zullen met elk volgend project – het derde, vierde, enzovoort – de verbeteringen zich blijven opstapelen.

Dit is volkomen anders dan simpelweg software ontwikkelen met behulp van generatieve AI. Na verloop van tijd zal een aanzienlijk verschil ontstaan tussen teams die generatieve AI-tools eenvoudigweg beheersen en teams die ontwikkelingsgedreven ontwikkeling praktiseren.

Refactoring-gestuurde Testen

Er bestaat een concept genaamd Test-Driven Development (TDD), wat inhoudt dat men eerst tests ontwerpt op basis van specificaties en vervolgens software ontwikkelt om die tests te doorstaan.

Aanvankelijk dacht ik ook dat met generatieve AI het eenvoudig maken van testprogramma's voor geautomatiseerd testen, Test-Driven Development wellicht uitvoerbaar zou zijn.

Echter, toen ik begon met het praktiseren van Ontwikkelingsgedreven Ontwikkeling, kwam ik tot de overtuiging dat de benadering van het ontwerpen van tests vóór implementatie niet altijd geschikt was.

Vooral voor software zoals webapplicaties, die subjectieve aspecten omvatten zoals bruikbaarheid en visueel ontwerp die men kan ervaren door interactie, realiseerde ik me dat het daadwerkelijk draaien en interageren met de software de voorkeur heeft boven gedetailleerd testen.

Dit komt omdat, indien er aanzienlijke ontevredenheid is op UI/UX-niveau bij interactie, de mogelijkheid bestaat dat fundamentele onderdelen zoals het framework, de basisarchitectuur, het datamodel of de use-cases gewijzigd moeten worden.

In mijn huidige persoonlijke softwareontwikkelingsproject merkte ik ook problemen op met functionele flexibiliteit en prestaties, wat me ertoe bracht twee frameworks te vervangen door andere.

Er was ook een deel met een slechte geheugengebruik-efficiëntie, wat een complete herziening van de verwerking vereiste.

Het is op deze refactoring-momenten dat testen voor het eerst een bewuste overweging wordt.

Als dit in de vroege stadia van de ontwikkeling plaatsvindt, of als functies en specificaties toch aanzienlijk zullen veranderen, zijn tests mogelijk niet nodig.

Echter, als de ontwikkeling al ver gevorderd is en er veel punten te controleren zijn, zullen tests waarschijnlijk nodig zijn tijdens het refactoringproces om te verzekeren dat er geen functionele tekortkomingen of omissies zijn.

Daarom is het idee om testprogramma's te creëren op het moment dat de ontwikkeling tot op zekere hoogte gevorderd is en refactoring noodzakelijk wordt, geen slecht idee.

Op dit punt is de sleutel niet om tests voor alle code te maken, maar om de tests te richten op volwassen delen die waarschijnlijk weinig zullen veranderen in de toekomst, en de nog vloeibare delen zonder geautomatiseerde tests te laten.

Dit kan Refactoring-gestuurde Testen worden genoemd.

Conclusie

Generatieve AI transformeert de softwareontwikkeling ingrijpend.

In eerdere artikelen schreef ik over het belang om te streven naar een Omnidirectionele Engineer, iemand die verder kan gaan dan de traditionele full-stack engineer-rol en omnidirectionele systemen kan ontwikkelen die diverse domeinen, infrastructuur en uitvoeringsomgevingen combineren.

Ik schreef ook een artikel waarin ik suggereerde dat we een tijdperk van Ervarings- en Gedragsgestuurde Ontwikkeling ingaan, dat zich richt op het verbeteren van de gebruikerservaring door middel van softwaregedrag, in plaats van de traditionele softwareontwikkelingsbenadering van het afstemmen van specificaties op implementatie.

Ontwikkelingsgedreven Ontwikkeling en Refactoring-gestuurde Testen zijn precies de benaderingen die ons naar deze nieuwe horizonten in softwareontwikkeling zullen leiden.