126 entrées

Le journal technique

Les bugs rencontrés et les patterns gardés, datés et cherchables, pris directement du carnet que je tiens en construisant.

Comment ça a cassé

12 / 126 entrées

Commencer ici

backend

Ce qu'un client a manqué pendant son absence

Socket.io brut te dit qu'un client s'est reconnecté. Il ne te dit pas s'il est à jour — et pour un écran sans surveillance, un trou silencieux est tout le problème.

devops

Ce qu'un test de charge te dit vraiment

Les erreurs de mesure qui invalident discrètement un résultat, et ce que « les chiffres ont empiré sous plus de charge » s'est révélé signifier.

backend

L'outbox transactionnel

Le problème de la double écriture, et le pattern vers lequel je vais maintenant sur chaque projet pour qu'un effet de bord ne puisse pas disparaître silencieusement.

security

Multi-tenant au niveau ligne, et le seul bug qui compte

Un schéma, un tenant_id sur chaque table, isolation imposée entièrement dans la logique applicative. Simple à exploiter, et exactement aussi solide que la discipline de chaque requête.

devops

Neuf Dockerfiles, et le retour à deux

Aucune mauvaise décision isolée — juste une douzaine de décisions individuellement raisonnables qui se cumulent. Comment l'installation Docker a proliféré, et la règle que j'en ai tirée.

backend

pgBouncer, et le bug search_path qui a corrompu des données

Le pooling de connexions devient nécessaire à l'échelle — et le transaction pooling a un bord tranchant qui écrivait silencieusement sur le mauvais schéma.

backend

Réparer l'état bloqué à chaque démarrage

Un processus qui meurt en plein workflow laisse quelque chose à moitié fini, et rien ne le fait transitionner — parce que la chose qui l'aurait fait a juste cessé d'exister. Lance une passe de récupération à chaque démarrage.

security

Révoquer un jeton qui est sans état par conception

Les JWT ne peuvent pas être repris une fois émis. Voici le trou que ça a créé, et le correctif à une colonne que je construis maintenant dès le premier jour.

security

Une borne n'est pas un utilisateur

Authentifier du matériel physique — une borne, un comptoir, un écran mural — comme sa propre classe d'identité, parce que le modèle de menace pour du matériel sans surveillance est vraiment différent.

backend

Une synchro hors-ligne vraiment sûre à rejouer

Mettre les actions en file hors-ligne est la moitié facile. Les rejouer sans dupliquer le travail ni corrompre l'état est la moitié qui a besoin de deux couches d'idempotence.

Comment elles ont cassé

Classées par mode de défaillance plutôt que par la partie de la stack concernée, parce que c'est ça qui se reporte d'un projet à l'autre. 15 sur 73 tombent dans une seule catégorie : ça ne pouvait pas marcher.

  • Ça ne pouvait pas marcher

    15

    Une course, un ordre, une colonne pour deux choses. La forme l'excluait avant même l'exécution.

  • Ça disait que ça marchait

    13

    Vert, 200, enregistré, « déjà géré » — et faux. Aucune erreur sur laquelle s'appuyer.

  • Deux copies ont divergé

    13

    Une idée tenue à la main à deux endroits — schéma et migration, dev et prod, app et app.

  • Le filet avait un trou

    13

    Le test, le journal d'audit, le scanner, la CI — couvrant moins que je ne le supposais.

  • Visible seulement en s'en servant

    11

    Invisible à la relecture du code. Trouvé en étant le vrai utilisateur, sur un vrai appareil, à une vraie largeur.

  • Construit, et rien ne s'en servait

    8

    Livré, typé, injecté, inatteignable. Rien ne l'a jamais appelé.

Où vivent les bugs

Les deux tiers se trouvent hors de la logique applicative — dans l'infrastructure, l'intégrité des données, ou la couche d'authentification.

infrastructure
17
intégrité des données
15
auth & sécurité
15
frontend
14
ingénierie
6
distribué & temps réel
6

73 total

Notes par domaine

backend
13
devops
11
security
10
frontend
9
learning
6
networking
4

53 total

Quand ils ont été trouvés

18
juil.
20
août
4
sept.
5
oct.