<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alexandre Quercia</title>
    <description>The latest articles on DEV Community by Alexandre Quercia (@alquerci).</description>
    <link>https://dev.to/alquerci</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F995370%2Ffe9ca8b6-c048-4722-89f9-5e49a89846ad.jpg</url>
      <title>DEV Community: Alexandre Quercia</title>
      <link>https://dev.to/alquerci</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alquerci"/>
    <language>en</language>
    <item>
      <title>Learning Test - How to test adapters with behaviour?</title>
      <dc:creator>Alexandre Quercia</dc:creator>
      <pubDate>Tue, 02 Jan 2024 14:21:35 +0000</pubDate>
      <link>https://dev.to/alquerci/learning-test-how-to-test-adapters-with-behaviour-dca</link>
      <guid>https://dev.to/alquerci/learning-test-how-to-test-adapters-with-behaviour-dca</guid>
      <description>&lt;p&gt;"Learning Tests" is a kind of "Characterization Test" for third-party API.&lt;/p&gt;




&lt;h2&gt;
  
  
  My learning journey
&lt;/h2&gt;

&lt;p&gt;I had a dilemma:&lt;/p&gt;

&lt;p&gt;I need to be confident about the logic of a database “Adapter”, with test, but this kind of test are slow. There are not “plumbing test” as they test a behaviour. And this behaviour is a behaviour of a third-party API.&lt;/p&gt;

&lt;h3&gt;
  
  
  And I had many questions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How to name the test suite that holds “Adapter” behaviour?&lt;/li&gt;
&lt;li&gt;How to keep “Unit Test” ran very fast?&lt;/li&gt;
&lt;li&gt;How to keep “Integration Test” focus on plumbing, without behaviour?&lt;/li&gt;
&lt;li&gt;How to keep a sense between test suites?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  I read some
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;I read again the part talked about

&lt;ul&gt;
&lt;li&gt;“Learning Test” on chapter 8. Boundaries on “Clean Code” book wrote by Robert C. Martin&lt;/li&gt;
&lt;li&gt;“Integration Test” on chapter 8. Testing Strategies on “The Clean Code” book wrote by Robert C. Martin&lt;/li&gt;
&lt;li&gt;“Humble Objects” on chapter 4. Test Design on “Clean Craftsmanship” book wrote by Robert C. Martin&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.google.com/search?q=Jim+Newkirk+learning+test"&gt;https://www.google.com/search?q=Jim+Newkirk+learning+test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html"&gt;https://martinfowler.com/articles/practical-test-pyramid.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/IntegrationTest.html"&gt;https://martinfowler.com/bliki/IntegrationTest.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/ContractTest.html"&gt;https://martinfowler.com/bliki/ContractTest.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testing.googleblog.com/2010/12/test-sizes.html?m=1"&gt;https://testing.googleblog.com/2010/12/test-sizes.html?m=1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/SelfInitializingFake.html"&gt;https://martinfowler.com/bliki/SelfInitializingFake.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The result of my learning
&lt;/h2&gt;

&lt;p&gt;The technic I built need to be experimented on real life code base. It is not something that can be done on a "Kata".&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the technic?
&lt;/h3&gt;

&lt;p&gt;We want that a detected behaviour change on the third party API force us to propagate this changes to all dependent code. In other words, the "Unit Test" suite must fail.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make "Learning Tests" to characterize the behaviour of a third party API, as we expect to use it in our application.&lt;/li&gt;
&lt;li&gt;Make "Fake" to implements behaviour of "Learning Tests"
This "Fake" is a kind of cache for behaviour.&lt;/li&gt;
&lt;li&gt;On the "Adapter" "Unit Test" inject the "Fake"&lt;/li&gt;
&lt;li&gt;Execute "Learning Tests" periodically to check the "Fake" validity.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  How to make a "Learning Test"?
&lt;/h3&gt;

&lt;p&gt;We’re essentially doing controlled experiments that check our understanding of that API.&lt;/p&gt;

&lt;p&gt;It is common to experiment to learn about a library by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading the documentation examples&lt;/li&gt;
&lt;li&gt;checkout the code and execute in the console using debug tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kind of things should be done on controlled environment. And each learning are saved inside a test case that characterize one behaviour.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use this technic?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The "Adapter" have a bit of behaviour
We want that our "Adapter" to be an "Humble Object", it is too simple to bother testing.
For example, when the "Adapter" need to transform third party API response.&lt;/li&gt;
&lt;li&gt;When the third party API is stateful, two different responses for the same request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  In practice
&lt;/h3&gt;

