Программирование, Саморазвитие

Как я разгребал legacy код

legacyСегодня попался мне в работу один сайтец, приличной вроде бы конторы. Один из региональных банков. Но когда я приступил к работе с кодом, я понял что до выполнения основной задачи передо мной встает еще одна — рефракторинг. Причиной тому был страшный и ужасный legacy код. Это была сплошная портянка на две с половиной тысячи строк, с закоменчеными блоками, дублирующимися местами, ужасной логикой и абсолютно без форматирования с костылями, торчащими абсолютно отовсюду. Надо сказать что в коде были еще и комментарии, смутно описывающие суть происходящего, врущие через каждое слово.

Первая мысль — WTF! Как такое вообще можно было написать?! Вероятно программист был не совсем в трезвом уме когда создавал это. Потом пришло понимание того что программистов было много и каждый решал узко поставленную задачу своим костылем. Работать с этим не было совершенно никакого желания и я принялся «лечить» код.

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

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

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

Двигаюсь дальше. Ищу сложные условия в блоках if, while, for и вообще. Выношу их в методы с осмысленными названиями (isValid(), isChecked()). Заменяю в остальном коде и получаю более осмысленные строки.

Приступаем к банковской логике. Ищу в ТЗ и в коде формулы, понимаю что они математически не верны и потому обильно снабжены костылями. Пишу с нуля новые методы сложных процентов, расчета платежей и прочего, и заменяю 20-30 строчные костыли на вызов одного метода. Код к этому моменту уже более-менее хорош, но надо довести начатое до логического конца.

Добираюсь до переменных. Переименовываю всякие ost, osnd, rez, bal, arr в ostatok, osnovnoy_dolg, result, balance.  Жить стало проще. Жить стало веселее.

Надо сказать что код был на JS и был размещен непосредственно в теле HTML со вставками PHP. К этому моменту уже прошло достаточно много времени, потрачено  большое количество жизненной энергии, выкурено немало сигарет, а потому первое что пришло в голову — заюзать функции PHPJS. А после этого вынести получившийся код во внешний файл и подключить его как положено.

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

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

Реклама

Как я разгребал legacy код: 2 комментария

  1. >>Переименовываю всякие ost, osnd, rez, bal, arr в ostatok, osnovnoy_dolg, result, balance.

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

    1. Да, оно конечно так, но дело в том что английский — мое слабое место, поэтому писал как писалось. Цель была придать смысл, а не следить за семантикой.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s