Giter Club home page Giter Club logo

О компании

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, вместе работаем одну неделю

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

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

  • ptask - внутренняя тикет система, отражает коммуникационные связи организации (внутренние и внешние с поставщиками), интегрирована с Gitlab
  • pscheduler - управляет запуском фоновых задач, в основе delayed_job
  • supplier - личный кабинет поставщика, позволяет контрагентам контролировать выгрузку товаров, предоставляет статистику по продажам
  • 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 верстки не требуется полная перезагрузка страницы (если используется Turbolinks)

Бизнес-логика распределена по доменам, домены состоят из различных слоев: 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 совместимый с turbolinks. Новый код пишется на es6, без jquery, используются нативные методы и полифилы для них.

Для удобного переиспользования, простого тестирования и инкапсуляции шаблонов используется - 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

corp-gp's Projects

corp-gp doesn’t have any public repositories yet.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.