Comment rester productif face à un code extrêmement mal écrit?

63

Je n'ai pas beaucoup d'expérience dans l'industrie du logiciel, je suis autodidacte et j'ai participé à l'open source avant de décider de travailler. Maintenant que je travaille pour de l'argent, je dois aussi faire face à des problèmes désagréables, ce qui est normal bien sûr.

Récemment, on m'a demandé d'ajouter la journalisation à un grand projet SharePoint écrit par un programmeur qui visiblement était en train d'apprendre à coder sur le tas. Après 2 ans de collaboration, le client a changé pour notre société, mais le mal était fait et maintenant, il me faut maintenant maintenir ce code.

Non pas que le code était trop difficile à lire. Malgré les problèmes - chaque projet a une classe avec plusieurs méthodes de copier-coller, d'énormes ifimbrications, des systèmes hongrois, des connexions non exposées - il est toujours lisible.

Cependant, je me suis trouvé absolument improductif malgré le fait de travailler sur quelque chose d'aussi simple que d'ajouter la journalisation. Fondamentalement, je dois simplement parcourir le code étape par étape et ajouter des appels de trace. Cependant, l'idiotie du code est tellement ennuyeuse que je suis fatigué dans les 10 minutes qui suivent . Au début, j’avais l'habitude d'ajouter des usingconstructions, de réduire l'imbrication en inversant ifles noms, de renommer les variables en noms lisibles - mais le projet est volumineux et j'ai fini par abandonner. Je sais que ce n'est pas la tâche que je devrais faire, mais au moins réduire les dégâts m'a donné une sorte de récompense psychologique pour que je puisse continuer. Maintenant, le truc a cessé de fonctionner et il me reste 60% de mon travail à faire.

J'ai commencé à avoir des maux de tête après le travail et je n'éprouvais plus le sentiment de satisfaction que je ressentais auparavant, ce qui me permettait généralement de coder pendant 10 heures d'affilée tout en me sentant fraîche.

Il ne s’agit pas simplement d’un coup de gueule, car j’ai vraiment une question à poser:

Y a-t-il un moyen de rester productif et de ne pas lutter contre les moulins à vent?

Existe-t-il une astuce psychologique pour rester concentré sur la tâche, au lieu de penser «Comment est- ce stupide ?» À chaque fois que je vois un autre astuce intelligente du programmeur précédent? Le problème avec l'ajout de la journalisation est que je dois réellement comprendre ce que le code fait, et cela me fait mal au cerveau d'une manière désagréable.

Dan
la source
La notation hongroise n'est pas mauvaise, lisez le document original pour voir de quoi il parlait :)
Woot4Moo
14
Je sais que le hongrois n'est pas mauvais. C'est précisément pourquoi j'ai écrit Systems Hungarian, pas Apps Hungarian (l'original). Je ne vois aucun intérêt à utiliser Systems Hungarian en C #, car il possède un excellent système de type et IDE. Avoir 10 variables dans la même portée qui commencent par toutes objest décourageant parce que c'est fondamentalement illisible.
Dan
2
J'aimerais pouvoir donner à cette question plus d'un vote!
o6tech
9
Je me défoule en posant sur la pile des questions grincheuses qui me font perdre mon vote.
Erik Reppen

Réponses:

32

Je suis désolé de vous le dire, mais tous les emplois ne sont pas ensoleillés et glamour. La majorité des tâches de développement impliquent des travaux pénibles comme celui-ci. Triste mais vrai.

Vous êtes chargé d'un travail important, même si c'est ennuyeux au point de regarder sécher la peinture. Il est important pour deux raisons: 1. Il ajoute une journalisation très nécessaire à un système de grande taille afin que, en cas de problème, vous disposiez d'un outil pour vous aider à le trouver. et 2. Il vous familiarise avec la base de code, vous permettant ainsi, en cas de problème, d’intervenir et de le réparer.

Vous créez essentiellement votre propre filet de sécurité ici. Glamours, non, mais important oui!

Alors, cela étant dit, comment devriez-vous vous motiver? Quand j'ai une tâche abrutissante au travail, je me fixe des objectifs. Terminez la tâche x à la fin de la semaine. Si je fais mon objectif, je me récompense. Nouveau restaurant que je veux essayer? Allez vendredi soir si je finis. Un nouveau film vient de sortir? Voir le week-end si je finis.

Je trouve que parler avec mon superviseur et lui faire savoir où je suis et comment je vais me tient responsable. Si je leur dis que j'aurai terminé vendredi, je me sentirai plus enclin à le faire vendredi, car je leur ai dit que je l'aurais fait.

