Les Lannister paient toujours leurs dettes. Quelle est la devise des Lannister ? Yuri Boldyrev diffame Rogers, petit blogueur du Kremlin

Pratiques technologiques de gestion de la dette dans une seule équipe


Il y a environ un an, notre équipe est passée d’une phase de croissance rapide des fonctionnalités à un développement plus fluide axé sur l’amélioration de la qualité. À ce stade, nos produits ont accumulé une quantité notable de solutions sous-optimales, de code laid et de bibliothèques obsolètes. Il fallait faire quelque chose à propos de tout cela.


Jusqu’à présent, nous avons réussi à construire un processus qui rend la lutte contre la dette technique prévisible, indolore et inévitable.


Ce que nous avons obtenu comme résultat :

  • L'équipe est contente. La rétrospective de la version inclut régulièrement des points positifs sur l'amélioration de la technologie et la réduction de la dette technique.
  • Pendant plusieurs versions trimestrielles consécutives, nous avons pu augmenter les fonctionnalités sans augmenter le nombre de lignes de code dans le projet. La suppression du code inutile et la simplification de ce qui était nécessaire ont réduit la taille de la base de code des fonctionnalités existantes. Et cette réduction a à peu près coïncidé avec l’ampleur du nouveau code implémentant la nouvelle fonctionnalité.
  • Lors des refactorisations et des mises à niveau, le produit est toujours en état de marche. Toutes les deux semaines, nous publions une version intermédiaire entièrement fonctionnelle.

Laissez-moi vous raconter comment nous y sommes parvenus.

Qu'est-ce que la dette technique

Ma définition pratique de la dette technique est la quantité de travail qui doit être effectuée pour qu'un projet réponde à la vision de l'équipe de ce qui est génial. Notez que la dette technique peut survenir non seulement en raison de l'utilisation libérale des béquilles dans le développement, mais également en raison de l'évolution des idées sur la beauté. Par exemple, les pratiques courantes de l’industrie ont changé. Ou bien les développeurs sont tombés amoureux de la POO et sont tombés amoureux de la programmation fonctionnelle. Ou bien le cadre autrefois à la mode n'est plus un gâteau et il est devenu difficile de trouver des spécialistes qui voudraient écrire dessus.


Or la principale cause de la dette technique est l’entropie dans toute sa diversité. Tests unitaires désactivés, commentaires obsolètes qui ont perdu le contact avec le code, décisions architecturales infructueuses, implémentation de fonctionnalités que plus personne n'utilise, fondation d'un avenir qui n'est pas encore venu, et bien plus encore.


Il s’ensuit que l’apparition d’une dette technique est inévitable dans tout projet de longue durée.

Quand la dette technique n’est pas un problème

Pourquoi la dette technique est-elle mauvaise ? Cela augmente le coût du développement ultérieur en raison d'un certain nombre de facteurs :

  • La vitesse de mise en œuvre des nouvelles fonctionnalités est réduite.
  • La probabilité de régressions lors de la correction des défauts augmente.
  • Le processus de développement devient moins prévisible et donc moins gérable.
  • Le processus d'introduction d'un nouveau développeur dans le projet s'allonge.

Cette perte est parfois appelée « intérêts de la dette technique »


Il existe des situations où ces pertes sont moins coûteuses que l’élimination de la dette technique :

  • La fin de la vie du projet est proche. Notez que ce n'est pas la fin de l'ajout de fonctionnalités, mais le moment où vous pouvez également arrêter de gaspiller les efforts des programmeurs en support. Cette catégorie comprend également des prototypes uniques, des démos uniques pour des expositions, etc.
  • La valeur du temps de développement actuel est bien plus élevée que prévu à l’avenir. Corrections urgentes dans un délai fixe, startups qui manquent d'argent lors du prochain tour de financement, etc. Dans de tels cas, le règlement de la dette technique peut être retardé jusqu’à ce que le feu de l’action se soit calmé. Il y a des projets qui ne sortent pas de l'état d'urgence, mais les conseils de cet article ne les aideront toujours pas.

Que faire de la dette technique ? Approches échouées

Approche n°1. « On n’a pas le temps, il faut remettre le communiqué hier »

La volonté de respecter à tout prix l'échéance de demain, au détriment de la vitesse de développement d'après-demain.


Parfois, une structure préfabriquée constituée de béquilles est un choix objectivement correct. Dans ma pratique, cela s'est exprimé le plus clairement lors de la création de versions de démonstration pour des expositions. La date de l’événement est strictement fixée ; si vous n’êtes pas arrivé à temps pour une exposition importante, la prochaine tentative aura lieu dans un an. Dans ce cas, vous pouvez afficher le produit « hors de vos mains », en évitant soigneusement tous les bugs. En tant qu'ingénieur, c'est désagréable pour moi de réaliser de tels projets, mais les béquilles qu'ils contiennent sont justifiées.


Quand on fabrique un produit qui va durer longtemps, tout est différent. Respecter les délais en raison de solutions techniques douteuses est un plaisir coûteux. Le coût total est de :

  1. dès la mise en place de la béquille elle-même,
  2. de son remplacement ultérieur par une solution à part entière,
  3. de la souffrance d'avoir une béquille entre les points précédents.

Le deuxième point est très facile à sous-estimer, et on risque de ne pas penser du tout au troisième, le plus cher.


Lorsque vous rencontrez un responsable technique avec un œil tremblant lors d'une conférence, il se peut que ce soit le cauchemar consistant à déboguer sans fin une conception réalisée à partir de béquilles qui l'a amené à cet état.


Approche n°2. « Oui, ici, nous devons tout jeter et réécrire »

Plus la situation de la dette technique est mauvaise, plus la tentation d’enterrer tout le code du projet et de tout réécrire est forte. C’est l’une des erreurs classiques qui peuvent tuer tout le projet.


