Question

Notre code est nul. En fait, permettez-moi de préciser que. Notre vieux Code suce. Il est difficile de déboguer et est pleine d'abstractions que peu de gens comprennent ou même se souvenir. Hier, j'ai passé une heure de débogage dans une région que j'ai travaillé pour plus d'un an et me suis dit, « Wow, c'est vraiment douloureux. » Ce n'est pas la faute de personne - je suis sûr que tout à fait logique au départ. Le pire est généralement Il fonctionne tout simplement ... à condition que vous ne demandez pas à quoi que ce soit en dehors de sa zone de confort.

Notre nouveau code est assez bon. Je pense que nous faisons beaucoup de bonnes choses là-bas. Il est clair, cohérent, et (espérons) maintenable. Nous avons un serveur d'Hudson en cours d'exécution pour l'intégration continue et nous avons les débuts d'une suite en place de test unitaire. Le problème est que notre gestion est laser axée sur l'écriture du nouveau code. Il n'y a pas de temps pour donner Ancien code (ou même vieux nouveau code) la CCM, il a si désespérément besoin. À un moment donné notre carnet de commandes scrum (pour six développeurs) a environ 140 articles et une douzaine de défauts. Et ces chiffres ne changent pas beaucoup. Nous avons ajouté des choses aussi vite que nous pouvons les brûler.

Que puis-je faire pour éviter les maux de tête de sessions de débogage marathon embourbé dans les profondeurs du Vieux Code? Chaque sprint est rempli à ras bord avec de nouveaux développement et défauts Showstopper. Plus précisément ...

  • Que puis-je faire pour l'entretien de l'aide et les tâches refactoring obtenir la priorité suffisamment élevée pour être travaillé?
  • Y at-il C ++ - stratégies spécifiques que vous employez pour aider à prévenir Nouveau Code de pourrir si rapidement
Était-ce utile?

La solution

Votre gestion peut se concentrer sur l'obtention de caractéristiques de travail dans le produit, et qu'ils continuent de travailler. Dans ce cas, vous devrez faire une analyse de rentabilisation pour refactorisation les vieux trucs, en ce sens par l'investissement X de temps et d'effort, vous pouvez réduire le temps d'entretien nécessaire par Y sur une période Z. Ou votre gestion peut être fondamentalement désemparés (cela se produit, mais moins souvent que la plupart des développeurs semblent penser), auquel cas vous ne serez jamais la permission.

Vous devez voir le point de vue des affaires. Il n'a pas d'importance à l'utilisateur final si le code est laid ou élégant, seulement ce que le logiciel fait. Le coût du mauvais code est le manque de fiabilité potentiel et des difficultés supplémentaires à changer; la détresse émotionnelle qu'il provoque au programmeur est rarement pris en compte.

Si vous ne pouvez pas obtenir la permission d'aller et refactoring, vous pouvez toujours l'essayer sur votre propre, un peu à la fois. Chaque fois que vous corriger un bug, faire un peu de réécriture pour rendre les choses plus claires. Cela peut se révéler plus rapide que le correctif minimum possible, en particulier pour vérifier que le code fonctionne maintenant. Même si ce n'est pas, il est généralement possible de prendre un peu plus de temps sur une correction de bug sans avoir des ennuis. Il suffit de ne pas se laisser emporter.

Si vous pouvez laisser le code juste un peu mieux à chaque fois, vous vous sentirez beaucoup mieux à ce sujet.

Autres conseils

Stand Up Réunions

Je pourrais aller à mon mécanicien, et nous avons une petite réunion de stand-up du matin:

  

Je lui dis que je veux que mes roues alignées,   mes pneus en rotation, et mon huile changé.   Je mentionne que « Oh par la façon dont mon   freins senti un peu mou sur le chemin   dans. Pourrait [il] jeter un oeil à eux?   Combien de temps puis-je obtenir mon dos de voiture parce que   Je dois retourner au travail? "

     

Il saute sa tête sous ma voiture, pops   sauvegarder et dit que mes freins fuient   le pétrole et le départ à l'échec. Il aura besoin   une partie qui arrivera à 10h30.   Son homme ne se terminera pas avant le déjeuner, mais   Je devrais obtenir ma voiture par 13h30 ou   alors. Il est réservé solide donc il ne sera pas   capable de faire l'une des autres choses   aujourd'hui, et je vais devoir réserver un autre   rendez-vous.

     

