В преддверии Хэллоуина фуллстек-разработчик Уэс Бос в своём Твиттере попросил других программистов поделиться своими ужасными историями о вебдеве. Вот некоторые из них...

@DimitroffPeter:

Моя первая работа и первый вклад в продакшен. Мне нужно починить клиент-серверную утилиту. Её функция проста: у нас есть самодельное устройство из роутера и PC. У роутера есть CLI и он должен показывать информацию о состоянии PC. Вещи наподобие systemctl, top, free. Команда передаётся в виде текста, выполняется, и результат принимается в виде текста. Однако сделано это было наиболее ужасающим способом из всех возможных…

Команды CLI заданы в XML. Они вызывают скрипт Bash с определёнными аргументами. Скрипт создаёт PIPE в файловой системе и передаёт команды в него. Сервер написан на C (именно так — сервер выполняет запросы к клиенту, а не наоборот). Все имена переменных на C-сервере состоят из одной буквы (x,a,b,q) или имеют общий вид (mem, data). Также он имеет кучу pthread, выполняющих запись в pipes и их опрос в файловой системе с совершенно НУЛЕВЫМ управлением потоками. Никаких мьютексов, ничего подобного.

Итак, поток C-сервера опрашивает первый pipe и выполняет скрипт, открывающий сессию SSH с PC, и выполняет нужную команду. Результат помещается в ещё один pipe файловой системы. У C-сервера есть ещё один поток, опрашивающий этот pipe. И тысяча связанных с этим проблем. Например, он никак не может узнать, полон ли результат, и не ждёт, поступят ли по pipe ещё данные. Как только он что-то считывает, то сразу это выводит. Из-за этого получалось много частичных результатов, а оставшиеся их части приклеивались к результату следующей команды…

Но и это ещё не всё. Код на C был усыпан fprintf(s). Если вы знакомы с семейством функций printf, то понимаете, что это просто напрашивается на переполнение буфера. И у нас они бывали. Очень много раз.

Давайте ещё раз взглянем на архитектуру/стек этого величественного изобретения:

> CLI
> скрипт sh
> PIPE
> pipe, вызывающий pthread
> скрипт, вызывающий pthread
> скрипт SSH
> сессия SSH для подключения к PC
> PIPE 2
> ещё один pipe, считывающий pthread

Я заменил всё, что идёт после CLI, 30 строками Bash с использованием ncat.



@MichaelDClaar

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

@dev__adi:

Я создал тёмный режим для нашего сайта, но не добавил значения по умолчанию для переменных CSS. Предполагалось, что мы добавим в одно место файл темы CSS и всё будет в порядке. Оказалось, что в другом проекте мы не включили файл переменных темы и всё окрасилось в белый цвет. К счастью, проблему отловили при подготовке к выводу в продакшен.

@Abdullah_Mzaien:

В своём выпускном проекте меня очень раздражал его объём, поэтому я перетасовал файлы.

Создал одну из самых странных команд git, которая повторно рекоммитит все коммиты с самого начала.

Ничего плохого в этом нет, но мою команду все эти коммиты пугали.

@MathiasaurusRex:

Примерно 10 лет назад я допустил опечатку в переменной тега якоря в компании электронной коммерции из списка Top 5. Допустим, её адрес ABC точка com, а все теги якорей вели на AC точка com. Ошибка распространилась на часть сайта с ежедневными/еженедельными скидками. Для исправления потребовалась пара часов.

Довольно дорогой вышел «упс».

@FcoGT:FcoGT

Газеты оставляют важные новости, которые могут произойти, чтобы опубликовать их сразу, как случится событие. Когда Габриэль Гарсиа Маркес был очень сильно болен, они уже оставили на главной странице новость о его смерти. Мой друг сделал ошибку в условной конструкции и её опубликовали!

@ryanfiller_:

Однажды я выполнил npm publish не из той папки и запушил приватный рабочий репозитарий в npm как публичный пакет. К счастью, есть команда npm unpublish, если заметить это достаточно быстро (в пределах 72 часов). В противном случае он останется там навсегда…

@perlilja:

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

@petetasker:

Я проводил конкурс для радиошоу. Создал форму, через которую пользователи могли отправлять ответы на еженедельные вопросы. В ответе на один из еженедельных вопросов присутствовал апостроф. За эту неделю не было создано ни одной записи…

@davigiroux_:

Не моя история, но тоже страшная: чувак, который со мной работал, внёс обновление в базу данных без «where», из-за чего каждому пользователю, подписавшемуся на курсы, был выбран один и тот же курс. Я потратил целое утро на ОБЗВОН всех, чтобы они выбрали нужный им курс, а тот чувак сказал, что заболел.

@jonicious:

В первые недели моей самой первой работы разработчиком мы с ещё одним новичком удалили все публичные ключи SSH с машины, на которой работал один из самых критически важных сервисов.

Ещё я перепутал флаги true и false и отключил для всех клиентов рекламную кампанию со скидкой в 50%.

@PatZawa:

Я писал regex-функцию для проверки номера социального страхования перед хэшированием в БД. Однако перед выполнением проверки я забыл произвести обратную дешифровку, из-за чего из БД в продакшене удалилось почти 10 тысяч номеров пациентов. Потратил следующие два дня на восстановление и повторную вставку.

@nishant_ch:

