J'utilise une méthodologie agile (SCRUM) depuis environ trois ans maintenant et je vois certains avantages, en particulier dans le retour d'information à court terme à de nombreux niveaux (des clients ayant un accès précoce aux fonctionnalités implémentées, des testeurs qui peuvent tester des fonctionnalités comme dès leur mise en œuvre, par d'autres développeurs qui peuvent fournir très tôt des commentaires sur le nouveau code par le biais d'une révision, etc.).
D'un autre côté, j'ai deux problèmes ouverts, le premier que je vais essayer d'expliquer dans cette question.
Problème: difficulté à obtenir un bon design
J'essaie de refactoriser dès que le code devient désordonné, j'écris des tests unitaires autant que possible (ce qui aide à prévenir les bugs en général et lors du refactoring en particulier). D'un autre côté, développer une fonctionnalité complexe par petits incréments, avec des commits quotidiens et repenser continuellement le code lorsqu'il n'est pas structuré ne me permet pas de produire un très bon design.
Le seul module bien conçu que j'ai pu produire récemment que j'ai obtenu en adoptant une approche différente: j'ai analysé le problème pendant quelques jours (j'avais en fait eu le problème en tête pendant quelques mois avant de commencer à y travailler sérieusement). ), a esquissé une conception assez détaillée de toutes les classes impliquées et de leurs relations pendant quelques jours, puis s'est enfermé dans mon bureau et a écrit tout le code en travaillant sans interruption pendant environ trois semaines. Le résultat a été la meilleure chose que j'ai produite depuis un certain temps, avec très peu de bugs qui étaient plutôt faciles à localiser et à corriger, et avec une conception très claire, qui n'a pas nécessité de modifications pertinentes depuis lors.
Donc, jusqu'à présent, j'ai trouvé beaucoup plus efficace d'obtenir une image globale de ce que je veux faire à l'avance que de commencer à écrire du code par petits incréments dans l'espoir que la grande image émerge comme par magie dans le processus. Avec mes meilleurs efforts, l'approche de développement par petits incréments m'a toujours conduit à une pire conception.
Question : Quelqu'un a-t-il eu une expérience similaire? Suis-je en train d'appliquer SCRUM dans le mauvais sens ou à quoi dois-je faire attention si je veux développer par petits incréments et me retrouver avec un logiciel bien conçu? Ou dois-je planifier une user story de conception avant de commencer le codage proprement dit? Est-ce considéré comme une bonne pratique, du moins pour les fonctionnalités plus complexes que la moyenne?
NOTE ÉDITÉE
Je suis conscient du fait qu'un bon design n'est pas quelque chose d'absolu et n'a pas de valeur en soi, mais cela dépend du contexte, et que l'on devrait viser un design qui soit assez bon pour le problème en question.
Par exemple, je ne me soucie pas (trop) d'une bonne conception si je dois implémenter un composant simple qui (1) doit être prêt dès que possible, (2) ne sera utilisé qu'une seule fois, (3) ne sera pas utilisé par d'autres parties du système (YAGNI).
Je me soucie d'une bonne conception lorsqu'un composant (1) sera utilisé plusieurs fois et dans plusieurs versions différentes d'un produit, (2) doit être maintenu et étendu dans le temps, (3) a beaucoup d'autres composants en fonction .
The only well-designed module I could produce recently I obtained by taking a different approach
-- Vous avez répondu à votre propre question. Vous avez toujours besoin d' une conception initiale; vous ne pouvez pas vous attendre à ce qu'un bon design croisse simplement de manière organique à partir du refactoring. Cela ne fonctionne pas de cette façon.