Основа 2.0 Статьи редакции

Changelog и технический post-mortem перезапуска.

На самом деле написать чейнджлог у меня не выйдет. После пары месяцев записывания того, что мы поменяли во второй версии Основы, я понял, что проще будет записать то, что осталось как раньше. Вот так выглядит сравнение двух версий на Github — 3109 изменённых файлов, 300 000 изменённых строк (но часть из них, конечно, технические).

Основа — это платформа, на которой сейчас работают сайты Комитета: vc.ru, DTF и TJ. Мы начали писать её два года назад, в ноябре 2016 года. Тогда каждый из трёх сайтов имел собственный движок. Баги в каждом нужно было исправлять отдельно, фичи реализовывать по несколько раз. Очевидно, долго так продолжаться не могло.

В 2017 году начался переезд всех проектов на Основу — сначала DTF, затем TJ и потом vc.ru. Так мы добрались до начала 2018 года — и у нас накопилось много вещей, которые хотелось бы изменить. Первая версия движка не предусматривала никаких разделов, кроме заранее захардкоженных — для каждого зачастую была какая-то своя логика (чего стоила Аляска, не попадающая в ленты). Параллельно на vc.ru стало появляться всё больше страниц компаний, которые требовали создание новой сущности — с возможностью вселяться в неё сотрудникам.

В этот момент неосторожное предложение технического отдела «так давайте сделаем одной сущностью пользователей, компании и подсайты» дало рождение новой версии вашего любимого сайта. Вместе с этим вакансии, сделанные как MVP на коленке за месяц, стали одной сущностью вместе со статьями. Аналогично поступили и со статичными страницами вроде правил сайта — раньше это было просто html-файлы. Теперь их можно верстать в редакторе силами любого сотрудника, необязательно привлекать для этого разработчиков.

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

Часть задач, вынесенных на рефакторинг

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

Отвлечёмся на секунду и я расскажу, что такое Подсайт и Контент. Это две основополагающие сущности всего сайта. Подсайт — это всё, что генерирует или содержит Контент. То есть с точки зрения базы данных никакой разницы между пользователем, компанией или подсайтом нет. Каждый из них может быть как автором контента, так и его владельцем.

Например, когда я пишу этот пост, в поле creator_id будет проставлен мой id, а в поле owner_id — id подсайта «TJ», в который я и пишу. Но я могу изменить creator_id на id «TJ» и тогда «TJ» напишет сам в себя — так тоже можно. Или можно взять компанию и написать от её имени в любой подсайт — тогда она будет отображаться в качестве автора. Как вы уже догадались, это значит, что технически каждый пользователь может писать сам в себя — так мы получим личные блоги.

Если я сотрудник Комитета и хочу от имени компании написать пост на vc.ru мне нужно в неё вселиться. Мы разрабатывали это по аналогии с фейсбуком, где можно комментировать или лайкать от имени своих страниц. Теперь у нас можно так же. Поэтому нам пришлось отделить подсайты (пользователей, компании) от их логинов, и каждый логин может вселяться в неограниченное количество подсайтов, которые ему подвластны. Ширяев, например, может вселиться в подсайт Сломалось и ставить вам лайки по всему TJ. Для этого ему не придётся как-то отдельно логиниться, он просто переключит аватарку в шапке.

Когда мы реализовывали вселение, мы столкнулись с такой проблемой — когда пользователь покупает подписку на TJ, то подписка должна привязываться к логину или к подсайту?

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

Отдельной проблемой на Основе 1.0 для нас были комментарии. Вообще, начать рассказывать надо с того, как у нас работало кэширование. А работало оно так: все страницы сайта были закэшированы на уровне nginx, а персональные данные вставлялись с помощью ajax-запросов. Это позволяло держать любую нагрузку (если мы где-то не косячили) — пользователю моментально показывалась страница из супербыстрого кэша, а потом догружалась аватарка в шапке, оценки постов и комментарии. Всё было хорошо, пока мы не за***лись инвалидировать этот кэш и писать бесконечные запросы, чтобы отобразить хоть сколько-нибудь динамичную фигню — в противном случае она могла закэшироваться на час.

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

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

В общем, зарелизили мы вторую версию Основы на DTF только в конце мая. Вскоре после этого vc.ru начал задыхаться без функциональности компаний — пришлось менять привычный уклад и перезапускать во вторую очередь его. Это дало такой буст, что следующие пару месяцев мы релизили множество новых фич, отлаживая механизмы работы ленты и всяких настроек, с которыми вот и приехали на TJ.

