Дневник разработчика
Экскурсия в ад: Как я провёл отпуск, пиля интернет-магазин в одиночку, или «Мы только зашли и вышли, Морти»
(Комната в измерении C-137. Дэйв сидит с банкой пива, уставившись в пустоту. Рядом стоит Рик, который только что вернулся из измерения, где продаются идеальные батарейки для гравито-скутеров)
Рик: Ну и? Чего такой кислый, Дэйви? Ты сейчас выглядишь как Морти после того, как он увидел свою копию, которая трахнула козу. Настолько же офигевший, но с меньшим количеством вопросов к реальности.
Дэйв: Рик, я только что вернулся из отпуска.
Рик: (Икает, поправляет колбу) О, круто. Полежал на пляже, посмотрел на фотоны, летящие от местной звезды, подрочил в океан... Зачем ты вообще пришёл? У меня тут межпространственный рефакторинг кода, между прочим. Я пытаюсь переписать функцию на С++, чтобы она работала на всех частотах реальности, а не только на тех, где гравитация — это просто предложение.
Дэйв: Нет. Я решил, что проведу отпуск с пользой. Решил написать интернет-магазин.
(Рик замирает. Его глаз дергается. Он медленно поворачивается на стуле, откладывая паяльник, которым только что пытался соединить провод с нейтронной звездой).
Рик: Погоди-погоди. Ты... ты взял законный отпуск. Время, данное тебе твоей хрупкой человеческой работой, чтобы не превратиться в овощ, который только и умеет, что коммитить в мастер в пятницу вечером... и потратил его на написание интернет-магазина?
Дэйв: Ну, я подумал, это же просто. CRUD. Товары, корзина, оплата. Пять минут, и готово.
Рик: (Смеётся, сначала тихо, потом переходя в истерический хохот) О, Морти, ты слышал? Зайди сюда! (Кричит в сторону коридора) Наш друг Дэйв решил, что интернет-магазин — это просто! Он сказал «пять минут»! Он назвал это приключением!
(Входит Морти, жуя что-то, отдаленно напоминающее бургер).
Морти: А? Что? Мы куда-то летим? Я не хочу снова в тот мир, ААА! Там были пауки, Рик! Пауки с... с... ну, ты знаешь!
Рик: Нет, Морти, мы не летим. Мы просто слушаем историю ужасов. Дэйв сейчас расскажет нам, как он решил зайти в ад за хлебом.
Дэйв: Сначала всё было хорошо. Я выбрал стек. React, Node, MongoDB. Развернул шаблон. Сделал компонент карточки товара. Красота. Прям как в том измерении, где мы искали газ для микрофона, помнишь? Зашли, вышли, газ в кармане.
Рик: Именно в этот момент, Морти, космос решает тебя наказать. Ты произносишь фразу «это же просто», и вселенная сворачивается в узел, чтобы доказать тебе, что ты кусок органического дерьма, который ничего не смыслит в энтропии и багах.
Дэйв: День второй. Я решил добавить фильтры по категориям.
Морти: О, фильтры — это круто! Как на том сайте, где я покупаю...
Рик: Заткнись, Морти. Ты не понимаешь. Фильтры — это первый круг ада. Дальше будет хуже. Он полез в стейт-менеджмент, я знаю.
Дэйв: Redux... Я подключил Redux.
Рик: (Достает из кармана бутылку чего-то светящегося, залпом выпивает) Бинго! Прощай, нервная система. Ты только хотел показать товары женской обуви, а по факту написал машину Тьюринга, которая работает только тогда, когда Юпитер выравнивается с Сатурном.
Дэйв: А потом я полез в документацию по оплате. Интерфейс платежной системы...
(Морти вздрагивает)
Морти: Рик, у него изменилось лицо. Оно стало серым. Как у тех существ из измерения пустоты!
Рик: Платежный шлюз, Морти. Это место, где здравый смысл умирает. Ты думаешь, что отправляешь объект с данными, а тебе приходит ответ: «Ошибка 1287b: Пожалуйста, отправьте запрос с телом, где ключ 'amount' передан в центах, но только если сегодня не вторник, а луна находится в фазе убывающей семёрки». Дэйв, скажи, что ты не полез в вебхуки. Скажи, что ты не настраивал уведомления о платежах.
Дэйв: (Закрывает лицо руками) Они приходят ночью, Рик. Они приходят в формате XML, хотя я просил JSON. Я написал триста строк кода, чтобы спарсить это старьё. Триста строк, Рик! Ради одной кнопки «Оплатить».
Рик: (Оборачивается к Морти) Видишь, Морти? Вот она, цена величия. Мы летаем по галактикам, трахаем инопланетных тварей и взрываем планеты за пять минут. А настоящий героизм выглядит так: чувак в тапках на балконе плачет над асинхронным запросом, потому что прокси сбрасывает CORS.
Морти: Вау. А я думал, хуже, чем на поле для мини-гольфа в том измерении, ничего нет. А тут просто сайт с носками...
Дэйв: Это не сайт с носками! Там были кроссовки! И админка! Боже, админка...
Рик: О, давай. Выкладывай. Что с админкой?
Дэйв: Я решил, что за день сделаю админку. CRUD для товаров, говорю же, просто. Я начал делать загрузку картинок. Одна картинка — ок. Десять картинок — ок. Но потом я вспомнил, что надо показывать превью, удалять старые версии, сжимать WebP... Я потратил два дня на дропзону, Рик! Два дня! Я хотел просто перетаскивать фото мышкой, а в итоге у меня на компе скомпилировался какой-то левый бинарник, который майнит биткоины в какой-то параллельной вселенной, где биткоин ещё не придумали и он там на хрен никому не нужен!
(Морти смотрит на Дэйва с ужасом и восхищением).
Морти: Так ты... ты не отдыхал? Совсем?
Дэйв: На пятый день я сидел и тупо смотрел на экран. Сайт работал. Я добавил товары. Я мог оформить заказ. Но корзина... корзина жила своей жизнью. Если добавить товар, потом удалить, потом снова добавить тот же, но другого цвета... количество в углу экрана показывало «-3». Минус три товара, Морти! Как можно иметь минус три носка в корзине? Где эти три носка? Они в параллельном измерении? Я создал портал в корзине, сам того не желая?!
Рик: (Довольно ухмыляется) Классика. Ты не написал интернет-магазин, Дэйв. Ты создал сингулярность, которая сворачивает пространство через неправильное использование хука useState. Поздравляю.
Дэйв: А вчера, в последний день отпуска, я решил задеплоить это всё на хостинг. Я залил файлы. Открываю сайт... а там пусто. Белый экран. Консоль красная от ошибок. Оказалось, я в прод залил версию, где переменные окружения называются по-другому, и весь сайт просто... умер. Я сидел и перебирал энвы до трёх ночи, Рик. А сегодня утром я вышел на работу.
(Пауза. Рик задумчиво ковыряет в носу).
Рик: Знаешь, Дэйв, я тут подумал. Мы с Морти только что вернулись с приключения. Мы зашли в одно измерение, украли батарейку, вышли. Нам казалось, что прошло пять минут. А там, пока мы ходили, из-за временной аномалии прошло два года. И все наши враги состарились и умерли от скуки.
Морти: Это было круто, Рик!
Рик: Заткнись. Я к чему это. Твоя история точно такая же, Дэйв. Ты зашел в свой отпуск, думая, что это на пять минут — «зайти и выйти, Морти». А по факту — ты провел там десять лет, сражаясь с демонами рефакторинга, драконами CORS-политик и тёмными повелителями из техподдержки платежных систем. И выбрался оттуда с седыми яйцами и работающим (ну, почти) интернет-магазином.
Морти: Так он теперь крутой? Он теперь богатый?
Рик: Нет, Морти. Теперь он просто уставший. Он понял главную истину мироздания: любой, даже самый простой проект, разрастается ровно настолько, чтобы занять всё отпущенное на него время, плюс три бессонные ночи и остатки твоей ментальной стабильности. Это как закон Мёрфи, только хуже. Это закон Петли Времени Разработчика.
Дэйв: (Смотрит на Рика) И что мне теперь делать с этим знанием?
Рик: (Пожимает плечами, открывает портал в гостиную) Ничего. Просто запомни это чувство на следующий отпуск. А пока, если хочешь по-настоящему отдохнуть, пошли с нами. Мы как раз собрались на планету, где время течет вспять. К утру ты снова станешь молодым и полным сил, чтобы накосячить заново.
Морти: Но Рик, он же только с войны!
Рик: Это не война, Морти. Это — понедельник. Пошли. Или оставайся здесь и дописывай документацию к своему говнокоду.
(Дэйв вздыхает, допивает пиво и встает).
Дэйв: Ладно. Но если там будут пауки...
Рик: Не будут. Там будут баги. Баги страшнее.
(Они прыгают в портал).
Отсылка на ситочник:
ахахахахахх
Если что это сарказм