Je demande s'il peut faire les autres choses et   Je reviens pour le frein. Il me dit   il peut vraiment pas me laisser conduire sur   il sans fixer les freins   car ils pourraient provoquer un accident,   mais si je veux aller à un autre   mécanicien, il peut demander un remorquage.

     

Depuis la voiture sera fait si peu de temps   après le déjeuner, je lui demande si son homme peut prendre   un déjeuner tardif pour que je puisse obtenir mon dos de voiture   une heure plus tôt.

     

Il me dit à ses hommes viennent à 8h du matin et   travaillent souvent dans la soirée.   Ils gagnent chaque pause qu'ils   obtenir, et son homme mérite de prendre sa   déjeuner avec tout le monde.

Rien de tout cela est ce que je voulais entendre. Je voulais entendre que je chasser de là dans une demi-heure avec mes roues, les pneus et l'huile fait.

Mon mécanicien était tout droit et honnête avec moi. Êtes-vous en droit et honnête avec votre gestion? Ou vous éviter de dire eux des choses qu'ils ne veulent pas entendre?

Tests unitaires

Je ne toucherait pas une ligne de code, je ne comprenais pas, et je ne vérifierait pas dans une nouvelle ligne de code, je n'ai pas testé à fond. (Au moins, pas intentionnellement.)

Votre question semble impliquer que en quelque sorte un grand corpus code mal documenté fait sans aucun examen passé des tests unitaires. Peut-être que vous avez participé à cela, et peut-être vous ne l'avez pas. Toutes les personnes impliquées doit accepter la responsabilité de ce - y compris la gestion. Peu importe, ce qui est fait est fait. Vous ne pouvez pas revenir en arrière et changer.

Cependant, en ce moment, dans le temps présent, il est de la responsabilité de tout le monde à arrêter le comportement qui a conduit au problème en premier lieu. Vous dites que vous avez passé un an à travailler dans le code que vous trouvez difficile à comprendre et qui n'a pas de tests unitaires. Au cours de cette année, vous avez travaillé dur pour améliorer votre compréhension, combien de tests unitaires avez-vous écrit à documenter et de vérifier que la compréhension?

Comme vous eu du mal par le code gagnant peu à peu comprendre, combien de commentaires avez-vous ajouté pour que vous n'auriez pas à lutter la prochaine fois?

Scrum Carnet de commandes

Personnellement, je pense que le terme « arriéré Scrum » est un terme impropre. Une liste de choses à faire est juste une liste - une liste d'achats si vous voulez. J'avais une liste quand je suis allé au mécanicien. Mon debout rencontre avec le mécanicien était vraiment plus d'une réunion de planification de sprint.

La réunion de planification de A est une négociation. Si votre gestion est la boxe de temps sans que la négociation, ils ne gèrent pas quoi que ce soit. Ils sont tout simplement essayer de caser 10 livres de merde dans un sac de 5 livres, et il est de votre responsabilité de le leur dire.

Lorsque vous vous présentez à une réunion de planification de sprint, vous devrait engager dans un corps de travail, et il est de votre responsabilité de préparer. des moyens de préparation ayant une idée de ce que vous aurez à faire pour compléter chaque élément de la liste -. y compris le temps qu'il faut pour comprendre le code obscur et le temps qu'il faut pour les tests unitaires d'écriture

Si quelqu'un vous invite à une réunion de planification où vous n'aurez pas le temps de préparer, refuser la réunion et proposer quand rééchelonner donc vous aurez le temps.

Si vous avezun organisme existant code sans tests unitaires et une caractéristique pourrait vraisemblablement affecter le fonctionnement de ce code, vous devez les tests unitaires d'écriture pour autant de l'ancien code comme cela pourrait être affecté. Lorsque vous vous engagez à écrire la fonction, vous vous engagez à faire ce travail. Si les feuilles que vous trop peu de temps à consacrer à une autre caractéristique, dites donc. Ne commettez pas à l'autre fonction.

