Je me trouve enfreindre ce modèle tout le temps. p>
yagni - vous n'en aurez pas besoin p> blockQuote>
Je ne suis qu'un développeur junior, mais je trouve même les développeurs de niveau supérieur qui font la même chose. p>
"Eh bien, ce système pourrait l'utiliser, et celui-ci, alors allons -ons la concevoir." p> blockQuote>
Parfois, je m'attrape moi-même, mais la plupart des moments où je courais sauvage. Est-ce que quelqu'un a des conseils pour coller à Yagni, ou tout ce que je peux faire pour mieux appliquer ce modèle de conception pendant que je concevons et codez? P>
15 Réponses :
Il est bon de concevoir vos applications de manière à rendre les fonctionnalités futures plus faciles à mettre en œuvre - mais ne mettez pas en train de mettre en œuvre les fonctionnalités tant que vous n'avez pas besoin. Comment faire de cela est entièrement dépendant du projet que vous travaillez. P>
Je trouve des critiques de pairs et une aide à la programmation par des pairs avec cela. Un autre ensemble d'yeux interrogatifs que votre raisonnement identifiera rapidement les choses que vous pensez avoir besoin, mais ne faites pas vraiment. P>
Quelles sont les critiques de pairs et la programmation par des pairs?
Mon interprétation serait que les examens par des pairs sont où vos autres développeurs examinent votre code et donnent des commentaires sur la manière dont il bascule, craint ou pourrait être amélioré. La programmation par des pairs a simplement 2 développeurs ou plus travaillent ensemble sur une fonctionnalité de certaines fonctionnalités où j'ai vu une paire de programmeurs ajoutez un de plus au mélange.
Si vous suivez Agile, vous pouvez travailler sur les choses importantes jusqu'à ce que vous arriviez dans les choses que vous n'allez pas avoir besoin. Au moment où vous arrivez aux trucs Yagni, vous devriez avoir un produit à peu fini. Il serait alors à l'entreprise de vous dire d'arrêter de développer des choses. P>
conception pour quelque chose p>
... est complètement différent de p>
concevoir quelque chose. P>
Conception pour quelque chose signifie que vous archivant votre demande d'expansion future au cas où le besoin est de rédiger le code (qui est bon ... Cela signifie que vous rendez votre logiciel extensible et facile à entretenir). P >
concevoir quelque chose signifie que vous écrivez la pièce entière maintenant ... si vous pensez que tout le monde va réellement l'utiliser ou non. Ce n'est pas nécessairement une mauvaise chose, mais cela peut être une énorme perte de temps. P>
Faites attention à ce que vous faites. p>
Yagni est vraiment une question à poser. En tant que développeurs seniors, nous violons Yagni tout le temps. C'est vraiment une question de "besoin". En as-tu besoin? Définir "besoin". J'ai vu des boules de boue terribles développées à l'aide du dogme Yagni. P>
Pas que je pense que Yagni n'est pas utile ... il est toujours utile de demander "Ai-je besoin de cela". P>
Cela a quelque chose à voir avec le perfectionnisme. Faisons-le parfaitement, préparons-le pour tous les scénarios futurs possibles. P>
Cela aide à être pragmatique et sobre lorsque vous décidez des chances, il sera nécessaire de répondre à "oui" ou "non". Peut-être est un non. P>
Sauf indication de preuve claire, il sera nécessaire (c'est à l'ordre du jour, on a été demandé par un client) et vous voyez qu'il est préférable de prendre en compte cette fonctionnalité future dans votre conception actuelle, laissez-la maintenant. p>
Cela dépend également du coût. Parfois, il est très bon marché de faire une allocation à une étape initiale et il serait coûteux d'ajouter la fonctionnalité plus tard. Par exemple, la sécurité, l'internationalisation, l'évolutivité.
Accepter. Tout dépend de la situation.
En outre, il est parfois bon marché d'ajouter quelque chose, mais prend ensuite une quantité extraordinaire d'effort pour le supprimer lorsqu'il devient clair, cela ne sera jamais nécessaire.
Yagni est souvent une chose de recul. Assurez-vous simplement que vous êtes suffisamment agile pour enlever le "I" quand "Yagni" devient évident. P>
Le je suppose que ça. Voulez-vous dire l'A?
Nope, je voulais dire "assez agile pour l'éliminer quand tu n'aurais pas besoin que cela devienne évident". En d'autres termes, dès que vous réalisez Yagni, n'ayez pas peur de tirer du code.
Voulez-vous dire «supprimer-le lorsque vous N'a-t-il pas I> Apparemment en avez-vous besoin», mais indiqué dans une phrase très difficile?
Utilisez simplement TDD !!! P>
Rarement, vous vous retrouverez à écrire un test pour une fonctionnalité que vous n'avez pas besoin ... p>
C'est un commentaire intéressant. Le codage est une sorte de «la partie amusante» et beaucoup de Yagni est que les programmeurs vont amusez-vous à écrire du code supplémentaire. Si le test n'est pas aussi amusant ... ça contrebalance.
Intéressant en effet, mais difficile à croire. Quand je trouve une justification personnelle pour écrire le code Yagni et avoir un Raitonale pour écrire des tests pour mon code, qu'est-ce qui m'arrête de rédiger des tests pour Yagni Code? Et si les fonctionnalités sont plafonnées car les tests d'écriture sont ennuyeux, ce qui protège les fonctionnalités nécessaires? Mais alors, IMO TDD tente de résoudre les problèmes d'écriture de code en écrivant plus de code.
En fait, j'ai trouvé un code de test d'écriture beaucoup plus intéressant et drôle. C'est parce que TDD n'est pas simplement un moyen d'écrire des tests, mais un design Tecnique. Évidemment, il est difficile d'atteindre, mais il n'y a pas de déjeuner gratuit: si vous voulez un bon code, vous devez apprendre beaucoup. TDD est juste un OD la façon de Ebst d'apprendre.
C'est exactement là où je me méfie TDD - J'ai toujours compris la conception comme un compromis entre les exigences concurrentes, tandis que TDD semble optimiser pour la qualification. (Plutôt, différentes exigences qui vont un long chemin ensemble, puis se sont séparées dans des directions très différentes).
Ici je suis en désaccord. Habituellement, la testabilité est au moins orthogonale à d'autres exigences telles que la performance ou la flexibilité. Si nous voulons vraiment trouver un lien, nous pouvons dire que lorsque le code est testable, il est généralement aussi rapide et facile à changer. Lorsque le code est invisible, il est généralement aussi lent et difficile de lire et de changer. Il n'y a pas de compromis à faire entre le code lisible et le code illisible, entre le code refadicable et non irréfléchi. Évidemment, si vous souhaitez beaucoup de fonctionnalités et de flexibilité, le code devient plus compliqué. Pourtant, cela ne doit pas devenir illisible ou même pire un gâchis!
Si vous construisez une bibliothèque / une boîte à outils / plateforme / cadre, Yagni prend une signification différente. P>
Vous ne pouvez pas être sûr de la manière dont les autres développeurs vont utiliser votre outil, et il est parfois difficile de concevoir une flexibilité, de sorte que votre produit puisse être utilisé dans une plus grande variété de scénarios. La compatibilité avant est également une considération énorme. P>
Yagni s'applique toujours, mais le "Il" a tendance à être à un niveau méta-traitance, plutôt qu'à un niveau de fonctionnalité. P>
Nous avons une règle de base dans notre société: lorsque nous discutons de la conception d'une nouvelle fonctionnalité, la première question à laquelle il faut répondre est "qui veut vraiment cela?" Si un client est derrière cela, nous essayons de comprendre ce qu'il veut vraiment et s'il existe d'autres moyens de résoudre son problème (plutôt que d'ajouter une nouvelle fonctionnalité). Si un membre de l'équipe demande cette nouvelle fonctionnalité qu'il devrait avoir de bonnes raisons. pour ça. Les problèmes de performance et les préoccupations de marketing font partie des préoccupations. Nous essayons encore de bien comprendre la demande et de discuter de toutes les alternatives possibles avant d'ajouter de nouvelles fonctionnalités à notre base de code. P>
"Retour à la base" et "SIMPLE EST BON" sont quelques phrases qui apparaissent pour me rappeler de rester sur la tâche à accomplir et de réaliser pourquoi je consomme cette fonctionnalité ou cette amélioration et ne pas entrer dans le surmenage ou la planification Pour un million de choses qui ne se produiront probablement pas. Là où je travaille, mon nom est souvent utilisé comme moyen de décrire quelque chose de surmené ou trop complexe, par exemple. "Vous avez Jbed comment construire cette page." Je tente de garder cela en vérifiant davantage comme parfois cela est utile mais pas assez souvent pour que cela devienne ma pratique commune. P>
Avoir une exigence écrite en termes non techniques peut parfois aider également. Cela me permet de savoir ce que je dois montrer à la fin et ne pas vous inquiéter des détails plus fins, par ex. Les utilisateurs du système ne sont pas susceptibles de lire sur mon code source et de se moquer de l'utilisation de la convention de dénomination que nous utilisons. Ils se soucient que cela fonctionne et fait ce dont ils ont besoin et veulent que ce soit. P>
Une autre question à poser est: "Ont-ils vraiment demandé cela?" et essayez de minimiser les hypothèses que l'on fait sur la fonctionnalité. Si ce n'est pas dans la liste, laissez-le sortir, bien que vous demandiez s'ils le souhaitent. P>
Il est si difficile d'appliquer Yagni parce que je pense que la plupart d'entre nous ont été mordues par le problème opposé, de trouver un système trop complexe ou cassant vers le refacteur pour faire ce que nous voulons, mais qui aurait pu le permettre avec un peu plus prévu. Trouver le milieu du terrain peut être difficile. P>
En règle générale, si vous vous trouvez en train de penser, "cela pourrait avoir besoin de [xyz]", puis qui devrait jouer explicitement une partie dans ce que vous codez. Même si vous ne codez pas à la prise en charge de XYZ, vous devez coder de manière à ce que le refactoring à ajouter XYZ est aussi pratique que possible. Parfois, cependant, cela peut signifier faire quelque chose de plus générique qu'il ne doit être strictement nécessaire. Savoir où s'arrêter sur ce chemin est probablement quelque chose que seules des informations spécifiques sur le domaine couplées à une expérience peuvent vous dire. P>
"... que refactoring d'ajouter un support XYZ est aussi pratique que possible". J'aime ça! Choisissez le chemin qui désactive autant de choses possibles.
Dans ce sens, Yagni est là pour éviter Strong> les pièges suivants: p> L'équilibrage des exigences en concurrence est difficile. Mais c'est pourquoi, comme le dit McConnell, le développement de logiciels est l'ingénierie. p> parce que d'autres principes sont des personnes aussi fortes> Un exemple (peut-être pas un très bon): p> est un simple contrat. OTOH, P>
Le développement de logiciels consiste toujours à équilibrer de nombreuses exigences. Il ne s'agit pas d'obtenir une chose juste, plutôt de ne pas avoir de nombreux faux. Yagnii seul ne sauvera pas votre cul.
Autres principes Principe - Plus fondamental IMO - est le principe de la moins surprise em> et de la encapsulation de complexité em>: l'interface publique / contrat d'une entité devrait être plus simple que sa mise en œuvre - sinon la mise en œuvre Pour appeler une fonction correctement, je devrais en savoir plus que ce que je devais le faire moi-même. Parfois, cela signifie que votre implémentation doit être complète. P> /// Estimates the time required to comlete the batch.
/// If the time cannot be estimated reliably, the return value is -1.
/// This function does not support looping batches (right now, looping
/// batches only run under a servicve account with no UI, so it's not needed).
/// Also, when the moon is full, the return value is -1, but an estimate
/// is found in batch.JeffsEstimate. This value is used only by Jeff's core
/// build script which runs roughly once a month.
/// \returns [double] estimated time in seconds
double EstimateDuration(Batch & batch);
Rappelez-vous ce que vous essayez de mettre en œuvre et ne faites pas plus. Vous pouvez le faire avec p>
Eh bien, j'ai couru dans la même chose hier et j'ai eu un gros combat avec l'un des développeurs seniors. J'essaie toujours de concevoir "Et si quelqu'un appelle ceci, que si cela change tomm, etc.?" et il est l'autre extrême. "Il suffit de faire fonctionner et rapide!" P>
La réponse est quelque part entre son approche et la mienne. Comment venons-nous au milieu du terrain? Entre essayer de faire un design "parfait" que les gens apprécieraient ou détesteraient s'ils doivent changer quelque chose à l'avenir. p>
IMHO, la réponse, du moins tout en concevant un module, revient aux principes de base de la programmation orientée objet, des choses comme définissant des interfaces claires. Les interfaces doivent correspondre à l'exigence du client. Les interfaces principales pour le module ne doivent pas avoir rien qui "résout" quoi que ce soit, à l'exception de ce qui existe dans l'exigence. Au moins un certain niveau de "fioritures" ajouté en raison de "Et si cela change, il en a besoin de demain, etc." peut être supprimé. P>
Tout ce que vous envisagez de mettre parce que vous pensez que cela pourrait être utilisé demain par quelqu'un d'autre, etc. doit être débattu pendant des heures! Vous devriez avoir de bonnes raisons d'ajouter une «Freebie» pour quelqu'un qui n'a même pas de nom! P>
J'ai toujours besoin d'une réponse définitive pour cette question. Peut-être d'un architecte ici qui a conçu de grosses applications et qui a été confrontée à cette situation 100 fois :) p>
parce que Yagni n'est pas une panacée
Ce n'est pas non plus une balle d'argent. Cependant, c'est une pratique utile.