Principe YAGNI, Comment écrire du code de qualité en évitant les fonctionnalités inutiles

Par KamangaJun 18, 202412 mins de lecture

YAGNI : Comment écrire du code de qualité en évitant les fonctionnalités inutiles

Introduction : Qu’est-ce que YAGNI ?

Mise en situation : vous travaillez sur un projet de développement, et vous vous dites que ce serait une bonne idée d’anticiper certains besoins futurs. Vous décidez donc d’ajouter une ou deux fonctionnalités "au cas où". Mais voilà, des mois plus tard, ces fonctionnalités ne sont toujours pas utilisées, et pire, elles compliquent la lecture et la maintenance du code. Cela vous semble familier ?

Si c’est le cas, vous n’êtes pas seul. Beaucoup de développeurs tombent dans ce piège : c’est là que le principe YAGNI (You Aren’t Gonna Need It) intervient. Formulé par Kent Beck dans le cadre de l’Extreme Programming, YAGNI est un des piliers du software craftsmanship, conçu pour éviter l’ajout de fonctionnalités inutiles. En l’appliquant correctement, vous gardez votre code simple, évolutif et sans surcharge. C’est exactement ce que j’observe dans des équipes que j’accompagne : chez un client dans le secteur bancaire, une estimation a révélé que près de 30 % du code ne répondait à aucun besoin actif, ce qui ralentissait chaque livraison et chaque onboarding.

Je vais vous montrer comment appliquer YAGNI de manière pratique dans votre code, avec des exemples concrets en Java. Vous comprendrez comment identifier et éviter les ajouts superflus pour écrire du code plus propre, plus rapide à tester et plus facile à maintenir.


Pourquoi appliquer YAGNI ?

Le principe de YAGNI n’est pas juste un mantra pour les puristes du code propre, il a des avantages concrets qui impactent la qualité de votre code et la productivité de votre équipe. Voici pourquoi appliquer YAGNI peut vraiment transformer votre manière de développer :

1. Réduction de la complexité

Chaque nouvelle fonctionnalité ajoutée au code, même si elle semble innocente, augmente la complexité globale. Cette complexité se traduit par plus de lignes de code à maintenir, des tests supplémentaires à écrire et un risque plus élevé de bugs. En évitant d'ajouter des fonctionnalités inutiles, vous simplifiez votre code et le rendez plus facile à comprendre pour vous et pour les autres développeurs qui le liront après vous.

2. Diminution de la dette technique

Ajouter des fonctionnalités que vous n’utiliserez peut-être jamais, c’est créer une forme de dette technique. Avec le temps, ces parties de code inutiles peuvent poser des problèmes : elles deviennent obsolètes, difficiles à maintenir ou doivent être adaptées pour fonctionner avec d’autres changements. En appliquant YAGNI, vous évitez d’accumuler cette dette, et vous restez concentré sur les fonctionnalités réellement nécessaires.

3. Gagner du temps et des ressources

Quand vous écrivez moins de code, vous gagnez du temps. Ce n’est pas seulement le temps passé à écrire, mais aussi celui passé à tester, déboguer et maintenir ce code. Cela permet à votre équipe de se concentrer sur des fonctionnalités qui apportent une réelle valeur au produit final, plutôt que de perdre du temps sur des éléments hypothétiques.

4. Favoriser la flexibilité

En vous concentrant uniquement sur ce qui est nécessaire, vous vous assurez que votre code est plus modulaire et prêt à évoluer. Un code simple est plus facile à adapter lorsqu’un nouveau besoin se présente réellement. YAGNI vous encourage à ne pas anticiper les besoins futurs, car ces besoins changent souvent avec le temps. En gardant votre code minimaliste, vous serez plus agile face aux demandes imprévues.


Votre équipe accumule des fonctionnalités que personne n’utilise ?

La base de code grossit, la dette technique s’accumule et personne ne sait vraiment ce qui est encore actif. Résultat : chaque modification est un risque, et la vélocité chute sprint après sprint. Réservons 30 minutes pour identifier ce qui freine réellement votre équipe et construire un plan d’action concret.

Comment identifier une fonctionnalité inutile ?

L’une des plus grandes difficultés dans l’application du principe YAGNI est de savoir si une fonctionnalité est réellement nécessaire ou non. La tentation d’ajouter des éléments "au cas où" peut être forte, mais voici quelques critères pour vous aider à identifier ce qui est superflu.

1. Demande immédiate ou hypothétique ?

