English

Manuel Technique du SNC

Le présent manuel propose une marche à suivre pour créer des services numériques efficaces d’un point de vue technique. Il présente des idées arrêtées, mais ces dernières s’appuient sur des années d’expérience et sur les meilleures pratiques du secteur privé et du gouvernement. Le manuel divise la discipline du développement logiciel en 14 stratégies pratiques. Bien que nous recommandons fortement ces stratégies, nous ne les imposons à aucune équipe. Au SNC, nous croyons que ce manuel permettra de :

  • Définir des normes techniques de base au sein de nos communautés et de nos équipes de produits.
  • Accroître la collaboration et la réutilisation de code.
  • Générer une rapidité et une régularité d’exécution.
  • Simplifier l’intégration de nouveaux développeurs, ministères ou partenaires.
  • Regrouper les meilleures pratiques de l’industrie et les adapter à notre mission.
  • Réaliser des économies d’échelle.
  • Atténuer les risques et accroître l’efficacité opérationnelle.

Nous peaufinerons le manuel à force d’appliquer ces stratégies dans notre travail quotidien.

STRATÉGIE 1

Travailler ouvertement

Collaborer ouvertement et publier nos données nous permet d’améliorer le gouvernement ensemble. Créer des services en toute transparence et publier des données ouvertes, c’est simplifier l’accès des membres du public aux services gouvernementaux et à l’information, permettre au public d’y contribuer facilement, et rendre possible la réutilisation de code par les entrepreneurs, les organismes sans but lucratif ou autres, et les membres du public.

Compétences à développer

  1. Choisir une licence permissive approuvée par l’OSI (Open Source Initiative) telle que la licence MIT.
  2. Recourir à GitHub pour publier du code, faire le suivi des tickets (issues) et afficher le backlog de produit.
  3. Pour chaque dépôt de code, publier un code de conduite, des consignes pour les contributeurs, la licence et le processus de communication des vulnérabilités en matière de sécurité
  4. Respecter la Loi sur les langues officielles: fournir la documentation dans les deux langues, créer des modèles bilingues pour la création de tickets (issues) et de demandes de tirage (pull requests), répondre aux tickets (issues) dans la même langue qu’ils ont été rédigés, dans la mesure du possible.
  5. Tenir les artéfacts et les dépôts soignés et à jour: archiver les dépôts non tenus à jour, supprimer les branches désuètes et fusionnées, supprimer les vieilles demandes de tirage (pull requests) qui ne seront pas fusionnées, éliminer fréquemment les vieux tickets (issues).
STRATÉGIE 2

Pratiquer l’intégration continue

L’avantage le plus important et le plus vaste de l’intégration continue est la réduction des risques, grâce à la possibilité de détecter les problèmes plus tôt. Il s’agit d’un mécanisme « d’échec rapide » qui élimine l’un des plus gros obstacles au déploiement fréquent.

Compétences à développer

  1. Intégrer des changements dans la branche principale aussitôt que possible.
  2. Établir un processus de révision par les pairs et de documentation; commencer par un modèle de demande de tirage (pull request).
  3. Utiliser SemVer pour la gestion des versions.
  4. Appliquer les Commits conventionnels (découvrir pourquoi).
STRATÉGIE 3

Faire des déploiements fréquents

Il est bon de déployer du code fréquemment parce que cela permet à vos utilisateurs de bénéficier de nouvelles fonctionnalités et de les commenter plus rapidement. De plus, cette pratique favorise de façon générale la collaboration pendant un cycle de développement. Elle fait tomber les barrières entre les utilisateurs de nos services et les développeurs, barrières qui constituent le plus grand obstacle au succès du développement logiciel.

