Статьи

Мой собственный ежедневный WTF

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

JavaScript

Хороший месяц назад один из основателей написал мне по электронной почте:  «Привет, у меня есть этот продукт, развитие клиента в момент, когда крупные клиенты ждут с толстыми чеками, чтобы использовать продукт. Я даже не могу заставить его работать, оригинальных разработчиков нигде не видно. Вы можете помочь?»

Бегство оригинальных разработчиков было красным знаком, но продукт оказался на моем пути: node.js, mongodb, множество потоков данных в реальном времени и требования к скорости для обновления пользовательского интерфейса. Имена ожидающих пользователей также внушали оптимизм.

Я сделаю это! Насколько плохо это может быть?

Суточная доза WTF

Это может быть очень плохо.

Часть проекта выполнена на Java . Это имеет смысл, строгая типизация является единственным логическим решением, учитывая то, что делает кодовая база.

Все остальное сделано в JavaScript . Протокол связи между Java и серверным JavaScript и внешним интерфейсом JavaScript… ну, в этом случае запрет на имена параметров длиннее трех символов.

Хорошо, экономия полосы пропускания, верно? Мы говорим о большом объеме данных, поэтому давайте сохраним эти объекты json небольшими.

Вот где все становится сложнее.

Поскольку основной протокол содержит только имена длиной 3 символа, то же самое относится и к базе данных. И поскольку база данных полна таких объектов, угадайте, что будет дальше? Это правильно! Большая часть кодовой базы представляет собой несвязный беспорядок имен переменных длиной не более 3 символов.

Привычка выходит за пределы переменных, затрагивающих данные.

Зачем писать  ярлык, когда вы можете иметь  lbl ? И так далее, и так далее… почти через два месяца работы над этой кодовой базой я до сих пор не представляю, что на самом деле означает большинство имен. Я использую их как пиктограммы, описывающие расплывчатые понятия. Я начинаю понимать, как они сочетаются друг с другом.

Это становится лучше.

Как сделать логическое значение соответствующим этому протоколу? Делая это:

function fix(boolean_value) {
    return boolean_value ? 'tru' : 'fls';
}

Так много для экономии места. Кодируйте 1-битные значения в 24-битные строки! Booyah!

О, если бы это было все, вот еще одна интересная вещь, которую я обнаружил … это повторяется в большей части кода, и я не осмелюсь коснуться этого, потому что я не знаю, какие сумасшедшие вещи сломаются.

Я упоминал, что нет никаких юнит-тестов ? Как насчет того, что я не одобряю их писать? Ага. Но, эй, это не так, как это приложение должно проходить надлежащий аудит безопасности, когда это сделано … о, подождите, это делает.

if (!thing || thing === 'null') ...

Прекрасно, да? Конечно, ноль закодирован как строка. Как еще ты это сделаешь?

Я пытаюсь убедить себя, что для этого была хорошая причина.

But I could live with all of that, some of it might have sounded reasonable at the time, or might simply be a result of deluded optimisations and whatnot. It’s bad, but something I can live with.

Here’s the stuff that really makes my life difficult:

function getPurple(cake) {
   cake.color = global_color_setting;
   return cake;
}

I don’t know how to even begin refactoring that so it makes sense … it’s just … what? Who does that!?

However, the worst thing, the absolute worst thing is that some time in the past this application was moved from traditional jQuery to Backbone. Nothing wrong with that, great move I’d say, I love Backbone!

They forgot to move most things. A lot of times Backbone is just a thin wrapper around old stuff. Most of the code doesn’t even leverage Backbone and there’s still a bunch of $.ajax peppered everywhere.

And don’t even get me started on “Hey, we changed name X in the protocol, can you change all references to that please” in a weakly typed language with no unit tests … fun times. I never know when something’s going to blow up because I forgot to click on a button when testing.

Grep only gets you so far …