Software Modeling et Software Design

Les développeurs confondent souvent modélisation et design applicatif. Les deux sont proches, mais n’adressent pas le même objectif.

Le Model-Driven Design (Domain-Driven Design) est dédié à la modélisation de sujets complexes. Il repose sur deux concepts :

  1. Une approche pour modéliser un problème complexe : Deep Model.
  2. Une démarche pour obtenir un design propre : Supple Design.

Prenons un exemple : vous être face à une règle de métier complexe. Votre cerveau est en ébullition. Vous ne savez pas comment l’implémenter cette nouvelle règle qui comprend plusieurs axes fonctionnels. Pas de stress : notre cerveau fonctionne rapidement sur ce qu’il a déjà rencontré et beaucoup plus lentement sur des sujets inexplorés. Les techniques permettant de creuser les problèmes complexes (Event Storming, Story Mapping, Example Mapping …) nous permettent de nous acclimater sur des sujets dont nous ne sommes pas spécialistes. L’émergence de nouveaux modèles mentaux nous apporte un début de compréhension, mais rarement la solution. J’aime rappeler ici que ce travail de compréhension est sublimé lorsqu’il est collaboratif. Nos échanges autour d’un point de désaccord nous permettent de partager et d’aligner nos modèles mentaux de manière explicite. C’est donc à travers une compréhension commune et un vocable commun que commence une bonne modélisation.

Sur le plan de l’implémentation, la modélisation relève d’une approche à la fois frugale et progressive :

  • Frugale: car tout élément ne contribuant pas directement au modèle sera éliminé. C’est un acte difficile, car nous aimons bien ce que nous connaissons bien.
  • Progressive: car nos modèles mentaux évoluent au fil des obstacles rencontrés. C’est une forme de Refactoring conduit vers une meilleure compréhension du problème. C’est à la fois chronophage et impraticable, lorsque la pression du backlog vous oblige à agir de plus en plus vite.

 Modéliser est donc un acte d’analyse au service d’un problème fonctionnel. Mais, ce travail d’analyse peut être amélioré si nous apportons des éléments de design permettant de clarifier notre modèle. En d’autres mots, le design apporte au modèle une expressivité permettant de retrouver l’intention des experts métier. C’est donc en conjuguant la modélisation et le design que nous pouvons atteindre une solution opérationnelle offrant un superbe design et une modélisation parfaitement juste.

Je vous encourage à vous exprimer lorsque vous êtes engagé sur une règle de métier complexe afin de disposer d’un temps suffisant pour l’explorer et l’implémenter. Si vous escamotez systématiquement ces moments de compréhension et de Refactoring progressif, vous obtiendrez un code difficile à la fois difficile à comprendre et peu évolutif. En d’autres mots, en réduisant le temps d’analyse et le temps d’implémentation, nous augmentons le temps de maintenance et les actions correctifs après la livraison du produit.

Une fois que  l’application est livrée, corriger un souci de modélisation est à la fois difficile et plus chronophage au regard du temps nécessaire pour développer un code souple et expressif. En négligeant,  la phase de modélisation et son design respectif, les projets informatiques sont systématiquement coûteux et génère une énorme dette technique au fil du temps.

Legacy Club – Agile Tour Lille 13 et 14 octobre 2016

image

Avec mon ami Thomas Pierrain, nous aurons le plaisir de vous parler de code non maintenable, bugs à répétition, corrections chronophages, moral dans les chaussettes…

Pas étonnant que la plupart d’entre nous préfèrent travailler sur des projets où tout est à (re)construire (Greenfield) plutôt que sur du code Legacy (Brownfield). Il faut dire que le Legacy sur lequel on a perdu le contrôle est plus que pénible. C’est épuisant, voire décourageant. Et si nous nous trompions ? Et si – munis de quelques techniques de refactoring et de communication- nous pouvions inverser les choses et reprendre le contrôle…

