GroupPrice.ru – маркетплейс товаров, на площадке представлена продукция сотни поставщиков, основная специализация - женская одежда. Сборку заказа пользователя осуществляем на собственных площадях, складская логистика реализована по кросс-докинг модели (минимальные складские запасы). Загрузка товаров и синхронизация складских остатков происходит через YML формат.
- Компании 10 лет. ~ 2 млн. посетителей в месяц
- Общее количество сотрудников 100 человек.
- Свой склад площадью 14500 кв.м. и офисы 2800 кв.м.
- RoR 7
- Ruby 3.1
- Dry-rb
- Slim, SCSS
- Hotwire, Stimulus, Vite.JS
- Rspec
- PostgreSQL 15
- ClickHouse
- rubocop, eslint, slim-lint, stylelint, prettier
- Официальное трудоустройство по ТК РФ
- Гибкий график работы, но с 12 до 18 по мск нужно быть онлайн
- Офис в Твери. Но все кто в ИТ-отделе работают удаленно
- Для управления проектами используем свою тикет систему (
ptask
), которая тесно интегрирована с бизнес процессами - Переписка и чаты в Telegram
- Ретроспективный еженедельный созвон, рассказываем о нововведениях, чтобы все были в курсе
- Оплата книг, курсов, билетов на конференции
- Собираемся на RubyRussia, вместе работаем одну неделю
Помимо площадки продаж ведется разработка нескольких проектов-спутников:
ptask
- внутренняя тикет система, отражает коммуникационные связи организации (внутренние и внешние с поставщиками), интегрирована с Gitlabpscheduler
- управляет запуском фоновых задач, в основеdelayed_job
supplier
- личный кабинет поставщика, позволяет контрагентам контролировать выгрузку товаров, предоставляет статистику по продажамtracer
- трекер ошибок (отлавливает все ошибки сайта), логирует все ответы сторонних API, хранит все изменения сущностей (Заказ, Товар...) - помогает быстро разбираться в проблемахmailer
- управление email и push рассылками
- Задача создается в тикет системе (
ptask
), из которой можно сразу создать Merge Request в Gitlab. - Весь код проходит ревью. В проверке участвуют все сотрудники IT-отдела. Случайным образом выбираются 2 проверяющих (1 Senior и 1 Middle/Junior), которые автоматически добавляются к MR и получают уведомления о коммитах в Gitlab. В нем и проходит ревью кода.
- Локально на каждый коммит запускаются линтеры: rubocop, slim-lint, eslint, stylelint. Помимо этого в работе используется соглашение о стилях.
- Для деплоя используется Gitlab CI/CD. После аппрува MR запускаются линтеры и тесты, при успешном завершении происходит автоматический deploy в production.
- https://github.com/corp-gp/rails_string_enum
- https://github.com/corp-gp/activerecord-clean-db-structure
- https://github.com/corp-gp/lintbot
- https://github.com/corp-gp/rubocop-gp
- https://github.com/corp-gp/factory_bot-preload
- https://github.com/corp-gp/email_stylist
https://github.com/dry-rb/dry-effects
https://github.com/corp-gp/delayed_job
https://github.com/corp-gp/mini_sql
- @xronos-i-am - Fix symbol param encoder
- @ermolaev - add query_array
- @ermolaev - add query_decorator
- @ermolaev - empty array encoding compatibility with Sequel and ActiveRecord
- @ermolaev - improve test_query_decorator
- @ermolaev - remove double checked empty params
- @ermolaev - support prepared statements
- @xronos-i-am & @ermolaev - Serializable materializer
- @xronos-i-am - Compacted JSON serialization
- @xronos-i-am - Marshallable serializer
- @ermolaev - fix encode date
- @ermolaev - real to_sql
- @ermolaev - add query_array and group_by to builder
- @xronos-i-am - Results equality
- @xronos-i-am - allow multiple occurencies of builder statements
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
Все приложения реализуют серверный HTML рендеринг, в редких случаях результат отдается в JSON, с последующим рендерингом на клиенте. За счет этого имеются следующие преимущества:
- быстрое, удобное, при необходимости изолированное или полное тестирование страницы без браузера
- хорошее отслеживание ошибок (при возникновении в коде любой не понятной ситуации приложение должно падать, вместо проглатывания ошибки и некорректной тихой работы)
- при изменении HTML верстки не требуется полная перезагрузка страницы (если используется Turbolinks)
Бизнес-логика распределена по доменам, домены состоят из различных слоев: Services, Forms, Decorators, Repositories, Queries. Набор слоёв в каждом случае определяется относительно задачи, не стоит размазывать мелкую функциональность по всем слоям. Бизнес код - самая ценная и сложная часть приложения, для успешного решения задачи всегда надо понимать смысл решаемой задачи. В ИТ индустрии есть попытки формирования подхода к написанию бизнес кода:
- DDD
- Луковая (слоистая) архитектура
Если с философской точки зрения сообщество разработчиков более-менее в консенсусе, то предлагаемая практическая реализация, практически от любого автора, вызывает больше вопросов чем ответов. Поэтому окончательное решение за разработчиком, принятыми в команде соглашениями и подходами.
Переменные, методы, поля таблиц должны именоваться в терминах бизнеса, при изменении бизнес правил - переименовываться, дабы избежать путаницы, поддерживать общение с коллегами вне ИТ отдела на одном языке. Явная зависимость в коде (Inversion of Control Containers) почти всегда лучше неявной (Mixins).
Бизнес-логика и пользовательские интерфейсы эволюционируют довольно быстро, структурам данных и их отношениям это не свойственно. Правила предметной области, закодированные в модели данных имеют долгосрочный характер, и не теряются при изменениях в логике приложения. Потеря, порча, не консистентность данных самая страшная ошибка.
Для общения с Postgresql используются:
- написания бизнес логики (в сервис объектах), удобно - построчное обновление с логированием всех изменений сущности, связи между объектами
- простые операции типа find, destroy, update_all
- быстрая компиляция запроса в sql (builder от 3х быстрее ActiveRecord)
- быстрая сериализация данных из БД, экономия памяти. Быстрее, как создание объектов из строки, так и вызов методов у инстанса (быстрее ActiveRecord от 7х, если используются временные столбцы
timestamp
, преимущество 10x раз) - ручной контроль prepared statements
- переиспользуется соединение с БД от ActiveRecord
Вся логика отображения хранится на сервере, пишется на slim шаблонизаторе, за счет использования mini_sql
удается минимизировать время работы ruby кода, 90% всех действий это выборка объектов из БД и вызовы их методов.
Переходы внутри сайта работают быстро за счет https://github.com/turbolinks/turbolinks - не тратится время на компиляцию JS в браузере, CSS парсинга.
Логика на JS минимальна, используется минималистичный фреймворк https://stimulusjs.org совместимый с turbolinks
. Новый код пишется на es6, без jquery, используются нативные методы и полифилы для них.
Для удобного переиспользования, простого тестирования и инкапсуляции шаблонов используется - https://github.com/github/view_component
Пользователю должно быть комфортно пользоваться сайтом на ПК и телефоне. Производительность важна как на бекенде, так и на форонтенде. Разработчику необходимо думать об оптимальности кода, разбираться в тонкостях БД, делать бенчмарки, иметь представление о работе ruby интерпретатора.
Существует исследование, которое выявило зависимость между временем реакции и субъективным восприятием пользователя:
Задержка реакции, мс | Восприятие пользователем |
---|---|
0-100 | Мгновенная реакция |
100-300 | Небольшая, но заметная задержка |
300-1000 | Система работает, но нагружена |
1000-10000 | Вероятное переключение мыслей на другие задачи |
10000 и более | Задача отменяется (система не работает) |
Среднее время ответа нашего бекенда 65 мс,учитывая что в основном каждый запрос отдает html, неплохой результат.
Половина времени уходит на выполнение SQL запросов, на страницах каталога сложные запросы для фильтрации, персональные сортировки, для обеспечения приемлемой производительности требуется глубокое понимание работы сайта - настройка nginx, кэши, защита от ddos, перезагрузка приложения без простоя, понимание работы rails, ruby, настройка параметров БД и знание подходов к оптимизации sql.
Измерения необходимо проводить с одного и того же устройства, тестируется страница каталога - платье, как самая покупаемая вещь одежды
- https://groupprice.ru/categories/platiya-jens - mobile 70, desktop 98
- https://www.ozon.ru/category/platya-zhenskie-7502/ - mobile 52, desktop 80
- https://www.lamoda.ru/c/369/clothes-platiya/ - mobile 29, desktop 68
- https://www.wildberries.ru/catalog/zhenshchinam/odezhda/platya - mobile 18, desktop 48
- https://www.bonprix.ru/kategoriya/dlya-zhenshchin-odezhda-platya/ - mobile 35, desktop 68
Знаете как сделать еще быстрее? Пишите https://t.me/a_ermolaev