Je travaille dans la même entreprise de logiciels depuis plus de dix ans. En conséquence, j'ai implémenté une grande base de code en utilisant divers langages de programmation orientés objet. J'étais un programmeur débutant lorsque j'ai commencé ma carrière et je ne connaissais pas grand-chose aux bonnes interfaces et aux principes de conception de classe. J'aimerais penser que mes compétences en conception se sont améliorées au fil du temps, mais j'ai maintenant de plus en plus de mal à améliorer mon code précédent en raison de problèmes de compatibilité descendante. Mon code est utilisé par un grand nombre de clients dans le cadre des produits que ma société vend.
Ma question est: quand faut-il cesser d'essayer de garder la compatibilité descendante des anciennes interfaces et mordre la balle en faveur de la mise en œuvre d'un tout nouveau design?
Je pense qu'il arrive un moment où le maintien de la compatibilité descendante devient un fardeau si lourd que des modifications utiles des interfaces deviennent impossibles. Quelqu'un a-t-il rencontré des préoccupations similaires, qui peut fournir des commentaires?
la source
I think there comes a point where keeping backward compatibility becomes such a big burden that useful changes to interfaces become impossible.
- Et je pense que vous avez répondu à votre propre question là-bas ...Réponses:
Alors que «quand» est une bonne question, je pense que «comment» est encore plus pertinent. Il peut être difficile de faire une transition brisée d'une manière qui ne rend pas les utilisateurs frustrés ou mécontents. Quelques points à considérer:
Quant au «quand», vous aurez probablement une meilleure idée de votre application que quiconque. En général, cependant, il peut être temps de faire une pause nette lorsque votre dette technique et votre architecture entravent complètement la stabilité, empêchent des performances raisonnables et rendent le développement de nouvelles fonctionnalités écrasant ou inutilement difficile.
Cela dit, ne prenez pas cette mesure à la légère. Même bien fait, briser la compatibilité descendante est un gros problème. Vous devriez fortement envisager d'augmenter votre couverture de test et de refactoriser d'abord et si possible avant d'envisager une pause.
la source
En général, je suis d'accord avec James Anderson. D'après mon expérience, il y a cependant des aspects supplémentaires qui peuvent être pris en considération et qui peuvent pointer vers une option qui permet effectivement de faire évoluer les interfaces.
Cet exemple provient d'une des équipes avec lesquelles je travaille. Ils expédient un produit régulièrement, au moins une fois par mois, parfois même chaque semaine. Les clients sont encouragés à mettre à niveau car les nouvelles fonctionnalités et les nouvelles plates-formes ne sont prises en charge que sur les versions plus récentes. La mise à niveau est facile et les clients peuvent même ignorer les versions entre les deux. La rétrogradation n'est pas prise en charge. De plus, les versions ne sont prises en charge que pendant 3 ans. Après cela, il y a un délai de grâce d'un an lorsque les frais de maintenance doublent.
En conséquence, la grande majorité - environ 95% des clients - procède régulièrement à des mises à niveau, au moins une fois par an. Cela signifie également que vous pouvez progressivement introduire de nouvelles interfaces.
Et les anciennes interfaces? La technique utilisée par cette équipe consiste à déclarer les anciennes interfaces comme «en fin de vie». Ensuite, il y a une période de 12 mois pendant laquelle la nouvelle interface est disponible et l'ancienne interface n'a pas encore été retirée. Les nouvelles interfaces offrent de meilleures fonctionnalités que l'ancienne interface, il y a donc deux avantages: l'ancienne interface en fin de vie et la nouvelle interface étant bien meilleures.
L'ancienne interface concrète dans ce cas était une technologie spécifique à la plate-forme qui est en train d'être progressivement remplacée par une interface de service basée sur la technologie standard standard.
Bien sûr, ce changement ne se produit pas pendant la nuit et il faut de nombreuses années avant son achèvement. Mais cela a permis d'arrêter l'investissement dans l'ancienne technologie et d'investir à la place dans la nouvelle technologie. Les clients reçoivent une assistance et ont un chemin à parcourir. La plupart d'entre eux se félicitent également de l'évolution vers de nouvelles technologies.
Gardez à l'esprit, cependant, que cette approche particulière peut ne pas fonctionner dans votre scénario. Cela fonctionne certainement pour l'équipe avec laquelle je travaille.
la source
Vous avez déjà obtenu de bonnes réponses ici, donc je voudrais juste ajouter un pointeur sur un très bel article de Joel Spolsky concernant ce sujet. Il discute des plans pour abandonner la compatibilité descendante dans IE 8, qui est essentiellement le même que votre problème:
http://www.joelonsoftware.com/items/2008/03/17.html
la source
La réponse courte est Jamais!
L'expérience montre que l'abandon de la compatibilité descendante dérange à tout le moins les clients et les utilisateurs et, au pire, les perd complètement.
Si vous demandez à vos utilisateurs de réécrire le code, une fois qu'ils auront fini de vous maudire et de tous vos descendants, ils penseront: "Si je dois réécrire de toute façon, je devrais peut-être simplement passer à cette belle bibliothèque ACME que j'ai lue. tant de choses? ".
L'astuce consiste soit à améliorer l'interface actuelle de manière à ne pas briser la compatibilité descendante, soit à offrir une toute nouvelle interface brillante et évidemment supérieure tout en conservant l'ancienne interface. À un moment donné, il y aura des fonctionnalités dans la nouvelle interface qui ne seront tout simplement pas possibles dans l'ancienne interface, mais cela donne simplement aux gens une incitation à bouger, sans forcer le problème.
Modifiez pour clarifier cela.
Ce que vous, en tant que programmeur, pensez est -
"Je vais améliorer cette API et rendre le système aussi bon que possible et tout le monde m'admirera".
Ce que penseront les utilisateurs de votre API -
"A * * * e il pense que mon temps et mon emploi du temps ne sont pas importants. Je dois arrêter ce que je fais et refaçonner tout mon code sans autre raison que pour satisfaire son ego. Si je dois refaçonner alors je vais changer à une autre API juste pour le coller lui aussi. "
la source
Il s'agit vraiment plus d'une décision commerciale que d'une décision technique. Habituellement, cela se fait dans le cadre d'une version majeure (par exemple, passer de la version 3.5 à la version 4.0), et souvent les deux versions sont prises en charge en parallèle pendant un certain temps. Cela signifie que vous effectuerez la maintenance de l'ancienne version, mais toutes les nouvelles fonctionnalités n'apparaîtront que dans la nouvelle version. L'ancienne version est prise en charge tant que l'entreprise en tire de l'argent, ou au moins suffisamment pour compenser les coûts de maintenance. Soyez prêt à en faire part à la direction.
la source
J'ai été du côté client de celui-ci, donc je dirais que cela dépend vraiment de ce que vous prévoyez de faire pour la transition.
Nous mettons actuellement à niveau notre système de comptes. L'entreprise effectuant la mise à niveau prend également en charge la version incompatible précédente. Ils prévoient de prendre les données et de les déplacer vers le nouveau système afin que (en théorie) toutes les anciennes données soient là. Nous paierons quelques centaines de livres pour la conversion des données. Aucun problème.
Comparez avec une situation antérieure dans une autre entreprise pour laquelle je travaillais. Le fournisseur n'avait aucun moyen de passer de l'ancien aux nouveaux systèmes. Cela les place dans la même situation que tous les autres fournisseurs. En fait, leur situation était pire parce que nous savions qu'ils n'étaient pas déterminés à nous aider avec les mises à niveau. Ils n'ont pas obtenu le nouveau contrat.
Vous avez travaillé dur pour obtenir et conserver des clients, comment pouvez-vous faciliter la transition?
la source