Don’t Repeat Yourself… but just a little bit anyway
It’s better to have a little intentional duplication than premature abstraction that mixes business rules that have no business being together.
It’s better to have a little intentional duplication than premature abstraction that mixes business rules that have no business being together.
Coding with an LLM is like managing a team: you have to balance delegation and move forward in small steps.
When should you throw an exception, return an error, or model the absence of an error? The answer lies in the business intent.
Before components, tokens. How to structure a coherent Design System using a well-thought-out token architecture.
An ORM lets you build the domain on entities it exposes, which are directly mapped to the database. This is the opposite of Hexagonal Architecture.
TypeScript is often used only superficially. This is particularly true for Union Types, which help prevent inconsistent states.
Exceptions are not meant to handle predictable errors. Discover the Result type, an alternative to try/catch.
PBT verifies that a business invariant is always satisfied regardless of the parameters and the return value of the function being tested.
A call for pragmatism in software development: avoid dogma, observe what works, and leave room for doubt.
Moving fast is easy. Maintaining that pace for years is more difficult and is the true mark of software quality.
It’s easy to blame developers. But bugs also stem from design, organization, and culture.
A model is never a faithful representation of reality, but an abstraction designed for a specific purpose. A model exists only through its use.
An example of algorithm optimization (the skyscraper game) and the lessons that can be learned from it. Pareto’s Law applies fully.
Hexagonal Architecture, formalized by Alistair Cockburn, aims to isolate the domain. It is based on dependency inversion and dependency injection.
CQRS is based on the idea of distinguishing between write and read models when operations are highly asymmetric. Use sparingly.
This metric isn’t very useful if you don’t know what it represents… However, it’s still interpretable—especially when it’s low!
Not all tests fit into a single test pyramid. Several aspects must be considered: purpose, granularity, and assertion methods.
"The job of an architect is to build a structure that allows decisions to be delayed as long as possible": 5 examples illustrating Uncle Bob’s point.
End-to-end tests should be used sparingly, as they are costly to write (Page Model) and costly to run. Here’s how to proceed.
We take care of a product, we help it grow, we tend to it day after day just as we care for a baby. We become attached to it, and that’s perfectly fine.
ADR helps streamline a team’s architectural decisions and prevents them from being constantly called into question.
Avoid over-anticipating: don’t lay the groundwork for future features; they remain hypothetical. Instead, write code that can evolve.
You don’t address all users in the same way. Each persona has its own language—and therefore its own context—and its own BFF (Backend For Frontend).
Ecology and software quality share Kant’s principle of universality: my action can only be good if everyone can act as I do.
This phrase, a DevOps mantra, is rooted in common sense. Yet the organization sometimes resists its implementation. CEOs, lay the groundwork.
Until everything is done, it’s as if nothing has been done. To avoid a refactoring’s tunnel effect: the Strangler Fig pattern, which lets the old and the new coexist.
You probably don’t need these microservices, which are so difficult to deploy. The monolith—provided it’s modular—is right for you.
The Walking Skeleton aims to lay a solid foundation for reaching the MVP while minimizing technical debt. It’s a step worth formalizing.
It would be a mistake to believe that functional design is the sole responsibility of the PM: we think more clearly when working together and using concrete examples.
Trunk-Based Development, which stems directly from Extreme Programming, is an excellent alternative to GitFlow, but be sure to thoroughly review the prerequisites.
2 common mistakes in dividing into Bounded Contexts: dividing by technical layers and dividing by entities. Think action verbs!
Building an object means starting with its behavior. The data it encapsulates is derived from that and constitutes an implementation detail.
In a legacy system on which many other systems depend, fixing a bug is not always recommended. It’s better to isolate it and maintain it.
"Clean Code" is a reference book: reading it linearly, from A to Z, would make little sense. You need to read it, experiment with the concepts, and revisit it frequently.
You call a library, but it’s the framework that calls you. The difference is inversion of control.
Working on software quality means working on architectures, paradigms, and methodologies—particularly clean code. The programming language doesn’t matter.
While TDD is a wonderful tool, it is not suitable for all development projects, as it risks falling prey to the “law of the instrument.”
The Mikado Method involves mapping out the dependencies of the refactoring, then refactoring starting from the leaves of the tree thus established.
Structural typing is limiting when it comes to defensive programming. Fortunately, it is possible to emulate nominal typing (branding).
A distinction must be made between development errors—which are handled with exceptions—and user input errors.
A portrait of Clément Cornen, a developer and, above all, a friend. Our values are very much aligned, both in development and in life.
Code is intangible. So, to make it more understandable, we use metaphors from the real world, particularly real estate.
Hexagonal Architecture aims to isolate the application and the domain from the infrastructure. The trade-off is that the infrastructure knows the domain.
First, focus on the system’s modularity at a large scale (strategic DDD). Tactical patterns are important, but they come later.
A point-by-point rebuttal of the seminal article by David Heinemeier Hansson, a critic of Test-Driven Development.
As it has become more widespread, the DevOps approach has strayed from its original spirit, sometimes to the point of being misinterpreted. Let’s set the record straight.
Code katas are the perfect setting to experiment with new ways of working by imposing constraints. Example: coding using only the keyboard.
EDA: a communication model that promotes the decoupling of contexts; ES: a coding model dedicated to traceability within a context.
Now, let’s hear from one of my clients, Ovrsea. Antoine, the CTO, explains how the idea to bring in coaching for his teams came about and what it has changed.
As agility has become more widespread, it has been misused, becoming synonymous with micromanagement and absurd practices. Yet we need agility now more than ever.
I challenge anyone to prove to me that it’s more efficient to do without static typing when building a JavaScript application.
Clean Code is a good starting point, followed by TDD and Functional Programming. Wait a bit before diving into DDD and refactoring!
The Golden Master method aims to prevent regressions during refactoring and relies on the prior creation of a set of functional logs.
Technologies are fleeting: invest in mastering architectures, paradigms, and methodologies, which will serve you throughout your life.
Technology is beautiful and fascinating, but it is not an end in itself. Information technology is there to solve problems in a pragmatic way.
Refactoring comes with two challenges: avoiding regressions and overcoming tunnel vision. To help you: Golden Master, the Mikado Method, and the Strangler Fig pattern.
Technical debt is dangerous because it accumulates silently, until the day the company hits a wall. CEOs, take the lead.
Writing code isn’t that hard; evolving it is. Readability, testability, modularity: the three pillars of software craftsmanship.