&lt;p&gt;One kind of "Fake" for a database like service have many versions.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Ours applications should be resilient to failure.&lt;br&gt;
The "Adapter" layer is subject to failure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The database may be unavailable =&amp;gt; &lt;code&gt;OutageFakeDatabase&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Access may be denied =&amp;gt; &lt;code&gt;AccessDeniedFakeDatabase&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Glossary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;"Learning Tests" - look at the &lt;a class="mentioned-user" href="https://dev.to/taylorsilva"&gt;@taylorsilva&lt;/a&gt;'s &lt;a href="https://dev.to/taylorsilva/learning-tests-11fe"&gt;post&lt;/a&gt;.
He did a nice in practice example.&lt;/li&gt;
&lt;li&gt;"Characterization Test"&lt;/li&gt;
&lt;li&gt;“Adapter”&lt;/li&gt;
&lt;li&gt;“plumbing test”&lt;/li&gt;
&lt;li&gt;“Unit Test”&lt;/li&gt;
&lt;li&gt;“Integration Test”&lt;/li&gt;
&lt;li&gt;“Humble Objects”&lt;/li&gt;
&lt;li&gt;"Fake"&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>testing</category>
    </item>
    <item>
      <title>Dérisquer, ce n'est pas seulement planifier votre futur</title>
      <dc:creator>Alexandre Quercia</dc:creator>
      <pubDate>Mon, 05 Jun 2023 16:29:24 +0000</pubDate>
      <link>https://dev.to/alquerci/derisquer-est-ce-seulement-planifier-mon-futur--4bco</link>
      <guid>https://dev.to/alquerci/derisquer-est-ce-seulement-planifier-mon-futur--4bco</guid>
      <description>&lt;p&gt;Vous dérisquez en planifiant votre futur, mais vous oubliez que le futur est imprévisible.&lt;/p&gt;

&lt;p&gt;Les prévisions météo sont-elles exactes ?&lt;br&gt;
Regardez vous-même sur le site de météo France. Plus vous regardez vers le futur, moins il y a de précision.&lt;/p&gt;

&lt;p&gt;Imaginez...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chaque jour, vous résolvez un problème.&lt;/li&gt;
&lt;li&gt;Vous investissez petit et à très court terme.&lt;/li&gt;
&lt;li&gt;Vous répondez rapidement au besoin de vos clients.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous vous demandez :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Comment puis-je atteindre ce niveau de performance ?&lt;br&gt;
Comment puis-je améliorer mes chances de succès ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’analogie qui suit n’est pas entièrement exacte, mais s’en rapproche suffisamment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Une fine tranche de jambon, pour dérisquer sans gaspiller
&lt;/h2&gt;

&lt;p&gt;Comment Bill le boucher a répondu au besoin de Martine, la mère au foyer ?&lt;/p&gt;

&lt;p&gt;En ce jour ensoleillé de mai, Martine se rend à la boucherie de son quartier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bonjour monsieur, je souhaiterais vous acheter un jambon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bill lui fait une proposition.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bonjour madame, est-ce qu'une fine tranche de jambon ibérique, vous irez ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Martine fait confiance à Bill et accepte sa proposition.&lt;/p&gt;

&lt;p&gt;Trois jours plus tard, Martine retourne voir Bill. Elle lui donne son avis sur le jambon.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le jambon que je vous ai acheté il y a trois jours est trop épicé. Avez-vous un autre à me proposer ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bill lui répond avec amabilité.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Chère madame, je peux vous proposer un serrano, c'est le jambon le plus doux que j'ai actuellement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Martine est heureuse d'avoir le choix.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Merci monsieur, je vous en prends une tranche bien fine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bill accueil chaleureusement le choix de Martine&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Je vous prépare votre tranche, bien fine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bill, à l'aide de son opinel étincelant, découpe verticalement une fine tranche de serrano.&lt;br&gt;
Puis lave son couteau et son plan de travail, prêt pour la prochaine utilisation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Voici votre tranche de serrano, bien fine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bill aurait pu proposer à Martine, du cheval ou un pâté en croute. Alors qu'elle souhaitait un jambon qu'elle aime.&lt;/p&gt;

&lt;p&gt;Le métier de Développeur est similaire à celui de Bill qui découpe le bloc de jambon, à l'aide de son couteau opinel tout propre, il réalise de fines tranches pour Martine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mais alors, comment dérisquer efficacement ?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Découper finement en tranche utilisable par celui ou celle qui en aura l'usage (on l'appellera, l'utilisateur)&lt;/li&gt;
&lt;li&gt;Ordonner les tranches&lt;/li&gt;
&lt;li&gt;Livrer la 1ʳᵉ tranche&lt;/li&gt;
&lt;li&gt;Vérifier si ça répond au besoin/problème de l'utilisateur&lt;/li&gt;
&lt;li&gt;Continuer à la 1ʳᵉ étape.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Frédéric Leguédois nous l'explique en répondant à une question posée lors du meetup de Software Craft Romandie.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Comment est-ce qu'on fait pour gérer les aspects réglementaires ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.youtube-nocookie.com/embed/hy87q2kZ6y8?rel=0&amp;amp;start=2126&amp;amp;end=2306"&gt;Regarder l'extrait vidéo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Allen Holub nous l'explique en 17 secondes&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Commencez par parler à vos clients et découvrez ce dont ils ont besoin.&lt;/li&gt;
&lt;li&gt;Coupez-en un petit morceau, construisez-le et livrez-le.&lt;/li&gt;
&lt;li&gt;Obtenez des feedbacks de vos clients.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.youtube-nocookie.com/embed/HZyRQ8Uhhmk?rel=0&amp;amp;start=1623&amp;amp;end=1640"&gt;Regarder l'extrait vidéo&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus, il faut aussi comprendre son besoin
&lt;/h2&gt;

