J'ai remanié à lui seul 15 000 lignes héritées. Ce fut les deux pires semaines de ma vie



Il y a quelques mois, je travaillais dans une outstaff. Ce n'est pas un endroit où vous avez besoin d'enthousiasme et de foi dans le grand objectif du projet. Avec l'équipe, ils m'ont tout simplement vendu aux clients et lors des réunions, il était important de savoir combien de billets j'ai fermé. Les attaques de perfectionnisme sont plutôt une mauvaise chose pour un tel endroit, mais je n'ai rien pu en faire. J'ai payé beaucoup pour l'un d'eux, je suis tombé dans une crise infernale et j'ai passé les deux pires semaines de ma vie.

Mon entreprise m'a demandé de venir à Moscou pendant deux semaines, au bureau principal, pour travailler avec l'équipe. La demande est raisonnable, j'ai accepté. Quelques jours avant le départ, j'ai pris un autre billet. Il était nécessaire d'ajouter une fonctionnalité au SDK pour une dizaine de projets sur lesquels nous travaillons. Ce SDK est un héritage infranchissable que personne de bon sens ne touche. Il y a un tel marécage que même les ingénieurs qui travaillent dur sont surnaturellement baptisés - si seulement tout fonctionnait, comment cela fonctionne. Lorsque nous devons réparer quelque chose ou ajouter une fonctionnalité, nous sauvegardons soigneusement le code avec une autre béquille et, sans respirer, l'envoyons entre les mains de CI et de QA.

Je comptais faire de même. L'essence de la tâche était simple. Le SDK lui-même est un wrapper sur un système binaire très intelligent qui peut lever un VPN. Elle communique avec notre back-end, reçoit toutes sortes de configurations, autorise l'utilisateur, récupère une liste de pays pour VPN, etc.

J'avais juste besoin d'ajouter une autre requête au backend, qui reçoit une liste de serveurs. Cela semble extrêmement simple - a ajouté une méthode à l'API publique, place une demande pour l'URL souhaitée à l'intérieur, claque le modèle, analyse, donne-le. Il a ensuite appris aux applications clientes à utiliser cette demande, et vous avez terminé. J'ai fait la tâche en deux jours.

Une très grosse erreur. Il n'y a pas de tâches simples. D'un œil, je faisais déjà le tri dans les bars de Moscou, où je devais boire toute la bière, de l'autre j'ai vu le premier problème. Nous n'obtenons pas seulement une liste de serveurs, nous utilisons également l'un d'entre eux afin de créer un tunnel VPN. Auparavant, nous utilisions uniquement des pays pour cela. Mais un génie a décidé que ce serait une excellente idée de stocker les pays sous forme de liste de chaînes. Bien sûr, l'essence d'un nœud VPN est une chose trop vaste pour tenir sur une seule ligne.

En conséquence, un tas de méthodes sont apparues dans le SDK qui prennent une chaîne (code de pays) et y font quelque chose, et maintenant toutes ces méthodes devraient prendre un code de pays ou un objet serveur - et faire quelque chose là-bas. Tout ce que nous avons fait dans le code SDK et les applications avec les pays, nous devons maintenant faire à la fois avec les pays et avec les serveurs.

Quand j'ai compris cela, pour une raison quelconque, j'étais ravi. La portée de la tâche m'a maintenant permis de refaçonner légèrement le marais, plein de merde dans laquelle je nage tout le temps. J'ai déclaré mon désir, et maintenant je sais avec certitude - ils m'ont donné le feu vert avec une expression, comme s'ils avaient porté atteinte à une femme handicapée au prix de Maserati. J'ai convenu d'un budget hebdomadaire et je me suis mis au travail.



Il y avait quelques jours avant le départ. La semaine ressemblait à une infinité entière. J'ai décidé, jusqu'à ce que j'écrive le code, que je secoue la décision dans ma tête, et dès mon arrivée, je vais tout disperser rapidement.

