<?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: Nicolas Verinaud</title>
    <description>The latest articles on DEV Community by Nicolas Verinaud (@nverinaud).</description>
    <link>https://dev.to/nverinaud</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%2F37412%2F6c402d19-1c0b-49b7-8945-b7b318123e2f.jpg</url>
      <title>DEV Community: Nicolas Verinaud</title>
      <link>https://dev.to/nverinaud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nverinaud"/>
    <language>en</language>
    <item>
      <title>🇫🇷 Introduction à TDD en Swift (Partie 3) - Une bonne documentation</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Mon, 10 Feb 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-3-une-bonne-documentation-2n95</link>
      <guid>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-3-une-bonne-documentation-2n95</guid>
      <description>&lt;p&gt;Cet article fait partie de la série &lt;em&gt;"Introduction à TDD en Swift"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-1-7-etapes"&gt;Introduction à TDD en Swift (Partie 1) - 7 étapes essentielles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-2-typage-et-generalisation"&gt;Introduction à TDD en Swift (Partie 2) - Vive le typage et la généralisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Introduction à TDD en Swift (Partie 3) - Une bonne documentation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans le &lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-2-typage-et-generalisation"&gt;précédent article&lt;/a&gt; de cette série tu as appris les bienfaits de la pratique de TDD :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;les tests sont fiables et nous permettent de ne rien casser,&lt;/li&gt;
&lt;li&gt;les tests nous poussent à raisoner plus profondément, à avoir un code plus robuste,&lt;/li&gt;
&lt;li&gt;les tests sont plus importants que le code de production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous allons continuer aujourd’hui le kata &lt;a href="http://kata-log.rocks/fizz-buzz-kata"&gt;FizzBuzz&lt;/a&gt; en implémentant plusieurs nouveaux tests en TDD.&lt;/p&gt;

