Tproger Changelog: как работать, если сам себе всё ломаешь?

Обложка: Tproger Changelog: как работать, если сам себе всё ломаешь?

Приглашаем вас на тёмную сторону нашего издания. В этом выпуске мы решили поделиться тем, как факапим в процессе работы и пытаемся найти при этом хоть немного времени на развитие 🙂

Будет интересно послушать и ваши истории в комментах: как прошёл месяц? Какие ошибки вы осознали и как с ними справлялись? Расскажите, не стесняйтесь, тут все свои.

Саша Ушатинская

Саша Ушатинская, главред Tproger

Наш список факапов можно начать с того, что сам этот выпуск должен был выйти раньше. Я стараюсь собирать и выпускать статьи Tproger Changelog сразу, как закончился очередной месяц, чтобы подвести итоги и побежать дальше. В этот раз подумала, что как обычно быстро сверстаю материал, а в итоге работы оказалось на несколько часов, я неустанно прокрастинировала, и эти часы размазались по нескольким дням. Решением проблемы выбрала отказаться от полноценного отдыха в воскресенье и посвятить время статье. Дурацкое решение, если применять его на постоянной основе, но разово вроде бы сработало, и вот перед вами новый ченжлог.

Все выпуски ченжлога тут, на странице тега

Алексей

Алексей, генеральный директор Tproger

Мы запустили платные подписки

…и они не заработали. Один подписчик заплатил нам в первый же день после запуска и сразу же написал, что реклама всё равно остаётся на сайте, даже если поставить все галки. Мы нашли ошибку не сразу, даже успели вернуть деньги от безнадёжности. Потом нашли ещё баги после анонсирования фичи. При этом сама система классная — реклама вырезается так, как будто её и не было никогда на сайте.

За пару недель продвижения подписок и сбора фидбека оказалось, что никто не понимает, зачем платить деньги «за то, что можно получить бесплатно» (имеется в виду AdBlock). У нас в принципе не очень принято платить за продукты интеллектуальной деятельности. Я не виню пользователей — они искренне не понимают, как устроен бизнес и какой ущерб они наносят индустрии тем, что блокируют рекламу или устанавливают пиратскую версию Windows.

Осталось воспринять это как точку роста и доработать продукт так, чтобы и для нас, и для подписчиков польза была одинаково понятна.

Наши серверы для разработки

…были доступны в интернете через адреса cdn, хотя доступ должен был быть закрыт через Cloudflare Access. Дело в том, что cdn у нас — это просто зеркало сайта, все запросы доходят до сервера, но кэшируются на больший срок и обрабатываются особым образом, если это картинки. Т.е. можно было вбить в браузер адрес devcdn.tproger.ru и зайти на сайт, как будто это dev.tproger.ru. А это потенциально много возможностей для атак — на серверах разработки никто не думает о безопасности. Этот баг нам прислал наш знакомый исследователь, который ранее сообщал о множестве проблем на tproger.ru.

Деплой на прод

…происходил на каждый коммит, даже если он не отправлен в мастер. Bitbucket поменяли интерфейс, а мы не поменяли скрипт. В итоге сервер был постоянно занят пересборкой, даже если это не было нужно. При этом хук держал соединение, пока сборка не завершится, и мы теряли php-fpm воркеры, которые должны заниматься обработкой запросов от пользователей. Сейчас всё хорошо, предупреждений от мониторинга стало меньше.

Просмотры постов

…не записывались в базу. По какой-то причине функция для сброса накопившихся в кэше просмотров в БД не вызывалась. Это и не приводило к какой-то явной ошибке, чтобы её заметить, и просмотры терялись. При этом кэш какое-то время накапливал изменения, и мы видели, как у статей растут просмотры. Потом кэш протухал, и счётчик сбрасывался в ноль. Ошибку исправили, теперь запись в БД по расписанию работает.

Новая AMP-тема для статей

…загружалась дольше, чем не-AMP версия и дольше, чем предыдущая версия AMP-темы. Мы исправили ошибки, теперь AMP-страницы работают быстро и Google не будет нас наказывать и лишать трафика из поиска.

Сброс кэша

…не происходил автоматически после деплоя на продакшен. И не все разработчики понимали, какой кэш надо сбросить, чтобы изменения применились. Решили проблему инструкцией для команды и кодом для автоматического сброса. Теперь сервер не уходит в глубокую задумчивость при каждом обновлении кода.

Индексы в БД

