Эффект внутреннего JSON

в 6:00, , рубрики: json, svn, костыли и велосипеды, Программирование, Системы управления версиями, хранение данных
Джейк с энтузиазмом приступил к своей новой работе, ожидая нового опыта и новых сложных задач. Он жаждал изучать новые стеки технологий и узнать, чему его новая компания может научить его в мире ПО.

Ему сказали, что он будет работать над веб-сайтами и иметь дело с JavaScript, Node.js, JSON и тому подобным. Звучало вполне логично для веб-разработки; странным был только комментарий нетехнического собеседователя, что всё «построено на основе Subversion»; Джейк решил, что просто чего-то недопонял.

Эффект внутреннего JSON - 1

Его поставили на проект, в котором использовался собственный «JSON-based Domain Specific Language» компании, или JDSL. Его начальник посоветовал ему изучить копию проекта, на который его назначили, и дал неделю-две на освоение. «Если возникнут вопросы, просто спрашивай, кого угодно, но, судя по твоему опыту, проблем у тебя возникнуть не должно».

Джейк начал с checkout SVN… который занял два дня. Когда он задал вопрос по этому поводу, коллега по имени Скотт ответил: «А, это нормально. Просто поиграй в пасьянс или займись чем-то ещё, пока процесс не закончится».

Два дня спустя он начал разбираться. Джейк начал с кажущегося невинным файла с именем customers.json, озадаченно изучая его содержимое:

    {
        "File" : "Customers.json",
        "Class" : "Customers",
        "Author" : "<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2250474643415647466250474643415647460c414d4f">[email protected]</a>",
        "Purpose" : "",
        "Functions" : [
            568,
            899,
            900,
            901,
            902,
            1877,
            2880
        ]
    }

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

    Customers.prototype.UpdateBillingInfo = function(info)
    {
        this.cc = info.cc;
        this.type = info.type;
        this.name = info.name;
        this.expM = info.expM;
        this.expY = info.expY;
        this.ccv = info.ccv;

        /* пропущено множество подобных строк */
        this.saveToDatabase();
    };

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

«А, значит, ты пока в этом не разобрался», — начал он. «JDSL написал Том. Он просто гений, сам создал JDSL. По сути, customers.json — это просто метаданные, используемые для компонования класса Customers». Он ждал, пока Джейк ответит «понятно».

Но Джейк молчал. «И… как же его запускать?», — спросил он.

Скотт рассмеялся. «Его нельзя запустить просто так. Для завершения запуска новой среды требуется пара дней. JDSL немного медленный, но он очень мощный. Очень мощный. Как я сказал, Том — настоящий гений».

Джейк по-прежнему не мог понять. «Ладно, тогда объясни мне этот файл с метаданными. Что он делает?»

Скотт снова рассмеялся. «В этом-то и заключается гениальность. Видишь, тут написано „Class“?»

«Ага».

«Ну вот, это имя класса. А видишь, чуть ниже написано „functions“?»

«Угу».

«А это ссылка Subversion на все функции, составляющие этот класс!»

"…Но я всё равно не понял...", — ответил Джейк. Внутренне он начал понимать, но искренне надеялся, что ошибается.

«Итак, у нас есть customers.json и customers.js. Файл JSON — это метаданные, а в файле JS содержится весь код. Список функций в файле JSON сообщает JDSL, что нужно искать эти версии файла JS, чтобы понять, какие функции доступны. В данном случае код находится в версиях 568, 899, 900, 901, и так далее».

Джейк закрыл глаза, надеясь, что над ним подшучивают. «Э-э-э...»

«В каждой версии customers.js есть одна функция, так что для добавления функций достаточно выполнить check in нового кода и дополнить файл метаданных JSON новыми версиями!»

Растерянность Джейка превратилась в скепсис.

«Когда кто-то выполняет вызов функции объекта Customer, JDSL использует список версий функций для проверки всех функций, пока не найдёт совпадение! Понятно?»

"…Да вроде..."

«Я же сказал, Том — гений! Это позволяет отслеживать все когда-либо созданные функции. Можно добавлять новые функции, переписывая файл JS и добавляя новую версию в JSON, и можно удалить функцию, просто удалив номер версии из списка функций. И она всё равно останется в истории, неактивная, но не утерянная!» Скотт поднялся. «Если возникнут ещё вопросы, обращайся», — сказал он и отошёл от стола Джейка.

Вооружённый знаниями об JDSL, переданными ему Скоттом, Джейк постепенно начал понимать систему, он выполнял check out множественных ревизий каждого файла, чтобы объединять их и смотреть, что происходит в среде исполнения. Вскоре он осознал, что это просто веб-портал, позволяющий клиентам обновлять свою личную информацию, но благодаря сложности JDSL кодинг того, что должно было занимать минуты, требовал нескольких дней.

В процессе изучения когда он начал чекинить комментарии, которые бы позволили ему с коллегами разобраться в этом запутанном хаосе, и даже устранил несколько очевидных багов, обнаруженных простым чтением кода. Он работал с каждым классом по очереди, и в конце недели обновил и выполнил check in всех файлов «метаданных» JSON, чтобы можно было использовать новые версии функций.

В понедельник утром он застал на работе виртуальный пожар. Все паниковали. «Что-то сломалось в JSDL и наша база данных клиентов испорчена!» Встретив Джейка в коридоре, Скотт вкратце рассказал о произошедшем.

«Ты!», — раздался громкий голос.

Джейк обернулся и увидел долговязого бледного блондина. Тот был в гневе. «Ты Джейк? Новичок?»

«Да», — осторожно ответил Джейк.

«Меня зовут Том. Ты сломал JDSL!»

«Э-э-э, что?», — Джейк разбирался только с порталом для клиентов. Как он мог вызвать проблемы?

«Ты сломал JDSL! Я сообщу о тебе начальству и тебя уволят!», — Том развернулся и в бешенстве умчался, оставив Джейка в недоумении.

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

«Расскажите, что вы сделали с JDSL», — попросил один из вице-президентов.

«Мне кажется, я ничего не делал», — ответил Джейк. «Я работаю здесь всего две недели, стараюсь изучать JDSL и работу портала для клиентов. Я даже не знаю, как его развёртывать!»

«Ты сделал несколько коммитов в Subversion!», — заорал Том.

«Ну да. Я добавил несколько комментариев, пытался...»

«В JDSL нельзя использовать комментарии! ИМЕННО ЭТО ЕГО И ПОЛОМАЛО!», — продолжал кричать Том.

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

«Ну да, я написал в комментариях пару коротких примеров синтаксиса, чтобы было понятно...»

Том вскочил со своего места. «Так и знал! Ты ВСЁ СЛОМАЛ!» Он повернулся к вице-президентам. «Я не могу работать с кодерами, которые не понимают систему! Или увольняйте Джейка, или уйду я!» И он выбежал из зала.

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

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

Автор:
PatientZero

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js