Compétences à développer

  1. Déployer du code à jour plusieurs fois par jour dans des environnements de production, de façon structurée et sécuritaire.
  2. Utiliser l’infrastructure comme code pour gérer et approvisionner tous les environnements.
  3. Utiliser des versions hermétiques (c’est-à-dire insensibles aux bibliothèques et aux autres logiciels installés sur la machine servant à créer la version) à partir d’images de conteneurs, et les stocker dans le nuage.
  4. Pour chaque application ou système, définir une liste de contrôle de mise en production ou un « train de livraison agile » (agile release train). En savoir plus sur nos pratiques de gestion des versions.
  5. Tenir un manifeste de version où sont liées les versions et ses composantes. Voici un exemple.
  6. Automatiser les notes de mise à jour.
  7. Fournir un plan de retour en arrière pour chaque mise en production.
  8. Recourir au déploiement bleu-vert.
  9. Utiliser, si possible, des techniques comme le déploiement canari qui limitent le trafic dirigé vers la nouvelle version.
  10. Veiller à ce que chaque version admissible soit testée de façon adéquate (manuellement ou automatiquement). Les tests devraient comprendre : tests unitaires, tests intégrés et tests de performance.
  11. Veiller à ce que chaque version admissible soit soumise à un audit de vulnérabilité.
  12. Vérifier et surveiller de façon systématique les journaux de production et les mesures principales de performance dès qu’une version est déployée.
  13. Éviter de faire un déploiement en dehors des heures de travail ou juste avant la fin de semaine et les jours fériés.
STRATÉGIE 4

Utiliser les bascules de fonctionnalité

Les bascules de fonctionnalité (feature toggles ou release toggles) permettent d’envoyer les chemins d’exécution incomplets et non testés en production en tant que code latent et de les activer lorsque la nouvelle fonctionnalité est prête. Il s’agit de la façon la plus commune de mettre en œuvre le principe de « séparation entre déploiement de fonctionnalité et déploiement de code » de la livraison continue.

Compétences à développer

  1. Installer, mettre en œuvre ou utiliser une plateforme existante de bascules de fonctionnalité.
  2. Pratiquer l’écriture de code en recourant à la technique de création de branches par abstraction.
  3. Déployer les fonctionnalités d’envergure en plus petits morceaux.
  4. Éviter de faire un déploiement en dehors des heures de travail ou juste avant la fin de semaine et les jours fériés.
STRATÉGIE 5

Choisir sa pile technologique avec soin

Les décisions que nous prenons en matière de technologies doivent à la fois permettre aux équipes de développeurs de travailler efficacement et aux services d’évoluer de manière aisée et rentable. L’infrastructure d’hébergement, les bases de données, les cadres logiciels, les langages de programmation et autres éléments de la pile technologique que nous choisissons doivent chercher à éviter le verrouillage des fournisseurs et correspondre à ce que les grandes sociétés modernes de logiciels grand public et d’entreprise choisissent aujourd’hui. Les équipes chargées des services numériques devraient notamment penser à utiliser des logiciels libres, des solutions infonuagiques et des produits de base dans leur pile technologique, en raison de leur grande adoption et validation par les entreprises technologiques du secteur privé.

Compétences à développer

  1. Veiller à ce que les compétences de la communauté correspondent aux exigences de soutien de la pile à court et à long terme.
  2. Évaluer si la maturité des outils de développement dans la pile est suffisante.
  3. Évaluer si la pile technologique assure une gestion de la sécurité et une application de correctifs raisonnables.
  4. Examiner les dépendances technologiques supplémentaires et les rationaliser.
STRATÉGIE 6

La sécurité d’abord

Nos services numériques se doivent de protéger les renseignements sensibles et d’assurer la sécurité des systèmes. Pour ce faire, une procédure d’examen et d’amélioration continus doit généralement être intégrée au développement et à la maintenance du service. Pour construire un service sécurisé, un processus fondamental consiste à tester et à valider de manière exhaustive les composants de chaque couche de la pile technologique, puis à réutiliser ces mêmes composants prévalidés dans plusieurs services.

