Vous avez dit Awalé ?
Première semaine chez Marmelab, me voilà en train de rédiger mon premier post sur le blog.
Au cours de ces quelques jours, je me suis consacré au projet suivant : le développement du jeu Awalé en python (jouable dans un terminal). Avant de vous détailler cette semaine d'intégration, je vais m’attarder un peu sur la présentation de ce jeu.
Le jeu Awalé
Pour ma part, je ne connaissais pas l'Awalé ou Oware pour les anglais. Ce jeu originaire du continent africain est basé sur la réflexion et le calcul.
Les règles sont plus simples qu'elles n'y paraissent. Si au premier abord elles peuvent sembler complexes, une à deux parties permettent de les assimiler rapidement.
Conditions de jeu : deux joueurs, un plateau de douze trous, répartis en deux rangées de six, l’une est à vous, l’autre à votre adversaire. Chaque trou est composé de quatre graines, soit quarante-huit graines au total. L'objectif est de récupérer plus de graines que de votre adversaire, c’est à dire au moins 25.
Le jeu se joue à tour de rôle. On choisit un sens de rotation qui vaudra pour toute la partie.
Le premier joueur prend les quatre graines dans l’un de ses six trous et les égrène une à une dans les trous de sa rangée, puis sur celle de son adversaire suivant le sens de rotation. Le joueur suivant fait de même et ainsi de suite. Au fur et à mesure du jeu, le nombre de graines dans chacun des trous varie inévitablement. Cependant il faut toujours prendre la totalité des graines du trou choisi, puis les redistribuer une à une. Si on distribue plus de douze graines, on saute la case de départ.
Quand les joueurs ont-ils la possibilité de récupérer les graines? A partir du moment où ils retrouvent dans les trous seulement 2 ou 3 graines, et ce après avoir déposé la totalité des graines prises dans un de leurs trous. le joueur récupère ces deux ou trois graines et les met de côté. Il regarde ensuite le trou précédent : s'il est dans le camp adverse et contient deux ou trois graines, il récupère ces graines, et ainsi de suite jusqu'à ce qu'il arrive à son camp ou jusqu'à ce qu'il y ait un nombre de graines différent de deux ou trois.
Il faut « nourrir » l'adversaire, c'est-à-dire que, quand celui-ci n'a plus de graines, il faut absolument jouer un coup qui lui permettre de rejouer ensuite.
La partie se termine lorsqu'un des joueurs a récupéré au moins 25 graines, ou que le joueur ne peut plus nourrir l'adversaire, mais aussi s'il devient impossible de ramasser d'autres gaines.
Après avoir effectué une partie, je me suis lancé dans le projet de développement.
Python, un langage simple
Jusqu’à présent, je n’ai entendu que du bien sur Python, il est fortement favorisé comme premier langage de programmation. S’il est étudié dans de nombreuses écoles, il est également couramment utilisé par des développeurs comme langage de scripting, réalisation de site web avec Django, etc.. Toujours en évolution et fortement suivi par la communauté.
Malgré mes appréhensions, l'indentation avec des espaces n'a pas été un frein à la lecture du code. Cependant, étant habitué aux accolades, il m'a fallu quelques heures pour m'y faire.
Il est relativement simple de passer de Python à un autre langage et inversement.
Passons à la pratique
Avant de commencer tout projet, il faut déjà bien comprendre le sujet. Rien de plus simple, je me rapproche directement de mes référents.
A notre droite, on retrouve Yann, scrum master, qui va me montrer comment on découpe un projet chez Marmelab. A notre gauche, nous avons Kévin, pythonien dans l'âme et référent technique, qui va me parler architecture, test, intégration et déploiement.
Découper les tâches
Pour ce projet, nous utilisons Trello, mes cartes doivent être axées utilisateurs et non pas purement technique.
Yann m'explique une formulation toute simple et qui marche incroyablement bien.
As François, given ..., I want, so that ...
J'ai créé une dizaine de carte en respectant cette règle. Sur chaque carte je rajoute une estimation de temps en jours Homme pour me donner de la visibilité sur le projet.
L'environnement et les pull requests.
Chez Marmelab, les code reviews et les tests automatisés font partie des fondements de la culture de l'entreprise. Ils vont vraiment au bout des bonnes pratiques pour faire les choses bien.
Tout d'abord, un projet doit obligatoirement posséder un Makefile. Rien de plus simple pour que n'importe qui puisse lancer le projet très simplement et rapidement.
make install
make run
J'ai rajouté deux autres commandes, make test
qui lance les tests unitaires et make lint
qui valide la syntaxe du code à travers pep8, qui est aussi un guide de bonnes pratiques.
Un autre outil très utilisé par Marmelab, Docker !
Mon programme tourne dans une machine Docker, j'utilise l'image officiel de Python 3 pour faire tourner le jeu. N'importe qui peut lancer le jeu sans aucun problème.
Après avoir mis en place l'environnement, nous allons enfin pouvoir commencer à développer.
Premiers commits, premières pull requests, je reçois instantanément mes premières remarques. Que ce soit sur le nommage, l'architecture, les commentaires, les tests, tout est passé au crible par Kévin.
Les pull requests sont très importantes pour tout le monde. On apprend beaucoup des retours d'autres personnes et c'est un gage de qualité pour le produit. Il faut savoir écouter pour continuer à s'améliorer.
Le python peut être un langage orienté objet, mais ici nous allons faire de la programmation fonctionnelle. Le retour que l'on peut voir ci-dessus est une notion très importante, l'immutabilité ! On ne doit pas modifier une valeur passée en paramètre.
Les tests unitaires ont été écrits au fur et à mesure du développement. Ils sont lancés en utilisant Travis que l'on couple avec GitHub, il y a juste le fichier .travis.yml à rajouter.
L'interface du jeu
On retrouve l'index des différents trous ainsi que le nombre de graines entre crochets. Malheureusement j'ai dû faire rapidement l'interface du jeu, j’ai manqué de temps pour réaliser un affichage beaucoup plus propre et design.
D'autres solutions ont été proposées par mes collègues, faire un affichage vertical, une grille de bataille navale, etc...
Voici le rendu final du jeu.
Conclusion
Un programme n'est jamais vraiment terminé. Pour celui-ci, l'amélioration de l'interface semble essentielle, il faudrait également ajouter des tests unitaires, proposer différentes options aux joueurs : qui souhaite commencer la partie, etc...
Le rythme de développement est soutenu, quatre jours pour réaliser le projet et une journée de démo. Les retours de l'équipe sont très importants et apportent des éléments sur le projet. J'ai pu percevoir une bonne entraide entre les membres de l'équipe, beaucoup d'écoute et de conseils. J'ai appris beaucoup durant cette semaine, l'utilisation de Docker, Makefile, le python et aussi le découpage en cartes orientées utilisateur.
Prochaine étape, réalisation du jeu en Go avec l'ajout d'une intelligence artificielle.
Le code source du jeu est disponible sur GitHub marmelab/awale-python.