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