N'oubliez pas qu'une fois que vous aurez terminé cette tâche et que vous l'avez bien exécutée, dans les temps et dans les limites du budget, les utilisateurs s'en rendront compte et, lorsque ce nouveau projet éclatant se présentera, votre nom pourra être simplement suggéré comme celui qui l'obtiendra. :)

Tyanna
la source
J'aime particulièrement le point sur la motivation du vendredi. C'est drôle que la version actuelle soit également programmée pour vendredi. Je pense que cela vaut la peine d'ajouter que la motivation de gratitude est émouvante. Vous devez vous assurer que quelqu'un va vous être reconnaissant pour votre travail, ou alors changer ce sur quoi vous travaillez. Un merci sincère réduit souvent les heures de travail.
Dan
1
@gaearon - Je suis heureux que les suggestions vous soient utiles. Faire le travail pénible avec un bon niveau de motivation portera ses fruits en fin de compte. L'année dernière, à mon poste actuel, je devais faire quelque chose de similaire à ce que vous faites. Cette année, on m'a donné une toute nouvelle application pour écrire à partir de zéro. Les gens remarqueront ce que vous faites et comment vous travaillez bien.
Tyanna
3
-1 Pourquoi lier votre vie professionnelle et personnelle? Cela ressemble à rester constamment au I didn't finish my under-estimated task by Friday - so I need to stay at home and feel bad.
dessus des
@Vorac ~ J'ai dit que c'est ce que je fais pour me motiver. Tout le monde est différent. Et je peux vous assurer que je ne travaille pas régulièrement avec OT. Trouvez quelque chose qui vous motive et utilisez-le. Je trouve qu'une récompense matérielle donne de meilleurs résultats lorsque j'ai une tâche que je ne souhaite pas accomplir.
Tyanna
1
@IntegrityFirst ~ Pour moi, oui. Je resterai tard pour terminer ma liste de tâches. Je vais budgétiser mon temps pour m'assurer de bien le faire. C'est mon intégrité envers moi-même et envers mes collègues de faire quelque chose quand je dis que je vais le faire. Mais, si je découvre que quelque chose ne peut pas être fait dans le temps que j'ai dit, je change de plan et le préviens mon superviseur Et si je finis un peu en retard, le film / restaurant sera là la semaine prochaine. :)
Tyanna
30

Conservez un fichier d'extraits de code de candidat à soumettre à thedailywtf.com. Même si vous n'avez pas vraiment l'intention de les soumettre, cela vous donne un bon côté pour trouver du code pire que la moyenne.

Peter Taylor
la source
J'aimerais pouvoir le revérifier une fois de plus. Cela s’est avéré être une très bonne suggestion, maintenant que j’ai constaté que ces personnes stockent leur journal des modifications dans les fichiers de configuration de l’application, juste avant les paramètres réels.
Dan
24

J'étais dans une situation similaire, chargée de nettoyer un grand nombre de codes mal écrits, copiés et collés en masse.

Pour maintenir ma motivation et ma santé mentale, j'ai écrit un script appelé current_scorequi comptait le LOC dans le projet (qui diminuait progressivement, car j'éliminais la duplication et passais à de meilleurs algorithmes) et le comparait au LOC lorsque je débutais. Chaque fois que je me sentais découragé ou frustré par la montagne de code auquel je faisais face, courir current_scoreme donnait une idée de progrès tangible et me rappelait tout ce que j'avais déjà accompli. Et c'était amusant de voir à quel point je pouvais obtenir un score élevé lorsque je m'attaquais à une section de code particulièrement mauvaise.

Je rechercherais des métriques similaires que vous pourriez facilement écrire pour vous donner une idée du progrès et en faire un jeu de toutes sortes. Lignes de code (il suffit de lancer wc -l), complexité cyclomatique (qui devrait disparaître au fur et à mesure que vous nettoyez ces "ifs" imbriqués), lignes de code qui ont été touchées par vous à la place de votre prédécesseur (je pense que FishEye peut vous le dire plus tôt. 10 $), etc. Vous pouvez même écrire un script Perl sans trop vous soucier de compter le nombre de blocs de code qui n’ont pas encore d’instructions de journalisation.

Josh Kelley
la source
J'utilise SourceMonitor
UmNyobe
13

J'ai vu ce livre recommandé: Travailler efficacement avec Legacy Code , mais heureusement, je n'ai pas eu besoin de le lire.

Comme vous le faites, reformulez ce dont vous avez besoin pour comprendre le code et vous rappeler que vous réanimez un système, ce qui sera rentable si vous le maintenez.
Cela devrait, espérons-le, mettre un ressort dans votre démarche sur le chemin du retour.