Lorsqu'une personne normale part en voyage d'affaires, elle achète des billets à l'avance, résout le problème du logement, avertit sa femme et fait généralement tout correctement. Je suis un idiot à courte vue qui a piétiné à Moscou avec sa femme et ses deux enfants. J'ai dû emmener ma femme parce que je lui ai parlé du voyage trois heures avant le départ. En deux heures - je viens de commencer à chercher un chauffeur avec une mini-fourgonnette, car ma voiture est tombée en panne. J'ai loué un appartement au même moment. Six heures de voyage avec des enfants qui criaient et une femme insatisfaite se sont terminées comme ils auraient dû - l'appartement était exactement deux mille fois plus petit qu'il ne le paraissait sur les photos. La pire odeur était l'odeur de l'herbe. La femme de chambre qui nous a accueillis a déclaré qu'elle avait empoisonné les cafards (cafards !!!). Ma femme l'a cru et dire à ma femme que je distingue l'odeur de l'herbe du poison de cafard n'est pas dans mon intérêt.

Je suis venu au bureau, ils m'ont donné un ordinateur portable. Pendant une demi-journée, j'ai installé l'environnement, j'ai fait la connaissance de tout le monde. Lorsque tout a été téléchargé et installé, il a commencé à fonctionner. La colère de ce terrible mouvement ne s'est pas encore calmée. J'ai ouvert le projet avec le SDK, une fois de plus maudit contre moi-même, et j'ai pensé: Oui, ici tout l'enfer avec des chiens doit être jeté et refait. "

J'en ai parlé au leader, et lui, bien sûr, a répondu: "Je suis d'accord, mec." Un projet de 15 mille lignes, dont chacune est un crime contre l'humanité. J'étais sur le point de le réparer dans deux semaines. Et si j'avais dix heures de voyage et trois enfants, que suggérerais-je? Inventer en une semaine un nouveau PL spécifiquement pour le projet?

Mais il me semblait que si je mettais en ordre au moins quelque chose - cela deviendrait plus facile pour moi. Maintenant je crucifie ce govnokod, je ferai tout comme il se doit, nous vivrons. J'ai lu une fois des livres sur la façon de refactoriser en profondeur. Il y a eu beaucoup de réflexions intelligentes sur la façon dont vous peignez les étapes, écrivez des tests, réfléchissez à vos actions pour que vous ayez confiance à chaque étape - le projet fonctionne, rien n'est cassé. Livres et bonnes pratiques, c'est très cool, mais je n'apprends jamais des erreurs des autres. Au tout début de ma carrière, j'ai lu beaucoup de choses sur toutes sortes de choses de base, mais je n'y croyais pas avant d'avoir besoin d'étendre les fonctionnalités de mon premier projet.

La tâche de tout râteau est de vous donner un front. Jusqu'à ce que vos décisions infructueuses donnent une connerie sur vous personnellement, vous ne les considérerez pas comme infructueuses.

J'ai commencé à refactoriser sans compter sur la pratique. J'ai divisé mentalement le projet en grands morceaux logiques. Cela ne se reflétait pas dans sa structure de fichiers, j'ai donc pris cette structure de fichiers en enfer. J'ai créé un papa de haut niveau: ici nous travaillons avec le dos, ici nous travaillons avec VPN, ici les assistants, il y a des exceptions. Les tests unitaires existants, j'ai également rejeté. Ensuite, il m'a semblé que le govnokod n'avait pas droit à la vie, mais maintenant je comprends que j'ai sauté de l'avion et que je n'ai pas pris le parachute, car il a été mis en violation des instructions.

J'ai commencé à transférer le govnokod d'anciens papas à de nouveaux, en le mettant simultanément en ordre. Rien de spécial, il suffit de suivre les bonnes pratiques. Il existe une classe qui décrit le modèle utilisateur, elle a toutes les propriétés facultatives, toutes avec des setters. Le transformer en une hiérarchie d'héritage pour les enfants. Tout ridiculement, tout au long du constructeur. Pour que les utilisateurs de cette classe sachent toujours exactement ce qu'ils ont entre les mains. Il y a une méthode gouvernementale sur quatre cents lignes - vous appuyez sur des sous-méthodes. Vous voyez un fichier avec mille responsabilités - vous le transformez en mille fichiers avec un seul devoir. Il existe une classe qui a la méthode Initialize, qui doit toujours être appelée immédiatement après la création de la classe - vous appliquez le modèle «state»

Les concepts de bon et de mauvais code sont très vagues. Toute ma vie, j'apprendrai à les distinguer. Mais le code franchement merdique que je peux voir maintenant. Voir et corriger. J'ai essayé de ne pas pelleter l'architecture de haut niveau et de changer le moins possible l'API SDK externe.