&lt;p&gt;Pour y arriver sans tâtonner ou « prendre le périphérique parisien », le Développeur a besoin de comprendre le besoin de l'utilisateur.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pour recevoir, il faut donner. Si vous voulez que quelqu'un réponde à votre besoin, vous devez commencer par répondre à son besoin.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Le besoin d'un Développeur est de comprendre votre besoin.&lt;/p&gt;

&lt;p&gt;Ce qui vous permettra de trouver ensemble une solution adaptée à votre besoin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus disruptif, faire confiance
&lt;/h2&gt;

&lt;p&gt;Faites confiance aux personnes pour faire leur travail.&lt;/p&gt;




&lt;p&gt;Je vous invite à voir mes écrits, non pas comme une opinion statique, mais comme un flux de pensées attrapées en plein milieu de leur mise à jour.&lt;/p&gt;

</description>
      <category>french</category>
    </item>
    <item>
      <title>Stop waiting for backend</title>
      <dc:creator>Alexandre Quercia</dc:creator>
      <pubDate>Fri, 30 Dec 2022 16:59:12 +0000</pubDate>
      <link>https://dev.to/alquerci/stop-waiting-for-back-end-1ale</link>
      <guid>https://dev.to/alquerci/stop-waiting-for-back-end-1ale</guid>
      <description>&lt;h2&gt;
  
  
  How to remove dependencies between tasks?
&lt;/h2&gt;

&lt;p&gt;Two factories produce two times more products than only one in a period. In software development, this does not apply, and can be worse. How, two programmers in a team, can get closer or even outperform this level of output?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Chapter 1 An example&lt;/li&gt;
&lt;li&gt;
Chapter 2 Decide a boundary between two tasks to enable parallel work.&lt;/li&gt;
&lt;li&gt;
Chapter 3 While increase the communication among team members.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This post will not say that your team should focus only on output, as the outcome is even more important.&lt;/p&gt;

&lt;p&gt;This post will provide you with guidelines to maximize your teamwork. It will explain the most important concepts to avoid dependencies instead of managing them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lets starts in practice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisite
&lt;/h3&gt;

&lt;p&gt;Given a component with a dependency like the GUI or the database.&lt;/p&gt;

&lt;p&gt;In order to test a component with only a boundary definition, we need the ability to mock a boundary and its behavior.&lt;/p&gt;

&lt;p&gt;Let's assume the prerequisites are met.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does all this play out in practice?
&lt;/h3&gt;

&lt;p&gt;Given "A" and "B" seems to be dependent tasks.&lt;/p&gt;

&lt;p&gt;Firstly, we ask ourselves the following question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is it possible to define a boundary between A and B?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The answer must have 5 minutes timeout.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  If it is possible to define a boundary between "A" and "B"
&lt;/h4&gt;

&lt;p&gt;Then, we add a task "C" to implement this boundary.&lt;/p&gt;

&lt;h4&gt;
  
  
  If no boundary can be drawn yet
&lt;/h4&gt;

&lt;p&gt;Then, merge both tasks in one and starts implementing in pair or "mob programming".&lt;/p&gt;




&lt;p&gt;What are the concepts behind this?&lt;/p&gt;

&lt;h2&gt;
  
  
  Architectural concepts
&lt;/h2&gt;

&lt;p&gt;To enable parallel work on tasks without interfering, use the simple design principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;High-level policies are ignorant of low-level details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;— Quote from the book "Clean Craftsmanship: Disciplines, Standards, and Ethics (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In practice, this principle is applied by drawing a boundary between components. Therefore, a task needs to focus on a single component.&lt;/p&gt;

&lt;h3&gt;
  
  
  Boundary drawing
&lt;/h3&gt;

&lt;p&gt;Between high and low level components, a boundary is drawn. It's like an electrical outlet with a male plug on one side and a female plug on the other.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The male socket plugs into the female socket.&lt;/li&gt;
&lt;li&gt;The male plug completely ignores what is plugged in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So with business rules, database and GUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The database plugs into the business rules.&lt;/li&gt;
&lt;li&gt;The GUI plugs into the business rules.&lt;/li&gt;
&lt;li&gt;Business rules completely ignore the database and the GUI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look at this diagram, both arrows cross the boundary and point to business rules.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tips, when drawing a diagram, it is recommended to place high-level rules above low-level details. Therefore, all arrows will point upwards. Then, It is easy to detect a wrong dependency direction.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei6hf7y2hyx5cr9qhrnk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fei6hf7y2hyx5cr9qhrnk.png" alt="Plug-ins and business rules" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's avoid rebuild the wheel, as Robert C. Martin done a perfect description.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Software architecture is the art of drawing lines that I call boundaries. Those boundaries separate software elements from one another, and restrict those on one side from knowing about those on the other. Some of those lines are drawn very early in a project’s life—even before any code is written. Others are drawn much later. Those that are drawn early are drawn for the purposes of deferring decisions for as long as possible, and of keeping those decisions from polluting the core business logic.&lt;/p&gt;