Lorsque vous vous engagez à corriger un défaut, vous vous engagez à tester votre travail. De toute évidence, que les moyens d'écriture d'un test unitaire pour le défaut. Mais si elle implique l'ancien code sans tests unitaires, cela signifie aussi l'écriture des tests unitaires pour des choses qui ne sont pas encore rompu, mais pourrait casser à cause de votre changement. Sinon, comment allez-vous tester le correctif?

Si votre liste de défauts reste une taille constante, votre équipe régresse autant qu'il fixe. Poliment expliquer à qui doit comprendre que les tests unitaires empêchent les régressions qui maintiennent actuellement votre liste de défauts de rétrécissement.

Si vous ne parvenez pas à écrire ces tests unitaires parce que vous vous engagez à trop de fonctionnalités, dont la responsabilité est-ce?

Refonte

Lorsque vous refactoring code, vous devez tester tout cela, et que des moyens d'écriture des tests unitaires pour l'ensemble de celui-ci. Si vous avez un grand corps d'un code sans tests unitaires, vous devrez écrire tous les tests unitaires avant refactorisons.

Je vous suggère de tenir au loin sur la refactorisation jusqu'à ce que les tests unitaires sont en place. En attendant, si vous insistez, y compris des tests unitaires dans vos estimations pour le travail que vous engagez à, éventuellement tous ces tests unitaires seront là. Et vous pouvez factoriser.

La seule exception à cela est refactoring pour la testabilité. Vous trouverez peut-être que certains du code n'a pas été conçu pour le test et que vous devez refactoring pour des choses comme l'injection de dépendance avant de pouvoir créer vos tests unitaires. Lorsque vous vous engagez à écrire la fonction qui nécessite le test unitaire, vous vous engagez à faire du testable de code. Inclure dans votre estimation lorsque vous vous engagez à la fonction.

Engagement + Responsabilité = Puissance

Vous dites que vous êtes impuissants. Lorsque vous acceptez la responsabilité et engager à faire ce qu'il faut faire, je pense que vous trouverez vous avez toute la puissance dont vous avez besoin.

P.S. Si quelqu'un se plaint de tout le monde « perdre du temps » écrire plusieurs tests unitaires lors de la fixation d'un seul défaut, leur montrer cette vidéo sur la règle 80/20 et livre « amas de défauts » dans leur cerveau.

Il est difficile de dire beaucoup de l'information que vous donnez. Quelques questions que j'aurais est une raison logique d'écrire un nouveau code est de remplacer l'ancien code. Si tel est ce que vous faites, abandonner l'ancien code.

Est-ce aussi le code ancien qui a des défauts Showstopper? Si oui, où viennent-ils? L'ancien code ne pas « Showstopper » défauts, il broie tout près et plus près d'un arrêt général. Il est ancien code après tout - il devrait avoir les mêmes vieux défauts et les mêmes vieilles limites, pas des choses qui doit être regardé IMMÉDIATEMENT. défauts Showstopper sont nouveaux défauts de code. On dirait que il y a un développement actif dans l'ancien code.

Si vous écrivez tout ce nouveau code sur le dessus de l'ancien code qui suce, sans intention de le fixer une fois pour toutes, désolé, il n'y a donc que vous pouvez faire lorsque vous êtes trop occupé vous ensevelir pour vous creuser out.

Si ce dernier est le cas. vous devriez reconnaître où vous êtes dirigé, et essayer de détacher un peu. Il va tout effondrement finalement, si vous prévoyez d'être autour de sauver votre force pour une bataille digne d'intérêt.

Dans l'essai de temps pour ramasser quelques modèles de conception. Il y a plusieurs qui peuvent au moins vous aider à protéger le nouveau code de vieux trucs, mais, en fin de compte, il est tout simplement difficile d'écrire un bon code contre le mauvais code.

Et votre son sprints peut-être confus. N'y at-il une direction générale? Cela devrait déterminer combien vous avez arriéré, bien que les choses peuvent changer mois en mois, est-il pas une idée claire d'aller vers un but final?

Et nouveau pourrissement code? La façon dont vous empêchez qui vous avez une conception de sens, une direction significative, et une équipe de qualité qui se consacre à la fois la qualité de leur travail et la vision de la conception. Si vous avez, la discipline est ce qui maintient la qualité. Si vous ne disposez pas que désolé, vous codez écrivaient essentiellement sans but déjà. Il était fondamentalement pourri sur la vigne.