S'attarder au travail pendant quelques heures, lorsque votre femme vous attend dans une ville étrange, dans la pire cabane du monde, et qu'elle a deux jeunes enfants qui rugissent de stress sans s'arrêter est une mauvaise décision. Je me suis attardé pendant sept heures. Le premier jour de travail, je me suis assis dans le bureau jusqu'à une heure du matin et j'ai copié deux pour cent de la force.

«À la maison» un scandale mérité m'attendait, le matin - un café instantané de merde. J'ai loué un appartement à cinq minutes du bureau, mais j'étais si étrange et effrayé dans cette ville terrible que les trois premiers jours, je suis allé travailler en taxi.

Tout le monde au bureau était très joyeux - les gens allaient boire le soir. Ces Moscovites font cela tous les jours. Ils m'ont appelé aussi. J'ai promis d'essayer, même si je le savais moi-même avec certitude - il n'y a pas d'options. Il se remit au travail.

Ensuite, il m'a semblé que j'étais moi-même à blâmer pour toute la merde du ménage, parce que j'avais pris les choses en main. Il valait mieux chercher un appartement, mieux se préparer, prévoir tous les problèmes de famille et de vie. Un tas de problèmes qui n'auraient pas pu être. En regardant le code, je pensais - c'est à cela que mènent les demi-mesures.

Il a rapidement décidé que mon approche d'hier était trop compromettante. Si vous le refaites, c'est tout. J'ai cessé de me limiter à renommer et fractionner. Chaque dossier que j'allais traiter a été soigneusement analysé. Je travaille sur ce projet depuis un certain temps, je comprends bien ce que l’entreprise veut ici et ce que notre code devrait faire.

Mais ici, j'ai commencé à rencontrer constamment du code que je ne comprends pas - quel problème il résout et pourquoi il a été écrit. Et j'ai pris une décision - si je ne comprends pas pourquoi le code est nécessaire, alors le code n'est pas nécessaire. J'ai joyeusement commencé à envoyer ces ordures numériques aux enfers.

Cette approche a donné lieu à de nouveaux problèmes. L'API publique du projet était incorrecte. Il existe de nombreuses méthodes avec une signature absurde (par exemple, une méthode prend une chaîne et un objet qui contient la même chaîne). De nombreuses méthodes avaient des noms idiots. Et en général, si vous utilisez ce SDK avec l'API qu'il possédait, vous pouvez interrompre l'application de dix mille façons.

À ce moment, je suis déjà allé assez loin. Le projet n'allait pas, et il n'y avait aucune chance qu'il se poursuive dans les prochains jours. Tout ce que j'y change, je ne peux le vérifier qu'à la fin du travail. Et puisque j'ai déjà tellement changé, pourquoi ne pas changer l'API publique alors? Eh bien, j'étais assez intelligent pour faire des copies des référentiels à partir du SDK et des applications, donc je pouvais dupliquer les changements d'API dans ces copies et trouver des erreurs. Après tout, je n'ai même pas pu compiler la version principale du SDK.

Les problèmes ont commencé tout de suite. Vous avez changé la signature d'une méthode? Catch plus deux cents erreurs de temps de compilation dans les applications. En raison des signatures erronées, les mauvais paramètres ont été transmis aux méthodes et les applications ont fonctionné. Dans le même temps, vous travaillez dans quatre fenêtres IDE. Après avoir changé les trois méthodes et corrigé toutes les erreurs avec elles, j'ai pensé - puisque le travail a déjà été fait, il serait stupide de ne changer qu'une partie de la stupide API - nous devons la refaire davantage. Et il est entré dans le processus encore plus profondément.



Je devais constamment prendre des décisions, principalement éthiques. Je sais donc comment quelque chose devrait fonctionner, et maintenant je vois le code qui devrait le faire. Je l'ai lu et je comprends qu'il ne le fait pas. Mais ce code est en prod, il a passé le contrôle qualité. Et qui est le fou? Comment puis-je prendre cette responsabilité? Au début, j'ai longuement réfléchi à chacun de ces cas, consulté un lead et une équipe. Mais cela a pris trop de temps.

