Partager du code efficacement

Ce que j'entends par code source

Description structurée, sous forme de texte, de données et de procédures, par exemple d'un programme informatique

On en parlera bientôt...

Utilisation des outils de suivi de problèmes, d'animation de commauté

Préparer du code pour le partage

Objectifs

Faciliter la prise en main par un autre développeur

  • Favoriser la diffusion de vos travaux
  • Faciliter les contributions
  • Réduire le temps de suivi
  • Avoir plus d'utilisateurs

Problématique des logiciels libres, des logiciels de recherche, mais aussi en interne d'une entreprise

Moyens

  • Favoriser des outils standards et durables
  • Mettre en forme le code source
  • Structurer correctement les répertoires et fichiers
  • Préparer des outils pour la configuration et la compilation
  • Documenter (le projet, le code source)

Et puis aussi...

Mettre en forme

Être rigoureux est essentiel

  • Convention de code (espaces, tabulations, retours à la ligne), exemple 1, exemple 2
  • Convention de nommage des fichiers, fonctions, variables, etc. (tirets bas, notation camel case, etc.)
  • Ne rien écrire d'inutile (code mort, code commenté, etc.)

Structurer les répertoires et fichiers

  • src : le code source de l'application
  • build : fichiers générés à la compilation
  • doc : documentation
  • test : le code source des tests
  • lib : librairies générées à la compilation (si on les sépare du build)
  • bin : exécutables générés à la compilation (si on les sépare du build)
  • include : les entêtes du projet (si on les sépare des sources)

une proposition de description complète

Outils pour la configuration et compilation

  • Les outils des IDE
  • Les outils standards (GNU Make)
  • Les outils génériques (CMake)

Qu'est-ce qu'une chaîne de compilation ?

Quel est l'intérêt des outils génériques ?

Documentation

Outils simples pour le partage de code

Partage d'archives

Bonnes pratiques

  • Toujours partager une archive complète
  • Nettoyer l'archive (supprimer les fichiers générés et fichiers temporaires)
  • Lister les dépendances sans les intégrer
  • Utiliser un dossier racine unique
  • Renommer le dossier suivant la version

Partage éphémère et ponctuel

Édition collaborative web

Éditeurs en ligne spécialisés

Limitations vite atteintes

Comparer deux versions (diff)

Interfaces graphiques comme kompare, kdiff3

Les systèmes de gestion de version

Version Control system (VCS) en anglais

Quand on n'utilise pas de VCS...

...on se débrouille comme on peut

Quand on travaille seul

  • Travail sur une copie du projet stable
  • Une sauvegarde par version « stable »

Et puis...

  • Comment travailler à plusieurs ?
  • Comment suivre les modifications entre deux versions ?

Principe général d'un VCS...

Un système de gestion de version

  • Garde un historique de toutes les versions
  • Stocke les modifications (évolution entre deux versions)

Du bon usage des VCS...

Chaque modification doit être :

  • Complète, élémentaire, autos-suffisante
  • Décrite explicitement
  • Amener à un outil fonctionnel : compilable, et qui passe les tests

En pratique, comment ça marche ?

Configuration d'un dépôt

  • Le dépôt tient une liste des fichiers suivis (attention aux fichiers non suivis)
  • Notre système de fichier présente une copie de travail
  • Possibilité de naviguer dans les versions (logiciel dédié)
  • Possibilité de charger une version précise
  • Possibilité de soumettre (commit) une nouvelle version
  • Version : état de tous les fichiers du projet

Les branches

Développement d'une version alternative

  • Implémentation d'une nouvelle fonctionnalité
  • Modification majeure du cœur du programme
  • Migration

Copie de travail (branche active)

Ajout d'une nouvelle version (commit)

Ajouter une nouvelle version à la branche sélectionnée

La fusion de branches

Intégration des modifications de la branche

Les tags (étiquettes)

Pour identifier une version spécifique

  • Correction d'un bug connu
  • Version majeure du logiciel
  • ...

Utilisation classique

(exemple : nginx)

SVN, un serveur centralisé

git, un serveur décentralisé

On peut même avoir plusieurs dépôts distants...

git, schéma d'utilisation

version détaillée

git, un outil très flexible

git, quelques ressources

git, une courte démo

Les plateformes web dédiées aux systèmes de gestion de version

github, en position dominante

Gestion des dépôts distants simplifiée :

  • Duplication de dépôt existant (fork)
  • Proposition de fusion (pull request)
  • Éditeur en ligne intégré, utilisation de markdown
  • Visualisation avancée de l'historique
  • Gestion de tickets (issues)
  • « Réseau social » (suivre, marquer son intérêt, etc.)

Plateformes concurrentes

Tests logiciels

Approche classique

Tests unitaires, tests d'intégration, tests fonctionnels

exemple d'utilisation

Idées générales sur le test

  • S'assurer du bon fonctionnement
  • S'assurer de la non régression
  • Permettre une automatisation des tests

Problématique de la couverture du code

Test unitaire

Principe : tester une fonctionnalité élémentaire

  • Pour chaque module (unité) du programme
  • Pour des cas typiques d'utilisation
  • Pour des cas extrêmes connus
  • Après les corrections de bugs

Exemple d'outil : QtTestLib

Test d'intégration

Principe : tester l'intégration des modules dans l'ensemble

Exemple : assemblage d'une classe client et d'une classe produit pour créer un module de process commande.

Étapes de l'intégration

  • Identifier le graphe de dépendance
  • Construire des simulateurs de classe (stubs) en cas de cycle
  • Intégration et tests dans l'ordre bottom-up ou top-down

Stratégie alternative : big-bang

Test fonctionnels

Tester chacune des fonctionnalités indépendamment les unes des autres

  • Tests transverses aux modules
  • Liés à des fonctionnalités
  • Guidés par les besoins (recettes, proximité avec le client)

Intégration continue

Réalisation automatique et régulière

  • Récupération du code source
  • Vérification du code
  • Compilation des sources
  • Exécution des tests unitaires
  • Packaging de l'application
  • Déploiement de l'application
  • Exécution des tests fonctionnels

Production de rapports d'intégration

Exemple d'outil : Jenkins (exemple de status)

Behavior-driven development

Objectif : impliquer les intervenants non techniques dans un projet logiciel

  • Utilisation d'exemples pour décrire le comportement de la demande
  • Automatisation des exemples (fournir rapidement des commentaires, des tests de non régression)
  • Utilisation de mocks pour simuler ce qui n'est pas implémenté

Exemple d'outil : cucumber (Gherkin, exemple d'utilisation en C++)

Les deux prochaines séances...

Initiation à git en TP.