В самом начале своей карьеры я однажды случайно подключился через Filezilla не к тому серверу и загрузил на работающий домен чужой веб-сайт, а потом ушёл отдыхать. Через несколько часов я увидел, что внесённые мной изменения не отражаются на сайте, и понял, что натворил.

@pjately:

Случайно отключил сервер в первый день работы в офисе. Даже не понял этого, пока снова не включил рубильник и сервер не издал звук загрузки, при этом технический директор обернулся и спросил: «Это что, был сервер?» Второй день на работе был гораздо лучше… Хуже-то ведь и быть не могло.

@rrrrrrichard:

В начале двухтысячных писал за деньги веб-сайт. Отлаживал страницу контактов, думая, что саму доставку я отключил. В тот день клиент получил кучу электронных писем от «Адольфа Г.», «Иосифа С.» и т.д. Спустя несколько часов он вежливо попросил меня прекратить. Упс.

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

@spencer_carli:

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

Оказалось, что сообщения получаю не только я, но и весь коллектив. Мне сказали, что тестовые сообщения получили все в команде. Блин! Ну да ладно… Компания техническая, все всё поняли.

Но потом начали поступать твиты и электронные письма от инвесторов — сообщения передавались не только внутри коллектива, но и всей базе пользователей.

Упс…

Тогда я в последний раз в жизни писал ругательные/шутливые/пренебрежительные тестовые сообщения push-уведомлений.

@jeroenheijmans:

«Пожалуйста, сделайте так, чтобы чекбоксы были круглыми, но можно было выбирать несколько вариантов».

@endlife:

В 2005 году я работал над веб-приложением для сети магазинов проката DVD — она переходила от клиент-серверных приложений, которые требовались при dial-up, к единому онлайн-приложению. В день запуска я обнаружил, что центральная БД, синхронизируемая из клиентских БД, была совершенно разрушена. Никто не тестировал целостность данных.

Мне звонили сотрудники из филиалов: «Мы видим в своей системе людей из других городов, а наших в ней нет».

Я потратил день на подключение по VNC к локальным компьютерам, создание дампов БД с помощью локальных админов MySQL и ручную сборку центральной БД. И всё это после мучительного двухдневного ввода системы в работу.

За эти три дня я прослушал альбом «Let’s Dance» Дэвида Боуи семьдесят раз.

@sillywampa:

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

@sygint:

Переписал форму, чтобы подчистить UI, чем на месяц помешал добавлению новых кредитных карт на мобильном сайте компании из списка Fortune 500. Наверно, никто не добавлял их из приложения, потому что жалоб мы не получали. Проблему заметил джуниор-разработчик, даже отдел QA о ней не знал.

В другой раз клиент меня не послушался и запушил на работающий сервер поломанный шаблон. Они потеряли 70 тысяч долларов за час. На этот раз ошибка даже близко не была моей, лол.

@marcelcutts:

В горячие деньки работы в стартапе я создал игру под названием «Zombies, Run!», которая была довольно популярной и имела несколько миллионов платных игроков. Однажды, накопив неизмеримый технический долг, я скопипастил неправильную версию файла конфигурации Django и потерял секрет БД.

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

На следующее утро я лежал в кровати, обдумывая способы снижения энтропии секрета и выяснил, что поскольку я совершил ещё одну оплошность и вставил секрет в свой терминал, он всё время находился в моей истории zsh. Минус на минус даёт плюс.

Комментарий к твиту: я когда-то играла в эту игру, в ней была куууча странных багов.

@marcelcutts: Не удивлён, я ужасный разработчик.

@JosDeBerdt:

У меня была система из нескольких сайтов, в которой контент можно было передавать с одного сайта на другой. Во время тестирования я не заметил, что прошёл по ссылке на продакшен и запустил «update content» без указания page-id… Все страницы на каждом из сайтов потом состояли из единственного слова «testing». Это было в те времена, когда ещё не существовало систем контроля версий и изменения мгновенно передавались по FTP на продакшен-сервер.

@chrisalesant:

На моей первой фронтенд-работе меня попросили разработать длинный список электронных писем, поэтому я создал всё при помощи div, анимаций и flexbox. Примерно через две недели отдел маркетинга провёл контроль качества и сказал переделать всё с нуля на таблицах и inline-стилях за три дня.

Вишенка на торте: дизайн должен был иметь вёрстку pixel perfect для клиента Outlook.


@johnhutch:

Я работал над специализированной платформой для электронной коммерции в компании из списка Fortune 500. Сотни разработчиков работают над десятками международных копий нескольких брендов, код безостановочно пушится весь день.

Поэтому представьте мой ужас…

когда я получил сообщение, что сломал всю ветку/окружение git. Оказывается, при выполнении merge я перепутал ветвь, в которой нахожусь (не пользуйтесь '.', ребята. Всегда указывайте имена ветвей явным образом).

@MongooseDoom:

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

Ещё одним дождливым вечером пятницы я случайно удалил SQL-таблицу.

Разумеется, потом я выяснил, что наша стратегия создания резервных копий была поломана.

К счастью, это было до эпохи ленивой загрузки, а у меня оказалась открытой одна вкладка с 400 значениями, которые я затем вставлял вручную.

Обычно я агностик, но помню, что в тот день точно молился, чтобы Firefox не вылетел, пока я не сделаю скриншоты всех значений на этой странице!



На правах рекламы


VDSina предлагает безопасные серверы на Linux или Windows — выбирайте одну из предустановленных ОС, либо устанавливайте из своего образа.

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