Blog: Verschil tussen generator en software factory

Software ontwikkeling is tijdrovend en daarom kostbaar. Al decennia lang wordt er geprobeerd om software ontwikkeling te versnellen. Vele initiatieven zijn er gestart en veel initiatieven zijn inmiddels ook al mislukt. Bij software versnelling wordt vaak meteen gedacht aan code genereren of kortweg een generator.

Door de vele beloftes over generatoren en de vele mislukkingen, omdat het niet goed werkt, heeft het woord generator een negatieve lading gekregen bij veel ontwikkelaars inclusief mijzelf. Bij een generator denk ik aan allerlei tooltjes die snel een bepaald stukje software produceren. Voorbeelden:

  • seam-gen (produceert snel een webapplicatie die gebouwd is met het seam framework);
  • andromda (produceert snel java dao’s die gebruik maken van hibernate);
  • forge (opvolger van seam-gen en produceert java webapplicaties in Java EE6 architectuur);
  • wsdl2java (produceert snel de java code om een webservice te ontsluiten);
  • Spring Roo (produceert snel een prachtige Spring en PrimeFaces applicatie) enz.

Meestal is de code die geproduceerd wordt bedroevend en is het code die niet in het versiebeheer systeem wordt ingechecked en die buiten tools als Sonar en Sig wordt gehouden. Een ander kenmerk van dit soort tools is dat ze door een ontwikkelaar altijd als blackbox worden behandeld. Het tooltje wordt ingezet en de geproduceerde code wordt gebruikt “as is”. Het ontbreekt ook vaak aan mogelijkheden om de geproduceerde code naar de hand van de ontwikkelaar te zetten. Als ontwikkelaar kan je er een model (logisch datamodel bv) in stoppen, waarna de generator snel de code produceert.

Een software factory werkt heel anders. Met een software factory kan een ontwikkelaar zijn eigen programmeerwerk automatiseren en zorgen dat de code die hij wil intypen door de software factory wordt geproduceerd. In plaats van zelf direct de java code (en xml files en plain files) in te typen worden er instructies gegeven aan de software factory, zodat de software factory de code kan produceren. Deze instructies bestaan uit een beschrijving van 0 of meer modellen, een pattern (waarin de architectuur van de applicatie staat beschreven) en 0 of meer snippets (templates) die door een template engine (bijvoorbeeld Velocity of Freemarker) worden verwerkt. De template engine is een onderdeel van de software factory en via de software factory api kan vanuit een template het model, het pattern, de gegenereerde class of metadata worden aangesproken, zodat precies de juiste code kan worden geproduceerd. Deze manier van werken lijkt op het eerste gezicht wellicht omslachting, maar kan bij adminstratieve software (software met een database) zeer veel ontwikkeltijd besparen. De software factory verwerkt de instructies van de ontwikkelaar en zet dit om in source code. Eigenlijk is een software factory hiermee een maatwerk generator die juist als whitebox behandeld wordt, de ontwikkelaar moet precies weten waar de instructies van de software factory voor dienen en hoe daarmee het resultaat (de geproduceerde broncode) wordt beinvloed. Een software factory wordt bediend/gebruikt door een software ontwikkelaar die precies weet hoe hij de code met de hand zou willen schrijven. Genereer nooit code die je niet zelf met de hand geschreven zou kunnen hebben!

Het gebruik van een software factory levert allereerst tijdwinst op. Doordat de code wordt geproduceerd door de software factory (duizenden regels code worden in enkele seconden geproduceerd) is het ook makkelijk om alles weg te gooien, de instructies (model, pattern, templates) aan te passen en alles opnieuw te produceren wat ontzettend handig is bij voortschrijdend inzicht. Het software ontwikkelproces is hiermee herhaalbaar geworden!

In de praktijk is er bij bijna elke ontwikkelaar wel sprake van voortschrijdend inzicht als er meerdere weken of maanden aan een applicatie gewerkt wordt: de 2e of 3e dao, service, controller of edit scherm ziet er nou eenmaal vaak beter uit dan degene die als eerst geproduceerd was. Een software factory is een uitkomst bij voortschrijdend inzicht, omdat alle inzichten verwerkt worden in de instructies waarna alles opnieuw geproduceerd wordt.