…не были проставлены во всех таблицах. Дело в том, что когда создаётся таблица в MySQL, можно указать, по каким полям в дальнейшем будет много запросов. По ним строится дерево поиска (или хэш-таблица, зависит от конкретных случаев) и запросы выполняются намного быстрее. Например в таблице с рейтингом пользователей Tproger Gamify индексом было объявлено только поле id, а запросы были по полю user (что логично, обычно надо получать рейтинг конкретного пользователя). После добавления индексов база немного разгрузилась и стала работать быстрее. Теперь надо добавить их в коде и учитывать эту особенность в дальнейшей разработке.

Система сбора и анализа ошибок

…её просто не было. Установили и настроили Sentry, офигенный инструмент, который 100% стоит своих денег. Теперь сообщения об ошибках собираются, группируются и отслеживаются в красивом веб-интерфейсе. Сейчас мы получаем больше 500 сообщений об ошибках в минуту и, надеюсь, снизим их количество в ближайшие 2 недели, пока не закончился пробный период (а они берут деньги именно за количество событий). В Sentry есть много фич, достойных отдельной статьи, предлагаю заинтересованным изучить самостоятельно. Отмечу одну: с привязкой к репозиторию разработчик может получать уведомления об ошибках в коде, которые он совершил. Не просто общий список, а назначение на ответственных и проверка после фикса (вдруг не сработало). А ещё туда же можно собирать репорты пользователей о багах со всем их окружением (браузер, ОС, сообщения в консоли разработчика и т.п.). Раньше мы получали их в канал #bug-reports в Slack, но теперь для этой задачи присмотримся к Sentry.

Антон Брызгалов

Антон Брызгалов, разработчик аналитической инфраструктуры

Как только мы перешли на наш собственный трекер событий

…его база данных сломалась. Если по-простому, то базе не хватило «места» на жёстком диске (число открытых файловых дескрипторов превысило лимит).

Это было прогнозируемо, потому что для простоты я писал данные в базу (ClickHouse) не совсем правильно — по одному запросу INSERT на строку. Это является антипаттерном для ClickHouse, который на каждую вставку данных открывает новый файл. Данные перед вставкой следует буферизовать. Но я не рассчитывал, что с проблемой мы столкнемся так скоро.

Я решил увеличить место на диске. Простая операция в облачной инфраструктуре, но… после неё база поломалась совсем. Вот прям кластер умер. И никакого контроля с моей стороны за состоянием нет.

В холодном поту пишу в поддержку. Расчётное время ответа: 24 часа. База лежит, мы теряем данные. Поддержка не отвечает. Ок, покупаем расширенный пакет поддержки. С той стороны быстро ответили, что передали информацию разработчикам. Ждём ответа.

База мертва уже пару часов, поднять её своими силами нет возможности. Рискуем вообще всё потерять. Наконец поддержка ответила: базу починили. Я спрашиваю: в чём причина поломки? Поддержка: «она утонула» «сбой автоматики». Всё.

Ну что ж, хотя бы скайнет пока что мир не захватит.

Вывод: используйте инструменты правильно. Даже на маленьких мощностях.

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

Вообще по плану новый компонент должен был появиться спустя пару месяцев, когда бы у меня дошли руки. Но в критической ситуации надо действовать быстро. Это новый опыт лично для меня: обычно я покрываю свой код тестами, а только потом деплою. В этот раз понял, что лучше задеплою грязный, но рабочий код, а потом уже сделаю всё правильно. Кстати, на покрытие тестами нового кода впоследствии у меня ушло два дня.

Наша облачная инфраструктура заработала

…но я зачистил всю папку с исходниками и потерял те важные файлы, которые не хранятся в репозитории.

Прям вот rm -rf запустил. Ctrl-Z для такой ситуации нет, я даже погуглил.

А потерял я файлы Terraform с состоянием нашей облачной инфраструктуры. Long story short: восстанавливать все связи между ресурсами Terraform и инстансами облачных сервисов пришлось буквально вручную. Причём восстановить можно не всё. Что-то пришлось пересоздавать и заново настраивать связи между компонентами.

Вывод: делайте бэкапы.

Аня Чуватова

Аня Чуватова, шеф-редактор сайта Tproger

Мы выпустили новость про разблокировку Телеграм всего через 5 минут после РБК

…но я облажалась с заголовком — все гуглили «Роскомнадзор разблокировал Telegram», а я написала «Роскомнадзор снял ограничения с Telegram». В итоге в новостные сниппеты поисковиков мы не попали, а повторная проверка поисковым ботом после изменения заголовка случилась только на следующий день.

Всё равно порадовалась, потому что мы впервые немедленно среагировали на инфоповод, собирали инфу напрямую с сайтов-источников (РКН и Госреестра), которые при этом ещё и лежали. И впервые сделали статью, которая дополнялась в режиме реального времени:

Что получилось в итоге, можете посмотреть здесь:

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

