Add new article about complexity-is-the-lazy-solution

This commit is contained in:
nemunaire 2026-03-13 16:07:18 +07:00
commit c1cf6ceed5
2 changed files with 383 additions and 0 deletions

View file

@ -0,0 +1,193 @@
---
title: Complexity Has Become the Lazy Solution
date: !!timestamp '2026-03-13T15:08:00+07:00'
translationKey: complexity-lazy-solution
tags:
- architecture
- infrastructure
- cloud
---
In software engineering, complexity is often seen as a sign of professionalism.
A simple system looks suspicious.\
A complex system looks serious.
Yet my experience has repeatedly shown the opposite.
<!-- more -->
## A decade of success is not enough to convince
In my final year of engineering school, I built a CTF platform.
At the time, no tool like CTFd existed.
Everything had to be built from scratch.
I made simple choices: serve static files to reduce the attack surface, generated on demand; classic Unix services glued the pieces together, low-level containers isolated services from one another.
The first year was a bit chaotic, as any first attempt tends to be.
But iteration after iteration, the system stabilized.
A few well-scoped micro-services came to structure the critical parts.
And for ten years, it ran like clockwork.
No major incidents.
No outage caused by a poorly understood service going down.
Yet every time I presented the architecture, I ran into the same questions:
- Why isn't there Kubernetes?
- Why are you using the filesystem like that?
- Why isn't there a REST API?
I never managed to convince anyone.
When I left, my work was thrown away.
The new solution is built on CTFd: a generic product that requires far more computing power, offers fewer features, and runs on Kubernetes, of course.
Since then, I keep asking myself the same question: **why does the software industry value complexity over simplicity?**
## Complexity has become the default reaction
Today, faced with a technical problem, the instinctive reaction is almost always the same: add more.
More machines, more software layers, more cloud, more abstractions.
CPU at 100%? Add more CPU.\
The system is slow? Migrate to the cloud.\
The architecture doesn't look right? Switch to microservices.
But these decisions are often made before anyone has understood the problem.
**When a system becomes slow, the modern reaction is to add servers. An engineer's reaction should be to ask why.**
Saying "it's slow" is not a diagnosis.
It's an admission that you've lost control of your system.
## A simple system is a mastered system
I'm not advocating for a lack of technology.
A simple system is not a rudimentary system.
It's a system where every element has a reason to exist.
A mastered system is one where:
- you know why the CPU is saturated;
- you know why you need an additional network card;
- you know why a faster disk is necessary;
- costs are genuinely understood, not just "10% less than last month."
This is the opposite of what I see in many companies.
Starting with cloud provider dashboards: meant to represent the state of the art, they are themselves frustratingly slow.
When the tools selling you performance are not themselves performant, that should be a signal.
## The paradox of professionalism
In many organizations, complexity has become a marker of seriousness.
I experienced this firsthand.
My Unix architecture, my static files, my lightweight micro-services: all of it was perceived as tinkering.
While other event organizers struggled with their servers and CTFd, my system ran without a hitch.
Yet to the executive team, if some "engineer's tinkering" works for 10 years, it must not have been that complicated.
On the other hand, a stack with Kubernetes, Kafka, and a service mesh will immediately be seen as "a real architecture."
Even if no one on the team truly understands it.
**A simple system looks amateur. A complex system looks professional.**
This phenomenon has several roots.
There is mimicry: copying Netflix and Google architectures without considering their constraints.
It's the equivalent of building a three-Michelin-star restaurant kitchen to cook pasta.
There is fear of blame: if the system breaks and you're using "industry standards," no one will be pointed at.
And there is the résumé effect: working with Kubernetes and Kafka boosts a career. Postgres and a monolith, much less so.
## The *custom* doesn't disappear — it just moves
When my system was replaced by CTFd, in the name of standardization, the non-standard didn't disappear.
It just changed location.
Sure, the core became a generic product, but everything around it — the orchestration, the scripts, the duct tape, the adaptations — became the new *custom*.
And that code is often worse: less coherent, more scattered, less thoughtfully designed as a whole.
You replace a system conceived as a whole with an accumulation of workaround layers.
This is extremely common with modern architectures.
You don't eliminate "complexity" — you move it to less visible, less controlled places.
Worse still, you have to keep up with the standard's evolution constantly: adapting your customizations, fighting structural changes, praying for [the goodwill of others](https://news.ycombinator.com/item?id=46136023).
## The cloud as a lazy solution
As a logical consequence, the cloud is today the primary lazy solution.
Not because it's useless — it has legitimate use cases — but because it allows you to mask problems instead of solving them.
Faced with a technical problem, there are two paths.
The first: measure, understand, analyze.
The second: add resources, pile on abstractions, move the problem elsewhere.
Why has the second path become the norm?
**Adding machines is often easier than understanding a program.**
And that is where the real laziness lies.
Not in choosing simple hosting or a lightweight architecture.
But in refusing to understand what is actually happening inside the system.
## Minimalism is not the absence of complexity
Some systems are extremely complex, and that's perfectly fine.
Google's search engine, Criteo's real-time ad auctions, ...: these are surgical systems where every component is justified, sometimes multiple times over.
That is exactly what minimalism in engineering means: keeping only the complexity that is indispensable.
**Complexity is not a problem. Unnecessary complexity is.**
A startup with a few thousand users and a team of five developers does not face the same constraints as Netflix.
Yet many deploy the same architectures.
## AI makes this problem even more urgent
Today, AI tools can produce code and architectures at an unprecedented pace.
An entire system can be generated in a matter of hours.
This means **producing complexity has never been easier**.
In this context, the essential skill is shifting.
It is no longer just knowing how to code.
It is knowing how to contain the complexity that gets produced.
To remain in a reflective position rather than rushing headlong toward the first generated solution.
AI is a formidable tool for quickly pivoting toward alternative solutions, for exploring different approaches.
But you still need the perspective required to choose the right one.
**Machines are learning to produce complexity. Engineers must learn to contain it.**
## The real role of the engineer
An engineer is not a code producer.
Their role is to understand systems, master resources, and eliminate unnecessary complexity.
A very good engineer often does *less*.
A well-designed system looks almost too simple.
And that is precisely why it goes unrecognized: **success erases the perception of difficulty.**
When everything has been working for ten years, people end up thinking it couldn't have been that hard.
As I sometimes hear: today, the rarest skill in software is not writing code. It's knowing when not to.
## Simplicity is a discipline
Simplicity is not an absence of technology.
It is the result of demanding engineering work.
It requires measurement, observation, and reflection.
It sometimes requires resisting the social pressure that pushes toward complexity.
And in a world where machines can generate increasingly complex systems, the engineer's responsibility is to keep those systems understandable.
**Simplicity is not amateurism. It is what engineering produces when it matures.**