Ne pas être critique, juste essayer d'être honnête. Prenez une grande respiration. Ralentir. Vous semblez comme vous en avez besoin. Regardez ce que vous avez écrit ici. Il ne dit rien. Vous parlez de réusiner, points de presse, showstoppers, défauts, ancien code, le nouveau code. Qu'est-ce que tout cela signifie? Il est tout mêlé.

Qu'en est-il « de nouvelles initiatives par rapport aux systèmes existants »? « Besoin de refactoriser le code du cycle de sprint début en termes de dernière compréhension, etc. » Sont showstoppers en fait « composantes premières des initiatives actuelles de l'entreprise ont été libérés, mais sont confrontés à des problèmes et pas de temps sont prévus au budget en raison d'un nouveau développement ».

Ceux-ci seraient des concepts significatifs. Vous avez rien ne nous donné. Je comprends qu'il est intense. Mes sprints sont fous aussi, nous ajoutons beaucoup de dos, articles pg parce que nous ne pouvions pas obtenir beaucoup d'exigences à l'avant (beaucoup de mes nouvelles exigences résultent d'avoir RELEVER aussi avec les organismes de réglementation externes, le processus normal des affaires ne sont pas toujours disponibles ).

Mais en même temps, je suis broyé par l'ampleur de ce qui doit être fait et le temps de le faire. Tout ce qui est ajouté à mon carnet de commandes a besoin d'être là. Il est fou, mais en même temps j'ai une idée très claire de là où je suis, où je dois aller, et pourquoi la route est plus difficile getter.

Reculer, effacer vos pensées, figure le même - où vous avez été et où vous allez. Parce que si vous savez que, il est sûr pas évident. Si vous ne pouvez pas communiquer quoi que ce soit vos pairs peuvent comprendre, jusqu'où allez-vous obtenir avec un chef d'entreprise?

L'ancien code est toujours chiant. Il y a probablement quelques rares exceptions écrites par des personnes avec des noms comme Kernighan ou Thompson mais, pour le « code écrit dans un bureau » typique des choses, au fil du temps que ça va puer. Les développeurs ont plus d'expérience. nouvelles pratiques, telles que l'intégration continue, changer le jeu. Stuff get est oublié. Les nouveaux mainteneurs ne parviennent pas à saisir des conceptions et souhaits pour réécritures. Donc, mieux accepter cela comme normal.

Certaines choses qui pourraient aider au hasard ...

  • Parlez avec votre équipe. Partagez vos expériences et vos préoccupations, tout en évitant « l'homme ancien code sucks » (pour des raisons évidentes) et voir ce que le consensus. Vous n'êtes probablement pas seul.
  • Oubliez vos gestionnaires. Ne pas les exposer à ce niveau de détail - ils ne ont pas besoin de penser à nouveau par rapport à l'ancien code et ne sera probablement pas comprendre s'ils le font. Ceci est un problème pour votre équipe pour faire face et, si nécessaire, pour faire de votre bon de commande au courant de
  • Soyez ouvert à la possibilité que vous pourriez être en mesure de jeter des choses dehors. Une partie de ce vieux code est probablement lié à des caractéristiques qui ne sont plus utilisés ou échoué à adopter par les utilisateurs en premier lieu. Pour faire ce travail pour vous, vous avez vraiment besoin d'aller un niveau plus élevé et penser en termes d'où le code offre vraiment la valeur de l'utilisateur ou une entreprise par rapport à où il est juste une boule de boue que personne ne soit assez courageux pour prendre une décision sur. Qui ose, gagne.
  • Détendez-vous votre point de vue de la cohérence architecturale. Il y a toujours un moyen de puiser dans un système travailler avec le nouveau code quelque part, et qui peut vous permettre de migrer lentement vers une nouvelle approche plus intelligente, tout en préservant l'ancien assez longtemps pour ne pas casser les choses existantes.

Dans l'ensemble, gagner dans ce genre de situation est moins sur le codage des compétences et beaucoup plus sur des choix judicieux et la manipulation des aspects humains.

L'espoir qui aide.