J'ai réalisé que je travaillais lentement parce que j'avais peur de casser quelque chose, d'essayer de le comprendre quelque part, d'être prudent. Puis je me suis dit: "Je suis plus intelligent que celui qui a écrit cette merde, je sais ce qui doit être fait, j'ai une tâche et un budget de refactoring, et j'ai droit à tout." Les mauviettes comprennent et s'inquiètent, un homme sait ce qu'il veut et fait sans se poser trop de questions.

À un moment donné, je suis entré dans un état étrange de robot qui traite méthodiquement un fichier avec du code après l'autre. Sans rien vérifier, sans douter de rien. Je vois un mauvais code - changer. Cette chaîne soulève de nouveaux problèmes, les réparant. Dans chacun, je remplace le govnokod par quelque chose de tolérable.

Cela ressemble à un blitz d'échecs. Vous jouez à un jeu où la chose la plus importante est de réfléchir à toutes les options possibles, mais vous avez si peu de temps que vous ne pouvez même pas penser aux options qui en valent la peine pour y réfléchir. Je perds toujours le blitz. Pour le deuxième jour, j'ai fait beaucoup. Voici juste un code que vous ne pouvez pas vérifier - ce n'est pas un code. Et je le savais.



Un soir, je me suis souvenu que j'avais promis à ma femme d'aller à Ikea. L'appartement dans lequel nous vivions était horrible et ma femme voulait acheter des ordures confortables. J'ai écrit du code toute la journée, mon cerveau était épuisé, mais je devais y aller. Mettez le covoiturage, la voiture la plus proche était à vingt minutes. J'ai appelé un taxi pour me rendre à la voiture. Imaginez une impasse typique de Moscou coincée avec des voitures dans les yeux. Au terme de cela, Renault Kaptur m'attendait. Après avoir vaincu l'interface utilisateur en retard de la Delimobile, j'ai pu ouvrir ce seau. Il y avait une surprise qui m'attendait: la boîte de vitesses automatique. Je n'ai jamais conduit de machine, mais je pensais que je pouvais la gérer. Si vous voulez avancer, vous devez déplacer la poignée vers l'avant, si vers l'arrière - vers l'arrière. Non. J'ai réalisé que la voiture ne roulait pas exactement au moment où il était encore possible de sauver la situation.

Frein enfoncé. Naturellement, le mauvais pied, car dans une machine stupide seulement deux pédales, et mon cerveau a tout mal compris. Sauvage, la voiture s'est levée. Deux millimètres à la Mercedes Classe S.

D'une manière ou d'une autre, j'ai rampé hors de l'impasse et j'ai réalisé que toutes les voitures du monde étaient autour de moi, mais je ne savais pas où ni comment aller. J'ai conduit jusqu'à la «maison», pris ma femme, roulé vers minuit sur la ville la plus terrible du monde, manqué une douzaine de virages, laissé une fortune à ikea.

Nous sommes revenus à quatre heures du matin, mon cerveau s'est arrêté dès que mes yeux ont vu le lit.



À huit heures du matin, j'étais de nouveau au travail. Là, tout le monde est à nouveau heureux, discutant de ses affaires à Moscou et des bars que je ne peux pas atteindre. J'ai à nouveau le SDK. La tête lourde, j'ai parcouru les modifications que j'avais apportées. Tout va très mal. Demain, le rallye traînait et il me faut encore trois cents ans pour le terminer.

J'ai une bonne compétence - quand je reçois un gros ticket, je le décompose toujours en plusieurs petits. D'où mon flux de travail. Un ticket, un ou deux commits, une pull request. Par conséquent, en principe, je ne suis pas en mesure de diviser la tâche en plusieurs validations dans le processus de codage - je n'ai généralement pas besoin de cela. Mais le stress m'a achevé et la compétence a échoué. Dans le processus, j'ai transformé une petite tâche en une tâche géante, mais j'ai commencé à travailler dessus comme je travaillerais sur une petite. Sans système, bêtement où j'ai vu le problème, je l'ai résolu là-bas. Il n'a pas divisé le processus en étapes logiques, mais simplement au moment où le mois de juin dernier s'est emparé immédiatement.

Vous ne pouvez pas revenir en arrière. Le problème principal restait - je ne pouvais pas construire et exécuter toute la solution, et je n'avais aucune idée de comment cela fonctionnerait. C'était très effrayant, le dernier jour, j'ai regardé les diffs et j'ai réalisé que j'avais réécrit presque tout le projet. C'était vraiment effrayant.



