En bref: ça dépend
En détails
Allez-vous avoir besoin de trucs nettoyés et brillants?
Il y a des choses à être prudent ici, et vous devez identifier la limite entre ce qui est réel, un gain mesurable et ce qui est juste votre préférence personnelle et votre mauvaise habitude de toucher au code qui ne devrait pas être.
Plus précisément, sachez ceci:
Il y a une telle chose comme sur-ingénierie
C'est un anti-modèle, et il y a des problèmes intégrés:
- il peut être plus extensible , mais il peut ne pas être plus facile d'étendre,
- il peut ne pas être plus simple à comprendre ,
- Dernier point, mais pas le moindre ici: vous pourriez ralentir tout le code.
Certains pourraient aussi citer le principe KISS comme référence, mais ici, c'est contre-intuitif: la voie optimisée est-elle simple ou la voie propre? La réponse n'est pas nécessairement absolue, comme expliqué dans le reste ci-dessous.
Le principe de YAGNI n’est pas complètement orthogonal à l’autre problème, mais il est utile de se poser la question suivante: allez-vous en avoir besoin?
L'architecture plus complexe présente-t-elle vraiment un avantage pour vous, en plus de donner l'impression d'être plus facile à maintenir?
Ecrivez ceci sur une grande affiche et accrochez-le à côté de votre écran ou dans la cuisine au travail ou dans la salle de réunion du développeur. Bien sûr, il y a beaucoup d'autres mantras qui méritent d'être répétés, mais celui-ci est important lorsque vous essayez d'effectuer un "travail de maintenance" et que vous ressentez le besoin de "l'améliorer".
Il est naturel que nous voulions «améliorer» le code ou même simplement le toucher, même inconsciemment, en le lisant pour essayer de le comprendre. C'est une bonne chose, car cela signifie que nous avons une opinion et que nous essayons de mieux comprendre les internes, mais cela dépend également de notre niveau de compétence, de nos connaissances (comment décidez-vous de ce qui est meilleur ou non? Eh bien, voir les sections ci-dessous ...), et toutes les hypothèses que nous faisons sur ce que nous pensons connaître le logiciel ...:
- fait réellement,
- a réellement besoin de faire,
- aura finalement besoin de faire,
- et comme il le fait bien.
A-t-il vraiment besoin d'être optimisé?
Tout cela étant dit, pourquoi a-t-il été "optimisé"? Ils disent que l' optimisation prématurée est la racine de tous les maux, et si vous voyez un code non documenté et apparemment optimisé, vous pouvez généralement supposer qu'il n'a probablement pas suivi les règles d'optimisation n'a pas besoin chèrement l'effort d'optimisation et qu'il était le L'orgueil du développeur habituel entre en jeu. Encore une fois, c'est peut-être juste à vous de parler maintenant.
Si c'est le cas, dans quelles limites devient-il acceptable? Si vous en avez besoin, cette limite existe et vous donne la possibilité d'améliorer les choses, ou une ligne dure pour décider de laisser tomber.
Aussi, méfiez-vous des caractéristiques invisibles. Il est fort probable que votre version "extensible" de ce code vous permettra de disposer de plus de mémoire au moment de l'exécution et de présenter une empreinte mémoire statique encore plus grande pour l'exécutable. Les fonctionnalités OO brillantes entraînent des coûts non intuitifs comme ceux-ci et peuvent avoir une incidence sur votre programme et l'environnement sur lequel il est supposé fonctionner.
Mesurer, mesurer, mesurer
En tant que Google, tout est une question de données! Si vous pouvez le sauvegarder avec des données, alors c'est nécessaire.
Il n’ya pas si vieux discours que pour chaque dollar dépensé en développement, il sera suivi d’ au moins un dollar en tests et d’ au moins un dollar en support (mais en réalité, c’est beaucoup plus).
Le changement affecte beaucoup de choses:
- vous devrez peut-être produire une nouvelle version;
- vous devriez écrire de nouveaux tests unitaires (certainement s'il n'y en avait pas, et votre architecture plus extensible laissera probablement de la place pour plus, car vous avez plus de surface pour les bugs);
- vous devez écrire de nouveaux tests de performances (pour vous assurer que cela reste stable dans le futur et voir où se trouvent les goulots d'étranglement), et que ces tâches sont délicates à réaliser ;
- vous aurez besoin de le documenter (et plus extensible signifie plus de place pour les détails);
- vous (ou quelqu'un d'autre) devrez le tester à nouveau de manière approfondie en assurance qualité;
- le code n'est (presque) jamais exempt de bogues et vous devrez le prendre en charge.
Il ne faut donc pas mesurer ici uniquement la consommation de ressources matérielles (vitesse d'exécution ou empreinte mémoire), mais également la consommation de ressources de l'équipe . Les deux doivent être prédits pour définir un objectif, pour être mesurés, comptabilisés et adaptés en fonction du développement.
Et pour vous, manager, cela signifie que cela rentre dans le plan de développement actuel, alors communiquez à ce sujet et n’entrez pas dans le code furieux de cow-boy / sous-marin / black-ops.
En général...
Oui mais...
Ne vous méprenez pas, en général, je serais en faveur de ce que vous suggérez, et je le préconise souvent. Mais vous devez être conscient du coût à long terme.
Dans un monde parfait, c'est la bonne solution:
- le matériel informatique s'améliore avec le temps,
- les compilateurs et les plates-formes d'exécution s'améliorent avec le temps,
- vous obtenez un code proche de la perfection, propre, maintenable et lisible.
En pratique:
vous pouvez aggraver
Vous avez besoin de plus de globes oculaires pour le regarder, et plus vous le complexifiez, plus vous avez besoin de globes oculaires.
vous ne pouvez pas prédire l'avenir
Vous ne pouvez pas savoir avec une certitude absolue si vous en aurez jamais besoin et même si les "extensions" dont vous aurez besoin auraient été plus faciles et plus rapides à mettre en œuvre dans l'ancien formulaire, et si elles auraient besoin d'être super optimisées. .
Du point de vue de la direction, cela représente un coût énorme sans aucun gain direct.
Faites-en partie du processus
Vous mentionnez ici qu'il s'agit d'un changement relativement modeste et que vous avez des problèmes spécifiques à l'esprit. Je dirais que c'est généralement OK dans ce cas, mais la plupart d'entre nous ont aussi des histoires personnelles de petits changements, des retouches presque chirurgicales, qui ont fini par devenir un cauchemar d'entretien et des délais presque manqués ou dépassés parce que Joe Programmer n'en a pas vu. des raisons derrière le code et touché quelque chose qui n'aurait pas dû être.
Si vous avez un processus pour gérer de telles décisions, vous en prenez l'avantage personnel:
- Si vous testez les choses correctement, vous saurez plus rapidement si les choses sont cassées,
- Si vous les mesurez, vous saurez si elles se sont améliorées,
- Si vous l'examinez, vous saurez si cela jettera les gens.
La couverture des tests, le profilage et la collecte de données sont difficiles
Mais, bien sûr, votre code de test et vos métriques peuvent souffrir des mêmes problèmes que vous essayez d'éviter pour votre code réel: testez-vous les bonnes choses, et sont-elles la bonne pour l'avenir, et mesurez-vous le bon des choses?
Néanmoins, en général, plus vous testez (jusqu’à une certaine limite) et mesurez, plus vous collectez de données et plus vous êtes en sécurité. Mauvaise analogie: pensez-y à la conduite (ou à la vie en général): vous pouvez être le meilleur pilote du monde, si la voiture tombe en panne ou si quelqu'un décide de se suicider en conduisant dans sa voiture avec le leur les compétences pourraient ne pas suffire. Des facteurs environnementaux peuvent vous frapper et les erreurs humaines importent également.
Les revues de code sont les tests de couloir de l'équipe de développement
Et je pense que la dernière partie est la clé ici: faire des revues de code. Vous ne saurez pas la valeur de vos améliorations si vous les faites en solo. Les revues de code sont nos "tests de couloir": suivez la version de Raymond de la loi de Linus, à la fois pour détecter les bugs et pour détecter les sur-techniques et autres anti-patterns, et pour vous assurer que le code correspond aux capacités de votre équipe. Il est inutile d'avoir le "meilleur" code si personne d'autre que vous ne pouvez le comprendre et le maintenir, et cela vaut à la fois pour les optimisations cryptiques et les conceptions architecturales profondes à 6 couches.
En guise de conclusion, rappelez-vous:
Tout le monde sait que déboguer est deux fois plus difficile que d'écrire un programme. Donc, si vous êtes aussi intelligent que vous le pouvez lorsque vous l'écrivez, comment allez-vous le déboguer? - Brian Kernighan