← Retour aux travaux

Outils internes et données

MinskyBudget

Une application de budget où l'interface n'a pas le droit de calculer. Toute la logique financière vit dans un moteur séparé, couvert par 22 tests unitaires.

  • TypeScript
  • React
  • Tests unitaires
22tests unitaires
En ligneaccessible publiquement

L'intention

La plupart des applications de budget se contentent d'additionner des dépenses. Celle-ci répond à des questions plus utiles : est-ce que mon taux d'endettement est tenable, est-ce que mon fonds d'urgence couvre assez de mois, et est-ce que ce projet que j'ai en tête est à ma portée ou non.

Le nom vient de Hyman Minsky, économiste qui a travaillé sur la fragilité financière — l'idée que la stabilité apparente encourage justement la prise de risque.

Ce que j'ai construit

Un moteur de calcul en TypeScript, totalement séparé de l'interface : ratio d'endettement, objectif et progression du fonds d'urgence, répartition et transferts entre les membres d'un même ménage, et une évaluation de faisabilité qui renvoie un signal rouge, orange ou vert.

L'interface se contente d'afficher ce que le moteur renvoie. Elle ne recalcule jamais un ratio elle-même, même quand ce serait plus court à écrire.

Pourquoi séparer la logique

Une règle de calcul dupliquée entre l'écran et le moteur finit toujours par diverger : on corrige d'un côté, on oublie l'autre, et l'utilisateur voit deux chiffres différents pour la même chose.

En isolant la logique, elle devient testable sans navigateur. Les 22 tests couvrent les cas limites — revenus nuls, dettes supérieures aux revenus, ménage à un seul membre — ceux qu'on ne pense jamais à essayer à la main.

C'est aussi la structure qui permettrait de réutiliser le moteur ailleurs : une ligne de commande, une API, une autre interface.

Ce que j'en retire

La discipline « la vue n'a pas le droit de calculer » a coûté un peu de temps au début et en a fait gagner beaucoup ensuite. C'est devenu ma façon par défaut de structurer une application.

À compléter si utile : date de la première version, et si l'app est utilisée par quelqu'un d'autre que toi.