Павел Берашевич

Павел Берашевич, SMM Tproger

Мы немного порвали оч

…ень ограниченное хранилище ВКонтакте. Пару недель назад получили сообщение, что у нас в одном из пабликов накопилось слишком много фотографий и их надо отдать на удаление:

Начал общаться с поддержкой VK и оказалось, что их порвал наш бот, в который мы не совсем корректно загружаем картинки. Есть у нас такая фича в боте, когда нужно просто тыкать на кнопку и бот тебе показывает новый мем:

Выяснили, что так как мы тащим фотки для бота в Типичном программисте из /dev/null, то VK не может их переиспользовать и каждый раз загружает новый экземпляр фотографии в диалог с подписчиком. Решили, что в будущем изменим эту процедуру, а пока VK просто удалит из диалогов с нашими подписчиками картинки, загруженные полгода назад и ранее.

Давайте всё же и некоторые успехи зафиксируем

Никита Панарин

Никита Панарин, разработчик ботов

В июне мы запустили продвинутую версию игры «Быки и коровы» в том же боте, про который рассказывает Паша.

Загадывается 4-значное число (цифры в нём не повторяются, а число может начинаться с 0), ваша цель — отгадать это число. После каждой попытки бот сообщает вам, сколько цифр угадано с совпадением их позиции в исходном числе (быки) и сколько угадано без совпадения с позицией (коровы). Можно поиграть с ботом или посоревноваться с друзьями, как вам больше нравится.

Присоединяйтесь к движу ВКонтакте или в Телеграм — поучаствовало уже больше 6 000 игроков.

Антон Брызгалов

Антон Брызгалов, разработчик аналитической инфраструктуры

Выше я говорил о том, что поломалась база данных нового трекера. Но это лишь небольшая неприятность на фоне серьёзного улучшения, которое мы реализовали в июне. В прошлых выпусках я рассказывал, что мы меняем аналитическое решение для трекинга событий с опенсорсного Rockstat на свою разработку, развернутую в Яндекс.Облаке. И вот наконец последнее событие из трекавшихся в старом инструменте переехало в наш новый трекер! Это события по баннерам, они переехали с историей, которая есть у нас аж с августа 2019 года. Вот на графике момент, когда к нам в трекер начали попадать свежие события:

Игорь — наш веб-разработчик

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

Михаил Сысоев

Михаил Сысоев, менеджер партнёрских проектов Tproger

Скажу пару слов об одной из новых фичей: мы поняли, что хотим автоматизировать размещение баннеров. Это нужно, чтобы не тратить кучу времени на согласования картинок и текстов и таким образом освободить себе и партнёрам драгоценные ресурсы, которые можно и нужно вкладывать во что-то более полезное. Так появился «мастер баннеров»: теперь чтобы запустить рекламу своего продукта под статьями у нас на сайте, нужно пройти всего пару шагов в специальном инструменте.

Аня Чуватова

Аня Чуватова, шеф-редактор сайта Tproger

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

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

В материале вы можете найти опрос. При этом мы не хотели провоцировать неконструктивный хейт на предмет расизма и «охреневших американцев», нам казалось важным перевести дискуссию в несколько другую плоскость. Вот скрин опроса:

Продолжая тему важных материалов: один из наших разработчиков поделился опытом и написал статью по расширениям для VS Code. Надеюсь, относительно скоро у нас на нашем же сайте появится свой блог со статьями от членов команды.

Ещё в июне мы выпустили тест, где надо угадать ОС по скриншоту. Я сосредоточилась на том, чтобы больше людей пообщались друг с другом, а потому старалась вызвать активное комментирование. В подводке рассказала, сколько сама набрала баллов при первом прохождении теста, попросила читателей писать «БИНГО», если они работали с каждой из перечисленных систем, а также в некоторых результатах добавила шуточный вопрос про то, что лучше: Windows или Linux.

В итоге на 23 700 просмотров пришлось 40 комментов. Для сравнения, в математическом тесте на 46 000 просмотров приходится 12 комментов. Тут стоило бы упомянуть, что есть куча дополнительных факторов, которые могли повлиять: другая тема, другая дата, другое соотношение источников трафика и так далее — но результат всё равно есть. И наверное был бы ещё круче, если бы у нас была своя платформа комментов, которая уже на подходе: мы знаем, что некоторые юзеры не могут подключиться к обсуждению, потому что не пользуются ВКонтакте, а у кого-то эта соцсеть вообще не работает из-за локации.

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

Кстати, если у вас есть пожелания по поводу рубрик и тем на сайте, задумки новых фичей и любые другие идеи по поводу улучшения нашего издания — присылайте на почту product@tproger.ru, обсудим.