Quand renoncerait-on à la rétrocompatibilité au profit d'une implémentation d'interface nouvelle et améliorée? [fermé]

11

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?

Kavka
la source
3
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 ...
yannis
(1) Est-ce commercial? (2) Les clients paient-ils des frais de support en continu afin d'utiliser l'interface / l'implémentation? (Contre un paiement unique)
rwong
Je travaille sur un logiciel commercial que les clients paient pour l'achat initial et des frais s'ils veulent rester en maintenance.
Kavka

Réponses:

5

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:

  • Communiquez avec vos clients / clients bien avant toute transition. Expliquez pourquoi et comment il sera mis en œuvre. Citant la sécurité, les performances, la stabilité et la flexibilité future comme raisons sont toutes valables.
  • Si vous faites une pause nette de toute façon, demandez des commentaires.
  • S'il y a des développeurs tiers, assurez-vous d'inclure également leurs commentaires dans la mesure où cela a du sens.
  • Si c'est possible, fournissez une couche de compatibilité.
  • Fournissez un guide de mise à niveau complet.
  • Rendez la mise à niveau aussi simple et indolore que possible. Minimisez la douleur de vos utilisateurs, même si cela signifie un peu plus de travail pour vous.
  • Si vous facturez, offrez une remise pour les mises à niveau vers la nouvelle version.
  • Ajoutez au moins quelques fonctionnalités nouvelles et utiles dans une nouvelle version pour encourager la mise à niveau. Ceci est particulièrement important pour rendre la mise à niveau plus attrayante pour les gestionnaires.
  • Si vous faites une pause, faites-la la dernière fois que vous en avez besoin. Cela signifie une planification complète à l'avance et vous assurer que tout est correctement configuré.
  • Si vous avez une interface utilisateur, allez-y doucement sur les modifications. Pensez à rafraîchir plutôt qu'à repenser. Pour les utilisateurs non techniques, les changements drastiques de l'interface utilisateur d'une version à l'autre peuvent être une grande source de frustration.
  • Votre nouvelle version devrait être sensiblement plus stable et performante que l'ancienne. Ne donnez pas à vos utilisateurs une raison de ne pas accepter la mise à niveau. Ne publiez pas de nouvelle version sans tests approfondis au préalable (tests unitaires, d'intégration et bêta).
  • Conservez l'ancienne version simultanément pendant une période prolongée. Si vous décidez de le supprimer progressivement et d'interrompre l'assistance, donnez un préavis d'au moins 6 à 12 mois, plus si vous le pouvez.
  • Pouvez-vous vous permettre de maintenir deux versions à la fois en termes de finances et de main-d'œuvre? (De plus, d'un point de vue commercial, vous ne devez pas arrêter la prise en charge de l'ancienne version tant que vous ne pouvez pas vous permettre de perdre les clients restants qui s'accrochent à l'ancienne version et ne veulent pas mettre à niveau. Ce point devrait être lorsque vos coûts de le maintenir l'emporte sur vos profits.)
  • Engagez-vous à effectuer des mises à jour de sécurité pendant un certain temps après l'arrêt de l'ancienne version si nécessaire.
  • Encore une fois, la communication est énorme tout au long du processus. Ne laissez pas vos utilisateurs / clients / clients se sentir abandonnés à aucun moment. Leur loyauté et leur passion sont le fondement de votre entreprise. Assurez-vous de répondre à leurs questions sur votre blog ou dans vos forums. Le facteur social ne doit pas être sous-estimé.

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.

VirtuosiMedia
la source
1
+1: Solution pragmatique. Après tout, la question était tout à fait claire: "Je pense qu'il arrive un moment où le maintien de la compatibilité descendante devient un fardeau si lourd que des changements utiles aux interfaces deviennent impossibles." Étant donné que c'est le cas, il est logique d'aborder cette question avec des conseils spécifiques sur la façon d'aller de l'avant.
S.Lott
2

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.

Manfred
la source
1

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

Doc Brown
la source
1

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. "

James Anderson
la source
1
Ajout du "pense" pour souligner à quel point les changements forcés en colère peuvent rendre les gens!
James Anderson
1
Jamais? Mon Dieu. Microsoft semble violer ce principe avec chaque version majeure de Windows. Je pense que "jamais" n'est pas du tout suivi en pratique. Il semble que «Rarement» ou «Soigneusement» ou «À contrecœur» serait de bien meilleurs mots que «Jamais». La question dit: "Je pense qu'il arrive un moment où le maintien de la compatibilité ascendante devient un tel fardeau que des changements utiles aux interfaces deviennent impossibles." Pouvez-vous résoudre ce problème spécifique?
S.Lott
@ S.Lott Utiliser des mots inutilement forts comme Jamais quand vous voulez vraiment dire rarement est un effet typique de Joel Spolsky :)
maple_shaft
2
@ S.Lott: Parlons-nous du même Microsoft? Le Microsoft dont le système d'exploitation le plus récent peut encore exécuter la plupart des programmes écrits pour leur tout premier? Le Microsoft qui a ajouté du code à un nouveau système d'exploitation pour garantir qu'un jeu populaire qui dépendait d'un comportement non spécifié dans l'ancien fonctionnerait toujours?
Michael Borgwardt
-1: Certains clients sont plus chers qu'ils n'en valent.
Jim G.
0

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.

TMN
la source
0

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?

Jaydee
la source