Le sujet est si bien traité dans le célèbre article de Joel Spolsky que je ne vois aucun intérêt à présenter mes propres arguments.

Approche n°3. « Nous refactoriserons la nuit et le week-end pour que le manager ne le sache pas. »

Argumenter la nécessité d’éliminer la dette technique en termes d’avantages commerciaux n’est pas toujours facile. L’équipe de développement peut être tentée de contourner les aspérités et de lancer une refactorisation majeure sur place. Cela peut être fait pendant les heures non travaillées, lors de pauses entre d'autres tâches, ou « à la suite d'autres tâches » en gonflant les estimations.


Qu'est-ce qu'il y a de mal à ça ? Oh, tout un tas de choses :

  • Une transparence réduite mine la confiance entre la direction et l’équipe. Souvent, les tentatives ultérieures visant à corriger la situation en imposant de la discipline et en resserrant les vis conduiront à une nouvelle détérioration du travail d'équipe.
  • Une situation bien ancrée dans laquelle les priorités de l’équipe et de la direction sont contradictoires provoque une démotivation des deux côtés.
  • Les fruits du refactoring sont inclus dans le produit de manière imprévisible et provoquent des bugs de régression là où ils ne sont pas attendus. Dans les équipes conscientes, cela entraîne une charge soudaine et imprévue sur l'assurance qualité. Dans l’inconscient, il entre en production et s’y décompose.

Une fois que l’équipe a utilisé cette recette, les yeux de la direction commencent à trembler.

Nos principes

1. Ajouter des tâches techniques au backlog général

Il existe un certain nombre de modèles dans la vie des tâches dans les projets :

  • Une tâche qui n'est pas en retard a moins de chances d'être mise en œuvre.
  • Une tâche sans formulation claire a moins de chances d'être mise en œuvre.
  • Une tâche qui ne peut pas être estimée avec un degré élevé de confiance a moins de chances d'être exécutée.
  • Une tâche volumineuse attendra plus longtemps dans la file d’attente qu’une petite tâche.

Maxim Dorofeev parle très bien de ces choses dans sa « Technique de la boîte de réception vide »


Pour éviter l'accumulation de la dette technique, les travaux visant à l'éliminer doivent être réalisés en tenant compte des principes énoncés ci-dessus.


Toutes les tâches, à l'exception des plus petites, sont répertoriées dans le backlog. De cette façon, ils ont la possibilité de le faire non seulement pendant leur temps libre, mais également dans le cadre du travail prévu. De plus, il est plus difficile de perdre complètement de vue ces tâches - l'arriéré est examiné plus souvent et de plus près que les TODO dans le code, les morceaux de papier sur le moniteur, les pages wiki abandonnées, les serviettes tachées de thé avec des diagrammes et autres sources d'information.

  • S'il y a un TODO non trivial dans le code, il contient un lien vers la tâche dans le backlog. Nous vérifions le respect de ce principe lors de la revue du code et n'acceptons pas de TODO complexes sans références.

    Il peut y avoir un drame derrière ce commentaire.

    Une fois, à côté d'un tel TODO, il était écrit : « Béquille. Le Product Owner m'a obligé à le faire. Supprimer dès que possible."

  • Lorsqu'un développeur se rend compte qu'un endroit nécessite une refactorisation, il crée un problème dans le backlog.
  • Lorsqu'un développeur souhaite améliorer la plateforme, il crée une tâche dans le backlog.
  • Les plans architecturaux à long terme sont mis en attente sous la forme de tâches distinctes dès qu'il existe suffisamment de certitude quant au moins aux premières étapes.

Tant que ces changements restent peu coûteux en termes de coûts de développement et de quantité de tests requis, nous pouvons améliorer progressivement notre base de code sans interrompre nos objectifs commerciaux ni introduire de risques supplémentaires.

2. Planifiez des histoires techniques en fonction des priorités commerciales

Si un arbre tombait dans la forêt, mais que personne ne l’entendait, y avait-il un bruit ? S'il y a un mauvais code dans un projet, mais que ce module n'aura jamais besoin d'être modifié, y a-t-il une dette technique ?


Je crois que lorsqu'un programmeur trouve désagréable de regarder un vieux module, ce n'est pas en soi un très gros problème. Ce qui se passe est bien pire lorsque vous devez ajouter de nouvelles fonctionnalités à ce module ou étendre l'ancienne. Par rapport aux modifications apportées à un code bien écrit, ces tâches sont plus susceptibles (et plus susceptibles de dépasser l'estimation initiale) et de contenir plus de bogues. Parfois bien plus. Pour se protéger de ce type de problèmes, nous essayons de planifier les refactorings afin qu'ils soient effectués avant d'écrire de nouvelles fonctionnalités au même endroit.


Si les modifications de fonctionnalité et les refactorisations semblent minimes, elles peuvent être effectuées ensemble. La taille de la tâche sélectionnée empiriquement pour laquelle cette approche sera optimale est de 3 jours de travail pour un développeur ou moins. Lorsqu'il est clair qu'il y a encore du travail, celui-ci est divisé en refactoring tout en conservant le comportement actuel et en implémentant de nouvelles fonctionnalités.


Ainsi, l'ordre des travaux pour éliminer la dette technique est déterminé par l'ordre des tâches commerciales dans le backlog.


Le principe des « priorités commerciales » a une autre application. L'un des problèmes courants dont souffrent les développeurs qui s'efforcent de bien écrire est la difficulté de consacrer du temps à l'optimisation des performances, à l'amélioration de la maintenabilité ou à d'autres choses qui ne sont pas directement incluses dans le plan de travail. Il existe presque toujours un besoin commercial pour ces améliorations. Qui ne souhaite pas que le système fonctionne plus rapidement, soit plus stable et soit moins coûteux à entretenir ? Tous ces avantages peuvent être évalués et, sur la base de cette évaluation, les tâches à améliorer peuvent être placées dans le backlog, avec d'autres.


