Des API conçues pour ceux qui les consomment
REST ou GraphQL, choisi en fonction des clients qui l'utiliseront et non par préférence. Gestion cohérente des erreurs avec les bons codes de statut, pagination qui tient sur de grandes collections, et versionnage en place avant d'en avoir besoin — car l'ajouter après coup pendant que des clients sont en production est douloureux.
Des modèles de données qui survivent à la prochaine fonctionnalité
Conception de schéma pensée pour les requêtes que vous exécuterez réellement, indexation appropriée et migrations réversibles. Nous utilisons des bases relationnelles, documentaires ou graphes selon la forme des données plutôt que par habitude.
Authentification et autorisation, tenues séparées
Authentification par session ou par jeton conforme aux pratiques actuelles, et un modèle de permissions vérifié côté serveur à chaque requête. Confondre qui vous êtes et ce que vous avez le droit de faire est l'une des causes les plus fréquentes de failles de contrôle d'accès.
Des intégrations qui échouent bruyamment
Connexions à des tiers avec reprises, temporisation exponentielle, idempotence et file d'attente des messages morts, ainsi qu'une alerte quand quelque chose s'arrête. Une intégration en échec doit réveiller quelqu'un, pas s'accumuler en silence.
Traitements en arrière-plan et planification
Des files d'attente pour tout ce qui est lent, peu fiable ou en pics — imports, exports, génération de documents, notifications — afin qu'une requête utilisateur n'attende jamais un tiers.
De l'observabilité dès le premier déploiement
Journalisation structurée, points de contrôle de santé et métriques sur les chemins qui comptent. Diagnostiquer un incident en production doit être une requête, pas une fouille archéologique.