je recommande de garder une trace de combien de bogues et des changements de code impliquer votre « ancien code » et présenter ce soit votre gestionnaire ou à vos collègues développeurs à votre prochaine réunion d'équipe. Avec cela en main, il devrait être assez simple pour les convaincre qu'il reste encore à faire pour factoriser votre « ancien code » et le mettre à la hauteur de votre « nouveau code ».

Il serait également prudent de documenter les parties de votre « ancien code » qui sont les plus difficiles à comprendre. Ceux-ci seraient également les parties de votre « ancien code » que vous devriez être refactoring première fois que vous obtenez l'approbation.

Quelque chose à essayer: groupe classe en - disons - pire 10%, mieux 10%, et le reste. Fournir les listes à votre gestion, en disant: « Je prédis la majorité des bogues au cours du prochain trimestre sera trouvé dans le premier set. » Sur la base de la longueur, cyclomatique complexité , la couverture des tests - tous les outils sont à portée de main et confortable pour vous. Alors asseyez-vous et regarder - et être droit. Maintenant, vous avez une certaine crédibilité, un effet de levier quand vous dites: « Je voudrais investir des ressources pour faire de notre mieux du mauvais code, afin de réduire les bugs et les coûts d'entretien - et je sais où investir cette énergie, voir? »

Vous pouvez créer des diagrammes et des croquis de la façon dont le nouveau code fonctionne et comment les classes et les fonctions sont liées les unes aux autres. Vous pouvez utiliser FreeMind ou peut-être Dia. Je suis certainement d'accord avec Documenter et commenter votre code. J'ai eu un problème avec cela aussi. J'ai écrit une classe pour la police J2ME pour ma propre langue. Il était horrible pour ces raisons que vous pourriez voir peut-être dans votre code.

  • Pas de commentaires ou de la documentation
  • Moins objet orienté
  • mauvais noms de variables / fonction
  • ...

Mais après quelques mois, on m'a forcé à écrire à nouveau la chose. Maintenant, je l'ai appris à utiliser des noms de variables significatives qui sont parfois très longues. commentaires écriture plus que d'écrire des codes. Et en utilisant des diagrammes pour les classes et leurs relations du projet.

Je ne sais pas si c'était une vraie réponse, mais il a certainement travaillé pour moi. et pour les anciens codes que vous pourriez avoir fait de relire le tout et ajouter des commentaires quand vous vous rappelez les fonctionnalités.

Hope il a aidé.

Parlez à votre propriétaire Produit ! Expliquez que le temps investi dans refactorisation l'ancien code lui apportera des avantages de la vitesse d'équipe plus sur les nouvelles fonctionnalités, une fois cet obstacle est supprimé.

Autres que les approches mentionnées ci-dessus qui sont bons, vous pouvez aussi essayer ces:

Pour garder le code propre avenir

  • Essayez la programmation paire, au moins pour les pièces du sens. Il est un moyen efficace de se faire en revue, le code refondus pratique.
  • Essayez d'obtenir refactorisation sur la définition de « fait ». Ensuite, il fera partie du processus d'estimation et attribué en conséquence. Ainsi, la définition de fait peut comprendre:. Codé, est testé, testé fonctionnellement, testé les performances, le code revue, refondus et intégré (ou quelque chose comme ça)

Pour le nettoyage de l'ancien code:

  • tests unitaires sont parfaits pour vous aider refactoring et de comprendre comment les choses fonctionnent.
  • Je suis d'accord avec les commentaires d'un cas d'entreprise doit être fait pour refactoring à grande échelle. Mais, refactoring à petite échelle pourrait facilement être inclus dans l'estimation et fournira un retour immédiat. i.e. .: Je passe 2 heures de réécriture d'une pièce, mais je l'aurais passé ce temps à la recherche d'insectes de toute façon.

Vous pouvez également envisager d'obtenir le propriétaire du produit et ScrumMaster pour capturer une vitesse séparée pour l'ancien code vs le nouveau code, et l'utilisation qui en conséquence.