Tout glisse toujours le dernier jour. Le voyage d'affaires a pris fin, mon temps de refactorisation prolongé aussi. Ma femme a appelé et a dit que nous étions expulsés à une heure de l’après-midi, même si j’étais d’accord en fin de soirée. Naturellement, cela signifiait que je ne pouvais pas terminer le dernier jour jusqu'à la fin.

Avec trois gallons de sueur froide, ce qui m'est venu lorsque j'ai entrepris cette tâche, planifié une refonte, accepté un voyage d'affaires, emmené des enfants, enlevé une cachette pendant deux semaines - je suis l'idiot le plus important du monde entier. Ça vaut la peine que les psychiatres règlent mes motivations, mais j'ai décidé d'aller jusqu'au bout. Soit pour me punir, soit pour une croyance irrationnelle que je fais tout bien.

Avec un cul brûlant, je gèle tout en une heure, lance CI et jette à la maison. Tout au long de mon parcours, je fais défiler mon code et je suis absolument sûr que rien ne fonctionnera. Trop de changements, il y aura une centaine de bugs, et nous refuserons cette refactorisation.

Quand je suis rentré chez moi, la nouvelle m'attendait - le projet fonctionne. Lead a corrigé quelques petites choses, mes modifications ont réussi les autotests et en ce moment, elles réussissent les tests manuels. Je n'y croyais pas. J'ai gâté le code d'une brouette domestique, j'ai collecté et vérifié manuellement tous les scripts auxquels je ne faisais pas confiance. Ça a marché. Ça a marché !!!

J'étais tellement fier de moi. La qualité de la base de code a augmenté de nombreuses fois, plusieurs fonctionnalités sont apparues, j'ai éliminé un tas de bugs auxquels les testeurs n'ont pas encore réussi. Liba pouvait être utilisé confortablement, et je me suis avéré être professionnellement en forme.



Rafales d'enthousiasme et de travail sacrificiel - le lot de fous naïfs. Je serais heureux de prouver le contraire de moi-même avec cette histoire. Mais quelques jours après mon retour, d'autres nouvelles m'attendaient.

Le client a décidé d'abandonner le projet. Près d'une centaine de personnes dans l'effectif (la moitié de l'ensemble de l'entreprise) se sont avérées "attendre un nouveau projet". Considérez - sans emploi limbiquement. Et les éloignés dans ces domaines sont coupés en premier lieu. On m'a dit de m'installer définitivement à Moscou et de passer à un autre projet. Ou nous vous congédierons.

J'ai demandé ce qui arriverait à l'ancien projet.

À de tels moments, les gens deviennent douloureusement honnêtes. La flatterie, les embellissements et l'éthique d'entreprise ne sont plus nécessaires. On m'a dit que ce code n'est plus nécessaire à personne dans le monde entier, envoyé aux poubelles de l'histoire. Les produits eux-mêmes seront utilisés pendant très longtemps, mais personne ne prendra en charge la base de code. Tout cela est la qualité et la lisibilité du code, l'évolutivité, la facilité d'utilisation, un comportement sans ambiguïté - tout a été fait en vain.

J'écoute et je comprends que je pourrais simplement faire un long métrage et parcourir les bars. Mais je me suis assis la nuit, je n'ai pas dormi, j'ai enduré des scandales pour une bonne base de code dont personne d'autre n'avait besoin. L'enthousiasme est un mensonge. Vous dites que vous êtes prêt à travailler, même s'il n'y a aucun gain à cela. Mais quand ils vous disent que votre gratuité maximale n'apporte vraiment aucun avantage - pour une raison quelconque, elle tue. Vous espériez changer avec votre impulsion tout mal universel.

Je pense que j'ai tout compris parfaitement depuis le tout début. Je ne voulais tout simplement pas être un gars pragmatique.

Par conséquent, j'ai dit qu'ils pouvaient me virer en enfer et laisser leurs mères être transportées dans la merde de Moscou pour que leurs gros culs déchirent le non-caoutchouc en un milliard de petits morceaux. Il a poliment écrit à ce sujet et est resté à la maison. Il y a suffisamment de tasas dans le monde qui doivent juste être faits.

Source: https://habr.com/ru/post/fr471628/


All Articles