StuperUser
la source
2
Ce livre concerne la refactorisation du code existant pour le rendre testable; Je ne pense pas que cela va aider beaucoup en termes de motivation.
Billy ONeal
2
Bon point @Billy ONeal, mais le code testable et les métriques associées peuvent montrer des progrès qui pourraient être motivants.
StuperUser
1
J'ai lu ce livre. Ça vaut vraiment la peine d'être lu. En fait, j'ai trouvé que WEWLC était motivant simplement parce qu'il était agréable de savoir qu'il y avait quelqu'un qui comprenait exactement le type de frustration que j'avais et qui avait mis au point des moyens efficaces pour atténuer ces frustrations.
Jason Swett
1
Ce livre est un peu vieux et obsolète. Si vous ne l'avez pas lu, pourquoi le recommandez-vous?
Bonjour
1
@StuperUser En le lisant, je peux dire qu'il est obsolète et qu'il peut fournir des conseils utiles aux utilisateurs novices.
Février
6

Essayez de diviser le projet en morceaux. Chaque jour, apprenez comment fonctionne un morceau spécifique. Essayer de tout comprendre en même temps est probablement ce qui vous stresse.

Être fier d’améliorer le projet. Y a-t-il d'autres codeurs auxquels vous pouvez parler? Il est utile de rester autour de la fontaine d’eau pour discuter / rire de la dernière logique trouvée. J'essaie de faire cela pour garder une atmosphère joviale au travail.

Davidhaskins
la source
Oui, je travaille par morceaux, et cela fait déjà un certain temps que je travaille dessus, alors j'ai une idée approximative de chaque composant. Néanmoins, cela n'aide pas beaucoup car ce sont de minuscules éléments de logique qu'il faut généralement du temps à comprendre - et je me fâche lorsque je réalise que la méthode à 30 lignes sur laquelle j'ai passé 10 minutes peut en fait être réécrite en 2 lignes. En ce qui concerne la société, malheureusement, je suis le seul développeur sur ce projet et je travaille actuellement dans le bureau du client, je ne peux donc vraiment parler à personne.
Dan
@gaearon - Qu'est-ce qui vous empêche de mettre en œuvre votre solution 2 lignes? Vous devez savoir comment faire ce que vous avez été chargé de faire, le problème avec le code peut être résolu plus tard, lorsque vous n'êtes pas dans le bureau du client. Vous devriez garder vos notes sur ce que vous avez fait, comment quelque chose fonctionne, afin de pouvoir revenir plus tard dans le futur et mettre en œuvre vos modifications pour permettre la révision du code et les tests d'intégration.
Ramhound
@gaearon ah-ha! Vous êtes le seul codeur. Donc, le gars avant vous était le seul codeur. Vous pouvez vous en tirer beaucoup lorsque vous êtes le seul codeur (comme vous l'avez remarqué de la part de votre prédécesseur). Gardez cela à l'esprit lorsque vous recherchez votre prochain emploi. ;)
davidhaskins
@Ramhound Je parie qu'il n'y aura pas de critiques de code. Je parie qu'il n'y aura pas de tests d'intégration formels. J'ai travaillé à ces postes à quelques reprises. Généralement, les gens ne veulent que du code qui fonctionne assez bien et ils le veulent le plus rapidement possible. Expliquer les "meilleures pratiques" revient à parler à un mur, à mon humble avis.
davidhaskins
@Ramhound, il n'y a pas de tests pour ce projet, et je ne veux pas être responsable de la destruction du système pour un code plus propre. Dans de nombreux cas, le code actuel implique que des exceptions soient avalées ou repose sur d'autres types de mauvais comportement qui ne sont pas évidents. C'est l'une des raisons pour lesquelles j'ajoute la journalisation, au fait.
Dan
6

Prenez des notes détaillées pour organiser vos questions, vos réflexions et votre compréhension du système. Cela a fonctionné à merveille pour moi lorsqu'il s'agit de systèmes hérités volumineux. Cela aide à cristalliser votre compréhension, à formuler les questions ouvertes en mots et, comme vos pensées sont déjà rassemblées, il est plus facile de communiquer spontanément avec d’autres personnes à propos de problèmes / questions / idées / etc.

Par exemple, pendant que je parcoure une partie du code, je prends des notes pour moi tout le temps. Ceci est ma conversation avec moi-même. Le simple fait d'écrire aide plus de pensées à sortir et m'aide à mieux comprendre les choses. Après un certain temps, j’aurai peut-être un Eureka et devrai dessiner un petit diagramme avec la "plus grande image" sur papier pour illustrer ce que je viens de penser ou les morceaux que je viens d’assembler. Je le fais toujours sur papier uniquement, en éliminant toutes les distractions de l'ordinateur. Cela me permet d’être plus méthodique et réfléchi à propos de ce que je fais.