Un des indicateurs les plus simples : est-ce que cette fonctionnalité répond à un besoin immédiat ? Si la réponse est non et qu’elle est seulement là pour anticiper un besoin futur potentiel, il est probable que vous n’en aurez pas besoin. YAGNI vous pousse à implémenter uniquement ce qui est nécessaire aujourd’hui. Si un jour ce besoin se présente, vous pourrez toujours l’ajouter au bon moment.

2. Est-ce que c’est nécessaire pour la fonctionnalité actuelle ?

Si cette nouvelle fonctionnalité n’est pas essentielle pour le fonctionnement de ce que vous êtes en train de développer, alors elle est peut-être inutile. Posez-vous cette question : "Est-ce que mon application marcherait toujours correctement sans cette fonctionnalité ?" Si la réponse est oui, il est probablement sage de la laisser de côté pour l’instant.

3. Est-ce que ça complique le code ?

Un autre bon indicateur est de voir si cette nouvelle fonctionnalité ajoute de la complexité au code existant. Si elle rend votre code plus difficile à lire, à tester ou à maintenir, c’est un signe clair qu’elle pourrait être inutile. Le code simple est toujours plus facile à faire évoluer, et YAGNI vous encourage à garder votre code aussi léger que possible.

4. Est-ce que c’est une demande externe ou interne ?

Parfois, la pression vient de l’extérieur : un client, un supérieur ou un collègue peut insister pour ajouter des fonctionnalités "juste au cas où". Dans ces situations, je vous recommande d'évaluer soigneusement si la demande est justifiée ou si elle repose sur des hypothèses. Expliquer les avantages du principe YAGNI peut aussi aider à éviter d’ajouter des fonctionnalités inutiles.

Exemples concrets en Java

Prenons un exemple simple en Java où vous pourriez être tenté d’ajouter une fonctionnalité inutile :

// Exemple où une fonctionnalité inutile est ajoutée
public class User {
    private String name;
    private int age;
    private String address; // Cette information n'est pas encore utilisée