&lt;p&gt;Recall that the goal of an architect is to minimize the human resources required to build and maintain the required system. What it is that saps this kind of people-power? Coupling—and especially coupling to premature decisions.&lt;/p&gt;

&lt;p&gt;Which kinds of decisions are premature? Decisions that have nothing to do with the business requirements—the use cases—of the system. These include decisions about frameworks, databases, web servers, utility libraries, dependency injection, and the like. A good system architecture is one in which decisions like these are rendered ancillary and deferrable. A good system architecture does not depend on those decisions. A good system architecture allows those decisions to be made at the latest possible moment, without significant impact.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Boundary crossing
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;At runtime, a boundary crossing is nothing more than a function on one side of the boundary calling a function on the other side and passing along some data. The trick to creating an appropriate boundary crossing is to manage the source code dependencies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  When a low-level client invokes a higher-level service.
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;The simplest possible boundary crossing is a function call from a low-level client to a higher-level service.&lt;/p&gt;

&lt;p&gt;In figure below, the flow of control crosses the boundary from left to right. The &lt;code&gt;Client&lt;/code&gt; calls function &lt;code&gt;f()&lt;/code&gt; on the Service. It passes along an instance of &lt;code&gt;Data&lt;/code&gt;. The &lt;code&gt;&amp;lt;DS&amp;gt;&lt;/code&gt; marker simply indicates a data structure. The &lt;code&gt;Data&lt;/code&gt; may be passed as a function argument or by some other more elaborate means. Note that the definition of the &lt;code&gt;Data&lt;/code&gt; is on the &lt;em&gt;called&lt;/em&gt; side of the boundary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl28yezjun7iws0u7wc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyl28yezjun7iws0u7wc4.png" alt="Flow of control crosses the boundary from a lower level to a higher level" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Quote and image from the book "Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  How to test?
&lt;/h5&gt;

&lt;p&gt;Let's take the example of adding proof to ensure the GUI Controller work as it should.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Testing the controller is trivial, our tests simply invoke events through the event handler interface and then make sure that the controller builds the right request model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;— Quote from the book "Clean Craftsmanship: Disciplines, Standards, and Ethics (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It needs to mock the higher-level service in order to spy and assert on the request model passed. And also stub the higher-level service to tests the usage of outbound data.&lt;/p&gt;

&lt;h4&gt;
  
  
  When a high-level client invokes a lower-level service
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;When a high-level client needs to invoke a lower-level service, dynamic polymorphism is used to invert the dependency against the flow of control.&lt;/p&gt;

&lt;p&gt;In figure below, the flow of control crosses the boundary from left to right as before. The high-level &lt;code&gt;Client&lt;/code&gt; calls the &lt;code&gt;f()&lt;/code&gt; function of the lower-level &lt;code&gt;ServiceImpl&lt;/code&gt; through the &lt;code&gt;Service&lt;/code&gt; interface. Note, however, that all dependencies cross the boundary from right to left &lt;em&gt;toward the higher-level component&lt;/em&gt;. Note, also, that the definition of the data structure is on the calling side of the boundary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9h6g7eenk8plt1irnvc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9h6g7eenk8plt1irnvc.png" alt="Crossing the boundary against the flow of control" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Quote and image from the book "Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  How to test?
&lt;/h5&gt;

&lt;p&gt;Let's take the example of adding proof to ensure the database GatewayImpl work as it should.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Testing the database is trivial. You create a suitably simple test database, and then you call each query function of the GatewayImpl from your tests and ensure that it has the desired effect on that test database. Make sure that each query function returns a properly loaded set of business objects. Make sure that each update, add, and delete changes the database appropriately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;— Quote from the book "Clean Craftsmanship: Disciplines, Standards, and Ethics (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The result of the simple design principle
&lt;/h3&gt;

&lt;p&gt;With boundaries between components, we can remove dependencies not bound to a boundary. We can build something like an onion with some levels. But be careful, when there are too many levels, one modification made on the highest level will may require the modification of all dependents.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tips, try to avoid using more than two levels.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How boundaries emerge?
&lt;/h2&gt;

&lt;p&gt;There are at least 2 ways to get emerging a boundary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During the implementation&lt;/li&gt;
&lt;li&gt;With a dedicated task to draw the boundary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best way is to start coding and let emerging boundary. Time go on, programmers gather experience and are able to design boundaries before coding using heuristics.&lt;/p&gt;

&lt;p&gt;Keep in mind that boundaries must be able to move as easy as changing shirts. This allows for mistakes, and makes them inexpensive. How to allow for mistakes?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can you prevent harm to the structure of your code if you don’t have the tests that allow you to clean it? And how can you guarantee that your test suite is complete if you don’t follow the three laws of test-driven development (TDD)?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;— Quote from the book "Clean Craftsmanship: Disciplines, Standards, and Ethics (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Lets explain the first way.&lt;/p&gt;

&lt;h3&gt;
  
  
  Boundaries emerge during implementation
&lt;/h3&gt;

&lt;p&gt;The implementation starts with nothing, but it quickly achieves a simple behavior. Each time a new test case passes, the complexity of the production code increase unless the structure is improved. During theses improves, the boundaries emerge.&lt;/p&gt;