Le temps d’une session avec des bouts de live-coding, venez découvrir les trucs et astuces des gens qui préfèrent reprendre le contrôle plutôt que de subir. Voir qui préfèrent les opportunités cachées du Legacy aux pages blanches des projets Greenfield. Vous aussi, rejoignez le Legacy Club !

Vous avez dit Windows et Docker ?

imageimage

 

Malgré son jeune âge (création de docker, inc en 2013), la technologie docker est sans doute le phénomène IT le plus intense de ces dernières années.

Difficile aujourd’hui d’y échapper car tout le monde en parle : conférences énormes avec sponsors prestigieux, meetups archibondés, presse dithyrambique, certificateurs à foison, investisseurs à l’affut…

image

Comment expliquer un phénomène aussi foudroyant ? La technologie docker n’a que trois ans, et c’est déjà un standard de fait en train de révolutionner mondialement notre façon de déployer du logiciel.

De nombreuses entreprises ont déjà commencé à l’utiliser pour leurs besoins mais surtout, jamais une technologie d’infrastructure n’avait suscité autant d’intérêts chez les développeurs.

Pourquoi docker ?

Eviter le syndrome « Je ne comprends pas, ça marchait pourtant sur ma machine… » en livrant dans un conteneur à la fois notre code et tout ce qui est nécessaire pour le faire tourner (quel que soit l’environnement de déploiement) est ce qui a séduit en premier la plupart des développeurs.

Il faut dire que le packaging et la simplicité d’utilisation du produit y a fait pour beaucoup, dans une période déjà très favorable aux sirènes du mouvement DevOps et du Continuous Delivery. Et puis disposer d’un format standard qui nous permettrait de déployer de la même façon quel que soit la solution de cloud (et donc avec une possible réversibilité à la clé) est également très séduisant (pour éviter tout verrouillage avec une offre de service).

Le conteneur est une nouvelle forme de binaire capable d’exécuter nos applications n’importe où et sans contraintes. Ceci change véritablement notre rapport à l’infrastructure : pas d’affinité avec un langage, pas de souci de déploiement, pas de problème de mise à l’échelle. Le slogan docker affiche d’ailleurs vaillamment : BUILD, SHIP, RUN.

image

 

Docker en quelques mots

Si vous ne connaissez pas docker, voici quelques éléments qui devraient vous éclairer. Docker est une technologie open source permettant de gérer des conteneurs applicatifs initialement sous Linux. Il repose sur une architecture de type client/serveur où le client docker et son démon UNIX, appelé Docker Engine, communique via une API REST. Ce qui signifie que client peut être installé en local avec le Docker Engine ou sur une autre machine où le client et le Docker Engine peuvent être sur des systèmes hétérogènes.

Le rôle du Docker Engine est de prendre en charge les commandes du client afin de gérer des conteneurs contenant des applications.

image

Architecture Docker : système d’exploitation partagé, applications isolées

Un conteneur docker est une forme d’isolation applicative permettant d’exécuter plusieurs conteneurs sur la même machine (même OS) sans effet de bord. Contrairement à une machine virtuelle où tout est dupliqué afin d’isoler des applications, le conteneur n’a pas besoin de dupliquer le système d’exploitation dans sa totalité.

image

Architecture Machine Virtuelle : tout le système d’exploitation est dupliqué pour chaque machine virtuelle

Les conséquences sur le plan des ressources consommées sont considérables. En effet, les conteneurs s’installent, se chargent très rapidement et consomment très peu de mémoire. Les parcs serveurs gagneraient en nombre d’instances applicatives à basculer de machines virtuelles vers des clusters de conteneurs.

Techniquement, les conteneurs sont hydratés à partir de fichiers contentant toutes les définitions des éléments nécessaires au chargement du conteneur. Ces fichiers sont, dans le langage docker des images. À l’instar des poupées russes, on peut personnaliser une image en lui ajoutant une nouvelle couche (par exemple application Web) afin d’engendrer une image avec un peu de plus de valeurs métiers.