S'il y a une nouvelle fonctionnalité désirée et vous pouvez définir un gros morceau non écrasante de code qui est de la manière, alors vous pourriez être en mesure d'obtenir la bénédiction de la direction pour remplacer l'ancien code avec le code nouveau qui a la nouvelle fonctionnalité souhaitée. Quand je l'ai fait, je devais écrire une couche de cale un peu laide pour répondre aux vieilles interfaces de la partie du logiciel que je ne vais pas toucher. Et un harnais de test qui pourrait exercer le code existant et d'exercer le nouveau code pour vous assurer que le nouveau code, comme on le voit à travers la couche de cale, pourrait tromper le reste de l'application en rien la pensée a changé. En retravaillant la partie nous avons retravaillé, nous avons pu montrer d'énormes avantages de performance, la compatibilité avec les choix du nouveau matériel, la réduction de chacun des besoins de notre site sur le terrain pour une expertise dans l'administration de l'espace pour l'application - et le nouveau code n'a beaucoup plus maintenable. Ce dernier point importait pas un petit morceau aux utilisateurs, mais les autres avantages de la reprise étaient assez attrayants pour « vendre » les utilisateurs sur le bien-fondé d'une conversion de base de données un peu douloureux.

Une autre histoire de succès plus modeste: nous avions un système de suivi des problèmes décent qui avait littéralement ans d'histoire. Il y avait un sous-système de notre application qui a été célèbre pour la rapidité avec laquelle il brûler les programmeurs de maintenance. Il est clair que (bien, bien dans mon esprit), il avait besoin d'une nouvelle écriture importante, mais la direction n'a pas été enthousiasmés par cela. Nous avons pu creuser à travers l'histoire dans les données de suivi trouble pour montrer le niveau de dotation qui était entré dans le maintien de ce module, et pour tous ces efforts, les tickets d'incidents par mois contre ce module ont continué à arriver à un taux constant. Face à des données réelles comme ça, même les gestionnaires réticents qui avaient longtemps été pingres au sujet de la dotation de réusinage ce sous-système pourrait voir le mérite de l'affectation du personnel de retravailler ce module.

L'approche que précédemment était de laisser l'entrée et la sortie de ce module seul. Les bonnes nouvelles sont que jeter la mémoire virtuelle au nouveau code avec ses nouvelles structures de fantaisie de données a donner une amélioration notable des performances du module. Les mauvaises nouvelles sont que nous avons presque terminé la réimplantation avant que nous comprenions vraiment ce qui était erroné dans la mise en œuvre originale telle qu'elle a fonctionné la plupart du temps, mais on a réussi à échouer sur certaines des transactions sur quelques jours. La première coupe fidèlement reproduit ces bugs, mais les bugs étaient plus faciles à comprendre dans le code retravaillé si nous avions maintenant une chance de vraiment régler le problème réel. Avec le recul, peut-être que nous aurions été plus intelligent d'avoir capturé des données qui ont produit les problèmes et mieux pris soin de vous assurer que la version retravaillée n'a pas reproduire ce problème. Mais, la vérité est, personne n'a compris le problème jusqu'à ce que nous étions assez loin le long de la re-écriture. Ainsi, la re-écriture a donné de meilleures performances aux utilisateurs et une meilleure compréhension aux programmeurs actuels, tels que le problème réel pourrait vraiment être résolu enfin.

Un échec exemple: Il y avait encore un autre module incroyablement laid qui était constamment une tache de mal. Hélas, je ne suis pas assez intelligent pour être en mesure de comprendre les interfaces à cette ruche defacto misérable particulier d'écume et vilenie, du moins pas dans le cadre temporel du calendrier de sortie nominale. Je voudrais croire que donner plus de temps, nous aurions pu compris un plan approprié pour retravaillant ce morceau de système aussi, et peut-être une fois nous l'avons compris, nous pourrions même identifier les améliorations souhaitées par l'utilisateur que nous pourrions tenir dans la récrire. Mais je ne peux pas promettre que vous trouverez un prix dans chaque boîte. Si la case est obscure entièrement à vous, trancher loin un morceau de celui-ci et de remplacer ce morceau avec le code propre est difficile à faire. Le gars qui avait la charge de ce module est probablement celui qui était le mieux placé pour trouver un plan d'attaque, mais il a vu les plantages fréquents vient et appelsm le domaine de l'assistance que la « sécurité d'emploi ». Je ne pense que quelqu'un de côté pour ne pas la gestion jamais vraiment reconnu qu'il devait être assoupli avec une faim de changement, mais qui est probablement ce qui était nécessaire.

Drew

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top