Compétences à développer

  1. Chercher en quoi consiste la sécurité pour l’organisation et l’application, en faire une priorité tôt dans le développement du produit.
  2. Utiliser un outil d’analyse statique de code pour signaler les erreurs de programmation, les bogues, les erreurs de style et les constructions suspectes.
  3. Utiliser un inspecteur d’information confidentielle (p. ex., Git Seekret) pour prévenir l’ajout de renseignements sensibles dans un dépôt.
  4. Mettre en place la détection et la correction automatiques des dépendances de code
  5. Publier des règles relatives à la communication de vulnérabilités.
  6. Mettre en place un audit de vulnérabilité des images de conteneurs Docker.
  7. Effectuer une analyse des risques/menaces de manière systématique pour tous les produits.
  8. Assurer la gestion des secrets partagés.
STRATÉGIE 7

Écrire du code propre

Le code est propre s’il est facile à comprendre par tous les membres d’une équipe. Un code propre peut être lu et amélioré par d’autres développeurs que la personne qu’il l’a écrit. À la compréhension du code s’ajoutent aussi sa facilité de lecture et sa capacité à être modifié, avancé et maintenu.

Compétences à développer

  1. Choisir un style de code. Il en existe pour chaque langage de programmation, et vous devez en définir un.
  2. Recourir à l’analyse statique de code, dans la mesure du possible
  3. En équipe, choisissez un ensemble de règles qui reflètent ce que signifie un code propre pour vous
STRATÉGIE 8

Développer une interface accessible

Développer des services accessibles, c’est répondre aux besoins du plus grand nombre de personnes possible. Dès le début d’un produit, nous consultons les personnes qui finiront par l’utiliser, y compris les personnes handicapées.

Compétences à développer

  1. Vérifier que chaque composant UI est accessible; référez-vous à notre guide d’accessibilité du SNC.
  2. Réaliser des audits d’accessibilité pendant vos tests automatisés de bout en bout en utilisant l’intégration axe-core avec Cypress.
STRATÉGIE 9

Automatiser tous les tests

Tout code écrit devrait comprendre des tests raisonnables qui valident son bon fonctionnement et qui explorent les cas limites. L’automatisation des tests assure la qualité et la fiabilité de chaque déploiement d’application et accroît l’efficacité globale des déploiements logiciels.

Compétences à développer

  1. Traiter le code test comme s’il s’agissait du code de production.
  2. Inclure l’écriture de tests dans les critères d’acceptation et les demandes de tirage (pull requests).
  3. Chercher à faire le moins de tests manuels possible.
  4. Choisir des bibliothèques de tests qui sont utiles pour les tests de couverture de code, les rapports de tests et la lecture du code test.
  5. Utiliser des interfaces de simulation pour tester la logique interne.
  6. Veiller à inclure des tests de bout en bout dans la mesure du possible.
STRATÉGIE 10

Optimiser les coûts de l’infonuagique

Les coûts liés à l’infonuagique peuvent monter rapidement si l’organisation n’en fait pas bien le suivi. Pour assurer une gestion efficace des dépenses, il faut mesurer et gérer les principaux facteurs de coût comme la mémoire, le stockage, le trafic réseau et l’utilisation des instances.

Compétences à développer

  1. Optimiser le transfert de données en fonction des besoins de l’application, en tenant compte du trafic entre zones ou régions des centres de données.
  2. Adapter la taille des instances de calcul à la tâche.
  3. Profiler les applications à coût élevé pour optimiser l’infonuagique.
  4. Mettre en place une journalisation, une surveillance et un signalement pour les cas de charge de trafic élevée ou d’utilisation élevée du nuage.
  5. Quand c’est possible, utiliser les réseaux de diffusion de contenu (CDN).
  6. Définir des périodes de rétention en matière de stockage pour l’élimination ou l’archivage de données.
  7. Adapter la disponibilité et la redondance des données en fonction des accords de niveau de service (SLA).
  8. Supprimer les instances et les ressources lorsqu’elles ne sont pas nécessaires, ou si possible, programmer leur suppression.
STRATÉGIE 11

Journaliser, surveiller et alerter

La journalisation, la surveillance et les alertes sont à la base de la gestion des incidents. Ces éléments permettent aux équipes de développement et d’exploitation de prévoir et de résoudre les problèmes d’application beaucoup plus vite.

