Технический директор и разработчик вместе изучают legacy-код в попытках исправить баг. Мучениям нет конца, и они уже готовы сдаться. «Да кто вообще понаписал эту хрень?» — спрашивает технический директор. В раздрае чувств он смотрит в git blame. Оказывается, это он и понаписал.

Встречайте нашего главного героя – Джейка. Он разработчик, недавно принятый в компанию, на проект, которому идет седьмой год. В процессе онбординга Джейку поручили устранить баг, и для этого ему пришлось закопаться в глубины legacy-кода. Вооружившись всеми своими знаниями и пониманием контекста, он сделал шаг в бездну. Всё должно было быть просто. В конце концов, это задача для новичка. Что такого может случиться? (где-то здесь прозвучал циничный смех)

После первых двух часов Джейк растерял весь энтузиазм, с которым приступал к делу. Он увяз в досаде, пытаясь разобраться во всех перепутанных иерархиях, которые оказались головоломнее, чем генеалогическое древо королевской семьи. Длинные методы, которые отвечают за всё понемногу. Коварные неявные параметры, таящиеся в темных углах. Он яростно сражался с порождениями мысли неизвестного гения, но всё напрасно. Сомнения и тревоги оросили его точно роса (или это просто в пот бросило?). Тот, кто это написал – незаурядный ум или просто сволочь какая-то? Legacy-код Джейку совсем не понравился. Его стиль программирования не вписывался в кодовую базу. Пока он пытался разобраться, что в ней происходит, прозвенели все известные звоночки. Просто ужас какой-то. Нужно немедленно всё переписать.

Большинство из нас оказывалось на месте Джейка – ощущало непреодолимое желание переписать то, что никак не укладывалось в наш личный устав разработчика. Вы смотрите и видите одни сплошные преступления против чистоты кода. Это подзуживает швырнуть еще один камень в разбитое окно, просто со зла. Что вообще можно исправить в этом ужасном стиле программирования?

Что ж, такие чувства нормальны. И всё же, вы определенно не знаете контекста, в котором человек принимал эти решения. Постарайтесь понять его мотивы, прежде чем судить и ударяться в гордыню. Возможно, из-за сжатых сроков приходилось срезать углы. Если речь о стартапе, то техническим долгом команда займется, когда пройдет самая горячая пора. Не исключено, что для продолжения проекта нужны инвестиции, дело обычное. Бывает и другая причина: всё начиналось просто, но из-за требований пришлось сменить курс в сторону большей сложности – все другие варианты на тот момент были еще хуже, а этот представлялся оптимальным по скорости и затратам. Возможно, новомодные технологии не использовались, потому что тогда еще работали нестабильно, а альтернатив не было. Какие еще могут быть объяснения? Чье-то самомнение? Как ни печально, это распространенная причина. А может, человек просто не знал, как сделать лучше. Это тоже еще не преступление. Как говорил мой коллега:

«Все мы пишем код наилучшим образом, возможным на текущий момент в текущих обстоятельствах».

Можно возмущаться сколько угодно, однако переписывать всё с нуля – слишком затратная и рискованная затея. На одном из проектов, в котором я был задействован, разработчики решили, что кодовая база – помойка, с которой нельзя мириться. Мы шумели, негодовали и отказывались брать на себя ответственность, пока нам не дадут всё полностью переписать. В любом баге оказывались виноваты кодовая база и жесткие сроки, но никак не мы. Мы наделали достаточно шума и получили разрешение всё переписать. Да, я, кажется, забыл упомянуть, что это был стартап, который отчаянно нуждался в инвестициях. Разумеется, на полпути денежный поток иссяк, и у нас кончилось финансирование. Но зато теперь мы делали всё по правилам и ко дну пошли тоже по правилам.

Конечно, с убогой кодовой базой работать утомительно и тяжело. Молодые разработчики редко обладают навыком сопротивления искушению переписать всё чужое. Вместо того, чтобы разобраться в проблеме и понять клиента, они хотят показать, на что способны, и забывают про назначение проекта.

Что бы мы ни делали, в кодовой базе всегда найдется какая-нибудь муть. Что можно сделать, чтобы это исправить? Для начала – не жаловаться. Никто не любить выслушивать жалобы, а уж тем более обвинения в том, что они что-то там не то натворили. Вам бы тоже не понравилось. Для начала попробуйте придерживать правила бойскаутов и каждый раз оставлять свою рабочую площадку немного чище, чем она была в начале. Вставляйте разбитые окна, когда выдастся свободная минута, и других учите тому же. Добавляйте тесты, прежде чем исправлять баги, и через некоторое время станете чувствовать себя увереннее, внося изменения или проводя рефакторинг. Покажите другим своим примером, что понемногу, совместными усилиями вы можете сделать кодовую базу лучше. За один день этого не добиться, но спустя время вы ее не узнаете.

