<?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>coding &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/coding/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Wed, 29 Apr 2026 08:59:04 +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>coding &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>&#8220;Vibe Coding&#8221; avec les IDE agentiques</title>
		<link>https://www.smalsresearch.be/vibe-coding-avec-les-ides-agentique/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 13 May 2025 11:35:51 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=22652</guid>

					<description><![CDATA[Les environnements de développement intégrés (IDE) agentiques font presque tout à votre place, comme si vous regardiez par-dessus l'épaule d'un programmeur tout en lui donnant des instructions. Bienvenue dans le monde du "Vibe Coding".]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<p><em><em>Dit artikel is ook beschikbaar in het&nbsp;<a href="/vibe-coding-met-agentic-ides/" data-type="post" data-id="22499">Nederlands</a>.</em></em></p>



<figure class="wp-block-image alignleft size-thumbnail is-resized is-style-default"><a href="/wp-content/uploads/2025/05/android.png"><img decoding="async" width="150" height="150" src="/wp-content/uploads/2025/05/android-150x150.png" alt="" class="wp-image-22544" style="width:213px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/android-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2025/05/android.png 268w" sizes="(max-width: 150px) 100vw, 150px" /></a></figure>



<p class="justify-text">Avez-vous déjà entendu parler du &#8220;Vibe Coding&#8221;&nbsp;? Il s&#8217;agit de programmer sans avoir à taper le code source. Un outil d&#8217;IA dans votre éditeur le fera pour vous ; il vous suffit de lui donner des instructions en langage naturel.</p>



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



<p class="justify-text">Cela semble trop beau pour être vrai&nbsp;? La vérité est actuellement quelque part entre les deux. Créer une application spécifique et complexe en partant de zéro est en effet encore un peu ambitieux. Il existe cependant des exemples d&#8217;applications web simples qui ont été construites à l&#8217;aide de simples descriptions textuelles soumises à un moteur d’IA générative et qui font ce qu&#8217;elles doivent faire. Dans cet article, nous explorons les &#8220;IDE agentiques&#8221;, l&#8217;outil d&#8217;IA qui permet de faire cela, et nous nous intéressons de plus près à un produit que j&#8217;ai récemment testé&nbsp;: WindSurf.</p>
</div>
</div>



<h2 class="wp-block-heading justify-text">Le buzz du moment&nbsp;: agentiques</h2>



<p class="justify-text">À mon avis, les agents sont actuellement le principal moyen de faire progresser l&#8217;IA. La construction d&#8217;une couche d&#8217;outils et de processus de réflexion utiles autour d&#8217;un <a href="/les-modeles-de-langue-open-source-une-alternative-a-chatgpt/" data-type="post" data-id="19808">LLM</a> (Large Language Model ou grand modèle de langage) offre encore beaucoup de potentiel, là où les modèles de langage purs commencent à se heurter à <a href="https://thenewstack.io/entering-ai-autumn-why-llms-are-nearing-their-limit/">certaines limites</a>.</p>



<p class="justify-text">Dans un <a href="/agents-ia-avantages-defis-et-cas-utilisation/" data-type="post" data-id="22578">précédent article de blog sur les agents</a>, mon collègue Bert a déjà brièvement expliqué ce qu&#8217;est un IDE agentique. En bref, un agent est un fragment d&#8217;IA qui peut effectuer toutes sortes de tâches de manière (semi-)autonome (comme éditer des fichiers texte, par exemple, ce qui est l&#8217;activité principale en programmation). Nous connaissons déjà les environnements de développement intégrés&nbsp;: il s&#8217;agit des logiciels que nous utilisons pour écrire du code, composés d&#8217;un éditeur de texte et de tous les outils supplémentaires possibles pour compiler, exécuter, refactoriser le code, etc. Mon IDE préféré, par exemple, est <a href="https://www.jetbrains.com/idea/">Intellij IDEA</a>.</p>



<p class="justify-text">Le terme <em>IDE agentique</em> désigne un IDE qui, parmi ses outils supplémentaires intégrés, comprend une fonctionnalité permettant à l&#8217;IA d&#8217;exécuter toutes sortes de tâches à votre place. En général, l&#8217;IDE affiche une fenêtre dans laquelle vous pouvez dialoguer avec l&#8217;IA, qui se met au travail dès que vous lui demandez quelque chose. La grande différence avec les assistants IA plus basiques réside dans le fait que l&#8217;agent peut utiliser pratiquement toutes les fonctionnalités de l&#8217;IDE&nbsp;: éditer toutes sortes de fichiers (pas nécessairement celui sur lequel vous travaillez à ce moment-là), compiler et exécuter le code, voire le déployer sur un serveur, exécuter des commandes dans le terminal, etc. Travailler de cette manière, en conversant simplement dans la fenêtre de dialogue et en laissant l&#8217;agent faire le reste, est ce que l&#8217;on appelle le &#8220;vibe coding&#8221;.</p>



<h2 class="wp-block-heading">Quelques Exemples</h2>



<p class="justify-text">Une petite recherche sur Internet nous permet de trouver rapidement plusieurs exemples d&#8217;IDE agentiques.</p>



<ul class="wp-block-list">
<li class="justify-text"><a href="https://bolt.new/">https://bolt.new/</a> fonctionne entièrement sur le web et permet de créer des applications web complètes à partir d&#8217;une invite. La plateforme est très populaire, même si plusieurs tentatives sont parfois nécessaires (et donc plutôt une conversation entière qu&#8217;une seule invite) pour obtenir le résultat souhaité. Ce site de commerce en ligne (qui n&#8217;est pas entièrement fonctionnel) a par exemple été construit après une conversation avec 5 invites de plus en plus complexes: <a href="https://starlit-melba-287efe.netlify.app/products">https://starlit-melba-287efe.netlify.app/products</a> .</li>



<li class="justify-text"><a href="https://github.com/features/copilot">GitHub CoPilot</a> est sans doute l&#8217;un des plus connus. Il donne un nouvel élan à l&#8217;IDE Visual Studio Code (VS Code) grâce à une IA qui travaille pour vous, un peu comme la programmation en binôme.</li>



<li class="justify-text"><a href="https://windsurf.com/editor">Codeium WindSurf</a>, un autre IDE agentique basé sur VS Code, sera présenté plus en détail ci-dessous. WindSurf est actuellement en cours d&#8217;acquisition par OpenAI.</li>



<li class="justify-text"><a href="https://www.cursor.com/">Cursor</a> est également un IDE basé sur VS Code et l&#8217;un des IDE agentique les plus connus et les plus populaires.</li>



<li class="justify-text"><a href="https://cline.bot/">https://cline.bot/</a> . Également basé sur VS Code, et open source.</li>



<li class="justify-text">La liste continue&nbsp;: Lovable, V0, Replit Agent, Devin, Trae, …</li>



<li class="justify-text">Le petit nouveau (disponible depuis quelques semaines seulement)&nbsp;:  <a href="https://www.jetbrains.com/junie/">IntelliJ Junie</a>. Il sera certainement intéressant pour nous de le tester plus en détail à l&#8217;avenir, car il est basé sur IntelliJ IDEA.</li>
</ul>



<h2 class="wp-block-heading">Testé&nbsp;: Codeium WindSurf</h2>



<p class="justify-text">Avant de commencer à tester WindSurf (anciennement Codeium), je n&#8217;avais pratiquement aucune expérience avec VS Code, l&#8217;IDE sur lequel Windsurf est basé, mais cela s&#8217;est avéré ne pas poser de problème&nbsp;! Une fois l&#8217;installation terminée, j&#8217;ai eu l&#8217;idée d&#8217;un test très simple&nbsp;: j&#8217;ai demandé à l&#8217;IDE de m&#8217;écrire un petit outil en Java, qui se connecterait à Confluence et lirait les données d&#8217;un tableau sur une page spécifique. L&#8217;outil devait ensuite transférer ces données dans un nouveau fichier Excel et l&#8217;enregistrer sur mon PC..</p>



<p class="justify-text">L&#8217;outil a bien démarré, mais il y avait quelques problèmes à surmonter. À titre d&#8217;exemple, la connexion à Confluence ne fonctionnait pas avec les identifiants que Windsurf m&#8217;avait demandés lors de notre conversation initiale. Après une petite recherche sur Confluence, j&#8217;ai compris comment la connexion au site devait fonctionner pour les outils programmés, et j&#8217;ai pu en informer WindSurf. L&#8217;IDE a rapidement apporté les modifications nécessaires et tout a fonctionné. Après une brève conversation pour obtenir quelques détails supplémentaires sur l&#8217;application afin qu&#8217;elle réponde à mes besoins, j&#8217;ai obtenu, en une heure environ, une version fonctionnelle de l&#8217;outil demandé.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/05/windsurf.png"><img fetchpriority="high" decoding="async" width="1024" height="603" src="/wp-content/uploads/2025/05/windsurf-1024x603.png" alt="" class="wp-image-22550" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-1024x603.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-768x452.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf.png 1229w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">L&#8217;IDE WindSurf en action</figcaption></figure>



<p class="justify-text">Un deuxième test, dans lequel j&#8217;ai demandé une application plus importante en plusieurs composants (serveur API + interface web, etc.), a été interrompu en raison d&#8217;un manque de crédits dans la version gratuite. Il s&#8217;est avéré qu&#8217;un IDE agentique perd ici un peu de sa vue d&#8217;ensemble et commet des erreurs en raison de la taille du projet.</p>



<p class="justify-text">Pour le troisième test, armé d&#8217;une licence commerciale et soutenu par un architecte compétent, je me suis mis au travail sur le code existant d&#8217;un projet Java assez ancien, avec une structure monolithique et des dépendances et méthodes obsolètes. Du moins, c&#8217;était une partie de l&#8217;équation. L&#8217;application est en cours de réécriture chez Smals, et une partie du nouveau code était déjà disponible. L&#8217;objectif du test était de permettre à WindSurf d&#8217;ajouter une fonctionnalité complète dans le nouveau code source, sur la base de tout le code existant (hérité + nouveau).</p>



<p class="justify-text">La nouvelle architecture de cette application était extrêmement modulaire (une architecture dite &#8220;oignon&#8221;) et nous avons dû ajuster régulièrement l&#8217;IDE, car il ne fournissait pas les ajouts et modifications appropriés dans tous les modules en même temps. À un moment donné, nous avons également dû l&#8217;aider manuellement à rechercher une fonctionnalité dans l&#8217;ancienne version du projet, afin de pouvoir la reprogrammer dans la nouvelle version. Finalement, après deux heures de &#8220;vibe coding&#8221;, nous avons ajouté la fonctionnalité, ce qui aurait autrement été une tâche fastidieuse et répétitive (mais impossible à automatiser de manière traditionnelle) pour un programmeur.</p>



<h2 class="wp-block-heading">Comment peut-on faire encore mieux&nbsp;?</h2>



<p class="justify-text">Comme nous avons pu le voir dans la section précédente, les IDE agentiques offrent de nombreuses possibilités pour raccourcir et automatiser en partie le travail de programmation, mais tout ne se passe pas toujours sans accroc, car l&#8217;agent se trompe, ne fait pas exactement ce que nous voulons ou oublie de faire certaines choses. Un peu comme un programmeur inexpérimenté, peut-être&nbsp;? Le problème se pose d&#8217;autant plus que le projet prend de l&#8217;ampleur.</p>



<p class="justify-text">Nous nous posons alors naturellement la question suivante&nbsp;: comment pouvons-nous améliorer cela&nbsp;? Nous ne sommes toutefois pas les seuls ; d&#8217;autres <a href="https://nmn.gl/blog/ai-understand-senior-developer">sur le web</a> ont déjà réfléchi à cette question et confirment ce que nous soupçonnions déjà&nbsp;: il faut fournir davantage de contexte et de meilleure qualité pour aider l&#8217;agent à comprendre ce que nous voulons réellement. Cela peut se faire de différentes manières&nbsp;: vous pouvez ajouter une liste de tâches à l’invite, et/ou vous pouvez fournir un fichier dans le projet, avec une liste d&#8217;instructions supplémentaires, et/ou vous pouvez ajouter dans chaque dossier d&#8217;un projet existant un fichier contenant des informations utiles sur ce dossier, et vous pouvez le faire de manière hiérarchique pour les sous-dossiers. Il s&#8217;agit en fait d&#8217;une sorte de signalisation de votre projet, adaptée à l&#8217;IA.</p>



<p class="justify-text">Bien sûr, fournir tout ce contexte représente beaucoup de travail. Mais ne vous inquiétez pas&nbsp;: il est probablement possible de laisser l&#8217;IA le faire elle-même dans une étape préparatoire. Il existe même déjà <a href="https://gigamind.dev/context">des outils commerciaux</a> à cet effet, qui agissent également comme des agents et utilisent également un LLM en arrière-plan.</p>



<p class="justify-text">Documenter le code existant et le rendre plus compréhensible de cette manière est utile pour un IDE agentique, mais aussi pour les développeurs humains&nbsp;! Ce sera la prochaine piste de recherche sur ce que l&#8217;IA peut apporter à la programmation…</p>



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



<figure class="wp-block-image alignleft size-full is-resized"><a href="/wp-content/uploads/2025/05/computers.png"><img decoding="async" width="576" height="864" src="/wp-content/uploads/2025/05/computers.png" alt="" class="wp-image-22553" style="width:239px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/computers.png 576w, https://www.smalsresearch.be/wp-content/uploads/2025/05/computers-200x300.png 200w" sizes="(max-width: 576px) 100vw, 576px" /></a></figure>



<p class="justify-text">Les IDE agentiques sont actuellement l&#8217;incarnation ultime de la programmation assistée par l&#8217;IA. Ils vont bien au-delà de la simple assistance et peuvent coder à votre place, comme si vous parliez à un développeur (inexpérimenté) qui effectue le travail à votre place. Le &#8220;Vibe Coding&#8221; pourrait bien prendre en charge une grande partie de notre travail dans un avenir proche&nbsp;!<br>La seule nuance, que nous devons toujours apporter à l&#8217;IA, c&#8217;est qu&#8217;il ne s&#8217;agit pas de magie&nbsp;: elle ne sait pas automatiquement ce qui doit être fait, et vous devrez l&#8217;ajuster et lui fournir un contexte. <em>Garbage in – Garbage out.</em><br>Il y a donc certainement encore matière à amélioration, mais vu la vitesse à laquelle la technologie évolue, cela pourrait bien arriver rapidement…</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>
</div>
</div>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Vibe Coding met Agentic IDEs</title>
		<link>https://www.smalsresearch.be/vibe-coding-met-agentic-ides/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 06 May 2025 11:27:50 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[agent]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=22499</guid>

					<description><![CDATA[Agentic IDE’s doen bijna alles in je plaats, alsof je achter de rug van een programmeur meekijkt op het scherm, terwijl je hem of haar instructies geeft. Welkom in de wereld van “Vibe Coding”.]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<p><em>Cet article est aussi disponible en <a href="/vibe-coding-avec-les-ides-agentique/">français</a>.</em></p>



<figure class="wp-block-image alignleft size-thumbnail is-resized is-style-default"><a href="/wp-content/uploads/2025/05/android.png"><img loading="lazy" decoding="async" width="150" height="150" src="/wp-content/uploads/2025/05/android-150x150.png" alt="" class="wp-image-22544" style="width:213px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/android-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2025/05/android.png 268w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a></figure>



<p class="justify-text">Had je al van &#8220;Vibe Coding&#8221; gehoord? Dit betekent dat je gaat programmeren zonder zelf effectief de broncode in te typen. Een AI tool in je editor zal dit voor jou doen; je moet deze enkel nog instructies geven in natuurlijke taal.</p>



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



<p class="justify-text">Klinkt dit te mooi om waar te zijn? Wel, de waarheid zit momenteel nog wat in het midden. Een specifieke en complexe toepassing bouwen, helemaal vanaf nul, is inderdaad nog wat hoog gegrepen. Maar er zijn voorbeelden van eenvoudige webtoepassingen die via een chat-prompt gebouwd werden en doen wat ze moeten doen. In deze blog-post verkennen we &#8220;Agentic IDEs&#8221;, de AI tool waarmee je dit kan doen en gaan we dieper in op een product dat ik onlangs heb getest: de WindSurf IDE.</p>
</div>
</div>



<h2 class="wp-block-heading justify-text">De rage van het moment: Agentic</h2>



<p class="justify-text">Agents zijn, naar mijn mening, momenteel de belangrijkste manier waarop AI vooruitgang boekt. Het bouwen van een laag van nuttige tools  en denkprocessen rondom een <a href="/open-source-taalmodellen-een-serieus-alternatief-voor-chatgpt/" data-type="post" data-id="19888">LLM</a> (Large Language Model) biedt nog erg veel ruimte voor potentieel, daar waar zuivere taalmodellen <em>op zich</em> stilaan op een <a href="https://thenewstack.io/entering-ai-autumn-why-llms-are-nearing-their-limit/">aantal limieten</a> botsen.</p>



<p class="justify-text">In een <a href="/ai-agents-voordelen-uitdagingen-en-usecases/" data-type="post" data-id="22407">vorige blogpost over Agents</a> legde mijn collega Bert reeds kort uit wat een Agentic IDE is. Kort herhaald: een zogenaamde <em>agent </em>is een stukje AI dat (semi-)autonoom allerlei zaken kan doen (zoals b.v. tekstbestanden editeren; de voornaamste bezigheid bij het programmeren). Een <em>Integrated Development Environment </em>of <em>IDE </em>kennen we reeds: dat is de software die we gebruiken om code te schrijven, bestaande uit een tekst editor en daarnaast alle mogelijke extra tools om de code te compileren, uit te voeren, te refactoren, &#8230; , noem maar op. Mijn favoriete IDE is b.v. <a href="https://www.jetbrains.com/idea/">Intellij IDEA</a>.</p>



<p class="justify-text">De term <em>Agentic IDE</em> slaat dan op een IDE, die, als een van de extra geïntegreerde tools, de functionaliteit zal bevatten om via het gebruik van AI allerlei zaken in jouw plaats te gaan doen. Typisch krijg je dan binnen de IDE een venster om te chatten met dit AI, en zal dit voor jou aan de slag gaan wanneer je er iets aan hebt gevraagd. Het grote verschil met de meer eenvoudige AI-assistants is dat de agent daarbij zowat alle functionaliteit van de IDE kan gebruiken: allerlei bestanden editeren (niet enkel het bestand waar je zelf op dat moment in werkt), de code compileren en runnen, of zelfs uitrollen op een server, terminal commando&#8217;s uitvoeren, enz. Op deze manier werken, door enkel in het chatvenster te praten en de agent de rest te laten doen, noemen we het zogenaamde <em>vibe coding</em>.</p>



<h2 class="wp-block-heading">Een paar voorbeelden</h2>



<p class="justify-text">Met een klein beetje zoekwerk op het internet vinden we algauw een aantal voorbeelden van Agentic IDEs.</p>



<ul class="wp-block-list">
<li class="justify-text"><a href="https://bolt.new/">https://bolt.new/</a> draait volledig op het web, en laat toe om volledige webtoepassingen te bouwen op basis van een prompt. Het platform is erg populair, zelfs al zijn er soms toch meerdere pogingen nodig (en dus toch eerder een hele conversatie dan één enkele prompt) om tot het beoogde resultaat te komen. Deze (niet volledig functionele) webshop, werd bijvoorbeeld na een conversatie met 5 complexer wordende prompts gebouwd: <a href="https://starlit-melba-287efe.netlify.app/products">https://starlit-melba-287efe.netlify.app/products</a> .</li>



<li class="justify-text">GitHub CoPilot is allicht een van de bekendste. Deze geeft de IDE Visual Studio Code (VS Code) een nieuw elan met een AI dat voor je werkt, een beetje zoals &#8220;pair programming&#8221;. <a href="https://github.com/features/copilot">GitHub Copilot Studio</a>.</li>



<li class="justify-text">Codeium WindSurf, nog een andere Agentic IDE gebaseerd op VS Code, bespreken we verderop in iets meer detail. <a href="https://windsurf.com/editor">https://windsurf.com/editor</a> . WindSurf wordt momenteel overgenomen door OpenAI.</li>



<li class="justify-text">Ook <a href="https://www.cursor.com/">Cursor</a> is een IDE gebaseerd op VS Code en één van de meer bekende en populaire Agentic IDEs.</li>



<li class="justify-text"><a href="https://cline.bot/">https://cline.bot/</a> . Gebaseerd op &#8211; opnieuw &#8211; VS Code, en open source.</li>



<li class="justify-text">De lijst gaat verder: Lovable, V0, Replit Agent, Devin, Trae, &#8230;</li>



<li class="justify-text"><em>New kid on the block</em> (pas sinds enkele weken algemeen beschikbaar): <a href="https://www.jetbrains.com/junie/">IntelliJ Junie</a>. Voor ons zeker interessant om in de toekomst nog verder uit te testen, aangezien hij is gebaseerd op IntelliJ IDEA.</li>
</ul>



<h2 class="wp-block-heading">Getest: Codeium WindSurf</h2>



<p class="justify-text">Voor ik begon te testen met Codeium&#8217;s IDE, had ik nauwelijks ervaring met VS Code, de IDE waar Windsurf op is gebaseerd; dit bleek echter geen probleem! Na de installatie kreeg ik een idee voor een erg eenvoudige test: ik vroeg de IDE om voor mij een kleine tool te schrijven in Java, die zou gaan inloggen op confluence en op een bepaalde pagina de gegevens van een tabel uitlezen. Vervolgens zou de tool deze data in een nieuw Excel bestand gieten en dit opslaan op mijn pc.</p>



<p class="justify-text">De tool schoot goed uit de startblokken, maar er waren enkele euvels te overkomen. Het inloggen in confluence werkte b.v. niet met de inloggegevens die Windsurf mij tijdens de initiële conversatie had gevraagd te voorzien. Na een kleine opzoeking op confluence zelf, had ik een idee van hoe het inloggen op de site moest werken voor geprogrammeerde tools, en kon ik dit aan WindSurf vertellen. De IDE maakte <em>prompt </em>de nodige wijzigingen en daarna werkte het wel. Na nog een kleine conversatie om wat details van de toepassing naar mijn wensen te krijgen, had ik, al bij al op een uurtje, een werkende versie van mijn gevraagde tool.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/05/windsurf.png"><img loading="lazy" decoding="async" width="1024" height="603" src="/wp-content/uploads/2025/05/windsurf-1024x603.png" alt="" class="wp-image-22550" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-1024x603.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-300x177.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf-768x452.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/windsurf.png 1229w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">De WindSurf IDE in actie</figcaption></figure>



<p class="justify-text">Een tweede test, waarbij ik een grotere toepassing vroeg in verschillende componenten (API server + web frontend, enz.), ben ik gestaakt wegens een gebrek aan credits in de gratis versie. Het bleek wel dat een agentic IDE hier wat het overzicht kwijtraakt en steken laat vallen door de omvang van het project.</p>



<p class="justify-text">Als derde test ging ik, gewapend met een commerciële licentie en ondersteund door een bekwame architect, aan de slag op bestaande code van een legacy project. Het betreft een vrij oud Java project met een monolitische structuur en verouderde afhankelijkheden en werkwijzen. Althans, dat was een deel van het gegeven. De toepassing wordt momenteel herschreven bij Smals, en een deel van de nieuwe code was ook reeds beschikbaar. Het doel van de test was om WindSurf een volledige feature te laten toevoegen in de nieuwe broncode, gebaseerd op al deze reeds bestaande code (legacy + nieuw).</p>



<p class="justify-text">De nieuwe architectuur van deze toepassing was extreem modulair (een zogenaamde onion architecture) en we moesten de IDE geregeld bijsturen omdat deze niet in alle modules tegelijk de juiste toevoegingen en wijzigingen voorzag. Op een bepaald moment moesten we hem ook manueel wat op weg helpen bij de zoektocht naar een stukje functionaliteit in de oude versie van het project, om dit te kunnen herimplementeren in de nieuwe versie. Maar al bij al hadden we na twee uur vibe coding de feature toegevoegd; iets wat anders een vervelend en repetitief (doch niet op een traditionele manier te automatiseren) karwei zou zijn voor een developer.</p>



<h2 class="wp-block-heading">Hoe kan het nu nóg beter?</h2>



<p class="justify-text">Zoals we in de vorige sectie zagen, bieden agentic IDEs heel wat mogelijkheden om programmeerwerk in te korten en deels te automatiseren, maar verloopt het toch niet altijd van een leien dakje, omdat de agent zich vergist, de dingen niet precies doet hoe we willen, of zaken vergeet te doen. Misschien een beetje zoals een onervaren programmeur? Het probleem stelt zich ook des te meer naarmate het project groter wordt.</p>



<p class="justify-text">We vragen ons dan uiteraard af: hoe kunnen we dit verbeteren? We zijn echter niet alleen; <a href="https://nmn.gl/blog/ai-understand-senior-developer">op het web</a> hebben reeds andere mensen hierover nagedacht, en deze bevestigen wat we reeds vermoedden: er moet meer en betere context worden voorzien om de agent wegwijs te maken in wat we eigenlijk willen. Dit kan op verschillende manieren: je kan een lijst zaken toevoegen aan de prompt, en/of je voorziet een bestand in het project, met een waslijst aan extra instructies, en/of je voegt in elke folder van een bestaand project een bestand toe met nuttige info over die folder, en je doet dit op een hiërarchische manier voor subfolders. Eigenlijk is dit een soort van bewegwijzering van je project, op maat van het AI.</p>



<p class="justify-text">Het is uiteraard wel een pak werk, al die context voorzien. Maar niet getreurd: het is waarschijnlijk goed mogelijk om het AI dit eerst zelf te laten doen in een voorbereidende stap. Ondertussen zijn er zelfs al <a href="https://gigamind.dev/context">commerciële tools hiervoor</a> te vinden, die eveneens als agents optreden en hiervoor op de achtergrond óók van een LLM gebruik maken.</p>



<p class="justify-text">Bestaande code documenteren en beter begrijpbaar maken op deze manier, is nuttig voor een Agentic IDE, maar ook voor menselijke developers! Dit wordt de volgende onderzoekspiste in wat AI kan doen voor het programmeren&#8230;</p>



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



<figure class="wp-block-image alignleft size-full is-resized"><a href="/wp-content/uploads/2025/05/computers.png"><img loading="lazy" decoding="async" width="576" height="864" src="/wp-content/uploads/2025/05/computers.png" alt="" class="wp-image-22553" style="width:239px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/computers.png 576w, https://www.smalsresearch.be/wp-content/uploads/2025/05/computers-200x300.png 200w" sizes="auto, (max-width: 576px) 100vw, 576px" /></a></figure>



<p class="justify-text">Agentic IDEs zijn momenteel de ultieme incarnatie van door AI geassisteerd programmeren. Ze gaan een stuk verder dan enkel assisteren en kunnen in jouw plaats coderen, alsof je tegen een (onervaren) developer praat en deze voor jou het werk doet. Vibe Coding kan in de nabije toekomst een heel stuk van ons werk overnemen!</p>



<p class="justify-text">De enige nuance, die we eigenlijk altijd moeten maken bij AI: het is geen magie, het weet niet vanzelf <em>precies </em>wat er moet gebeuren, en je zal moeten bijsturen en context geven. <em>Garbage in &#8211; Garbage out</em>.</p>



<p class="justify-text">Er is dus zeker nog ruimte voor verbetering , maar als we zien hoe snel de technologie evolueert, zou die wel eens snel kunnen komen&#8230;</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>
</div>
</div>


]]></content:encoded>
					
		
		
			</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 connaissance ou d&#8217;une expérience insuffisante 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 onvoldoende kennis of ervaring 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>&#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 blogpost.</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>
		<item>
		<title>A propos du code mort</title>
		<link>https://www.smalsresearch.be/a-propos-du-code-mort/</link>
		
		<dc:creator><![CDATA[Jean-Pierre Latour]]></dc:creator>
		<pubDate>Thu, 16 Feb 2012 13:46:08 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[complexity]]></category>
		<category><![CDATA[cost cutting]]></category>
		<category><![CDATA[Data Quality Tools]]></category>
		<category><![CDATA[Managing IT costs]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=3875</guid>

					<description><![CDATA[Le code mort est le code devenu inutile car plus jamais utilisé dans une application. Pourquoi du code mort&#160;? Lors des opérations de maintenance correctives ou évolutives les développeurs (disciplinés) créent assez spontanément une nouvelle version de leur code &#8230; mais n&#8217;élimine que trop (très) peu souvent le code devenu inutile. Au mieux est-il commenté, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><span id="more-3875"></span></p>
<p>Le code mort est le code devenu inutile car plus jamais utilisé dans une application.</p>
<p>Pourquoi du code mort&nbsp;? Lors des opérations de maintenance correctives ou évolutives les développeurs (disciplinés) créent assez spontanément une nouvelle version de leur code &#8230; mais n&#8217;élimine que trop (très) peu souvent le code devenu inutile. Au mieux est-il commenté, ce qui finira de toutes façons par constituer une gêne. Autre phénomène tout aussi fréquent&nbsp;: la désynchronisation des commentaires d&#8217;avec le code (ou comment apparaissent des commentaires eux-mêmes morts).</p>
<p>Le code mort rend le code utile plus confus et plus complexe, avec comme conséquence immédiate une augmentation des coûts de maintenance.</p>
<p>Selon certaines études le pourcentage de code mort se situerait entre 10 et 15% pour les applications de 5 ans d&#8217;âge, et entre 30 et 40% pour les applications au delà de 20 ans d&#8217;âge.</p>
<p>D&#8217;autres études situent le coût d&#8217;une ligne de code autour de 3 à 4 euros, tests compris. L&#8217;éradication du code mort peut donc constituer une belle économie sur le budget de maintenance.</p>
<p>L&#8217;intérêt pour l&#8217;éradication du code mort est encore plus vrai et immédiat dans le cas d&#8217;une migration. Confronté par exemple à l&#8217;abandon de son mainframe (voulu ou obligé) toute organisation aurait intérêt à se poser la question de l&#8217;opportunité d&#8217;une telle opération avant de se lancer dans la migration de son code. Que ce soit par la voie d&#8217;une traduction automatisée ou par réécriture.</p>
<p>Dans le premier cas la facturation se faisant généralement à la ligne de code l&#8217;explication est simple. Et à supposer que la balance entre la réduction du coût de la traduction et le coût de l&#8217;éradication du code mort ne soit pas positive , ou pas assez, la justification peut être facilement trouvée dans la volonté de profiter du moment de la migration pour réduire la dette technique (dont l&#8217;éradication du code mort est une composante importante).</p>
<p>Dans le second cas, la qualité des documentations étant habituellement ce que nous savons tous, éliminer le code mort ne pourra être que profitable lorsqu&#8217;il s&#8217;agit de &#8220;plonger&#8221; dans le code pour en rédécouvrir la finalité. Pas de temps perdu à la redécouverte de code inutile, et pas de parasitage sur la compréhension du code utile par le code inutile.</p>
<p>Une opération d&#8217;éradication du code mort se doit d&#8217;être automatisée. Des outils existent pour ce faire, tel que l&#8217;outil Kris de la firme Telebig, spécialisée dans la migration de systèmes legacy. Il est possible de télécharger une version gratuite qui vous permet de situer votre code mort mais pas de l&#8217;éliminer. Il semble que la solution devrait à terme être rendue disponible en mode SaaS.</p>
<p>L&#8217;éradication du code mort&nbsp;? Un outil de réduction des coûts, de gestion de la qualité et une source d&#8217;économie sans doute importante dans une opération de migration.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Waarom McDonalds niet synchroon werkt</title>
		<link>https://www.smalsresearch.be/waarom-mcdonalds-niet-synchroon-werkt/</link>
		
		<dc:creator><![CDATA[Johan Loeckx]]></dc:creator>
		<pubDate>Mon, 21 Nov 2011 08:57:12 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[asynchronous design]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=3479</guid>

					<description><![CDATA[De laatste tijd moet ik vaak de discussie voeren waarom traditioneel silo-based synchrone ontwerpen niet geschikt zijn voor schaalbare systemen.  Een systeem wordt schaalbaar genoemd als elke verdubbeling van de infrastructuur voor een gelijkaardige toename van het aantal parallelle requests zorgt, zonder verlies van performantie. Dit klinkt niet zo uitdagend? Dit kunnen we op de [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>De laatste tijd moet ik vaak de discussie voeren <strong>waarom traditioneel silo-based synchrone ontwerpen niet geschikt zijn voor schaalbare systemen</strong>.  Een systeem wordt schaalbaar genoemd als elke verdubbeling van de infrastructuur voor een gelijkaardige toename van het aantal parallelle requests zorgt, zonder verlies van performantie. Dit klinkt niet zo uitdagend? Dit kunnen we op de standaard manier bekomen?</p>
<p>Tijd dan voor een denkoefening: we gaan de klassieke manier van ontwerpen toepassen op de werking van een McDonalds restaurant&#8230;</p>
<h2><span id="more-3479"></span>Synchrone verwerking</h2>
<p>Bij McDonalds is <strong>de verwerking van de bestellingen ontkoppeld van het vervaardigen van de hamburgers.  </strong>Beeld u in dat een verkoper verantwoordelijk zou zijn voor de hele (verticale) keten.   Hij zou de bestelling opnemen, de hamburger klaarmaken,de afrekening geven en slechts dan de volgende klant bedienen.  Als deze handeling 5 minuten duurt, kun je met één verkoper 12 klanten kunnen bedienen per uur.</p>
<p>Hij zou niet weten dat de volgende bestelling identiek zou zijn.. Hij zou voortdurend van context moeten veranderen (handen wassen), geld in ontvangst nemen.   Ook zou er erg moeilijk samengewerkt kunnen worden tussen de verschillende verkopers. Niet echt efficiënt dus.</p>
<p>&nbsp;</p>
<h2>Geen concurrency control (volledige parallellisatie)</h2>
<p>Wat als je 24 klanten per uur wil bedienen? Per veelvoud van 12 moet er een extra verkoper aangeworven worden.  En wat als op een bepaald moment  deze 12 klanten tegelijk zouden aankomen?  De 12de zou een uur moeten wachten&#8230;</p>
<p>Maar wacht &#8212; deze verkoper kan misschien wel verschillende bestellingen tegelijk aannemen? (cf. multithreading) In het extreme geval wordt elke nieuwe bestelling meteen door een verkoper behandeld.  Hij is dan tegelijk bezig met het afhandelen van een betaling, het maken van een paar hamburgers, het opnemen van enkele bestellingen.  Iedereen ziet wel in dat de <strong>efficiëntie van deze verkoper drastisch zal dalen door deze &#8220;parallellisatie&#8221; &#8211;</strong>&#8211; hij beschikt immers slechts over beperkte resources (kan bv. maar N woorden per minuut schrijven &#8211; I/O)</p>
<p>Het is duidelijk dat er een <strong>optimale trade-off moet gevonden worden tussen de hoeveelheid parallellisatie</strong> (# tegelijk behandelde requests door een machine) <strong>en de grootte van de wachtrijen</strong>.  Stel dan nog dat je &#8220;oneindig&#8221; veel verkopers kunt aannemen&#8230; Op een bepaald moment is er een plaatsgebrek, niet?  Het evenwicht bevindt zich typisch niet aan een van de extremen en <strong>hangt af van de bezoekpatronen van de McDanolds</strong> &#8212;  misschien komen er nooit 12 mensen tegelijk aan?</p>
<p>&nbsp;</p>
<h2>Centraal register met recepten (centrale database)</h2>
<p>Omwille de kwaliteit te garanderen, stelt de chef-kok een centraal register op waarin beschreven staat hoe elke hamburger bereid moet worden.  Omdat de chef zeker wil zijn dat de juiste recepten gevolgd worden, is het een verplichting  om het register steeds te raadplegen voor het klaarmaken van een hamburger.  5 verkopers kunnen wel samen lezen, maar als de chef een wijziging aanbrengt, is het register niet meer zichtbaar.</p>
<p>Wat als er 50 verkopers een recept willen lezen? Of wat als er heel vaak wijzigingen gebeuren?  Hoeveel verkopers er ook aangeworven worden, de bottleneck bevindt zich op het centraal register.  En wat als iemand het register per ongeluk onleesbaar maakt?</p>
<p>&nbsp;</p>
<h2>Caching aan het eind van de keten</h2>
<p>Een ingrediënt voor een bepaald type hamburger is niet meer in stock.  Het is dus onmogelijk om deze hamburger te bereiden.   Omdat de verkoper echter geen korte-termijn geheugen heeft (geen cache), moet hij telkens het recept gaan opzoeken in het centraal register.  Hier haalt hij de ingrediënten op en vraagt of ze nog beschikbaar zijn.  Niet dus &#8212; de verkoper loopt terug naar de klant en brengt het spijtige nieuws. Hij loopt onnodig heen, en weer.</p>
<p>&nbsp;</p>
<h2>Bottom line</h2>
<p>Het is belangrijk om bepaalde ontwerp-reflexen in vraag te stellen. Vaak zijn het dogma&#8217;s die niet universeel geldig zijn en een serieuze performantie, beschikbaarheid en schaalbaarheidsimpact hebben.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Egoless Programming</title>
		<link>https://www.smalsresearch.be/egoless-programming/</link>
		
		<dc:creator><![CDATA[Johan Loeckx]]></dc:creator>
		<pubDate>Wed, 25 May 2011 08:30:56 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[egoless programming]]></category>
		<category><![CDATA[HR]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[recruitment]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[team work]]></category>
		<guid isPermaLink="false">http://blogs.smals-mvm.be/research/?p=2253</guid>

					<description><![CDATA[Misschien is het mijn grootvader die reeds lang geleden de belangrijkste regel in software development onthulde: over het huwelijk verkondigde hij namelijk steevast, &#8220;Een mens is niet gemaakt om alleen te leven, en vanaf twee maakt ge ruzie&#8220;. Of, het gezond omgaan met conflicten maakt een wezenlijk deel uit van elke relatie. Deze les geldt [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">Misschien is het mijn grootvader die reeds lang geleden de belangrijkste regel in software development onthulde: over het huwelijk verkondigde hij namelijk steevast,</p>
<p style="text-align: center;">&#8220;<em>Een mens is niet gemaakt om alleen te leven,<br />
en vanaf twee maakt ge ruzie</em>&#8220;.</p>
<p style="text-align: justify;">Of, het gezond omgaan met conflicten maakt een wezenlijk deel uit van elke relatie. Deze les geldt ook voor een professionele relatie: het ontwikkelen van een applicatie gebeurt immers steeds in team.  <strong>Het succes van het uiteindelijke resultaat is volgens mij dan ook meer een gevolg van een vlotte samenwerking dan van de individuele competenties</strong>.</p>
<p style="text-align: justify;"><span id="more-2253"></span></p>
<p style="text-align: justify;">Hoewel dit al reeds begin jaren &#8217;70 als cruciale succesfactor werd opgetekend, wordt het belang hiervan volgens mij onderkend, en wordt er (bijvoorbeeld tijdens aanwerving) teveel gefocused op technische competenties (die gemakkelijk aangeleerd worden als de nodige basis aanwezig is),<strong> </strong>In deze context stootte ik op het interessant artikel<strong> </strong>over<strong> &#8220;Egoless Programming&#8221;.</strong></p>
<p style="text-align: justify;">Voor meer informatie verwijs ik naar het artikel <a href="https://www.codinghorror.com/blog/2006/05/the-ten-commandments-of-egoless-programming.html" target="_blank"><em>The Ten Commandments of Egoless Programming</em></a> &#8211; ik herneem kort de tien geboden:</p>
<p style="text-align: justify;">
<p style="text-align: center;"><strong>&#8212; 1 &#8212;</strong><br />
Understand and accept that you will make mistakes.</p>
<p style="text-align: center;"><strong>&#8212; 2 &#8212;</strong><br />
You are not your code.</p>
<p style="text-align: center;"><strong>&#8212; 3 &#8212;</strong><br />
No matter how much &#8220;karate&#8221; you know,<br />
someone else will always know more.</p>
<p style="text-align: center;"><strong>&#8212; 4 &#8212;</strong><br />
Don&#8217;t rewrite code without consultation.</p>
<p style="text-align: center;"><strong>&#8212; 5 &#8212;</strong><br />
Treat people who know less than you<br />
with respect, deference, and patience.</p>
<p style="text-align: center;"><strong>&#8212; 6 &#8212;</strong><br />
The only constant in the world is change.</p>
<p style="text-align: center;"><strong>&#8212; 7 &#8212;</strong><br />
The only true authority stems from<br />
knowledge, not from position.</p>
<p style="text-align: center;"><strong>&#8212; 8 &#8212;</strong><br />
Fight for what you believe,<br />
but gracefully accept defeat.</p>
<p style="text-align: center;"><strong>&#8212; 9 &#8212;</strong><br />
Don&#8217;t be &#8220;the guy in the room.&#8221;</p>
<p style="text-align: center;"><strong>&#8212; 10 &#8212;</strong><br />
Critique code instead of people &#8212;<br />
be kind to the coder, not to the code.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
