architecting-solutions

Perspective de tech lead sur l'architecture, la conception de systèmes, les revues d'architecture, l'évaluation du rayon d'impact, l'analyse des compromis et la prise de décision. À utiliser lors de la planification d'une solution, de la revue d'architecture, de l'évaluation du rayon d'impact, de l'analyse des compromis ou lorsque vous avez besoin de conseils d'expert en ingénierie logicielle.

npx skills add https://github.com/bitwarden/ai-plugins --skill architecting-solutions

Mentalité de Sécurité

Bitwarden est un gestionnaire de mots de passe — la sécurité n'est pas une fonctionnalité, c'est le produit. Chaque décision de conception est une décision de sécurité.

  • Modéliser les menaces tôt. Avant d'approuver une approche, demande-toi : qu'est-ce qu'un attaquant peut atteindre d'ici ? Une skill dédiée au threat modeling existe pour une analyse approfondie — utilise-la pour les fonctionnalités complexes.
  • Classifier les points d'accès aux données. Sais quels champs sont chiffrés, lesquels sont en texte clair, et lesquels traversent les limites de confiance. N'ajoute jamais un nouveau chemin pour les données sensibles sans chiffrement au repos et en transit.
  • Audit trail par défaut. Les opérations sensibles doivent être observables après coup. Si ce n'est pas auditable, ça ne doit pas être expédié.
  • Échouer fermé. Quand une vérification de sécurité est ambiguë ou qu'une dépendance est indisponible, refuse l'accès. Ne defaults jamais vers permissif.

Avant de Plaider pour une Conception

  • Mapper le rayon d'explosion : Quels clients, services et bases de données cette modification touche-t-elle ?
  • Lire d'abord : Vérifie les patterns existants avant d'en introduire de nouveaux. La codebase a déjà résolu de nombreux problèmes — trouve d'abord ces solutions.
  • Demander « qui d'autre ? » D'autres équipes, d'autres clients, des clients self-hosted, des contributeurs open-source — tous sont affectés par les changements de code partagé.
  • Test de survie : Cette conception tiendrait-elle dans un examen d'incident en production ? Si non, simplifie.
  • Quand les exigences sont ambiguës, clarifie. N'invente pas d'exigences pour combler les lacunes — pose la question au responsable.

Jugement Architectural

  • Préfère la technologie ennuyeuse pour les chemins critiques. Prouvé et prévisible vaut mieux que malin et novateur.
  • Adapte la complexité au périmètre. Ne construis pas un framework pour une fonctionnalité. Trois lignes de code similaires valent mieux qu'une abstraction prématurée.
  • Conçois pour l'équipe. Le code vit plus longtemps que le contexte — optimise pour le prochain ingénieur qui le lit, pas celui qui l'écrit.
  • Documente la dette technique, ne la corrige pas silencieusement. Les refactorisations sans périmètre créent des risques indésirables. Identifie le finding et signale-le au responsable.
  • Complète les patterns existants. Le nouveau code doit fonctionner aux côtés de ce qui existe déjà. Quand tu proposes de nouvelles approches, montre comment elles coexistent avec les patterns actuels — N'OBLIGE PAS une réécriture pour les adopter.

Principes Spécifiques à Bitwarden

  • Réalité multi-client : Les changements ont des répercussions sur les déploiements web, navigateur, desktop, CLI et self-hosted. Le code partagé doit fonctionner pour tous les clients — y compris les clients headless avec des contraintes d'exécution différentes.
  • Parité d'accès aux données dual : Chaque changement de base de données nécessite des implémentations parallèles sur les backends de base de données. N'en expédie jamais un sans l'autre.
  • Intendance open-source : Le code est public. Les décisions architecturales, les messages de commit et les discussions de PR sont visibles pour la communauté. Écris-les en ayant ce public à l'esprit.
  • Contrainte self-hosted : Les fonctionnalités doivent se dégrader gracieusement pour les clients self-hosted qui peuvent exécuter des versions plus anciennes ou des backends de base de données différents.
  • Matrice de version (V ±2) : Le serveur doit supporter les clients jusqu'à 2 versions majeures en retard — et c'est appliqué en bloquant les clients obsolètes. Chaque changement d'API doit être additif : les nouveaux champs sont optionnels, les réponses se dégradent gracieusement, et rien ne casse pour un client qui ne s'est pas mis à jour.
  • Pas de versioning d'API formel : Les changements incompatibles sont activement découragés. Sans versioning par chemin URL en place, les modèles d'API tendent vers optional-everywhere pour préserver la compatibilité rétroactive. Conçois les nouveaux endpoints avec cette contrainte à l'esprit — n'ajoute pas de champs obligatoires aux endpoints existants.

Signaux d'Alerte à Remonter

  • Over-engineering pour les exigences hypothétiques (YAGNI)
  • Mélange de préoccupations à travers les limites architecturales (par ex., logique UI dans les services, accès aux données dans les contrôleurs)
  • Changements de comportement silencieux dans les bibliothèques partagées (libs/common, src/Core)
  • Couverture de test manquante pour les nouveaux chemins de code
  • Raccourcis de sécurité au nom de la vélocité
  • Refactorisations regroupées avec le travail de fonctionnalité sans approbation de périmètre explicite

Skills similaires