Donc, si vous souhaitez optimiser les performances, mais que vous devez à la place corriger un autre bug ennuyeux, peut-être ne savez-vous tout simplement pas comment expliquer les avantages de l'optimisation dans un langage que le propriétaire du produit peut comprendre.

3. Laissez le code plus propre qu’il ne l’était avant vous

Presque tous les codes, à l'exception de celui écrit très récemment, sont un peu en retard sur l'idée actuelle de la beauté dans le domaine du style et de l'architecture. Lorsque vous devez modifier du code dans le cadre d’une tâche, il est considéré comme une bonne pratique d’apporter toutes les améliorations sûres possibles dans la zone affectée. Qu'est ce que ça pourrait être?

  • Apporter des modules au style actuel.
  • Changer les noms de variables internes pour des noms plus compréhensibles.
  • Simplifiez la mise en œuvre tout en conservant le comportement.
  • Des refactorisations locales qui n'introduisent pas de modifications à grande échelle dans les autres modules.

Ces améliorations devraient améliorer le code, mais n’augmenteront pas de manière significative le coût de développement ou de test.


Grâce à ce principe, la qualité du code augmente progressivement en arrière-plan, même dans les endroits où aucune refactorisation distincte n'était prévue. De plus, plus nous travaillons souvent sur une certaine partie du système, meilleur est le code pour cette partie. Un joli contraste avec les projets où le développeur passe le plus de temps sur les parties avec le pire code.

4. Quoi qu’il arrive, le système doit rester en état de marche.

L'un des principes de base de SCRUM dit qu'à la fin de chaque sprint, le système doit atteindre un état stable.


« À la fin du sprint, l'incrément devrait être prêt, ce qui signifie qu'il répond aux critères de préparation de l'équipe Scrum et qu'il est prêt à être utilisé. Il doit être prêt à être utilisé, quelle que soit la décision du propriétaire du produit de le publier ou de le retarder.

Tout travail d'élimination de la dette technique est réalisé dans le respect de ce principe.


Les grandes transformations sont nécessairement décomposées de manière à ce que n'importe quelle étape individuelle puisse être complétée en un seul sprint. Par exemple, nous avons modifié le système de build en deux étapes (Angular 1.x : webpack rampant, grognement caché)


Nous travaillons avec VCS selon des principes proches du gitflow classique. Le développement est effectué dans les branches de fonctionnalités, les tests y sont effectués. En règle générale, une telle branche ne dure pas plus d'un sprint de deux semaines. Une branche qui dure plus longtemps entraîne presque toujours des coûts supplémentaires.


Notre expérience confirme clairement cette tendance. Chaque fois que nous ne parvenions pas à terminer une refactorisation majeure en deux semaines, c'était une douleur et une souffrance. Et plus la tâche était longue et plus la succursale ouverte durait longtemps, plus le travail était lent et plus il y avait de problèmes.


La nécessité d'être toujours à quelques pas d'une version stable crée l'un des problèmes d'ingénierie les plus difficiles et les plus intéressants : trouver la décomposition optimale des plans stratégiques. Les changements à grande échelle peuvent être décomposés en étapes distinctes et indépendantes. Il est conseillé de commencer à percevoir des prestations le plus tôt possible. Mieux cette répartition des travaux est réalisée, plus grandes sont les chances de mener à bien le chantier.

À quoi ressemble notre processus

