Ему сказали, что он будет работать над веб-сайтами и иметь дело с 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)
pae174
09.06.2023 06:36+22Джейк начал с checkout SVN… который занял два дня.
Какой же тормоз этот ваш Джек. Я бы за эти два дня уже успел уволиться.
Krouler7
09.06.2023 06:36+2Полагаю, вы сейчас просто более опытный работник(именно с точки зрения работника, профессия не важна). Раньше возможности были не столь очевидны(многие перечитали что могут и не могут из-за различных повесток и не только) как сейчас - и это нормально.
nronnie
09.06.2023 06:36+8Я сразу заподозрил, что это перевод с "The Daily WTF", потом уже посмотрел ссылку - так и есть. Сам давненько уже его не читаю, т.к. вижу это на работе каждый день. "Кто в армии служил, тот в цирке не смеется." (с)
domix32
09.06.2023 06:36+3Забавно, что код движка он даже не смотрел
slonopotamus
09.06.2023 06:36+2И видимо не проверял то что коммитит. И его никто не ревьювил.
czz
09.06.2023 06:36+2Хм, я думал, и не смог придумать ни одного плюса такого подхода в сравнении с тем, чтобы обычным образом версионировать все эти файлы. Но зачем-то же так сделали?
slonopotamus
09.06.2023 06:36Но зачем-то же так сделали?
Половина людей в мире имеют интеллект ниже медианного.
czz
09.06.2023 06:36+1Такие люди скорее сделали бы все по общепринятым шаблонам. В худшем случае — про примерам со stack overflow.
slonopotamus
09.06.2023 06:36Вы кажется не уловили шутку в моём предыдущем комментарии :)
Но не соглашусь с вашем тезисом про stack overflow. По моим наблюдениям, тяга к изобретению велосипедов с квадратными колёсами обратно пропорциональна уровню скиллов разработчика.
16tomatotonns
09.06.2023 06:36+2Вот так легчайше вскрылась главная проблема организации - отсутствие бекапов.
vvbob
09.06.2023 06:36+3Часто вижу такое. Ну не в смысле прямо один в один, конечно, не так гипертрофированно, но в очень многих проектах видел последствия работы таких вот "гениев"-томов, которые накрутят какую-то хрень, то-ли ради самоутверждения - "а вот могу, смотрите какой я крутой", то-ли что-бы сделать себя незаменимым, единственным кто в этой хрени хоть как-то разбирается.
Дикие иерархии классов, в которых данные ходят по такому запутанному лабиринту, что даже с отладчиком за день не поймешь где там что куда не так зашло. Всякие абстракции над абстракциями абстракций, щедро приправленные дженериками, так что для написания какого-либо простейшего круда, который будет работать в этой системе, приходится неделю изучать "что хотел сказать автор посредством вот этой абстрактной фабрики билдеров адаптеров для прокси посетителя", разумеется при полном отсутствии хотя-бы каких-то внятных комментариев (хороший код, сам себя комментирует, ага.. только ведь, хороший код, а не это вот..). Или вообще какая-либо лютая велодичь, "улучшенная" версия какого-либо фреймворка с блекждеком и поэтессами, в которой сначала надо разобраться в легаси формате конфигурационных файлов, потом попытаться написать свои файлы, которые потом используются для кодогенерации, на выходе которой получаем массу отличных объектов с говорящими названиями вроде clz_67392718957_gdf_8839289002277766_sssgr.java (и я, сцуко, ни разу не шучу, до сих пор с содроганием вспоминаю тот проект).
Обычно все это следствие того, что в команде изначально не было нормальных, опытных разработчиков, либо они были, но из-за стремления "не быть токсиком", вовремя не надавали по очумелым ручкам очередного непризнанного гения, изобретателя очередной гениальной хрени, которая настолько "гениальная", что "тупая" масса обычных разрабов в концепцию не врубаются и никак не могут подстроиться под "гениальную" архитектуру, отчего в коде становится еще больше треша и угара, местами даже и содомии.
SergeyVN94
09.06.2023 06:36+2На первой работе еще джуном столкнулся с самописным "фреймворком". Страницы генерировалась на основе схем из json файлов. Благодаря копанию в этом проекте я чуть не выгорел)
vvbob
09.06.2023 06:36Ну, в принципе есть нормальные фреймворки с кодогенерацией, плохо когда используют велосипеды, заменяющие что-то общепринятое, но при этом ничем не лучше того что они заменяют (обычно сильно хуже - забагованные и очень неудобные)
Вот процентов, наверное, 90 из тех великов что я видел, создавали больше проблем, чем решали. По замыслу создателей они вроде бы должны были ускорять и упрощать разработку, а по факту получалось что намного быстрее и проще было-бы работать с чем-то стандартным, или даже просто руками написать.
nronnie
09.06.2023 06:36+1Я однажды работал с вполне себе "несамописным"
extjs
с тех пор опыт на всю жизнь обходить любое это "программирование конфигами" за километры, будь оно даже каким-нибудь Танненбаумом или Торвальдсом создано :))
baldr
Я уверен что уже читал этот текст и, скорее всего, на хабре, но что-то не могу найти поиском. По ссылке на оригинал - статья от 2016 года, то есть история произошла еще раньше.