Если всё правда очень плохо, укажите на конкретные недостатки и объясните, почему считаете их недостатками. Как их исправление повлияет на бизнес? Составьте краткосрочные и долгосрочные планы усовершенствований, которые приносили бы какую-то ценность. И не забывайте: следующий раз, когда придется в спешке тушить пожары, может наступить в любой момент. Не бойтесь срезать углы, здесь главное ясно дать понять, что нужно будет вернуться к этому фрагменту и внести правки. В конце концов, люди толстеют не от того, что едят много торта на праздниках, а от того, что немного его переедают каждый день.

Комментарии (11)


  1. iig
    15.08.2022 12:12
    +1

    «Да кто вообще понаписал эту хрень?» — спрашивает технический директор. В
    раздрае чувств он смотрит в git blame. Оказывается, это он и понаписал.

    В голосину ;) А может оказаться, что это написал сотрудник, которого никто из нынешних сотрудников в галаза не видел (за 10 лет коллектив может пару раз обновиться полностью). Но если в message принято упоминать номер задачи в issue tracker'е, то не все так плохо.


    1. Nialpe
      15.08.2022 12:26
      +1

      А бывает еще на свой код наткнешься и так стыдно и больно...


      1. iig
        15.08.2022 12:39
        +1

        А бывает еще на свой код наткнешься

        "Меня заставили"! :)


      1. ReadOnlySadUser
        16.08.2022 03:12
        +1

        Это ещё ничего. Работал я в одной компании. Пришёл туда молодым и горячим, ушел через пару лет на более хлебное место. Ещё через пару лет более хлебное место опостыло, и тут на старой работе появилась интересная вакансия. В общем, вернулся туда, но на новый проект.

        Дело в том, что за полгода до первого увольнения я перешёл в другой проект. Там все делалось очень в спешке + первые два месяца я был единственным программистом в проекте. В общем, решил заглянуть через 2 года во что превратилась кодовая база, которую я растил с нуля :)

        Моему удивлению не было предела. Во-первых, я увидел как архитектурные решения, которые я принимал, превратились в жутких монстров, тогда как два года назад они казались очень лаконичными :) Во-вторых, некоторые части кода были настолько плохи, что я понимал это еще при написании. Оставил огромные TODO, как это исправить. Но за 2 года никто и пальцем не пошевелил :) Так и висят там эпического масштаба костыли с моим именем на них :D

        После этого я больше не удивляюсь откуда и почему в долгоживущих проектах появляются всякие нечистоты. Вся проблема почти всегда в двух вещах: отсутствие дисциплины и нехватка времени)


    1. Maliglood
      17.08.2022 11:15

      А бывает, что git blame указывает на тебя, т.к. ты в этих строчках заменил, например, табы на пробелы) надо всегда после блэйма историю ещё смотреть.

      А однажды было так, что дурно пахнущий код указывал был в моём коммите. Но я точно помнил, что этого не писал. Залез в историю пул реквестов и увидел, что прежде, чем слить мой пулл реквест, тех лид залил в мою ветку ещё с десяток своих коммитов. Иногда сквош - зло)


  1. SadOcean
    15.08.2022 14:42

    Каждый раз, когда разбираю что-то головоломное мучительно пытаюсь понять - это фатальный недостаток и просто нужно привыкнуть или кот действительно плох и его стоило бы переписать.


    1. ReadOnlySadUser
      16.08.2022 03:21

      Руководствуюсь всегда простым правилом: если встретил зубодробительное - после того, как разобрался - оставляю огромный обстоятельный комментарий поясняющий буквально все взаимосвязи в этом костыле. Иногда в функции на 10 строчек, легко может быть комментарий строчек на 20.

      Так вот собственно правило такое: если получается написать внятный и четкий комментарий, который точно не устареет завтра - вероятно это фатальный недостаток, вытекающий из сложности системы. Если комментарий писать тяжело, если взаимосвязи очень шаткие и любое дуновение ветра в другом месте системы разрушит этот мегазабористый код - это точно надо переписать)


      1. SadOcean
        16.08.2022 15:04

        Да, у меня такие же впечатления.


  1. Keeper13
    15.08.2022 15:47
    +9


  1. KongEnGe
    15.08.2022 18:13

    Иногда лучше дать новому сотруднику попробовать исправить ситуацию именно потому, что он еще не знает, почему тут ее считают неулучшаемой.


    1. iamkisly
      17.08.2022 02:00

      Вы знаете, шо у вас за алмаз и сколько он стоит. Я знаю, шо у вас за алмаз и сколько он стоит. А Моня не знает, и он таки сделает!