24 Fév 2015

DOJO #16

La programmation d’un automate est un exercice récurrent mais toujours intéressant. Aujourd’hui nous nous sommes intéressés à la machine à café à travers une implémentation simpliste en 4 itérations.

Le sujet

Version originale : http://simcap.github.io/coffeemachine/

Sur la base du schéma ci-dessous, l’idée est de s’attaquer uniquement à la partie « Logic », qui est le cœur de la machine et fait l’interface entre le panneau de commande et le Drink Maker (nous l’appellerons l’usine à boissons dans la suite de cet article).

coffee-150x180

La première itération (environ 30 minutes) a consisté à répondre aux besoins suivants :

  • Vous devez transmettre à l’usine à boissons les instructions dans un format décrit plus bas pour commander un café, un chocolat ou un thé.
  • Il faut pouvoir ajouter 1 ou 2 sucres
  • Si la commande contient du sucre, une touillette sera ajoutée.

Les commandes attendues par l’usine doivent respecter le format suivant :

  • «T:1:0» = Thé, 1 sucre, 1 touillette
  • «H::» = Chocolat, pas de sucre, pas de touillette
  • «C:2:0» = Café, 2 sucres, 1 touillette

L’usine doit pouvoir également  envoyer des messages à la couche logic sous la forme :

«M:contenu du message»

A la deuxième itération, la machine à café ne doit traiter une commande que si le montant suffisant a été fourni sachant que le thé coute 40 centimes, le chocolat 50 centimes et le café 60 centimes. Dans le cas contraire, un message doit être envoyé par la machine spécifiant la somme manquante pour pouvoir fournir la boisson demandée.

La troisième itération voit l’ajout du jus d’orange (60 centimes) dans la liste des boissons proposées, ainsi que la possibilité de commander un café, un chocolat ou un thé « extra chaud » (sans surcout). Cette option ajout le code « h » dans les commandes délivrées à l’usine, ainsi un café extra chaud devient «Ch::» et un chocolat extra chaud avec un sucre devient «Hh: 1:0».

La machine est maintenant populaire et la direction souhaite avoir un rapport des boissons commandées. Lors de la quatrième itération nous avons donc ajouté cette fonctionnalité à notre automate : retourner un rapport (au format voulu) indiquant pour chaque boisson le nombre de commandes effectuées et le montant total dépensées dans la machine.

Une cinquième itération était proposée mais n’a pas été implémentée faute de temps.

WP_20150218_14_47_09_Pro[1]

Les technologies utilisées

  • C#
  • Java
  • JavaScript

L’objectif

  • Travailler en TDD (évidemment)
  • Savoir faire simple
  • Prévoir des refactorisations de code

Certaines équipes sont tombés dans le piège du « jusqu’au-boutisme » en gardant la simplicité du départ jusqu’à la fin, au risque de s’enliser dans un code de moins en moins adapté aux nouveaux cas d’utilisations. Si l’exercice au départ est effectivement de faire simple, il faut savoir retravailler le code lorsque les évolutions deviennent difficiles à implémenter à cause d’une conception inadaptée aux nouveaux cas.

Le mot de la fin

La refactorisation est un point crucial trop souvent négligée par les développeurs :

  • Manque de temps / budget (temps = argent)
  • Manque de volonté
  • Peur des régressions

Les développeurs doivent s’imposer ce travail, et ceci doit être entendu, accepté et compris de tous les intervenants du projet. Une conception inadaptée engendre des pertes de temps (et donc d’argent) proportionnelles au temps écoulé depuis le début du projet : plus le temps passe, et plus les développements sont longs et difficiles car le code est de moins en moins maintenable et adapté.

Ce phénomène, bien qu’évident pour un certain nombre de développeurs, est malheureusement trop souvent ignoré du métier (et du reste de la chaine) qui n’a pas le bagage technique nécessaire pour le comprendre.

Préférerions-nous attendre des années pour avoir une maison totalement automatisée ou quelques mois pour une maison habitable, fonctionnelle, modulable et beaucoup moins chère ?

La méthode AGILE seule ne peut répondre à cette problématique, la refactorisation en fait partie.

Share