Des images « standardisées » sont entreposées de manières centralisées afin de les partager et de gagner de temps : le hub docker (aussi appelé registre) contient un catalogue impressionnant d’images.

Le client docker peut venir tirer parti de ces images afin en produire un nouveau conteneur très rapidement.

Pour résumer le fonctionnement de docker. Le client sollicite le démon (Docker Engine) via de commandes afin de gérer à la fois les conteneurs et les images respectives. Ces images lorsque qu’elles peuvent être partagées, sont mis à disposition dans le registre docker.

image

Un client docker peut récupérer une image depuis le registre afin de produire un nouveau conteneur.

 

Microsoft et la technologie Docker

Le succès de docker sous Linux est considérable, les géants du Web, les grandes entreprises et les petites structures l’ont déjà adopté en production alors que l’offre de docker sous Windows est sur le point d’arriver.

En effet, Microsoft est sur le point de délivrer tout un nouvel écosystème docker sous Windows.

De nombreuses conférences ont déjà démontré le produit, mais peu de développeurs, de décideurs ou d’entreprises ont entendu parler de l’offre docker Microsoft dont le nom officiel est Microsoft Windows Containers.

L’offre est en préparation depuis plus d’un an, mais est déjà disponible à travers plusieurs déclinaisons de systèmes d’exploitation :

  • Windows 10 version Anniversary Update
  • Windows Server 2016 (disponible en version finale avant la fin l’année 2016)
  • Microsoft Azure
    • Propose déjà des machines virtuelles avec Windows Server 2016 avec la technologie Windows Containers préinstallée.
    • Une offre de mise à l’échelle de vos conteneurs est disponible, clef en main avec travers Microsoft Azure Service Containers

L’objectif de cet article est de brosser le décor de l’offre docker sur la plateforme Windows, afin de vous sensibiliser au champ des possibles vis-à-vis de votre contexte.

En effet les acteurs informatiques qui participent au développement d’applications s’appuyant sur la plateforme Win32, utilisant la technologie COM avec ou sans composants .NET seront sans doute intéressés de comprendre comment s’articule l’offre docker sur la plateforme Windows.

 

Collaboration forte entre Microsoft et Docker Inc.

Avant de proposer une offre docker intégrée à Windows, les deux sociétés, Microsoft et Docker inc. ont dû collaborer afin de rendre possible l’utilisation de docker sur les environnements Microsoft. Pour Microsoft, les conteneurs docker deviennent un passage obligé sur le déploiement applicatif dans Microsoft Azure (qui contient bien plus de serveurs Linux que de serveurs Microsoft).

Sur le plan technique, la première étape a été d’implémenter docker nativement sur Windows afin d’obtenir une version de docker capable d’offrir aux utilisateurs des technologies Microsoft, le même niveau de service que l’offre LXC (Linux Containers).

Par nature la technologie docker repose sur des facilités d’isolation offertes par le système d’exploitation Linux (les dernières versions de Linux sont compatibles docker). Afin de rendre possible la virtualisation applicative sous Windows, les ingénieurs Microsoft se sont penchés sur les services disponibles dans le noyau Windows afin d’implémenter les comportements isolation applicative, équivalente au système Linux.

Remarques

Ce qui signifie qu’une version de Windows n’ayant pas été modifiée pour offrir des services d’isolation applicative ne peut faire tourner une implémentation native de docker. Tous les Windows Server antécédents à la Windows Server 2016 sont incompatibles avec l’offre native Microsoft Docker.

Techniquement la virtualisation applicative repose sur des services d’isolement intrinsèque à la version au système d’exploitation sous-jacent. Ainsi sur une même machine, on peut disposer de plusieurs applications isolées, partageant le même système d’exploitation pouvant vivre leurs vies sans jamais collaborer ou pas. En effet, les conteneurs ont des capacités pour partager de l’information si besoin.

Ces services d’isolement applicatif sont antécédents à la technologie docker. En effet, docker vient les exposer intelligemment afin de les rendre faciles à utiliser (c’est une des forces du produit). C’est sur les dernières versions Linux, que les services d’isolement applicatifs se sont développées progressivement : namespace, cgroups et quelques facilités du système de fichiers ont permis de créer la notion de conteneur que docker a popularisé avec succès.

image

Pour obtenir un équivalent Windows, il fallait que le système d’exploitation soit modifié en conséquence afin de retrouver les équivalents Linux: des namespaces, resource controls, union file System. Une fois les fonctionnalités système de base retrouvées, le portage du Docker Engine a pu commencer. Le code n’a pas été dupliqué, mais au contraire porté.

Chaque partie de code incompatible avec le système Windows, a été adapté afin de modifier au le code au plus juste. La collaboration Microsoft avec Docker, inc. a permis de lancer le projet Windows Containers compatible avec les interfaces docker.

image

 

Portage de Docker Linux sous Windows

Pour réaliser l’implémentation native de docker sur Windows, Microsoft a lancé un portage du code du démon open source docker Linux (Docker Engine) sur le noyau Windows. Un tel portage au niveau système a forcément nécessité des adaptations afin de retrouver les comportements de la version originale sous Linux. Mais finalement, les ingénieurs Microsoft ont obtenu une première version du Docker Engine sur un noyau Windows légèrement modifié dans des délais très brefs. C’est ce travail de portage qui a permis à Microsoft de proposer la technologie Windows Containers.

Naissance d’une offre Docker native sur Windows

Aujourd’hui la déclinaison de docker sur Windows, officiellement nommée Windows Containers, est relativement proche de celle proposée sur Linux et offre le support de l’essentiel des commandes docker avec – pour les habitués de PowerShell – une extension spécifique Windows Containers qui permet à la fois de gérer, de manipuler les conteneurs, mais aussi de les administrer à l’aide de leur langage de script préféré.

L’offre Windows Containers, comprend deux formes d’exécution des conteneurs:

  • Windows Server Containers : Exécution directe du container à la Linux. Les principes sont les mêmes. Il existe deux types de serveurs permettant d’héberger des conteneurs : Windows Server 2016 version complète avec une interface graphique similaire à Windows 10 et Server Core dépourvue de l’interface graphique du poste client.

image

  • Hyper-V Containers : Exécution sous le contrôle d’hyperviseur optimisé. Chaque conteneur se retrouve dans une machine virtuelle hautement optimisée. Cette version permet d’offrir une isolation plus importante que la solution par défaut. Une attente remontée par les grandes entreprises. Il existe trois systèmes d’exploitation permettant d’héberger des conteneurs : Windows Server 2016 version complète avec une interface graphique similaire à Windows 10 et Server Core dépourvue de l’interface graphique du poste client. et Windows 10 mise à jour Anniversaire.

image

Il existe trois catégories de serveur dans l’offre Windows Server 2016 :

image

Nano Server

Le Nano Server est une version minimaliste du noyau Windows. Naturellement sans interface graphique et surtout avec un jeu réduit d’API afin d’obtenir un système capable de tourner avec très peu de ressources. Il est cependant compatible la technologie Windows Containers. Ce qui signifie qu’il est possible de faire tourner des applicatifs dans un conteneur reposant sur le Nano Server. Il est important d’insister que c’est une version extrêmement petite de Windows qui est aujourd’hui utilisée par exemple dans Microsoft Azure comme système d’exploitation pour lancer des machines virtuelles.

L’incarnation de Nano Server est neuf fois plus petite que la version Server Core (l’autre système d’exploitation supportant Windows Containers). Nano Server arrive officiellement avec la version Mise à jour de Windows 10 Anniversary au sein de la technologie Hyper-V Containers. Cependant, le déploiement sur Windows Nano Server contient quelques contraintes, car ce noyau ne propose pas tous les services standards d’un serveur Microsoft standard. Par exemple, le développeur .NET devra se restreindre à un développement .NET Core, ou bien ASP.NET Core. Cependant, si vous souhaitez vérifier si votre application Win32 est compatible avec ce petit serveur, il existe un outil NanoServerApiScan.exe : https://blogs.technet.microsoft.com/nanoserver/2016/04/27/nanoserverapiscan-exe-updated-for-tp5/. Si vous souhaitez vérifier la comptabilité de votre application .NET, il existe un autre outil : https://github.com/Microsoft/dotnet-apiport/releases. Cependant, dans des contextes bien précis il peut s’avérer très utile. Tous les développeurs disposant de la version Windows 10 Anniversaire pourront apprécier Nano Server et découvrir la technologie Windows Containers en développant sur .NET Core par exemple.

Server Core

C’est une version relativement standard du noyau Windows, excepté qu’elle ne possède pas d’interface graphique. La maîtrise de PowerShell est sans doute un plus pour administrer Server Core. Son image est aussi compatible avec la technologie Windows Containers. Mais contrairement au Nano Server, il possède l’essentiel des services Windows standard permettent d’exécuter du code serveur Win32 ou .NET sans trop de soucis. C’est donc cette version qui sera sans doute le plus utilisée dans les grandes entreprises.

Windows Server Full Gui

Cette version est sans doute à utiliser en tant que serveur desktop. En effet ce serveur propose une interface graphique similaire à Windows 10 avec toutes les interfaces supplémentaires permettant administré un serveur « à la souris ». Naturellement n’est pas compatible pour hydrater en tant que conteneur. Par contre, on peut parfaitement installer l’infrastructure docker afin d’héberger des images reposant sur Server Core.