Une fois par version, nous effectuons un examen détaillé du backlog technique :

  • Nous fermons les histoires non pertinentes (pertinence perdue, réalisées dans le cadre d'autre chose, doublons).
  • Nous mettons à jour la description là où la vision du problème a changé.

Lorsque des histoires commerciales apparaissent à l'horizon, une analyse technique est effectuée et toutes les histoires techniques qui pourraient aider à la mise en œuvre sont associées à l'histoire commerciale.


En préparation de la planification du sprint :

  • Nous vérifions les liens entre les histoires techniques et commerciales.
  • Nous associons tous les bugs associés à des histoires techniques qui peuvent être corrigées à moindre coût au même endroit.

Comment constituer la partie technique du backlog

Lorsque j'ai assumé le rôle de responsable de l'équipe, j'ai demandé à chaque développeur et responsable qualité quelles améliorations ils souhaitaient le plus apporter au produit. La plupart des demandes concernaient des améliorations techniques de la plateforme et des refactorisations. Comme l'expérience l'a montré, tous les problèmes techniques clés du produit étaient inclus dans cet ensemble de souhaits. Vous pouvez donc utiliser cette pratique pour constituer rapidement un backlog technique à partir de zéro ou vous faire une idée générale de l'état de la dette technique dans un nouveau projet.


Le remplissage actuel de l'arriéré avec des tâches techniques est dû aux pratiques décrites ci-dessus et ne nécessite pas d'efforts ou d'analyses séparés. De plus, de nouvelles idées d’amélioration technique du produit s’ajoutent au backlog. Ceci est fait par tout membre de l'équipe qui a eu une telle idée. L'essentiel à ce stade est de ne pas perdre l'idée. La clarification et la détermination des priorités ont lieu plus tard, lors de la planification du travail.

conclusions

  • La dette technique est inévitable.
  • Pour la plupart des projets, l’élimination de la dette technique constitue un bon investissement en efforts.
  • Si l’on ne s’attaque pas à la dette technique, la vitesse de développement s’approchera progressivement de zéro.
  • La tentation de tout jeter et de réécrire peut tuer ou sérieusement paralyser votre projet.
  • Les avantages de l’élimination de la dette technique doivent être présentés en termes d’avantages commerciaux, sinon il existe un risque que les tâches visant à créer de nouvelles fonctionnalités soient toujours considérées comme plus importantes.
  • Les tâches visant à éliminer la dette technique valent la peine d'être gérées. Ces tâches ne sont pas différentes des autres tâches du projet en termes de comptabilité, de planification et de priorisation.
  • Des situations surviennent régulièrement dans lesquelles vous pouvez réduire la dette technique et résoudre un problème commercial en même temps à moindre coût que de le faire séparément. Ces opportunités doivent être exploitées.
  • Des conventions de style de code et des processus de révision réfléchis et mis à jour en temps opportun contribuent à ralentir l’émergence de nouvelles dettes techniques.
  • Les itérations courtes sont aussi utiles pour les refactorisations que pour le développement de nouvelles fonctionnalités.
  • L’équipe sait généralement où se situe la dette technique dans le projet et à quel point elle est grave. Il vaut la peine d’utiliser ces connaissances pour se faire une idée de la dette technique du projet.

Dans ma réponse, j'aborderai non seulement les Grandes Maisons, mais aussi quelques autres maisons sur lesquelles j'ai pu obtenir des informations.

1.Touche étoile - "L'hiver arrive". Signifie que la paix et la sécurité sont temporaires et illusoires ; il faut toujours être prêt aux catastrophes et aux guerres afin d'affronter le danger avec des armes complètes. À Westeros, l'hiver n'est pas seulement une saison qui dure des années, mais aussi le symbole d'épreuves difficiles. Et en fait, cette devise concerne non seulement la Maison des Starks, mais le pays tout entier.

2. Lannister- La maison Lannister semble avoir deux devises, l'une confirmant les formidables armoiries -" Entendre mon rugissement!", le second, équivalent à un dicton, mais sonnant un ordre de grandeur plus souvent que le premier - " Les Lannister paient toujours leurs dettes". La première devise peut être attribuée directement aux armoiries. Les armoiries de Lannister représentent lion rampant- "un lion rugissant", et la devise "Écoutez mon rugissement" le complète directement, c'est aussi la preuve que le lion est le roi des bêtes, et que les Lannister occupent une position élevée dans la société. Le dicton « Un Lannister paie toujours ses dettes » est principalement associé à la Banque de Fer de Braavos : « La Banque de Fer obtiendra toujours ce qui est dû ». Deuxièmement, « Un Lannister paie toujours ses dettes » signifie que les Lannister n'oublient jamais ceux qui les ont aidés et qu'ils ne pardonnent jamais les torts qui leur ont été causés.

3. Barathéon - "Nous sommes furieux". appartenait à l'origine aux Durrandons de Storm's End. Orys Baratheon (le frère illégitime d'Aegon Ier le Conquérant), après avoir tué Argilac l'Arrogant, le dernier Seigneur des Stormlands, a adopté sa devise. Mais la devise a été traduite trop littéralement. Donne une traduction logique de la devise" La colère est notre élément", avec une explication de sa signification " La colère est notre élément, ce qui signifie : lorsque vous nous mettez en colère, vous jetez le poisson à la mer, où il se sent bien.« Autrement dit, pour les Baratheons, une violente démonstration d’émotions aux dépens d’une froide raison n’est pas un vice.

4. Greyjoy - "Nous ne semons pas"Les Greyjoys sont pour la plupart des pirates. Le territoire de leurs terres est situé sur des rochers nus et du sable. La devise de cette maison est un message direct selon lequel les Greyjoys ne travaillent pas sur la terre (qui n'existe vraiment pas). Ils ne sèment pas quoi que ce soit et ne pousse pas, ils volent ceux qui ont des récoltes et du butin, puisqu'ils n'ont pas et ne peuvent pas avoir les leurs.

5. Targaryen - "Feu et sang". La devise des Targaryen peut être interprétée de deux manières. La première - Aegon le Conquérant et ses deux sœurs, sur trois dragons, ont subjugué Westeros, qui est appelé « avec lui et l'épée ». La deuxième option - (la devise mentionnée ci-dessus coucher de soleilsolitude) - " Les Targaryen sont des enfants de dragon, ils ont le sang de l'ancienne Valyria et des dragons, ainsi qu'un bonus d'immunité au feu et des dragons apprivoisés. Lorsque les Targaryen disent Feu et Sang, ils le rappellent à ceux qui l'ont soudainement oublié."

6. Arryns - "Grand comme l'honneur"D'un côté, la Maison Arryn, à l'instar de Jon Arryn, se souciait de préserver l'honneur. Jon ne pouvait pas être intimidé ni soudoyé. Et sur les terres de Westeros, il était impossible de trouver quelqu'un qui se souciait plus de préserver l'honneur que les Arryns. Mais après la mort de Jon, une autre option est probablement plus applicable : l'arrogance aristocratique, le mépris pour ceux de statut inférieur, disent-ils, « d'où viens-tu de nous ?

7. Tarly - "Premier au combat« La Maison Tarly a donné naissance à de nombreux grands guerriers et généraux exceptionnels, comme le confirme cette devise.

8. Tulle - "Famille, devoir, honneur"La Maison Tully est avant tout fidèle à ses liens familiaux. Le devoir et l'honneur viennent après eux, mais la famille passe avant tout. La Maison Tully a soutenu Rob Stark dans la Guerre des Cinq Rois, pour laquelle elle a payé.

9. Martells - "Inflexible, inflexible, inflexible". Un modèle de fierté et d'inflexibilité. Les Martell sont la seule maison que les Targaryen n'ont pas pu prendre par la force. Et d'après le comportement des personnages de cette maison, il est bien évident qu'ils sont têtus et inébranlables. Ils n'ont pas besoin du les lois des Seigneurs, l'approbation des Rois, ils sont livrés à eux-mêmes, mais montrent clairement qu'ils ne sont pas prêts d'abandonner.

10. Tyrell - "En grandissant, on devient plus fort". La devise de la maison Tyrell a été confirmée par leur armée, dont le nombre ne pouvait être comparé à aucune armée de Westeros. Les Tyrell disposaient également d'un « coussin » sous la forme de la richesse qu'ils avaient accumulée. Considérant que le manteau des armoiries de cette maison représente une rose, un parallèle peut également être établi avec elle D'une petite pousse à un énorme rosier. Ainsi, les membres de la maison Tyrell, accumulant progressivement des forces, développèrent et renforcèrent leurs positions. Cependant, comme Olenna elle-même a dit, ce ne sont pas du tout des guerriers.

11. Boulonner -"Nos lames sont aiguisées". Cette devise sert plutôt d'avertissement aux ennemis (et pas seulement) de la famille Bolton. Les représentants de cette maison ont une sombre réputation ; dans les livres, ils portaient même des manteaux en peau humaine et en décoraient les murs de leurs châteaux. : "Un homme nu n'a pas de secrets, mais un homme écorché et encore plus." "Nos lames sont tranchantes" - peut apparemment aussi signifier des lames pour écorcher la chair.

12. Mormont - "Nous sommes ici". La devise qui, selon Sunsetsolitude, est également mal traduite en russe." Nous sommes ici - peut signifier "Voici nos terres", ce qui signifie "Une île petite mais fière qui ne dérange personne, mais qui peut se définir par elle-même. Voici nos terres, souvenez-vous-en lorsque vous venez ici, nous sera prévenu. " Ou cela peut être traduit par « Nous en sommes là » - ce qui serait une indication directe de la force de l'entêtement du Mormont."

13. Frey - "Nous sommes côte à côte"Les Frey appréciaient les liens familiaux et l'inviolabilité de ce mot, c'est ce que reflétait cette devise. De là, Walder Frey avait une rancune indicible contre Rob Stark, qui a rompu sa promesse d'épouser sa fille, ce qui a entraîné de tristes conséquences.

"Un Lannister paie toujours ses dettes." ©FFG ( Jason A. Engle)

"Les Lannister paient toujours leurs dettes"(Aussi: "Un Lannister paie toujours ses dettes"écoutez)) est un dicton populaire dans les Sept Royaumes à propos de la Maison Lannister et une expression préférée de Tyrion Lannister. Elle n’est pas moins célèbre que la devise « officielle » de la maison, « Écoutez-moi rugir ! » Cette expression a un double sens. D'une part, cela signifie que les Lannister, en tant que maison la plus riche de l'État, sont toujours prêts à payer leurs factures et à remercier ceux qui les ont aidés, ou à promettre des récompenses à l'avenir - vous pouvez toujours compter sur la générosité et l'engagement des "les Lions". Mais cette devise a aussi un deuxième sens menaçant : les Lannister n'oublient pas les insultes qui leur sont infligées et se vengeront définitivement des contrevenants.

Dans la bouche de Cersei Lannister, le dicton résonnait dans un discours dirigé contre Tyrion lui-même - Cersei accusait son frère d'intrigues contre elle et Joffrey et tentait de faire chanter Alaya capturée. Plus tard, se retrouvant à la tête de l'Etat, Cersei a utilisé les mêmes mots pour justifier sa décision de cesser de payer les dettes publiques envers la Banque de Fer de Braavos - les Lannister paient toujours leurs dettes, et cette dette sera payée tôt ou tard. Elle a ensuite mentionné ce dicton dans un dialogue avec Balman Birch et Falisa Stokeworth, leur promettant une récompense pour leur aide, puis a envoyé Tyroshi qui avait tenté de la tromper au bourreau avec les mots "Les Lannister paient leurs dettes, et vous paierez". aussi."

Tywin Lannister a mentionné ce dicton lors d'une conversation avec Tyrion, justifiant la nécessité de donner Harrenhal à Petyr Baelish, puisqu'il le souhaitait lui-même. Tyrion lui-même a immédiatement répété les mots sur les dettes, exigeant une récompense pour ses services en tant que Hand. Shae a répété le dicton, rappelant à Tyrion sa promesse de la remettre dans la maison de ville. Ayant appris la défection des Westerlings au profit de Robb Stark, Tyrion pensa que Tywin punirait certainement les traîtres et se souvint du dicton.

Jaime Lannister l'a rappelée à Urswick, essayant de le séduire avec la richesse, et plus tard, ayant perdu la main, il s'est répété le dicton, alimentant sa soif de vengeance et son désir de vivre. Il a dit à Brienne de Tarth qu'il l'avait sauvée du viol en signe de gratitude pour le naufrage de la galère de Robin Rieger au début de leur voyage, rappelant encore une fois le dicton. Il répéta plus tard ces propos lors d'une conversation avec Varys, expliquant ainsi son désir de libérer Tyrion. Après avoir retiré Edmure Tully de l'échafaudage près des murs de Riverrun, Jaime pensa : « Les Lannister paient leurs dettes, et tu es la seule pièce qu'il me reste. »

Edmure Tully lui-même a rappelé ce dicton en apprenant le meurtre de Willem Lannister et Theon Frey par Rickard Karstark. Roose Bolton, parlant de son intention de quitter Harrenhal et de le laisser à Vargo Howth, a déclaré : « Les Lannister ne sont pas les seuls à payer leurs dettes. » Jaime a répété ce dicton lorsqu'il a fait ses adieux aux Brave Boys en quittant le château, laissant entendre qu'il se vengerait d'eux, puis, revenant au château pour Brienne, il a adressé les mêmes mots à Vargo Haught, disant qu'il recevrait une rançon pour Jaime et Brienne

Pratiques technologiques de gestion de la dette dans une seule équipe


Il y a environ un an, notre équipe est passée d’une phase de croissance rapide des fonctionnalités à un développement plus fluide axé sur l’amélioration de la qualité. À ce stade, nos produits ont accumulé une quantité notable de solutions sous-optimales, de code laid et de bibliothèques obsolètes. Il fallait faire quelque chose à propos de tout cela.


Jusqu’à présent, nous avons réussi à construire un processus qui rend la lutte contre la dette technique prévisible, indolore et inévitable.


Ce que nous avons obtenu comme résultat :

  • L'équipe est contente. La rétrospective de la version inclut régulièrement des points positifs sur l'amélioration de la technologie et la réduction de la dette technique.
  • Pendant plusieurs versions trimestrielles consécutives, nous avons pu augmenter les fonctionnalités sans augmenter le nombre de lignes de code dans le projet. La suppression du code inutile et la simplification de ce qui était nécessaire ont réduit la taille de la base de code des fonctionnalités existantes. Et cette réduction a à peu près coïncidé avec l’ampleur du nouveau code implémentant la nouvelle fonctionnalité.
  • Lors des refactorisations et des mises à niveau, le produit est toujours en état de marche. Toutes les deux semaines, nous publions une version intermédiaire entièrement fonctionnelle.

Laissez-moi vous raconter comment nous y sommes parvenus.

Qu'est-ce que la dette technique

Ma définition pratique de la dette technique est la quantité de travail qui doit être effectuée pour qu'un projet réponde à la vision de l'équipe de ce qui est génial. Notez que la dette technique peut survenir non seulement en raison de l'utilisation libérale des béquilles dans le développement, mais également en raison de l'évolution des idées sur la beauté. Par exemple, les pratiques courantes de l’industrie ont changé. Ou bien les développeurs sont tombés amoureux de la POO et sont tombés amoureux de la programmation fonctionnelle. Ou bien le cadre autrefois à la mode n'est plus un gâteau et il est devenu difficile de trouver des spécialistes qui voudraient écrire dessus.


Or la principale cause de la dette technique est l’entropie dans toute sa diversité. Tests unitaires désactivés, commentaires obsolètes qui ont perdu le contact avec le code, décisions architecturales infructueuses, implémentation de fonctionnalités que plus personne n'utilise, fondation d'un avenir qui n'est pas encore venu, et bien plus encore.


Il s’ensuit que l’apparition d’une dette technique est inévitable dans tout projet de longue durée.

Quand la dette technique n’est pas un problème

Pourquoi la dette technique est-elle mauvaise ? Cela augmente le coût du développement ultérieur en raison d'un certain nombre de facteurs :

  • La vitesse de mise en œuvre des nouvelles fonctionnalités est réduite.
  • La probabilité de régressions lors de la correction des défauts augmente.
  • Le processus de développement devient moins prévisible et donc moins gérable.
  • Le processus d'introduction d'un nouveau développeur dans le projet s'allonge.

Cette perte est parfois appelée « intérêts de la dette technique »


Il existe des situations où ces pertes sont moins coûteuses que l’élimination de la dette technique :

  • La fin de la vie du projet est proche. Notez que ce n'est pas la fin de l'ajout de fonctionnalités, mais le moment où vous pouvez également arrêter de gaspiller les efforts des programmeurs en support. Cette catégorie comprend également des prototypes uniques, des démos uniques pour des expositions, etc.
  • La valeur du temps de développement actuel est bien plus élevée que prévu à l’avenir. Corrections urgentes dans un délai fixe, startups qui manquent d'argent lors du prochain tour de financement, etc. Dans de tels cas, le règlement de la dette technique peut être retardé jusqu’à ce que le feu de l’action se soit calmé. Il y a des projets qui ne sortent pas de l'état d'urgence, mais les conseils de cet article ne les aideront toujours pas.

Que faire de la dette technique ? Approches échouées

Approche n°1. « On n’a pas le temps, il faut remettre le communiqué hier »

La volonté de respecter à tout prix l'échéance de demain, au détriment de la vitesse de développement d'après-demain.


Parfois, une structure préfabriquée constituée de béquilles est un choix objectivement correct. Dans ma pratique, cela s'est exprimé le plus clairement lors de la création de versions de démonstration pour des expositions. La date de l’événement est strictement fixée ; si vous n’êtes pas arrivé à temps pour une exposition importante, la prochaine tentative aura lieu dans un an. Dans ce cas, vous pouvez afficher le produit « hors de vos mains », en évitant soigneusement tous les bugs. En tant qu'ingénieur, c'est désagréable pour moi de réaliser de tels projets, mais les béquilles qu'ils contiennent sont justifiées.


Quand on fabrique un produit qui va durer longtemps, tout est différent. Respecter les délais en raison de solutions techniques douteuses est un plaisir coûteux. Le coût total est de :

  1. dès la mise en place de la béquille elle-même,
  2. de son remplacement ultérieur par une solution à part entière,
  3. de la souffrance d'avoir une béquille entre les points précédents.

Le deuxième point est très facile à sous-estimer, et on risque de ne pas penser du tout au troisième, le plus cher.


Lorsque vous rencontrez un responsable technique avec un œil tremblant lors d'une conférence, il se peut que ce soit le cauchemar consistant à déboguer sans fin une conception réalisée à partir de béquilles qui l'a amené à cet état.


Approche n°2. « Oui, ici, nous devons tout jeter et réécrire »

Plus la situation de la dette technique est mauvaise, plus la tentation d’enterrer tout le code du projet et de tout réécrire est forte. C’est l’une des erreurs classiques qui peuvent tuer tout le projet.


Le sujet est si bien traité dans le célèbre article de Joel Spolsky que je ne vois aucun intérêt à présenter mes propres arguments.

Approche n°3. « Nous refactoriserons la nuit et le week-end pour que le manager ne le sache pas. »

Argumenter la nécessité d’éliminer la dette technique en termes d’avantages commerciaux n’est pas toujours facile. L’équipe de développement peut être tentée de contourner les aspérités et de lancer une refactorisation majeure sur place. Cela peut être fait pendant les heures non travaillées, lors de pauses entre d'autres tâches, ou « à la suite d'autres tâches » en gonflant les estimations.


Qu'est-ce qu'il y a de mal à ça ? Oh, tout un tas de choses :

  • Une transparence réduite mine la confiance entre la direction et l’équipe. Souvent, les tentatives ultérieures visant à corriger la situation en imposant de la discipline et en resserrant les vis conduiront à une nouvelle détérioration du travail d'équipe.
  • Une situation bien ancrée dans laquelle les priorités de l’équipe et de la direction sont contradictoires provoque une démotivation des deux côtés.
  • Les fruits du refactoring sont inclus dans le produit de manière imprévisible et provoquent des bugs de régression là où ils ne sont pas attendus. Dans les équipes conscientes, cela entraîne une charge soudaine et imprévue sur l'assurance qualité. Dans l’inconscient, il entre en production et s’y décompose.

Une fois que l’équipe a utilisé cette recette, les yeux de la direction commencent à trembler.

Nos principes

1. Ajouter des tâches techniques au backlog général

Il existe un certain nombre de modèles dans la vie des tâches dans les projets :

  • Une tâche qui n'est pas en retard a moins de chances d'être mise en œuvre.
  • Une tâche sans formulation claire a moins de chances d'être mise en œuvre.
  • Une tâche qui ne peut pas être estimée avec un degré élevé de confiance a moins de chances d'être exécutée.
  • Une tâche volumineuse attendra plus longtemps dans la file d’attente qu’une petite tâche.

Maxim Dorofeev parle très bien de ces choses dans sa « Technique de la boîte de réception vide »


Pour éviter l'accumulation de la dette technique, les travaux visant à l'éliminer doivent être réalisés en tenant compte des principes énoncés ci-dessus.


Toutes les tâches, à l'exception des plus petites, sont répertoriées dans le backlog. De cette façon, ils ont la possibilité de le faire non seulement pendant leur temps libre, mais également dans le cadre du travail prévu. De plus, il est plus difficile de perdre complètement de vue ces tâches - l'arriéré est examiné plus souvent et de plus près que les TODO dans le code, les morceaux de papier sur le moniteur, les pages wiki abandonnées, les serviettes tachées de thé avec des diagrammes et autres sources d'information.

  • S'il y a un TODO non trivial dans le code, il contient un lien vers la tâche dans le backlog. Nous vérifions le respect de ce principe lors de la revue du code et n'acceptons pas de TODO complexes sans références.

    Il peut y avoir un drame derrière ce commentaire.

    Une fois, à côté d'un tel TODO, il était écrit : « Béquille. Le Product Owner m'a obligé à le faire. Supprimer dès que possible."

  • Lorsqu'un développeur se rend compte qu'un endroit nécessite une refactorisation, il crée un problème dans le backlog.
  • Lorsqu'un développeur souhaite améliorer la plateforme, il crée une tâche dans le backlog.
  • Les plans architecturaux à long terme sont mis en attente sous la forme de tâches distinctes dès qu'il existe suffisamment de certitude quant au moins aux premières étapes.

Tant que ces changements restent peu coûteux en termes de coûts de développement et de quantité de tests requis, nous pouvons améliorer progressivement notre base de code sans interrompre nos objectifs commerciaux ni introduire de risques supplémentaires.

2. Planifiez des histoires techniques en fonction des priorités commerciales

Si un arbre tombait dans la forêt, mais que personne ne l’entendait, y avait-il un bruit ? S'il y a un mauvais code dans un projet, mais que ce module n'aura jamais besoin d'être modifié, y a-t-il une dette technique ?


Je crois que lorsqu'un programmeur trouve désagréable de regarder un vieux module, ce n'est pas en soi un très gros problème. Ce qui se passe est bien pire lorsque vous devez ajouter de nouvelles fonctionnalités à ce module ou étendre l'ancienne. Par rapport aux modifications apportées à un code bien écrit, ces tâches sont plus susceptibles (et plus susceptibles de dépasser l'estimation initiale) et de contenir plus de bogues. Parfois bien plus. Pour se protéger de ce type de problèmes, nous essayons de planifier les refactorings afin qu'ils soient effectués avant d'écrire de nouvelles fonctionnalités au même endroit.


Si les modifications de fonctionnalité et les refactorisations semblent minimes, elles peuvent être effectuées ensemble. La taille de la tâche sélectionnée empiriquement pour laquelle cette approche sera optimale est de 3 jours de travail pour un développeur ou moins. Lorsqu'il est clair qu'il y a encore du travail, celui-ci est divisé en refactoring tout en conservant le comportement actuel et en implémentant de nouvelles fonctionnalités.


Ainsi, l'ordre des travaux pour éliminer la dette technique est déterminé par l'ordre des tâches commerciales dans le backlog.


Le principe des « priorités commerciales » a une autre application. L'un des problèmes courants dont souffrent les développeurs qui s'efforcent de bien écrire est la difficulté de consacrer du temps à l'optimisation des performances, à l'amélioration de la maintenabilité ou à d'autres choses qui ne sont pas directement incluses dans le plan de travail. Il existe presque toujours un besoin commercial pour ces améliorations. Qui ne souhaite pas que le système fonctionne plus rapidement, soit plus stable et soit moins coûteux à entretenir ? Tous ces avantages peuvent être évalués et, sur la base de cette évaluation, les tâches à améliorer peuvent être placées dans le backlog, avec d'autres.


Donc, si vous souhaitez optimiser les performances, mais que vous devez à la place corriger un autre bug ennuyeux, peut-être ne savez-vous tout simplement pas comment expliquer les avantages de l'optimisation dans un langage que le propriétaire du produit peut comprendre.

3. Laissez le code plus propre qu’il ne l’était avant vous

Presque tous les codes, à l'exception de celui écrit très récemment, sont un peu en retard sur l'idée actuelle de la beauté dans le domaine du style et de l'architecture. Lorsque vous devez modifier du code dans le cadre d’une tâche, il est considéré comme une bonne pratique d’apporter toutes les améliorations sûres possibles dans la zone affectée. Qu'est ce que ça pourrait être?

  • Apporter des modules au style actuel.
  • Changer les noms de variables internes pour des noms plus compréhensibles.
  • Simplifiez la mise en œuvre tout en conservant le comportement.
  • Des refactorisations locales qui n'introduisent pas de modifications à grande échelle dans les autres modules.

Ces améliorations devraient améliorer le code, mais n’augmenteront pas de manière significative le coût de développement ou de test.


Grâce à ce principe, la qualité du code augmente progressivement en arrière-plan, même dans les endroits où aucune refactorisation distincte n'était prévue. De plus, plus nous travaillons souvent sur une certaine partie du système, meilleur est le code pour cette partie. Un joli contraste avec les projets où le développeur passe le plus de temps sur les parties avec le pire code.

4. Quoi qu’il arrive, le système doit rester en état de marche.

L'un des principes de base de SCRUM dit qu'à la fin de chaque sprint, le système doit atteindre un état stable.


« À la fin du sprint, l'incrément devrait être prêt, ce qui signifie qu'il répond aux critères de préparation de l'équipe Scrum et qu'il est prêt à être utilisé. Il doit être prêt à être utilisé, quelle que soit la décision du propriétaire du produit de le publier ou de le retarder.

Tout travail d'élimination de la dette technique est réalisé dans le respect de ce principe.


Les grandes transformations sont nécessairement décomposées de manière à ce que n'importe quelle étape individuelle puisse être complétée en un seul sprint. Par exemple, nous avons modifié le système d'assemblage en deux étapes ()


Nous travaillons avec VCS selon des principes proches du gitflow classique. Le développement est effectué dans les branches de fonctionnalités, les tests y sont effectués. En règle générale, une telle branche ne dure pas plus d'un sprint de deux semaines. Une branche qui dure plus longtemps entraîne presque toujours des coûts supplémentaires.


Notre expérience confirme clairement cette tendance. Chaque fois que nous ne parvenions pas à terminer une refactorisation majeure en deux semaines, c'était une douleur et une souffrance. Et plus la tâche était longue et plus la succursale ouverte durait longtemps, plus le travail était lent et plus il y avait de problèmes.


La nécessité d'être toujours à quelques pas d'une version stable crée l'un des problèmes d'ingénierie les plus difficiles et les plus intéressants : trouver la décomposition optimale des plans stratégiques. Les changements à grande échelle peuvent être décomposés en étapes distinctes et indépendantes. Il est conseillé de commencer à percevoir des prestations le plus tôt possible. Mieux cette répartition des travaux est réalisée, plus grandes sont les chances de mener à bien le chantier.

À quoi ressemble notre processus

Une fois par version, nous effectuons un examen détaillé du backlog technique :

  • Nous fermons les histoires non pertinentes (pertinence perdue, réalisées dans le cadre d'autre chose, doublons).
  • Nous mettons à jour la description là où la vision du problème a changé.

Lorsque des histoires commerciales apparaissent à l'horizon, une analyse technique est effectuée et toutes les histoires techniques qui pourraient aider à la mise en œuvre sont associées à l'histoire commerciale.


En préparation de la planification du sprint :

  • Nous vérifions les liens entre les histoires techniques et commerciales.
  • Nous associons tous les bugs associés à des histoires techniques qui peuvent être corrigées à moindre coût au même endroit.

Comment constituer la partie technique du backlog

Lorsque j'ai assumé le rôle de responsable de l'équipe, j'ai demandé à chaque développeur et responsable qualité quelles améliorations ils souhaitaient le plus apporter au produit. La plupart des demandes concernaient des améliorations techniques de la plateforme et des refactorisations. Comme l'expérience l'a montré, tous les problèmes techniques clés du produit étaient inclus dans cet ensemble de souhaits. Vous pouvez donc utiliser cette pratique pour constituer rapidement un backlog technique à partir de zéro ou vous faire une idée générale de l'état de la dette technique dans un nouveau projet.


Le remplissage actuel de l'arriéré avec des tâches techniques est dû aux pratiques décrites ci-dessus et ne nécessite pas d'efforts ou d'analyses séparés. De plus, de nouvelles idées d’amélioration technique du produit s’ajoutent au backlog. Ceci est fait par tout membre de l'équipe qui a eu une telle idée. L'essentiel à ce stade est de ne pas perdre l'idée. La clarification et la détermination des priorités ont lieu plus tard, lors de la planification du travail.

conclusions

  • La dette technique est inévitable.
  • Pour la plupart des projets, l’élimination de la dette technique constitue un bon investissement en efforts.
  • Si l’on ne s’attaque pas à la dette technique, la vitesse de développement s’approchera progressivement de zéro.
  • La tentation de tout jeter et de réécrire peut tuer ou sérieusement paralyser votre projet.
  • Les avantages de l’élimination de la dette technique doivent être présentés en termes d’avantages commerciaux, sinon il existe un risque que les tâches visant à créer de nouvelles fonctionnalités soient toujours considérées comme plus importantes.
  • Les tâches visant à éliminer la dette technique valent la peine d'être gérées. Ces tâches ne sont pas différentes des autres tâches du projet en termes de comptabilité, de planification et de priorisation.
  • Des situations surviennent régulièrement dans lesquelles vous pouvez réduire la dette technique et résoudre un problème commercial en même temps à moindre coût que de le faire séparément. Ces opportunités doivent être exploitées.
  • Des conventions de style de code et des processus de révision réfléchis et mis à jour en temps opportun contribuent à ralentir l’émergence de nouvelles dettes techniques.
  • Les itérations courtes sont aussi utiles pour les refactorisations que pour le développement de nouvelles fonctionnalités.
  • L’équipe sait généralement où se situe la dette technique dans le projet et à quel point elle est grave. Il vaut la peine d’utiliser ces connaissances pour se faire une idée de la dette technique du projet.

CATÉGORIES

ARTICLES POPULAIRES

2024 «kingad.ru» - examen échographique des organes humains