Skip to content

corp-gp/corp-gp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

О компании

GroupPrice.ru – маркетплейс товаров, на площадке представлена продукция сотни поставщиков, основная специализация - женская одежда. Сборку заказа пользователя осуществляем на собственных площадях, складская логистика реализована по кросс-докинг модели (минимальные складские запасы). Загрузка товаров и синхронизация складских остатков происходит через YML формат.

  • Компании 14 лет. ~ 2 млн. посетителей в месяц
  • Общее количество сотрудников 100 человек.
  • Свой склад площадью 14500 кв.м. и офисы 2800 кв.м.

Технологический стек

  • RoR 8
  • Ruby 3.4
  • Dry-rb
  • Slim, SCSS
  • Hotwire, Stimulus, Vite.JS, Tailwind
  • Rspec
  • PostgreSQL 18
  • ClickHouse
  • rubocop, eslint, slim-lint, stylelint, prettier
  • kamal

Ключевая информация по организации работы

  • Официальное трудоустройство по ТК РФ
  • Гибкий график работы, но с 12 до 18 по мск нужно быть онлайн
  • Офис в Твери. Но все кто в ИТ-отделе работают удаленно
  • Для управления проектами используем свою тикет систему (ptask), которая тесно интегрирована с бизнес процессами
  • Переписка и чаты в Telegram
  • Ретроспективный еженедельный созвон, рассказываем о нововведениях, чтобы все были в курсе
  • Оплата книг, курсов, билетов на конференции
  • Собираемся на RubyRussia, вместе работаем одну неделю

IT-инфраструктура

Помимо площадки продаж ведется разработка нескольких проектов-спутников:

  • ptask - внутренняя тикет система, отражает коммуникационные связи организации (внутренние и внешние с поставщиками), интегрирована с Gitlab, telegram
  • psupplier - личный кабинет поставщика, позволяет контрагентам контролировать выгрузку товаров, предоставляет статистику по продажам, работать с ozon, wb, yandex
  • tracer - трекер ошибок (отлавливает все ошибки сайта), логирует все ответы сторонних API, хранит все изменения сущностей (Заказ, Товар...) - помогает быстро разбираться в проблемах
  • mailer - управление email и push рассылками

Работа над задачей

  1. Задача создается в тикет системе (ptask), из которой можно сразу создать Merge Request в Gitlab.
  2. Весь код проходит ревью. В проверке участвуют все сотрудники IT-отдела. Случайным образом выбираются 2 проверяющих (1 Senior и 1 Middle/Junior), которые автоматически добавляются к MR и получают уведомления о коммитах в Gitlab. В нем и проходит ревью кода.
  3. Локально на каждый коммит запускаются линтеры: rubocop, slim-lint, eslint, stylelint. Помимо этого в работе используется соглашение о стилях
  4. Для деплоя используется Gitlab CI/CD. После аппрува MR запускаются линтеры и тесты, при успешном завершении происходит автоматический deploy в production.

OpenSource

Собственные репозитории (в том числе поддерживаемые форки)

Pull requests

https://github.com/dry-rb/dry-effects

https://github.com/corp-gp/delayed_job

https://github.com/corp-gp/mini_sql

https://github.com/corp-gp/pronto-reek

https://github.com/corp-gp/pronto-brakeman

https://github.com/zaru/webpush

https://github.com/github/view_component

https://github.com/mileszs/wicked_pdf

Арихитектура Rails приложения

Все приложения реализуют серверный HTML рендеринг, в редких случаях результат отдается в JSON, с последующим рендерингом на клиенте. За счет этого имеются следующие преимущества:

  • быстрое, удобное, при необходимости изолированное или полное тестирование страницы без браузера
  • хорошее отслеживание ошибок (при возникновении в коде любой не понятной ситуации приложение должно падать, вместо проглатывания ошибки и некорректной тихой работы)
  • при изменении HTML верстки не требуется полная перезагрузка страницы (если используется Turbo)

Бизнес-логика распределена по доменам, домены состоят из различных слоев: Services, Forms, Decorators, Repositories, Queries. Набор слоёв в каждом случае определяется относительно задачи, не стоит размазывать мелкую функциональность по всем слоям. Бизнес код - самая ценная и сложная часть приложения, для успешного решения задачи всегда надо понимать смысл решаемой задачи. В ИТ индустрии есть попытки формирования подхода к написанию бизнес кода:

  • DDD
  • Луковая (слоистая) архитектура

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

Переменные, методы, поля таблиц должны именоваться в терминах бизнеса, при изменении бизнес правил - переименовываться, дабы избежать путаницы, поддерживать общение с коллегами вне ИТ отдела на одном языке. Явная зависимость в коде (Inversion of Control Containers) почти всегда лучше неявной (Mixins).

Работа с базой данных

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

Для общения с Postgresql используются:

ActiveRecord

  • написания бизнес логики (в сервис объектах), удобно - построчное обновление с логированием всех изменений сущности, связи между объектами
  • простые операции типа find, destroy, update_all
  • быстрая компиляция запроса в sql (builder от 3х быстрее ActiveRecord)
  • быстрая сериализация данных из БД, экономия памяти. Быстрее, как создание объектов из строки, так и вызов методов у инстанса (быстрее ActiveRecord от 7х, если используются временные столбцы timestamp, преимущество 10x раз)
  • ручной контроль prepared statements
  • переиспользуется соединение с БД от ActiveRecord

Frontend

Вся логика отображения хранится на сервере, пишется на slim шаблонизаторе, за счет использования mini_sql удается минимизировать время работы ruby кода, 90% всех действий это выборка объектов из БД и вызовы их методов.

Переходы внутри сайта работают быстро за счет https://github.com/turbolinks/turbolinks - не тратится время на компиляцию JS в браузере, CSS парсинга.

Логика на JS минимальна, используется минималистичный фреймворк https://stimulusjs.org совместимый с turbo и turbo frames/tags. Новый код пишется на es6 и typescript, используются нативные методы.

Для удобного переиспользования, простого тестирования и инкапсуляции шаблонов используется - https://github.com/github/view_component

Производительность

Пользователю должно быть комфортно пользоваться сайтом на ПК и телефоне. Производительность важна как на бекенде, так и на форонтенде. Разработчику необходимо думать об оптимальности кода, разбираться в тонкостях БД, делать бенчмарки, иметь представление о работе ruby интерпретатора.

Существует исследование, которое выявило зависимость между временем реакции и субъективным восприятием пользователя:

Задержка реакции, мс Восприятие пользователем
0-100 Мгновенная реакция
100-300 Небольшая, но заметная задержка
300-1000 Система работает, но нагружена
1000-10000 Вероятное переключение мыслей на другие задачи
10000 и более Задача отменяется (система не работает)

Среднее время ответа нашего бекенда 65 мс,учитывая что в основном каждый запрос отдает html, неплохой результат. image

Половина времени уходит на выполнение SQL запросов, на страницах каталога сложные запросы для фильтрации, персональные сортировки, для обеспечения приемлемой производительности требуется глубокое понимание работы сайта - настройка nginx, кэши, защита от ddos, перезагрузка приложения без простоя, понимание работы rails, ruby, настройка параметров БД и знание подходов к оптимизации sql.

PageSpeed Insights

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

Знаете как сделать еще быстрее? Пишите https://t.me/a_ermolaev

About

GP Dev Culture

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors