Lorsque vous écrivez le code ou lors de la conception, essayez-vous de généraliser le problème à la première instance ou tentez-vous de résoudre ce problème très spécifique?
Je pose la question parce que tenter de généraliser le problème a tendance à compliquer les choses (ce qui peut ne pas être nécessaire) et qu’il sera en revanche très difficile d’élargir la solution spécifique en cas de modification de l’exigence.
Je suppose que la solution consiste à trouver le moyen terme, ce qui est plus facile à dire qu'à faire. Comment abordez-vous ce type de problème? Si vous commencez à généraliser à quel moment, vous savez que cette généralisation est suffisante?
Réponses:
Trop souvent, lorsque vous essayez de concevoir pour le futur, vos prédictions concernant les besoins futurs se révèlent fausses. Il est généralement préférable de refactoriser lorsque vous savez réellement comment les besoins ont changé plutôt que de sur-concevoir votre système dès le premier jour. En même temps, ne vous tirez pas une balle dans le pied non plus. Il y a certainement un terrain d'entente, et savoir où il en est, c'est plus que de l'art.
Pour résumer à une règle de base: moins c'est plus.
la source
Êtes-vous familier avec Agile? YAGNI est l’un des grands principes de l’ agilité . Je trouve que c'est la meilleure façon d'aborder les choses.
la source
C’est probablement l’un des aspects les plus difficiles du développement logiciel car il faut franchir la ligne entre "YAGNI" et "PYIAC" (peignez-vous dans un coin).
Il est assez facile de dire "n'écrivez pas une fonctionnalité si vous n'en avez pas besoin". La partie difficile consiste à concevoir votre code de sorte que vous puissiez facilement ajouter des fonctionnalités ultérieurement, lorsque vous en aurez besoin.
La clé est de pouvoir concevoir une architecture extensible dans laquelle vous n'écrivez pas plus de code que ce dont vous avez actuellement besoin. La capacité de bien faire cela vient vraiment de beaucoup d’expérience (et de douleur).
la source
Je passe un peu de temps à réfléchir à la direction générale de la conception - pas trop, mais assez pour esquisser un aperçu de haut niveau. Je suis ensuite une méthodologie agile basée sur des histoires utilisant TDD pour développer des solutions pour des histoires individuelles. Lors de la mise en œuvre via TDD, je garde mon aperçu de haut niveau en tête et soit (a) ordonne à mes mises en œuvre particulières de suivre la vue d'ensemble de haut niveau, soit (b) reformule (et améliore) ma compréhension / orientation de haut niveau en fonction de ce que j'ai appris lors des tests / de la mise en œuvre.
Je pense que c'est une erreur de ne pas planifier d'avance, mais c'est probablement une plus grande tâche d'en faire trop. Autant que possible, j'aime bien me laisser guider par l'expérience, puis laisser la conception se développer de manière organique, selon les lignes que j'ai définies dans mon esprit quant à la façon dont l'application va se développer. En utilisant TDD, je trouve que la conception elle-même est soumise à de meilleurs principes de conception (découplage, responsabilité unique, etc.) et est plus malléable en ce qui concerne les modifications que si j'essayais de concevoir le tout et d'y intégrer l'évolution.
la source
Un bon design tient compte des changements futurs et vaut vraiment la peine. Considérez le système d'exploitation UNIX et son "Tout est une philosophie de fichier". Cette décision de conception a été prise non pas pour répondre à un besoin immédiat, mais pour tenir compte des besoins futurs. On frémit de penser à quoi ressemblerait un système d'exploitation basé sur une conception "agile".
la source
Ce que vous essayez de gérer concerne la réutilisation (c'est-à-dire la généralisation d'un problème que vous êtes en train de traiter afin que vous puissiez réutiliser le travail (code) à l'avenir). Je l' ai dit avant et je vais lier à nouveau.
Je pense avoir entendu d'autres personnes dire quelque chose à l'effet de:
la source
Concevoir pour "maintenant + 1". Cela signifie que vous devez résoudre le problème immédiat et intégrer suffisamment de fonctionnalités pour que la prochaine fois que vous demandez un changement, vous l'avez déjà fait à mi-chemin (ou plus) et vous avez le choix entre a) le résoudre immédiatement et refactoring plus tard, ou b) résoudre à nouveau "maintenant + 1" (avec "maintenant" à moitié fait)
Cela dépend du projet et, en bref, l'expérience vous apprendra ce qu'est le "+1".
la source
La philosophie de YAGNI , vous n'en aurez pas besoin, peut être résumée avec (de l'article):
la source
Je suis un fervent partisan de la conception du problème à résoudre et de ne pas détruire votre conception en essayant de deviner tous les cas que vous devez prendre en charge, car «un jour, nous en aurons peut-être besoin».
Fondamentalement, étant donné une liste d'exigences spécifiques, concevez par rapport à cela, cependant, cela ne signifie pas que vous ne devriez pas:
Le principal problème de la conception d'un "avenir possible" est que vous ne faites que deviner. Peut-être faire des suppositions éclairées, mais «quand les choses se gâtent», ce n'est toujours qu'une série de suppositions.
En faisant cela, vous avez également la possibilité très réelle de compresser votre solution pour qu’elle corresponde au (x) cas (s) général (aux) plutôt qu’à la résolution du problème spécifique tel que défini par vos exigences connues.
Qu'est-ce que ça dit? "Quand tout ce que vous avez est un marteau, tout commence à ressembler à un clou."
J'aimerais avoir une livre pour chaque fois que j'ai entendu quelqu'un dire: "Mais c'est une solution qui est plus adaptable pour les cas généraux que nous verrons peut-être à l'avenir."
la source