На самом деле вторая версия Основы отличается от первой практически каждой строчкой кода — когда мы создавали первую версию Основы мы не знали, куда нас это приведёт, и основной фичей для нас была возможность иметь одну платформу для трёх сайтов. Спустя два года мы имеем огромную платформу с внушительным списком функций. Когда мы релизили DTF 2.0 нужно было сделать код-ревью всему новому коду. Я садился и пытался просто файл за файлом прочитать код проекта в поисках багов и мест для оптимизации, и в конце дня я понимал, что не дошёл даже до середины — количество кода просто огромное.

В общем, мы немного передохнём и снова двинемся вперёд — у нас огромное количество ещё не реализованных фич, и мы не собираемся останавливаться. Подробнее о текущих изменения и о наших планах мы напишем отдельно.

Спасибо ребятам из нашей великолепной команды разработки:

Паша, Мурод, Гоша, Абдужаббор (бэкенд)

Петя, Артём, Мика (фронтенд)

Слава, Кирилл, Макс (мобильные приложения)

Валера и Женя (спецпроекты)

Александр, Лёша и Костя (дизайн)

Влад, Филипп, Денис и Орзик (продукт и менеджмент)

0
155 комментариев
Написать комментарий...
Илья Рычагов

Давайте все-таки засунем vc и d*f в подсайты tjournal, чтобы восстановить справедливость во имя всего

Ответить
Развернуть ветку
Человеческий Гоша

НИНАДА БЛЯДЬ

Ответить
Развернуть ветку
1 комментарий
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Занятый утюг
каждый пользователь может писать сам в себя

Ну физически это было возможно и без вашей основы

Ответить
Развернуть ветку
Виталий Лановой

Это как?

Ответить
Развернуть ветку
5 комментариев
Пышный Паша

Комментарий недоступен

Ответить
Развернуть ветку
Слава Крайнов

Тестированием занимается Орзик

Ответить
Развернуть ветку
4 комментария
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Культурный паркур

И не говори

Ответить
Развернуть ветку
1 комментарий
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Банальный вентилятор

Решили побыстрому на пивко срубить донатов

Ответить
Развернуть ветку
Культурный паркур

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

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
4 комментария
Избытокъ Хромосомъ
Ответить
Развернуть ветку
Занятый утюг

ВСЕ РАВНО?

Ответить
Развернуть ветку
1 комментарий
Vyacheslav Gorin
чего стоила Аляска, не попадающая в ленты

if (post.CategoryName != "alaska")
posts.Add(post);

Ответить
Развернуть ветку
Пользователь Сайта

и if (site == 'tj') еще!

Ответить
Развернуть ветку
4 комментария
Занятый утюг

Круто! Спасибо за пост!

Ответить
Развернуть ветку
Магнитный утюг

Илья, есть ли возможность по ссылке из прямого эфира идти в нормальные коменты, а не в одну ветку?

Условно то, что есть сейчас это потому что иначе упадет сервер, или прихоть Ширяева (бла бла про старые компы типа пихто, которые еле ос загружают)?

И еще, почему вместо прежнего прекрасного цитирования сделали вот такое (в чем причина)?

Ответить
Развернуть ветку
Культурный паркур

Это техническое ограничение — и Ширяев лоббирует как раз нахождение способа его обойти.

Вкратце выходит так: мы имеем id коммента и должны отрендерить страницу с комментариями так, чтобы этот коммент был на этой странице (а его может не быть, если он в глубине веток) и мы могли к нему проскроллить. Мы попробуем найти способ рендерить комменты вокруг указанного, но это не так просто.

Проблема с нагрузкой и на серверной стороне (1000 комментов занимают уйму памяти в текущей архитектуре) и на клиентской, где браузерам тяжело рендерить столько комментов (а там и аватарки и кому ответил и три точки и оценки, в общем, куча слоёв).

Потому что дизайн.

Ответить
Развернуть ветку
28 комментариев
Times Roman

А для моб приложения планируется горизонтальный формат? С него было бы удобнее читать лонгриды.

Ответить
Развернуть ветку
Человеческий Гоша

Лонгриды читать горизонтально? Эээ..

Ответить
Развернуть ветку
1 комментарий
Слава Крайнов

Для Android нет планов

Ответить
Развернуть ветку
12 комментариев
Yuliy Galkin

Плюсанул за горизонтальный формат, но не понимаю, как так можно читать лонгриды. Если только на планшетах, и то хз

