
Vor ein paar Monaten habe ich in einem Personal gearbeitet. Dies ist kein Ort, an dem Sie Begeisterung und Vertrauen in das große Ziel des Projekts brauchen. Zusammen mit dem Team haben sie mich einfach an Kunden verkauft, und bei Besprechungen war es wichtig, wie viele Tickets ich geschlossen habe. Perfektionismus-Angriffe sind für einen solchen Ort eher eine schlechte Sache, aber ich konnte nichts damit anfangen. Ich habe viel für einen von ihnen bezahlt, bin in eine höllische Krise geraten und habe die schlimmsten zwei Wochen in meinem Leben verbracht.
Meine Firma bat mich, für zwei Wochen nach Moskau zu kommen, ins Hauptbüro, um mit dem Team zu arbeiten. Die Anfrage ist vernünftig, stimmte ich zu. Einige Tage vor Abflug nahm ich ein weiteres Ticket. Für ein Dutzend Projekte, an denen wir arbeiten, musste dem SDK eine Funktion hinzugefügt werden. Dieses SDK ist ein unpassierbares Erbe, das niemand, der bei klarem Verstand ist, berührt. Es gibt einen solchen Sumpf, dass selbst hart verbrannte Ingenieure abergläubisch getauft werden - wenn nur alles funktioniert, wie es funktioniert. Wenn wir etwas reparieren oder eine Funktion hinzufügen müssen, sichern wir den Code sorgfältig mit einer anderen Krücke und senden ihn ohne zu atmen in die Hände von CI und QA.
Ich hatte vor, dasselbe zu tun. Das Wesentliche der Aufgabe war einfach. Das SDK selbst ist ein Wrapper über ein sehr cleveres Binärsystem, das ein VPN aufheben kann. Sie kommuniziert mit unserem Back-End, empfängt alle Arten von Konfigurationen, autorisiert den Benutzer, ruft eine Liste der Länder für VPN ab und so weiter.
Ich musste nur eine weitere Anfrage zum Backend hinzufügen, das eine Liste der Server empfängt. Es sieht sehr einfach aus - der öffentlichen API wurde eine Methode hinzugefügt, eine Anfrage für die gewünschte URL gestellt, das Modell geschlagen, analysiert, verschenkt. Dann brachte er Client-Anwendungen bei, diese Anfrage zu verwenden, und Sie sind fertig. Ich habe die Aufgabe in zwei Tagen erledigt.
Ein sehr großer Fehler. Es gibt keine einfachen Aufgaben. Mit einem Auge sortierte ich bereits durch Moskauer Bars, wo ich das ganze Bier trinken musste, mit dem anderen sah ich das erste Problem. Wir erhalten nicht nur eine Liste von Servern, sondern verwenden auch einen davon, um einen VPN-Tunnel aufzubauen. Bisher haben wir dafür nur Länder verwendet. Aber ein Genie entschied, dass es eine großartige Idee wäre, Länder als Liste von Zeichenfolgen zu speichern. Natürlich ist die Essenz eines VPN-Knotens zu groß, um in eine Leitung zu passen.
Infolgedessen wurden im SDK eine Reihe von Methoden angezeigt, die eine Zeichenfolge (Ländercode) verwenden und dort etwas tun. Jetzt sollten alle diese Methoden einen Ländercode oder ein Serverobjekt verwenden - und dort etwas tun. Alles, was wir im SDK-Code und in Anwendungen mit Ländern getan haben, müssen wir jetzt sowohl mit Ländern als auch mit Servern tun.
Als ich das verstand, war ich aus irgendeinem Grund begeistert. Der Aufgabenbereich ermöglichte es mir nun, den Sumpf, der voller Scheiße ist und in dem ich die ganze Zeit schwimme, leicht umzugestalten. Ich erklärte meinen Wunsch, und jetzt weiß ich es mit Sicherheit - sie gaben mir die Erlaubnis mit einem Ausdruck, als hätten sie eine behinderte Frau zum Preis von Maserati beeinträchtigt. Ich einigte mich auf ein Wochenbudget und machte mich an die Arbeit.
Es gab ein paar Tage vor der Abreise. Die Woche sah aus wie eine ganze Unendlichkeit. Ich habe beschlossen, bis ich den Code schreibe, die Entscheidung in meinem Kopf zu schütteln, und sobald ich ankomme, werde ich schnell alles zerstreuen.
Wenn ein normaler Mensch auf Geschäftsreise geht, kauft er Tickets im Voraus, löst das Wohnungsproblem, warnt seine Frau und macht im Allgemeinen alles richtig. Ich bin ein kurzsichtiger Idiot, der mit seiner Frau und zwei Kindern nach Moskau getrampelt ist. Ich musste meine Frau mitnehmen, weil ich ihr drei Stunden vor Abflug von der Reise erzählte. In zwei Stunden habe ich gerade angefangen, einen Fahrer mit einem Minivan zu suchen, weil mein Auto eine Panne hatte. Ich habe im selben Moment eine Wohnung gemietet. Sechs Stunden Reise mit schreienden Kindern und einer unzufriedenen Frau endeten so, wie sie es hätten tun sollen - die Wohnung war genau zweitausendmal kleiner als auf den Bildern. Der schlimmste Geruch war der Geruch von Gras. Die Magd, die uns beherbergte, sagte, dass sie die Kakerlaken vergiftet haben (Kakerlaken !!!). Meine Frau glaubte ihr und es liegt nicht in meinem Interesse, meiner Frau zu sagen, dass ich den Geruch von Gras von Kakerlakengift unterscheide.
Ich kam ins Büro, sie gaben mir einen Laptop. Einen halben Tag lang habe ich die Umgebung installiert und alle kennengelernt. Als alles heruntergeladen und installiert war, begann es zu funktionieren. Der Ärger über die schreckliche Bewegung hat sich noch nicht abgekühlt. Ich eröffnete das Projekt mit dem SDK, verfluchte mich erneut und dachte: „Was zur Hölle? Ja, hier muss alles zur Hölle mit Hunden rausgeworfen und erneuert werden. “
Ich erzählte dem Anführer davon und er antwortete natürlich: "Ich stimme zu, Mann." Ein Projekt von 15.000 Zeilen, von denen jede ein Verbrechen gegen die Menschlichkeit ist. Ich wollte es in zwei Wochen reparieren. Und wenn ich zehn Stunden unterwegs wäre und drei Kinder, was würde ich als Hinweis vorschlagen? In einer Woche einen neuen PL speziell für das Projekt erfinden?
Aber es schien mir, wenn ich zumindest etwas in Ordnung bringen würde - es würde für mich einfacher werden. Jetzt kreuzige ich diesen Govnokod, ich werde alles tun, wie es sollte, wir werden leben. Ich habe einmal Bücher darüber gelesen, wie man tiefes Refactoring macht. Es gab viele kluge Gedanken darüber, wie Sie Schritte malen, Tests schreiben, Ihre Handlungen durchdenken, damit Sie bei jedem Schritt Vertrauen haben - das Projekt funktioniert, nichts ist kaputt. Bücher und Best Practices, es ist sehr cool, aber ich lerne nie aus den Fehlern anderer. Zu Beginn meiner Karriere las ich viel über alle möglichen grundlegenden Dinge, glaubte aber nicht daran, bis ich die Funktionalität meines ersten Projekts erweitern musste.
Die Aufgabe eines jeden Rechen ist es, Ihnen eine Stirn zu geben. Bis Ihre erfolglosen Entscheidungen Sie persönlich bescheißen, werden Sie sie nicht als erfolglos betrachten.
Ich begann mein Refactoring, ohne mich auf die Praxis zu verlassen. Ich habe das Projekt mental in große logische Teile geteilt. Dies spiegelte sich nicht in seiner Dateistruktur wider, also brachte ich diese Dateistruktur zur Hölle. Ich habe einen Daddy der obersten Ebene geschaffen: Hier arbeiten wir mit dem Rücken, hier arbeiten wir mit VPN, hier helfen Helfer, es gibt Ausnahmen. Bestehende Unit-Tests habe ich ebenfalls abgelehnt. Dann schien es mir, dass der Govnokod kein Recht auf Leben hatte, und jetzt verstehe ich, dass ich aus dem Flugzeug gesprungen bin und den Fallschirm nicht genommen habe, weil er gegen die Anweisungen verstoßen hat.
Ich fing an, den Govnokod von alten auf neue Väter zu übertragen und ihn gleichzeitig in Ordnung zu bringen. Nichts Besonderes, befolgen Sie einfach gute Praktiken. Es gibt eine Klasse, die das Benutzermodell beschreibt. Alle Eigenschaften sind optional, alle mit Setzern. Verwandeln Sie es in die Vererbungshierarchie eines Kindes. Alles lächerlich, alles durch den Konstruktor. Damit Benutzer dieser Klasse immer genau wissen, was sie in ihren Händen haben. Es gibt eine Regierungsmethode in vierhundert Zeilen - Sie treffen auf Untermethoden. Sie sehen eine Datei mit tausend Verantwortlichkeiten - Sie verwandeln sie in tausend Dateien mit einer Aufgabe. Es gibt eine Klasse mit der Initialize-Methode, die immer unmittelbar nach dem Erstellen der Klasse aufgerufen werden muss. Sie wenden das Statusmuster an
Die Konzepte von gutem und schlechtem Code sind sehr vage. Mein ganzes Leben lang werde ich lernen, zwischen ihnen zu unterscheiden. Aber ehrlich gesagt beschissener Code, den ich jetzt sehen kann. Sehen und korrigieren. Ich habe versucht, die Architektur der obersten Ebene nicht sehr zu schaufeln und die externe SDK-API so wenig wie möglich zu ändern.
Ein paar Stunden bei der Arbeit zu bleiben, wenn Ihre Frau in einer fremden Stadt, in der schlimmsten Hütte der Welt, auf Sie wartet und zwei kleine Kinder hat, die vor Stress brüllen, ohne anzuhalten, ist eine schlechte Entscheidung. Ich verweilte sieben Stunden. Am ersten Arbeitstag saß ich bis ein Uhr morgens im Büro und kopierte zwei Prozent der Kraft.
"Zu Hause" erwartete mich am Morgen ein verdienter Skandal - beschissener Instantkaffee. Ich mietete eine Wohnung fünf Minuten vom Büro entfernt, aber ich war in dieser schrecklichen Stadt so seltsam und verängstigt, dass ich die ersten drei Tage mit dem Taxi zur Arbeit fuhr.
Alle im Büro waren sehr fröhlich - die Leute wollten abends trinken. Diese Moskauer tun dies jeden Tag. Sie haben mich auch angerufen. Ich habe versprochen, es zu versuchen, obwohl ich selbst sicher wusste - es gibt keine Optionen. Er machte sich wieder an die Arbeit.
Dann schien es mir, dass ich selbst für die ganze Haushaltsscheiße verantwortlich war, weil ich die Dinge selbst in die Hand nahm. Es war besser, eine Wohnung zu suchen, sich besser vorzubereiten, alle Probleme mit Familie und Leben vorauszusehen. Eine Reihe von Problemen, die nicht hätten sein können. Als ich mir den Code ansah, dachte ich - dazu führen halbe Sachen.
Er entschied schnell, dass mein Ansatz gestern zu kompromisslos war. Wenn Sie es wiederholen, dann ist das alles. Ich habe aufgehört, mich auf das Umbenennen und Teilen zu beschränken. Jede Datei, die ich verarbeiten wollte, wurde sorgfältig analysiert. Ich bin schon seit einiger Zeit an diesem Projekt beteiligt. Ich verstehe gut, was das Unternehmen hier will und was unser Code tun sollte.
Aber hier fing ich an, ständig Code zu treffen, den ich nicht verstehe - welches Problem es löst und warum es überhaupt geschrieben wurde. Und ich habe eine Entscheidung getroffen - wenn ich nicht verstehe, warum der Code benötigt wird, wird der Code nicht benötigt. Ich begann glücklich, diesen digitalen Müll in die Unterwelt zu schicken.
Dieser Ansatz hat zu neuen Problemen geführt. Die öffentliche API des Projekts war falsch. Es gab viele Methoden mit einer absurden Signatur (zum Beispiel nimmt eine Methode eine Zeichenfolge und ein Objekt, das dieselbe Zeichenfolge enthält). Viele Methoden hatten idiotische Namen. Wenn Sie dieses SDK mit der vorhandenen API verwenden, können Sie die Anwendung im Allgemeinen auf zehntausend Arten unterbrechen.
Zu diesem Zeitpunkt bin ich schon weit genug gegangen. Das Projekt würde nicht laufen, und es gab keine Chance, dass es in den nächsten Tagen laufen würde. Alles, was ich daran ändere, kann ich erst am Ende der Arbeit überprüfen. Und da ich schon so viel geändert habe, warum dann nicht die öffentliche API ändern? Nun, ich war klug genug, um Kopien von Repositorys aus dem SDK und den Anwendungen zu erstellen, damit ich API-Änderungen in diesen Kopien duplizieren und Fehler finden konnte. Immerhin konnte ich nicht einmal die Hauptversion des SDK kompilieren.
Die Probleme begannen sofort. Die Signatur einer Methode geändert? Catch plus zweihundert Fehler bei der Kompilierungszeit in Anwendungen. Aufgrund der falschen Signaturen wurden die falschen Parameter an die Methoden übergeben, und die Anwendungen funktionierten. Gleichzeitig arbeiten Sie in vier IDE-Fenstern. Nachdem ich die drei Methoden geändert und alle Fehler damit behoben hatte, dachte ich - da die Arbeit bereits erledigt ist, ist es dumm, nur einen Teil der dummen API zu ändern - müssen wir sie weiter wiederholen. Und er ging noch tiefer in den Prozess ein.
Ich musste ständig Entscheidungen treffen, meistens ethisch. Ich weiß also, wie etwas funktionieren soll, und jetzt sehe ich den Code, der es tun soll. Ich lese es und verstehe, dass er es nicht tut. Aber dieser Code ist in Prod, er hat die Qualitätssicherung bestanden. Und wer ist der Dummkopf? Wie kann ich diese Verantwortung übernehmen? Zuerst habe ich lange über jeden solchen Fall nachgedacht und mich mit einem Leiter und einem Team beraten. Aber es hat zu lange gedauert.
Mir wurde klar, dass ich langsam arbeitete, weil ich Angst hatte, etwas zu zerbrechen und es irgendwo herauszufinden, um vorsichtig zu sein. Dann sagte ich mir: "Ich bin schlauer als derjenige, der diese Scheiße geschrieben hat, ich weiß, was zu tun ist, ich habe eine Aufgabe und ein Budget für das Refactoring und ich habe das Recht auf alles." Weicheier verstehen und sorgen sich, ein Mann weiß, was er will, und tut es, ohne zu viele Fragen zu stellen.
Irgendwann trat ich in einen seltsamen Zustand eines Roboters ein, der eine Datei mit Code nach der anderen methodisch verarbeitet. Ohne etwas zu überprüfen, ohne etwas zu bezweifeln. Ich sehe einen schlechten Code - Änderung. Diese Kette wirft neue Problembereiche auf und repariert sie. In jedem ersetze ich den Govnokod durch etwas Erträgliches.
Es sieht aus wie ein Blitz im Schach. Sie spielen ein Spiel, bei dem es am wichtigsten ist, über alle möglichen Optionen nachzudenken, aber Sie haben so wenig Zeit, dass Sie nicht einmal darüber nachdenken können, welche Optionen es wert sind, darüber nachzudenken. Ich verliere immer den Blitz. Für den zweiten Tag habe ich viel getan. Hier ist nur ein Code, den Sie nicht überprüfen können - es ist kein Code. Und ich wusste davon.
Eines Abends erinnerte ich mich, dass ich meiner Frau versprochen hatte, nach Ikea zu gehen. Die Wohnung, in der wir lebten, war schrecklich, und meine Frau wollte gemütlichen Müll kaufen. Ich habe den ganzen Tag Code geschrieben, mein Gehirn war erschöpft, aber ich musste gehen. Mit dem Carsharing war das nächste Auto zwanzig Minuten entfernt. Ich rief ein Taxi, um zum Auto zu gelangen. Stellen Sie sich eine typische Sackgasse in Moskau vor, die mit Autos an den Augäpfeln verstopft ist. Am Ende wartete Renault Kaptur auf mich. Nachdem ich die nacheilende Benutzeroberfläche des Delimobils besiegt hatte, konnte ich diesen Eimer öffnen. Auf mich wartete eine Überraschung - ein Automatikgetriebe. Ich bin nie eine Maschine gefahren, aber ich dachte, ich könnte damit umgehen. Wenn Sie vorwärts gehen möchten, müssen Sie den Griff vorwärts bewegen, wenn rückwärts - rückwärts. Nein. Mir wurde klar, dass das Auto nicht genau in dem Moment fuhr, als es noch möglich war, die Situation zu retten.
Bremse gedrückt. Natürlich der falsche Fuß, denn in einer blöden Maschine nur zwei Pedale, und mein Gehirn hat alles falsch verstanden. Wilder Trottel, das Auto stand auf. Zwei Millimeter zur Mercedes S-Klasse.
Irgendwie kroch ich aus der Sackgasse und erkannte, dass alle Autos der Welt um mich herum waren, aber ich hatte keine Ahnung, wohin oder wie ich gehen sollte. Ich fuhr zum "Haus", nahm meine Frau mit, fuhr um Mitternacht durch die schrecklichste Stadt der Welt, verpasste ein Dutzend Kurven und hinterließ ein Vermögen in Ikea.
Wir kehrten um vier Uhr morgens zurück, mein Gehirn schaltete sich aus, sobald meine Augen das Bett sahen.
Um acht Uhr morgens war ich wieder bei der Arbeit. Dort sind alle wieder glücklich und besprechen ihre Moskauer Angelegenheiten und Bars, die ich nicht erreichen kann. Ich habe das SDK wieder. Mit schwerem Kopf überflog ich die Änderungen, die ich vorgenommen hatte. Alles ist sehr schlecht. Morgen zog sich die Rallye hin und ich brauche noch dreihundert Jahre, um sie zu beenden.
Ich habe eine gute Fähigkeit - wenn ich ein großes Ticket bekomme, zerlege ich es immer in mehrere kleine. Daher mein Arbeitsablauf. Ein Ticket, ein oder zwei Commits, eine Pull-Anfrage. Daher kann ich die Aufgabe im Codierungsprozess im Prinzip nicht in mehrere Commits aufteilen - das brauche ich normalerweise nicht. Aber Stress hat mich fertig gemacht und die Fähigkeit ist gescheitert. Dabei verwandelte ich eine kleine Aufgabe in eine riesige, aber ich fing an, daran so zu arbeiten, wie ich an einer kleinen arbeiten würde. Ohne ein System, dumm, wo ich das Problem gesehen habe, habe ich es dort behoben. Er teilte den Prozess nicht in logische Schritte ein, sondern einfach, als der letzte Juni sofort loslegte.
Sie können es nicht zurückdrehen. Das Hauptproblem blieb bestehen - ich konnte nicht die gesamte Lösung erstellen und ausführen und hatte keine Ahnung, wie es funktionieren würde. Es war sehr beängstigend, am letzten Tag habe ich mir die Unterschiede angesehen und festgestellt, dass ich fast das gesamte Projekt neu geschrieben habe. Es war verdammt beängstigend.
Alles rutscht immer am letzten Tag. Die Geschäftsreise endete, auch meine längere Zeit für das Refactoring. Meine Frau rief an und sagte, dass wir um ein Uhr nachmittags vertrieben würden, obwohl ich einem späten Abend zugestimmt hatte. Das bedeutete natürlich, dass ich den letzten Tag nicht bis zum Ende beenden konnte.
Zusammen mit drei Gallonen kaltem Schweiß kam mir das, was mir einfiel, als ich diese Aufgabe übernahm, das Refactoring plante, einer Geschäftsreise zustimmte, Kinder mitnahm, zwei Wochen lang ein Versteck abnahm - ich bin der wichtigste Idiot auf der ganzen Welt. Es lohnt sich für die Psychiater, meine Motive zu klären, aber ich habe mich entschlossen, den ganzen Weg zu gehen. Entweder um mich selbst zu bestrafen oder um irrational zu glauben, dass ich alles richtig mache.
Mit einem brennenden Arsch friere ich alles in einer Stunde ein, starte CI und kippe nach Hause. Ich scrolle den ganzen Weg durch meinen Code in meinem Kopf und bin mir absolut sicher, dass nichts funktionieren wird. Zu viele Änderungen, es wird hundert Fehler geben, und wir werden dieses Refactoring ablehnen.
Als ich nach Hause zurückkehrte, warteten die Nachrichten auf mich - das Projekt funktioniert. Blei hat ein paar Kleinigkeiten korrigiert, meine Änderungen haben Autotests bestanden und im Moment werden sie erfolgreich manuell getestet. Ich habe es nicht geglaubt. Ich habe den Code für eine Schubkarre zu Hause verdorben, alle Skripte, denen ich nicht vertraute, gesammelt und manuell überprüft. Es hat funktioniert. Es hat funktioniert !!!
Ich war so stolz auf mich. Die Qualität der Codebasis ist um ein Vielfaches gewachsen, es sind mehrere Funktionen aufgetreten. Ich habe eine Reihe von Fehlern herausgeschnitten, die Tester noch nicht erreicht haben. Liba konnte bequem benutzt werden, und ich habe mich als professionell fit erwiesen.
Böen der Begeisterung und der aufopfernden Arbeit - die Menge der naiven Narren. Ich würde mich freuen, mit dieser Geschichte das Gegenteil zu beweisen. Aber ein paar Tage nach meiner Rückkehr warteten weitere Neuigkeiten auf mich.
Der Kunde hat beschlossen, das Projekt abzubrechen. Fast hundert Mitarbeiter (die Hälfte des gesamten Unternehmens) warteten auf ein neues Projekt. Betrachten Sie - limbisch arbeitslos. Und die Remoter in solchen Angelegenheiten werden an erster Stelle geschnitten. Mir wurde gesagt, ich solle dauerhaft nach Moskau ziehen und zu einem anderen Projekt wechseln. Oder wir feuern dich.
Ich fragte, was mit dem alten Projekt passieren würde.
In solchen Momenten werden die Menschen schmerzlich ehrlich. Schmeichelei, Verzierungen und Unternehmensethik sind nicht mehr erforderlich. Mir wurde gesagt, dass dieser Code von niemandem auf der ganzen Welt mehr benötigt wird, der in den Mülleimer der Geschichte geschickt wird. Die Produkte selbst werden sehr lange verwendet, aber niemand wird die Codebasis unterstützen. All dies ist die Qualität und Lesbarkeit des Codes, Skalierbarkeit, Benutzerfreundlichkeit, eindeutiges Verhalten - alles wurde vergebens gemacht.
Ich höre zu und verstehe, dass ich einfach ein Feature machen und durch die Bars gehen kann. Aber ich saß nachts, schlief nicht, ertrug Skandale um einer guten Codebasis willen, die sonst niemand brauchte. Begeisterung ist eine Lüge. Sie sagen, dass Sie bereit sind zu arbeiten, auch wenn dies keinen Gewinn bringt. Aber wenn sie dir sagen, dass deine höchste Unentgeltlichkeit wirklich keine Vorteile bringt - aus irgendeinem Grund tötet sie. Sie hofften, mit Ihrem Impuls alle universelle Ungerechtigkeit zu ändern.
Ich glaube, ich habe von Anfang an alles perfekt verstanden. Ich wollte einfach kein pragmatischer Typ sein.
Deshalb sagte ich, dass sie mich zur Hölle feuern und ihre Mütter nach Moskau transportieren lassen könnten, damit ihre fetten Ärsche Nicht-Gummi in eine Milliarde kleine Stücke zerreißen würden. Er schrieb höflich darüber und blieb zu Hause. Es gibt genug Tasas auf der Welt, die nur gemacht werden müssen.