    public User(String name, int age) {
        this.name = name;
        this.age = age;
        // On pourrait être tenté d'ajouter l'adresse dès maintenant, mais YAGNI !
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
    
    // On pourrait ajouter un getter pour l'adresse ici, mais ça serait prématuré.
}

Dans cet exemple, l’attribut address est inutile tant que le programme n’en a pas besoin. Selon YAGNI, ne l’ajoutez pas avant d’avoir une demande précise pour cette fonctionnalité.


Bonnes pratiques pour appliquer YAGNI en Java

Appliquer YAGNI de manière efficace demande de la discipline et une certaine maîtrise des principes de base du développement. Voici quelques bonnes pratiques qui vous permettront d’intégrer YAGNI dans votre quotidien, en particulier lorsque vous écrivez du code Java.

1. Utilisez les tests pour guider votre développement

L’une des meilleures manières de ne pas anticiper inutilement est d’adopter une approche Test-Driven Development (TDD). En TDD, vous écrivez d’abord un test pour la fonctionnalité spécifique que vous souhaitez implémenter, puis vous écrivez juste assez de code pour passer ce test. Cela vous oblige à vous concentrer uniquement sur ce qui est nécessaire pour faire fonctionner votre application.

Exemple en Java :

@Test
public void testAddUser() {
    User user = new User("Alice", 30);
    assertEquals("Alice", user.getName());
    assertEquals(30, user.getAge());
}

Avec ce test, vous vous concentrez uniquement sur l’ajout de l’utilisateur avec un nom et un âge. Tant qu’il n’existe pas de test nécessitant l’adresse, n’ajoutez pas d’attribut address à la classe User.

2. Évitez de généraliser trop tôt

Un autre piège commun est de vouloir tout de suite rendre votre code trop générique ou flexible. Par exemple, vous pourriez penser qu’une méthode pourrait être réutilisée plus tard et vouloir la rendre paramétrable. Mais en réalité, si cette flexibilité n’est pas nécessaire maintenant, elle pourrait ne jamais l’être.

Exemple à éviter :

public class MathOperations {
    // On pourrait être tenté de rendre cette méthode très générique
    public int multiply(int a, int b, boolean absoluteValues) {
        if (absoluteValues) {
            return Math.abs(a) * Math.abs(b);
        } else {
            return a * b;
        }
    }
}

Cette méthode introduit de la complexité inutile (avec le paramètre absoluteValues) si votre programme n'a besoin que de multiplier des nombres sans se préoccuper de leur signe. La solution YAGNI serait de garder la méthode simple :

public class MathOperations {
    public int multiply(int a, int b) {
        return a * b;
    }
}

3. Refactorisez régulièrement votre code

Refactoriser régulièrement vous permet de retirer les fonctionnalités qui sont devenues inutiles au fil du temps. Parfois, un projet évolue et certaines parties du code, ajoutées dans l’anticipation de besoins futurs, ne sont jamais utilisées. Ce que j’observe sur le terrain : maintenir un code propre et minimal facilite les modifications et évite que du code non nécessaire ne s’accumule.

4. Collaborez avec votre équipe sur les fonctionnalités

Travailler en équipe demande de la communication, surtout en ce qui concerne la prise de décision sur les fonctionnalités. Si quelqu’un propose d’ajouter une nouvelle fonctionnalité, assurez-vous qu’il existe un besoin clair et immédiat. Si c’est pour anticiper des besoins futurs, demandez si ces besoins sont confirmés ou s’il s’agit simplement d’une spéculation.

Exemple de réflexion d’équipe :

"Est-ce que cette fonctionnalité sera utilisée par les utilisateurs actuels ? Sinon, nous pourrions la développer plus tard si un besoin réel émerge."

5. Ne pas coder pour des fonctionnalités hypothétiques

Souvent, vous vous dites que certaines fonctionnalités seront utiles dans le futur, mais bien souvent, ces hypothèses sont fausses. Pour appliquer YAGNI, codez uniquement pour répondre aux exigences actuelles du projet. Les fonctionnalités futures seront ajoutées en temps voulu, lorsque les besoins seront confirmés.


Erreurs courantes et objections liées à YAGNI

Même si le principe YAGNI paraît simple en théorie, de nombreuses erreurs sont commises lorsqu’il est mis en pratique. De plus, certains développeurs expriment des réticences à l’appliquer strictement. Voici quelques erreurs courantes et les objections les plus fréquentes que j’entends au sujet de YAGNI dans les équipes que j’accompagne.

1. Erreur : Préparer le code pour des scénarios hypothétiques

L’une des erreurs les plus répandues est de croire que l’ajout d’une fonctionnalité "juste au cas où" est une bonne pratique. Cela part souvent d’une bonne intention, mais cela mène presque toujours à une complexité inutile. En réalité, la majorité des "cas potentiels" anticipés ne se présentent jamais.

Exemple :

Imaginons que vous ajoutez un traitement pour gérer des devises dans une application qui ne fait encore que des transactions en euros. En supposant que, peut-être un jour, l’application gérera plusieurs devises, vous commencez à ajouter du code pour les conversions monétaires. Pourtant, si ce besoin ne devient jamais concret, vous vous retrouvez avec du code qui alourdit votre application sans apporter de valeur.

2. Erreur : Ne pas s’adapter à l’évolution des besoins

Certaines personnes confondent YAGNI avec un refus d’anticiper totalement. YAGNI ne signifie pas que vous ne devriez jamais changer ou adapter votre code aux nouvelles exigences. Il s’agit plutôt de ne pas écrire du code en prévision d’un besoin qui pourrait ne jamais exister. Si un nouveau besoin émerge effectivement, c’est alors le bon moment pour l’ajouter.

Exemple :

Si, dans votre application, un nouveau client demande une fonctionnalité spécifique, il est tout à fait légitime de l’ajouter. L’important est de s’assurer que cette demande est confirmée, et non basée sur des spéculations.

3. Objection : "Si je ne l’ajoute pas maintenant, je devrai tout refaire plus tard"

Cette peur est fréquente, surtout chez les développeurs qui souhaitent éviter de retourner sur des morceaux de code plus tard. Pourtant, YAGNI vous encourage à ne pas surcharger votre code en essayant d’anticiper tous les futurs possibles. Quand un besoin précis survient, vous pourrez y répondre avec une solution adaptée à la situation actuelle, et souvent cela sera bien plus efficace que si vous aviez tenté d’anticiper toutes les variables dès le départ.

4. Objection : "Mon client ou mon chef veut toujours plus de fonctionnalités"

Il arrive que des clients ou des supérieurs souhaitent des fonctionnalités supplémentaires "au cas où", sans vraiment savoir s’ils en auront besoin. Dans ce cas, je vous recommande d’expliquer pourquoi YAGNI est avantageux, à la fois pour réduire la complexité du produit et pour économiser du temps et des ressources. L’argument est simple : en évitant d’ajouter des fonctionnalités inutiles, vous réduisez les coûts de développement à court terme et vous gardez le code plus flexible pour l’avenir.

5. Erreur : Se limiter par peur de manquer d’anticipation

À l’inverse, certains développeurs peuvent mal comprendre YAGNI et éviter de préparer le code à des extensions évidentes, même lorsque le besoin futur est bien identifié. YAGNI ne signifie pas d’ignorer complètement les futurs possibles, mais de les traiter uniquement lorsque le besoin est avéré. Si vous savez qu’une fonctionnalité sera nécessaire, ne pas l’implémenter pourrait être contre-productif. L’idée est d’avoir la souplesse de rajouter des fonctionnalités en temps voulu, pas d’éviter de faire évoluer le produit.


FAQ : Réponses aux questions fréquentes sur YAGNI

1. Qu’est-ce que YAGNI ?

YAGNI signifie "You Aren’t Gonna Need It" et fait partie des principes de software craftsmanship. Il encourage les développeurs à ne pas ajouter de fonctionnalités inutiles ou prématurées dans leur code, en se concentrant uniquement sur les besoins actuels plutôt que sur des hypothèses de besoins futurs.

2. Quand devrais-je appliquer YAGNI ?

Appliquez YAGNI dès que vous vous demandez si une fonctionnalité que vous êtes en train de coder sera réellement utilisée ou si vous l’ajoutez juste par anticipation. Si cette fonctionnalité ne répond pas à un besoin immédiat, elle est probablement superflue.

3. Comment puis-je expliquer YAGNI à mon équipe ou à mon client ?

La meilleure façon d’expliquer YAGNI est de montrer comment ce principe aide à maintenir un code simple, évolutif, et moins coûteux à long terme. En ajoutant des fonctionnalités hypothétiques, vous augmentez la complexité, ce qui rend la maintenance plus difficile et coûteuse. En restant focalisé sur ce qui est nécessaire, vous économisez du temps et des ressources.

4. Et si j’ai vraiment besoin de cette fonctionnalité plus tard ?

YAGNI ne vous empêche pas d’ajouter des fonctionnalités quand elles deviennent réellement nécessaires. Le principe encourage simplement à ne pas anticiper des besoins incertains. Si un besoin futur se concrétise, vous pourrez ajouter la fonctionnalité à ce moment-là, avec une meilleure compréhension des exigences.

5. YAGNI est-il compatible avec les méthodes agiles ?

Absolument. YAGNI s’intègre parfaitement dans les méthodologies agiles qui mettent l’accent sur la livraison rapide de la valeur et l’adaptation aux besoins changeants. En vous concentrant sur les besoins actuels et en livrant des incréments de valeur fonctionnelle, vous répondez aux exigences du client sans surcharger le produit avec des fonctionnalités inutiles.

6. Comment éviter de coder pour des scénarios hypothétiques ?

La meilleure manière est de s’en tenir strictement aux exigences du projet et d’utiliser des pratiques comme le Test-Driven Development (TDD). En n’écrivant que le code nécessaire pour faire passer les tests, vous restez focalisé sur l’essentiel sans vous égarer dans des fonctionnalités anticipées.

7. Quels sont les risques de ne pas appliquer YAGNI ?

Ne pas appliquer YAGNI conduit à un code plus complexe et plus difficile à maintenir. Cela peut également augmenter la dette technique, car les fonctionnalités ajoutées prématurément peuvent devenir obsolètes, ou être mal adaptées lorsque les véritables besoins émergent.


Conclusion

Le principe YAGNI est un excellent guide pour garder votre code simple, propre et focalisé sur ce qui compte réellement : répondre aux besoins immédiats de votre projet. En l’appliquant correctement, vous éviterez d’ajouter des fonctionnalités inutiles qui compliquent la maintenance et augmentent la dette technique. J’espère que ces exemples en Java vous aideront à mieux intégrer YAGNI dans vos pratiques de développement au quotidien.

Ressource gratuite : Votre équipe livre-t-elle aussi vite qu'elle le pourrait ?

30 questions, 5 dimensions, score sur 100. Mesurez la maturité engineering de votre équipe avec le benchmark utilisé dans des DSI de 50 à 800+ développeurs — et identifiez vos 3 chantiers prioritaires.


Ecris par Kamanga

Expert IT avec 25 ans d'expérience en développement logiciel, diplômé EPITECH et MBA. Spécialisé en software craftsmanship, gestion du changement, stratégie, direction des systèmes d'information, coaching et certifié en agilité.