Compétences à développer

  1. Collecter et stocker les journaux dans un endroit central.
  2. Journaliser les événements vérifiables tels que les connexions, les échecs de connexion et les transactions de grande valeur.
  3. Veiller à ce que les avertissements et les erreurs génèrent des messages de journaux adéquats et clairs.
  4. Assurer un contrôle des journaux d’applications et d’API pour détecter les activités suspectes.
  5. Mettre en place des seuils d’alerte et des procédures d’escalade des réponses qui sont adéquats.
  6. Veiller à ce que l’application puisse détecter, faire escalader, ou signaler les menaces et les incidents actifs en temps réel ou quasi réel.
  7. Conserver les journaux pendant une période suffisamment longue pour permettre une analyse différée.
  8. Générer des journaux dans un format facile à traiter par une solution de gestion centralisée des journaux; mettre en place une journalisation structurée.
STRATÉGIE 12

Assurer un bon soutien à la production

Le monde compte sur des services « actifs en tout temps » plus que jamais. Une interruption de service peut avoir des répercussions réelles sur des millions de personnes : incapacité à payer une facture, à réserver un billet d’avion, à faire un appel vidéo avec des amis, etc. Qu’il s’agisse d’un bogue majeur, de problèmes de capacité ou d’une interruption de service complète, les clients qui dépendent de vos services s’attendent à une réponse immédiate (il en va de même pour les équipes internes).

Un horaire équitable de travail sur appel, associé à un plan de rémunération adapté, peut favoriser une culture de responsabilité partagée et aider les équipes à mieux comprendre ce qu’il faut pour avoir des logiciels et des services résilients. Cette approche permet d’obtenir un produit global amélioré et de réduire les interruptions de service.

Compétences à développer

  1. Définir des responsabilités de travail sur appel claires et fournir une formation adaptée et un accès à tous les outils nécessaires
  2. Mettre en place une base de connaissances généreuse et documenter tous les incidents
  3. Vérifier régulièrement que le processus est sain et efficace
  4. Créer un horaire sur appel fonctionnel et utiliser le bon outil; nous utilisons OpsGenie
  5. Veiller à ce que chaque membre de l’équipe de produit fasse partie de l’horaire de travail sur appel, soit comme commandant de réponse aux incidents, soit comme développeur sur appel.
STRATÉGIE 13

Gérer les incidents

Quand on va vite, on peut s’attendre à certains problèmes. Nous voulons nous assurer d’y répondre rapidement et de ne pas les aggraver ni de les répéter, afin que nos utilisateurs puissent continuer à utiliser leurs services.

Compétences à développer

  1. S’entendre sur la définition d’un incident et sur celle de ses divers niveaux de sévérité.
  2. Mettre en place un carnet de bord des incidents où sont écrites de façon claire les étapes à suivre en cas d’incident, de façon à créer une uniformité et une norme de qualité.
  3. Adopter en tout temps une approche exempte de reproches et veiller à la sécurité psychologique.
  4. Éliminer le bruit ou les faux positifs dès que possible.
  5. Assurer la visibilité des rapports d’incidents et des mesures à prendre qui en résultent.
  6. Automatiser le processus : créer un appel ou une vidéoconférence, créer un rapport, assurer le suivi des mesures à prendre, etc.
  7. Préciser et simplifier les canaux de communication en cas d’incident.
STRATÉGIE 14

Perfectionner ses compétences

Cette dernière stratégie consiste à mettre en pratique toutes celles qui précèdent, et à les perfectionner. Notre savoir-faire en matière de développement est notre plus grand atout; nous devons toujours chercher à le perfectionner.

Compétences à développer

  1. Participer à au moins une retraite de développement par année.
  2. Examiner les demandes de tirage (pull requests) d’autres équipes.
  3. Lire et partager des nouvelles et des articles de blogue techniques pertinents avec les membres de la communauté.
  4. Sortir de sa zone de confort lorsque l’occasion se présente.
  5. Choisir une compétence et la maîtriser en profondeur.