Het blijft wel een terugkerend verhaal hoe je productiviteit het beste kunt vergroten.
Productiviteit staat denk ik voor een groot deel gelijk aan abstractie en beheersing van complexiteit. Ik praat daarom maar even over abstractie ipv productiviteit omdat bij productiviteit snel andere randzaken betrokken kunnen worden. De kern van de zaak voor de lange termijn is echter abstractie.
Otis omschrijft abstractie graag in termen van code-generators, tools, visueel werken. Zoals we al in een eerdere discussie over abstractie hebben gezien ben ik het daar niet mee eens. Althans: tools en code-generatie zijn belangrijk, maar het gaat niet om de tools, maar om de
input van de tools.
De effectiviteit van een taal hangt daarom vooral af van de vorm van de input. In hoeverre:
1. abstraheert deze? Lift het de kijk op de zaak op een hoger niveau?
2. zijn de input mogelijkheden niet
te specifiek voor een bepaald probleem?
Ik zelf geloof dat visueel werken, interactieve tools en ad-hoc code generatoren niet veel toevoegen omdat ze voornamelijk op punt (2) op dit moment vaak zeer gebrekkig zijn.
Het gaat namelijk in heel de informatica om het specificeren van een situatie.
Als voorbeeld: bij imperatief programmeren is de afstand tot een specificatie vaak erg groot. Je moet in je hoofd tijdens het programmeren de specificatie omzetten in een implementatie: je geeft aan
hoe iets moet gebeuren waarvan in de specificatie beschreven staat
wat er moet gebeuren.
Bij talen als SQL zie je een duidelijke abstractie: je geeft op een hele prettig manier aan
wat er moet gebeuren en abstraheert daarbij werkelijk enorm van de concrete implementatie:
hoe moet de query of update uitgevoerd worden. SQL is dus duidelijk een taal die een stuk dichter bij een specificatie staat. Dit wordt ook weleens declaratief genoemd, maar dat vind ik eigenlijk geen prettige term.
Ik zie erg veel toekomst voor specificerende talen. Dit kan twee kanten opgaan:
1. Talen die zich richten op een algemeen toepassingsgebied. Ze zijn dus niet
domein-specifiek. Deze groep van talen zal echter meer bieden tov de huidige imperatieve talen omdat de implementatie niet direct gericht is op de architectuur van een moderne computer zoals je in alle imperatieve talen ziet. Ze bieden dus een hele eigen manier van uitdrukking zonder dat ze daarbij rekening houden met de architectuur van een computer. Bekende voorbeelden zijn functionele talen (Haskell, Clean) maar bijvoorbeeld ook transformatie-talen als XSLT (wat gericht is op een bepaald type operatie, maar niet op een bepaald applicatie domein) en Stratego.
2. Talen die zich richten op een bepaald domein. Dit worden ook wel domein specifieke talen genoemd (DSL). De grens met de talen in punt (1) is niet altijd even duidelijk, maar je kunt het vaak wel aanvoelen. DSLs zijn gericht op een bepaald domein en zorgen dat jij voor dat domein heel prettig kunt beschrijven (specificeren) wat jouw situatie is. De specificatie in een DSL gaat vaak erg richting een soort data: je schetst een situatie.
Persoonlijk denk ik dat de talen in categorie (1) toch ooit nog eens belangrijk gaan worden. XSLT is een treffend voorbeeld en eigenlijk de eerste declaratieve taal die door de 'gewone man' echt algemeen gebruikt wordt. In de toekomst zullen er meer van zulke talen doorbreken.
De talen in categorie (1) zullen altijd taal-georienteerd blijven. Tools voor deze categorie zijn in feite compilers of eenvoudigere transformaties die een taal omzetten naar een implementatie in termen van een computer-architectuur: ze voegen een
hoe toe voor een uitvoer op een computer.
De talen in categorie (2) zouden wellicht eerder richting visueel werken kunnen gaan, maar toch geloof ik het zelfs daar niet echt. Specificeren in een taal is qua uitdrukkingskracht op dit moment volledig superieur aan specificeren via visualisatie en interactie. Bij interactie met een visuele omgeving moet de visuele omgeving namelijk behoorlijk geavanceerd in elkaar zitten en rekening kunnen houden met allerlei typen van gebruik en combinaties daarvan. Het ontwerpen van zo'n visuele omgeving (waarin je dus echt visueel programmeert, ik heb het niet over een feature rijke editor) is enorm lastig (wat natuurlijk niet per definitie betekent dat het nooit goed gedaan zal worden).
Ik moest van week een tooltje schrijven wat een vrij lastige bewerking op een XML-achtig document uitvoerde. Deze bewerking was ik eerst aan het implementeren in Java, maar om 2 redenen was ik dit na een regel of 200 zat: (1) ik moest een aantal aannames maken die ik niet wilde maken in 200 regels Java code. (2) ik besefte dat ik veel beter een krachtige transformatie-taal kon gebruiken. Ik heb toen de code weggeflikkerd en de hele zaken compact
gespecificeerd in ongeveer 10 regels Stratego code. Resultaat: de code was inzichtelijk, aannames waren compact beschrijven en de correctheid van de code is eenvoudig in te zien. Bij 200 regels Java/C# code is dat gegarandeerd een stukje lastiger

.
In de toekomst zou je steeds meer talen moeten kunnen pakken waarin je je probleem compact kunt specificeren. Deze talen moeten gerealiseerd worden met tools, de tools zijn daarbij een noodzakelijk iets: het gaat niet om de tools, maar om het niveau waarop je over je probleem kunt praten en op welke manier je het dus kunt specificeren.
Tot zover dit verhaaltje over abstractie, tools, visueel werken, talen en de toekomst

.
Als je reageert vanuit een pro-tool visie: merk op dat ik niets tegen tools zeg, maar dat het naar mijn mening duidelijk om de input-mogelijkheden van een tool gaat.