&lt;p&gt;Au programme :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pourquoi une suite de tests doit constituer la meilleure documentation possible,&lt;/li&gt;
&lt;li&gt;je vais déroger au cycle RED-GREEN-REFACTOR (&lt;em&gt;crime crime !&lt;/em&gt; 😂),&lt;/li&gt;
&lt;li&gt;tu vas avoir un petit aperçu du property-based testing (&lt;em&gt;wat?&lt;/em&gt;),&lt;/li&gt;
&lt;li&gt;et enfin on va utiliser le résultat d’un test pour écrire un test (&lt;em&gt;waaaat?&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alors, prêt(e) ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-3-une-bonne-documentation.html"&gt;Lire la suite...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>tdd</category>
      <category>ios</category>
    </item>
    <item>
      <title>🇫🇷 Introduction à TDD en Swift (Partie 2) - Vive le typage et la généralisation</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Tue, 17 Dec 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-2-vive-le-typage-et-la-generalisation-55c6</link>
      <guid>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-2-vive-le-typage-et-la-generalisation-55c6</guid>
      <description>&lt;p&gt;Cet article fait partie de la série &lt;em&gt;"Introduction à TDD en Swift"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-1-7-etapes"&gt;Introduction à TDD en Swift (Partie 1) - 7 étapes essentielles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Introduction à TDD en Swift (Partie 2) - Vive le typage et la généralisation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-3-une-bonne-documentation"&gt;Introduction à TDD en Swift (Partie 3) - Une bonne documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans le &lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-1-7-etapes"&gt;précédent article&lt;/a&gt; de cette série tu as appris les bases de TDD en faisant un cycle complet de 7 étapes.&lt;/p&gt;

&lt;p&gt;Nous allons continuer aujourd’hui le kata &lt;a href="http://kata-log.rocks/fizz-buzz-kata"&gt;FizzBuzz&lt;/a&gt; en implémentant plusieurs nouveaux tests en TDD.&lt;/p&gt;

&lt;p&gt;Cela te permettra de mieux comprendre la profondeur et l’intérêt de cette pratique qui a changée ma manière de travailler.&lt;/p&gt;

&lt;p&gt;Au programme :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trois techniques de refactoring pour améliorer la qualité du code,&lt;/li&gt;
&lt;li&gt;l’utilisation du système de type pour éviter l’écriture d’un test,&lt;/li&gt;
&lt;li&gt;des propriétés intéressantes du TDD, au-delà des tests en eux-même,&lt;/li&gt;
&lt;li&gt;du fun comme jamais ! &lt;em&gt;(Ok ça c’est peut-être un peu exagéré !&lt;/em&gt; 😂&lt;em&gt;)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alors, prêt(e) ?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-2-typage-et-generalisation.html"&gt;Lire la suite...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>tdd</category>
      <category>ios</category>
    </item>
    <item>
      <title>🇫🇷 Introduction à TDD en Swift (Partie 1) - 7 étapes essentielles</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Wed, 11 Dec 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-1-7-etapes-essentielles-432p</link>
      <guid>https://dev.to/nverinaud/introduction-a-tdd-en-swift-partie-1-7-etapes-essentielles-432p</guid>
      <description>&lt;p&gt;Cet article fait partie de la série &lt;em&gt;"Introduction à TDD en Swift"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Introduction à TDD en Swift (Partie 1) - 7 étapes essentielles&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-2-typage-et-generalisation.html"&gt;Introduction à TDD en Swift (Partie 2) - Vive le typage et la généralisation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-3-une-bonne-documentation"&gt;Introduction à TDD en Swift (Partie 3) - Une bonne documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans &lt;a href="https://dev.toconstruire-une-architecture-emergente"&gt;l’article précédent&lt;/a&gt;, je te parlais de l’importance des tests pour faire émerger l’architecture.&lt;/p&gt;

&lt;p&gt;J’évoquais aussi le fait que &lt;a href="https://dev.toconstruire-une-architecture-emergente#automatiser-les-tests"&gt;TDD permet d’être plus productif&lt;/a&gt; en combattant l’idée reçue “Écrire des tests revient à écrire plus de code, donc c’est plus lent”.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tu m’as convaincu que TDD était LA pratique à apprendre. Mais comment je fais concrètement ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Je vais te le montrer à travers ce tutoriel justement !&lt;/p&gt;

&lt;p&gt;Nous allons entrer dans le vif du sujet avec une approche par l’exemple comme l’a fait Kent Beck (le papa de TDD) le 8 novembre 2002 (17 ans déjà !) lorsqu’il a publié son livre &lt;a href="https://amzn.to/2l8qHa3"&gt;“Test-Driven Development by Example”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/intro-tdd-swift-1-7-etapes.html"&gt;Lire la suite...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>ios</category>
      <category>tdd</category>
    </item>
    <item>
      <title>Languages, libraries &amp; frameworks to avoid in 2020</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Tue, 20 Aug 2019 15:09:31 +0000</pubDate>
      <link>https://dev.to/nverinaud/languages-libraries-frameworks-to-avoid-in-2020-53d</link>
      <guid>https://dev.to/nverinaud/languages-libraries-frameworks-to-avoid-in-2020-53d</guid>
      <description>&lt;p&gt;What a catchy title, and you clicked on it ! 😜&lt;/p&gt;

&lt;p&gt;I'm gonna be brief : &lt;strong&gt;avoid learning any languages, libraries &amp;amp; frameworks&lt;/strong&gt; next year.&lt;/p&gt;

&lt;p&gt;Instead, I suggest you to focus on one thing : &lt;strong&gt;doing your job, as a programmer, really well&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;be more disciplined, computer science is a science and it needs care ; careless programmers create mess, bugs and make their company loose money &amp;amp; opportunities,&lt;/li&gt;
&lt;li&gt;seek for deep knowledge beyond the next React / Angular / Vue / [insert hype here] version, for example &lt;a href="https://amzn.to/2KIGFln"&gt;go learn why you probably do not need kafka or event sourcing or microservices&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;pick your &lt;em&gt;already-known-so-boring-day-to-day&lt;/em&gt; language and learn how to not create bugs with it everytime you touch your favorite codebase ; learn how to design using the powerful features of it ; read books about writing code that are easy to read &amp;amp; understand instead of Vue documentation,&lt;/li&gt;
&lt;li&gt;learn how your business works, you are creating software for real people, be empathetic with them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it, brief I said. 😉&lt;/p&gt;

</description>
      <category>learning</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>🇫🇷 Construire une architecture émergente</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Mon, 08 Jul 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/nverinaud/construire-une-architecture-emergente-2o2</link>
      <guid>https://dev.to/nverinaud/construire-une-architecture-emergente-2o2</guid>
      <description>&lt;p&gt;Dans &lt;a href="https://dev.tola-seule-architecture-qui-compte"&gt;l’article précédent&lt;/a&gt;, je te parlais de ce qu’est une architecture logicielle et de la nécessité de la faire émerger.&lt;/p&gt;

&lt;p&gt;Pour y arriver, il faut manipuler son code comme de la &lt;strong&gt;pâte à modeler&lt;/strong&gt; ; car avoir une conception qui tape dans le mille du premier coup est proche de l’impossible.&lt;/p&gt;

&lt;p&gt;Et puis de toute façon, c’est un fait, &lt;strong&gt;le besoin change !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pour répondre à ces nouveaux besoins, il faut modifier le code.&lt;/p&gt;

&lt;p&gt;Qui dit le modifier dit potentiellement introduire des &lt;em&gt;bugs&lt;/em&gt;, casser des choses.&lt;/p&gt;

&lt;p&gt;Et là, forcément, la peur te gagne. Comment limiter ce risque ? Comment éviter de casser, de créer des bugs ?&lt;/p&gt;

&lt;p&gt;Je ne vais pas te le cacher, il n’y a pas 36 solutions, il faut… &lt;strong&gt;tester !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dans cet article, je vais parler de plusieurs &lt;em&gt;stratégies&lt;/em&gt; pour à la fois prévenir l’apparition de bugs mais aussi permettre de faire émerger une architecture saine et évolutive.&lt;/p&gt;

&lt;p&gt;Pour ne plus avoir peur de casser des choses en modifiant le code.&lt;/p&gt;

&lt;p&gt;L’objectif est toujours d’avoir la conception la plus optimale possible pour répondre au besoin présent ; sans sur-ingénierie (pas de code “au cas où”) et sans sous-ingénierie (pas de duplication partout).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Une conception aux petits oignons pour apporter de la valeur MAINTENANT.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voici la liste des stratégies que je vais développer :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tester manuellement,&lt;/li&gt;
&lt;li&gt;laisser le compilateur tester pour moi,&lt;/li&gt;
&lt;li&gt;automatiser mes tests (tu apprendras aussi pourquoi TDD rend plus efficace et permet de gagner du temps !).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/construire-une-architecture-emergente.html"&gt;Lire la suite sur l'Académie Ryfacto...&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>development</category>
      <category>tdd</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Embed a form on dev.to ?</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Fri, 21 Jun 2019 07:07:47 +0000</pubDate>
      <link>https://dev.to/nverinaud/embed-a-form-on-dev-to-2mkb</link>
      <guid>https://dev.to/nverinaud/embed-a-form-on-dev-to-2mkb</guid>
      <description>&lt;p&gt;Is it possible to embed a form on dev.to ?&lt;/p&gt;

&lt;p&gt;I tried to use the &lt;/p&gt; tag but it did not work. 😞

&lt;p&gt;I'd really like to embed my newsletter signup form on post I create here. 🙂&lt;/p&gt;

</description>
      <category>meta</category>
    </item>
    <item>
      <title>🇫🇷 La seule architecture qui compte</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Sun, 16 Jun 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/nverinaud/la-seule-architecture-qui-compte-1i81</link>
      <guid>https://dev.to/nverinaud/la-seule-architecture-qui-compte-1i81</guid>
      <description>&lt;p&gt;Ah, l’architecture d’une app iOS.&lt;/p&gt;

&lt;p&gt;Vaste sujet qui me préoccupe depuis que j’ai commencé à créer des apps iOS en 2010 (sortie du premier iPad, de l’iPhone 4 et d’iOS 4 !).&lt;/p&gt;

&lt;p&gt;À chaque nouvelle app se pose cette question fatidique : &lt;strong&gt;quelle archi mettre en place ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Après tout, c’est un choix important, non ? Une fois l’architecture choisie, impossible de revenir en arrière, n’est-ce pas ?&lt;/p&gt;

&lt;p&gt;Mais dites-moi, c’est quoi &lt;em&gt;une architecture&lt;/em&gt; ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture : définition
&lt;/h2&gt;

&lt;p&gt;Prenons la &lt;a href="https://www.larousse.fr/dictionnaires/francais/architecture/5078"&gt;définition du Larousse&lt;/a&gt; :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Organisation des divers éléments constitutifs d’un système informatique, en vue d’optimiser la conception de l’ensemble pour un usage déterminé.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il y a la notion d’ &lt;strong&gt;organisation&lt;/strong&gt; ; il s’agit là d’&lt;em&gt;organiser&lt;/em&gt; son code, ses modules, ses frameworks.&lt;/p&gt;

&lt;p&gt;L’objectif est d’ &lt;strong&gt;optimiser la conception de l’ensemble&lt;/strong&gt; ; il faut prendre du recul sur tout son code afin de l’&lt;em&gt;optimiser&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans le but de répondre à &lt;strong&gt;un usage déterminé&lt;/strong&gt; ; cette notion d’usage, je l’interprète d’un point de vue &lt;em&gt;fonctionnel&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Maintenant que nous sommes d’accord sur la définition ; quelles sont les caractéristiques d’une bonne architecture ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Une &lt;em&gt;bonne&lt;/em&gt; architecture
&lt;/h2&gt;

&lt;p&gt;Je vais reprendre chacune des notions et tenter de déterminer les caractéristiques que je juge en adéquation avec la définition.&lt;/p&gt;

&lt;p&gt;Pour rappel, il s’agit de limiter la réflexion au code d’une app iOS. (Même si, en réalité, cette réflexion est applicable à tous logiciels.)&lt;/p&gt;

&lt;h3&gt;
  
  
  Organisation
&lt;/h3&gt;

&lt;p&gt;Comment déterminer que le code de mon app iOS est &lt;strong&gt;bien organisé&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Primo, &lt;strong&gt;je trouve rapidement ce que je cherche&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ex:&lt;/em&gt; je dois modifier l’écran de connexion, il doit bien exister un &lt;code&gt;LoginViewController&lt;/code&gt; ou quelque chose comme ça.&lt;/p&gt;

&lt;p&gt;Deuxio, &lt;strong&gt;je ne me perds pas en cours de route&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Contre-Ex:&lt;/em&gt; le &lt;code&gt;LoginViewController&lt;/code&gt; fait quoi exactement ? Dans &lt;code&gt;viewDidLoad&lt;/code&gt; : il configure des singletons (wtf?), modifie des contraintes (wtf??), fait un appel serveur (wtf???) ; il appelle des méthodes sur une super classe pour…je suis perdu je ne comprends plus rien !&lt;/p&gt;

&lt;p&gt;Tertio, &lt;strong&gt;les dépendances ne partent pas dans tous les sens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Contre-Ex:&lt;/em&gt; &lt;code&gt;LoginViewController&lt;/code&gt; dépend de &lt;code&gt;ClientAPI&lt;/code&gt; qui dépend de &lt;code&gt;Configuration&lt;/code&gt; qui dépend de &lt;code&gt;ClientAPI&lt;/code&gt;, wtf?&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimiser la conception de l’ensemble
&lt;/h3&gt;

&lt;p&gt;Comment déterminer que la conception est optimisée ?&lt;/p&gt;

&lt;p&gt;Primo, &lt;strong&gt;je comprends facilement ce que le code fait&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ex:&lt;/em&gt; &lt;code&gt;LoginViewController&lt;/code&gt; a une méthode &lt;code&gt;onLoginButtonTapped()&lt;/code&gt; qui appelle &lt;code&gt;behavior.login()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Contre-Ex:&lt;/em&gt; &lt;code&gt;LoginViewController&lt;/code&gt; a une méthode &lt;code&gt;buttonTapped(_ sender: NSObject)&lt;/code&gt; qui teste si &lt;code&gt;sender == button1&lt;/code&gt; et qui fait plein de trucs sur 200 lignes avec un niveau d’imbrication au-delà de toute raison et problablement un appel API caché au milieu ?&lt;/p&gt;

&lt;p&gt;Deuxio, &lt;strong&gt;je retrouve les termes métiers dans le code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ex:&lt;/em&gt; quand je parle avec les utilisateurs et utilisatrices, ils évoquent des &lt;em&gt;Recettes&lt;/em&gt; et des &lt;em&gt;Ingrédients&lt;/em&gt; ; dans le code j’ai bien les notions de &lt;code&gt;Recipe&lt;/code&gt; et d’&lt;code&gt;Ingredient&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tertio, j’arrive à &lt;strong&gt;changer facilement le code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Contre-Ex:&lt;/em&gt; je modifie le login pour améliorer l’expérience utilisateur, je livre, et j’ai 36 nouveaux bugs à des endroits improbables, &lt;em&gt;whaaaat?&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Un usage déterminé
&lt;/h3&gt;

&lt;p&gt;Comment déterminer que la conception répond à un usage précis ?&lt;/p&gt;

&lt;p&gt;Primo, il n’y a &lt;strong&gt;pas de code au cas où&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Contre-Ex:&lt;/em&gt; je dois afficher des informations textuelles dans la v1. Je crée un &lt;code&gt;InformationsBuilder&lt;/code&gt; qui accepte une dépendance implémentant le protocole &lt;code&gt;InformationsStrategy&lt;/code&gt; et je crée une classe &lt;code&gt;TextualInformationsStrategy&lt;/code&gt; qui implémente ce protocole.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Autre contre-ex:&lt;/em&gt; je vais créer une DSL de configuration de style, au cas où je dois changer le thème de l’app un jour.&lt;/p&gt;

&lt;p&gt;Deuxio, il n’y a vraiment pas de code au cas où !&lt;/p&gt;

&lt;p&gt;Il m’est déjà arrivé de complexifier le code en essayant d’anticiper les besoins. C’est tentant et motivant de créer du code &lt;strong&gt;réutilisable&lt;/strong&gt;. Mais dans 95% des cas c’est &lt;em&gt;too much&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mieux vaut &lt;strong&gt;dupliquer pour trouver la bonne abstraction&lt;/strong&gt; que créer une mauvaise abstraction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Je préfère dupliquer une ou deux fois, puis prendre du recul pour trouver comment factoriser le code, afin de créer des abstractions qui ont une réelle utilité et un véritable sens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Une &lt;em&gt;bonne&lt;/em&gt; conception
&lt;/h2&gt;

&lt;p&gt;Une bonne architecture veut donc avant tout dire une bonne conception.&lt;/p&gt;

&lt;p&gt;Une bonne conception respecte les critères que j’ai listés ci-dessus et que je rappelle ici :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;je trouve rapidement ce que je cherche,&lt;/li&gt;
&lt;li&gt;je ne me perds pas en cours de route,&lt;/li&gt;
&lt;li&gt;les dépendances ne partent pas dans tous les sens,&lt;/li&gt;
&lt;li&gt;je comprends facilement ce que le code fait,&lt;/li&gt;
&lt;li&gt;je retrouve les termes métiers dans le code,&lt;/li&gt;
&lt;li&gt;j’arrive à changer facilement le code,&lt;/li&gt;
&lt;li&gt;il n’y a pas de code au cas où,&lt;/li&gt;
&lt;li&gt;le code répond à un usage déterminé.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je ne vais pas vous le cacher, avoir une architecture qui remplit tous ces critères &lt;strong&gt;est très difficile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il faut déjà réussir à bien comprendre le besoin, à déterminer précisément l’usage.&lt;/p&gt;

&lt;p&gt;Il ne faut pas anticiper des demandes qui n’arriveront peut-être jamais.&lt;/p&gt;

&lt;p&gt;Il faut rendre son code compréhensible par les autres humains qui vont le lire (et nous ne sommes pas tous égaux à ce niveau).&lt;/p&gt;

&lt;p&gt;Il faut faire face aux particularités des frameworks et librairies qu’on utilise.&lt;/p&gt;

&lt;p&gt;Autant vous dire qu’avoir juste &lt;em&gt;du premier coup&lt;/em&gt; relève du miracle !&lt;/p&gt;

&lt;h3&gt;
  
  
  Faire émerger la conception
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Mais si je n’arrive pas à avoir juste du premier coup…cela veut dire que je vais devoir changer ma conception en cours de route, la faire évoluer ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Exactement ! C’est ce que j’appelle &lt;strong&gt;faire émerger la conception&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Oh ! Et du coup faire émerger la conception revient à créer…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Une architecture émergente !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je pars de deux hypothèses pour justifier le fait de faire émerger l’architecture, plutôt que de la figer dans le marbre à l’avance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Il est impossible d’imaginer la bonne conception du premier coup.&lt;/li&gt;
&lt;li&gt;Le besoin change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;J’ai déjà détaillé le premier point ci-dessus, passons au second.&lt;/p&gt;

&lt;h3&gt;
  
  
  Le besoin change
&lt;/h3&gt;

&lt;p&gt;Si seulement les utilisateurs, utilisatrices, clientes &amp;amp; clients arrêtaient de changer tout le temps d’avis ! Cela serait beaucoup plus simple ! Nous aurions un cahier des charges figé et des spécifications fonctionnelles figées. Il nous serait alors si simple de concevoir une app qui réponde exactement à ce qui est demandé. Nous pourrions prendre le temps de bien concevoir, de faire de beaux diagrammes. Puis nous livrerions une app bien conçue et nous passerions à la suivante.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Le rêve quoi !&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vraiment ?&lt;/p&gt;

&lt;p&gt;Nous savons que ce n’est &lt;strong&gt;jamais&lt;/strong&gt; le cas. Qui a déjà vécu cette situation, honnêtement ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le besoin change !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pourquoi change-t-il ?&lt;/p&gt;

&lt;p&gt;Car créer un logiciel est principalement un travail de &lt;strong&gt;communication, de compréhension et d’empathie&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Entre ce que l’utilisateur a en tête, ce qu’il explique, ce que la développeuse comprend et ce qu’elle exprime par code ; les risques de mauvaise interprétation sont légions ! &lt;em&gt;(Ajoutez quelques intermédiaires entre les deux personnes et vous multiplierez ces risques. Coucou les Product Owner &amp;amp; Proxy Product Owner &amp;amp; Proxy Proxy Proxy…)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce n’est pas forcément le besoin réel qui change, c’est notre compréhension qui évolue !&lt;/strong&gt; Il nous arrive (souvent) de mal comprendre le besoin réel. Au fur et à mesure que nous créons et livrons le logiciel, nous apprenons des feedbacks ! Et nous devons refléter cette compréhension dans notre code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Bonne &lt;em&gt;architecture&lt;/em&gt; veut dire bonne &lt;em&gt;conception&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Avoir une conception &lt;em&gt;juste&lt;/em&gt; du premier coup est impossible car &lt;em&gt;le besoin change&lt;/em&gt;, notre compréhension de celui-ci change.&lt;/p&gt;

&lt;p&gt;Il faut donc être capable de faire &lt;em&gt;évoluer&lt;/em&gt; cette conception, de la faire &lt;em&gt;émerger&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pour cela, nous devons nous assurer que nous ne cassons rien au passage.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Et pour ne rien casser…on fait comment ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Je vous en parle dans le prochain article. 😉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://academie.ryfacto.fr/advanced-ios-craft/signup"&gt;Pour ne pas le manquer, inscrivez-vous à ma newsletter !&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>architecture</category>
      <category>development</category>
    </item>
    <item>
      <title>My new swift workflow or how to boost your swift productivity !</title>
      <dc:creator>Nicolas Verinaud</dc:creator>
      <pubDate>Thu, 14 Feb 2019 22:06:29 +0000</pubDate>
      <link>https://dev.to/nverinaud/my-new-swift-workflow-or-how-to-boost-your-swift-productivity--5di8</link>
      <guid>https://dev.to/nverinaud/my-new-swift-workflow-or-how-to-boost-your-swift-productivity--5di8</guid>
      <description>&lt;p&gt;Running tests manually each time I make a change in Xcode or AppCode drive me crazy (because of slowness &amp;amp; bugs in AppCode), so I decided to automate it.&lt;/p&gt;

&lt;p&gt;The objective ? Having this kind of workflow (which I observed and enjoyed when I did some JavaScript) :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;edit some source code,&lt;/li&gt;
&lt;li&gt;watch the tests run automatically without me doing anything, giving me instant feedback on how well I am doing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is how I enable this workflow for swift development (it can also be applied for other languages as long as you can run tests from the command line) :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="http://nodejs.org/"&gt;node&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;a href="http://nodemon.io"&gt;nodemon&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Run this command in your &lt;code&gt;workspace&lt;/code&gt; (or &lt;code&gt;project&lt;/code&gt;) folder (using your favorite terminal or the one embedded in AppCode, which I use because of me working in full screen).
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nodemon -e swift,strings --exec "xcodebuild -workspace MyApp.xcworkspace -scheme \"MyApp\" -destination 'platform=iOS Simulator,name=iPhone XS,OS=12.1' test"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Just replace the &lt;code&gt;workspace&lt;/code&gt; &amp;amp; &lt;code&gt;scheme&lt;/code&gt; with yours, and you're done ! You can make a change to any swift or strings files and boom tests are run automatically !&lt;/p&gt;

&lt;p&gt;Let me know how if it is helpful for you in the comment or on Twitter !&lt;/p&gt;




&lt;p&gt;I originally wrote the full story (with drama) of me making this possible. I left it below for you to enjoy ! 😁&lt;/p&gt;

&lt;h1&gt;
  
  
  The Full Story Behind
&lt;/h1&gt;

&lt;p&gt;It all started with a frustration.&lt;/p&gt;

&lt;p&gt;I love the &lt;strong&gt;speed&lt;/strong&gt; of &lt;em&gt;Xcode&lt;/em&gt; for building &amp;amp; running tests.&lt;/p&gt;

&lt;p&gt;But, woa, the &lt;strong&gt;refactoring capabilities&lt;/strong&gt;, despite getting better, are wayyy behind what &lt;em&gt;AppCode&lt;/em&gt; provides.&lt;/p&gt;

&lt;p&gt;I love the &lt;strong&gt;refactoring capabilites&lt;/strong&gt; of &lt;em&gt;AppCode&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But, woa, building &amp;amp; running tests is so sloooow.&lt;/p&gt;

&lt;p&gt;And it fails every once in a while, like, every hour with a "db lock blabla" error requiring me to clean, clean build folder, praying, crying, relunching the IDE, crossing fingers. Eventually productivity is back again.&lt;/p&gt;

&lt;p&gt;Choose your pain !&lt;/p&gt;

&lt;h2&gt;
  
  
  A Great Ide(a)
&lt;/h2&gt;

&lt;p&gt;So, yesterday I had an idea.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wait wait, building your own IDE right ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exactly !&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You know that this is a huge project, like a HUGE project !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yeah, cool isn't it ?!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You do not have the time to do that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What ? ...&lt;/p&gt;

&lt;p&gt;Oh I guess you're right. Am I doomed ?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You're a developer, a developer is never doomed ! What about finding a viable solution in 1 hour ? Like a &lt;strong&gt;Startup Challenge&lt;/strong&gt; !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Challenge accepted !
&lt;/h2&gt;

&lt;p&gt;Wouldn't it be cool to use &lt;em&gt;AppCode&lt;/em&gt; as the source code editor &amp;amp; &lt;em&gt;Xcode&lt;/em&gt; to build &amp;amp; run the tests ?&lt;/p&gt;

&lt;p&gt;That would be my MVP.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Switching back &amp;amp; forth between 2 IDEs manually ? You kiddin', right ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Meh...painful isn't it ?&lt;/p&gt;

&lt;p&gt;What about "build &amp;amp; run" from the command line using the integrated terminal of &lt;em&gt;AppCode&lt;/em&gt; ?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Seems better !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So my solution is only a little &lt;code&gt;man xcodebuild&lt;/code&gt; away !&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Digging into the manual&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TADA!&lt;/em&gt; Here is my command !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xcodebuild -workspace MyApp.xcworkspace -scheme "MyApp" -destination 'platform=iOS Simulator,name=iPhone XS,OS=12.1' test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Seriously ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yep ! My workflow is now :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Editing some source code&lt;/li&gt;
&lt;li&gt;Running the command above&lt;/li&gt;
&lt;li&gt;&lt;code&gt;goto 1&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Not bad, but I have another challenge !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have some time left, tell me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What about running this command &lt;strong&gt;automatically&lt;/strong&gt; when you edit the source code ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hum...&lt;/p&gt;

&lt;p&gt;I did this thing one day...nodeJS...&lt;br&gt;
...with a watch running stuff when code changed...like hot reloading, running tests...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cool story... But this is serious stuff, not this JavaScript hype thing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am serious ! &lt;/p&gt;

&lt;p&gt;Oh yes I am...&lt;/p&gt;

&lt;p&gt;So it used an npm package called &lt;code&gt;nodemon&lt;/code&gt; to watch for file changes.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Searching for nodemon...digging into the documentation&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TADA!&lt;/em&gt; I can run this &lt;code&gt;nodemon&lt;/code&gt; thing telling it to watch for &lt;code&gt;swift&lt;/code&gt; &amp;amp; &lt;code&gt;strings&lt;/code&gt; files &amp;amp; executing my custom command !&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prove it !&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No problem, watch this !&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nodemon -e swift,strings --exec "xcodebuild -workspace MyApp.xcworkspace -scheme \"MyApp\" -destination 'platform=iOS Simulator,name=iPhone XS,OS=12.1' test"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Oh please, you mean your workflow now is...&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Editing source code&lt;/li&gt;
&lt;li&gt;No step 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lessons I learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Frustration is a powerful call-to-action for me.&lt;/li&gt;
&lt;li&gt;Learning unrelated stuff, like nodeJS in this case, can open new horizons &amp;amp; improve creativity.&lt;/li&gt;
&lt;li&gt;Using the 1-hour timebox forced me to find a good enough solution which ended beyond my initial expectations !&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>swift</category>
      <category>protip</category>
      <category>productivity</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