Comme nous l’avons vu, les deux serveurs capables de s’exécuter dans un conteneur ne possèdent pas d’interface graphique. Pour d’administrer les Windows Containers pleinement une extension spécifique docker pour PowerShell est disponible (https://msdn.microsoft.com/en-us/virtualization/windowscontainers/management/docker-powershell), cette extension permet d’exécuter de commande similaire aux commandes CLI Docker, mais elles permettent aussi d’administrer l’infrastructure Windows Containers et d’être combinable avec d’autres extensions d’administration PowerShell.

 

En conclusion

Il est certain que cette nouvelle offre va rencontrer un franc succès dans les rangs des spécialistes Microsoft. Qu’ils travaillent pour de grandes entreprises ou bien des startups, l’offre semble répondre à tous les types de besoins.

La mise à disposition de Windows Containers à travers la mise à jour anniversaire de Windows 10 constitue une belle opportunité de se familiariser avec cette nouvelle technologie. Cette première version ne supporte que des conteneurs compatibles Nano Server, mais Microsoft a déjà annoncé qu’il supportera aussi les images à base de Server Core à terme.

L’engagement de Microsoft avec Docker Inc. constitue un élément majeur à plusieurs titres :

  • Il confirme la transformation de Microsoft vis-à-vis de l’open source. En s’engageant au côté d’un symbole moderne et ouvert tel que Docker Inc. Microsoft envoie un signal fort. C’est le début d’une nouvelle forme de déploiement dans monde Microsoft. Au regard des moyens engagés, l’année 2017 devrait être importante pour l’offre Windows Containers.
  • Il apporte à l’écosystème docker, un complément qui se faisait attendre et qui permet d’imaginer des plateformes de clusters hybrides où depuis un client docker, une commande lance des traitements à la fois sous Linux et Windows en toute simplicité.

image

  • Il définit une nouvelle forme de binaire de déploiement compatible Cloud qui permettra sans nul doute de franchir un niveau de service, comme TCP/IP a pu le faire en son temps.

3 aspects du Software Craftsmanship illustrés lors des Microsoft experiences days ’16

image

Le mercredi 5 octobre 2016, Thomas PIERRAIN​ et moi-même (sans doute accompagnés d’un guest exceptionnel) animerons 3 ateliers originaux lors de la nouvelle version des MS Tech days qui s’appellent désormais Microsoft experiences ’16.

· Atelier 1 : Découvrir son sujet grâce à l’Event Storming

· Atelier 2 : Découvrir CQRS par la pratique

· Atelier 3 : Déployer dans Azure en mode « conteneur » (avec Docker pour Windows)

Profitant de la logique d’ouverture prônée par Satya Nadella (qui veut renouveler à la fois les contenus et les intervenants de leurs événements), nous aurons donc l’occasion d’illustrer -par la pratique- que la palette du Software Craftsmanship est assez large (en l’occurrence ici : du DDD, du clean code, de l’architecture et du DEVOPS).

Le format est prévu pour accueillir tout le monde quelque soit votre niveau, et quelques soit votre motivation pour participer (ceux qui veulent coder avec nous peuvent venir avec leur  laptop, les autres pourront juste regarder notre live-coding).

l’inscription est complètement gratuite, en plus d’être ouverte à toutes et à tous.

1 -Event storming

2 – CQRS

3 – Docker (Windows Containers)

clip_image001

clip_image003

clip_image005

Retour en vidéo du Paris JUG du 9 février 2016

image

Pour ceux qui n’étaient pas présents à ce Paris JUG du 9 février 2016, les organisateurs ont produit la vidéo complète de cette soirée.

Je remercie naturellement José Paumard, Champion Java, qui m’a demandé d’animer ce Paris JUG et par la même occasion toute l’équipe du Paris JUG.

Je remercie mes complices, Thomas Pierrain et Diego Lemos.

Pourquoi visionner cette vidéo ? Vous aimeriez en savoir plus sur le software craftsmanship ou sur le refactoring de code pourri.

youtu.be/Cov4MGzozSA?a

Agenda de la soirée du Software Craftsmanship au Paris JUG le 9 février 2016

image 

Agenda

•        19H30 – Le mouvement Software Craftsmanship – 15 minutes

Ce mouvement de pensée est l’une des réponses à la tendance à l’externalisation systématique des développements banalisant le métier de développeur pour le reléguer au rôle de simple producteur de ligne de code. Si vous souhaitez comprendre comment devenir un excellent professionnel à la fois humble et soucieux de la qualité de son travail, alors vous allez être comblé.

•        19H45 –  Refactoring de code legacy, (en mode collaboratif, pour ceux qui souhaite participer) – 1H30 minutes

Vous avez sans doute déjà vu du code legacy complètement fermer aux tests : un vrai coffre-fort. Nous vous promettons de présenter quelques techniques pour forcer le coffre-fort sans filet et sans bavure : juste à la couture. Mais après avoir créé une brèche, nous basculerons dans un mode plus serein pour poser notre premier test unitaire. Des animateurs seront présents à la fois sur scène et dans la salle, pour animer cette session. L’objectif est de réaliser en pair programming l’exercice (en Java ou C#)  en mode collaboratif  puis de partager avec les autres binômes.

ATTENTION : Pour cette session, si vous souhaitez coder, vous devrez disposer d’un ordinateur portable de développement pour deux développeurs, avec un IDE et un Framework de test déjà installé.

•     20H30 – pause buffet

•     21H30 – Refactoring de code legacy, (suite) – 45 minutes

•        22H15 –  fin de soirée

Agile Nord 2015 – La bataille du kata diamant

image

C’est avec un immense plaisir que j’animerai cet atelier de coding dojo avec mon ami Thomas.

Vous êtes un vétéran du TDD ou vous voulez en apprendre plus sur le sujet après quelques essais, le kata diamant est un bon chalenge pour tous ceux qui s’essayent à TDD. Dans cette session d’environ 2 heures, nous essaierons de dompter ce kata, dans le langage de votre choix. Thomas & Bruno vous donneront des astuces ainsi que aides si besoin. La dernière demi-heure est consacrée à une discussion sur le pour et le contre des différentes approches. Un portable pour 2 personnes est nécessaire pour cet atelier