Ответить
Развернуть ветку
2 комментария
Pavel Averyanov

Наконец технический топик, грасиас. Осталось развести под постом какой-нить холивар и будет как в старые добрые.

нужно было грузить комменты с бэка вместе с телом страницы

О чем мы вам твердили всем клубом при прошлом релизе. Всего лишь за год образумились, уже неплохо. Хоть не как некоторые проекты, которые так и принципиально тянут свои неудачные решения годами, потому что когда-то посчитали их верными

То есть с точки зрения базы данных никакой разницы между пользователем, компанией или подсайтом нет

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

Ответить
Развернуть ветку
Культурный паркур
Всего лишь за год образумились

Ну осознали ошибку мы быстрее, просто такой большой кусок не так просто переписать быстро.

Вижу излишнее желание сделать красивую абстракцию. По мне так обрекаете себя на излишние валидации и баги

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

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

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

Ответить
Развернуть ветку
4 комментария
Пук Среньков

А што у вас с гендерным и расовым разнообразием в команде м?

Ответить
Развернуть ветку
Культурный паркур

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

Ответить
Развернуть ветку
2 комментария
Саша

И спасибо за баг, позволяющий читать все комменты без подписки!

Ответить
Развернуть ветку

Комментарий удален модератором

Развернуть ветку
1 комментарий
Занятый утюг

Ага. Баг.

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Гигантский алмаз

Комментарий недоступен

Ответить
Развернуть ветку
Удобный корабль

Комментарий недоступен

Ответить
Развернуть ветку
1 комментарий
Гигантский алмаз

Комментарий недоступен

Ответить
Развернуть ветку
Константин Курасов

всегда готов натравить своих павуков

Ответить
Развернуть ветку
1 комментарий
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
DELETED

Спасибо за работу!

Ответить
Развернуть ветку
Vasiliy Yvapyvapov
пока мы не за***лись инвалидировать этот кэш

почему бы и не заебаться?

нужно было грузить комменты с бэка вместе с телом страницы, а это значило распрощаться с нашим прекрасным кэшированием

Varnish ESI может частично решить эту проблему

Ответить
Развернуть ветку
Культурный паркур

Если интересно, я вот не так давно рассказывал про нашу систему кэширования (англ.) и у меня остались слайды

https://docs.google.com/presentation/d/1Zjsg4g9obOnMaF4HEoqtWS9xjG5N7_uycEqK1v3asTs/edit?usp=sharing

Ответить
Развернуть ветку
2 комментария
Культурный паркур

Потому что при малейших изменениях иногда надо половину сайта проинвалидировать. У нас был механизм который просто таймстемп последней инвалидации писал в мемкеш, а nginx с модулем на lua проверял и либо грузил из кэша, либо шёл на бэкенд.

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

Ну и каждый дополнительный уровень приносит дополнительные баги и сложность.

Ответить
Развернуть ветку
8 комментариев
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Культурный паркур

Там внизу же целый список

Ответить
Развернуть ветку
2 комментария
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Культурный паркур

Делаем, но когда рефакторишь какую-нибудь оплату и там изменений на 2000 строк, то конечно это PR сложно качественно отревьюить. В течение рефакторинга накапливается много таких кусков. А так каждый пул реквест должен получить approve перед мерджем в мастер.

Ответить
Развернуть ветку
Владимир Ядерное Солнышко

Под капотом «самописный» движок на PHP?

Ответить
Развернуть ветку
Культурный паркур

Да

Ответить
Развернуть ветку
8 комментариев

Комментарий удален модератором

Развернуть ветку
Культурный паркур

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

Ответить
Развернуть ветку
3 комментария
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Культурный паркур
Ответить
Развернуть ветку
Удобный корабль

Комментарий недоступен

Ответить
Развернуть ветку
Центральный магнит

Не буду врать - не профессионально сделано, сорри за прямоту

Ответить
Развернуть ветку
Центральный магнит

Кстати могу писать только в приложении, на сайте ничего не работает

Ответить
Развернуть ветку
Культурный паркур

Да не проблема, а что именно не так?

Ответить
Развернуть ветку
6 комментариев
DELETED

Интересно, приведет ли это три сайта к общей платформе, в итоге: к общему кросс-логину (либо вообще одному аккаунту), единому центру уведомлений, к общей системе оплаты и даже одному домену?

Ответить
Развернуть ветку
Читать все 155 комментариев
null