View file

@ -0,0 +1,190 @@
---
title: La complexité est devenue la solution paresseuse
date: !!timestamp '2026-03-13T15:08:00+07:00'
translationKey: complexity-lazy-solution
tags:
- architecture
- infrastructure
- cloud
---
En informatique, la complexité est souvent perçue comme un signe de professionnalisme.
Un système simple paraît suspect, tandis qu'un système complexe paraît sérieux.
<!-- more -->
## Une décennie de réussites ne suffit pas à convaincre
En dernière année d'école d'ingénieurs, j'ai construit une plateforme de CTF.
À l'époque, il n'existait pas d'outil comme CTFd.
Il fallait donc tout faire soi-même.
J'ai fait des choix simples : servir des fichiers statiques pour réduire la surface d'attaque, générés lorsque nécessaire ; les services Unix classiques faisaient le lien entre les briques, les conteneurs bas niveau isolaient les services entre eux.
La première année a été un peu chaotique, comme tout premier jet.
Mais d'itération en itération, le système s'est stabilisé.
Quelques "micro-services" bien découpés sont venus structurer les parties critiques.
Et pendant dix ans, cela a tourné comme du papier à musique.
Pas d'incident majeur.
Pas de coupure à cause d'un service mal maîtrisé qui tombe.
Pourtant, à chaque fois que je présentais l'architecture, je me heurtais aux mêmes questions :
- Pourquoi il n'y a pas Kubernetes ?
- Pourquoi utiliser le système de fichiers comme ça ?
- Pourquoi il n'y a pas d'API REST ?
Je n'ai jamais réussi à convaincre.
Quand je suis parti, mon travail a été mis à la poubelle.
La nouvelle solution repose sur CTFd : un produit générique qui nécessite beaucoup plus de puissance de calcul, offre moins de fonctionnalités, une interface austère et tourne bien sûr sur Kubernetes.
Depuis, je me pose la même question : **pourquoi l'industrie informatique valorise-t-elle la complexité plutôt que la simplicité ?**
## La complexité est devenue la réaction par défaut
Aujourd'hui, face à un problème technique, la réaction instinctive est presque toujours la même : ajouter.
Plus de machines, plus de couches logicielles, plus de cloud, plus d'abstractions.
Le CPU est à 100 % ? On ajoute du CPU.\
Le système est lent ? On migre vers le cloud.\
L'architecture ne plaît pas ? On passe aux microservices.
Mais ces décisions sont souvent prises avant même d'avoir compris le problème.
**Quand un système devient lent, la réaction moderne est d'ajouter des serveurs. La réaction d'un ingénieur devrait être de se demander pourquoi.**
Dire « c'est lent » n'est pas un diagnostic.
C'est l'aveu que l'on a perdu la maîtrise de son système.
## Un système simple est un système maîtrisé
Je ne prône pas l'absence de technologie.
Un système simple n'est pas un système rudimentaire.
C'est un système où chaque élément a une raison d'exister.
Un système maîtrisé, c'est un système où :
- on sait pourquoi le CPU est saturé ;
- on sait pourquoi on a besoin d'une carte réseau supplémentaire ;
- on sait pourquoi un disque plus rapide est nécessaire ;
- les coûts sont réellement compris, pas juste « 10 % de moins que le mois dernier ».
C'est l'inverse de ce que je constate dans beaucoup d'entreprises.
À commencer par les interfaces des fournisseurs de cloud : censées représenter l'état de l'art, elles sont elles-mêmes d'une lenteur frustrante.
Quand les outils qui vous vendent de la performance ne sont pas performants, il devrait y avoir comme un signal.
## Le paradoxe du professionnalisme
Dans beaucoup d'organisations, la complexité est devenue un marqueur de sérieux.
J'ai vécu ça de l'intérieur.
Mon architecture Unix, mes fichiers statiques, mes micro-services légers : tout cela était perçu comme du bricolage.
Pendant que les autres organisateurs dans l'événement se battaient avec leurs serveurs et CTFd, mon système tournait sans problème.
Pourtant pour l'exécutif, si du "bricolage d'ingénieur" fonctionne pendant 10 ans, c'est que ce nest pas si compliqué.
À l'inverse, une stack avec Kubernetes, Kafka et un service mesh sera immédiatement perçue comme « une vraie architecture ».
Même si personne dans l'équipe ne la comprend finement.
**Un système simple paraît amateur. Un système complexe paraît professionnel.**
Ce phénomène a plusieurs racines.
Il y a le mimétisme : on copie les architectures de Netflix et Google sans considérer leurs contraintes.
C'est l'équivalent de construire une cuisine de restaurant trois étoiles pour faire des pâtes.
Il y a la peur du blâme : si le système casse et qu'on utilise « les standards de l'industrie », personne ne sera pointé du doigt.
Et il y a l'effet CV : travailler avec Kubernetes et Kafka, ça valorise une carrière. Postgres et un monolithe, beaucoup moins.
## Le *custom* ne disparaît pas, il se déplace
Quand mon système a été remplacé par CTFd, au profit de la standardisation, le non-standard n'a pas disparu.
Il a juste changé d'endroit.
Certes le cœur est devenu un produit générique, mais tout ce qu'il y a autour : l'orchestration, les scripts, le scotch, les adaptations, sont devenus le nouveau *custom*.
Et ce code-là est souvent pire : moins cohérent, plus dispersé, moins réfléchi globalement.
On remplace un système pensé comme un tout par une accumulation de couches de contournement.
C'est très courant avec les architectures modernes.
On ne supprime pas la "complexité", on la déplace dans des endroits moins visibles et moins maîtrisés.
Pire encore, il faut suivre les évolutions du standard constamment : adapter ses personnalisations, lutter contre les changements structurels, prier pour [les bonnes âmes](https://news.ycombinator.com/item?id=46136023).
## Le cloud comme solution paresseuse
Suite logique, le cloud est aujourd'hui la principale solution paresseuse.
Non pas parce qu'il est inutile, il a des cas d'usage légitimes, mais parce qu'il permet de masquer les problèmes au lieu de les résoudre.
Face à un problème technique, il y a deux chemins.
Le premier : mesurer, comprendre, analyser.
Le second : ajouter des ressources, empiler des abstractions, déplacer le problème.
Pourquoi le second chemin est devenu la norme ?
**Ajouter des machines est souvent plus facile que comprendre un programme.**
Et c'est là que se situe la vraie paresse.
Pas dans le choix d'un hébergement simple ou d'une architecture légère.
Mais dans le refus de comprendre ce qui se passe réellement dans le système.
## Le minimalisme n'est pas l'absence de complexité
Certains systèmes sont extrêmement complexes et c'est normal.
Le moteur de recherche de Google, les enchères publicitaires temps réel de Criteo, ... : ce sont des systèmes chirurgicaux où chaque brique est justifiée, parfois plusieurs fois.
C'est exactement cela, le minimalisme en ingénierie : ne garder que la complexité indispensable.
**La complexité n'est pas un problème. La complexité inutile en est un.**
Une start-up avec quelques milliers d'utilisateurs et une équipe de cinq développeurs n'a pas les mêmes contraintes que Netflix.
Pourtant, beaucoup déploient les mêmes architectures.
## L'IA rend ce problème encore plus urgent
Aujourd'hui, les outils d'IA savent produire du code et des architectures à une vitesse inédite.
On peut générer un système entier en quelques heures.
Cela veut dire que **la production de complexité n'a jamais été aussi facile**.
Dans ce contexte, la compétence essentielle change.
Elle n'est plus seulement de savoir coder.
Elle est de savoir contenir la complexité produite.
De rester en position de réflexion plutôt que de foncer tête baissée vers la première solution générée.
L'IA est un outil formidable pour pivoter rapidement vers des solutions alternatives, pour explorer des approches différentes.
Mais encore faut-il avoir le recul nécessaire pour choisir la bonne.
**Les machines apprennent à produire de la complexité. Les ingénieurs doivent apprendre à la contenir.**
## Le rôle réel de l'ingénieur
Un ingénieur n'est pas un producteur de code.
Son rôle est de comprendre les systèmes, de maîtriser les ressources et d'éliminer la complexité inutile.
Un très bon ingénieur fait souvent *moins*.
Un système bien conçu paraît presque trop simple.
Et c'est précisément pour ça qu'il n'est pas reconnu : **le succès efface la perception de la difficulté.**
Quand tout marche depuis dix ans, les gens finissent par penser que ça n'a pas dû être bien compliqué.
Comme je l'entends parfois : aujourd'hui, la compétence la plus rare en informatique n'est pas d'écrire du code. C'est de savoir ne pas en écrire.
## La simplicité est une discipline
La simplicité n'est pas une absence de technologie.
C'est le résultat d'un travail d'ingénierie exigeant.
Ça demande de la mesure, de l'observation, de la réflexion.
Ça demande parfois de résister à la pression sociale qui pousse vers la complexité.
Et dans un monde où les machines savent générer des systèmes toujours plus complexes, la responsabilité de l'ingénieur est de garder ces systèmes compréhensibles.
**La simplicité n'est pas de l'amateurisme. C'est ce que l'ingénierie produit quand elle devient mature.**