&lt;p&gt;The first step is to draw the boundary line.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With a function call&lt;/li&gt;
&lt;li&gt;With an HTTP request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second step is to describe the inbound and outbound data that will cross the boundary.&lt;/p&gt;

&lt;p&gt;Add an argument to the function call.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name it well&lt;/li&gt;
&lt;li&gt;Add a data type to it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When there are more than 2 arguments, it is time to create a data structure.&lt;/p&gt;

&lt;p&gt;I wish you happy drawing, this principle is the first step to increase your productivity. The second step will be to increase the communication.&lt;/p&gt;




&lt;h2&gt;
  
  
  Communication between team members
&lt;/h2&gt;

&lt;p&gt;How can you make progress on a task if you do not have feedback on about choices made? And how to have a feedback loop without increasing your communication?&lt;/p&gt;

&lt;p&gt;Your brain have high difficulties to focus on a single task. As the task switching effect is too easy to practice as your unconscious do it himself.&lt;/p&gt;

&lt;p&gt;As an example, while you are working and focus on a task, but someone asks you a question related to another topic. You ask him that you will answer later. When you come back to your task, your unconscious thinks about that question. Therefore, you just lost 20% of your efficiency.&lt;/p&gt;

&lt;p&gt;Working together on the same topic, aka &lt;a href="https://www.scruminc.com/swarming-instantly-boost-scrum-team-productivity/" rel="noopener noreferrer"&gt;swarming&lt;/a&gt;, enables better communication and reduces task switching effects.&lt;/p&gt;

&lt;p&gt;So to increase communication with your teammate, you need to work on the same topic as him. Therefore, questions will not be on another topic. And you will not be afraid to disturb him.&lt;/p&gt;

&lt;p&gt;In practice, all programmers are in constant communication — Open Space or video — in order to answer any questions as quickly as possible or even help to ensure that boundaries are well understood.&lt;/p&gt;

&lt;p&gt;This high communication level is the key of adaptation. Therefore, boundaries can evolve over the learns carry out during the implementation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summarize in image
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukjgv6trbzjq4iz0ax4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukjgv6trbzjq4iz0ax4e.png" alt="Wrap Up" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  And now the conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Even in a monolithic, statically linked executable, this kind of disciplined partitioning can greatly aid the job of developing, testing, and deploying the project. Teams can work independently of each other on their own components without treading on each other’s toes. High-level components remain independent of lower-level details.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;— Quote from the book "Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☯ The yin
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Pairs to implements the highest-level component

&lt;ul&gt;
&lt;li&gt;Draw boundary line&lt;/li&gt;
&lt;li&gt;Define how to cross the boundary&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dispatching the work force: &lt;em&gt;enables parallel work&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;One guy work on the Database&lt;/li&gt;
&lt;li&gt;One guy work on the GUI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ☯ The yang
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Pairs to draw boundaries&lt;/li&gt;
&lt;li&gt;Dispatching the work force: &lt;em&gt;enables parallel work&lt;/em&gt;

&lt;ul&gt;
&lt;li&gt;One guy work on the highest-level&lt;/li&gt;
&lt;li&gt;One guy on the GUI&lt;/li&gt;
&lt;li&gt;Once one guy is finish a component, then switch on the Database&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;☯ Mixing the yin and yang in order to reach your efficiency with your formula.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tips
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;At the beginning it will feel slow, be disciplined and practice.&lt;/li&gt;
&lt;li&gt;Never, never force your teammates applying a practice.&lt;/li&gt;
&lt;li&gt;Create your own formula, depending on your team and your context.&lt;/li&gt;
&lt;li&gt;Invite all team members to practice each step.&lt;/li&gt;
&lt;li&gt;Practice as a team, practice, and practice as a team.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Appendices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Usage of term "boundary"
&lt;/h3&gt;

&lt;p&gt;The term "boundary" has been used instead of "interface" in order to mark greater separation and isolation between components.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usage of term "task"
&lt;/h3&gt;

&lt;p&gt;The term "task" represent what we call a technical task, which is a subtask of a &lt;a href="https://scrumguides.org/scrum-guide.html#increment" rel="noopener noreferrer"&gt;Sprint Backlog item, which is a Product increment&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A technical task has no value outside the context in which it takes place. As soon as it no longer contributes to answer the need, it no longer has a reason to exist. It is only a means, and not an end in itself.&lt;/p&gt;

&lt;p&gt;Don't hit the mistake to forget the end goal and getting bogged down in code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Outcome over output
&lt;/h3&gt;

