Aller au contenu principal

Principes d'ingénierie

Livrer vite, apprendre plus vite

Nous optimisons pour la vitesse d'itération. Une fonctionnalité en production nous apprend plus que des semaines de planification. Nous utilisons largement les feature flags pour livrer en toute sécurité et revenir en arrière rapidement.

En pratique, cela signifie des petites PR, du déploiement continu et un biais vers l'action. Si vous débattez entre deux approches, livrez-en une et mesurez. Les données utilisateurs réelles valent mieux que les discussions théoriques.

Le code est une responsabilité

Chaque ligne de code est quelque chose que nous devons maintenir. Nous préférons supprimer du code plutôt qu'en écrire. Quand nous écrivons du code, nous le rendons aussi simple que possible — mais pas trop simple.

Notre script de suivi fait moins de 5 Ko parce que nous nous battons pour chaque octet. Avant d'ajouter une dépendance, nous demandons : pouvons-nous faire cela nous-mêmes en moins de code ? La réponse est généralement oui.

Les tests sont de la documentation

Les bons tests expliquent l'intention. Nous écrivons des tests qui décrivent le comportement, pas l'implémentation. Quand les tests échouent, ils devraient vous dire exactement ce qui s'est passé.

Nous nous concentrons sur les tests d'intégration plutôt que sur les tests unitaires. Tester le chemin heureux à travers de vrais flux utilisateurs détecte plus de bugs que de mocker chaque appel de fonction.

La performance est une fonctionnalité

La vitesse n'est pas une réflexion après coup. Nous mesurons la performance dès le premier jour, définissons des budgets et traitons les régressions comme des bugs. Notre script de suivi reste sous 5 Ko parce que chaque octet compte.

Le déploiement edge, le chargement paresseux et la mise en cache agressive sont des valeurs par défaut. Chaque endpoint API a un budget de latence. Si une requête prend plus de 100 ms, nous l'examinons.

Sécurité par défaut

Nous n'ajoutons pas la sécurité après coup. L'authentification, l'autorisation et la protection des données sont intégrées dans chaque fonctionnalité dès le départ. Nous supposons une violation et concevons en conséquence.

La Row Level Security au niveau de la base de données signifie que même une API compromise ne peut pas accéder aux données auxquelles elle ne devrait pas. La validation des entrées se produit à la périphérie avant que les requêtes n'atteignent notre backend.

La vie privée comme fonctionnalité produit

La vie privée n'est pas de la conformité — c'est un avantage concurrentiel. Nous ne collectons pas ce dont nous n'avons pas besoin. Nous anonymisons par défaut. Nous donnons aux utilisateurs le contrôle de leurs données.

Quand le RGPD ou d'autres réglementations changent, nous n'avons généralement rien à faire parce que nous avons déjà conçu pour une confidentialité maximale.