Ceci est fondamentalement un moyen pratique d'avoir une conversation perpétuelle avec un expert du domaine :)

Doug T.
la source
3

Je sais que vous vous sentez peut-être improductif parce que vous envisagez le problème comme suit: «J'ajoute seulement de la journalisation», alors qu'en réalité, vous ajoutez la journalisation et effectuez beaucoup de refactorisation. Votre superviseur est probablement au courant de la situation du code. Tout le monde ne l'appréciera peut-être pas maintenant, mais lorsque vous recevrez une demande pour ajouter une fonctionnalité vraiment intéressante et stimulante, vous serez ravi d'avoir nettoyé le code.

JeffO
la source
J'ai bien peur de finir par réécrire le projet, nous en avons déjà parlé. Bien que cette option me plaise davantage, elle n’ajoute pas de productivité à l’utilisation de code non transférable. Je sais que la journalisation est requise dans la prochaine version et que je pourrai ensuite y aller avec mes affaires, mais ce n'est que le fait de devoir exécuter ce code dans ma tête me rend fou. Je me sens bête après avoir compris cela :-)
Dan
1
"Cela n'augmente pas la productivité en travaillant sur du code jetable ", ajoute Suuure . Vous pouvez parcourir de grandes parties du code en travaillant à votre compréhension, tout en effectuant une tâche à faible risque (journalisation). Cette connaissance que vous acquérez vous aidera énormément s’il s’agit de la réécrire. S'il n'y a pas de réécriture, essayez de vous attendre à la récompense que vous ressentirez lorsque vous aurez nettoyé de grandes quantités de l'application, à quel point la base de code sera meilleure grâce à vos efforts cohérents et persistants.
Quentin-Starin
2

Dans ces cas, j'ai tendance à réécrire une section de code. Pour faire en sorte qu'une région soit moins bonne, puis j'ajoute simplement la journalisation. Puis nettoyez un peu plus de code. Un code incorrect n’est mauvais que si vous le laissez là.

Erin
la source
System s'appuie fortement sur de mauvaises pratiques, aussi, pour réécrire correctement une méthode, je devrais réécrire l'ensemble du projet (ce que je ferai probablement éventuellement, mais j'ai quelques échéances pour la version actuelle).
Dan
Ya je comprends crois moi. Je viens de choisir une section que je peux nettoyer sans rendre ma vie trop douloureuse et la nettoyer, puis la région suivante. La correction du code est un processus pour lequel vous n’avez jamais le temps, mais vous devriez toujours en prendre.
Erin
2

Gamify votre travail. Par exemple, accordez-vous 5 points à chaque fois que vous posez une bonne question sur le code et 10 points à chaque fois que vous y répondez. Donnez-vous un badge chaque fois que vous refactorisez une méthode ou ajoutez une nouvelle fonctionnalité. Une fois que vous avez accumulé suffisamment de points, vous obtenez des privilèges tels que des pauses-café ou des biscuits. Une fois que vous avez terminé l'ensemble du projet, vous avez le privilège de vous offrir quelque chose que vous souhaitez vraiment.

Richie Cotton
la source
0

Le truc pour ne pas s'ennuyer ou être en colère afin de rester productif est d'accepter le fait que le code est mal conçu. Accepter votre position de devoir comprendre et mettre à jour le code vous permettra de ne pas continuer à commenter "à quel point c'est stupide", mais plutôt de l'accepter tranquillement et de passer à autre chose.

Une autre astuce consiste à avoir une bonne famille d'accueil à espérer à la fin de la journée. Petite amie, amis, tout ce qui peut marcher va vous permettre de passer la journée à bon escient et de faire en sorte que la trudging soit un mauvais code qui en vaut la peine.

Tim
la source
0

"Travailler efficacement avec Legacy Code" de Michael Feathers peut aider.

Si vous craignez de casser des choses lorsque vous les modifiez, écrivez d'abord quelques tests, assurez-vous qu'ils passent avant et après les modifications. L'écriture du test devrait vous aider à résumer et à comprendre ce qu'un code donné fait et vous permettra d'éditer en toute confiance.

Stephen Paulger
la source
Malheureusement, c'est un projet SharePoint, ce qui signifie qu'il est presque impossible à tester. Auparavant, j’ai écrit des méthodes de mise en bac à sable sympas pour SharePoint avec Microsoft Moles, mais cela demande beaucoup de travail supplémentaire.
Dan