&lt;p&gt;This post does not say that a product team should focus only on output, as the outcome is more. On this topic, I suggest reading about agile context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Read the book "Clean Architecture: A Craftsman's Guide to Software Structure and Design (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/li&gt;
&lt;li&gt;Read blog post: &lt;a href="https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html" rel="noopener noreferrer"&gt;The Clean Architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch video: &lt;a href="https://www.youtube.com/watch?v=o_TH-Y78tt4" rel="noopener noreferrer"&gt;The Principles of Clean Architecture by Uncle Bob Martin&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Craftsmanship
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Read the &lt;a href="https://manifesto.softwarecraftsmanship.org/" rel="noopener noreferrer"&gt;Manifesto for Software Craftsmanship&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Read the book "Clean Craftsmanship: Disciplines, Standards, and Ethics (Robert C. Martin Series) (English Edition)" wrote by Robert C. Martin&lt;/li&gt;
&lt;li&gt;Watch the video: &lt;a href="https://www.youtube.com/watch?v=17vTLSkXTOo" rel="noopener noreferrer"&gt;Uncle Bob Martin - The Craftsman's Oath at SC London Conference 2018&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch the video: &lt;a href="https://www.youtube.com/watch?v=AoIfc5NwRks" rel="noopener noreferrer"&gt;The Three Laws of TDD&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Task switching
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Read the blog post: &lt;a href="https://www.scruminc.com/swarming-instantly-boost-scrum-team-productivity/" rel="noopener noreferrer"&gt;Swarming: How To Instantly Boost Your Scrum Team’s Productivity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Reading the about the pattern: &lt;a href="https://sites.google.com/a/scrumplop.org/published-patterns/product-organization-pattern-language/development-team/swarming--one-piece-continuous-flow" rel="noopener noreferrer"&gt;Swarming: One-Piece Continuous Flow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch the video: &lt;a href="https://www.youtube.com/watch?v=Yqi9Gwt-OEA" rel="noopener noreferrer"&gt;Henrik Kniberg : Multiple WIP vs One Piece Flow Example&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Agile context
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://agilemanifesto.org/" rel="noopener noreferrer"&gt;Agile Manifesto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://agilemanifesto.org/principles.html" rel="noopener noreferrer"&gt;Principles behind the Agile Manifesto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scrumguides.org/scrum-guide.html" rel="noopener noreferrer"&gt;Scrum Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Diagrams
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://viewer.diagrams.net/index.html?tags=%7B%7D&amp;amp;highlight=0000ff&amp;amp;edit=_blank&amp;amp;layers=1&amp;amp;nav=1#R3VfbcpswEP0aPzZjIcTlMbZzaSeZdpJ2Ej8qIIMaQIxYfOnXV0ICjMmlnUmaNOMHs2cXaXX27AITPM%2B3Z5KW6aWIWTZxpvF2ghcTx0EudtWfRnYG8UNigETy2Ab1wDX%2FxSw4tWjNY1YNAkGIDHg5BCNRFCyCAUalFJth2Epkw11LmrARcB3RbIze8BhSgwaO3%2BPnjCdpuzPyQuPJaRtsT1KlNBabPQifTPBcCgHmKt%2FOWabJa3kx950%2B4u0Sk6yAP7lh6X69%2FY6u1uV5sprdLC83t8WXT8gus6ZZbU9ss4VdS8GaSeCKkQt6x7JvouLARaFcdwJA5BM8awOOM55oB4hSoSnkmTKQulRHL%2FVi%2BTbRKjm6oxWPjqiMtA%2BohOMiaXabHmHi4yDAxHM8hD3kqghWxL2fkJD4%2FtQlmOCp%2Blf%2BlSjACqeJr0CKezYXmZDNAXA41z%2BThylBk9Q9gyi1RlTLNTvlALxILPSTJ2ZTp1uzVUCgEMubOjrbPloR1NVZNQgTOQO5UyH2BhfZ5rC9gUIrlU2vtA5L91VGLEitupNu7V4A6sJq4C%2F0EL4zObguclDgq7mB0RQ73qEcPJ8QHLq%2BF3jI83znf5YDbmfeU3Lw%2F6kcnJEcZnXFC1ZVV3WmxvKhNrrKirjW2IxaDWRsBZq3kkaK0ovGWqiB1UdEiiUmH5BPzuO4WasprN0LPVDolyiBPyxBN7z3S0AeKMGrVcAbcSxFXcRM36PpExJSkYhC9aPQfWa0ygB2lhpagxi2n%2BJC7m6b9nFIay%2F3nYutXd1YO2sdEq47UT9ilS1KVhjklOsDNvHDLnGMv13AaZt9H2BbDiYzYq1lm4m67tPSRpuVIYjFo%2Bf4QdEViaKWEXuCbGxfMKhMGDzXFmMRSZZR4OthHi%2BuCDzqybMfnz9cJ3YdZTsRB2%2Fdie6I9wUFqp5d7MOR74bvjXzyqmPQf9Ux%2BNzQG49J8xJk1yxEwd5%2BNLpvOxqV2X8pNb6970188hs%3D" rel="noopener noreferrer"&gt;Plug-ins and business rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://viewer.diagrams.net/?tags=%7B%7D&amp;amp;highlight=0000ff&amp;amp;edit=_blank&amp;amp;layers=1&amp;amp;nav=1#R7VpbU%2BIwFP41POqQpGngccXrjo6OuzvqvsU2lKxtw4Rw21%2B%2FCU0opVVxFajg8EDPye3ky5ecc9o0UCeZnEna712JkMUN2AwnDXTcgBB4yNN%2FRjPNNKSNM0UkeWgr5Yof%2FC%2BzyqbVDnnIBoWKSohY8X5RGYg0ZYEq6KiUYlys1hVxcdQ%2BjVhJ8SOgcVl7x0PVy7QtSHL9OeNRz40M%2FHZWklBX2c5k0KOhGC%2Bo0EkDdaQQKntKJh0WG%2FAcLlm702dK54ZJlqpVGjx41%2Fc%2Fwe2ofx51j%2B4ersb36fcDYLsZ0XhoZ2ytVVMHwYhJxTUil%2FSRxTdiwBUXqS56FEqJpIGOXIVvMY9MgRJ9re2pJNYC0I966n3TWTKJDEsOH%2BmAB4dUBqZMUam%2BpdFstOYhwgS1Wgj70AfIB56uwdIwL8e4jQlpehhh1NT%2FurwrUmWJM6s%2FUFI8sY6IhZxNALU75pfZkS3BzKgnpoKeFYKhHLFTrhRPI6v6w6NsUDjv0zGgpTVl%2BB2UGg02WVDZ5ThjImFKTnUVW%2BphSw27N0DbyuOcaXNdb5FlriG17I7mfecE0A%2BWA2%2FgAyzR4VwPe3DJRmZfLxFjvqwiHBrdEbUEiFlXGdD6NNB4Xs6kY03PvEagUWOygjsJD8NZX7NVtWOBilX%2BAPwRKeI%2F36qL%2BOMK%2FNcGPyrBf%2FbrYudwh80i7qi1bdy9Eu7HVFF9TLGdAx%2BTuoGPSxhLMUxDZtoY%2BIRUPRGJVHsgYTxLdjozpaYWGjpUouhwNDxyej9zGAQ7%2BWGx8Hhie8%2BkqZWWATe%2Bx0QRWhZ9lmaaU24maFu7mAVA58yKikW%2FMa%2Fi%2BkxFapadTbjKrMVWenD96%2BfcVCM4S5%2BlwkAMZcBeJ7u2I2LqdV%2FAwkKEVCaWZDFVfFQMmN7Dkqen36TLft7C4Jd%2FL6bdx2RyffAVqLwrUCkdEBXcef7Ahl7xzMCbDFQq6VAOVLZLB88DELSITnAQaCLoL9PBJxijtkf8lg98n8DPTAcAmq%2FTgWyUDuXA6cL42voGru%2Fbj9sMoCrx99bqw%2BFafXjZR7%2Fm1f%2FfXy8506K3rkQWl731SztgBRJtxl%2Fj0o68FOMd3Y9LeTz2tr0d%2FT0CH5K6oU%2FWehjudkLz9gPS%2F6QHZKtmEew%2BJTQ%2BWiGC3WxC064ZHfYpocGr0GGzCY1LsfYko9nqW8nqBQAlkL9Smo%2Fx2ACu6LLdJqiNz3aW70Vg7bXrFliD8mue3YWfgNrBv963PF%2BJTTXba31MVn45%2Boplt3epBPorXCpZWyxbSQd%2FryKpjX7gfelNx%2BY%2F8NqmN4Jrk%2FNrNstfK7wlomUTsq2WuDY3o4p%2BWszvz2XV81uI6OQf" rel="noopener noreferrer"&gt;2 dependency depth levels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://viewer.diagrams.net/?tags=%7B%7D&amp;amp;highlight=0000ff&amp;amp;edit=_blank&amp;amp;layers=1&amp;amp;nav=1#R7Vtfc5s4EP80frQHEGB4TOzkejO9m8ylnWvvTcYypgVEQY6d%2B%2FS3AskGBDaJwc41TWZstFoksX9%2Bu1rhEZpFu99SnKz%2FoEsSjgxtuRuh%2BcgwdBOZ8MUpz4Li2oLip8FS0A6Ex%2BBfIoiaoG6CJckqjIzSkAVJlejROCYeq9BwmtJtlW1Fw%2BqsCfaJQnj0cKhS%2Fw6WbF1QHWN6oH8ggb%2BWM%2Bu2W%2FREWDKLJ8nWeEm3JRK6G6FZSikrrqLdjIRcelIuxX33Lb37haUkZl1u2Dq%2BZy7%2B%2BezsyPhzdvdj9u3P38eW0EbGnuUTkyUIQDRpytbUpzEO7w7U25Ru4iXhw2rQOvB8pDQBog7Eb4SxZ6FNvGEUSGsWhaIXVpw%2BfxH3542vvDGxZHO%2BK3fOn0UrYyn9TmY0pClQlmSFNyHb06V%2BQLK3KxozMb1u5xw4ZTfcHoAS05hI2n0Qhvu5lpLDC3GWBV5BFCx84YWwuIRalSBIGd2kHjkmeWEWsAifsCOMur43FnAzQiMCIoEbUxJiFjxVV4KFuft7PnErPBl%2BLjEkNIhZVhr5gROAQbiuY4v1Cce1a8Z1gl23rDI%2FXBQLkK3SkxxIucG%2BxHjFnE843AgxzGgUbeLAA8nQGLoWhG0J4VeM4Ii7JYkWJM0UqwfvTPjlJgrvUxxx%2B9iuA0YeE5yrcQv4VjXiuolthfkhxI1pLUHB1vZ280RSRnbHLUfVs7jBmFYlPNY1QdgecMmSaliXMMlAWrtxlDT0CgVYv9DjOuihT%2F9X6GE4bxA%2BpAxL8DEy7NwkuAFU7Nr%2BsaGyY5zlpnEDDLqd7HLFyn648vn3YxAlcCskPiQLfI4%2FSRrEXpATizlgzcU0xR09I5JZQiSeTJUQyRoIkYyugIScoQBJN34GQOoAJSpmLXG2zh%2Bib6S5WJ5yluaNq2j%2Bpwop2pn6a4Z2BSXqzl8YlrjrYAUvDTn7HWNzCDnJfypEtT3HoCHKvPL2bKJpZhXTplwBbzvNypfzQNIApE9Scd81ENG6jEfZ1pt0KNu%2BQAqn7gBlerWQidUDTnEY5nWpLU2%2Fl9KvRWvuVXKGHhIl6cVSkEjNk3S9IU%2ByBkuT9NNim5MQTDTlW2aakj3z5aXn1u2wSXzmJcVnNkivJgL%2BxIEHmIsXJHygWZDXI9B8QRmjEQhGMtyEfHuA5ozWknmZ%2Fkc7n5dWJwsMWDfBqbcHytjPZ9MmyNK0qa2hqe5ojomQJXByz2CbjoU015oiHblIa9orVFF7ZCB3xv%2BLhRR1y3xV3wnz1qLhbdInch8wFsS%2BDCyBX0xqKIjv9LTrMF%2B569Dd6UR6Yv8ede1Avd9rfC339Rqi0ctDNE1IXInPef8uYKVFQ%2BtrqeewZN6QK%2B4xfBtdSyeGNUj4tlxIq9zSX8WcTdOYIPBm1yg%2BawZbPJ0S21smcRzNsk1ABrs6CTIswARdA0cRn50yiN7qtq3Rp3PdBbXUXW65S2Eu%2Fm5FFsAhVvUpLADZA8Pi2aOC1FGwXBbuS2BBeFFgLLRFQgXjWrcja87HAo%2FNhPcobie8ZwWOUSP1gJJTc1rVOHInrutM9alr5p8KZjpNhZqhIqiBFBP4ANOOQ%2FKUJ2oJDQMvIGqZXuhLUVKOU4JNO6a0LMEehKuPZMWfER0of4nHRm2KSinDrFXdtyCqGUc0ULwxg7Z%2BaOe2kAC%2Bz2gMQ%2BMg1yHBGduSTFp3eSPUR87pVMMkstUw2aRywx5K5WrW9JFuf2l8MI2bmnFljas4z7F7RqME5CtCS1PFO6LLTa46qfQw111Nk4b2IrSuS7xsP3oP4rcgpurVzNRp2KjY5sRVdWAPBrTqGcfte9KB2QB7F9eBe929Qa2AVz2V0N9hAc9wLrUDOMtukFrcWlFvAyFSy99t0BvNKq84DJfSdg5c4oUsMdho%2FxpUWWFH3KXVxyHColpBbSymPHNjNkZ247ByBLpaZWSQDZE0yGP1OB46P%2BHsxfXLATINpNVyy4YSzGULmmaHgubt2xWg2ZQpXFaAagnzV4zqK0adDEhmezA7HaOmZ8aolgKSZR2pUlmo25lTb%2Begar3gPYTCwivfVSi0mpC8plsfgCc5S9ondtIN8cxoOmEabMtgqlvnT%2BX3VxWRlF4Wu%2FEYLVv264%2BgXhX5jmhVFXhJwOii8nXfh3zrR%2FPXkrfzlrILVPsbve6wrNNbeqVc48BUTjfyhYoDMXndvszW8zHeqGcjr91GH8Xl07mM1TFxMVv2eWeGrloVtJ4xdz1A011UGceojTNwwqPiU29HZLWfSHQ7J7tAOtV%2F%2BuScyJ502zUqSu4pedLtplHPyZ2gefihWMF%2B%2BL0duvsP" rel="noopener noreferrer"&gt;Wrap Up&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Without them this article would not exist, because they were part of the adventure that allowed the birth of this article:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/aurel-abidos-828401aa" rel="noopener noreferrer"&gt;Aurel Abidos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/maxime-rat-926b444a/" rel="noopener noreferrer"&gt;Maxime Rat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/coureauxavier" rel="noopener noreferrer"&gt;Xavier Coureau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/tiphaine-leblanc-a5408b95" rel="noopener noreferrer"&gt;Tiphaine Leblanc&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/thibault-douang-94994989" rel="noopener noreferrer"&gt;Thibault Douang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;For review:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/aurel-abidos-828401aa" rel="noopener noreferrer"&gt;Aurel Abidos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;For resource sharing on Swarming:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/laurent-prost-product-manager" rel="noopener noreferrer"&gt;Laurent Prost&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;I invite you to see my posts, not as my static opinions, but rather a stream of thoughts, caught in the middle of their update.&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
