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

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


Его поставили на проект, в котором использовался собственный «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 для вызова каждой функции в среде исполнения. Той, где системы в продакшене не используют автоматически самую новую основную ветвь разработки. Той, где всё не разваливается из-за новичка, добавившего комментарий в код.

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


  1. baldr
    09.06.2023 06:36

    Я уверен что уже читал этот текст и, скорее всего, на хабре, но что-то не могу найти поиском. По ссылке на оригинал - статья от 2016 года, то есть история произошла еще раньше.


  1. pae174
    09.06.2023 06:36
    +22

    Джейк начал с checkout SVN… который занял два дня.

    Какой же тормоз этот ваш Джек. Я бы за эти два дня уже успел уволиться.


    1. shasoftX
      09.06.2023 06:36
      +18

      Если у них отдел кадров работает тоже в этой системе, то не успели бы


      1. pae174
        09.06.2023 06:36

        Если и ОК так работает, тогда за два дня они его и нанять не успели ещё. Просто заходим туда и говорим "отдайте мне назад трудовую и я пошёл, всем пока".


    1. Krouler7
      09.06.2023 06:36
      +2

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


  1. nronnie
    09.06.2023 06:36
    +8

    Я сразу заподозрил, что это перевод с "The Daily WTF", потом уже посмотрел ссылку - так и есть. Сам давненько уже его не читаю, т.к. вижу это на работе каждый день. "Кто в армии служил, тот в цирке не смеется." (с)


  1. domix32
    09.06.2023 06:36
    +3

    Забавно, что код движка он даже не смотрел


    1. slonopotamus
      09.06.2023 06:36
      +2

      И видимо не проверял то что коммитит. И его никто не ревьювил.


      1. toxicdream
        09.06.2023 06:36
        +1

        После всего высказанного ясно что тестами там конечно даже не пахло


        1. slonopotamus
          09.06.2023 06:36

          Да уж хрен с ними с тестами. Нету - так нету, можно и руками проверить.


  1. czz
    09.06.2023 06:36
    +2

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


    1. slonopotamus
      09.06.2023 06:36

      Но зачем-то же так сделали?

      Половина людей в мире имеют интеллект ниже медианного.


      1. czz
        09.06.2023 06:36
        +1

        Такие люди скорее сделали бы все по общепринятым шаблонам. В худшем случае — про примерам со stack overflow.


        1. slonopotamus
          09.06.2023 06:36

          Вы кажется не уловили шутку в моём предыдущем комментарии :)

          Но не соглашусь с вашем тезисом про stack overflow. По моим наблюдениям, тяга к изобретению велосипедов с квадратными колёсами обратно пропорциональна уровню скиллов разработчика.


  1. 16tomatotonns
    09.06.2023 06:36
    +2

    Вот так легчайше вскрылась главная проблема организации - отсутствие бекапов.


  1. vvbob
    09.06.2023 06:36
    +3

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

    Дикие иерархии классов, в которых данные ходят по такому запутанному лабиринту, что даже с отладчиком за день не поймешь где там что куда не так зашло. Всякие абстракции над абстракциями абстракций, щедро приправленные дженериками, так что для написания какого-либо простейшего круда, который будет работать в этой системе, приходится неделю изучать "что хотел сказать автор посредством вот этой абстрактной фабрики билдеров адаптеров для прокси посетителя", разумеется при полном отсутствии хотя-бы каких-то внятных комментариев (хороший код, сам себя комментирует, ага.. только ведь, хороший код, а не это вот..). Или вообще какая-либо лютая велодичь, "улучшенная" версия какого-либо фреймворка с блекждеком и поэтессами, в которой сначала надо разобраться в легаси формате конфигурационных файлов, потом попытаться написать свои файлы, которые потом используются для кодогенерации, на выходе которой получаем массу отличных объектов с говорящими названиями вроде clz_67392718957_gdf_8839289002277766_sssgr.java (и я, сцуко, ни разу не шучу, до сих пор с содроганием вспоминаю тот проект).

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


    1. SergeyVN94
      09.06.2023 06:36
      +2

      На первой работе еще джуном столкнулся с самописным "фреймворком". Страницы генерировалась на основе схем из json файлов. Благодаря копанию в этом проекте я чуть не выгорел)


      1. vvbob
        09.06.2023 06:36

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

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


      1. nronnie
        09.06.2023 06:36
        +1

        Я однажды работал с вполне себе "несамописным" extjs с тех пор опыт на всю жизнь обходить любое это "программирование конфигами" за километры, будь оно даже каким-нибудь Танненбаумом или Торвальдсом создано :))