<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>development &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/development/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 13:03:12 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>development &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Méér EDA: stap voor stap Programmeren</title>
		<link>https://www.smalsresearch.be/meer-eda-stap-voor-stap-programmeren/</link>
					<comments>https://www.smalsresearch.be/meer-eda-stap-voor-stap-programmeren/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Thu, 07 Dec 2023 13:30:35 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Eventual Consistency]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=19610</guid>

					<description><![CDATA[De voordelen van het gebruik van EDA zijn legio. Maar hoe gebruik je nu eigenlijk EDA in de praktijk? Wat als je al een enorm ecosysteem van toepassingen hebt die enkel en alleen via synchrone communicatie worden geïntegreerd en je nog nagenoeg geen business Events publiceert? In deze blog-post stellen we een methode voor om [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft size-full is-resized"><a href="/wp-content/uploads/2022/12/EDA.png"><img fetchpriority="high" decoding="async" width="569" height="491" src="/wp-content/uploads/2022/12/EDA.png" alt="" class="wp-image-17967" style="width:153px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/12/EDA.png 569w, https://www.smalsresearch.be/wp-content/uploads/2022/12/EDA-300x259.png 300w" sizes="(max-width: 569px) 100vw, 569px" /></a></figure>



<p class="justify-text">De voordelen van het gebruik van EDA zijn legio. Maar hoe gebruik je nu eigenlijk EDA in de praktijk? Wat als je al een enorm ecosysteem van toepassingen hebt die enkel en alleen via synchrone communicatie worden geïntegreerd en je nog nagenoeg geen business Events publiceert? In deze blog-post stellen we een methode voor om een applicatie te laten evolueren om meer Events te gaan publiceren.</p>



<span id="more-19610"></span>



<p></p>



<p class="justify-text">Binnen de instellingen van de Sociale Zekerheid groeit het besef dat <a href="/de-vier-gezichten-van-eda/" data-type="post" data-id="17574">Event Driven Architecture</a> (EDA) erg nuttig kan zijn als onderdeel van de integratiestrategie (we hebben hierover reeds uitvoerig geblogd en de belangrijkste voordelen zijn ook samengevat in ons <a href="/webinar-eda/" data-type="post" data-id="19311">webinar van november</a>). We hebben in ons IT ecosysteem echter al een enorm groot aantal systemen en applicaties die hier nog niet noodzakelijk van gebruik maken. Het zou zonde zijn als we ons voor EDA enkel zouden focussen op nieuwe toepassingen &#8211; de belangrijkste business Events in het ecosysteem worden waarschijnlijk al gecapteerd door reeds bestaande diensten. Maar hoe kunnen we er dan voor zorgen dat deze Events effectief via EDA technologie &#8211; als effectieve IT Events &#8211; worden gepubliceerd en beschikbaar worden in het ecosysteem voor subscribers?</p>



<p class="justify-text">In deze blog zullen we een mogelijke stap voor stap benadering bekijken, waarmee we reeds bestaande toepassingen meer Event-Driven kunnen maken. Niet alleen maar door ze stelselmatig meer Events te laten publiceren (al zal dit een logische eerste stap zijn), maar ook door ze hun eigen Events te laten gebruiken.</p>



<p class="justify-text">Een noodzakelijke disclaimer hier, is dat het Event-Driven maken van toepassingen niet het enige is dat zal moeten gebeuren om te evolueren naar een ecosysteem met een ruim en matuur gebruik van EDA. Wat dit allemaal zou moeten inhouden (b.v. het opzetten van een goede Event Broker), staat momenteel nog ter discussie in onze innovatiewerkgroep, al kunnen we daaromtrent uiteraard onze mening geven in een toekomstige blog-post&#8230;</p>



<h2 class="wp-block-heading">Fase 1: Event-Publicatie, &#8220;Na de Feiten&#8221;</h2>



<p class="justify-text">De eerste stap in het refactoren van een bestaande toepassing is meteen ook de belangrijkste voor het ecosysteem: het publiceren van Events. We moeten dit in eerste instantie als een zuivere toevoeging aan de functionaliteiten beschouwen, zonder enige impact op de reeds bestaande. Daarom zullen we een Event pas publiceren &#8220;na de feiten&#8221;, i.e. nadat alle zaken die normaal gezien door de toepassing worden gedaan, reeds zijn uitgevoerd.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/12/fase1.png"><img decoding="async" width="915" height="430" src="/wp-content/uploads/2023/12/fase1.png" alt="" class="wp-image-19614" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/fase1.png 915w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase1-300x141.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase1-768x361.png 768w" sizes="(max-width: 915px) 100vw, 915px" /></a><figcaption class="wp-element-caption">Figuur 1: Een Event publiceren na al het andere werk.</figcaption></figure>



<p class="justify-text">Laten we kijken hoe we dit kunnen doen voor één Event (we kunnen dit uiteraard herhalen om de toepassing meerdere Events te laten publiceren). Beschouw het (informele) sequentiediagram in Fig. 1: een  bepaald commando komt binnen in de toepassing (normaal gezien <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">via een API</a>), en er is besloten dat dit aanleiding geeft tot het voorkomen van een bepaald business Event; we willen dit Event dan ook publiceren als gevolg van het ontvangen commando. De toepassing doet reeds ander werk (&#8220;Internal Work&#8221;) als gevolg van het commando, en het commando moet worden beschouwd als een transactie (zoals we zien in &#8220;Command Transaction&#8221;).</p>



<p class="justify-text">Om het Event te publiceren met een minimale impact op de werking van de toepassing, zullen we het (via het &#8220;EDA Subsystem&#8221;) publiceren nadat we de transactie hebben vervolledigd. In de praktijk zal dit b.v. kunnen door (bínnen de transactie) een extra taak in de toepassing te creëren in een aparte thread, die pas wordt uitgevoerd nadat de transactie is afgewerkt (de &#8220;publicatietaak&#8221;). Het creëren van deze taak zal een zo eenvoudig mogelijke instructie zijn in de programmatie, met een veel kleinere kans op falen dan het effectieve uitvoeren van de taak, en kunnen we daarom dus veilig binnen de transactie doen.</p>



<p class="justify-text">Wanneer dan, achteraf, de publicatietaak effectief wordt uitgevoerd, zal dit door het EDA subsysteem gebeuren, en zullen we dan effectief het Event publiceren (in eerste instantie kan dit als &#8220;mock&#8221;: een operatie zonder enig effect, later zullen we het Event effectief aanbieden aan de Event Broker). Aldus komt het Event terecht in het ecosysteem en kan men het nuttig beginnen gebruiken.</p>



<h2 class="wp-block-heading">Fase 2: Event-Publicatie, &#8220;In Transactie&#8221;</h2>



<p class="justify-text">In fase 1 hebben we, om een zo min mogelijke impact te hebben op de performantie en kans op falen van de transactie, een nogal gekunstelde manier moeten gebruiken om het Event te publiceren búiten de transactie om. Een logische volgende stap is dan ook om het publiceren van het Event onderdeel te laten uitmaken van de transactie. Bijgevolg zullen we dan ook garanderen dat, indien de transactie volledig wordt uitgevoerd, het Event ook wordt gepubliceerd. Dit kan een garantie zijn van groot belang voor de Event subscribers verderop in het ecosysteem, vanaf nu kan men erop rekenen dat álle Events van dat type de revue zullen passeren.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/12/fase2.png"><img decoding="async" width="1007" height="509" src="/wp-content/uploads/2023/12/fase2.png" alt="" class="wp-image-19616" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/fase2.png 1007w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase2-300x152.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase2-768x388.png 768w" sizes="(max-width: 1007px) 100vw, 1007px" /></a><figcaption class="wp-element-caption">Figuur 2: Event publiceren als deel van het werk.</figcaption></figure>



<p class="justify-text">Beschouw nu Fig. 2: het verschil met de vorige tekening is niet groot: we zien nu dat het EDA subsysteem wordt opgeroepen tijdens het uitvoeren van het normale werk als gevolg van het binnenkomende commando. Wanneer het Event is gepubliceerd én het andere werk is uitgevoerd, kan de transactie worden afgewerkt. Publicatie van het Event betekent dat we bevestiging hebben gekregen van de Event Broker dat het goed door deze is ontvangen, maar uiteraard niet noodzakelijk reeds naar de subscribers is gestuurd. Dit is net één van de voordelen van de asynchrone communicatie binnen EDA.</p>



<p class="justify-text">Bij deze fase moeten we er wel op letten dat we op een zeer betrouwbare Event Broker kunnen rekenen. Vermits deze online moet zijn om het Event in ontvangst te nemen tíjdens de transactie, zou de transactie worden geblokkeerd indien er daarbij een fout optreedt. Men zou dit als een nadeel kunnen beschouwen, maar we moeten er aan denken dat het Event kan worden gebruikt als plaatsvervanger van het eventuele rechtstreeks oproepen van alle subscribers, indien deze tijdig op de hoogte moeten worden gebracht van wat er wordt beoogd met het uitvoeren van de transactie. Indien men tijdens het verwerken van het commando normaal gezien beroep deed op achterliggende APIs van andere systemen, kan men deze andere systemen nu in plaats daarvan inschrijven op het Event, waardoor deze API calls niet meer hoeven gebeuren en onze toepassing dus niet langer afhankelijk is van de achterliggende. Op deze manier vermínderen we de kans op falen van de transactie indien de Event Broker betrouwbaarder wordt gemaakt dan de andere achterliggende systemen.</p>



<h2 class="wp-block-heading">Fase 3: Event-First Programming, Transactioneel</h2>



<p class="justify-text">Tot nu toe waren onze wijzigingen in de oorspronkelijke toepassing vrij conservatief: het doel was een reeds bestaand systeem Events te laten publiceren ten voordele van het grotere ecosysteem (we zagen daarbij dat dit in principe kan leiden tot het verminderen van het gebruik van APIs van andere systemen en op die manier tot minder afhankelijkheden).</p>



<p class="justify-text">Vanaf fase 3 zullen we echter ook de eigen toepassing gebruik laten maken van de eigen Events, alvorens, als gevolg van het ontvangen van deze Events, het normale werk te doen. Dit noem ik Event-First programming, en het laat toe om een standaard stramien te hebben om te reageren op binnenkomende informatie: alle belangrijke wijzigingen komen nu binnen via Events. Dat betekent dat we op dezelfde manier zullen reageren op de eigen Events, als op andere Events van het ecosysteem, komende van andere toepassingen.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2023/12/fase3.png"><img loading="lazy" decoding="async" width="1024" height="450" src="/wp-content/uploads/2023/12/fase3-1024x450.png" alt="" class="wp-image-19621" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/fase3-1024x450.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase3-300x132.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase3-768x338.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase3.png 1173w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3: Event-First programmeren, met kunstmatig behoud van de volledig transactie.</figcaption></figure>



<p class="justify-text">Beschouw Fig. 3: om de transactie (voor het commando) op te volgen, voeren we een extra controller in. Als eerste stap wordt er nu een Event gepubliceerd als gevolg van het binnenkomende commando. Het EDA subsysteem zal dit Event publiceren, en óók de applicatie zelf (naast eventuele andere in het ecosysteem), zullen er zich voor inschrijven. Wanneer het Event dan opnieuw binnenkomt in de applicatie ten gevolge van de subscription, wordt het effectieve werk uitgevoerd dat de applicatie moet doen ten gevolge van het commando. Om de transactie, ten slotte, te kunnen beëindigen, moet de controller worden ingelicht wanneer het werk is gedaan. Hier zijn we vrij om dit opnieuw via een Event te doen, of op een andere manier (gebruik makend van een of ander bestaand mechanisme voor communicatie tussen threads dat wordt aangeboden door de programmeertaal).</p>



<p class="justify-text">Indien we deze fase voor een toepassing volledig implementeren (i.e. toepassen op álle binnenkomende commando&#8217;s), kunnen we de toepassing verder gaan modulariseren volgens het principe van CQRS (<a href="/architecturale-evoluties-deel-2/" data-type="post" data-id="11475">Command &amp; Query Responsability Segregation</a>). Dit wil zeggen dat modules die reageren op commando&#8217;s apart zullen staan van modules die reageren op queries.</p>



<p class="justify-text">Als u heeft opgemerkt dat het een beetje raar is dat we via een extra controller gaan wachten op een bericht dat het werk, als gevolg van ons Event, is gedaan en we onze transactie nu kunnen beëindigen, dan heeft u gelijk: we hebben deze fase eerder als illustratie ingevoegd om het contrast met de volgende fase te verduidelijken. Maar het lijkt ons eerder aangeraden om fase 3 over te slaan en onmiddellijk gebruik te maken van Eventual Consistency!</p>



<h2 class="wp-block-heading">Fase 4: Eventual Consistency</h2>



<p class="justify-text">Tot nu toe hielden we sterk vast aan de transactionaliteit van het uitvoeren van ons binnenkomende commando. Eigenlijk is dit een kunstmatig opgelegde beperking, die ons ervan weerhoudt maximaal in te zetten op de availability van het ecosysteem (zie: <a href="/newsql-een-upgrade-voor-je-oude-database/" data-type="post" data-id="13610">CAP theorema</a>). In fase 4 zullen we gaan vertrouwen in het concept <a href="/eventual-consistency-1/" data-type="post" data-id="15544">Eventual Consistency</a>: we gaan het commando als uitgevoerd beschouwen, van zodra we zeker zijn dat ons Event is gepubliceerd. We gaan er dan van uit dat de toestand van de applicatie (en, per extensie, van het volledige ecosysteem), na verloop van tijd (&#8220;eventually&#8221;) consistent zal worden en alle nodige zaken zijn gebeurd als gevolg van het commando (ook in andere toepassingen!). Typisch zal deze tijd redelijk kort zijn; we laten enkel de mogelijkheid open dat het langer kan duren, omdat we het falen van een achterliggend systeem nu kunnen toelaten (zie ook het <a href="/newsql-getest-en-goedgekeurd/" data-type="post" data-id="13705">PACELC theorema</a>).</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2023/12/fase4.png"><img loading="lazy" decoding="async" width="1024" height="445" src="/wp-content/uploads/2023/12/fase4-1024x445.png" alt="" class="wp-image-19623" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/12/fase4-1024x445.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase4-300x130.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase4-768x334.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/12/fase4.png 1187w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 4: Event-First programmeren, met Eventual Consistency</figcaption></figure>



<p class="justify-text">Beschouw nu Fig. 4: eigenlijk doen we hier hetzelfde als in Fig. 3, maar dan met een vereenvoudiging: er hoeft geen feedback meer te komen van &#8220;Internal Work&#8221; naar de &#8220;Controller&#8221; voor het commando. Deze laatste zal nu simpelweg het commando als uitgevoerd beschouwen wanneer het Event is verstuurd (we hadden de extra controller eigenlijk terug weg kunnen laten). Met deze manier van werken verkrijgen we het meeste voordeel uit EDA voor de eigen applicatie (het voordeel voor het ecosysteem kregen we reeds in fase 1).</p>



<h2 class="wp-block-heading">Besluit</h2>



<p class="justify-text">In deze blog-post lieten we een mogelijke, stapsgewijze evolutie zien van een computerprogramma dat bij het uitvoeren van een commando een business Event zou moeten publiceren. In de eerste fases wordt de impact geminimaliseerd; in latere fases wordt de toepassing zelf meer Event Driven gemaakt. Het spreekt voor zich dat deze manier van werken niet de enige goede is, en dat men ook niet steeds álle stappen hoeft te zetten.</p>



<p class="justify-text">We beseffen dat de vier fases zeer verboos zijn gedocumenteerd in dit schrijven; voor programmeurs kan dit nogal overbodig lijken. Maar we richten deze blog ook op niet-programmeurs, zodat voor hen een tipje van de sluier wordt gelicht over hoe programmeurs moeten nadenken over het echte binnenwerk van een toepassing, en hoe dit in verband staat met de communicatie op schaal van het ecosysteem waarbinnen een toepassing opereert.</p>



<p class="justify-text">Het publiceren van herbruikbare business Events is cruciaal voor een groot IT ecosysteem, waarbij integraties, <a href="/event-driven-apis/" data-type="post" data-id="16655">louter op basis van APIs</a>, op langere termijn voor een verminderde resiliëntie en agility kunnen zorgen. Een goed evenwicht tussen integraties via zowel synchrone als asynchrone communicatie, waarbij EDA als evenwaardig wordt beschouwd aan API, leidt tot het meest gezonde ecosysteem van applicaties.</p>





<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/meer-eda-stap-voor-stap-programmeren/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>LLM pour code&#160;: the Good, the Bad and the Ugly</title>
		<link>https://www.smalsresearch.be/llms-pour-code/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Thu, 07 Sep 2023 10:01:46 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[computational creativity]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=19037</guid>

					<description><![CDATA[Quelle est la situation dans le domaine de la génération de code, et que devons-nous encore prendre en compte ?]]></description>
										<content:encoded><![CDATA[
<p><em>Dit artikel is ook te lezen <a href="/llms-voor-code/">in het Nederlands</a>.</em></p>



<p><em>Cet article a été traduit du néerlandais. Les liens peuvent pointer vers des sources en néerlandais.</em></p>



<p>Dans un <a href="/de-ai-augmented-developer/">article précédent</a>, nous avons discuté de manière générale du potentiel de l&#8217;IA générative dans le <a href="https://www.servicenow.com/products/devops/what-is-sdlc.html">Software Development Lifecycle</a>. Examinons maintenant la question du point de vue du développeur&nbsp;: quel est l&#8217;état d&#8217;avancement de la génération de code et que devons-nous encore prendre en compte&nbsp;? Pour faire court&nbsp;: les assistants IA ou les plugins pour IDE sont une aubaine pour ceux qui savent en faire bon usage, mais comme tous les systèmes d&#8217;IA, ils présentent aussi des inconvénients.</p>



<h2 class="wp-block-heading"><strong>Avant-propos</strong></h2>



<p>Une partie de cette <a href="https://theresanaiforthat.com/">hype</a> en termes d&#8217;IA générative est propulsée par des <a href="https://en.wikipedia.org/wiki/Large_language_model">modèles de langages puissants</a> &#8211; les grands modèles de langue ou LLM. Depuis la sortie du GPT-3 en 2020, ces modèles parviennent à écrire des textes normaux d&#8217;une certaine longueur. De là, il n&#8217;y a qu&#8217;un pas vers les langages de programmation. En effet, ils ont aussi une syntaxe et une sémantique.</p>



<p>Dans la pratique, il existe de nombreuses variantes de modèles de langue, chacun ayant ses forces et ses faiblesses, en fonction des choix faits par les créateurs pour les entraîner, et en fonction des données d&#8217;entraînement qui les sous-tendent. Testez vous-même certains des modèles open source existants sur votre propre ordinateur via l&#8217;outil <a href="https://gpt4all.io/index.html">GPT4All</a> (voir également <a href="/publications/document/?docid=270">notre quick review</a> de cet outil).</p>



<p>Le code informatique consiste en une collection de fichiers texte. Rien n&#8217;empêche un modèle de langue d&#8217;essayer de prédire les différents <a href="https://www.techtarget.com/searchapparchitecture/definition/parser">tokens (= unités grammaticales)</a> qui composent le code, plutôt que des mots. Cependant, contrairement au texte brut, le code a beaucoup moins de tolérance à l&#8217;erreur&nbsp;: la moindre faute d&#8217;orthographe ou la plus petite variation peut invalider un morceau de code ou lui faire exécuter quelque chose de complètement différent.</p>



<p>Pourtant, aujourd&#8217;hui, les plus grands modèles de langue, tels que GPT-3.5 et les versions ultérieures, peuvent produire d&#8217;eux-mêmes des morceaux de code informatique tout à fait corrects en réponse à une requête. Cette fonctionnalité est due à la quantité massive de textes sur lesquels ils sont formés, notamment de nombreux tutoriels, articles de blog, questions et réponses provenant de forums de développeurs populaires tels que <a href="https://stackoverflow.com/">StackOverflow</a>, et code documenté provenant de repositories de code publics tels que <a href="https://github.com/">Github</a>.</p>



<h2 class="wp-block-heading"><strong>Canards en plastique bavards</strong></h2>



<p>Depuis <a href="https://en.wikipedia.org/wiki/Socratic_dialogue">Socrate</a>, le dialogue est un moyen efficace de parvenir à de nouvelles perspectives. Ce n&#8217;est pas pour rien que le <a href="https://blog.codinghorror.com/rubber-duck-problem-solving/">rubber ducking</a> est une méthode de correction de bugs qui revient dans tous les cours de génie logiciel. Il existe entre-temps plusieurs plugins qui mettent à disposition une interface de chat alimentée par l&#8217;IA dans l&#8217;IDE même (par exemple <a href="https://github.com/timkmecl/chatgpt-vscode">ceux pour VS Code</a>, beaucoup d&#8217;autres peuvent être trouvés via les <a href="https://marketplace.visualstudio.com/search?term=gpt&amp;target=VSCode">marketplaces pour VS Code</a>&nbsp;ou&nbsp;<a href="https://plugins.jetbrains.com/search?products=idea_ce&amp;search=gpt">IntelliJ IDEA</a>). Si ces plugins utilisent un service cloud externe, il vous suffit d&#8217;entrer votre propre clé API.</p>



<p>Un cadre de dialogue avec une dynamique de questions-réponses peut être bien utilisé pour générer des morceaux de code relativement autonomes, sans trop de dépendances externes. En général, pour obtenir le meilleur résultat, il faut pouvoir énoncer facilement toutes les conditions préalables et les hypothèses nécessaires dans le dialogue lui-même, de manière à ce qu&#8217;il s&#8217;inscrive dans la fenêtre contextuelle du modèle de langue. Les use cases comprennent entre autres&nbsp;:</p>



<ul class="wp-block-list">
<li>La génération <em>from scratch</em> d&#8217;une version initiale du code ou d&#8217;un fichier de configuration</li>



<li>La génération de fonctions ou de procédures relativement courtes à partir d&#8217;une description</li>



<li>La génération de <em>code snippets</em> autonomes&nbsp;: requêtes SQL, expressions régulières&#8230;</li>



<li>Demande de modification d&#8217;un morceau de code ou d&#8217;un fichier de configuration</li>



<li>Correction de bugs&nbsp;: recherche d&#8217;erreurs dans un code qui ne fonctionne pas, poser des questions sur une erreur</li>



<li>Faire expliquer ce qu&#8217;un morceau de code fait</li>
</ul>



<p>Les plus grands modèles de langue disposent de fenêtres contextuelles de plusieurs milliers de mots dans lesquelles il est possible d&#8217;insérer toutes les informations nécessaires. Un modèle de langue open source plus petit, installé localement sur du matériel moins puissant, sera sans aucun doute moins performant. Voici quelques exemples de conversations avec GPT-4 d&#8217;OpenAI, qui montrent qu&#8217;il est possible d&#8217;aller très loin avec quelques questions bien ciblées (cliquez sur l&#8217;image pour obtenir la pleine résolution)&nbsp;:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h05_32.png"><img loading="lazy" decoding="async" width="143" height="1024" data-id="18959" src="/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png" alt="" class="wp-image-18959" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png 143w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-42x300.png 42w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-286x2048.png 286w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-scaled.png 358w" sizes="auto, (max-width: 143px) 100vw, 143px" /></a><figcaption class="wp-element-caption">Exemple de conversation sur le code avec le modèle GPT-4 de ChatGPT&nbsp;: génération d&#8217;une configuration pour un remote server VNC sur un système Ubuntu partagé.</figcaption></figure>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h17_10.png"><img loading="lazy" decoding="async" width="198" height="1024" data-id="18958" src="/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png" alt="" class="wp-image-18958" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png 198w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-297x1536.png 297w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-58x300.png 58w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-768x3977.png 768w" sizes="auto, (max-width: 198px) 100vw, 198px" /></a><figcaption class="wp-element-caption">Exemple de conversation avec le modèle GPT-4 de ChatGPT&nbsp;: génération d&#8217;une requête SQL pour la transposition d&#8217;un tableau. La solution finale proposée utilise des techniques assez sophistiquées avec des procédures stockées.</figcaption></figure>
</figure>



<h2 class="wp-block-heading"><strong>Complétion de code sous stéroïdes</strong></h2>



<p>Au cours du développement, un développeur travaille sur de nombreux fichiers dans un IDE. À des endroits aléatoires de ces fichiers, le code doit être modifié, supprimé ou écrit. L&#8217;édition de code existant de cette manière n&#8217;a pas grand-chose à voir avec le dialogue&nbsp;; en fait, nous préférerions utiliser l&#8217;auto-complétion avancée dans ce cas. Les modèles de langue peuvent également faire l&#8217;affaire, mais les modèles les plus appropriés sont plutôt ceux formés aux tâches de &#8220;remplir au milieu&#8221; &#8211; et qui peuvent donc prendre en compte le code présent avant et après l&#8217;endroit que l&#8217;on édite.</p>



<p>Après la sortie de GPT-3, OpenAI a travaillé avec Microsoft (qui possède Github) pour créer un modèle de langue spécialisé, formé exactement pour ce use case. Cette variante a été nommée <a href="https://openai.com/blog/openai-codex">Codex</a>, et le premier outil à l&#8217;utiliser a été <a href="https://github.com/features/copilot">Github CoPilot</a>. Depuis, nous en sommes à plusieurs versions, mais les plugins pour <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot">VSCode</a> et <a href="https://plugins.jetbrains.com/plugin/17718-github-copilot">IntelliJ</a> fonctionnent toujours de la même manière&nbsp;: via un raccourci clavier dans l&#8217;éditeur, on peut utiliser CoPilot pour récupérer diverses suggestions, générées par Codex, qui pourraient correspondre à l&#8217;endroit où se trouve le curseur.</p>



<p>D&#8217;après notre expérience actuelle, le contexte pris en compte est généralement limité au contenu (partiel) du fichier édité. Cela implique évidemment le <a href="https://resources.github.com/copilot-trust-center/">téléchargement vers le modèle de langue</a> &#8211; veillez donc à respecter les directives en matière de confidentialité lorsque vous utilisez un service externe. Pour l&#8217;instant, nous semblons obtenir de meilleurs résultats dans les projets de programmation composés de quelques gros fichiers, tels que les pages web avec JavaScript en ligne, ou Jupyter Notebooks en Python, où il y a souvent un gros fichier à parcourir qui contient à la fois la documentation, le code et l’output. En revanche, dans les projets comportant de nombreux petits fichiers, il semble plus difficile de générer de bonnes suggestions, et il est plus important de disposer d&#8217;une documentation supplémentaire dans le fichier édité afin que le modèle de langue puisse puiser dans suffisamment d&#8217;informations contextuelles.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/copilot-in-vscode-example.png"><img loading="lazy" decoding="async" width="1024" height="604" src="/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png" alt="" class="wp-image-18964" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-768x453.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Github CoPilot dans VSCode. Suivant un schéma déjà présent dans le même fichier, un objet Rounding() doit être créé pour chaque élément d&#8217;un dictionnaire Python. L&#8217;itération fonctionne bien, mais CoPilot n&#8217;a manifestement aucune connaissance du function header, qui n&#8217;est définie ni dans ce même fichier ni dans la &#8220;connaissance générale&#8221; du modèle Codex de CoPilot&nbsp;: les suggestions proposent des paramètres qui n&#8217;existent pas. Immédiatement après avoir accepté cette solution erronée, le vérificateur de code statique intégré se plaint du paramètre manquant</figcaption></figure>



<p>L&#8217;une des alternatives les plus intéressantes au modèle commercial Github CoPilot est <a href="https://huggingface.co/blog/starcoder">StarCoder</a>, un modèle open source issu de l&#8217;initiative <a href="https://www.bigcode-project.org/">BigCode</a> HuggingFace et ServiceNow. Bien que la performance soit <a href="https://llm-leaderboard.streamlit.app/">moindre que CoPilot</a>, ils font la différence dans de nombreux autres domaines qui peuvent être des obstacles dans des contextes commerciaux ou publics&nbsp;:</p>



<ul class="wp-block-list">
<li>Entraînés sur un dataset public&nbsp;:&nbsp;<a href="https://huggingface.co/datasets/bigcode/the-stack">The Stack</a>. Bien qu&#8217;il ait été collecté par scraping, il ne contient que du code avec <a href="https://en.wikipedia.org/wiki/Permissive_software_license">des licences logicielles permissives</a>, et les développeurs peuvent, s&#8217;ils le souhaitent, <a href="https://huggingface.co/spaces/bigcode/in-the-stack">toujours faire retirer leur code du dataset</a>.</li>



<li>Comprend un outil <a href="https://huggingface.co/spaces/bigcode/search">de vérification de plagiat</a>, qui permet de vérifier que les suggestions générées n&#8217;ont pas été copiées mot pour mot à partir des données d&#8217;apprentissage (éventuellement protégées par des droits d&#8217;auteur).</li>



<li>Pourvu d&#8217;un <a href="https://huggingface.co/bigcode/starpii">filtre d&#8217;informations sensibles</a>, qui détecte les adresses électroniques, les clés API et les adresses IP (pas exact à 100&nbsp;%).</li>



<li>Contient des <a href="https://github.com/bigcode-project/starcoder/tree/main">instructions pour installer localement</a>, ainsi qu&#8217;un <a href="https://marketplace.visualstudio.com/items?itemName=HuggingFace.huggingface-vscode">plugin VSCode</a>. Un <a href="https://plugins.jetbrains.com/plugin/22090-starcoder">plugin IntelliJ</a> a entre-temps également été développé par un tiers.</li>



<li>Le modèle standard a une taille de 15 milliards de paramètres et nécessite au moins 60 GB de RAM ou autant de mémoire GPU (en fonction de l&#8217;utilisation ou non d&#8217;un GPU) pour être utilisé. Il existe également de <a href="https://huggingface.co/spaces/bigcode/multilingual-code-evals">plus petits modèles</a> à 7, 3 ou 1 milliard de paramètres, ainsi que des <a href="https://github.com/bigcode-project/starcoder.cpp">versions quantisées</a> utilisant des types de données à 4 bits, sans grande perte de précision.</li>
</ul>



<p>Plusieurs autres systèmes ont vu le jour cet été et ont obtenu de bons résultats dans de nombreux benchmarks&nbsp;:&nbsp;<a href="https://github.com/nlpxucan/WizardLM">WizardLM</a> et sa variante spécifique <a href="https://arxiv.org/abs/2306.08568">WizardCoder</a>, qui est désormais considéré comme le nec plus ultra de l&#8217;open source, et <a href="https://arxiv.org/abs/2207.11280">PanGu-Coder</a>, avec lequel Huawei s&#8217;est également lancé dans le monde des assistants IA pour le code.&nbsp;</p>



<h2 class="wp-block-heading"><strong>Au cœur de l&#8217;action</strong></h2>



<p>Le <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a> offre un bel aperçu du fonctionnement d&#8217;un modèle de langue pour le code.<br>Ce n&#8217;est certainement pas comme si vous pouviez &#8220;brancher&#8221; votre propre codebase pour obtenir des suggestions adaptées. Si vous voulez vraiment affiner le modèle (et vous ne ferez cet énorme effort <a href="https://twitter.com/rachel_l_woods/status/1692577254914638340">que si vous n&#8217;y arrivez pas</a> avec <a href="https://en.wikipedia.org/wiki/Prompt_engineering">des modifications astucieuses du prompt</a>), il y a beaucoup de choses à faire, du prétraitement des données d&#8217;entraînement au post-traitement de l’output brut du modèle de langue. Ne vous attendez pas non plus à ce que le réglage fin soit trop élevé&nbsp;: StarCoder l&#8217;a fait pour Python, mais n&#8217;a obtenu <a href="https://huggingface.co/blog/starcoder">que quelques points de pourcentage d&#8217;amélioration</a> par rapport au modèle global qui pourrait traiter tous les langages de programmation. Le peaufinage est difficile et il n&#8217;y a aucune garantie de succès&nbsp;; il y a même un risque d’<a href="https://research.nccgroup.com/2023/05/22/exploring-overfitting-risks-in-large-language-models/">overfitting</a>, ce qui pourrait dégrader les résultats.</p>



<p>L&#8217;étape la plus importante est probablement la collecte et le nettoyage des données.&nbsp;<a href="https://huggingface.co/datasets/bigcode/starcoderdata">Ces données sont constituées de code</a>, mais tous les codes ne sont pas inclus&nbsp;: vous devez également être autorisé à utiliser le code (licences) et, de préférence, l&#8217;avoir aussi correct que possible et écrit dans le langage de programmation que vous souhaitez soutenir. Le code est également collecté à partir <a href="https://en.wikipedia.org/wiki/Bug_tracking_system">des issue trackers</a> et <a href="https://en.wikipedia.org/wiki/Version_control">du commit history</a>. En outre, un filtrage additionnel peut être effectué pour supprimer les (quasi-)doublons, et des pondérations peuvent être attribuées ici et là pour maintenir l&#8217;équilibre&nbsp;: un peu moins de poids pour le code &#8220;boilerplate&#8221;, et/ou un peu plus pour les repositories très populaires qui sont susceptibles d&#8217;être de meilleure qualité. Le code source peut contenir des informations sensibles qui doivent être <a href="https://en.wikipedia.org/wiki/Data_anonymization">rendues anonymes</a> ou supprimées au préalable, pour éviter qu&#8217;elles ne soient divulguées ou suggérées (adresses IP, mots de passe, identifiants, adresses électroniques, coordonnées&#8230;). Tout cela, bien sûr, de préférence aussi automatiquement que possible.</p>



<p>Le code source se compose non seulement de code, mais aussi de descriptions, de commentaires et d&#8217;autres informations. Dans une étape de formatage, le code est donc enrichi par l’ajout de métadonnées et de <a href="https://huggingface.co/docs/transformers/main/internal/tokenization_utils#transformers.SpecialTokensMixin">tokens supplémentaires</a> qui rendent explicites certaines structures implicites. Cela peut avoir des conséquences&nbsp;: si tout ce prétraitement a été effectué sur l&#8217;ensemble des données d&#8217;apprentissage, le modèle résultant ne fonctionnera correctement sur de nouvelles données que s&#8217;il a subi le même prétraitement. Ainsi, les plugins éditeur qui souhaitent utiliser un tel modèle peuvent, pour obtenir un bon résultat, devoir d&#8217;abord effectuer un <a href="https://github.com/huggingface/huggingface-vscode/blob/a4a413723e9687bd2a7195d0e859f74467287571/package.json#L204">prétraitement similaire</a> sur le code qu&#8217;ils souhaitent envoyer au modèle de langue.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png"><img loading="lazy" decoding="async" width="325" height="353" src="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png" alt="" class="wp-image-18951" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37.png 325w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37-276x300.png 276w" sizes="auto, (max-width: 325px) 100vw, 325px" /></a><figcaption class="wp-element-caption">Pour que le modèle puisse mieux distinguer les différentes parties du code source, les données d&#8217;entraînement sont enrichies de métadonnées et de ce que l&#8217;on appelle des &#8220;tokens sentinelles&#8221;. &#8220;sentinel tokens&#8221;, comme cette liste tirée du <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a>.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Exactitude et autres benchmarks</strong></h2>



<p>Comme c&#8217;est le cas pour les LLM, il ne peut y avoir de garantie concluante de l&#8217;exactitude ou de l&#8217;exhaustivité de ce qu&#8217;un tel plugin présente, tant sur le plan syntaxique que sur le plan sémantique. Cette précision est évidemment importante&nbsp;: un morceau de code généré ne doit pas seulement être syntaxiquement correct et compiler sans faille, mais aussi être sémantiquement significatif et s&#8217;exécuter correctement. La métrique &#8220;pass@x&#8221; est devenue une mesure importante à cet égard. Elle exprime en pourcentage si un modèle de langue pour une mission donnée peut passer avec succès les tests correspondants après X tentatives. &#8220;pass@1&#8221; est le pourcentage pour lequel le modèle de langue utilisé pour la première fois a pu générer la bonne réponse, &#8220;pass@10&#8221; est le pourcentage pour lequel au moins 1 tentative sur 10 a été correcte.</p>



<p>Dans le monde de l&#8217;IA générative, il existe un besoin général de pouvoir comparer les nouveaux modèles, qui apparaissent désormais presque quotidiennement, avec le meilleur de la technologie. Il n&#8217;y a donc pas de pénurie de benchmarks, et de nouveaux modèles plus importants apparaissent régulièrement. Des résumés utiles sont les &#8220;leaderboards&#8221;, qui montrent en temps réel quels modèles représentent l&#8217;état actuel de la technique selon une série de benchmarks. L&#8217;étape peut changer chaque semaine. Voici quelques leaderboards généraux intéressants&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://paperswithcode.com/sota">Papers with Code</a>&nbsp;: l&#8217;état de l&#8217;art dans diverses tâches d&#8217;intelligence artificielle, avec des documents d&#8217;accompagnement.</li>



<li><a href="https://crfm.stanford.edu/helm/latest">Stanford HELM</a>&nbsp;: analyse comparative d&#8217;un large éventail de tâches en se focalisant sur le &#8220;human reasoning&#8221; (raisonnement humain).</li>



<li><a href="https://chat.lmsys.org/?leaderboard">LMsys.org FastChat</a>&nbsp;: se concentre sur les capacités chatbot.</li>



<li><a href="https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard">HuggingFace OpenLLM leaderboard</a>.</li>



<li><a href="https://llm-leaderboard.streamlit.app/">LLM-Leaderboard</a>.</li>
</ul>



<p>En ce qui concerne le code, il existe des benchmarks qui fonctionnent plus ou moins comme un concours de programmation. L&#8217;idée est de confier un ensemble de tâches au modèle de langue, d&#8217;évaluer les résultats automatiquement et de mesurer le &#8220;pass@1&#8221; et, si possible, d&#8217;autres paramètres. Souvent, il s&#8217;agit de &#8220;remplir la fonction&#8221;&nbsp;: à partir d&#8217;une description de l’input, de l’output et d&#8217;un function header, le contenu de la fonction doit être généré. L&#8217;inconvénient est que ce type de problème n&#8217;est parfois <a href="https://www.computer.org/csdl/journal/ts/2023/07/10103177/1MpWUtj7Rwk">pas très représentatif</a> de celui auquel est confronté le développeur lambda. Parmi les initiatives intéressantes, on peut citer&nbsp;:</p>



<ul class="wp-block-list">
<li>HuggingFace&nbsp;<a href="https://huggingface.co/spaces/bigcode/bigcode-models-leaderboard">Big Code Models leaderboard</a>&nbsp;(uniquement LLM publics).</li>



<li>Microsoft <a href="https://github.com/microsoft/CodeXGLUE">CodeXGLUE</a>&nbsp;: évaluation de diverses sous-tâches selon des méthodes connues de Natural Language Processing. Ce <a href="https://microsoft.github.io/CodeXGLUE/">leaderboard</a> semble dépendre de contributions volontaires et est quelque peu incomplet.</li>



<li>Papers with Code a des sections séparées pour&nbsp;<a href="https://paperswithcode.com/task/code-generation">la génération de code</a>,&nbsp;<a href="https://paperswithcode.com/task/code-documentation-generation">la création de documents</a>,&nbsp;<a href="https://paperswithcode.com/task/program-synthesis">la synthèse de programmes entiers</a>&nbsp;et&nbsp;<a href="https://paperswithcode.com/task/program-repair">la correction de bugs</a>.</li>



<li>Le <a href="https://paperswithcode.com/dataset/humaneval">HumanEval dataset</a> et <a href="https://paperswithcode.com/dataset/mbpp">MBPP dataset</a>&nbsp;: problèmes de programmation typique (Python).</li>



<li>Le&nbsp;<a href="https://paperswithcode.com/dataset/ds-1000">DS-1000 dataset</a>&nbsp;: ensemble de problèmes de data processing / data science concrets.</li>



<li><a href="https://paperswithcode.com/dataset/humaneval-x">HumanEval-X</a> ou <a href="https://github.com/nuprl/MultiPL-E">MultiPL-E</a>&nbsp;: versions multilingues de HumanEval, mesurant les performances dans plusieurs langages de programmation.</li>
</ul>



<p>Bien entendu, le fait qu&#8217;un morceau de code généré survive aux tests ne signifie pas qu&#8217;il s&#8217;agit d&#8217;un code sécurisé ou qu&#8217;il respecte les &#8220;best practices&#8221;. Entre-temps, il existe de nombreux exemples connus de code généré qui s&#8217;avère sensible aux &#8220;buffer overflows&#8221;, à l&#8217;injection SQL et à d&#8217;autres risques classiques. Le benchmark de sécurité <a href="https://huggingface.co/datasets/moyix/asleep_keyboard">&#8220;Asleep at the Keyboard&#8221;</a> consiste en 89 scénarios de génération de code basés sur la liste <a href="https://cwe.mitre.org/top25/">MITRE top-25 vulnerability</a>. <a href="https://arxiv.org/abs/2305.06161">Starcoder paper</a> montre que même les meilleurs modèles génèrent encore du code non sécurisé dans 40&nbsp;% de ces scénarios. En outre, il ne semble guère y avoir de différence entre les meilleurs modèles et les autres &#8211; le choix d&#8217;un meilleur modèle semble garantir des résultats syntaxiquement plus corrects, mais pas encore un code plus sûr. Il est donc possible que nous devions nous pencher sur les données d&#8217;apprentissage elles-mêmes, où le code non sécurisé devrait être encore mieux filtré. Quoi qu&#8217;il en soit, il convient de rappeler que l&#8217;utilisation de code généré dans un projet doit impérativement s&#8217;accompagner d&#8217;une solide politique de test et d&#8217;acceptation.</p>



<h2 class="wp-block-heading"><strong>Performance</strong></h2>



<p>En ce qui concerne plus particulièrement les exigences computationnelles, le leaderboard <a href="https://huggingface.co/spaces/optimum/llm-perf-leaderboard">Huggingface OpenLLM-perf</a> et les benchmarks sur le site web <a href="https://bellard.org/ts_server/">TextSynth Server</a> constituent des sources intéressantes. Ce dernier montre quelques chiffres de performance utiles pour ceux qui envisagent un hébergement par leurs propres moyens. Ceux qui n&#8217;ont pas de GPU peuvent compter sur une vitesse de 12 tokens par seconde avec le modèle LLaMa2 de 13 milliards de paramètres, avec un processeur de serveur <a href="https://tweakers.net/pricewatch/1672608/amd-epyc-7313-tray.html">EPYC 7313</a> relativement haut de gamme. Dans un code informatique, un token ne représente parfois qu&#8217;un seul caractère, de sorte qu&#8217;à cette vitesse, il faut parfois attendre une dizaine de secondes pour obtenir une suggestion de complétion de code. La dernière carte graphique RTX-4090 peut le faire 7 fois plus vite, mais pas encore au point de l&#8217;exprimer en millisecondes.</p>



<p>Les besoins en mémoire sont proportionnels au nombre de paramètres d&#8217;un modèle, et la vitesse de génération inversement proportionnelle. À titre d&#8217;approximation, on peut supposer qu&#8217;un modèle comportant 13 milliards de paramètres doit également effectuer 13 milliards de calculs pour chaque token de sortie, même s&#8217;il ne comporte qu&#8217;un seul caractère. En outre, si chaque paramètre est un nombre de 32 bits, il faut au moins 52 Go de stockage et autant de mémoire (V)RAM. Une &#8220;<a href="https://huggingface.co/docs/transformers/main_classes/quantization">quantization</a>&#8220;, arrondissant les paramètres à 8 bits ou même à 4 bits, peut réduire proportionnellement ce besoin en mémoire.</p>



<p><a href="https://gpt4all.io/index.html">GPT4All</a> permet de l&#8217;essayer sur votre propre matériel. Cela donne une idée de l&#8217;énorme puissance de calcul qu&#8217;OpenAI, Microsoft Azure ou Amazon AWS déploient pour que leurs modèles, dont beaucoup sont encore plus grands que les LLM disponibles en libre accès, fonctionnent aussi vite qu&#8217;ils le proposent. On parle d&#8217;investissements de <a href="https://venturebeat.com/ai/nvidia-gpu-shortage-is-top-gossip-of-silicon-valley/">milliards de dollars en matériel informatique</a>, si importants qu&#8217;ils déstabiliseraient le marché mondial.</p>



<p>Même les solutions open source sont loin d&#8217;être légères, en dépit des grandes <a href="https://github.com/ggerganov/llama.cpp">initiatives d&#8217;optimisation</a>. On peut en tout cas supposer que le déploiement local n&#8217;est possible que sur du matériel récent et puissant. Actuellement, on ne peut pas s&#8217;attendre à ce qu&#8217;une installation locale sur un ordinateur portable de bureau moyen offre une expérience fluide à l&#8217;utilisateur.</p>



<h2 class="wp-block-heading"><strong>Productivité</strong></h2>



<p>Internet regorge de contes de fées sur le <a href="https://medium.com/ingeniouslysimple/the-origins-of-the-10x-developer-2e0177ecef60">développeur 10x</a>, et les gourous de l&#8217;IA générative aimeraient vous faire croire que cette technologie peut élever n&#8217;importe quel programmeur à ce niveau. La réalité est plus nuancée. Les développeurs ne passent pas 100&nbsp;% de leur temps à écrire du code, pas plus que les médecins ne passent 100&nbsp;% de leur temps à rédiger des ordonnances. La majorité des développeurs <a href="https://www.software.com/reports/code-time-report">passe moins d&#8217;une heure par jour à coder</a>. Le reste de leur temps est consacré à l&#8217;analyse, à la lecture, à l&#8217;apprentissage, aux tâches de maintenance, à la communication, etc. Jusqu&#8217;à présent, cette réflexion et cette consultation avec les collègues ne sont pas comprimées par l&#8217;emploi de LLM.</p>



<p>Il est difficile de trouver des chiffres précis sur la productivité parce qu&#8217;elle est difficile à définir et donc à mesurer. Une première estimation utile provient de Google même, qui a examiné le temps d&#8217;itération (de la connaissance du problème à la solution). Avec une première version de son propre assistant de complétion de code par l&#8217;IA, <a href="https://ai.googleblog.com/2022/07/ml-enhanced-code-completion-improves.html">l&#8217;entreprise a pu constater un gain de temps de 6&nbsp;%</a>. Github affirme que <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">le codage pur peut être environ 55&nbsp;% plus rapide</a> avec son CoPilot &#8211; bien qu&#8217;il précise dans le même temps que l&#8217;intervalle de confiance à 95&nbsp;% de sa mesure est de [21&nbsp;%-89&nbsp;%]. En outre, l&#8217;adoption d&#8217;un outil n&#8217;apporte aucune valeur ajoutée si elle n&#8217;est pas accompagnée d&#8217;un parcours pour apprendre à l&#8217;utiliser de manière optimale (tout comme aujourd&#8217;hui encore, de nombreux employés de bureau perdent du temps avec Office en raison d&#8217;une <a href="https://support.microsoft.com/en-au/training">connaissance ou d&#8217;une expérience insuffisante</a> de tous les types de références, de formules et de raccourcis).</p>



<p>Le code généré fournit une solution initiale rapide, mais cette solution doit encore être comprise par le programmeur. Un score &#8220;pass@1&#8221; de 50&nbsp;% signifie que la moitié des bouts de code générés nécessitent encore des ajustements manuels avant de passer les tests unitaires &#8211; sans parler de l&#8217;optimalité ou de la sécurité. Le code généré peut être complexe et utiliser des constructions qui dépassent le niveau de connaissance du programmeur. Le code généré est donc plus difficile à maintenir et à corriger que le code écrit manuellement. Un code généré qui n&#8217;a pas été correctement examiné et testé ajoute une <a href="https://www.techtarget.com/whatis/definition/technical-debt">dette technique</a> considérable à un projet.</p>



<p>L&#8217;utilisation de plugins qui vont jusqu&#8217;à générer des blocs entiers de code et de documentation en un claquement de doigts (ou un peu plus lentement) n&#8217;est une bonne idée que si plusieurs autres aspects du processus d&#8217;ingénierie logicielle sont en ordre&nbsp;: des normes élevées doivent être maintenues dans tous les domaines en termes de stratégie de test, de code reviews, de documentation de code et de savoir-faire des développeurs.</p>



<h2 class="wp-block-heading"><strong>Confidentialité</strong></h2>



<p>Les entreprises et les gouvernements ont rarement le luxe d&#8217;utiliser n&#8217;importe quel modèle de langue. Il existe non seulement des barrières contractuelles, mais aussi des questions de confidentialité, en particulier lors de l&#8217;utilisation du cloud. Après tout, on n&#8217;obtient une bonne suggestion de modèle de langue qu&#8217;en introduisant suffisamment d&#8217;informations au préalable. Ne pas tout mettre en place en interne implique inévitablement de donner à un tiers l&#8217;accès à vos données.</p>



<p>Le degré d&#8217;ouverture et de licence peut varier considérablement &#8211; à un extrême, tout est en &#8220;boîte noire&#8221; et uniquement accessible via le cloud/API (c&#8217;est là que vous trouverez OpenAI, Anthropic, Cohere et la plupart des autres start-ups établies). Celles-ci promettent dans les <a href="https://openai.com/blog/introducing-chatgpt-enterprise">versions Enterprise</a> parfois plus de garanties &#8211; mais vous n&#8217;avez pas d&#8217;autre choix que de les croire sur parole. À l&#8217;autre extrême, tout est en &#8220;open access&#8221; (libre accès) et sous licence permissive. Entre les deux, une entreprise peut également construire un modèle de langue en libre accès sur un dataset fermé. Au moins un de ces datasets a <a href="https://www.theatlantic.com/technology/archive/2023/08/books3-ai-meta-llama-pirated-books/675063/">depuis été divulgué</a> comme contenant des <a href="https://github.com/psmedia/Books3Info">ebooks illégalement copiés et protégés par le droit d&#8217;auteur</a>, ce qui constituera sans aucun doute un argument de poids dans le <a href="https://storage.courtlistener.com/recap/gov.uscourts.cand.415175/gov.uscourts.cand.415175.1.0_1.pdf">recours collectif intenté contre Meta</a> sur ce sujet. Les ensembles de données des Code LLM <a href="https://arxiv.org/abs/2203.13474">Salesforce CodeGen</a> et <a href="https://codegeex.cn/">Tsinghua CodeGeeX</a> ne sont pas non plus publics.</p>



<p>Transparence, licences, options de déploiement, prix, taille et scalabilité&#8230; l&#8217;importance relative de toutes ces caractéristiques dictera les outils que vous pourrez utiliser. Ceux qui souhaitent une transparence maximale seront souvent limités aux <a href="https://github.com/eugeneyan/open-llms">LLM en Open Access</a>. Certaines licences ouvertes limitent en outre l&#8217;utilisation à des fins non commerciales. La nécessité d&#8217;accéder à des données de formation ou la facilité d&#8217;héberger soi-même une instance sur site <a href="https://blog.pragmaticengineer.com/github-copilot-alternatives/">limitent davantage les choix</a>.</p>



<h2 class="wp-block-heading"><strong>Conclusion</strong></h2>



<p>Les outils basés sur le dialogue (chatGPT et autres) peuvent vous être utiles en tant que développeur pour, entre autres, les tâches suivantes&nbsp;:</p>



<ul class="wp-block-list">
<li>Initialiser un projet/fichier/classe/configuration&nbsp;: créer une première version de quelque chose</li>



<li>Correction de bugs et modification sous forme de questions-réponses</li>



<li>Morceaux de code relativement indépendants</li>
</ul>



<p>Les outils qui complètent le code ou remplissent le code manquant (type Github Co-Pilot) sont utiles, entre autres, pour&nbsp;:</p>



<ul class="wp-block-list">
<li>Compléter du code à partir d&#8217;exemples déjà réalisés</li>



<li>Documenter le code</li>



<li>Apporter des modifications au milieu d&#8217;un fichier plus volumineux</li>
</ul>



<p>Pour un développeur, l&#8217;environnement de développement optimal est quelque chose de tout à fait personnel et chacun aura sa propre préférence. À notre avis, ces deux façons d&#8217;obtenir des suggestions de code sont quelque peu complémentaires, et une combinaison intelligente des deux peut permettre d&#8217;obtenir les meilleurs gains de productivité. Dans le même temps, nous tenons à dire qu&#8217;une gestion de projet saine, avec une attention portée à la qualité du code, aux tests, aux révisions, à la documentation, etc. est indispensable.</p>



<p>Le monde de l&#8217;IA est en pleine effervescence. De nouveaux modèles d&#8217;IA pouvant servir de base aux plugins IDE sont ajoutés avec une grande régularité. Pour les industries où la confidentialité du code est importante, les variantes open source sont très intéressantes. Même si les benchmarks montrent qu&#8217;ils sont encore moins performants aujourd&#8217;hui que les dernières initiatives commerciales basées sur le cloud, nous pouvons nous attendre à ce que de meilleures versions apparaissent à l&#8217;avenir. De nombreux efforts sont déjà déployés pour créer des modèles pouvant fonctionner sur du matériel grand public (certes haut de gamme).</p>



<h2 class="wp-block-heading">P.S.</h2>



<p>Quelques heures après la publication de cet article, HuggingFace annonce la venue de <a href="https://huggingface.co/blog/safecoder">SafeCoder</a>&nbsp;: une solution d&#8217;entreprise pour les assistants de codage basés sur LLM qui peut être déployée sur site. Huggingface fournit le tout dans des conteneurs qui peuvent être installés dans un data center propre et fournir des endpoints privés, ainsi que des plugins compatibles avec les principaux IDE. D&#8217;autres frameworks de déploiement général existent depuis un certain temps, notamment <a href="https://www.seldon.io/">Seldon</a>, <a href="https://www.bentoml.com/">BentoML</a> et <a href="https://github.com/kserve/kserve">KServe</a>, qui peuvent également héberger des LLM, <a href="https://bellard.org/ts_server/">TextSynth Server</a> et <a href="https://gpt4all.io/index.html">GPT4All</a> peuvent fonctionner comme des endpoints d&#8217;API. Cependant, vous avez toujours besoin de plugins pour les utiliser dans l&#8217;IDE lui-même, et pour effectuer les traitements préalables et postérieurs nécessaires &#8211; et s&#8217;ils ne sont pas fournis, vous devez en créer un vous-même ou modifier un plugin existant.</p>



<h2 class="wp-block-heading">P.P.S.</h2>



<p>Ces derniers mots à peine écrits, Meta a lancé <a href="https://about.fb.com/news/2023/08/code-llama-ai-for-coding/">CodeLLama</a>, une variante de <a href="https://ai.meta.com/llama/">LLaMa 2</a> spécifiquement entraînée pour le code. Les <a href="https://twitter.com/abacaj/status/1694889597723873562">médias sociaux suggèrent</a> qu&#8217;il est possible de faire tourner la version originale avec 34 milliards de paramètres sur un ordinateur équipé de 4 GPU RTX3090 avec 24 GB de VRAM chacun, générant environ 20 tokens par seconde. Il est sans doute plus facile d&#8217;essayer la <a href="https://huggingface.co/chat">version de chat en ligne</a>.&nbsp;<a href="https://github.com/ggerganov/llama.cpp">Les versions quantisées</a> suivront sans doute très prochainement, et nous attendons les premiers benchmarks sur les différents leaderboards.</p>



<p>______________________</p>



<p><em>Cette contribution a été soumise par Joachim Ganseman, consultant IT chez Smals Research. Elle a été rédigée en son nom propre et ne prend pas position au nom de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>LLMs voor code: the Good, the Bad and the Ugly</title>
		<link>https://www.smalsresearch.be/llms-voor-code/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 22 Aug 2023 09:43:16 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[computational creativity]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[source code]]></category>
		<guid isPermaLink="false">/?p=18875</guid>

					<description><![CDATA[Wat is de stand van zaken wat betreft het genereren van code, en waar moeten we nog rekening mee houden? AI-assistenten of -plugins voor IDEs zijn een zegen voor wie ze goed kan aanwenden, maar komen, zoals alle AI-systemen, ook met de nodige caveats.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible <a href="/llms-pour-code/">en français</a>.</em></p>



<p>In<a href="/de-ai-augmented-developer/"> een vorig artikel</a> bespraken we op algemene wijze het potentieel van generatieve AI in de <a href="https://www.servicenow.com/products/devops/what-is-sdlc.html">software development lifecycle</a>. Laat ons nu eens kijken vanuit het standpunt van de developer: wat is de stand van zaken wat betreft het genereren van code, en waar moeten we nog rekening mee houden? Lang verhaal kort: AI-assistenten of -plugins voor IDEs zijn een zegen voor wie ze goed kan aanwenden, maar komen, zoals alle AI-systemen, ook met de nodige <em>caveats.</em></p>



<h2 class="wp-block-heading">Vooraf</h2>



<p>De <a href="https://theresanaiforthat.com/">hype</a> qua generatieve AI wordt onder andere gestuwd door <a href="https://en.wikipedia.org/wiki/Large_language_model">krachtige taalmodellen</a> &#8211; Large Language Models of LLMs. Zeker sinds GPT-3 uitkwam in 2020, slagen die erin om normaal uitziende teksten te schrijven van enige lengte. Van daar is het maar een korte sprong naar programmeertalen &#8211; die hebben immers ook een syntax en semantiek.</p>



<p>In de praktijk bestaan er talloze varianten van taalmodellen, die elk hun sterktes en zwaktes hebben, al naargelang de keuzes die de makers hebben gemaakt bij het trainen ervan, en al naargelang de trainingsdata die eraan ten grondslag liggen. Probeer bijvoorbeeld zelf enkele van de bestaande open source modellen uit op je eigen computer via de tool <a href="https://gpt4all.io/index.html">GPT4All</a> (zie ook <a href="/publications/document/?docid=270">onze korte review</a> van deze tool).</p>



<p>Computercode bestaat uit een collectie van tekstbestanden. Niets verhindert dat een taalmodel, in plaats van woorden, de verschillende <a href="https://www.techtarget.com/searchapparchitecture/definition/parser">tokens ( = grammaticale eenheden)</a> waaruit code bestaat, probeert te voorspellen. In tegenstelling tot gewone tekst is er bij code echter veel minder ruimte voor fouten: de kleinste spelfout of variatie kan een stuk code ongeldig maken of iets helemaal anders laten uitvoeren. </p>



<p>Toch kunnen de allergrootste taalmodellen, zoals GPT-3.5 en later, vandaag uit eigen beweging vrij correcte stukken computercode produceren in een antwoord op een vraag. Deze functionaliteit is het gevolg van de massieve hoeveelheid tekst waarop ze getraind zijn, waaronder talloze tutorials, blogartikels, vragen en antwoorden uit populaire developerfora zoals <a href="https://stackoverflow.com/">StackOverflow</a>, en gedocumenteerde code uit publieke code repositories zoals <a href="https://github.com/">Github</a>.</p>



<h2 class="wp-block-heading">Babbelende badeentjes</h2>



<p>Al <a href="https://en.wikipedia.org/wiki/Socratic_dialogue">sinds Socrates</a> is de dialoog een beproefde manier om tot nieuwe inzichten te komen. Niet voor niets is <a href="https://blog.codinghorror.com/rubber-duck-problem-solving/">rubber ducking</a> een methode voor debugging die ter sprake komt in elke cursus software engineering. Er bestaan ondertussen verschillende plugins die een AI-powered chat-interface in de IDE zelf beschikbaar stellen (bvb <a href="https://github.com/timkmecl/chatgpt-vscode">deze voor VS Code</a> , vele andere kunnen gevonden worden via de <a href="https://marketplace.visualstudio.com/search?term=gpt&amp;target=VSCode">marketplaces voor VS Code</a> of <a href="https://plugins.jetbrains.com/search?products=idea_ce&amp;search=gpt">IntelliJ IDEA</a>). Als die gebruikmaken van een externe cloud-dienst moet je daarbij enkel nog je eigen API-key ingeven.</p>



<p>Een dialogerende setting met een vraag-antwoord dynamiek kan goed aangewend worden voor het genereren van relatief op zichzelf staande stukken code, zonder te veel externe afhankelijkheden. In het algemeen kan je stellen dat je, voor het beste resultaat, alle noodzakelijke randvoorwaarden en aannames gemakkelijk in de dialoog zelf moet kunnen vermelden, zodat het binnen het context-venster van het taalmodel past. De use cases omvatten onder andere:</p>



<ul class="wp-block-list">
<li><em>From scratch</em> genereren van een eerste versie van code of een configuratiebestand</li>



<li>Genereren van relatief korte functies of procedures aan de hand van een beschrijving</li>



<li>Genereren van op zichzelf staande <em>code snippets</em>: SQL queries, reguliere expressies, &#8230;</li>



<li>Vragen om een aanpassing aan een stuk code of een configuratiebestand</li>



<li>Debugging: fouten zoeken in niet-werkende code, vragen stellen over een error</li>



<li>Laten uitleggen wat een stuk code doet</li>
</ul>



<p>De grootste taalmodellen hebben ondertussen contextvensters van duizenden woorden waarin je alle nodige informatie kwijt kan. Een kleiner open-source taalmodel, lokaal geïnstalleerd op minder krachtige hardware, zal ongetwijfeld minder goed presteren. Enkele voorbeelden van conversaties met OpenAI&#8217;s GPT-4 staat hieronder &#8211; hieruit blijkt dat je al heel ver kan geraken met een paar welgemikte vragen (klik voor de volledige resolutie):</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h05_32.png"><img loading="lazy" decoding="async" width="143" height="1024" data-id="18959" src="/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png" alt="" class="wp-image-18959" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-143x1024.png 143w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-42x300.png 42w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-286x2048.png 286w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h05_32-scaled.png 358w" sizes="auto, (max-width: 143px) 100vw, 143px" /></a><figcaption class="wp-element-caption">Voorbeeld van een conversatie over code met ChatGPT&#8217;s GPT-4 model: genereren van een configuratie voor een VNC remote server op een shared Ubuntu systeem.</figcaption></figure>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/2023-08-22_16h17_10.png"><img loading="lazy" decoding="async" width="198" height="1024" data-id="18958" src="/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png" alt="" class="wp-image-18958" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-198x1024.png 198w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-297x1536.png 297w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-58x300.png 58w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_16h17_10-768x3977.png 768w" sizes="auto, (max-width: 198px) 100vw, 198px" /></a><figcaption class="wp-element-caption">Voorbeeld van een conversatie over code met ChatGPT&#8217;s GPT-4 model: genereren van een SQL query voor een transpositie van een tabel. De uiteindelijk voorgestelde oplossing gebruikt met stored procedures vrij geavanceerde technieken.</figcaption></figure>
</figure>



<h2 class="wp-block-heading">Code completion on steroids</h2>



<p>Tijdens het ontwikkelen werkt een developer aan talloze bestanden in een IDE. Op willekeurige plekken in die bestanden moet er code aangepast, verwijderd of geschreven worden. Het bewerken van bestaande code op deze manier heeft weinig te maken met dialogeren, eigenlijk willen we hier eerder een geavanceerde auto-complete inzetten. Ook dat kunnen taalmodellen goed, maar de meest geschikte modellen zijn eerder diegene die getraind zijn op &#8220;fill in the middle&#8221; taken &#8211; en die dus rekening kunnen houden met de aanwezige code voor én na de plek die men aan het bewerken is. </p>



<p>Na het uitbrengen van GPT-3, werkte OpenAI samen met Microsoft (dat Github bezit) aan een gespecialiseerd taalmodel dat voor exact deze use case werd getraind. Deze variant werd <a href="https://openai.com/blog/openai-codex">Codex </a>genoemd, en de eerste tool die ervan gebruikmaakte was <a href="https://github.com/features/copilot">Github CoPilot</a>. Ondertussen zijn we al enkele versies verder, maar de plugins voor <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.copilot">VSCode</a> en <a href="https://plugins.jetbrains.com/plugin/17718-github-copilot">IntelliJ</a> werken nog op dezelfde manier: via een sneltoets in de editor kan men via CoPilot verschillende suggesties opvragen, gegenereerd door Codex, die zouden kunnen passen op de plek van de cursor. </p>



<p>Voor zover onze ervaring vandaag reikt, is de context die daarbij in rekening wordt genomen vandaag meestal beperkt tot (stukken van) de inhoud van het bewerkte bestand. Daarbij wordt uiteraard code <a href="https://resources.github.com/copilot-trust-center/">geüploaded naar het taalmodel</a> &#8211; let dus zeker op richtlijnen qua confidentialiteit bij gebruik van een externe dienst. Vooralsnog lijken we betere resultaten te krijgen bij programmeerprojecten die bestaan uit weinig grote bestanden, zoals webpagina&#8217;s met inline JavaScript, of Jupyter Notebooks in Python, waarbij vaak sprake is van 1 groot bestand dat doorlopen wordt waarin zowel de documentatie, de code als de output staat. In projecten met vele kleine bestandjes daarentegen, lijkt het moeilijker om goede suggesties te genereren, en is het belangrijker dat er extra documentatie aanwezig is in het geëditeerde bestand zodat er voldoende contextuele informatie is die het taalmodel kan aangrijpen.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2023/08/copilot-in-vscode-example.png"><img loading="lazy" decoding="async" width="1024" height="604" src="/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png" alt="" class="wp-image-18964" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-1024x604.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example-768x453.png 768w, https://www.smalsresearch.be/wp-content/uploads/2023/08/copilot-in-vscode-example.png 1276w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Github CoPilot in VSCode. Een stramien volgend dat al eerder in hetzelfde bestand voorkomt, moet een Rounding()-object gecreëerd worden voor elk element in een Python dictionary. Itereren lukt goed, maar CoPilot heeft duidelijk geen weet van de juiste functieheader, die niet in ditzelfde bestand is gedefinieerd en ook niet in de &#8216;algemene kennis&#8217; van CoPilot&#8217;s Codex-model voorkomt: de suggesties stellen parameters voor die niet bestaan. Onmiddellijk na het accepteren van deze foutieve oplossing, klaagt de ingebouwde statische code checker over de missende parameter. </figcaption></figure>



<p>Een van de interessantere alternatieven voor het commerciële Github CoPilot is <a href="https://huggingface.co/blog/starcoder">StarCoder</a>, een open source model van het <a href="https://www.bigcode-project.org/">BigCode</a> initiatief van HuggingFace en ServiceNow. De performantie is weliswaar  <a href="https://llm-leaderboard.streamlit.app/">minder dan CoPilot</a>, maar zij maken op vele andere vlakken, die mogelijk dealbreakers zijn in commerciële of publieke context, het verschil:</p>



<ul class="wp-block-list">
<li>Getraind op een open dataset: <a href="https://huggingface.co/datasets/bigcode/the-stack">The Stack</a>. Deze is weliswaar via scraping verzameld, maar bevat alleen code met <a href="https://en.wikipedia.org/wiki/Permissive_software_license">permissieve softwarelicenties</a>, en developers kunnen desgewenst <a href="https://huggingface.co/spaces/bigcode/in-the-stack">alsnog hun code eruit laten verwijderen</a>. </li>



<li>Bevat een <a href="https://huggingface.co/spaces/bigcode/search">plagiaat-check</a> tool, waarmee je kan controleren of de gegenereerde suggesties niet verbatim uit de (mogelijk copyrighted) trainingsdata zijn overgenomen.</li>



<li>Voorzien van <a href="https://huggingface.co/bigcode/starpii">filter van gevoelige informatie</a>, die emailadressen, API keys en IP adressen detecteert (niet 100% accuraat).</li>



<li>Voorzien van <a href="https://github.com/bigcode-project/starcoder/tree/main">instructies om het lokaal te installeren</a>, evenals een <a href="https://marketplace.visualstudio.com/items?itemName=HuggingFace.huggingface-vscode">VSCode plugin</a>. Een <a href="https://plugins.jetbrains.com/plugin/22090-starcoder">IntelliJ plugin</a> werd ondertussen ook ontwikkeld door een derde partij.</li>



<li>Het standaardmodel is 15 miljard parameters groot en vergt minstens 60GB RAM of evenveel GPU memory (afhankelijk van of een GPU benut wordt of niet) om te kunnen gebruiken. Ondertussen bestaan ook <a href="https://huggingface.co/spaces/bigcode/multilingual-code-evals">kleinere modellen</a> met 7, 3 of 1 miljard parameters, evenals <a href="https://github.com/bigcode-project/starcoder.cpp">&#8220;quantized&#8221; versies</a> die gebruikmaken van 4bit datatypes zonder veel accuraatheidsverlies.</li>
</ul>



<p>Deze zomer zagen nog enkele andere systemen het licht die goed scoren op vele benchmarks: <a href="https://github.com/nlpxucan/WizardLM">WizardLM</a> en de specifieke variant ervan <a href="https://arxiv.org/abs/2306.08568">WizardCoder</a>, dat ondertussen wordt beschouwd als de open source state-of-the-art, en <a href="https://arxiv.org/abs/2207.11280">PanGu-Coder</a>, waarmee ook Huawei zich heeft gelanceerd in de wereld van AI-assistants voor code. </p>



<h2 class="wp-block-heading">Achter de schermen</h2>



<p>De <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a> geeft een goed zicht op de werking van een taalmodel voor code. Het is zeker niet zo dat je je eigen codebase kan &#8220;inpluggen&#8221; om suggesties te krijgen die daarop zijn toegespitst. Als je echt zou willen finetunen (en die enorme inspanning doe je in principe <a href="https://twitter.com/rachel_l_woods/status/1692577254914638340">alleen maar als je er niet raakt</a> met slimme <a href="https://en.wikipedia.org/wiki/Prompt_engineering">aanpassingen aan de prompt</a>), komt er heel wat bij kijken, van preprocessing van de trainingsdata tot postprocessing van de rauwe output van het taalmodel. Leg de verwachtingen van finetuning ook niet te hoog: StarCoder deed het voor Python, maar haalde <a href="https://huggingface.co/blog/starcoder">hooguit enkele procentpunten verbetering</a> in vergelijking met het algemene model dat met alle programmeertalen overweg kon. Finetunen is moeilijk en er is geen garantie op succes; er bestaat zelfs een risico op <a href="https://research.nccgroup.com/2023/05/22/exploring-overfitting-risks-in-large-language-models/">overfitting</a> wat tot slechtere resultaten kan leiden.</p>



<p>De belangrijkste stap daarbij is waarschijnlijk het verzamelen en schoonmaken van data. <a href="https://huggingface.co/datasets/bigcode/starcoderdata">Die data bestaat uit code</a>, maar niet alle code komt in aanmerking: je moet de code ook mogen gebruiken (licenties), en je hebt ze liefst zo correct mogelijk en geschreven in de programmeertaal die je wenst te ondersteunen. Code wordt ook verzameld uit <a href="https://en.wikipedia.org/wiki/Bug_tracking_system">issue trackers</a> en <a href="https://en.wikipedia.org/wiki/Version_control">commitgeschiedenis</a>. Daarnaast kan je nog extra filteren om (bijna-)duplicaten te verwijderen, en wil je misschien hier en daar gewichten toekennen om de balans te bewaren: wat minder gewicht voor boilerplate code, en/of wat meer voor erg populaire repositories die waarschijnlijk van hogere kwaliteit zijn. Broncode kan gevoelige informatie bevatten die eerst <a href="https://en.wikipedia.org/wiki/Data_anonymization">geanonymiseerd</a> of verwijderd moet worden, om te voorkomen dat die lekt of wordt gesuggereerd (IP adressen, paswoorden, identifiers, emailadressen, contactgegevens, &#8230;). Dit alles natuurlijk liefst zo automatisch mogelijk.</p>



<p class="has-text-align-left">Broncode bestaat niet alleen uit code maar ook uit beschrijvingen, commentaren en andere informatie. In een formatteringsstap wordt de code daarom nog verrijkt, door het toevoegen van metadata en <a href="https://huggingface.co/docs/transformers/main/internal/tokenization_utils#transformers.SpecialTokensMixin">bijkomende tokens</a> die bepaalde impliciete structuren expliciet maken. Dit kan implicaties hebben: als al deze preprocessing op de hele trainingsdataset is gebeurd, dan zal het resulterende model pas goed werken op nieuwe data als die dezelfde preprocessing heeft ondergaan. Het is dus mogelijk dat editorplugins die willen gebruikmaken van zo&#8217;n model, om een goed resultaat te bekomen, eerst <a href="https://github.com/huggingface/huggingface-vscode/blob/a4a413723e9687bd2a7195d0e859f74467287571/package.json#L204">gelijkaardige preprocessing</a> moeten uitvoeren op de code die ze naar het taalmodel willen sturen.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png"><img loading="lazy" decoding="async" width="325" height="353" src="/wp-content/uploads/2023/08/2023-08-22_10h52_37.png" alt="" class="wp-image-18951" srcset="https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37.png 325w, https://www.smalsresearch.be/wp-content/uploads/2023/08/2023-08-22_10h52_37-276x300.png 276w" sizes="auto, (max-width: 325px) 100vw, 325px" /></a><figcaption class="wp-element-caption">Opdat het model beter onderscheid kan maken tussen de verschillende onderdelen van broncode, wordt trainingsdata verrijkt met metadata en zgn. &#8216;sentinel tokens&#8217;, zoals deze lijst afkomstig uit de <a href="https://arxiv.org/abs/2305.06161">StarCoder paper</a>.</figcaption></figure>



<h2 class="wp-block-heading">Correctheid en andere benchmarks</h2>



<p>Typisch voor LLMs, kan er geen sluitende garantie worden gegeven op de correctheid of volledigheid van wat zo&#8217;n plugin je voorschotelt, zowel syntactisch als semantisch. Die correctheid is uiteraard van belang: een stuk gegenereerde code moet niet alleen syntactisch correct zijn en foutloos compileren, maar ook semantisch betekenisvol zijn en goed runnen. De &#8220;pass@x&#8221; metriek is daarbij uitgegroeid tot belangrijke graadmeter. Ze drukt uit als een percentage, of een taalmodel voor een bepaalde opdracht na X pogingen de bijhorende testen succesvol kan passeren. &#8220;pass@1&#8221; is het percentage dat het taalmodel van de eerste keer het juiste antwoord heeft kunnen genereren, &#8220;pass@10&#8221; is het percentage waarbij minstens 1 van 10 pogingen correct was.</p>



<p>Er is een algemene nood in de wereld van generatieve AI om nieuwe modellen, die ondertussen bijna dagelijks verschijnen, te kunnen vergelijken met de state-of-the-art. Aan benchmarks is er dus geen gebrek, en er verschijnen er geregeld ook nieuwe en grotere. Handige samenvattingen zijn de &#8220;leaderboards&#8221;, die real-time tonen welke modellen de huidige state-of-the-art vertegenwoordigen volgens een waaier aan benchmarks. Het podium kan wekelijks veranderen. Enkele interessante algemene leaderboards zijn:</p>



<ul class="wp-block-list">
<li><a href="https://paperswithcode.com/sota">Papers with Code</a>: state-of-the-art in verschillende AI taken, voorzien van begeleidende papers</li>



<li><a href="https://crfm.stanford.edu/helm/latest">Stanford HELM</a>: benchmarkt een breed scala aan taken met focus op &#8220;human reasoning&#8221;</li>



<li><a href="https://chat.lmsys.org/?leaderboard">LMsys.org FastChat</a>: focus op chatbot-vaardigheden</li>



<li><a href="https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard">HuggingFace OpenLLM leaderboard</a></li>



<li><a href="https://llm-leaderboard.streamlit.app/">LLM-Leaderboard</a></li>
</ul>



<p>Specifiek voor code zijn er benchmarks die min of meer werken zoals een programmeerwedstrijd. Het idee is om een set opdrachten te geven aan het taalmodel, de resultaten automatisch te evalueren, en de &#8220;pass@1&#8221; en zo mogelijk enkele andere metrieken te meten. Vaak neemt dat een &#8220;fill in the function&#8221;-vorm aan: gegeven een beschrijving van input en output en een functieheader, moet de inhoud van de functie gegenereerd worden. Een nadeel is dat dit soort problemen soms <a href="https://www.computer.org/csdl/journal/ts/2023/07/10103177/1MpWUtj7Rwk">weinig representatief</a> is voor dat waarmee de doorsnee developer wordt geconfronteerd. Interessante initiatieven zijn onder andere:</p>



<ul class="wp-block-list">
<li>HuggingFace <a href="https://huggingface.co/spaces/bigcode/bigcode-models-leaderboard">Big Code Models leaderboard</a> (enkel open LLMs)</li>



<li>Microsoft <a href="https://github.com/microsoft/CodeXGLUE">CodeXGLUE</a>: evaluatie van verschillende subtaken volgens methodes bekend uit Natural Language Processing. Hun <a href="https://microsoft.github.io/CodeXGLUE/">leaderboard</a> lijkt af te hangen van vrijwillige contributie en enigszins onvolledig.</li>



<li>Papers with Code heeft aparte secties voor <a href="https://paperswithcode.com/task/code-generation">genereren van code</a> , <a href="https://paperswithcode.com/task/code-documentation-generation">genereren van documentatie</a>, <a href="https://paperswithcode.com/task/program-synthesis">synthese van hele programma&#8217;s</a> en <a href="https://paperswithcode.com/task/program-repair">bugfixing</a></li>



<li>De <a href="https://paperswithcode.com/dataset/humaneval">HumanEval dataset</a> en <a href="https://paperswithcode.com/dataset/mbpp">MBPP dataset</a>: typische programmeerproblemen (Python)</li>



<li>De <a href="https://paperswithcode.com/dataset/ds-1000">DS-1000 dataset</a>: een set van concrete data science / data processing problemen </li>



<li><a href="https://paperswithcode.com/dataset/humaneval-x">HumanEval-X</a> of <a href="https://github.com/nuprl/MultiPL-E">MultiPL-E</a>: multi-language versies van HumanEval, meet performantie in meerdere programmeertalen</li>
</ul>



<p>Dat een gegenereerd stuk code de testen overleeft betekent natuurlijk nog niet dat het ook veilige code is of &#8220;best practices&#8221; volgt. Er zijn ondertussen voorbeelden genoeg bekend van gegenereerde code die vatbaar blijkt te zijn voor buffer overflows, SQL injection, en andere klassieke risico&#8217;s. De <a href="https://huggingface.co/datasets/moyix/asleep_keyboard">&#8220;Asleep at the Keyboard&#8221;</a> security benchmark bestaat uit 89 code generation scenario&#8217;s gebaseerd op de <a href="https://cwe.mitre.org/top25/">MITRE top-25 vulnerability</a> lijst. Uit de <a href="https://arxiv.org/abs/2305.06161">Starcoder paper</a> blijkt dat zelfs de beste modellen in 40% van deze scenario&#8217;s toch nog onveilige code genereren. Ook lijkt er nauwelijks verschil te merken tussen de beste modellen en de rest &#8211; een beter model kiezen lijkt wel te zorgen voor syntactische correctere resultaten, maar vooralsnog niet voor veiliger code. Mogelijk moet daarom eens gekeken worden naar de trainingsdata zelf, waar onveilige code nog beter uitgefilterd zou moeten worden. In ieder geval moeten we op dit moment adviseren: het gebruik van gegenereerde code in een project moet absoluut gepaard gaan met een robuust beleid inzake testing en acceptatie.</p>



<h2 class="wp-block-heading">Performantie   </h2>



<p>Specifiek wat betreft computationele vereisten, zijn het <a href="https://huggingface.co/spaces/optimum/llm-perf-leaderboard">Huggingface OpenLLM-perf</a> leaderboard en de benchmarks op de website van <a href="https://bellard.org/ts_server/">TextSynth Server</a> interessante bronnen. Die laatste toont enkele cijfers over performantie, die handig zijn voor wie met het idee speelt om het zelf te gaan hosten. Wie het zonder GPU doet, kan met het LLaMa2 model van 13 miljard parameters rekenen op een snelheid van 12 tokens per seconde, gegeven een relatief high-end <a href="https://tweakers.net/pricewatch/1672608/amd-epyc-7313-tray.html">EPYC 7313</a> serverprocessor. Een token in computercode is soms maar 1 karakter, dus aan dat tempo moet je soms een tiental seconden wachten op een code completion suggestie. De recentste RTX-4090 grafische kaart kan het 7x sneller, maar nog steeds niet zo snel dat je het in milliseconden zou uitdrukken. </p>



<p>De geheugenvereisten zijn evenredig met het aantal parameters van een model, en de generatiesnelheid omgekeerd evenredig. Als een grove benadering mag je aannemen dat een model van 13 miljard parameters, ook 13 miljard berekeningen moet maken voor elk output token, zelfs al is het maar 1 karakter lang. Daarnaast vereist het, als elke parameter een 32-bit getal is, minstens 52GB opslagruimte en evenveel (V)RAM-geheugen. Een &#8220;<a href="https://huggingface.co/docs/transformers/main_classes/quantization">quantization</a>&#8220;, die de parameters afrondt naar 8-bit of zelfs 4-bit, kan die geheugenvereiste evenredig doen dalen. </p>



<p><a href="https://gpt4all.io/index.html">GPT4All</a> laat toe het zelf eens te proberen op je eigen hardware. Dit geeft een idee van de enorme rekenkracht die OpenAI , Microsoft Azure, of Amazon AWS inzetten om hun modellen, die veelal nog groter zijn dan de beschikbare Open Access LLMs, zo snel te kunnen doen draaien als zij dat aanbieden. Er wordt gesproken van investeringen van <a href="https://venturebeat.com/ai/nvidia-gpu-shortage-is-top-gossip-of-silicon-valley/">miljarden dollars in hardware</a>, zodanig groot dat ze de wereldwijde markt destabiliseren.</p>



<p>Zelfs open source oplossingen zijn allesbehalve lightweight te noemen, ondanks verregaande <a href="https://github.com/ggerganov/llama.cpp">initiatieven tot optimalisatie</a>. Je mag er alleszins van uitgaan dat het lokaal deployen alleen maar haalbaar is op recente en krachtige hardware. Een vlotte user experience kan je momenteel nog niet verwachten van een lokale installatie op de doorsnee kantoorlaptop.</p>



<h2 class="wp-block-heading">Productiviteit</h2>



<p>Het internet staat vol sprookjes over de <a href="https://medium.com/ingeniouslysimple/the-origins-of-the-10x-developer-2e0177ecef60">10x developer</a>, en goeroes van generatieve AI zouden u graag doen geloven dat deze technologie elke programmeur tot dat niveau kan verheffen. De realiteit is hardnekkiger. Developers spenderen om te beginnen geen 100% van hun tijd aan het schrijven van code, net zomin als dokters 100% van hun tijd voorschriften schrijven. Het merendeel van developers <a href="https://www.software.com/reports/code-time-report">spendeert minder dan 1 uur per dag aan het effectief schrijven van code</a>. De rest van de tijd gaat naar analyseren, lezen, leren, onderhoudstaken, communicatie,&#8230; Dat denkwerk en het overleg met de collega&#8217;s wordt vooralsnog niet gecomprimeerd door LLMs in te zetten.</p>



<p>Het is moeilijk om harde cijfers te vinden over productiviteit omdat het <a href="https://queue.acm.org/detail.cfm?id=3454124">moeilijk te definiëren en dus te meten</a> is. Een nuttige eerste schatting komt van Google zelf, die de iteratietijd (van kennisname van het probleem tot oplossing) onder de loep nam. Met een eerste versie van hun eigen AI code completion assistent, <a href="https://ai.googleblog.com/2022/07/ml-enhanced-code-completion-improves.html">konden zij 6% tijdswinst noteren</a>. Github zelf beweert dat het <a href="https://github.blog/2022-09-07-research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/">pure codeerwerk zo&#8217;n 55% sneller kan</a> met hun CoPilot &#8211; al zeggen ze er in één adem bij dat het 95%-confidence interval van hun meting [21%-89%] is. De adoptie van een tool brengt bovendien geen meerwaarde als ze niet gepaard gaat met een traject om ze optimaal te leren benutten (net zoals vandaag nog vele kantoormedewerkers tijd verliezen met Office door <a href="https://support.microsoft.com/en-au/training">onvoldoende kennis of ervaring</a> met alle types van referenties, formules en snelkoppelingen). </p>



<p>Gegenereerde code biedt wel snel een eerste oplossing, maar die oplossing moet nog steeds begrepen worden door de programmeur. Een &#8220;pass@1&#8221; score van 50%, betekent dat de helft van de gegenereerde code snippets nog manuele aanpassingen behoeft voordat ze de unit tests passeert &#8211; en dan spreken we nog niet over optimaliteit of veiligheid. Gegenereerde code kan complex zijn en gebruikmaken van constructies die boven het kennisniveau van de programmeur liggen. Dat maakt gegenereerde code moeilijker om te onderhouden en te debuggen dan code die manueel geschreven is. Gegenereerde code die onvoldoende werd gereviseerd en getest, voegt aanzienlijke <a href="https://www.techtarget.com/whatis/definition/technical-debt">technical debt</a> toe aan een project.</p>



<p>Het gebruik van plug-ins die zo ver gaan dat ze hele blokken code en documentatie met een vingerknip (of iets trager) kunnen genereren, is slechts een goed idee wanneer verschillende andere aspecten van het software engineering proces op orde zijn: er moeten over de hele lijn hoge standaarden aangehouden worden wat betreft teststrategie, code reviews, documenteren van code en kenniscompetenties van de developers. </p>



<h2 class="wp-block-heading">Vertrouwelijkheid</h2>



<p>Bedrijven en overheden hebben zelden de luxe om eender welk taalmodel te benutten. Er zijn niet alleen contractuele drempels, maar ook vragen over confidentialiteit, zeker bij gebruik van de cloud. Een goede suggestie van een taalmodel krijg je immers alleen door eerst voldoende informatie te uploaden. Als je niet alles in-house opzet, impliceert dat onvermijdelijk dat je een derde partij inzage geeft in jouw gegevens. </p>



<p>De mate van openheid en licentiëring kan aanzienlijk verschillen &#8211; in het ene uiterste is alles &#8220;black box&#8221; en enkel via cloud/API toegankelijk (hier vind je OpenAI, Anthropic, Cohere en de meeste andere gevestigde startups). Deze beloven in <a href="https://openai.com/blog/introducing-chatgpt-enterprise">Enterprise versies</a> soms meer garanties &#8211; maar je hebt nog steeds geen andere optie dan ze daarin te geloven op hun woord. In het andere uiterste is alles &#8220;open access&#8221; en permissief gelicentieerd. Daartussenin kan een bedrijf ook een Open Access taalmodel bouwen op een gesloten dataset. Van minstens 1 zo&#8217;n dataset is <a href="https://www.theatlantic.com/technology/archive/2023/08/books3-ai-meta-llama-pirated-books/675063/">ondertussen uitgelekt</a> dat ze illegaal gekopieerde  <a href="https://github.com/psmedia/Books3Info">auteursrechtelijk beschermde ebooks</a> bevat, wat ongetwijfeld een sterk argument wordt in de <a href="https://storage.courtlistener.com/recap/gov.uscourts.cand.415175/gov.uscourts.cand.415175.1.0_1.pdf">class action lawsuit over het thema tegen Meta</a>. De datasets van de code-LLMs <a href="https://arxiv.org/abs/2203.13474">Salesforce CodeGen</a> en <a href="https://codegeex.cn/">Tsinghua CodeGeeX</a> zijn evenmin publiek.</p>



<p>Transparantie, licentiëring, deployment mogelijkheden, prijszetting, grootte en schaalbaarheid,&#8230; het relatief belang van al deze kenmerken zal dicteren welke tools je kan gebruiken. Wie maximale transparantie wil, zal sowieso vaak beperkt zijn tot <a href="https://github.com/eugeneyan/open-llms">Open Access LLMs</a>. Sommige open licenties beperken het gebruik daarnaast tot niet-commerciële doeleinden. Een noodzaak tot inzage in de trainingsdata of gemakkelijke voorzieningen om zelf on-premise een instantie te kunnen hosten, <a href="https://blog.pragmaticengineer.com/github-copilot-alternatives/">beperkt de keuzemogelijkheden nog verder</a>.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Dialoog-gebaseerde tools (chatGPT en aanverwanten) kan je als developer nuttig inzetten bij o.a.: </p>



<ul class="wp-block-list">
<li>Het initialiseren van een project/bestand/klasse/configuratie: maak een eerste versie van iets</li>



<li>Het debuggen en aanpassen op vraag-antwoord-wijze</li>



<li>Relatief onafhankelijke snippets van code</li>
</ul>



<p>Tools die code aanvullen of ontbrekende code invullen (type Github Co-Pilot) komen dan weer goed van pas bij o.a.:</p>



<ul class="wp-block-list">
<li>Het vervolledigen van code aan de hand van eerder voorkomende voorbeelden</li>



<li>Het documenteren van code</li>



<li>Het maken van veranderingen midden in een groter bestand</li>
</ul>



<p>De optimale ontwikkelomgeving is voor een developer iets vrij persoonlijks en iedereen zal een eigen voorkeur hebben. In onze ogen zijn deze twee manieren om codesuggesties te krijgen enigszins complementair, en het slim combineren van de twee kan voor de meeste productiviteitswinst zorgen. In één adem willen we daarbij wel zeggen dat een gezond projectmanagement, met aandacht voor codekwaliteit, testing, reviews, documentatie, &#8230; daar wel onontbeerlijk bij hoort.</p>



<p>De AI-wereld is in volle beweging. Er komen met de regelmaat van de klok nieuwe AI-modellen bij die kunnen dienen als back-end voor IDE-plugins. Voor industrieën waar vertrouwelijkheid van code belangrijk is, zijn de open-source varianten erg interessant. Zelfs al tonen benchmarks dat die vandaag nog minder performant zijn dan de laatste commerciële cloud-based initiatieven, kunnen we verwachten dat daar in de toekomst ook betere versies van zullen verschijnen. Er zijn alvast veel inspanningen om modellen te maken die op (weliswaar high-end) consumentenhardware kunnen draaien. </p>



<h2 class="wp-block-heading">P.S.</h2>



<p>Enkele uren na het publiceren van dit artikel, kondigt HuggingFace <a href="https://huggingface.co/blog/safecoder">SafeCoder</a> aan: een enterprise-level oplossing voor LLM-gebaseerde coding assistants die on-premise uitgerold kan worden. Huggingface voorziet alles in containers die in het eigen datacenter geïnstalleerd kunnen worden en private endpoints voorzien, én voorziet compatibele plugins voor de belangrijkste IDEs. Andere algemene deployment frameworks bestaan al langer &#8211; o.a. <a href="https://www.seldon.io/">Seldon</a>, <a href="https://www.bentoml.com/">BentoML</a> en <a href="https://github.com/kserve/kserve">KServe</a> kunnen LLMs hosten, ook <a href="https://bellard.org/ts_server/">TextSynth Server</a> en <a href="https://gpt4all.io/index.html">GPT4All</a> kunnen functioneren als API endpoint. Je hebt echter nog steeds plugins nodig om er gebruik van te kunnen maken in de IDE zelf, en om de nodige pre- en postprocessing te doen &#8211; en als ze niet voorzien worden, moet je er zelf eentje maken of een bestaande plugin aanpassen.</p>



<h2 class="wp-block-heading">P.P.S.</h2>



<p>Deze laatste woorden waren nog niet koud of Meta lanceerde <a href="https://about.fb.com/news/2023/08/code-llama-ai-for-coding/">Code LLama</a> , een <a href="https://ai.meta.com/llama/">LLaMa 2</a> variant specifiek getraind voor code. Op <a href="https://twitter.com/abacaj/status/1694889597723873562">sociale media wordt vermeld</a> dat het mogelijk is de originele versie met 34 miljard parameters te draaien op een computer uitgerust met 4 RTX3090 GPUs met elk 24GB VRAM, waarmee ongeveer 20 tokens/seconde gegenereerd kunnen worden. Gemakkelijker is misschien de <a href="https://huggingface.co/chat">online chat-versie</a> uit te proberen. <a href="https://github.com/ggerganov/llama.cpp">Quantized versies</a> zullen ongetwijfeld erg snel volgen, en we verwachten de eerste benchmarks eerstdaags op de verschillende leaderboards.</p>



<p>______________________</p>



<p><em>Dit is een ingezonden bijdrage van Joachim Ganseman, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 2</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-2/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 06 Nov 2018 12:16:29 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[MASA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11475</guid>

					<description><![CDATA[Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit. Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2018/05/architecture2.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11754 size-full" src="/wp-content/uploads/2018/05/architecture2.png" alt="" width="146" height="141" /></a>Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit.</p>
<p><span id="more-11475"></span></p>
<p style="text-align: justify;">Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale principes en technologieën, zullen toelichten. Een aantal van deze zaken werden ook reeds in vroegere blogs besproken, en de meeste worden ook nog eens samengevat in de blog &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;. De eerste blog van deze reeks beschouwde de gedeeltes van een applicatie-architectuur die de gebruikersinterface en externe clients ondersteunen: <a href="/architecturale-evoluties-deel-1/">Architecturale Evoluties, deel 1</a>.</p>
<p style="text-align: justify;">In dit deel duiken we dieper in de applicatie, en zullen we beschouwen hoe we de interacties met onze applicatie verder kunnen afhandelen. Interacties kunnen via allerlei wegen onze applicatie binnenkomen (b.v. aanvragen vanuit een GUI, requests via een extern-gerichte API, maar ook interne, geplande acties die op bepaalde momenten worden gestart). Voor de binnenste onderdelen van de architectuur is dit onderscheid echter van minder belang. Wel belangrijk is of het gaat om een vraag om output te genereren (dit zullen we een <strong>query</strong> noemen), of dat het eerder gaat om nieuwe input (vaak een <strong>command</strong> genoemd, maar dit komt eigenlijk overeen met een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/"><strong>Event</strong></a>). Soms zijn deze beide vormen gecombineerd (er is nieuwe input, die op zich al tot nieuwe output moet leiden), maar vaak is het mogelijk om deze aspecten in de verwerking van de interactie voldoende gescheiden te houden.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 2</h1>
<p style="text-align: justify;">In het eerste deel van deze blogreeks beschreven we reeds hoe alle externe interactie met onze applicatie kon worden herleid tot het oproepen van Restful APIs, die we konden aanbieden via één of meerdere <a href="/van-n-tier-naar-microservices/">microservices</a>. In dit tweede deel kunnen we ons daardoor volledig focussen op de interne werking van een collectie microservices, die samen een applicatie (of een groep van applicaties) ondersteunen. Dit is een radicale breuk met de meer traditionele 3-tier of n-tier architecturen van weleer. Gartner heeft deze nieuwe trend de naam &#8220;MASA&#8221; gegeven, wat staat voor <a href="https://www.gartner.com/doc/3645328/top--strategic-technology-trends">Mesh App and Service Architecture</a>: een zeer modulair and flexibel aanpasbaar netwerk van oplossingen die de dynamisch veranderde behoeften vanuit de business snel kunnen opvangen.</p>
<p style="text-align: justify;">Eén opmerking die we voor de volledigheid nog moeten maken, is dat het in deel 1 om interactie met écht externe zaken ging, zoals de clients en 3rd party applicaties. Dit leidt er doorgaans toe dat we sterk gestandaardiseerde interactievormen via het web zullen gebruiken (waardoor vrijwel enkel REST APIs kunnen worden beschouwd). Integratie binnen het eigen ecosysteem kan echter, naast APIs, ook nog via de <strong>Event Bus</strong> gebeuren, die op zich gebouwd is bovenop het principe van asynchrone uitwisseling van berichten tussen de services. Dit duale principe (synchroon REST kanaal en asynchroon event kanaal, ook reeds toegelicht in de <a href="/data-centric-it-met-rest/">blog over Data Centric IT</a>) moet volstaan om alle communicatie tussen de verschillende onderdelen van een applicatie (of ecosysteem) in goede banen te leiden. Op zijn beurt laat deze ogenschijnlijke beperking toe om de technische kant van het verhaal te standaardiseren.</p>
<ul>
<li>
<h2>Een woordje over de MASA</h2>
</li>
</ul>
<p><figure id="attachment_12263" aria-describedby="caption-attachment-12263" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/11/mesh.png"><img loading="lazy" decoding="async" class="wp-image-12263 size-medium" src="/wp-content/uploads/2018/11/mesh-300x294.png" alt="" width="300" height="294" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh-300x294.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh.png 693w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-12263" class="wp-caption-text">Fig. 1: Mesh App &amp; Service Architecture</figcaption></figure></p>
<p style="text-align: justify;">Zoals reeds gezegd, staat MASA voor &#8220;Mesh App &amp; Service Architecture&#8221;. Het woordje &#8220;mesh&#8221; (= een fijnmazig net) betekent dat de huidige architectuur uit vele aparte onderdelen zal bestaan, die via steeds veranderende configuraties met elkaar communiceren. Het model dat we in deze blogreeks uit de doeken doen, namelijk een ecosysteem van samenwerkende microservices, communicerend via <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Bus</a> en RESTful APIs, is daarbij eigenlijk nog een eenvoudige versie. In de praktijk zal men evolueren naar ingewikkelder patronen, waarbij in deze mesh ook legacy toepassingen zullen verweven zitten, alsook zaken die in de <a href="/disruptie-in-de-cloud-stack-caas/">Cloud</a> draaien i.p.v. op het lokale netwerk, afzonderlijke functies die volgens het zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Serverless_computing">Serverless</a>&#8221; principe werken, en zelfs <a href="/er-zit-een-hacker-in-mijn-diepvries/">IoT</a> devices. Dit soort gemengde architectuur ontstaat doordat vele organisaties nu eenmaal legacy toepassingen draaiende moeten houden, en doordat er een grote heterogeniteit aan projecten te volbrengen is, hetgeen er voor zorgt dat er vaak ook verschillende keuzes gemaakt worden wat betreft de onderliggende platformen. In zo&#8217;n geval is het echter ook belangrijk (of zelfs nog belangrijker) dat men tracht de communicatiepatronen tussen al deze verschillende zaken te standaardiseren, om aldus de compatibiliteit en integreerbaarheid te maximaliseren.</p>
<ul>
<li>
<h2>De Duale Service Interface: CQRS</h2>
</li>
</ul>
<p style="text-align: justify;">In de introductie vermeldden we reeds het onderscheid tussen commando&#8217;s en queries. <a href="https://martinfowler.com/bliki/CQRS.html">CQRS</a> staat voor <a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">Command Query Responsability Segregation</a>, wat zoveel betekent als &#8220;scheiding van de verantwoordelijkheid voor het afhandelen van commando&#8217;s en queries&#8221;. In de praktijk wil dat zeggen dat we zullen proberen om een logische scheiding te krijgen tussen de systemen die commando&#8217;s verwerken en tussen degene die vragen beatwoorden. Dit is schematisch weergegeven in onderstaande Fig. 2.</p>
<p><figure id="attachment_12196" aria-describedby="caption-attachment-12196" style="width: 688px" class="wp-caption alignnone"><a href="/wp-content/uploads/2018/09/highlevelbackend.png"><img loading="lazy" decoding="async" class="wp-image-12196 size-large" src="/wp-content/uploads/2018/09/highlevelbackend-1024x372.png" alt="" width="688" height="250" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-1024x372.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-300x109.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-768x279.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend.png 1081w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-12196" class="wp-caption-text">Fig. 2: Schematisch overzicht van de backend systemen: aanvragen worden opgesplitst in queries en commands, die elk hun eigen pad vervolgen richting een groep backend (micro-)services. Deze zullen informatie in de vorm van inkomende events verwerken tot hapklare zaken die later door queries kunnen worden opgevraagd.</figcaption></figure></p>
<p style="text-align: justify;">Queries kunnen doorgaans rechtstreeks door een API worden beantwoord, al dan niet door de vraag, mogelijks in stukjes gekapt, aan een verdere API door te geven. Uiteindelijk zullen het de onderliggende (micro-)services zijn die het echte werk doen van opzoeken in databases en eventueel nog een paar bewerkingen uitvoeren om het antwoord in de gevraagde vorm te krijgen. Wat betreft de interactie tussen verschillende services, hoeft hier dus niet te worden afgeweken van RESTful synchrone communicatie.</p>
<p style="text-align: justify;">Het ligt iets anders voor commando&#8217;s. Wanneer we volledig het paradigma van <a href="/geavanceerd-event-driven-engineering/">Event Sourcing</a> toepassen, zullen we een commando steeds omzetten in een gebeurtenis (b.v. het commando &#8220;<em>bestel één <a href="/blockchain-vs-event-driven-architecture/">blockchain</a> boek</em>&#8221; wordt dan het <span style="text-decoration: underline;">event</span> &#8220;<em>bestelling van één <a href="https://www.larciergroup.com/nl/blockchain-en-smart-contracts-2018-9782807909380.html">blockchain boek</a> geplaatst</em>&#8220;). Deze omzetting zal door een eerste laag van services worden gedaan, speciaal gebouwd voor het opvangen van dergelijke commando&#8217;s vanuit de client side.</p>
<p style="text-align: justify;">Het commando kan dan verder worden afgehandeld als een typisch event: het komt op de Event Bus terecht en alle geïnteresseerde diensten zullen het asynchroon ontvangen en kunnen behandelen (één backend service zal b.v. de inventory aanpassen; een andere zet het verpakken op gang en nog een andere verwittigt de koerierdienst). In elk geval is het creëren van afgeleide informatie (b.v. de hoeveelheid in stock) een verantwoordelijkheid van een microservice die daarvoor zijn eigen database zal hebben.</p>
<p style="text-align: justify;">Wanneer nu later een vraag toekomt die betrekking heeft op informatie beïnvloed door een eerder commando, dan zal deze geforward worden naar de microservices die deze up-to-date informatie controleren (b.v. de vraag &#8220;<em>hoeveel van die blockchain boeken zijn er nog in voorraad</em>&#8221; komt uiteindeljik terecht bij de service voor de inventory). Vermits events asynchroon werken kan het soms zijn dat een vraag nét te snel komt en de informatie dus niet volledig up-to-date is (meestal is het echter een kwestie van enkele seconden). Vandaar dat het bij dit soort architecturen aangewezen is de principes van &#8220;<a href="https://en.wikipedia.org/wiki/Eventual_consistency">eventual consistency</a>&#8221; goed toe te passen, en zelfs door te trekken tot op business niveau.</p>
<p><figure id="attachment_12198" aria-describedby="caption-attachment-12198" style="width: 1050px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/09/complexexample.png"><img loading="lazy" decoding="async" class="size-full wp-image-12198" src="/wp-content/uploads/2018/09/complexexample.png" alt="" width="1050" height="543" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample.png 1050w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-300x155.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-768x397.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-1024x530.png 1024w" sizes="auto, (max-width: 1050px) 100vw, 1050px" /></a><figcaption id="caption-attachment-12198" class="wp-caption-text">Fig. 3: Een iets gedetailleerder voorbeeld. Voor de uitleg verwijzen we naar de tekst.</figcaption></figure></p>
<p style="text-align: justify;">Bovenstaande Figuur 3 toont een iets gedetailleerder voorbeeld. In de figuur zien we dat er achter de App API, 2 Command APIs en 1 Query API schuilgaan. Daarnaast zien we een door meerdere zaken gebruikte Event Bus, waarvan alle events ook in een centrale event store terecht komen. Sommige backend microservices communiceren rechtsreeks met de bus en spelen dus kort op de bal; daarnaast is er een service die vooral gebruik maakt van de event store en die dus meer zaken kan doen met historische events (b.v. <a href="/big-data-analytics-whats-in-a-name/">analytics</a>). Verder zien we dat er een legacy systeem communiceert via het event kanaal en dat een aantal services APIs aanbieden, sommige zelfs rechstreeks aan externe systemen. Er is een kort scenario uitgewerkt in de tekening:</p>
<ol>
<li style="text-align: justify;">Een update wordt gevraagd, wat zich vertaalt in een reeks van events die door een aantal services verwerkt worden. Het event komt uiteraard in de event store terecht.</li>
<li style="text-align: justify;">Een andere update zorgt er uiteindelijk voor dat er events ontstaan die aanpassingen doen gebeuren aan een database van afgeleide informatie, behorende tot een bepaalde microservice.</li>
<li style="text-align: justify;">Een query vraagt informatie op via API, en uiteindelijk wordt een API van de microservice van stap 2 aangeroepen; deze zal dus van de geüpdate informatie uit de database van stap 2 gebruik maken.</li>
<li style="text-align: justify;">Een andere query doet een iets diepgaandere vraag. Via verschillende calls tussen deelnemende services, wordt er uiteindelijk informatie opgevraagd uit de event store.</li>
</ol>
<p><figure id="attachment_12194" aria-describedby="caption-attachment-12194" style="width: 206px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/09/GoodClientUpdate.png"><img loading="lazy" decoding="async" class="wp-image-12194" src="/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png" alt="" width="206" height="362" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png 171w, https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate.png 486w" sizes="auto, (max-width: 206px) 100vw, 206px" /></a><figcaption id="caption-attachment-12194" class="wp-caption-text">Fig. 4: Een goed gebouwde client van het systeem kan worden geüpdated bij binnenkomende events aan de serverkant.</figcaption></figure></p>
<p style="text-align: justify;">Dit verhaal is, vanwege het gebruik van Events, voor een deel asynchroon. Sommige cliënts zullen echter zo synchroon mogelijk moeten worden geüpdated. Hoe kunnen zij vlot op de hoogte worden gebracht van de meest recente informatie? Ter herinnering: in een volledig synchrone wereld zal een cliënt als antwoord op een commando ook onmiddellijk de nieuwe toestand meekrijgen. Met de nieuwe architectuur moet de cliënt echter &#8220;gissen&#8221; na hoeveel tijd hij een query naar de server moet sturen, om er zeker van te zijn dat het effect van zijn laatste commando in rekening is gebracht. Dit giswerk kan men echter vermijden. Sowieso is het niet zo efficiënt om ervan uit te gaan dat het altijd de cliënt is die alle communicatie moet initiëren. We zullen er dus voor zorgen dat ook de server dit initiatief kan nemen. Als gevolg van een binnenkomend Event moet ook de server in staat zijn om op dat moment een bericht te sturen naar de client. Er zijn ondertussen verschillende manieren waarop een cliënt aan een server zijn interesse kan laten blijken in het krijgen van callbacks wanneer up-to-date informatie beschikbaar is, en er zijn zelfs al full-duplex communicatiemogelijkheden voor applicaties op het web. (<a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a> is een vrij modern voorbeeld).</p>
<p style="text-align: justify;">Indien het niet mogelijk is de client op een manier te bouwen dat deze door de server kan worden gecontacteerd, en het is evenwel belangrijk dat de client zo snel mogelijk up-to-date informatie krijgt, dan is er nog een noodoplossing mogelijk. We kunnen alsnog een API voorzien die toelaat dat men via één enkele request zowel een update doet als de nieuwe informatie meekrijgt in het antwoord. Desalniettemin zullen we het CQRS patroon voor het grootste gedeelte respecteren in de backend. Het volstaat om de API zo te bouwen, dat hij de request zelf opdeelt in een commando en één of meerdere queries. De microservice die achter deze API schuilgaat, zal dan eerst het event lanceren om het commando uit te laten voeren, en zal vervolgens wachten tot er genotificeerd komt via de juiste events, die de afhandeling van dit commando aangeven. Daarna kan de service overgaan tot het lanceren van de queries en dan vervolgens zelf antwoorden op de vraag van de client. Dit patroon zorgt er wel voor dat soms de client wat langer (synchroon) zal moeten wachten op zijn antwoord, omdat het asynchrone gedeelte volledig aan de serverkant moet worden afgehandeld.</p>
<h2>Conclusie</h2>
<p style="text-align: justify;">We zien hoe een moderne architectuur ervoor zorgt dat men een applicatie (of groep applicaties) kan opdelen in zo klein mogelijke microservices, elk met hun eigen verantwoordelijkheid. Deze zijn efficient te onderhouden en ook vervangbaar, wat het gehele systeem een ongeziene flexibiliteit geeft om zich aan te kunnen passen aan zowel veranderende functionaliteit als aan veranderingen aan de infrastructuur of de benodigde capaciteit. Daarnaast hebben we een gestandaardiseerde manier van communiceren toegelicht, die ervoor zorgt dat de mesh van apps, de &#8220;MASA&#8221;, continu kan veranderen en groeien, doordat men alle onderdelen gemakkelijk via het netwerk met elkaar kan laten communiceren. Ten slotte konden we ook zien hoe CQRS hiervan gebruik maakt om een nette afhandeling van alle mogelijke vragen te voorzien, gebruik makende van Events, die ook de historiek en traceerbaarheid van het systeem garanderen, van client tot backend.</p>
<p style="text-align: justify;">
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 1</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-1/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 21 Mar 2018 13:35:54 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11434</guid>

					<description><![CDATA[Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën? Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2018/03/architecture.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11480" src="/wp-content/uploads/2018/03/architecture.png" alt="" width="146" height="141" /></a>Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën?</p>
<p><span id="more-11434"></span></p>
<p style="text-align: justify;">Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer het een applicatie betreft die niet alleen staat, maar op allerlei manieren zal moeten integreren met andere applicaties en diensten, zowel binnen als buiten de eigen organisatie. In een tweedelige blogreeks bespreken we een aantal mogelijkheden die ons worden geboden door een aantal architecturale principes en technologieën, die ik reeds eerder samenvatte als de &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;.</p>
<p style="text-align: justify;">In dit eerste deel bespreken we de bovenste regionen van de moderne applicatie architectuur. Alles wat met de interactie met de buitenwereld te maken heeft, zoals clients en 3rd party systemen (die vaak gewoon ook als clients kunnen worden beschouwd). In de volgende blog zal het dan gaan over de meer interne systemen. We beginnen hier met een terugblik op de traditionele 3-tier architectuur.</p>
<h1>De 3-tier Architectuur</h1>
<p><figure id="attachment_11442" aria-describedby="caption-attachment-11442" style="width: 129px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/03/3-tier-arch-highlevel.png"><img loading="lazy" decoding="async" class="wp-image-11442 size-medium" src="/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png" alt="" width="129" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png 129w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel.png 285w" sizes="auto, (max-width: 129px) 100vw, 129px" /></a><figcaption id="caption-attachment-11442" class="wp-caption-text">Fig. 1: De 3-tier Architectuur</figcaption></figure></p>
<p style="text-align: justify;">De 3-tier architectuur kennen we ondertussen stilaan. De verschillende &#8220;tiers&#8221; die er kunnen bestaan, en de geschiedenis ervan, werden reeds uitvoerig beschreven in de blog <a href="/van-n-tier-naar-microservices/">Van N-tier naar Microservices</a>.</p>
<p style="text-align: justify;">Deze stilaan verouderde architectuur kent een aantal problemen, niet in het minst qua herbruikbaarheid en integratiemogelijkheden. Zo komt men vaak in de problemen wanneer men nieuwe manieren van interactie wil toevoegen, zoals een <a href="/de-mobiele-burger-zowel-consument-als-leverancier-van-data-apps/">mobiele app</a>, of, waarom niet, een <a href="/conversationele-interfaces/">conversational interface</a>. Een ander euvel is integratie: wanneer de <a href="/data-centric-it-met-rest/">data</a> nodig is voor andere toepassingen, blijkt de op zichzelf ontworpen 3-tier applicatie vaak te incompatibel, en is men gedwongen de integratie via de data te doen. Dit door ofwel de database te koppelen aan meerdere applicaties via opengestelde fluxen, of d.m.v. het creëren van een duplicaat van de data, dat men dan om de zoveel tijd zal moeten updaten via één of ander <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load">ETL </a>mechanisme. Een groot probleem is daarbij ook vaak dat de data semantisch sterk is gekoppeld aan de specifieke applicatiecontext.</p>
<p><figure id="attachment_11446" aria-describedby="caption-attachment-11446" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/3-tier-api.png"><img loading="lazy" decoding="async" class="wp-image-11446" src="/wp-content/uploads/2018/03/3-tier-api-230x300.png" alt="" width="150" height="195" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api-230x300.png 230w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api.png 271w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11446" class="wp-caption-text">Fig. 2: 3-tier Front End, ontsloten door API.</figcaption></figure></p>
<p style="text-align: justify;">Verderop in deze blogreeks gaan we bekijken hoe het beter kan, met een modernere architectuur. Uiteraard is dit echter geen zwart-wit verhaal. De beschreven voorbeeldoplossing zal op een behoorlijk verregaande manier verschillen van de traditionele oplossing, maar er zijn uiteraard ook allerlei tussenoplossingen en middenweg-scenario&#8217;s te bedenken. Een zeer eenvoudig voorbeeld is bijvoorbeeld het koppelen van de verschillende tiers binnen zo&#8217;n verouderde architectuur via RESTful APIs (zie Fig. 2). Dit is een vaak broodnodige upgrade, die nu reeds op veel plaatsen wordt toegepast. Het is een goed begin, maar meestal nog onvoldoende om de flexibiliteit en herbruikbaarheid te bereiken die we beogen met een echte modernisering.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 1</h1>
<p style="text-align: justify;">De moderne architectuur bestaat uit de culminatie van een aantal belangrijke architecturale principes, zoals <a href="/data-centric-it-met-rest/">Restful API</a>&#8216;s, <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a> (<a href="/geavanceerd-event-driven-engineering/">EDA</a>) en MicroServices, waarover ik reeds meerdere blogs heb geproduceerd (Al deze technologieën maken ook deel uit van de <a href="/de-vortex-van-enablers/">Vortex van Enablers</a>). In de laatste, over <a href="/services-in-alle-maten-van-macro-naar-nano/">Services in alle Maten</a>, gaf ik reeds een uitgebreid, zei het vaag blijvend, voorbeeld over hoe een API (een op clients gericht product&nbsp;!) kan worden geïmplementeerd door een combinatie van (interne) microservices, die met elkaar kunnen communiceren via REST en EDA.</p>
<p style="text-align: justify;">Laten we nu iets concreter ingaan op hoe een modern gebouwde applicatie kan worden gebouwd gebruik makende van deze technologieën. Een dergelijke applicatie staat echter nooit alleen, dus we beschouwen deze samen met zijn onmiddellijke omgeving, bestaande uit clients, maar ook andere applicaties en diensten.</p>
<ul>
<li style="padding-left: 30px;">
<h2>Front-Facing API Ecosystem</h2>
<div style="margin: -60px 0px 0px 0px;">
<p><figure id="attachment_11449" aria-describedby="caption-attachment-11449" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/ui-api.png"><img loading="lazy" decoding="async" class="wp-image-11449" src="/wp-content/uploads/2018/03/ui-api-300x134.png" alt="" width="150" height="67" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api-300x134.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api.png 386w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11449" class="wp-caption-text">Fig. 3: Symbolisch: De Front End APIs</figcaption></figure></p>
</div>
<p>&nbsp;</p>
<p style="text-align: justify;">We beginnen ons verhaal bij de Front End. Dit betekent dat we de modernisering van de eigenlijke client en gebruikers-interface (UI) in deze blog buiten beschouwing laten. Dit betekent echter niet dat daar geen evoluties zouden zijn, of dat de architectuur van een &#8220;app&#8221; zelf geen modernisering zou behoeven.</p>
<p style="text-align: justify;">Naar de clients en de buitenwereld toe, zijn APIs de belangrijkste evolutie van de voorbije jaren. Meer en meer zal men APIs zélf gaan aanbieden als product naar derde partijen toe, en eveneens naar andere applicaties en diensten binnen de eigen onderneming. Daarbovenop komt nog dat er een proliferatie is geweest aan verschillende kanalen via dewelke een applicatie kan worden gebruikt. Dit zorgt ervoor dat de front end meer en meer een product op zich wordt, dat zich vooral moet bezighouden met het aanbieden van de nodige faciliteiten voor alle mogelijke vormen van interactie met de buitenwereld, en vooral niet met enige andere zaken, zoals de business logica zelf.</p>
<p style="text-align: justify;">Omdat het een goed principe is om alles zo modulair mogelijk te maken (hoe kleiner de aparte componenten, hoe makkelijker men ze afzonderlijk kan aanpassen, of zelfs vervangen via het <a href="https://www.cio.com/article/3006635/leadership-management/why-rip-and-replace-it-projects-are-worth-the-effort.html">rip-and-replace</a> principe), bekomt men zo uiteindelijk een volledig ecosysteem van gerelateerde APIs, elk bevoegd voor het afhandelen van een bepaald type interactie met de buitenwereld. De API die achter de traditionele web app staat, zal aldus verschillen van de API die gebruikt wordt voor 3rd party clients. Afhankelijk van hoe sterk de verschillen zijn, kan men er al dan niet voor opteren om achter al deze APIs nog een verenigende API te plaatsen, die zaken zal bevatten die door alle extern gerichte APIs kunnen worden (her-)gebruikt. Een uitgebreid voorbeeld zien we in Figuur 4 (vele andere voorbeelden zijn mogelijk; zo zou de mobiele app ook met de webserver kunnen communiceren).</p>
<p><figure id="attachment_11460" aria-describedby="caption-attachment-11460" style="width: 850px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/03/ui-api-complex.png"><img loading="lazy" decoding="async" class="size-full wp-image-11460" src="/wp-content/uploads/2018/03/ui-api-complex.png" alt="" width="850" height="578" /></a><figcaption id="caption-attachment-11460" class="wp-caption-text">Fig. 4: Een uitgebreid voorbeeld van de &#8220;voorkant&#8221; van een applicatie. Hier is gekozen om één algemene API te voorzien voor alle aanvragen die vanaf de buitenwereld op de applicatie afkomen, ondersteund door een aantal andere componenten, die zich specialiseren in het afhandelen van verkeer, specifiek afkomstig van: externe partijen die via RESTful API contact willen leggen; een desktop applicatie, die rechtstreeks met de algemene API communiceert; een mobiele app, die via een mobile backend API werkt; en een web-applicatie, waarvan de webserver met de algemene API communiceert. Al deze API&#8217;s of applicaties worden geïmplementeerd door één of meerdere microservices. Gele pijlen stellen RESTful communicatie voor, de oranje pijlen zijn specifieke communicatie tussen webserver en -client.</figcaption></figure></li>
</ul>
<h2>Beschouwingen</h2>
<p style="text-align: justify;">Wanneer men het voorbeeld bekijkt, zou men kunnen zeggen dat het er ingewikkelder uitziet dan vroeger, toen dit nog gewoon &#8220;de bovenste tier&#8221; was. Schijn bedriegt echter: de APIs worden nu gedragen door gespecialiseerde microservices die met elkaar samenwerken. Dit gedistribueerd systeem heeft uiteraard zijn eigen complexiteit, maar de oorspronkelijke tier had die ook in zekere mate: alleen was ze daar geïnternaliseerd binnen één monolithische component.</p>
<p style="text-align: justify;">Verder zijn er heel wat voordelen verbonden aan de nieuwe architectuur: microservices, die via APIs communiceren, kan men veel sneller aanpassen of zelfs herontwikkelen. Hierdoor kan men sneller reageren op veranderende noden van de business. Daarenboven heeft het ook technische voordelen: de communicatie is nu gestandaardiseerd over http, waardoor (soms onverwachte) integraties een stuk soepeler kunnen worden geïmplementeerd. Bovendien kan men microservices apart schalen, en kan het systeem als geheel zich dus veel elastischer gedragen, afhankelijk van de belasting die het ondervindt. Ten slotte zijn microservices het ideale complement van containers: de basis bouwsteen van een moderne Cloud infrastructuur. Typisch zal men één microservice op één container uitrollen.</p>
<p style="text-align: justify;"><a href="/architecturale-evoluties-deel-2/">In het vervolg</a> zullen we zien hoe commando&#8217;s (zaken die de toestand van de applicatie kunnen veranderen) en query&#8217;s (zaken die informatie opvragen uit applicaties) uit deze bovenste regionen naar de verder liggende backends worden gestuurd en daar worden behandeld. Daar zal ook de kracht van <a href="/blockchain-vs-event-driven-architecture/">Event Driven Architecture</a> tot zijn recht komen.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Services in alle Maten: van Macro naar Nano</title>
		<link>https://www.smalsresearch.be/services-in-alle-maten-van-macro-naar-nano/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 27 Nov 2017 10:33:40 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11111</guid>

					<description><![CDATA[Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan. We zullen het daarbij hebben over een aantal categorieën [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2016/06/logomicro.png"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="" width="150" height="150" /></a>Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan.</p>
<p style="text-align: justify;"><span id="more-11111"></span></p>
<p style="text-align: justify;">We zullen het daarbij hebben over een aantal categorieën of grootteordes van services: <a href="/van-n-tier-naar-microservices/">microservices</a>, miniservices en macroservices. En dan zetten we er ook nog zogenaamde nanoservices langs, die eigenlijk (nog?) geen officiële definitie hebben&#8230; Al deze architecturele paradigma&#8217;s zijn in zekere mate geïnspireerd door de reeds langs gekende <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service-Oriented Architecture</a> (SOA).</p>
<p style="text-align: justify;">We kunnen nu wel al iedereen gerust stellen: er bestaat geen &#8220;one size fits all&#8221;; alle groottes van services zullen nuttig zijn in de portfolio van applicaties, diensten en componenten die een IT-bedrijf zal ondersteunen. Deze heterogeniteit wordt ook vooropgesteld door Gartner en ze noemen dit de MultiGrained <a href="https://apifriends.com/2017/06/05/what-is-masa/">Mesh App and Service Architecture</a> (MG-MASA). Het belangrijkste daarbij is dat alle componenten hierin zo onafhankelijk mogelijk ontwikkelbaar zijn, terwijl ze toch vlot met elkaar kunnen communiceren en integreren.</p>
<p style="text-align: justify;">Met uitzondering van de dubieuze term &#8220;nanoservices&#8221;, zullen we van klein naar groot gaan: we zullen eerst grondig definiëren wat microservices nu eigenlijk zijn, alvorens de &#8220;grotere&#8221; services te bespreken.</p>
<h1 style="text-align: justify;">MicroServices: van Startup tot Web Scale speler</h1>
<p style="text-align: justify;">Microservices zijn onafhankelijke diensten met een sterk beperkte scope. Ze volgen rigoureus een aantal architecturale principes waardoor ze extreem wendbaar ( <strong><em>agile </em></strong>) zijn en ook heel flexibel schaalbaar. Ze zijn zo ontkoppeld mogelijk van andere applicaties en diensten, doch communiceren er ook mee. Deze schijnbare tegenstrijdigheid wordt doorgaans opgevangen door een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a>, dewelke losgekoppelde communicatie in gedistribueerde systemen ondersteunt.</p>
<div style="width: 300px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 4px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>Definitie: MicroService</em></strong></p>
<p style="text-align: justify;">Microservices zijn sterk ingekapselde, losgekoppelde, onafhankelijk ontplooibare en schaalbare applicatiecomponenten met een sterk beperkte scope. De microservices architectuur is gebaseerd op een combinatie van SOA en DDD en heeft drie belangrijke objectieven: wendbaarheid bij de ontwik-keling, flexibiliteit bij de uitrol en precieze schaalbaarheid.</p>
</div>
<p style="text-align: justify;">De beperkte scope en bijgevolg doorgaans kleinere codebase is ook voor een stuk wat een microservice zo wendbaar maakt: ze kunnen door een klein devops team worden ontwikkeld en onderhouden en meermaals daags opnieuw uitgerold worden met veranderende features. Een grote applicatie die aldus ondersteund wordt door een groep van microservices, zal constant online blijven maar continu kleine veranderingen ondergaan en dus voortdurend evolueren. Op deze manier zorgt de microservices architectuur dus voor extreem door-gedreven <a href="https://en.wikipedia.org/wiki/Continuous_delivery">Continuous Delivery</a>. Andere aspecten van deze architectuur zijn het principe van &#8220;single responsability&#8221; (wat op hetzelfde neerkomt als de beperkte scope), extreme schaalbaarheid en &#8211; indien de microservice gepersisteerde data beheert, exclusieve toegang (= &#8220;eigenaarschap&#8221; of <em>ownership</em>) tot zijn database (of andere persistentie-oplossing), in het kader van de loskoppeling.</p>
<p style="text-align: justify;">Microservices zijn op de kaart gezet door toepassing bij een aantal grote en bekende bedrijven als <span class="fontstyle0">Twitter, </span><span class="fontstyle0">Airbnb, Disney, Dropbox, GE, Goldman Sachs, en uiteraard ook grote Cloud spelers  zoals Amazon en Google. M</span><span style="font-weight: 300; text-align: justify;">icroservices, volgens de strikte definitie, zijn echter bij veel middelgrote bedrijven nog zeldzaam, al evolueren sommige miniservices (zie verder) na een tijdje wel tot een groepje microservices, doordat aparte functionaliteiten worden afgesplitst.</span></p>
<div style="width: 375px; display: block; align: right; vertical-align: top; float: left; border: 1px solid #ddd; margin: 4px 10px 5px 0; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>&#8220;Reuse&#8221;: Een anti-patroon&nbsp;?</em></strong></p>
<p style="text-align: justify;">Hergebruik wordt vaak gezien als de heilige graal van ontwikkeling: alles wat we reeds bouwden, zouden we moeten kunnen hergebruiken indien de functionaliteit voorkomt in iets anders dat we gaan bouwen.</p>
<p style="text-align: justify;">We moeten echter goed gaan opletten op welk niveau we gaan hergebruiken, zeker als we met de architectuur richting microservices evolueren. Vermits deze zo onafhankelijk mogelijk van elkaar moeten zijn, kan het <strong>soms contraproductief</strong> zijn <strong>om code te gaan hergebruiken tussen meerdere microservices</strong>. Dergelijk hergebruik creëert afhankelijkheden en verplichtingen die de wendbaarheid van een microservice doen afnemen.</p>
<p style="text-align: justify;">Waar vinden we dan wel nog <strong>herbruikbaarheid</strong>? <strong>Op het niveau van de APIs</strong>. Deze dienen te worden behandeld als een volwaardig eindproduct, dat kan worden gebruikt in tal van andere toepassingen en eventueel zelfs extra-muros.</p>
</div>
<p style="text-align: justify;"><span style="font-weight: 300; text-align: justify;">Ze worden qua aangeboden functionaliteit opzettelijk en strikt beperkt gehouden: normaal gezien wordt er slechts één specifieke feature ondersteund, of één bounded context binnen een domein (voor meer info over deze term, kijk naar </span><a style="font-weight: 300; text-align: justify;" href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a><span style="font-weight: 300; text-align: justify;"> (DDD)). </span>Doordat ze zo klein zijn en slechts één functionaliteit hebben, en apart uitrolbaar zijn, vormen microservices dus de ultieme vorm van flexibele schaalbaarheid. Een applicatie bestaande uit vele microservices kan optimaal gebruik maken van beschikbare resources: elke component die iets meer gebruikt wordt dan een andere, kan apart opgeschaald worden. Componenten die minder vaak nodig zijn, worden omlaag geschaald.</p>
<p style="text-align: justify;">De onafhankelijkheid van een microservice beperkt zich best niet tot fysiek afzonderlijke deployments. Ook gedeelde libraries kunnen namelijk worden beschouwd als een te grote afhankelijkheid tussen verschillende microservices. Op deze manier wordt hergebruik soms een anti-patroon (&#8220;anti-pattern&#8221;). Het gaat dan natuurlijk wel om de code die het domein implementeert, er is weinig op tegen om utilitaire bibliotheken, zoals een logging raamwerk, te hergebruiken in meerdere microservices.</p>
<p style="text-align: justify;">Microservices vinden we dan ook vooral terug bij bedrijven die op grote schaal (&#8220;web scale&#8221;) actief zijn, en dusdanig grote volumes moeten ondersteunen dat elke uitgespaarde percent benodigde resources een enorme kostenreductie tot gevolg heeft. We denken dan aan grote mediaspelers als Netflix, winkels als Amazon en Zalando, en uiteraard ook de Twitters, Facebooks en Googles van deze tijd.</p>
<div style="width: 475px; display: block; align: right; vertical-align: top; float: center; border: 1px solid #ddd; margin: 0 auto; padding: 5px; background-color: #eee;">
<p><strong><em>MicroServices: een andere &#8220;ph-waarde&#8221;: van ACID naar BASE</em></strong></p>
<p style="text-align: justify;">In de wereld van transacties is het ACID-model reeds lang ingeburgerd. Het stelt voorwaarden waaraan transacties moeten voldoen: A<span class="fontstyle0">tomicity, Consistency, Isolation and Durability. Dit komt erop neer dat de gegevens ten allen tijde overal overeenkomen, correct zijn, goed bewaard worden, nooit verloren kunnen gaan, etc.</span></p>
<p style="text-align: justify;">Voor gedistribueerde systemen is dit echter moeilijk, omdat deze sterke consistentie inhoudt dat men (voor de zelfde prijs) op minstens één van twee andere vlakken zal moeten inbinden: beschikbaarheid of partition tolerance (tolerantie voor netwerkfalen tussen de componenten). Microservices hebben hier per definitie last van, vanwege hun gedistribueerde natuur. Dit principe noemt men het <a href="/99-9-availability-fundamenteel-anders/">CAP-theorema</a>.</p>
<p style="text-align: justify;"><span class="fontstyle0">Bij gebruik van deze architectuur raadt men dan ook een alternatief aan: BASE. Dit wil zeggen: B</span><span class="fontstyle0">asically Available, Soft state, Eventually consistent. In dit model geeft men een stuk consistentie op om het geheel beschikbaarder en schaalbaarder te kunnen maken.</span></p>
<p style="text-align: justify;"><span class="fontstyle0">Puur technisch is het echt niet altijd gemakkelijk om met eventual consistency om te gaan; men zal dit model eerder moeten doortrekken op business niveau. Een aanpak gebaseerd op (business) Events zal doorgaans nauwer aansluiten bij dit model.</span></p>
</div>
<p style="text-align: justify;">Maar doordat het een nieuwe, moderne manier van ontwikkelen is, zijn microservices ook enorm populair bij startups. Deze hebben vaak het voordeel dat ze van nul kunnen beginnen met hun technologie, zonder enige legacy, en dat ze met kleine teams en een frisse bedrijfscultuur werken. <strong>Een Devops en Agile cultuur zijn namelijk sterke vereisten om microservices te kunnen ontwikkelen</strong>; hun architectuur verschuift namelijk de complexiteit weg van de binnenkant van een monoliet, maar recht naar de onderlinge interacties tussen vele (gedistribueerde) applicatiecomponten. Het voordeel  van microservices voor de startups is weliswaar dat ze op technologisch vlak een stuk robuuster zijn bij eventuele plotse groei, en ze de wendbaarheid ook goed kunnen gebruiken om snel in te spelen op marktopportuniteiten (er zijn reducties in ontwikkelingstijd tot 75% geschat).</p>
<h2 style="padding-left: 30px;"><em>APIs en Microservices</em></h2>
<p style="text-align: justify;">Microservices worden vaak beschouwd als de ideale manier om een <a href="/data-centric-it-met-rest/">API</a> te implementeren. Dit is inderdaad een goede werkwijze, maar dan met één hele belangrijke caveat: de onafhankelijkheid van de microservice moet gewaarborgd blijven. Het scheiden van een<span class="fontstyle0"> API en zijn implementatie is een fundamenteel principe bij SOA, dat nog belangrijker wordt in de context van de extreme vereisten die aan een microservices architectuur worden gesteld.</span></p>
<p style="text-align: justify;">Een API moet behandeld worden als een product. Geregeld worden APIs namelijk naar buiten toe opengesteld (en soms zelfs effectief gemonetariseerd), en op zijn minst dienen ze als interface naar andere software componenten (en dus andere ontwikkelteams) toe. Ze hebben dus nood aan een rigoureus change management.</p>
<p><figure id="attachment_11196" aria-describedby="caption-attachment-11196" style="width: 938px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2017/11/MSA-example.png"><img loading="lazy" decoding="async" class="size-full wp-image-11196" src="/wp-content/uploads/2017/11/MSA-example.png" alt="" width="938" height="558" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example.png 938w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-300x178.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-768x457.png 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></a><figcaption id="caption-attachment-11196" class="wp-caption-text">Een voorbeeld van een Microservices architectuur, waarbij een API wordt aangeboden aan de buitenwereld.</figcaption></figure></p>
<p style="text-align: justify;">De microservices daarentegen moeten snel kunnen evolueren en aangepast kunnen worden. Soms worden ze zelfs volledig vervangen (ze zijn <em>disposable</em>: het verlies blijft beperkt doordat ze kleiner zijn). Sowieso zal één microservice ook nooit een volledige API implementeren (tenzij als het echt om een miniscuul klein product zou gaan): achter de API bevindt zich doorgaans een hele batterij van componenten, waarbij verschillende microservices de effectieve business logica zullen uitvoeren. Andere componenten zijn bijvoorbeeld een Event bus, maar ook en vooral een API bemiddelingstool (&#8220;mediation&#8221;), die ervoor zal zorgen dat de calls naar de API bij de correcte afhandeling terecht komen, en op die manier de microservice loskoppelen van de ondersteunde API. Deze tools zijn doorgaans vervat binnen de context van een API Gateway of API Management suite.</p>
<h1 style="text-align: justify;">De Pragmatische Aanpak: MiniServices</h1>
<p style="text-align: justify;">De term &#8220;microservice&#8221; wordt vaak misbruikt om eender welke kleine en herbruikbare dienst te benoemen. Maar zoals we hierboven zagen, voldoet dit nog lang niet aan de eigenlijke definitie, en is het ook zo dat een microservice zijn eigen API best niet zelf publiceert.</p>
<p style="text-align: justify;">De categorie die dan ook door vele &#8220;enterprise niveau&#8221; bedrijven het vaakst wordt toegepast, is eigenlijk de <em>miniservice</em>, ook al zijn deze bedrijven snel om te zeggen dat ze een &#8220;microservices architectuur&#8221; gebruiken. De architecturen lijken dan ook wel enigszins op elkaar en enkel de grootte en scope (en het uiteindelijke doel) verschillen hier nog.</p>
<p style="text-align: justify;">Miniservices implementeren geen volledige applicatie, en zullen normaal gezien ook slechts een stukje van een extern gerichte API invullen. Ze focussen zich op de functionaliteiten verband houdende met een bepaald subdomein in de applicatie. Wanneer we de principes van Domain Driven Design (DDD) volgen: een miniservice kan een volledig domein implementeren, maar eventueel ook een niet al te kleine &#8220;bounded context&#8221;, of alles wat ertussen ligt.</p>
<p style="text-align: justify;">Miniservices zijn onafhankelijk van elkaar te ontwikkelen en uit te rollen, waardoor er een flexibiliteit ontstaat: doordat men werkt met kleinere componenten die losjes gekoppeld zijn en die men daardoor apart kan ontwikkelen en laten evolueren, kan men iets sneller de functionaliteiten veranderen via een meer agile ontwikkelingsmethode, en men kan dus sneller op de bal spelen. Hierdoor kan men beter ten dienste staan van de business, die sneller zijn product kan laten aanpassen aan veranderende marktomstandigheden. Dit komt dus neer op een afgezwakte versie van de vereisten voor microservices.</p>
<p style="text-align: justify;">Wat data betreft, heeft men opties: in sommige gevallen kan men ervoor opteren om de database die onder een miniservice staat, nog bruikbaar te houden voor andere applicaties en diensten; soms is dit gewoon gemakkelijker en efficiënter dan de data via de API bloot te stellen, of op een moderne gedistribueerde manier te verspreiden zoals dit bij microservices gebeurt. Men moet hier echter mee oppassen en het beperken, want hierdoor creëert men quasi onherroepelijk afhankelijkheden. Beter is het om wat de data betreft toch eerder richting microservices architectuur te evolueren en de miniservice exclusieve toegang tot zijn data te geven.</p>
<p style="text-align: justify;">Volgens een schatting van <a href="https://www.gartner.com/doc/3615120/innovation-insight-miniservices">Gartner</a> zal tegen 2019 90% van de organisaties het microservices paradigma te disruptief vinden en eerder gebruik maken van miniservices.</p>
<p style="text-align: justify;">Er zijn, ten slotte, nog een aantal andere alternatieven voor een microservices aanpak, naast miniservices. Zo bestaan er <a href="/as-a-service-een-waaier-aan-mogelijkheden/">PaaS platformen</a> waarbij er sterk visueel kan worden ontwikkeld (met zogenaamde &#8220;zero coding&#8221;) en men op die manier de productiviteit kan laten stijgen. En voor het implementeren van business processen kan men nog gebruik maken van <a href="/case-management-oude-software-in-een-nieuwe-verpakking/">BPMS suites</a>, die ook hier vaak een sterke automatisatie toelaten op een meer grafische manier.</p>
<h1 style="text-align: justify;">Old School: de MacroService</h1>
<p style="text-align: justify;">Macroservices representeren de traditionele SOA aanpak, die nu sterk in vraag wordt gesteld door de IT industrie. Via een macroservice brengt men een volledige applicatie of dienst online, in één grote deployment; deze ondersteunt dan een typische request/response API. Het woord service kan dan in hoofdzaak worden aangewend doordat men de applicatie of dienst heeft ge-&#8220;service enabled&#8221;. Er wordt m.a.w. een SOAP of (beter!) een REST API aangeboden aan de buitenwereld om met de macroservice te interageren. Vaak is het ook zo dat deze applicatie bovenop een database gebouwd wordt, via dewelke nog wordt geïntegreerd met andere toepassingen.</p>
<p style="text-align: justify;">Momenteel is het sterk afgeraden om op deze manier een nieuwe applicatie op te bouwen, maar deze systemen hebben echter wel nog af en toe hun nut! Vele bedrijven hebben namelijk een bepaald arsenaal aan zogenaamde &#8220;legacy&#8221; toepassingen, die vaak nog belangrijke taken verrichten, en die te groot en te complex (en dus te duur) zijn geworden om ze volledig te vervangen door een moderne variant die dezelfde kernfunctionaliteit encapsuleert. Wat men dan op z&#8217;n minst kan doen om deze applicaties beter te kunnen integreren met de nieuwere generatie componenten, is ze te &#8220;service enablen&#8221;. Dit betekent dat men er een laag rond bouwt die een moderne (REST) API zal aanbieden waarmee andere toepassingen dan gemakkelijker verbinding kunnen maken. De laag zal ervoor zorgen dat de buitenwereld niets hoeft te merken van de soms rare zaken die met de legacy toepassing kunnen misgaan, of van de esoterische programmeertalen en protocols die erin worden gebruikt.</p>
<p style="text-align: justify;">Let wel dat er steeds moet worden afgewogen om zulke applicaties toch niet te re-engineeren. Wanneer het echt om de core business van een bedrijf gaat, en men wil kunnen inspelen op b.v. een veranderende markt (m.a.w. wanneer men wendbaarder, meer <em>agile</em>, wil zijn), kan het op langere termijn soms voordeliger zijn om ze te vervangen door een meer op microservices geïnspireerde architectuur. Het gebruik van MacroServices is eerder geschikt voor applicaties die minder vaak veranderingen dienen te ondergaan, maar die wel via een API moeten kunnen worden aangesproken. Soms kan het ook gaan om aangekochte software, die dus inherent niet onder de eigen controle zit en niet kan ge-reëngineered worden.</p>
<p><a href="/wp-content/uploads/2017/11/granulariteit.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-11195" src="/wp-content/uploads/2017/11/granulariteit.png" alt="" width="913" height="439" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit.png 913w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-300x144.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-768x369.png 768w" sizes="auto, (max-width: 913px) 100vw, 913px" /></a></p>
<h1 style="text-align: justify;">De Toekomst is hier: NanoServices</h1>
<p style="text-align: justify;">NanoServices kan twee zaken betekenen. Enerzijds is het een door sommige mensen aangewende term om op een anti-patroon bij het bouwen van microservices te duiden: namelijk een <a href="https://dzone.com/articles/soa-anti-pattern-nanoservices">te sterke beperking van de scope</a>, op een manier die zinloos is. Het komt er dus op neer dat men goed moet nadenken over de bounded context en het te verwachten aparte gebruik van de diensten die deel uitmaken van een applicatie.</p>
<p style="text-align: justify;">Anderzijds kan men de term ook officieus gebruiken als bijnaam voor de zogenaamde Serverless diensten, of nog <a href="https://en.wikipedia.org/wiki/Function_as_a_service">Function Platform as a Service</a> (FPaaS). Via deze platformen kan men hele kleine stukjes code uitrollen zonder zich iets te moeten aantrekken van onderliggende infrastructuur, en deze aan te bieden via een kleine API. De granulariteit van de manier van ontplooien zorgt er daarbij voor dat men vaak nog kleiner kan gaan dan bij microservices. Uiteraard moet men erover blijven waken dat het zin blijft hebben om de functionaliteit zodanig in stukjes te kappen, wil men niet in het gelijknamig benoemde anti-pattern terechtkomen.</p>
<p style="text-align: justify;"><a href="https://martinfowler.com/articles/serverless.html">Serverless Architecture</a> maakt momenteel grote furore in de public cloud en er zijn ook al enkele open source oplossingen om een dergelijk platform in het eigen datacenter op te zetten.</p>
<h1 style="text-align: justify;">Besluit: Wat moeten we nu Bouwen?</h1>
<p style="text-align: justify;"><strong><em>De microservices architectuur is een zeer goede blauwdruk voor software ontwikkeling</em></strong>. De voordelen van wendbaarheid en flexibiliteit zijn een must voor bedrijven die goed willen kunnen inspelen op de markt en de klant, en een robuuste portfolio aan herbruikbare services willen uitbouwen.</p>
<p style="text-align: justify;">De vereisten om aan échte microservices ontwikkeling te doen zijn echter erg hoog, en het is niet altijd noodzakelijk om zulke extreme flexibiliteit en schaalbaarheid te behalen. Vaak is het voldoende om de microservices architectuur eerder benaderend na te streven via het bouwen van zogenaamde <strong><em>miniservices. In de meeste gevallen is dit dan ook de aangewezen manier van werken</em></strong>.</p>
<p style="text-align: justify;">Wanneer legacy toepassingen moeten worden ontsloten en er geen grote nood is aan het wendbaarder maken van deze applicaties, maar wel een ontsluiting via een goede API, dan kan het voldoende zijn om een services laag rond deze applicaties te bouwen en er op die manier een zogenaamde macroservice van te maken, die vanaf dan vlot mee kan integreren met de rest van de portfolio. Denk echter goed na of toekomstige wendbaarheid en flexibiliteit echt wel van minder belang zijn, alvorens dergelijke technische schuld (technical debt) te betonneren.</p>
<p style="text-align: justify;">NanoServices, ten slotte, indien het niet om het anti-patroon gaat, zijn zeker iets waar men mee mag beginnen experimenteren. Het voordeel om zich niets meer van infrastructuur te hoeven aan te trekken en de beschikbaarheid en schaalbaarheid op een quasi magische manier cadeau te krijgen, is niet te onderschatten. In een toekomstige blog wordt er zeker nog teruggekomen op deze Serverless Architectures.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Van N-tier naar MicroServices</title>
		<link>https://www.smalsresearch.be/van-n-tier-naar-microservices/</link>
					<comments>https://www.smalsresearch.be/van-n-tier-naar-microservices/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 08 Jun 2016 07:00:37 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[N-tier]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=9702</guid>

					<description><![CDATA[Het opdelen van een applicatie in apart uitrolbare componenten is reeds lang een kwestie van relatief grote &#8220;tiers&#8221;. Van zuiver monolithische applicaties zijn we gedurende de voorbije decennia langzaamaan geëvolueerd, via 2-tier en 3-tier applicaties, naar N-tier. Tegenwoordig neemt deze evolutie extremere vormen aan: applicaties bestaan uit steeds meer en steeds kleinere componenten, die uiteindelijk [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2016/06/logomicro.png" rel="attachment wp-att-9733"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="logomicro" width="150" height="150" /></a>Het opdelen van een applicatie in apart uitrolbare componenten is reeds lang een kwestie van relatief grote &#8220;tiers&#8221;. Van zuiver monolithische applicaties zijn we gedurende de voorbije decennia langzaamaan geëvolueerd, via 2-tier en 3-tier applicaties, naar N-tier. Tegenwoordig neemt deze evolutie extremere vormen aan: applicaties bestaan uit steeds meer en steeds kleinere componenten, die uiteindelijk tot <em>microservices</em> evolueren.</p>
<p style="text-align: justify;"><span id="more-9702"></span>Op termijn kan <a href="https://searchsoa.techtarget.com/answer/Microservices-architecture-101-What-the-heck-is-it">deze architecturale stijl</a> de grenzen tussen verschillende applicaties gaan vervagen, om ze te transformeren tot een applicatie-ecosysteem bestaande uit vele herbruikbare, onafhankelijk uitrolbare en afzonderlijk schaalbare componenten.</p>
<h2 style="text-align: justify;">De Geschiedenis van &#8220;Tiers&#8221;</h2>
<p style="text-align: justify;">De meest traditionele applicaties zijn <a href="https://en.wikipedia.org/wiki/Monolithic_application">monolithisch</a>: één programma dat al zijn functies vervult zonder afhankelijk te zijn van externe hulpmiddelen. Lang geleden werden de meeste applicaties op deze manier gebouwd, en vandaag zijn heel wat desktop applicaties hier nog steeds voorbeelden van. Met de opkomst van netwerken en Database Management Systemen (DBMS), werd echter voor vele applicaties een meer component-gebaseerde uitrol nodig. Voor een gedistribueerde applicatie werd het b.v. nodig om een &#8220;client&#8221; en een &#8220;server&#8221; of &#8220;backend&#8221; te hebben, om op die manier een gebruiker toe te laten de applicatie op een andere plaats (op een andere machine) te gebruiken dan de plaats waar de kern van de applicaties zich bevindt (meestal ook met het doel om meerdere gebruikers gelijktijdig van de applicatie gebruik te kunnen laten maken). Dit wordt de &#8220;<a href="https://en.wikipedia.org/wiki/Client%E2%80%93server_model">client-server</a>&#8221; of &#8220;2-tier&#8221; architectuur genoemd. Voor applicaties, die aan geavanceerde I/O doen, werd het daarnaast ook noodzakelijk om de verantwoordelijkheid hiervoor bij een DBMS te leggen. Dit systeem wordt dan de &#8220;data tier&#8221; van de applicatie.</p>
<p style="text-align: justify;">Uiteraard leidden deze twee architecturen reeds snel tot de zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Multitier_architecture">3-tier</a>&#8221; architectuur, met een client tier en een backend die werd gesplitst in een tier voor de business logic en een data tier. Tegenwoordig zijn er vaak nog meer opsplitsingen mogelijk. In de context van web-applicaties zal men b.v. de client tier nog in twee delen splitsen: de eigenlijke client in de browser, en een &#8220;web tier&#8221; om de client via het web te kunnen aanbieden. Men zou deze laatste zelfs nog kunnen opdelen in aparte servers voor het statische en dynamische gedeelte van de applicatie. Ook wordt het mogelijk dat een applicatie meerdere verschillende databronnen gebruikt, of dat haar business logica verdeeld geraakt over meerdere tiers (b.v. <a href="https://programmers.stackexchange.com/questions/140999/application-layer-vs-domain-layer">application logic vs domain logic</a>). Langzaamaan verdwijnt dan ook de notie van tiers (waarbij men een min of meer hiërarchische en lineaire relatie verwacht tussen de componenten), om plaats te maken voor een flexibeler systeem, waarbij de communicatie flexibeler vormen kan aannemen&#8230;</p>
<p><figure id="attachment_9723" aria-describedby="caption-attachment-9723" style="width: 896px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2016/06/drietier.png" rel="attachment wp-att-9723"><img loading="lazy" decoding="async" class="size-full wp-image-9723" src="/wp-content/uploads/2016/06/drietier.png" alt="Van links naar rechts: een monolithische applicatie, een 2-tier, en een 3-tier applicatie." width="896" height="485" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier.png 896w, https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier-300x162.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier-768x416.png 768w" sizes="auto, (max-width: 896px) 100vw, 896px" /></a><figcaption id="caption-attachment-9723" class="wp-caption-text">Van links naar rechts: een monolithische applicatie, een 2-tier, en een 3-tier applicatie.</figcaption></figure></p>
<h2 style="text-align: justify;">Tiers of Lagen?</h2>
<p style="text-align: justify;">De opdeling in tiers klinkt allicht bekend in de oren voor wie reeds met software architectuur bezig is, en doet ook denken aan de opdeling van een applicatie in lagen (&#8220;layers&#8221;). De beide termen, <a href="https://blogs.msdn.microsoft.com/jmeier/2008/09/05/layers-and-tiers/">tiers en layers</a>, worden soms zelfs als <a href="https://stackoverflow.com/questions/6978991/what-is-the-difference-between-tier-vs-layer-application">synoniemen</a> beschouwd (zuiver taalkundig zijn ze dat ook, en in het Nederlands kunnen we ze beide vertalen als &#8220;<a href="https://stackoverflow.com/questions/120438/whats-the-difference-between-layers-and-tiers">lagen</a>&#8220;). Dit is logisch: er is een grote <a href="https://www.codeproject.com/Tips/277818/Difference-in-layer-and-tier-architecture">similariteit</a> tussen deze beide concepten, en bijgevolg is er dus enige verwarring aanwezig.</p>
<p style="text-align: justify;">Lagen voorzien in een logische scheiding binnen de architectuur van een applicatie, waarbij het zaak is om tussen deze lagen, die functioneel gezien zo coherent mogelijk moeten zijn, een zo groot mogelijke onderlinge onafhankelijkheid te creëren (het zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Loose_coupling">loskoppelen</a>&#8220;). Ze hebben eerder als doel om functionele belangen (user interface (UI), applicatielogica, business logica, data access, etc.) gescheiden te houden en de applicatie aldus makkelijker onderhoudbaar te maken op lange termijn, doordat deze belangen apart benaderd kunnen worden. Tiers daarentegen, zijn fysiek gescheiden onderdelen van een applicatie, die apart van elkaar worden ontplooid, waardoor ze niet alleen het aparte onderhoud en de aparte ontwikkeling verder doortrekken, maar ook apart hergebruiken en schalen mogelijk maken.</p>
<p style="text-align: justify;">De verwarring tussen de beide concepten ontstaat allicht omdat de logische layers in de praktijk zeer vaak corresponderen met de fysieke tiers: de UI zit in de client tier, de business logica zit in de logic tier, en de database-laag komt overeen met de data tier. De scheiding in losgekoppelde lagen is daarnaast de ideale manier om ervoor te zorgen dat tiers los van elkaar kunnen worden gedeployed. Daarenboven wordt het onderscheid ook vervaagd in de context van de Cloud: Tiers zijn dan wel fysiek gescheiden, maar door het gebruik van Cloud-technologie (<a href="/kosten-besparen-in-de-cloud/">IaaS</a> of <a href="/productiviteitsverhoging-met-paas/">PaaS</a>) kunnen ze evenwel worden gehost op dezelfde fysieke of zelfs virtuele machine. Ze zouden eenvoudig in verschillende <a href="/disruptie-in-de-cloud-stack-caas/">Containers</a> kunnen worden geplaatst (zij het JEE, Docker of andere containers).</p>
<p style="text-align: justify;">Om te besluiten: layers vormen dus de bouwstenen van een applicatie op een logische manier, en beïnvloeden sterk de architectuur en het design ervan. Tiers, op hun beurt, definiëren de opdeling van een applicatie in onafhankelijk uitrolbare componenten. Ze hebben ook een sterke impact op de architectuur, maar eerder op het niveau van de interacties tussen de applicatie en andere systemen binnen een groter geheel, en op het niveau van de infrastructuur. Tiers kunnen moeilijk zonder layers: het loskoppelen van delen van de applicatie is nodig om ze apart te kunnen uitrollen. Beide zijn onontbeerlijk om de complexiteit van een applicatie in beheersbare blokken op te delen.</p>
<h2 style="text-align: justify;">Richting Microservices</h2>
<p style="text-align: justify;">Over de interessante evoluties binnen applicatie-architectuur en lagen, kunnen we in de toekomst nog een blog schrijven. Vandaag ligt de focus op tiers, en hoe het opsplitsen van een applicatie in componenten en diensten verregaande gevolgen kunnen hebben voor applicatie-ecosystemen.</p>
<hr />
<p style="padding-left: 60px; text-align: justify;">Ik heb het reeds in <a href="/data-centric-it-met-rest/">verscheidene</a> <a href="/html-5-een-rijke-ervaring-zonder-plugins/">blogs</a> over <strong>applicatie-ecosystemen</strong> gehad, maar nagelaten het concept eenduidig te definiëren. Bij deze dan een poging tot definitie:</p>
<blockquote>
<p style="padding-left: 60px; text-align: justify;">Een ecosysteem van applicaties is een groep applicaties (en gerelateerde IT entiteiten) die werken rond een gelijkaardig business domein, of die toebehoren aan eenzelfde organizatie (of beide). Soms betreft het zelfs groepen van applicaties die rond verschillende maar gerelateerde business domeinen werken. Typisch verwerken ze dezelfde of sterk gerelateerde gegevens, en vrij vaak interageren ze ook met elkaar, en/of worden ze gebruikt door dezelfde groep van eindgebruikers.</p>
</blockquote>
<p style="padding-left: 60px; text-align: justify;">Hieruit volgt dat binnen een applicatie-ecosysteem er een groot potentieel (!) bestaat voor hergebruik. Of dit potentieel effectief wordt gehaald, hangt sterk af van gemaakte keuzes betreffende <a href="https://searchsoa.techtarget.com/tip/Designing-a-modern-enterprise-architecture">enterprise</a>, <a href="https://martinfowler.com/articles/microservices.html">applicatie</a> en systeem-architectuur.</p>
<hr />
<p style="text-align: justify;">Een kritiek die is komen te ontstaan op de N-tier architectuur, is dat een applicatie nog steeds te geïsoleerd en self-contained is: alle business-logica zit vaak in één tier, alle persistentie-logica in een andere, etc. Men zou zelfs kunnen zeggen dat we de monolithische applicatie hebben vervangen door monolithische tiers! En dit terwijl applicaties steeds complexer worden en verregaandere behoeften hebben, zoals de integratie van business rules, taakbeheer en workflows; allemaal zaken die zo complex zijn, dat ze al een toepassing op zichzelf kunnen vormen.</p>
<p style="text-align: justify;"><a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service Oriented Architecture</a> (SOA) is een stap in de goede richting, maar historisch gezien richt deze methodiek zich op interacties tussen verschillende applicaties, binnen het ruimere opzicht van enterprise architectuur. Microservices nemen de ideeën van N-tier en SOA samen, en drijven ze naar een nieuw summum: elke aparte applicatie wordt nu beschouwd als zijn eigen mini-ecosysteem van onafhankelijk uitrolbare diensten, zich elk focussend op een verschillende business capabiliteit, zo klein gemaakt als maar kan (vandaar &#8220;micro&#8221;), en met zo min mogelijk gecentraliseerde orchestratie. Meestal heeft elke microservice &#8211; indien deze nood heeft aan persistentie &#8211; ook zijn eigen database (of een ander soort persistentiesysteem), die enkel en alleen voor deze microservice wordt ingeschakeld.</p>
<p style="text-align: justify;">Deze stijl <a href="https://searchcloudapplications.techtarget.com/feature/How-microservices-bring-agility-to-SOA">verhoogt sterk de Agility van SOA</a>: de kleinere services kunnen meer cohesief op zichzelf staan, en intern zijn ze meestal ook eenvoudiger dan volledige applicaties typisch zijn. Daarnaast kunnen onderhoud en evolutie van alle microservices apart van elkaar worden beheerd. Dit alles maakt dat deze aparte microservices makkelijker te bouwen en onderhouden zijn dan de volledige applicatie (uiteraard kruipt er wel enig werk in het op een goede manier opdelen van de applicatie in verschillende microservices). Men kan zelfs zo ver gaan als volledige microservices te vervangen door nieuwere en betere: indien ze klein genoeg zijn, kan de kost gerechtvaardigd zijn om een dergelijk stuk software &#8211; huiver &#8211; weg te gooien.</p>
<p style="text-align: justify;">Daarnaast wordt het voor ontwikkelteams ook mogelijk om flexibeler te kiezen welke technologie, welke talen en welke raamwerken ze zullen gebruiken om hun specifieke microservice zo optimaal mogelijk te implementeren. Ze zouden Java, Node.js, of eender welke andere technologie kunnen kiezen, zo lang ze maar overeenkomen over een gestandaardiseerd communicatiekanaal. Dit kanaal, op zijn beurt, zien we meer en meer evolueren richting <a href="/data-centric-it-met-rest/">RESTful APIs</a>: een robuuste de facto standaard.</p>
<p style="text-align: justify;">Deze evolutie wordt verder nog <a href="https://www.slideshare.net/dberkholz/how-microservices-are-redefining-modern-application-architecture">versterkt door de opkomst van Container technologie</a>: deze zijn de infrastructuurplatformen van de toekomst (of zelfs al van vandaag), en zijn &#8220;lichter&#8221; en makkelijker inzetbaar dan virtuele machines, waardoor het kosten-effectief wordt om een groter aantal kleinere services te hosten i.p.v. een klein aantal zwaardere applicatie(s)(-tiers). De beide technologische evoluties werken op die manier hand in hand om de schaalbaarheid van applicaties te verbeteren op een fijnmazig niveau: elke microservice kan onafhankelijk van de andere worden geschaald, en via <a href="https://en.wikipedia.org/wiki/Operating-system-level_virtualization">containers </a>kan er voor worden gezorgd dat de eronder liggende infrastructuur, gebruikt door het geheel aan services, een betere match vormt met het evoluerend verbruikspatroon.</p>
<p><figure id="attachment_9977" aria-describedby="caption-attachment-9977" style="width: 380px" class="wp-caption alignright"><a href="/wp-content/uploads/2016/06/ntiercorrected.png" rel="attachment wp-att-9727"><img loading="lazy" decoding="async" class="wp-image-9977" src="/wp-content/uploads/2016/06/ntiercorrected.png" width="380" height="447" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/ntiercorrected.png 597w, https://www.smalsresearch.be/wp-content/uploads/2016/06/ntiercorrected-255x300.png 255w" sizes="auto, (max-width: 380px) 100vw, 380px" /></a><figcaption id="caption-attachment-9977" class="wp-caption-text">Een N-tier applicatie die evolueert richting microservices: de applicatielogica zit in een aparte &#8220;tier&#8221;, of nog: de applicatielogica wordt aan de client aangeboden als een aparte service. Deze maakt op zijn beurt gebruik van een business logic tier, of nog: van business logic services. Onderaan staan dan de tiers of diensten die de entiteiten van de business (het domein) ondersteunen en persisteren.</figcaption></figure></p>
<p style="text-align: justify;">Microservices maken het <a href="https://bit.ly/1O7vbWA">mogelijk voor een organizatie om meer Agile te werken</a> en cross-functionele teams te bouwen, gefocust op business capabiliteiten, i.p.v. teams gefocusd op specifieke IT functies (UI specialisten, middleware specialisten, DBA&#8217;s, &#8230;). Wanneer een applicatie monolithisch wordt gebouwd, is er vaak veel heen-en-weer &#8220;gedoe'&#8221; tussen verschillende teams nodig om cross-functionele zaken te implementeren, met het gevaar dat business logica doorsijpelt op plaatsen waar deze niet hoort te zitten (b.v. in de UI of de data laag). Een meer expliciete scheiding van de applicatie in service componenten maakt de grenzen duidelijker, zowel tussen de microservices als tussen de teams die ze implementeren, waardoor er meer onafhankelijkheid in het implementatieproces kan worden gestopt. Een meer <a href="https://www.infoworld.com/article/3044726/application-development/succeeding-in-the-continuous-enterprise-with-microservices.html">servicegericht model van samenwerking</a> wordt op deze manier mogelijk: teams worden klant van elkaar omdat hun producten klant zijn van elkaar.</p>
<h2 style="text-align: justify;">Ecosystemen van Services</h2>
<p style="text-align: justify;">Binnen een applicatie-ecosysteem van enige omvang, is er <a href="https://www.ibm.com/developerworks/websphere/library/techarticles/1503_clark/1305_clark.html">altijd al op vele niveau&#8217;s de nood geweest aan integraties</a>. Met een beetje geluk waren deze integraties gekend wanneer een applicatie werd gebouwd, maar vaak is het echter zo dat de nood aan integratie achteraf ontstaat, wanneer een applicatie reeds enige tijd in productie is. Integraties komen ook voor op het UI niveau, waar ze leiden tot portaal technologie en integration-at-the-glass. Of ze komen voor op het niveau van de data, wat vaak tot gevolg heeft dat een database wordt gedeeld tussen verschillende applicaties. Er zijn reeds verdienstelijke pogingen gedaan om al deze integraties op te vangen via middleware, maar zelfs de alomtegenwoordige <a href="https://en.wikipedia.org/wiki/Enterprise_service_bus">Enterprise Service Bus</a> (ESB) is geen panacee.</p>
<p style="text-align: justify;">We kunnen nooit vrij zijn van de onverwachtheid van sommige integratie-behoeftes, maar microservices kunnen een aantal van de moeilijkheden helpen verminderen. Enerzijds komt dit door de standaardisatie van de communicatie tussen microservices. Anderzijds doordat business capabiliteiten dankzij deze architectuur worden opgedeeld in kleinere stukken, wordt het makkelijker om een component te gaan hergebruiken in een andere applicatie, en deze apart te schalen indien hij daardoor zwaarder belast wordt. Bovendien kunnen we applicaties op zo&#8217;n manier opsplitsen, dat hergebruik wordt aangemoedigd: er zullen enerzijds applicatiespecifieke microservices deel uitmaken van een applicatie, maar anderzijds zullen er ook microservices zijn die een bepaalde business problematiek of capabiliteit ondersteunen, die onafhankelijk is van applicatielogica; deze laatste zijn vaak in meerdere toepassingen nuttig. Verder kunnen we ook nog microservices hebben die verantwoordelijk zijn voor een bepaald deel van de persistentie-behoeften van de applicatie. Services zo klein dat ze data betreffen die ook door andere applicaties gebruikt wordt. Deze &#8220;data services&#8221; zullen de poortwachters zijn van de data: zij encapsuleren de databases (of maken deel uit van een algemenere <a href="https://en.wikipedia.org/wiki/Data_as_a_service">Data as a Service</a> aanpak) en hebben meerdere applicaties als klant.</p>
<p style="text-align: justify;">Uiteindelijk leidt deze opdeling in services tot een heel ander ecosysteem: niet één van monolithische of tiered applicaties, maar één van intergeconnecteerde microservices. En deze grote groep microservices kan dan &#8220;ten dienste&#8221; staan van specifieke &#8220;client&#8221;-componenten die een UI bevatten en dus de gebruikers toelaten dit ecosysteem te gebruiken op verschillende manieren. Dezelfde achterliggende dienst kan bijvoorbeeld een rol spelen binnen een web-toepassing, maar ook in een mobiele toepassing.</p>
<p><figure id="attachment_9728" aria-describedby="caption-attachment-9728" style="width: 1010px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2016/06/microservices.png" rel="attachment wp-att-9728"><img loading="lazy" decoding="async" class="size-full wp-image-9728" src="/wp-content/uploads/2016/06/microservices.png" alt="captie" width="1010" height="746" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices.png 1010w, https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices-300x222.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices-768x567.png 768w" sizes="auto, (max-width: 1010px) 100vw, 1010px" /></a><figcaption id="caption-attachment-9728" class="wp-caption-text">Een fictief voorbeeld van een microservice applicatie-ecosysteem, conceptueel voorgesteld. Bovenaan zijn er meerdere eindgebruikers-componenten, die een UI bevatten (de clients). Deze maken gebruik van onderliggende microservices die bepaalde functionaliteiten (b.v. &#8220;plaats een product in een winkelmandje&#8221;) ondersteunen en zo samen de applicatielogica van een applicatie vormen. Op hun beurt maken deze diensten gebruik van allerlei services die de business capabiliteiten, onafhankelijk van applicaties, ondersteunen (b.v. &#8220;plaats een bestelling&#8221;). Deze laatste maken dan weer gebruik van business diensten van een lager niveau: diensten die het beheer op zich nemen van de specifieke business entiteiten (zoals &#8220;klant&#8221;, &#8220;bestelling&#8221;, &#8220;factuur&#8221;). Op het laagste niveau krijgen we een eerder technische dienstverlening (b.v. &#8220;database voor klantgegevens&#8221;). Het komt in deze tekening niet veel voor, maar het is niet verboden dat diensten in een bepaalde laag gebruik maken van diensten die zich niet in de laag er direct onder bevinden. Deze opdeling in lagen is in principe ook slechts een voorbeeld; er zijn mogelijk nog andere manieren om de microservices te klassificeren. (In de tekening is met gekleurde bolletjes aangeduid welke microservices uiteindelijk deel uitmaken van welke applicatie.)</figcaption></figure></p>
<p style="text-align: justify;">Eén probleem is dat deze sterke interconnectiviteit tussen een steeds groter wordende groep microservices kan gaan lijken op een onbeheersbaar kluwen (zogenaamde point-to-point integraties). Er zijn echter een paar zaken die dit effect tegengaan:</p>
<ul style="text-align: justify;">
<li>Enerzijds is de point-to-point integratie slechts een integratie op conceptueel niveau. Op technisch vlak zal dit worden opgevangen door middleware-technologie, zoals de ESB. Zolang een dienst een logisch en leesbaar adres heeft, kan deze op die manier worden aangesproken. De werkelijke localisering en verbinding is de verantwoordelijkheid van een onderliggend platform.</li>
<li>Daarnaast kan men ook twee reeds eerder besproken principes toepassen: die van <a href="/data-centric-it-met-rest/">Data-Centric IT</a>, en die van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a>. Deze zijn compatibel met elkaar en met Microservices, en zorgen samen voor een beheersbaar &#8220;inter-service&#8221; communicatiemodel: samen kunnen deze methodieken er namelijk voor zorgen dat een dienst enkel moet weten welke data en events er nodig zijn en hoe deze kunnen worden geadresseerd. Er zijn uiteraard nog externe zaken nodig die geen data of Event zijn, maar dit zijn dan meestal generieke en nuttige diensten, zoals het genereren van pdf&#8217;s of het aanroepen van eerder technische capabiliteiten, zoals authenticatie of logging.</li>
<li>Ten slotte komen er specifiek voor deze problematiek ook oplossingen te voorschijn onder de noemer van <a href="https://techcrunch.com/2012/11/11/5-rules-for-api-management/">API management</a>. De publieke interface van een microservice kan namelijk gezien worden als een API (<a href="https://en.wikipedia.org/wiki/Application_programming_interface">Application Programming Interface</a>). Naast het beheer van een veelvoud aan APIs, richten deze platformen zich ook vaak op het beheer van de levenscyclus van de erachterliggende diensten.</li>
</ul>
<h2 style="text-align: justify;">Besluit</h2>
<p style="text-align: justify;">Microservices zijn als deployment architectuur een perfecte match voor Agile software ontwikkeling, en verankeren de goede principes van Service Oriented Architecture. Ze maken het mogelijk software op een flexibeler manier te ontwikkelen, met vele kleine componenten, waardoor er sneller kan worden ingespeeld op veranderende behoeften. Ze laten herbruikbaarheid toe op een fijnmazige manier, en verhogen de efficiëntie in het gebruik van resources. Ook met de huidige ontwikkelingen op vlak van infrastructuur: Containers, gaan ze heel goed samen. Samen daarmee, en met EDA en REST, vormen ze een blauwdruk om een applicatie-ecosysteem future-proof op te bouwen.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/van-n-tier-naar-microservices/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Disruptie in de Cloud Stack: CaaS</title>
		<link>https://www.smalsresearch.be/disruptie-in-de-cloud-stack-caas/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 16 Sep 2015 07:41:22 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[CaaS]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[CoreOS]]></category>
		<category><![CDATA[cost cutting]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Managing IT costs]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=8754</guid>

					<description><![CDATA[De Cloud hype: we zijn er nog maar pas van aan het bekomen, of daar is alweer iets nieuws dat de hele IT industrie op zijn kop tracht te zetten: Containers! De &#8220;powers that be&#8221; (Google, Microsoft, etc.) zijn er allemaal direct opgesprongen &#8211; en gelukkig maar, want zo worden ze netjes opgeslokt in &#8220;the [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2015/07/containers.jpg"><img loading="lazy" decoding="async" class=" size-thumbnail wp-image-8902 alignleft" src="/wp-content/uploads/2015/07/containers-150x150.jpg" alt="containers" width="150" height="150" /></a>De Cloud hype: we zijn er nog maar pas van aan het bekomen, of daar is alweer iets nieuws dat de hele IT industrie op zijn kop tracht te zetten: <strong>Containers!</strong> De &#8220;powers that be&#8221; (Google, Microsoft, etc.) zijn er allemaal direct opgesprongen &#8211; en gelukkig maar, want zo worden ze netjes opgeslokt in &#8220;the bigger picture&#8221;, of toch niet?</p>
<p><span id="more-8754"></span></p>
<h2>Containers, the name you know&nbsp;!</h2>
<p>Het woord &#8220;Container&#8221; klinkt vele mensen, niet alleen in de bouw en scheepvaart, maar ook in de IT, reeds bekend in de oren. Het is dan ook, net zoals &#8220;<a href="https://c2.com/ppr/ams.html">Component</a>&#8220;, een erg brede term, die binnen ons vakgebied wijd uiteenlopende implementaties kent. In ruime zin wil het uiteraard precies zeggen wat het woord betekent: <em>&#8220;Een ding waar andere dingen in kunnen&#8221;</em>.</p>
<p>Een paar voorbeelden:</p>
<ul>
<li>Containers als <a href="https://en.wikipedia.org/wiki/Container_(abstract_data_type)">Abstract Data Type</a>: binnen programmeertalen kunnen ze worden gebruikt om verzamelingen van andere waarden of objecten te bevatten en beheren (e.g. een Lijst of een Set).</li>
<li>Containers zijn ook een andere naam voor <a href="https://en.wikipedia.org/wiki/Application_server">Applicatieservers</a>, of een specifiek deel ervan om servlets te hosten (de &#8220;<a href="https://en.wikipedia.org/wiki/Web_container">Web Container</a>&#8220;).</li>
<li>Waar het in deze blog over gaat: Containers als Virtualizatie-middel op niveau van besturingssystemen (&#8220;<em><a href="https://en.wikipedia.org/wiki/Operating-system-level_virtualization">Operating-system-level Virtualization</a></em>&#8220;).</li>
</ul>
<h2>Containers are the new VM&#8217;s&nbsp;!</h2>
<p>Wat is dat dan precies, die nieuwe Containers waar iedereen het over heeft? Zoals gezegd is het dus een soort van virtualizatietechniek op niveau van, t.t.z. <em>binnen</em> een besturingssysteem. <img loading="lazy" decoding="async" class=" wp-image-8884 size-full aligncenter" src="/wp-content/uploads/2015/07/Container-VM.png" alt="Container-VM" width="514" height="285" srcset="https://www.smalsresearch.be/wp-content/uploads/2015/07/Container-VM.png 514w, https://www.smalsresearch.be/wp-content/uploads/2015/07/Container-VM-300x166.png 300w" sizes="auto, (max-width: 514px) 100vw, 514px" />En hier zit natuurlijk het verschil met <a href="https://en.wikipedia.org/wiki/Virtual_machine">Virtuele Machines</a>, waarbij we virtualizatie hebben <em>over</em> besturingssystemen heen. Desondanks zorgt de technologie ervoor dat Containers en de erin aanwezige processen netjes van elkaar geïsoleerd blijven. Zoals op de figuur te zien is, hebben Containers het grote voordeel tegenover VM&#8217;s dat ze veel lichter zijn. Binnen een VM zal er altijd nood zijn aan een gast-besturingssysteem (&#8220;guest os&#8221;), dat, hoe klein ook, een deel van de bruikbare middelen van het systeem zal opslorpen. Containers dragen deze last niet. Voorlopig blijven VM&#8217;s koning van het datacenter, maar Containers <a href="https://virtualizationreview.com/articles/2014/10/29/containers-virtual-machines-and-docker.aspx">zouden wel eens een coup kunnen plegen</a>.</p>
<p>Containers zijn mogelijk dankzij de manier waarop de Linux kernel werkt (Microsoft kondigde echter al support aan voor Containers binnen <a href="https://techcrunch.com/2014/10/15/microsoft-partners-with-docker-to-bring-container-support-to-windows-server/">Windows Server</a>). Het isoleren van processen en het beperken van hun resource-gebruik is reeds heel lang mogelijk binnen Linux; er was echter een bedrijf als <a href="https://www.docker.com/whatisdocker">Docker</a> nodig om een ecosysteem aan ondersteunende tools te creëren, om zo deze technologie van onder de grond te halen en recht naar de Cloud te katapulteren. Ondertussen is er trouwens al wat <a href="https://cloudtweaks.com/2015/03/docker-vs-rocket-container-technology/">concurrentie</a> in de Containermarkt.</p>
<h2>Containers: build once; ship and run anywhere&nbsp;!</h2>
<p>De technologie die de laatste tijd rond Containers is uitgebouwd en vooral door Docker en <a href="https://coreos.com/">CoreOS</a> is gepopulariseerd, laat toe om om een applicatie met alle nodige bibliotheken, bestanden en configuratie, in een pakketje te stoppen, en dit pakketje naar een Container ondersteunend platform te sturen om de applicatie te laten werken. Het is perfect mogelijk om in je eigen datacenter, of zelfs op één machine op je zolder, Containers te ondersteunen, net zoals in de public cloud. Het mooie is dat het<img loading="lazy" decoding="async" class=" size-full wp-image-8891 alignright" src="/wp-content/uploads/2015/07/docker_image.png" alt="docker_image" width="244" height="238" /> niet uitmaakt waar de server zich bevindt: indien Containers ondersteund zijn, kan je je pakketje erop zwieren. Bovendien bestaan er al van heel veel applicaties standaard pakketjes (b.v. te vinden in de <a href="https://registry.hub.docker.com/">Docker Hub</a>), en hoef je dus al vaak zelf niet meer veel werk te doen om iets te kunnen lanceren.</p>
<p>Containerpakketjes zijn ook heel flexibel uitbreidbaar: ze kunnen gelaagd worden opgebouwd, een beetje als een <a href="https://jeffreypalermo.com/blog/the-onion-architecture-part-1/">ajuin</a>. Indien bijvoorbeeld iemand al een Node.js image heeft voorzien, kan je jouw node.js applicatie daarbovenop bouwen. Je hoeft dus niet telkens van nul te beginnen.</p>
<p>Ten slotte is het ook mogelijk je applicatie in meerdere pakketjes te stoppen: b.v. het applicatieve deel en de database apart. Je kan zo&#8217;n pakketje zelfs schalen, door het meermaals uit te rollen. Je kan b.v. het webgedeelte van je applicatie in één Docker Image stoppen, en tien maal uitrollen om alle front-end gebruikers aan te kunnen, terwijl je daarnaast b.v. maar één Docker Image uitrolt voor de database (handig als niet alle gebruikers steeds de database nodig hebben). Zo komt de droom van ultieme Modulariseerbaarheid (remember <a href="https://en.wikipedia.org/wiki/Component-based_software_engineering">Components</a>?) weer een stapje dichterbij.</p>
<h2>CaaS, CPaaS, ContaaS&nbsp;?</h2>
<p>Via Docker en Containertechnologie kan men dus zeer snel applicaties of hun onderdelen uitrollen. Uiteraard wordt het al snel onoverzichtelijk wanneer men dit zomaar ad hoc gaat doen. Gelukkig zijn er reeds systemen ontwikkeld die het beheer van een Container-ondersteunend datacenter en de erop uitgerolde Containers goed ondersteunen. Google <a href="https://kubernetes.io/">Kubernetes</a> is er zo eentje, maar ook CoreOS is al jaren op deze markt actief. De <a href="https://cloud.google.com/container-engine/">Google Container Engine</a> is een voorbeeld van Containers as a Service in de public cloud.</p>
<p><img loading="lazy" decoding="async" class=" wp-image-8905 alignleft" src="/wp-content/uploads/2015/07/iaascaaspaas2-300x136.png" alt="iaascaaspaas2" width="299" height="142" />Momenteel worden zulke &#8220;CaaS&#8221; platformen meer naar voren gebracht als <a href="https://venturebeat.com/2015/05/09/goodbye-saas-hello-containers-as-a-service/">alternatief voor IaaS en PaaS</a>. Ze vullen dan ook een unieke niche tussen de twee: IaaS werkt met VM&#8217;s en vergt veel meer configuratie en administratie, en PaaS is voor sommige gebruikers misschien te beperkend of gewoon een stap te ver qua niveau van ondersteuning. Dan biedt CaaS een gulden middenweg. De <a href="https://blog.openshift.com/openshift-v3-platform-combines-docker-kubernetes-atomic-and-more/">betere PaaS platformen maken ondertussen zelfs al gebruik van Containers</a>!</p>
<p>Spijtig genoeg is CaaS vooralsnog geen officiële afkorting &#8211; althans niet voor <em>Containers</em> as a Service. De meest gebruikte betekenis van CaaS is <a href="https://whatis.techtarget.com/definition/Communications-as-a-Service-CaaS">Communication as a Service</a>, maar Compiler, Commerce, Content, Crimeware en ja, zelfs <a href="https://www.sap.com/pc/tech/cloud/software/managed-cloud-as-a-service/index.html">Cloud as a Service</a> (partner managed cloud) zijn <a href="https://en.wikipedia.org/wiki/CAAS">kandidaten</a>.  ContaaS bestaat allicht nog niet, maar klinkt wat ongelukkig. Ook Container <em>Platform</em> as a Service kunnen we niet afkorten als cPaaS, dit betekent reeds <a href="https://www.nojitter.com/post/240169944/cisco-to-cpaas-providers-game-on">collaboration </a>Platform-as-a-Service. Gezien echter het stijgende gebruik binnen het IT nieuws, zullen ook wij toch de terminologie <strong>CaaS</strong> hanteren.</p>
<h2>Containers, Conclusie&nbsp;!</h2>
<p>Containers zijn een bijzonder handige manier om applicaties uit te rollen en te modulariseren. Ze zijn momenteel sterk gehyped en, ondersteund door CaaS, zouden ze wel eens grote invloed kunnen hebben op de cloud, en op ons vak!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>&#8220;as a Service&#8221;: een Waaier aan Mogelijkheden</title>
		<link>https://www.smalsresearch.be/as-a-service-een-waaier-aan-mogelijkheden/</link>
					<comments>https://www.smalsresearch.be/as-a-service-een-waaier-aan-mogelijkheden/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 28 Oct 2013 10:14:11 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[aPaaS]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=6108</guid>

					<description><![CDATA[Over PaaS en de brede lading die erdoor wordt gedekt De moderne &#8220;stack&#8221; voor applicaties in de Cloud, van IaaS (Infrastructure as a Service) over PaaS (Platform as a Service) tot SaaS (Software as a Service), is stilaan een gekend plaatje. Maar de strikte scheiding tussen het virtualiseren van infrastructuur, het automatiseren van middleware en [&#8230;]]]></description>
										<content:encoded><![CDATA[<h4><span style="font-size: 1.5em;">Over PaaS en de brede lading die erdoor wordt gedekt</span></h4>
<p><img loading="lazy" decoding="async" class="alignleft  wp-image-6222" alt="stack" src="/wp-content/uploads/2013/10/stack.png" width="355" height="310" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/10/stack.png 444w, https://www.smalsresearch.be/wp-content/uploads/2013/10/stack-300x262.png 300w" sizes="auto, (max-width: 355px) 100vw, 355px" /></p>
<p>De moderne &#8220;stack&#8221; voor applicaties in de Cloud, van IaaS (<a href="https://en.wikipedia.org/wiki/Cloud_computing#Infrastructure_as_a_service_.28IaaS.29">Infrastructure as a Service</a>) over PaaS (<a href="https://en.wikipedia.org/wiki/Platform_as_a_service">Platform as a Service</a>) tot SaaS (<a href="https://en.wikipedia.org/wiki/Software_as_a_service">Software as a Service</a>), is stilaan een gekend plaatje. Maar de strikte scheiding tussen het virtualiseren van infrastructuur, het automatiseren van middleware en het aanbieden van applicaties, en dit alles &#8220;als een dienst&#8221;, hoeft soms helemaal niet zo strikt te zijn.</p>
<p>In de Application Platform as a Service (<strong>aPaaS</strong>) branche, die reeds <a href="/?p=5995">in een vorige blogpost</a> uit de doeken werd gedaan, kan men bijvoorbeeld verschillende soorten aPaaS onderkennen, die variëren van een dunne schil boven IaaS, tot een soort van &#8220;Applicatie-Ontwerp-SaaS&#8221; oplossingen. In deze blogpost een korte verkenning van deze wondere wereld.</p>
<h2>1. Vlak boven de infrastructuur</h2>
<p>Sommige PaaS platformen bieden geen ingebouwde applicatieserver of database aan, maar vormen een laag bovenop de infrastructuur die het gebruikers makkelijker maakt om de nodige technologie geïnstalleerd en geconfigureeerd te krijgen op (niet noodzakelijk) virtuele servers.</p>
<div class="wp-caption alignright" style="width: 300px; border: none; background-color: f3f3f3;">
<p><img loading="lazy" decoding="async" class="size-full wp-image-6227  " style="border: 0px;" alt="cloudify-screenshot" src="/wp-content/uploads/2013/10/cloudify-screenshot.jpg" width="300" height="214" /></p>
<p style="text-align: right; color: #666; font-family: Georgia; font-size: 12px; margin: 10px 5px 4px;">Een Cloudify recept</p>
</div>
<p>Een voorbeeld is <a href="https://www.cloudifysource.org/">Cloudify</a>. Bij deze aPaaS kan men als gebruiker een applicatie definiëren aan de hand van een recept. Dit recept stuurt men dan naar een Cloud met Cloudify ondersteuning, waardoor het platform de nodige &#8220;ingrediënten&#8221; van het recept in gebruik zal nemen. Het grote voordeel, zo stelt Cloudify, is dat recepten niet Cloud-specifiek zijn, en dat ze dus op de meeste Cloud systemen kunnen werken. Dit is b.v. nuttig voor het migreren van applicaties van de ene Cloud naar de andere.</p>
<p>&nbsp;</p>
<h2>2. Middleware als dienst</h2>
<p>De bekendste aPaaS platformen bieden doorgaans een sterke integratie met web- en applicatieservers, en met diensten voor gegevensopslag. Sommige focussen zich op ondersteuning van een welbepaalde technologie, andere op het werken met zoveel mogelijk van de populairdere frameworks van het moment.</p>
<p>Een belangrijk kenmerk van platforms op dit niveau, en voor mij één van doorslaggevend belang, is dat er abstractie wordt gemaakt van de onderliggende infrastructuur. Niet langer moet je rekening houden met op welke server wat komt te staan: je deployt naar een platform, en dit platform kiest transparant welke delen van jouw applicatie op welke resources terecht komen. Welke en hoeveel infrastructuur onderliggend zijn aan het platform, daar hoef je als ontwikkelaar dan minder wakker van te liggen. Bovendien is er bij platformen met deze eigenschap doorgaans enige ondersteuning voor failover, elastisch schalen en multi-tenancy (voor ontwikkelaars).</p>
<div class="wp-caption alignright" style="width: 480px; border: none; background-color: f3f3f3;"><a href="/wp-content/uploads/2013/10/openshift-screenshot.jpg"><img loading="lazy" decoding="async" class="alignright size-full wp-image-6243" style="border: 0;" alt="openshift-screenshot" src="/wp-content/uploads/2013/10/openshift-screenshot.jpg" width="480" height="497" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/10/openshift-screenshot.jpg 480w, https://www.smalsresearch.be/wp-content/uploads/2013/10/openshift-screenshot-290x300.jpg 290w" sizes="auto, (max-width: 480px) 100vw, 480px" /></a></p>
<p style="text-align: right; color: #666; font-family: Georgia; font-size: 12px;">Architectuur in een Openshift Node</p>
</div>
<p>Dit keer kiezen we <a href="https://www.openshift.com/">Red Hat OpenShift</a> als voorbeeld. Dit aPaaS platform bestaat zowel in de publieke cloud, als in een &#8220;on premise&#8221; installeerbare versie, waardoor je het dus kan gebruiken voor een private Cloud. De basis van het platform is open source.</p>
<p>Wanneer we op deze PaaS inloggen, krijgen we een web console te zien met behulp van dewelke we applicaties kunnen deployen in de Cloud. We moeten daarbij kiezen uit welke &#8220;cartridges&#8221; een app bestaat. Cartridges kan men beschouwen als een technologisch afgezonderde module, e.g. een <a href="https://www.mysql.com/">MySQL</a> cartridge. daarnaast kiezen we ook hoeveel &#8220;gears&#8221; de applicatie krijgt, en of ze schaalbaar zal zijn. Gears (letterlijk vertaald: tandwielen of radartjes) zijn eenheden van computatie, ze stellen een bepaalde hoeveelheid processorkracht, geheugen en opslag voor, los van de onderliggende infrastructuur. De cartridges van de applicatie komen dan terecht op de gears en die laatste worden transparant gedeployed op het platform.</p>
<h2>3. (Semi-)Grafisch Applicaties ontwikkelen</h2>
<p>Dichter bij de SaaS-laag van Cloud platformen, vinden we producten terug die doorgaans gespecialiseerd zijn in slechts enkele onderliggende implementatie-, server- en database-technologieën. Deze specialisatie laat echter wel verregaande automatisatie toe, waardoor het mogelijk wordt om eenvoudige tot matig complexe applicaties te ontwikkelen zonder code te schrijven, of dit slechts in beperkte mate te doen.<a href="/wp-content/uploads/2013/10/zoho.png"><img loading="lazy" decoding="async" class="size-full wp-image-6250 alignleft" alt="zoho" src="/wp-content/uploads/2013/10/zoho.png" width="352" height="277" srcset="https://www.smalsresearch.be/wp-content/uploads/2013/10/zoho.png 352w, https://www.smalsresearch.be/wp-content/uploads/2013/10/zoho-300x236.png 300w" sizes="auto, (max-width: 352px) 100vw, 352px" /></a></p>
<p><a href="https://www.zoho.com/creator/">Zoho Creator</a> is bijvoorbeeld zo&#8217;n platform. Het richt zich vooral op applicaties die sterk gericht zijn op online databases. Zo kan men via drag and drop webformulieren aanmaken, waarvan de data dan in zo&#8217;n database zal terechtkomen en eventueel in een complexe workflow. Voorts kan men acties en triggers voorzien rond data-access. Verder kan men bepaalde taken automatiseren, zoals het versturen van emails en genereren van rapporten. Html pagina&#8217;s kan men dan verder aanpassen m.b.v. html en het zogenaamd &#8220;Deluge Script&#8221;, een taal eigen aan het platform.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2> Besluit</h2>
<p>Deze 3 voorbeelden van een genuanceerdere definiëring van wat aPaaS nu eigenlijk inhoudt, zijn, opnieuw, niet te beschouwen als de enige correcte onderverdeling. In de software-industrie zijn er ondertussen tientallen producten die zichzelf volgens de definitie PaaS mogen noemen, en nog veel meer die zichzelf de noemer geven zonder het strikt genomen te zijn, allemaal met hun eigen specifieke invulling van de term. Al deze producten staan allicht net iets verder of net iets minder ver van IaaS/SaaS dan de voorbeelden hier omschreven.</p>
<p>Dit is voor ontwikkelaars zowel een voordeel als een nadeel: Aan de ene kant biedt het voor elk wat wils, en voor elke applicatie die moet worden geschreven kan men het &#8220;ideale platform&#8221; vinden. Anderzijds kan dit standaardisatie tegenwerken, en laat dat nu net één van de kenmerken zijn die een aPaaS platform nuttig maken.</p>
<p>Over aPaaS verschenen onlangs een <a href="/publications/document?docid=100">Research Note</a> en <a href="/publications/document?docid=99">Presentatie</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/as-a-service-een-waaier-aan-mogelijkheden/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Productiviteitsverhoging met PaaS</title>
		<link>https://www.smalsresearch.be/productiviteitsverhoging-met-paas/</link>
					<comments>https://www.smalsresearch.be/productiviteitsverhoging-met-paas/#comments</comments>
		
		<dc:creator><![CDATA[Bert Vanhalst]]></dc:creator>
		<pubDate>Thu, 03 Oct 2013 05:00:03 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=5995</guid>

					<description><![CDATA[Organisaties zijn voortdurend op zoek naar een hogere productiviteit in software-ontwikkeling. Enerzijds wil men toepassingen ontwikkelen tegen een lagere kost, anderzijds wil men toepassingen sneller kunnen opleveren. Automatisatie en standaardisatie zijn hier twee sleutelbegrippen die een hogere productiviteit moeten bewerkstelligen. Wat is PaaS? Productiviteitsverhoging is nu precies de focus van Platform as a Service (PaaS). [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Organisaties zijn voortdurend op zoek naar een hogere productiviteit in software-ontwikkeling. Enerzijds wil men toepassingen ontwikkelen tegen een lagere kost, anderzijds wil men toepassingen sneller kunnen opleveren. Automatisatie en standaardisatie zijn hier twee sleutelbegrippen die een hogere productiviteit moeten bewerkstelligen.</p>
<h3>Wat is PaaS?</h3>
<p>Productiviteitsverhoging is nu precies de focus van Platform as a Service (PaaS). Een PaaS is een verzameling van diensten voor de infrastructuur van applicaties. In het cloudverhaal kan men PaaS situeren tussen Software as a Service (SaaS – applicatielaag) en Infrastructure as a Service (IaaS – hardwarelaag). De aangeboden diensten zijn onder andere: het applicatieplatform, integratie, databases en business process management. Vandaag wordt er vooral geconcentreerd op de meer specifieke aPaaS: <i>application</i> Platform as a Service.</p>
<p><a href="/wp-content/uploads/2013/08/cloud-gears.jpg"><img loading="lazy" decoding="async" class="alignright size-thumbnail wp-image-6082" src="/wp-content/uploads/2013/08/cloud-gears-150x150.jpg" alt="cloud-gears" width="150" height="150" /></a>aPaaS platformen ondersteunen de ontwikkeling en in-productiestelling van applicaties in de cloud. Ze zijn als het ware een uitgebreide applicatieserver in de cloud en ondersteunen multi-tenancy en elastische, horizontale schaalbaarheid van applicaties. aPaaS-platformen bieden bijgevolg nieuwe mogelijkheden aan developers om makkelijker en sneller applicaties te ontwikkelen.</p>
<p>In eerste instantie lag de focus van PaaS-oplossingen op het aanbieden van platform services in de public cloud. Al snel werd duidelijk dat dezelfde technologie toegepast kan worden binnen een organisatie zelf, in een private cloud. Het private aspect is onder andere belangrijk vanwege de confidentialiteit van de gegevens.</p>
<h3>Wat zijn de beoogde voordelen?</h3>
<p>PaaS-platformen beloven om een aantal obstakels weg te nemen die beletten om productiever toepassingen te ontwikkelen. Ze zijn zo ontworpen dat ontwikkelaars zich kunnen focussen op de toepassingscode en zich niet moeten bezighouden met het opzetten en configureren van servers, storage en middleware stacks. Die worden immers aangeboden &#8220;als een service&#8221;.</p>
<p>Dit zijn een aantal beoogde voordelen van PaaS:</p>
<ul>
<li>Via self-service kunnen ontwikkelaars on-demand een application stack deployen. Met andere woorden, de provisioning van alle nodige componenten (frameworks, middleware, etc.) gebeurt automatisch.</li>
<li>Toepassingen kunnen automatisch geschaald worden bij een toenemende belasting.</li>
<li>De huidige deployment methodologie op basis van verschillende omgevingen (ontwikkeling, test, acceptatie, productie) kan worden behouden, maar de overgang tussen de verschillende omgevingen verloopt veel vlotter omdat elke omgeving gebaseerd is op dezelfde application stack, en men dus een homogenere infrastructuur bekomt.</li>
<li>Indien gewenst kan een toepassing eenvoudig overgezet worden van de ene cloud naar de andere. Zo kan een prototype van een applicatie die ontwikkeld is op een public cloud infrastructuur overgezet worden naar een private infrastructuur of kan een toepassing die gehost is op een private infrastructuur gebruik maken van een public cloud infrastructuur om bijkomende load op te vangen.</li>
</ul>
<p>Veel van de beoogde voordelen steunen op doorgedreven automatisatie en standaardisatie van het ontwikkelings- en deploymentproces.</p>
<p>Bepaalde PaaS-oplossingen bieden daarnaast ook ondersteuning voor verschillende programmeertalen en frameworks. Architecten en ontwikkelaars kunnen dan de meest aangepaste programmeertaal en framework kiezen voor het type toepassing dat moet ontwikkeld worden, wat de productitiveit ten goede kan komen. Alhoewel het geen algemene eigenschap is van PaaS, is dit toch de moeite waard om te vermelden.</p>
<h3>Welke uitdagingen kunnen we verwachten?</h3>
<p>Uiteraard brengen PaaS-oplossingen ook een aantal uitdagingen met zich mee. Dit zijn een aantal aandachtspunten:</p>
<ul>
<li>Er moet over gewaakt worden dat ontwikkelaars zoveel mogelijk gebruik kunnen blijven maken van hun bestaande competenties, zowel op vlak van programmeertalen en frameworks, maar ook op vlak van de benodigde tools.</li>
<li>Om tot een zo hoog mogelijke graad van automatisatie te komen moeten een aantal services geïntegreerd worden in de PaaS-oplossing en als plug-and-play componenten kunnen aangeboden worden aan ontwikkelaars. Denk daarbij aan gebruikersbeheer en toepassingsmonitoring.</li>
<li>Het eenvoudiger maken van het leven van de ontwikkelaars zou geen extra belasting mogen teweegbrengen voor operations. Een PaaS-oplossing zou een win-win moeten zijn voor alle betrokkenen in het ontwikkelproces.</li>
<li>In hoeverre kan het deployment-proces geautomatiseerd worden in al zijn aspecten? Zijn de nodige deployment parameters beschikbaar voor bijvoorbeeld database-connecties of message queues? Moeten er configuratie-aanpassingen gebeuren op niveau van de infrastructuur?</li>
</ul>
<p>Het valt dus te bezien in hoeverre PaaS-platformen effectief tegemoet komen aan de vraag naar een hogere productiviteit in toepassingsontwikkeling. In ieder geval is de trend naar dergelijke platformen ingezet waarbij de focus ligt op automatisatie en standaardisatie die toelaat om als het ware een assembleerlijn te maken om toepassingen efficiënter te ontwikkelen en ze sneller te kunnen opleveren.</p>
<p>Hoewel de markt van PaaS-oplossingen nog in zijn kinderschoenen staat, zijn er vandaag al veel verschillende oplossingen beschikbaar, met elk hun eigen invalshoek. Dat is echter voer voor een volgende <a title="“as a Service”: een Waaier aan Mogelijkheden" href="/archives/6108">blogpost</a>.</p>
<p>Over aPaaS zijn een <a href="/publications/document?docid=100">Research Note</a> en <a href="/publications/document?docid=99">Presentatie</a> beschikbaar.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/productiviteitsverhoging-met-paas/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
