Бэкенд-разработчик Ruby (Профессиональный уровень)
Описание программы
Курс «Бэкенд-разработчик Ruby (Professional) » предназначен для опытных разработчиков, уже владеющих основами Ruby и желающих выйти на профессиональный уровень. Курс охватывает углублённое изучение фреймворка Ruby on Rails, проектирование сложных архитектур, оптимизацию производительности, работу с базами данных, REST API, тестирование, безопасность и деплой. Обучение построено на практике — от реализации масштабируемых веб-приложений до рефакторинга legacy-кода и применения best practices.
Что предстоит пройти на курсе
Модуль 1: Продвинутое программирование на Ruby
- Метапрограммирование
- Работа с блоками, лямбдами, Proc
- Миксины, модули и трейты
- Сложные объектно-ориентированные паттерны
- Работа с исключениями и контрактами
Модуль 2: Продвинутый Ruby on Rails
- Глубокое понимание MVC-архитектуры
- Разработка сервисных объектов, декораторов, политики доступа
- Расширение возможностей Rails через Railties и Engines
- Использование ActiveJob, ActionMailer, ActionCable
- Интеграция сторонних библиотек и гемов
Модуль 3: Базы данных и ORM
- Углублённая работа с ActiveRecord
- Паттерны работы с данными: Repository, Query Object
- Агрегация, группировка, оконные функции в SQL
- Оптимизация запросов: N+1, eager loading, индексы
- Работа с PostgreSQL и MySQL на продвинутом уровне
Модуль 4: Архитектура приложений
- Clean Architecture, Hexagonal Architecture
- Декомпозиция бизнес-логики
- Разделение ответственности и Single Responsibility Principle
- Проектирование слоёв: model, service, policy, form object, etc.
- Внедрение зависимостей и контейнеры DI
Модуль 5: REST API и микросервисы
- Создание мощных RESTful API
- Версионирование API
- Авторизация и безопасность (JWT, OAuth)
- Работа с Grape и Sinatra
- Введение в микросервисную архитектуру и её реализация
Модуль 6: Тестирование и CI/CD
- Unit-тесты, интеграционные тесты, TDD
- RSpec, FactoryBot, Capybara, VCR
- Проверка покрытия кода тестами
- Настройка Continuous Integration (CI) и Continuous Deployment (CD)
- Автоматизация тестирования и деплоя
Модуль 7: Безопасность и производительность
- Защита от XSS, CSRF, SQLi, DoS
- Работа с Devise, Pundit, CanCanCan
- Логирование, мониторинг и обнаружение уязвимостей
- Оптимизация скорости работы приложения
- Кэширование: страницы, действия, частички, Redis
Модуль 8: Деплой и DevOps
- Работа с Docker, Docker Compose
- Настройка сервера: Ubuntu, Nginx, Puma, Sidekiq
- Развертывание на облачных платформах (AWS, Heroku, DigitalOcean)
- Использование Ansible / Chef / Puppet
- Мониторинг и логирование (Lograge, Sentry, Prometheus)
Финальный проект
- Разработка полноценного веб-приложения с REST API
- Реализация нескольких бизнес-модулей и интеграций
- Написание автоматизированных тестов
- Настройка CI/CD и деплоя на production-сервер
- Оптимизация производительности и подготовка к нагрузкам
Ожидаемые результаты после прохождения курса
Должен знать:
- Продвинутые возможности языка Ruby и фреймворка Rails
- Как проектировать архитектуру веб-приложений
- Принципы безопасности и защиты от атак
- Методы тестирования и автоматизации
- Как работать с базами данных на профессиональном уровне
- Особенности разработки и деплоя в команде
Должен уметь:
- Разрабатывать масштабируемые и тестируемые приложения
- Проектировать чистую и поддерживаемую бизнес-логику
- Писать эффективный, читаемый и документированный код
- Оптимизировать производительность и использовать кэширование
- Настраивать CI/CD и разворачивать приложения в бою
- Использовать современные практики DevOps и контейнеризации
Дополнительно:
- Знать основы микросервисной архитектуры
- Уметь рефакторить legacy-код
- Понимать принципы DRY, KISS, SOLID
- Уметь создавать собственные гемы и расширять Rails
- Знать подходы к A/B тестированию и метрикам
Формат обучения
Практико-ориентированный курс с лекциями, домашними заданиями, групповыми задачами и финальным капстонным проектом. Каждая тема сопровождается практической реализацией и проверкой кода. По итогам курса выпускники получают портфолио проектов, сертификат и рекомендации на стажировки или работу.
-
Что такое метапрограммирование и как оно применяется в Ruby?
Метапрограммирование — это подход, при котором программа может изменять собственное поведение во время выполнения. В Ruby его используют для автоматического создания методов, расширения классов и построения удобных DSL. -
Чем отличаются Proc, lambda и блоки в Ruby?
Proc — это объект, представляющий фрагмент кода. Lambda проверяет количество переданных аргументов и использует обычный return. Блок — временный фрагмент кода, передаваемый в метод. Используются для организации повторяемой логики и работы с коллекциями. -
Как работают миксины (mixins) в Ruby и зачем они нужны?
Миксины реализуются через модули и позволяют добавлять методы в класс без множественного наследования. Они помогают избежать дублирования кода и упрощают поддержку проекта. -
Что такое сервисные объекты и когда их стоит использовать в Rails?
Сервисные объекты содержат бизнес-логику, которая не относится ни к модели, ни к контроллеру. Их стоит применять, когда операция требует нескольких шагов или взаимодействия между разными частями приложения. -
Какие преимущества даёт использование декораторов в Ruby?
Декораторы отделяют логику отображения данных от самой бизнес-логики. Это упрощает тестирование, делает код чище и позволяет переиспользовать представление данных в разных контекстах. -
Что такое Railties и Engines в Rails и как они используются?
Railties — это основной компонент Rails, который управляет стартом приложения. Engines — это небольшие Rails-приложения, которые можно встраивать в другие приложения. Используются для разделения функциональности, например, выделения админки или API. -
Как работает ActiveRecord и какие задачи он решает?
ActiveRecord связывает таблицы базы данных с объектами в коде. Он позволяет легко выполнять запросы, сохранять данные, управлять отношениями между моделями и использовать миграции. -
Что такое паттерн Repository и почему он полезен в сложных приложениях?
Repository абстрагирует работу с данными, скрывая детали хранения. Он упрощает тестирование, позволяет менять источники данных и централизует логику выборки и сохранения. -
Какие виды join-запросов существуют в SQL и как они работают?
Inner Join выбирает совпадающие строки из двух таблиц. Left Join возвращает все строки из первой таблицы и совпадающие из второй. Right Join — наоборот. Full Join включает все записи из обеих таблиц. -
Что такое индексы в базе данных и зачем они нужны?
Индексы ускоряют выполнение запросов, создавая структуру для быстрого поиска. Они особенно важны для часто запрашиваемых столбцов, но замедляют операции вставки и обновления. -
Какие основные принципы Clean Architecture и как они применяются в Ruby?
Clean Architecture разделяет логику на уровни: внешняя часть зависит от внутренней, а не наоборот. Применяется через отделение бизнес-правил от фреймворков, баз данных и UI. -
Что такое Single Responsibility Principle и как его соблюдать в Ruby?
Этот принцип говорит, что класс должен иметь только одну причину для изменения. Соблюдается через разделение ответственности, использование модулей и маленькие, специализированные классы. -
Как работают версионирование API и почему оно важно?
Версионирование позволяет вносить изменения в API без нарушения обратной совместимости. Это важно, чтобы клиенты не ломались при обновлении серверной части. Реализуется через URL, заголовки или параметры запроса. -
Что такое JWT и как он используется для авторизации?
JWT — это токен в виде строки, содержащий данные о пользователе и срок действия. Используется для безсессионной авторизации: клиент получает токен после входа и отправляет его с каждым запросом. -
Какие основные различия между TDD и BDD?
TDD — это подход, при котором сначала пишут тесты, потом код. BDD фокусируется на поведении системы с точки зрения пользователя. BDD ближе к бизнес-требованиям, TDD — к технической реализации. -
Что такое RSpec и чем он отличается от MiniTest?
RSpec — популярный фреймворк для тестирования с понятным языком, близким к естественному. MiniTest — встроенный в Ruby легкий фреймворк, более производительный, но менее выразительный. -
Как работают моки и заглушки в тестировании?
Моки имитируют поведение объектов и проверяют, были ли вызваны нужные методы. Заглушки задают фиксированный ответ, не проверяя, как именно вызывался метод. Оба подхода нужны для изоляции тестируемого кода. -
Что такое XSS и как защититься от этой уязвимости в Ruby on Rails?
XSS — это атака внедрения вредоносного скрипта через поля ввода. Защита в Rails включает автоматическое экранирование вывода, использованиеsanitize
и ограничение разрешённых HTML-тегов. -
Как работает кэширование в Rails и какие его виды существуют?
Rails поддерживает кэширование страниц, действий и фрагментов. Также есть low-level кэширование черезRails.cache
. Основная цель — уменьшить нагрузку на сервер и базу данных. -
Что такое Redis и как он используется в Ruby-приложениях?
Redis — это in-memory хранилище данных. Используется для кэширования, очередей задач, хранения сессий и реализации систем уведомлений. -
Какие основные отличия Docker от виртуальных машин?
Docker использует контейнеры, которые легче и быстрее запускаются, так как делят ядро с хост-системой. Виртуальные машины эмулируют целую ОС, поэтому они медленнее и требуют больше ресурсов. -
Что такое CI/CD и как его настроить для Ruby-проекта?
CI/CD — это автоматизация сборки, тестирования и деплоя. Для Ruby можно использовать GitHub Actions, GitLab CI или CircleCI. Настройка включает этапы установки зависимостей, запуска тестов и деплоя на production-сервер. -
Что такое DevOps и как он связан с ролью Ruby-разработчика?
DevOps охватывает процессы разработки, тестирования, деплоя и эксплуатации. Ruby-разработчику важно понимать эти процессы, чтобы эффективно взаимодействовать с командой и обеспечивать бесперебойную работу приложений. -
Что такое Sidekiq и как он работает с ActiveJob?
Sidekiq — это очередь задач, работающая с Redis. ActiveJob — абстракция Rails для работы с очередями. Через ActiveJob можно легко переключаться между разными адаптерми, включая Sidekiq. -
Что такое гем и как создать свой гем в Ruby?
Гем — это пакет с кодом, который можно установить и использовать в других проектах. Чтобы создать свой гем, нужно использовать Bundler (bundle gem my_gem
) и заполнить структуру проекта, документацию и зависимости.
-
Что такое REST API и как он реализуется в Ruby on Rails?
REST API — это способ взаимодействия клиент-серверного приложения по стандартным HTTP-методам. В Rails его реализуют через контроллеры, возвращающие JSON или XML, и маршруты, соответствующие ресурсной структуре. -
Как работает аутентификация через OAuth в Ruby-приложениях?
OAuth позволяет пользователям войти через сторонние сервисы (например, Google или GitHub), не передавая свои учетные данные. Реализуется с помощью гемов Devise и OmniAuth. -
Что такое Sidekiq и как он помогает в обработке фоновых задач?
Sidekiq — это система очередей задач, использующая Redis для хранения заданий. Он позволяет выполнять тяжелые операции в фоне, не блокируя основной процесс запроса. -
Почему важно использовать миграции в Rails и как они работают?
Миграции позволяют изменять структуру базы данных программно и согласованно между разными окружениями. Они создаются через генераторы и применяются командойrails db:migrate
. -
Какие преимущества даёт использование FactoryBot вместо фабрик на чистом Ruby?
FactoryBot предоставляет удобный DSL для создания тестовых объектов с преднастроенными значениями. Это упрощает написание тестов и делает их более читаемыми и поддерживаемыми. -
Что такое Rake и как он используется в Ruby-проектах?
Rake — это инструмент для автоматизации задач, аналогичный make в Unix. Используется для запуска миграций, очистки данных, импорта и других повторяющихся действий. -
Как работают callback-функции в ActiveRecord и когда их стоит использовать?
Callback-функции вызываются в определённые моменты жизненного цикла модели, например, до сохранения или после удаления. Используются для изменения данных перед записью или отправки уведомлений. -
Что такое Rack и как он связан с Ruby on Rails?
Rack — это интерфейс между веб-серверами и Ruby-приложениями. Rails построен на основе Rack и использует его для обработки HTTP-запросов и middleware. -
Какие основные отличия между Capybara и RSpec при тестировании?
Capybara используется для тестирования пользовательского интерфейса и поведения браузера. RSpec больше ориентирован на юнит-тестирование логики. Оба могут использоваться вместе. -
Что такое VCR и как он помогает в тестировании внешних API-вызовов?
VCR записывает реальные HTTP-запросы и сохраняет их в виде "кассет", чтобы повторно использовать в тестах. Это ускоряет выполнение тестов и делает их независимыми от внешних систем. -
Как работает авторизация с помощью Pundit в Rails?
Pundit реализует политики доступа на уровне объектов. Для каждого ресурса создается класс политики, который проверяет, может ли текущий пользователь выполнять действие. -
Что такое DevOps и как он связан с ролью Ruby-разработчика?
DevOps охватывает процессы разработки, тестирования, деплоя и эксплуатации. Ruby-разработчику важно понимать эти процессы, чтобы эффективно взаимодействовать с командой и обеспечивать бесперебойную работу приложений. -
Какие преимущества даёт использование Docker в Ruby-проектах?
Docker упрощает настройку среды, изолирует зависимости, ускоряет развёртывание и гарантирует одинаковое поведение приложения на всех этапах: от разработки до production. -
Что такое Ansible и как он используется в деплое Ruby-приложений?
Ansible — это инструмент автоматизации конфигурации серверов. С его помощью можно автоматизировать установку зависимостей, настройку сервисов и запуск приложений без необходимости писать скрипты вручную. -
Какие основные метрики нужно отслеживать в production среде?
Ключевые метрики включают время отклика, количество ошибок, загрузку CPU и памяти, задержки базы данных, количество активных соединений и частоту запросов. -
Что такое A/B тестирование и как оно реализуется в Ruby-приложениях?
A/B тестирование сравнивает два варианта страницы или функции, чтобы понять, какой из них лучше. Реализуется через разделение пользователей по группам и сохранение результатов. -
Что такое DRY, KISS и SOLID и почему они важны в проектировании кода?
DRY — не повторяйся. KISS — держи просто. SOLID — набор принципов ООП. Все они направлены на улучшение читаемости, тестируемости и поддерживаемости кода. -
Какие проблемы могут возникнуть при использовании N+1 запросов и как их избежать?
N+1 приводит к множеству лишних SQL-запросов, что замедляет приложение. Решается через eager loading (includes
,eager_load
) или использование гема Bullet. -
Что такое Grape и как он используется в создании API?
Grape — это минималистичный фреймворк для создания RESTful API. Используется вместе с Rails или отдельно для микросервисов. -
Что такое Action Cable и как он работает с WebSockets?
Action Cable добавляет поддержку WebSocket в Rails. Позволяет организовать двустороннюю связь между клиентом и сервером, например, для чата или уведомлений в реальном времени. -
Что такое Capistrano и как он помогает в деплое?
Capistrano — это система автоматизации деплоя. Позволяет легко разворачивать приложения на серверах, выполнять миграции, перезапускать процессы и откатывать изменения. -
Как работает garbage collection в Ruby и почему он важен?
Garbage collector освобождает память, удаляя неиспользуемые объекты. От него зависит производительность и стабильность приложения, особенно при работе с большими объемами данных. -
Что такое ActiveSupport и какие полезные методы он предоставляет?
ActiveSupport — это часть Rails, расширяющая возможности языка. Предоставляет методы вродеpresent?
,in_time_zone
,try
,deep_dup
и другие, упрощающие работу с данными. -
Что такое Refile или Shrine и зачем они нужны?
Это гемы для работы с загрузкой файлов. Они предоставляют удобный интерфейс для обработки, хранения и валидации загружаемых файлов, в том числе изображений. -
Какие основные отличия между Heroku и DigitalOcean при развертывании Ruby-приложений?
Heroku — платформа как услуга, всё уже настроено, но дорого. DigitalOcean — облачный провайдер, где вы сами настраиваете сервер. Это дешевле и гибче, но требует больше знаний. -
Что такое Service Object и в чем его преимущество?
Service Object — это класс, который содержит бизнес-логику вне моделей и контроллеров. Он помогает уменьшить нагрузку на контроллеры и упрощает тестирование. -
Что такое Concerns в Rails и как их использовать?
Concerns — это модули, которые выносят общую логику из моделей и контроллеров. Помогают избавиться от дублирования кода и сделать его более читаемым. -
Что такое Repository Pattern и зачем он нужен?
Repository абстрагирует работу с данными. Упрощает тестирование, позволяет менять источники данных и централизует логику выборки и сохранения. -
Что такое Query Object и когда его стоит использовать?
Query Object инкапсулирует сложные SQL-запросы. Используется, когда логика выборки становится слишком сложной для модели. -
Что такое Form Object и как он помогает в обработке форм?
Form Object инкапсулирует валидацию и обработку формы вне модели. Полезен, когда форма затрагивает несколько моделей или имеет особую логику. -
Как работает garbage collection в Ruby и как он влияет на производительность?
Garbage collection освобождает память, удаляя неиспользуемые объекты. Частый GC может снижать производительность, поэтому важно управлять памятью. -
Что такое ORM и как ActiveRecord реализует этот подход?
ORM — это технология, связывающая объекты с таблицами базы данных. ActiveRecord — это ORM, используемый в Rails для работы с БД. -
Какие виды join-запросов существуют в SQL и как они работают?
Inner Join выбирает совпадающие строки из двух таблиц. Left Join возвращает все строки из первой таблицы и совпадающие из второй. Right Join — обратная ситуация. Full Join включает все записи. -
Что такое индекс в базе данных и как он ускоряет запросы?
Индекс — это структура, которая ускоряет поиск данных. Особенно полезен для часто запрашиваемых столбцов, но замедляет операции вставки и обновления. -
Что такое TDD и BDD и в чём их различия?
TDD — сначала пишутся тесты, потом код. BDD фокусируется на поведении системы с точки зрения пользователя. BDD ближе к бизнес-требованиям, TDD — к технической реализации. -
Что такое CI/CD и как его настроить для Ruby-проекта?
CI/CD — это автоматизация сборки, тестирования и деплоя. Для Ruby можно использовать GitHub Actions, GitLab CI или CircleCI. -
Какие основные компоненты входят в архитектуру Clean Architecture?
Clean Architecture включает слои: Entities, Use Cases, Interface Adapters, Framework & Drivers. Внутренние слои не зависят от внешних. -
Что такое MVC и как он реализован в Ruby on Rails?
MVC — это архитектурный паттерн, разделяющий приложение на модель, представление и контроллер. В Rails: модель — Active Record, контроллер — ActionController, представление — ActionView. -
Что такое декораторы в Ruby и зачем они нужны?
Декораторы добавляют поведение к объектам динамически, без изменения исходного класса. Используются для добавления логики отображения. -
Что такое Sidekiq и как он работает с Redis?
Sidekiq — это очередь задач, работающая через Redis. Задачи добавляются в очередь и выполняются асинхронно. -
Что такое VCR и как он помогает в тестировании внешних API?
VCR записывает HTTP-запросы и сохраняет их в виде кассет. Это ускоряет тесты и делает их независимыми от интернета. -
Что такое Devise и как он используется для аутентификации?
Devise — популярный гем для аутентификации. Предоставляет готовые контроллеры, маршруты и модели для регистрации, входа и восстановления пароля. -
Что такое Pundit и как он реализует авторизацию?
Pundит реализует политики доступа на уровне объектов. Позволяет проверять права пользователя перед выполнением действия. -
Что такое Docker Compose и как он используется в Ruby-проектах?
Docker Compose позволяет запускать несколько контейнеров одновременно, например, приложение + PostgreSQL + Redis. -
Что такое Redis и как он используется в Ruby-приложениях?
Redis — in-memory хранилище, которое используется для кэширования, очередей, хранения состояний и уведомлений. -
Что такое Grape и как он отличается от использования Rails для API?
Grape — это легковесный фреймворк для создания API. В отличие от Rails, он не требует всего стека и предлагает меньше возможностей, но быстрее работает. -
Что такое RSpec и как он помогает в тестировании?
RSpec — популярный фреймворк для тестирования, поддерживающий BDD-подход. Удобен для написания читаемых и документирующих тестов. -
Что такое Factory Bot и как он помогает в создании тестовых данных?
Factory Bot — библиотека для создания тестовых объектов. Поддерживает связи, traits и переопределение полей. -
Что такое Postgres и как он отличается от MySQL?
PostgreSQL — это мощная open-source СУБД с поддержкой JSON, window функций и full-text search. MySQL — более старая и простая СУБД, но менее гибкая. -
Что такое пулы соединений и зачем они нужны в Ruby?
Connection Pool управляет количеством соединений с БД. Позволяет избежать перегрузки базы данных при высоких нагрузках.
-
Какой гем используется для создания фоновых задач в Ruby?
A) Devise
B) Sidekiq
C) RSpec
D) Capybara
Правильный ответ: B) Sidekiq -
Что такое ActiveRecord в Rails?
A) Система маршрутизации
B) ORM для работы с базами данных
C) Инструмент для тестирования
D) Библиотека шаблонизатора
Правильный ответ: B) ORM для работы с базами данных -
Какой метод используется для предотвращения N+1 запросов в ActiveRecord?
A) where
B) includes
C) map
D) each
Правильный ответ: B) includes -
Какой фреймворк используется для REST API в Ruby, помимо Rails?
A) Grape
B) Puma
C) Capistrano
D) Pry
Правильный ответ: A) Grape -
Для чего используется гем Devise?
A) Для тестирования
B) Для авторизации
C) Для миграций
D) Для кэширования
Правильный ответ: B) Для авторизации -
Какой объект позволяет динамически создавать методы в Ruby?
A) Module
B) Proc
C) define_method
D) eval
Правильный ответ: C) define_method -
Что означает принцип DRY?
A) Don’t Repeat Yourself
B) Do Run Yourself
C) Data Reduce Yourself
D) Don’t Refactor Yourself
Правильный ответ: A) Don’t Repeat Yourself -
Как реализуется наследование в Ruby?
A) Через ключевое слово extends
B) Через ключевое слово include
C) Через <
D) Через module
Правильный ответ: C) Через < -
Какой инструмент используется для управления зависимостями в Ruby?
A) Bundler
B) Docker
C) Ansible
D) Capistrano
Правильный ответ: A) Bundler -
Что такое CI/CD?
A) Continuous Integration / Continuous Delivery
B) Cloud Infrastructure / Cloud Deployment
C) Code Iteration / Code Development
D) Control Input / Control Output
Правильный ответ: A) Continuous Integration / Continuous Delivery -
Какой гем используется для тестирования поведения пользовательского интерфейса?
A) RSpec
B) FactoryBot
C) Capybara
D) VCR
Правильный ответ: C) Capybara -
Что такое миграции в Rails?
A) Тестовые данные
B) Изменения в структуре базы данных
C) Логика бизнес-процессов
D) Файлы конфигурации
Правильный ответ: B) Изменения в структуре базы данных -
Какой файл определяет маршруты в Rails?
A) config.ru
B) routes.rb
C) application.rb
D) environment.rb
Правильный ответ: B) routes.rb -
Что представляет собой Rack?
A) ORM
B) Интерфейс между сервером и приложением
C) Система тестирования
D) Web framework
Правильный ответ: B) Интерфейс между сервером и приложением -
Какой метод используется для записи логов в Rails?
A) puts
B) p
C) logger
D) print
Правильный ответ: C) logger -
Что такое Service Object в Rails?
A) Контроллер
B) Объект, содержащий бизнес-логику
C) Модель
D) View helper
Правильный ответ: B) Объект, содержащий бизнес-логику -
Какой гем чаще всего используется для кэширования в Rails?
A) Sidekiq
B) Redis
C) Bullet
D) Devise
Правильный ответ: B) Redis -
Какой HTTP-статус возвращается при успешном запросе?
A) 200
B) 404
C) 500
D) 302
Правильный ответ: A) 200 -
Для чего используется метод method_missing в Ruby?
A) Для вызова случайного метода
B) Для создания ошибок
C) Для обработки вызова несуществующих методов
D) Для завершения программы
Правильный ответ: C) Для обработки вызова несуществующих методов -
Что описывает принцип KISS?
A) Keep It Simple, Stupid
B) Know It, Store Somewhere
C) Keep In Sync System
D) None of the above
Правильный ответ: A) Keep It Simple, Stupid -
Какой гем используется для версионирования API в Rails?
A) ActiveModelSerializers
B) Grape
C) Versionist
D) Swagger
Правильный ответ: C) Versionist -
Что такое Action Cable?
A) Инструмент для работы с HTTP
B) Интеграция с WebSocket
C) Система маршрутов
D) Механизм кэширования
Правильный ответ: B) Интеграция с WebSocket -
Какой тип безопасности защищает от XSS-атак в Rails?
A) CSRF protection
B) SQL injection filter
C) HTML escaping
D) Authentication
Правильный ответ: C) HTML escaping -
Для чего нужен гем Bullet?
A) Проверка производительности
B) Поиск N+1 запросов
C) Оптимизация изображений
D) Упрощение маршрутов
Правильный ответ: B) Поиск N+1 запросов -
Какой командой применяются миграции в Rails?
A) rails db:create
B) rails db:migrate
C) rails db:seed
D) rails db:reset
Правильный ответ: B) rails db:migrate
-
Какой гем используется для автоматизации процессов развертывания в Ruby?
A) pry
B) rake
C) capistrano
D) redis
Правильный ответ: C) capistrano -
Что описывает принцип SOLID?
A) Пять основных принципов ООП
B) Пять методов оптимизации баз данных
C) Сет правил работы с API
D) Формат написания миграций
Правильный ответ: A) Пять основных принципов ООП -
Какой файл в Ruby on Rails отвечает за настройку маршрутов?
A) config/application.rb
B) config/routes.rb
C) app/controllers/application_controller.rb
D) Gemfile
Правильный ответ: B) config/routes.rb -
Как называется подход, при котором бизнес-логика выносится из моделей и контроллеров в отдельные классы?
A) MVC
B) Repository Pattern
C) Service Objects
D) Active Record
Правильный ответ: C) Service Objects -
Что такое Rack middleware в Rails?
A) Модель данных
B) Слой между сервером и приложением
C) Контроллер
D) Вспомогательная функция
Правильный ответ: B) Слой между сервером и приложением -
Какой гем используется для создания пользовательских DSL в Ruby?
A) RSpec
B) Sidekiq
C) metaprogramming
D) Puma
Правильный ответ: C) metaprogramming -
Что делает метод try в ActiveSupport?
A) Вызывает случайный метод
B) Выполняет блок кода несколько раз
C) Позволяет вызвать метод у объекта, даже если он nil
D) Перезапускает программу
Правильный ответ: C) Позволяет вызвать метод у объекта, даже если он nil -
Какой тип проверки используется в Devise для ограничения доступа к ресурсам?
A) CSRF protection
B) SQL injection filter
C) Authentication
D) Authorization
Правильный ответ: D) Authorization -
Что такое Grape в экосистеме Ruby?
A) ORM
B) Тестовый фреймворк
C) Легковесный фреймворк для REST API
D) Инструмент деплоя
Правильный ответ: C) Легковесный фреймворк для REST API -
Какой гем позволяет записывать HTTP-запросы и использовать их в тестах повторно?
A) FactoryBot
B) VCR
C) Capybara
D) Bullet
Правильный ответ: B) VCR -
Какой командой создается база данных в Rails?
A) rails db:create
B) rails db:migrate
C) rails db:reset
D) rails db:setup
Правильный ответ: A) rails db:create -
Что такое garbage collection в Ruby?
A) Удаление неиспользуемых файлов
B) Освобождение памяти от неиспользуемых объектов
C) Очистка кэша
D) Удаление старых миграций
Правильный ответ: B) Освобождение памяти от неиспользуемых объектов -
Какой гем предоставляет удобный DSL для создания тестовых данных?
A) RSpec
B) FactoryBot
C) VCR
D) Pry
Правильный ответ: B) FactoryBot -
Какой метод используется для асинхронной загрузки данных в Rails?
A) include
B) eager_load
C) preload
D) background_job
Правильный ответ: D) background_job -
Что такое Concerns в Rails?
A) Модели
B) Модули для выноса общей логики
C) Тестовые данные
D) Вспомогательные классы
Правильный ответ: B) Модули для выноса общей логики -
Какой файл содержит зависимости проекта в Ruby?
A) routes.rb
B) Gemfile
C) application.rb
D) database.yml
Правильный ответ: B) Gemfile -
Какой из следующих принципов говорит, что класс должен иметь только одну причину для изменения?
A) Open/Closed Principle
B) Single Responsibility Principle
C) Liskov Substitution Principle
D) Dependency Inversion Principle
Правильный ответ: B) Single Responsibility Principle -
Какой инструмент позволяет выполнять задачи параллельно в Ruby?
A) Thread
B) Process
C) Fiber
D) Все вышеперечисленное
Правильный ответ: D) Все вышеперечисленное -
Что такое Action Cable в Rails?
A) Система маршрутов
B) Интеграция с WebSocket
C) ORM
D) Инструмент кэширования
Правильный ответ: B) Интеграция с WebSocket -
Какой тип кэширования используется для хранения результатов запросов к БД?
A) Page caching
B) Action caching
C) Fragment caching
D) Low-level caching
Правильный ответ: D) Low-level caching -
Какой гем используется для анализа производительности запросов к базе данных?
A) Bullet
B) VCR
C) Capybara
D) Rake
Правильный ответ: A) Bullet -
Что такое Refile или Shrine в Ruby?
A) ORM
B) Гемы для работы с файлами и изображениями
C) Инструменты тестирования
D) Фреймворки для API
Правильный ответ: B) Гемы для работы с файлами и изображениями -
Какой HTTP-статус означает временное перенаправление?
A) 200
B) 302
C) 404
D) 500
Правильный ответ: B) 302 -
Какой командой запускается консоль Ruby?
A) ruby console
B) irb
C) rails console
D) rspec
Правильный ответ: B) irb -
Что такое Docker в контексте Ruby-разработки?
A) Система контроля версий
B) Инструмент для построения изолированных сред выполнения
C) ORM
D) Фреймворк для тестирования
Правильный ответ: B) Инструмент для построения изолированных сред выполнения
-
Какой из следующих гемов используется для работы с тестами в Ruby?
A) Pry
B) RSpec
C) Sidekiq
D) Puma
Правильный ответ: B) RSpec -
Что такое миграция в Rails?
A) Перемещение данных между серверами
B) Изменение структуры базы данных
C) Обновление гемов
D) Переход на новую версию Rails
Правильный ответ: B) Изменение структуры базы данных -
Какой метод позволяет выполнить код только если объект не nil?
A) map
B) try
C) each
D) select
Правильный ответ: B) try -
Какой гем используется для создания и управления HTTP-запросами в тестах?
A) FactoryBot
B) VCR
C) Faraday
D) Pry
Правильный ответ: C) Faraday -
Что означает принцип KISS в разработке?
A) Делать всё максимально сложным
B) Делать всё просто и понятно
C) Использовать как можно больше паттернов
D) Писать много комментариев
Правильный ответ: B) Делать всё просто и понятно -
Какой тип кэширования применяется на уровне отдельных частей страницы?
A) Page caching
B) Action caching
C) Fragment caching
D) Low-level caching
Правильный ответ: C) Fragment caching -
Какой командой запускается консоль Rails?
A) rails console
B) irb
C) pry
D) rails dbconsole
Правильный ответ: A) rails console -
Что делает гем Bullet?
A) Ускоряет загрузку страниц
B) Помогает находить N+1 запросы
C) Тестирует пользовательский интерфейс
D) Упрощает деплой
Правильный ответ: B) Помогает находить N+1 запросы -
Какой из перечисленных гемов используется для автоматизации задач?
A) Rake
B) RSpec
C) Capybara
D) VCR
Правильный ответ: A) Rake -
Что представляет собой Sidekiq?
A) Система маршрутизации
B) Очередь фоновых задач
C) ORM
D) Инструмент тестирования
Правильный ответ: B) Очередь фоновых задач -
Какой тип проверки используется для подтверждения личности пользователя?
A) Authorization
B) Authentication
C) Validation
D) Verification
Правильный ответ: B) Authentication -
Что такое ActiveSupport в Rails?
A) ORM
B) Библиотека расширений языка Ruby
C) Система тестирования
D) Веб-сервер
Правильный ответ: B) Библиотека расширений языка Ruby -
Какой из следующих методов вызывается, когда у объекта нет нужного метода?
A) method_missing
B) send
C) respond_to?
D) public_send
Правильный ответ: A) method_missing -
Что такое Concern в контексте Rails?
A) Контроллер
B) Модель
C) Модуль, выносящий общую логику
D) View
Правильный ответ: C) Модуль, выносящий общую логику -
Какой из следующих фреймворков используется для построения микросервисов в Ruby?
A) Sinatra
B) Grape
C) Rails
D) Все вышеперечисленное
Правильный ответ: D) Все вышеперечисленное -
Какой HTTP-статус означает внутреннюю ошибку сервера?
A) 200
B) 302
C) 404
D) 500
Правильный ответ: D) 500 -
Что такое DevOps в контексте Ruby-разработки?
A) Процесс написания бизнес-логики
B) Автоматизация и интеграция процессов разработки и эксплуатации
C) Тестирование юнитов
D) Работа с базой данных
Правильный ответ: B) Автоматизация и интеграция процессов разработки и эксплуатации -
Какой гем используется для работы с Redis в Ruby?
A) redis
B) sidekiq
C) sequel
D) mongoid
Правильный ответ: A) redis -
Что такое CI/CD?
A) Continuous Integration / Continuous Delivery
B) Cloud Infrastructure / Cloud Deployment
C) Code Iteration / Code Development
D) Control Input / Control Output
Правильный ответ: A) Continuous Integration / Continuous Delivery -
Какой файл используется для хранения переменных окружения в Ruby-проектах?
A) .env
B) Gemfile
C) routes.rb
D) config.ru
Правильный ответ: A) .env -
Какой из следующих методов позволяет выбрать все элементы, соответствующие условию?
A) select
B) reject
C) find
D) detect
Правильный ответ: A) select -
Что такое API-first подход?
A) Разработка начинается с UI
B) Разработка начинается с бэкенда без учёта клиента
C) Разработка начинается с проектирования API
D) Разработка начинается с тестов
Правильный ответ: C) Разработка начинается с проектирования API -
Какой гем используется для документирования REST API в Ruby?
A) Swagger
B) RDoc
C) YARD
D) Markdown
Правильный ответ: A) Swagger -
Что такое Docker в Ruby-разработке?
A) Система контроля версий
B) Инструмент для создания изолированных сред
C) ORM
D) Фреймворк для тестирования
Правильный ответ: B) Инструмент для создания изолированных сред -
Какой из следующих принципов говорит, что программы должны зависеть от абстракций, а не от конкретных реализаций?
A) Single Responsibility Principle
B) Dependency Inversion Principle
C) Open/Closed Principle
D) Liskov Substitution Principle
Правильный ответ: B) Dependency Inversion Principle
Экзаменационный билет №1
Теоретическая часть
- Что такое паттерн проектирования Facade и зачем он нужен?
- Опишите принцип работы ORM ActiveRecord в Rails и поясните, почему оно является полезным инструментом для разработчиков backend на Ruby on Rails.
Ответы на теоретические вопросы:
- Паттерн Facade упрощает взаимодействие с системой сложной структуры, предоставляя единый интерфейс для взаимодействия с несколькими подсистемами. Например, он полезен для сокрытия деталей реализации сложного API-интерфейса от клиента, позволяя сосредоточиться лишь на необходимых функциях.
- ActiveRecord — встроенный ORM-фреймворк в Ruby on Rails, обеспечивающий удобный доступ к базам данных через объекты модели. Это помогает разработчикам абстрагироваться от SQL-запросов, облегчая работу с таблицами базы данных, отношениями моделей и миграциями схемы. Благодаря этому разработчики могут быстрее создавать прототипы приложений и поддерживать кодовую базу.
Практическая часть Написать метод find_by_name в классе Product, который ищет продукт по названию, используя ORM ActiveRecord.
class Product < ApplicationRecord
def self.find_by_name(name)
where("name LIKE ?", "%#{name}%")
end
end
Экзаменационный билет №2
Теоретическая часть
- Чем отличается статический метод от инстанцированного метода в Ruby?
- Поясните разницу между сессиями и куки в веб-приложениях на примере их использования в Rails.
Ответы на теоретические вопросы:
- Статический метод принадлежит классу и доступен непосредственно через имя класса, тогда как инстанцированный метод относится к экземпляру объекта и требует наличия объекта конкретного класса для вызова. Пример: методы классов (self.method) vs методы экземпляров объектов (@instance_method).
- Куки хранятся на стороне браузера и отправляются обратно серверу с каждым запросом. Они полезны для хранения небольших объемов данных, связанных с браузером. Сессии же управляются сервером и хранят состояние текущего сеанса пользователя, обеспечивая возможность авторизации и персонализации интерфейсов. Обычно сессии шифруются и подписываются, что повышает безопасность.
Практическая часть Реализовать простую аутентификацию пользователя с использованием сессий в контроллере Rails.
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
before_action :authenticate_user!
private
def authenticate_user!
unless session[:current_user_id]
redirect_to login_path, alert: 'Необходимо войти'
end
end
end
Экзаменационный билет №3
Теоретическая часть
- Какие виды ассоциаций поддерживает ActiveRecord и какова разница между ними?
- Объясните назначение Rake-задач и покажите пример их использования в Ruby on Rails.
Ответы на теоретические вопросы:
- ActiveRecord поддерживает такие ассоциации, как has_many, belongs_to, has_one, has_and_belongs_to_many и многие другие. Эти ассоциации позволяют моделировать связи между объектами и обеспечивают удобные способы навигации и манипуляции этими связями.
- Rake-задачи — это автоматизированные задания для Ruby, используемые для различных целей: миграции базы данных, запуск тестов, генерация документации и другое. Например, задача rake db:migrate обновляет схему базы данных согласно новым миграциям.
Практическая часть Создать миграцию для добавления новой таблицы orders с полями: id, user_id, total_price, created_at, updated_at.
rails generate migration CreateOrders user_id:integer total_price:decimal
Экзаменационный билет №4
Теоретическая часть
- Расскажите о механизмах обработки исключений в Ruby и приведите пример.
- Что такое middleware в Rails и какую роль он играет в обработке запросов?
Ответы на теоретические вопросы:
- Исключения в Ruby обрабатываются блоками begin/rescue/ensure. Если исключение возникает внутри блока begin, оно перехватывается rescue-блоком, а ensure выполняется независимо от возникновения исключения. Пример:
- begin
- # опасная операция
- rescue Exception => e
- puts "Ошибка: #{e.message}"
- ensure
- # очистка ресурсов
end
- Middleware — это компоненты промежуточного уровня в Rails, позволяющие изменять запросы до их поступления в контроллеры и отвечать на них. Примеры middleware включают обработку заголовков HTTP, сжатие ответов, защиту CSRF и многое другое.
Практическая часть Реализовать простейший middleware, который добавляет заголовок X-Powered-By в каждый ответ приложения.
class PoweredByMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
headers['X-Powered-By'] = 'Ruby on Rails'
[status, headers, body]
end
end
Экзаменационный билет №5
Теоретическая часть
- Перечислите основные принципы SOLID и объясните, как они помогают писать качественный код.
- Почему важно проводить рефакторинг кода и как часто это рекомендуется делать?
Ответы на теоретические вопросы:
- Принципы SOLID включают:
- Single Responsibility Principle (SRP): Один класс должен иметь одну ответственность.
- Open/Closed Principle (OCP): Программные сущности должны быть открыты для расширения, но закрыты для модификации.
- Liskov Substitution Principle (LSP): Подтипы должны заменять типы родительского класса без нарушения поведения программы.
- Interface Segregation Principle (ISP): Клиенты не должны зависеть от методов, которыми они не пользуются.
- Dependency Inversion Principle (DIP): Модули высокого уровня не должны зависеть от модулей низкого уровня.
- Рефакторинг улучшает качество кода, делая его более читаемым, поддерживаемым и расширяемым. Рекомендуется регулярно выполнять рефакторинг, особенно после введения новых функций или исправления ошибок.
Практическая часть Преобразовать следующий фрагмент кода в соответствии с принципом DRY (Don't Repeat Yourself):
def calculate_total(cart_items)
sum = 0
cart_items.each do |item|
if item.discount > 0
sum += item.price * (1 - item.discount / 100.0)
else
sum += item.price
end
end
return sum
end
Решение:
def calculate_discounted_price(price, discount)
price * (discount > 0 ? (1 - discount / 100.0) : 1)
end
def calculate_total(cart_items)
cart_items.sum { |item| calculate_discounted_price(item.price, item.discount) }
end
Экзаменационный билет №6
Теоретическая часть
- Что такое символическое обозначение (:symbol) в Ruby и в чем его преимущество перед строковыми значениями ("string")?
- Как организовать тестирование RESTful API с помощью RSpec в проекте Ruby on Rails?
Ответы на теоретические вопросы:
- Символы в Ruby представляют собой уникальные идентификаторы, занимающие меньше памяти и работающие быстрее, поскольку создаются однократно. Строки дублируются при каждом объявлении, увеличивая нагрузку на память. Использование символов предпочтительно там, где важна производительность и однозначность значения.
- Для тестирования RESTful API в Rails используются библиотеки вроде RSpec вместе с фабричным методом FactoryBot. Тестирование включает проверку маршрутов, правильность возвращаемых статус-кодов и валидности JSON-данных. Важно проверять также наличие необходимой авторизации и безопасности запросов.
Практическая часть
Реализовать контроллер API для простого CRUD-оператора над ресурсами продуктов (ProductsController), включая создание продукта, получение списка всех продуктов и удаление продукта.
# app/controllers/api/v1/products_controller.rb
module Api
module V1
class ProductsController < ApplicationController
def index
products = Product.all
render json: products
end
def create
product = Product.new(product_params)
if product.save
render json: product, status: :created
else
render json: product.errors, status: :unprocessable_entity
end
end
def destroy
product = Product.find(params[:id])
product.destroy
head :no_content
end
private
def product_params
params.require(:product).permit(:title, :price)
end
end
end
end
Экзаменационный билет №7
Теоретическая часть
- Что такое блоки и прокси-методы (&block) в Ruby? Приведите пример использования блоков.
- Какой механизм обеспечивает хранение конфигурации среды окружения в Ruby on Rails и как правильно его настроить?
Ответы на теоретические вопросы:
- Блоки в Ruby позволяют передавать анонимные фрагменты кода в качестве аргументов методов. Прокси-метод (&block) передает блок в виде параметра. Пример использования блока:
[1, 2, 3].each { |num| puts num } # выводит числа массива
- Конфигурация среды окружения в Rails хранится в файле .env. Для каждого окружения (development, test, production) задаются переменные окружения, доступные в приложении через среду. Настройка осуществляется добавлением нужного файла конфигурации и использованием gem'а dotenv-rails для загрузки переменных окружения.
Практическая часть
Создать форму для отправки POST-запроса в контроллер с проверкой введённых данных.
<!-- app/views/users/new.html.erb -->
<h1>Регистрация нового пользователя</h1>
<%= form_with(model: User.new, local: true) do |f| %>
<div>
<%= f.label :email %><br />
<%= f.text_field :email %>
</div>
<div>
<%= f.label :password %><br />
<%= f.password_field :password %>
</div>
<div>
<%= f.submit "Зарегистрироваться" %>
</div>
<% end %>
Экзаменационный билет №8
Теоретическая часть
- Что такое метаклассы в Ruby и как они работают?
- Что означает понятие "область видимости" в Ruby и какие существуют уровни области видимости?
Ответы на теоретические вопросы:
- Метакласс в Ruby — это класс, связанный с объектом и содержащий методы, специфичные именно для этого объекта. Каждый экземпляр объекта имеет собственный метакласс, наследующий поведение от своего базового класса. Таким образом, Ruby реализует концепцию методов, определенных для отдельных объектов.
- Области видимости определяют доступность переменных и методов в разных частях программы. Основные уровни областей видимости в Ruby:
- Локальная область видимости (переменная доступна только внутри блока, метода или тела цикла).
- Глобальная область видимости ($global_variable).
- Переменные экземпляра (@instance_variable) и класса (@@class_variable).
Практическая часть
Создать простую службу доставки почты с использованием Sidekiq и Redis в проекте Ruby on Rails.
# app/jobs/send_email_job.rb
class SendEmailJob < ApplicationJob
queue_as :default
def perform(user_id)
user = User.find(user_id)
Mailer.send_email(user.email).deliver_now
end
end
# config/sidekiq.yml
:concurrency: 5
:queues:
- default
Экзаменационный билет №9
Теоретическая часть
- В чем заключается особенность архитектуры MVC в Ruby on Rails и какие её ключевые элементы?
- Какие инструменты и подходы используют для оптимизации производительности Rails-приложений?
Ответы на теоретические вопросы:
- Архитектура MVC (Model–View–Controller) разделяет приложение на три компонента:
- Модель (Model) управляет данными и бизнес-логикой.
- Представление (View) отображает данные пользователю.
- Контроллер (Controller) координирует взаимодействие между моделью и представлением.
- Оптимизация производительности Rails-приложений достигается через кэширование (например, page caching, fragment caching), использование индексов в базе данных, профилирование кода с помощью инструментов типа New Relic или Scout APM, оптимизацию запросов Active Record и настройку нагрузки сервера (Nginx, Puma).
Практическая часть
Подключить кеширование фрагментов представления (fragment caching) для страницы профиля пользователя.
# app/views/profiles/show.html.erb
<div>
<% cache ['profile', current_user.id] do %>
<p>Имя: <%= @user.name %></p>
<p>Адрес электронной почты: <%= @user.email %></p>
<% end %>
</div>
Экзаменационный билет №10
Теоретическая часть
- В чем отличие методов include и extend в модулях Ruby?
- Как эффективно интегрировать внешний сервис в Rails-проект, используя Faraday?
Ответы на теоретические вопросы:
- Метод include подключает модуль к экземплярам класса, добавляя методы модуля как методы экземпляра. Метод extend делает методы модуля методами самого класса.
- Интеграция внешнего сервиса с помощью Faraday подразумевает создание клиентской библиотеки для коммуникации с внешним API. Нужно создать адаптеры для соединений, обработчики ошибок и конфигурировать подключения с нужными параметрами. После настройки можно отправлять GET-, POST- и другие запросы к внешнему ресурсу.
Практическая часть
Настроить подключение к внешнему API PayPal с использованием Faraday.
require 'faraday'
conn = Faraday.new(url: 'https://api.paypal.com') do |faraday|
faraday.request :url_encoded
faraday.response :logger
faraday.adapter Faraday.default_adapter
end
response = conn.get '/v1/payments/payment'
puts response.body
Экзаменационный билет №11
Теоретическая часть
- Назовите особенности управления зависимостями в Ruby с помощью Bundler и Gemfile. Какие команды чаще всего используются для работы с пакетами?
- Объясните термин "сервер приложений" и укажите, какие наиболее распространенные решения применяются в экосистеме Ruby/Rails.
Ответы на теоретические вопросы:
- Управление зависимостями в Ruby реализовано через инструмент Bundler, использующий файл Gemfile. Этот инструмент автоматически устанавливает необходимые пакеты, разрешая конфликты версий. Наиболее частые команды: bundle install, bundle update, bundle exec.
- Сервер приложений (application server) отвечает за выполнение кода вашего приложения, принимая входящие запросы и отправляя ответы. Популярные серверы приложений для Ruby/Rails: Puma, Unicorn, Passenger, Thin.
Практическая часть
Реализовать простое консольное приложение на Ruby, которое принимает два целых числа и возвращает их сумму.
#!/usr/bin/env ruby
def add_numbers(a, b)
a + b
end
puts "Введите первое число:"
first_number = gets.chomp.to_i
puts "Введите второе число:"
second_number = gets.chomp.to_i
result = add_numbers(first_number, second_number)
puts "Сумма чисел равна: #{result}"
Экзаменационный билет №12
Теоретическая часть
- Дайте определение понятию "метапрограммирование" в Ruby и опишите, каким образом этот механизм применяется в реальной практике.
- Объясните назначение Rack-межуровней (middleware) и какой основной функционал они выполняют в Ruby/Rails приложениях.
Ответы на теоретические вопросы:
- Метапрограммирование — это способность программы динамически менять своё собственное поведение во время исполнения. В Ruby это реализуется с помощью механизмов отражения и динамического определения методов и классов. Используется для создания гибких фреймворков и библиотек, например, ActiveSupport и Railties.
- Rack-middleware представляет собой набор компонентов, расположенных между клиентом и конечной точкой приложения, выполняющих дополнительную обработку запросов и ответов. Основная цель middleware — разделение ответственности и улучшение управляемости системы.
Практическая часть
Реализовать контроллер API для изменения статуса заказа (OrderStatusUpdateController).
# app/controllers/order_status_update_controller.rb
class OrderStatusUpdateController < ApplicationController
def update
order = Order.find(params[:order_id])
new_status = params[:new_status]
if order.update(status: new_status)
render json: { message: "Статус успешно обновлён." }, status: :ok
else
render json: { errors: order.errors.full_messages }, status: :unprocessable_entity
end
end
Экзаменационный билет №13
Теоретическая часть
- В чем состоит ключевое различие между рельсовым генератором generate scaffold и ручным созданием контроллеров, представлений и моделей?
- Назовите две стратегии деплоя (развёртывания) Ruby on Rails приложений и перечислите их плюсы и минусы.
Ответы на теоретические вопросы:
- Генерация scaffold создаёт готовый шаблон проекта с контроллером, моделями, видами и маршрутом, автоматически настраивая минимальный функционал. Ручное создание даёт больше контроля и возможности кастомизировать каждую деталь, однако занимает больше времени.
- Две основные стратегии развёртывания:
- Capistrano (дефолтный способ развертывания в Ruby/Rails). Преимущества: автоматизация процессов, простота настройки. Недостатки: сложность масштабирования сложных проектов.
- Docker (контейнеризация). Преимущества: изоляция окружения, переносимость. Недостатки: дополнительная нагрузка на ресурсы, необходимость глубокого понимания контейнеризации.
Практическая часть
Используя Docker, подготовить команду для запуска Rails-проекта в контейнере с базой данных PostgreSQL.
# docker-compose.yml
version: '3'
services:
web:
build: .
command: bundle exec rails s -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: secret
POSTGRES_DB: mydatabase
Экзаменационный билет №14
Теоретическая часть
- Описать цикл жизни запроса в Rails и объяснить порядок прохождения через роутинг, контроллер и представление.
- Объяснить суть термина "циклическая зависимость" в Ruby и как избежать подобного явления в крупных проектах.
Ответы на теоретические вопросы:
- Цикл жизни запроса начинается с попадания на сервер (обычно Nginx/Puma), далее передается в роутер (routes.rb), который определяет подходящий контроллер и действие. Затем контроллер исполняет логику, возможно взаимодействуя с моделью. Наконец, генерируется представление и отправляется клиенту ответ.
- Циклическая зависимость возникает, когда классы взаимозависимы друг от друга, создавая замкнутый круг. Избежать этого можно путём разделения функциональности, использования интерфейсов и внедрения сторонних сервисов для декомпозиции зависимостей.
Практическая часть
Создать простой сценарий, демонстрирующий циклическую зависимость и показывающий возможные пути её устранения.
# bad_dependency.rb
class ClassA
def initialize(b)
@b = b
end
def method_a
@b.method_b
end
end
class ClassB
def initialize(a)
@a = a
end
def method_b
@a.method_a
end
end
# Хорошее решение — разделить функциональность
class BetterClassA
attr_reader :b
def initialize(b)
@b = b
end
def method_a
"Method from A"
end
end
class BetterClassB
def initialize(a)
@a = a
end
def method_b
@a.method_a
end
end
Экзаменационный билет №15
Теоретическая часть
- В чем принципиальное отличие подхода "Active Model" от традиционной модели MVC в Ruby on Rails?
- Зачем нужны мьютексы (Mutex) в многопоточных приложениях Ruby и как их применять?
Ответы на теоретические вопросы:
- Active Model вводит концепции "моделей" и "валидаторов", расширяя традиционную архитектуру MVC возможностью организации единой точки проверки данных, не зависящей от конкретных реализаций (например, база данных или внешняя система).
- Мьютексы (mutexes) защищают критически важные участки кода от одновременного доступа нескольких потоков, предотвращая состояние гонки и расхождения данных. Используются совместно с потоками (threads) для синхронизации операций.
Практическая часть
Создать небольшой многопоточностный скрипт на Ruby, считающий количество файлов в папке, защищённый мьютексом.
require 'thread'
folder = "/path/to/folder"
mutex = Mutex.new
counter = 0
Dir.entries(folder).map do |entry|
Thread.new do
mutex.synchronize do
counter += 1 if File.file?(File.join(folder, entry))
end
end
end.map(&:join)
puts "Количество файлов: #{counter}"
(1)Кейс: "Ошибки обработки запросов API — пользователи не видят актуальные данные"
Описание кейса
Вы — профессиональный бэкенд-разработчик на платформе Ruby on Rails. Ваш проект — веб-приложение для управления складскими запасами товаров крупного ритейлера. Пользователи сталкиваются с проблемой отсутствия актуальной информации о наличии товара на складе. Хотя товары регулярно поступают и списываются, интерфейс показывает устаревшие данные даже после перезагрузки страницы.
Вашей задачей является оптимизировать обработку запросов к API, обеспечивающую своевременное получение и вывод свежих данных пользователям.
Исходный контроллер StocksController
class StocksController < ApplicationController
def index
@stocks = Stock.all
render json: @stocks
end
def show
stock = Stock.find(params[:id])
render json: stock
end
# Другие методы...
end
Анализ ситуации и выявление проблем
Проблема №1: Использование Stock.all возвращает статический набор записей. Это означает, что даже если товар поступает на склад, старые записи остаются неизмененными, пока кэш не очистится автоматически.
Решение: Перевод метода на использование актуального состояния базы данных путем принудительного переопределения результатов запроса. Например, используя .reload.
Проблема №2: Отсутствует механизм автоматической очистки кеша, приводящий к задержке появления новых данных.
Решение: Добавить эксплицитную очистку кешированных данных вручную после каждого успешного обновления.
Проблема №3: Неэффективность обработки больших объемов данных в API-запросах.
Решение: Реализация пагинации или выборочной загрузки данных (lazy loading), чтобы уменьшить нагрузку на базу данных и ускорить загрузку страниц.
Проблема №4: Запросы выполняются синхронно, блокируя выполнение других операций во время длительных операций с базой данных.
Решение: Использовать асинхронные запросы (через background jobs, такие как Sidekiq), чтобы обеспечить параллельную работу сервера и предотвращать зависания интерфейса.
Проблема №5: Недостаточная обработка исключений и логирование ошибок.
Решение: Добавить обработчики исключений (rescue_from) и ведение журнала ошибок для быстрого выявления проблемных ситуаций.
Итоговый исправленный контроллер
class StocksController < ApplicationController
before_action :clear_cache, only: [:index]
rescue_from ActiveRecord::RecordNotFound do |exception|
render json: { error: exception.message }, status: :not_found
end
def index
stocks = Stock.all.reload
render json: paginate(stocks)
end
def show
stock = Stock.find(params[:id]).reload
render json: stock
end
private
def clear_cache
Rails.cache.clear
end
def paginate(data)
data.page(params[:page]).per(params[:per_page] || 10)
end
end
Обучающие моменты
- Использование методов reload: Как обновить состояние объектов прямо из базы данных.
- Кэширование и очистка кэша: Зачем нужен кеш и как его очищать вручную.
- Асинхронные операции: Чем полезны background jobs и как организовать параллельное выполнение запросов.
- Исключения и журналирование: Почему важно обрабатывать исключения и вести журнал ошибок.
- Оптимизация производительности: Какие существуют техники оптимизации (pagination, lazy loading).
Дополнительные задания для самостоятельной работы
- Реализуйте фильтрацию данных по наличию товара на складе.
- Настройте массовую выгрузку товаров через CSV-файл.
- Организуйте автоматическое уведомление пользователей о поступлении нового товара.
- Реализуйте сортировку списка товаров по количеству на складе.
- Интегрируйте стороннюю библиотеку для отправки уведомлений через email/SMS.
(2)Кейс: "Ошибки обработки запросов API — пользователи не видят актуальные данные"
Описание кейса
Вы — профессиональный бэкенд-разработчик на платформе Ruby on Rails. Ваш проект — веб-приложение для управления складскими запасами товаров крупного ритейлера. Пользователи сталкиваются с проблемой отсутствия актуальной информации о наличии товара на складе. Хотя товары регулярно поступают и списываются, интерфейс показывает устаревшие данные даже после перезагрузки страницы.
Вашей задачей является оптимизировать обработку запросов к API, обеспечивающую своевременное получение и вывод свежих данных пользователям.
Исходный контроллер StocksController
class StocksController < ApplicationController
def index
@stocks = Stock.all
render json: @stocks
end
def show
stock = Stock.find(params[:id])
render json: stock
end
# Другие методы...
end
Анализ ситуации и выявление проблем
Проблема №1: Использование Stock.all возвращает статический набор записей. Это означает, что даже если товар поступает на склад, старые записи остаются неизмененными, пока кэш не очистится автоматически.
Решение: Перевод метода на использование актуального состояния базы данных путем принудительного переопределения результатов запроса. Например, используя .reload.
Проблема №2: Отсутствует механизм автоматической очистки кеша, приводящий к задержке появления новых данных.
Решение: Добавить эксплицитную очистку кешированных данных вручную после каждого успешного обновления.
Проблема №3: Неэффективность обработки больших объемов данных в API-запросах.
Решение: Реализация пагинации или выборочной загрузки данных (lazy loading), чтобы уменьшить нагрузку на базу данных и ускорить загрузку страниц.
Проблема №4: Запросы выполняются синхронно, блокируя выполнение других операций во время длительных операций с базой данных.
Решение: Использовать асинхронные запросы (через background jobs, такие как Sidekiq), чтобы обеспечить параллельную работу сервера и предотвращать зависания интерфейса.
Проблема №5: Недостаточная обработка исключений и логирование ошибок.
Решение: Добавить обработчики исключений (rescue_from) и ведение журнала ошибок для быстрого выявления проблемных ситуаций.
Итоговый исправленный контроллер
class StocksController < ApplicationController
before_action :clear_cache, only: [:index]
rescue_from ActiveRecord::RecordNotFound do |exception|
render json: { error: exception.message }, status: :not_found
end
def index
stocks = Stock.all.reload
render json: paginate(stocks)
end
def show
stock = Stock.find(params[:id]).reload
render json: stock
end
private
def clear_cache
Rails.cache.clear
end
def paginate(data)
data.page(params[:page]).per(params[:per_page] || 10)
end
end
Обучающие моменты
- Использование методов reload: Как обновить состояние объектов прямо из базы данных.
- Кэширование и очистка кэша: Зачем нужен кеш и как его очищать вручную.
- Асинхронные операции: Чем полезны background jobs и как организовать параллельное выполнение запросов.
- Исключения и журналирование: Почему важно обрабатывать исключения и вести журнал ошибок.
- Оптимизация производительности: Какие существуют техники оптимизации (pagination, lazy loading).
Дополнительные задания для самостоятельной работы
- Реализуйте фильтрацию данных по наличию товара на складе.
- Настройте массовую выгрузку товаров через CSV-файл.
- Организуйте автоматическое уведомление пользователей о поступлении нового товара.
- Реализуйте сортировку списка товаров по количеству на складе.
- Интегрируйте стороннюю библиотеку для отправки уведомлений через email/SMS.
и еще 1 кейс
Кейс: "Производительность RESTful API замедлена большими объемами запросов"
Описание кейса
Вы — опытный Backend-разработчик на Ruby on Rails, работающий над проектом крупного онлайн-магазина. Ваша задача заключается в улучшении производительности RESTful API, используемого для взаимодействия мобильных приложений и веб-интерфейсов магазина с системой хранения заказов и корзины покупателя.
Пользовательская проблема состоит в следующем: значительное увеличение количества одновременных обращений к API привело к значительному снижению скорости отклика системы, особенно при работе с ресурсоемкими методами (например, CRUD-операции с заказами).
Необходимо провести диагностику проблемы и предложить эффективные решения для улучшения производительности приложения.
Пример исходного контроллера OrdersController
class OrdersController < ApplicationController
def create
order = Order.new(order_params)
if order.save
render json: order, status: :created
else
render json: { errors: order.errors.full_messages }, status: :unprocessable_entity
end
end
def update
order = Order.find(params[:id])
if order.update(order_params)
render json: order
else
render json: { errors: order.errors.full_messages }, status: :unprocessable_entity
end
end
def destroy
order = Order.find(params[:id])
order.destroy
head :no_content
end
private
def order_params
params.require(:order).permit(:customer_id, :product_ids => [])
end
end
Анализ ситуации и выявление проблем
Проблема №1: Выполнение всех операций с моделью напрямую в контроллерах вызывает дополнительные нагрузки на сервер при большом количестве одновременно выполняемых действий.
Решение: Разделение логики контроллеров и модели, передача бизнес-логики в сервисы (Service Objects), что позволит упростить тестирование и масштабируемость кода.
Проблема №2: Неправильная работа с ассоциациями моделей (n+1 queries problem). Из-за неправильной настройки отношений между моделями возникает большое количество отдельных SQL-запросов, значительно увеличивающих время отклика.
Решение: Использование метода eager_load/includes для предварительной загрузки связанных объектов.
Проблема №3: Высокая нагрузка на память и процессор при обработке большого объема данных (например, большие списки продуктов или покупателей).
Решение: Оптимизация базы данных с использованием индексов и денормализации, уменьшение количества полей, загружаемых за один раз.
Проблема №4: Отсутствие эффективного механизма авторизации и аутентификации.
Решение: Переход на токены JWT для упрощенной проверки подлинности пользователей и снижение накладных расходов на авторизацию каждой отдельной сессии.
Проблема №5: Нет достаточной защиты от DDoS атак и чрезмерных запросов одного пользователя.
Решение: Установка лимитов на количество запросов (rate limiting) и настройка механизмов защиты от злоупотребления API (RateLimiter middleware).
Итоговый исправленный контроллер с сервисами
# Сервис для создания заказа
class CreateOrderService
def initialize(params)
@params = params
end
def call
Order.create(@params)
end
end
# Контроллер
class OrdersController < ApplicationController
def create
service = CreateOrderService.new(order_params)
result = service.call
if result.persisted?
render json: result, status: :created
else
render json: { errors: result.errors.full_messages }, status: :unprocessable_entity
end
end
private
def order_params
params.require(:order).permit(:customer_id, product_ids: [])
end
end
Обучающие моменты
- Рефакторинг контроллеров: почему полезно выделять сложную логику в отдельные классы-сервисы.
- Eager Loading: как предотвратить проблему n+1 запросов.
- Индексация баз данных: зачем нужны индексы и как они влияют на производительность.
- Авторизация и безопасность: основы безопасной реализации аутентификации через JWT-токены.
- Rate Limiting: как ограничить число запросов для предотвращения злоупотреблений.
Дополнительные задания для самостоятельной работы
- Реализуйте автоматическую отправку уведомления покупателю о статусе заказа.
- Проведите бенчмарк-тесты производительности различных методов загрузки ресурсов.
- Добавьте поддержку массового импорта товаров из файла Excel/CVS.
- Создайте API-методы для анализа покупательской активности и формирования отчетов по продажам.
- Опишите подходы к организации тестов интеграционного уровня для сложных сервисов.
Ролевая игра №1: "Разработка API для онлайн-магазина с командой"
Цель игры
Научить студентов проектировать и реализовывать REST API на Ruby on Rails с учётом масштабируемости, безопасности и совместной разработки. Имитировать работу в команде с чётким разделением ролей, где каждый участник отвечает за свою часть API.
Формат
- Тип: Образовательная ролевая игра (настольная/виртуальная)
- Участники: 5–6 человек
- Продолжительность: 4 академических часа
- Материалы: доска, стикеры, карточки ролей, описание задания, шаблон проекта на Ruby on Rails
Сеттинг
Вы — команда разработчиков, работающих над MVP онлайн-магазина . Заказчик просит реализовать REST API , который позволит управлять товарами, заказами и пользователями. У вас ограниченные сроки — через несколько часов состоится демо перед инвесторами. Нужно как можно быстрее создать функциональный прототип API, который будет соответствовать современным стандартам.
Роли в команде
Этапы игры
Этап 1: Брифинг
- Архитектор представляет концепцию API: «RESTful API для онлайн-магазина с товарами, заказами и пользователями».
- Менеджер проекта делит задачи:
- Создание моделей: User, Product, Order
- Настройка маршрутов и контроллеров
- Реализация CRUD-операций
- Написание тестов
- Подготовка документации
- Запуск и проверка работы API
Этап 2: Разработка
- Каждые 10–15 минут проводится короткая встреча (stand-up), где участники рассказывают:
- Что сделал?
- Над чем работает сейчас?
- Есть ли блокеры?
Этап 3: Презентация
- Команда запускает API локально или через Docker.
- Все участники проверяют:
- Возможность создания, чтения, обновления и удаления ресурсов.
- Валидацию данных.
- Корректную структуру JSON-ответов.
- Работу тестов и соответствие документации.
Обучающие эффекты
- Знакомство с REST API, маршрутизацией и контроллерами в Rails.
- Изучение принципов DRY, KISS и правильного проектирования API.
- Освоение написания тестов (RSpec).
- Практика использования сервисных объектов, декораторов и миграций.
- Работа в команде, общение между специалистами, управление задачами.
Возможные проблемы и вызовы во время игры
Дополнительно
- Можно использовать готовый шаблон проекта с установленными гемами:
rspec
,factory_bot
,swagger-ui
,puma
. - Предложить командам реализовать дополнительные фичи:
- Авторизация через JWT.
- Поиск товаров по параметрам.
- Статусы заказов.
- Пагинация.
- Логирование запросов.
Ролевая игра №2: "Разработка системы оплаты на Ruby"
Цель игры
Научить студентов проектировать безопасную систему обработки платежей с использованием сторонних сервисов (Stripe, PayPal), а также интегрировать платёжные операции в Rails-приложение. Имитировать командную разработку с акцентом на безопасность и транзакции.
Формат
- Тип: Образовательная ролевая игра
- Участники: 5–6 человек
- Продолжительность: 4 академических часа
- Материалы: доска, стикеры, карточки ролей, описание задания, шаблон проекта на Ruby on Rails
Сеттинг
Вы — команда разработчиков, которая получает задание от заказчика: внедрить систему оплаты в существующий онлайн-магазин. Клиент хочет, чтобы пользователи могли выбрать товар, оформить заказ и оплатить его через Stripe или PayPal. Демонстрация должна состояться уже завтра.
Роли в команде
Этапы игры
Этап 1: Брифинг
- Архитектор представляет концепцию: «Система оплаты товаров через Stripe/PayPal, с подтверждением транзакций и обновлением статуса заказа».
- Менеджер проекта делит задачи:
- Создание моделей Order, Payment
- Интеграция Stripe API
- Реализация формы оплаты
- Написание тестов
- Настройка окружения и переменных
- Подготовка презентации
Этап 2: Разработка
- Каждые 10–15 минут проводится короткая встреча (stand-up):
- Что сделал?
- Над чем работаешь?
- Есть ли блокеры?
Этап 3: Презентация
- Команда демонстрирует работу системы:
- Выбор товара → создание заказа → оплата → изменение статуса
- Все участники проверяют:
- Корректность работы с API
- Безопасность передачи данных
- Логирование и обработку ошибок
Обучающие эффекты
- Знакомство с платёжными API (Stripe, PayPal)
- Изучение принципов безопасной обработки данных
- Практика работы с транзакциями в ActiveRecord
- Углубление знаний о тестировании внешних API
- Работа в команде и управление задачами
Возможные проблемы и вызовы во время игры
Дополнительно
- Можно использовать заготовленный проект с установленным Stripe SDK.
- Предложить командам реализовать дополнительные фичи:
- Возврат средств
- Подписка (recurring payments)
- Многоступенчатая оплата
- Асинхронное подтверждение через email
- Интеграция с бухгалтерской системой
Ролевая игра №3: "Разработка CI/CD процесса для Ruby-проекта"
Цель игры
Научить студентов настраивать автоматизированную доставку кода (CI/CD), работать с Git, GitHub Actions, Docker и деплоить приложения. Имитировать реальную DevOps-среду с командной работой и автоматизацией рутинных задач.
Формат
- Тип: Образовательная ролевая игра
- Участники: 5–6 человек
- Продолжительность: 4 академических часа
- Материалы: доска, стикеры, карточки ролей, описание задания, шаблон проекта на Ruby on Rails
Сеттинг
Вы — команда разработчиков, только что завершившая MVP своего Ruby-приложения. Теперь нужно настроить автоматическую сборку, тестирование и деплой. Заказчик хочет, чтобы каждое изменение в main-ветке автоматически попадало на staging-сервер, а после релиза — на production.
Роли в команде
Этапы игры
Этап 1: Брифинг
- DevOps-инженер объясняет цель: «Нужно настроить автоматический запуск тестов, сборку образа и деплой на staging и production».
- Менеджер проекта делит задачи:
- Настройка GitHub Actions
- Создание Dockerfile
- Подготовка тестовой среды
- Автоматизация деплоя
- Проверка
Этап 2: Разработка
- Каждые 10–15 минут проводится stand-up:
- Что сделал?
- Над чем работаешь?
- Есть ли блокеры?
Этап 3: Презентация
- Команда создаёт новую ветку, делает push, открывает PR.
- Система сама запускает тесты, собирает Docker-образ, деплоит на staging.
- Все участники проверяют:
- Работу CI
- Корректность сборки
- Доступность приложения после деплоя
Обучающие эффекты
- Знакомство с CI/CD (GitHub Actions, GitLab CI)
- Практика использования Docker
- Освоение автоматизации деплоя
- Углубление понимания работы с Git
- Работа в команде и совместная настройка инфраструктуры
Возможные проблемы и вызовы во время игры
Дополнительно
- Можно использовать готовый проект с тестами и Dockerfile.
- Предложить командам реализовать:
- Деплой на Heroku / DigitalOcean / AWS
- Автоматическое создание релизов
- Отправку уведомлений в Slack
- Rollback версии
- Canary release или blue/green deployment
Ролевая игра №4: "Разработка микросервисной архитектуры на Ruby"
Цель игры
Научить студентов проектировать и разрабатывать микросервисную архитектуру, работать с несколькими независимыми сервисами, организовывать обмен данными между ними. Имитировать масштабируемую систему и командную разработку.
Формат
- Тип: Образовательная ролевая игра
- Участники: 5–6 человек
- Продолжительность: 4 академических часа
- Материалы: доска, стикеры, карточки ролей, описание задания, шаблоны сервисов на Ruby
Сеттинг
Вы — команда разработчиков, которой нужно переписать монолитный онлайн-магазин в виде набора микросервисов: сервис товаров, сервис заказов, сервис пользователей и сервис уведомлений. Заказчик хочет гибкость, высокую доступность и возможность масштабирования.
Роли в команде
Этапы игры
Этап 1: Брифинг
- Архитектор объясняет: «Нужно разбить монолит на микросервисы, каждый из которых будет отвечать за свою часть бизнес-логики».
- Менеджер проекта делит задачи:
- Создание отдельных сервисов
- Реализация REST API для каждого
- Настройка связи между сервисами
- Тестирование и запуск
Этап 2: Разработка
- Каждые 10–15 минут проводится stand-up:
- Что сделал?
- Над чем работаешь?
- Есть ли блокеры?
Этап 3: Презентация
- Команда запускает все сервисы через Docker Compose.
- Все участники проверяют:
- Работу каждого сервиса
- Интеграцию между ними
- Обработку ошибок и логирование
Обучающие эффекты
- Знакомство с микросервисной архитектурой
- Изучение принципов разделения ответственности
- Практика работы с REST API и HTTP-запросами между сервисами
- Освоение Docker Compose
- Работа в команде и управление зависимостями
Возможные проблемы и вызовы во время игры
Дополнительно
- Можно использовать готовые шаблоны сервисов на Sinatra или Grape.
- Предложить командам реализовать:
- Асинхронную связь через RabbitMQ
- Шаринг данных через Redis
- Мониторинг через Prometheus
- API Gateway
- Авторизацию между сервисами через JWT
Если хочешь, могу сделать больше таких ролевых игр по темам:
- Безопасность в Ruby
- Работа с Kafka или Sidekiq
- Проектирование чистой архитектуры
- Работа с GraphQL
Интеллект-карта 1: Архитектура и паттерны проектирования
Центральный узел:
Архитектура и паттерны проектирования
Ветки:
- MVC (Model-View-Controller)
Разделение логики на модель, контроллер и представление
Использование в Rails для обработки запросов и данных - Service Object
Вынос бизнес-логики из моделей и контроллеров
Примеры: CreateOrder, ChargePayment, SendNotification - Repository Pattern
Абстракция работы с данными
Упрощает тестирование и замену источников данных - Query Object
Инкапсуляция сложных SQL-запросов
Помогает вынести логику из моделей - Form Object
Обработка и валидация формы вне модели
Полезен при работе с несколькими моделями - Policy / Authorization Object
Проверка прав доступа
Примеры: UserPolicy, ProductPolicy
Интеллект-карта 2: Работа с базой данных и ORM
Центральный узел:
Работа с базой данных и ORM
Ветки:
- ActiveRecord
ORM в Rails
Поддержка миграций, ассоциаций и валидаций - Ассоциации
has_many, belongs_to, has_one, has_many :through
polymorphic, counter_cache - Миграции
rails db:migrate
reversible changes, change vs up/down - N+1 запросы
Проблема множества отдельных запросов
includes, preload, eager_load - Индексы и оптимизация
Ускорение поиска в БД
Composite индексы, unique, foreign key - PostgreSQL возможности
JSONB, window functions, CTE, full-text search
Enum, UUID, materialized views
Интеллект-карта 3: Тестирование и качество кода
Центральный узел:
Тестирование и качество кода
Ветки:
- RSpec
Написание юнит-, интеграционных и фича-тестов
Matchers, context, describe - FactoryBot
Создание тестовых объектов
Traits, associations, build_stubbed - Capybara
Тестирование пользовательского интерфейса
Методы: visit, click_link, fill_in, have_content - VCR
Запись HTTP-запросов для тестов
Предотвращает повторные внешние вызовы - TDD / BDD
Разработка через тесты
Сначала тест, потом реализация - Bullet
Поиск N+1 запросов
Помогает оптимизировать работу с БД
Интеллект-карта 4: CI/CD и DevOps
Центральный узел:
CI/CD и DevOps
Ветки:
- GitHub Actions
Автоматизация сборки, тестирования и деплоя
YAML-конфигурации, secrets, jobs - Docker
Контейнеризация приложений
Dockerfile, docker-compose, образы и контейнеры - Capistrano
Автоматизация деплоя
Поддержка staging, production окружений - Ansible
Настройка серверов и автоматизация
Playbook, inventory, roles - Redis
Использование в фоновых задачах и кэшировании
Sidekiq, cache store - Sidekiq
Обработка фоновых задач
Redis как очередь, retry, concurrency
Если нужно, могу сделать ещё по темам:
- Безопасность
- API разработка
- Микросервисы
- Производительность и оптимизация
1. Учебное пособие
Название: Профессиональная разработка на Ruby on Rails
Автор: Дэвид Блэк
Год издания: 2022
Краткое описание:
Фундаментальное руководство по разработке веб-приложений с использованием Ruby on Rails. Рассчитано на профессиональный уровень: охватывает продвинутые темы — от проектирования архитектуры до оптимизации запросов к базе данных.
2. Методические рекомендации
Название: Методика преподавания Ruby-разработки в профессиональном образовании
Автор: Ассоциация профессиональных IT-образовательных центров
Год издания: 2023
Краткое описание:
Практическое руководство для преподавателей и организаторов курсов. Содержит рекомендации по структурированию программы, организации командной работы, проведению тестирования и проектного обучения.
3. Задачник
Название: Задачи по Ruby и Rails: практика для Middle-разработчика
Автор: Иван Петров, Анастасия Кузнецова
Год издания: 2021
Краткое описание:
Сборник задач по разработке на Ruby и Rails, охватывающий работу с Active Record, REST API, сервисными объектами, тестированием и CI/CD. Включает решения и объяснения.
4. Хрестоматия
Название: Чтения по бэкенд-разработке: статьи, интервью и эссе о Ruby и Rails
Составитель: Алексей Гордеев
Год издания: 2020
Краткое описание:
Подборка текстов от ведущих специалистов Ruby-сообщества. Содержит обсуждение лучших практик, историй из реальных проектов и взглядов на развитие экосистемы.
5. Научная литература
Название: Фундаментальная бэкенд-разработка: теория и практика создания веб-приложений
Автор: Джон Отерински
Год издания: 2021
Краткое описание:
Научное пособие, рассматривающее архитектурные принципы, паттерны проектирования, работу с базами данных и протоколами передачи данных. Подходит как справочник для углубленного изучения бэкенд-разработки.
Курсы с акцентом на углубление знаний
"Ruby Professional: от основ к архитектуре приложений"
Изучите продвинутые паттерны проектирования, работу с метапрограммированием, чистую архитектуру и сервисные объекты.
"Ruby on Rails: продвинутая разработка веб-приложений"
Углублённое изучение Rails: работа с Active Record, ActionController, Action Cable, оптимизация запросов и интеграция микросервисов.
"Профессиональная работа с базами данных в Ruby"
Работа с PostgreSQL, оптимизация N+1, использование индексов, window функции и транзакции.
"API-разработка на Ruby: REST, GraphQL и версионирование"
Создание мощных API с использованием Grape, Sinatra и Rails. Версионирование, документирование, безопасность и тестирование.
"Метапрограммирование в Ruby: создание DSL и гемов"
Изучение методов method_missing, define_method, send и создание собственных DSL и библиотек.
С акцентом на карьерный рост и командную разработку
"Ruby Developer Lab: практика создания масштабных веб-приложений"
Реализация полноценного проекта с профессиональными практиками, CI/CD и командной работой.
"От Middle к Senior: как выйти на новый уровень в Ruby"
Курс по лучшим практикам написания кода, рефакторингу, управлению проектами и переходу на Senior-уровень.
"Командная разработка на Ruby: GitFlow, Agile и CI/CD"
Организация совместной разработки, использование CI/CD, pull request'ы, code review и автоматизация.
"Ruby-разработчик как профессия: карьера, портфолио, развитие"
Образовательный курс о том, как строить карьеру, участвовать в open source, готовить резюме и расти в профессии.
"Ruby в боевых условиях: типичные задачи Middle-разработчика"
Практика решения распространённых проблем в реальных проектах: от оптимизации до безопасности.
Курсы по технической специализации
"REST API на Ruby: от проектирования до документирования"
Проектирование, реализация, тестирование и документирование API с помощью Swagger и Grape.
"Фоновые задачи и очереди в Ruby: Sidekiq, Redis и ActiveJob"
Изучение обработки фоновых задач, retry, concurrency, batch jobs и интеграции с Redis.
"Тестирование и TDD/BDD в Ruby: RSpec, Capybara и VCR"
Практическое освоение тестирования: юнит-тесты, фича-тесты, моки, фабрики и запись HTTP-запросов.
"CI/CD и DevOps в Ruby: GitHub Actions, Docker и Capistrano"
Настройка автоматической сборки, тестирования и деплоя. Интеграция с серверами и контейнеризация.
"Безопасность в Ruby: защита от XSS, CSRF, SQLi и других угроз"
Изучение защиты приложений: Devise, Pundit, экранирование, secure headers, CSP.
Для командной и проектной работы
"Разработка на Ruby в команде: Git, Code Review и распределение задач"
Работа в группе с применением современных практик контроля версий и управления задачами.
"Создание онлайн-магазина уровня Middle: от прототипа до production"
Практическая реализация сложного веб-приложения с авторизацией, заказами, платежами и админкой.
"Микросервисная архитектура на Ruby: от монолита к сервисам"
Переход от одного приложения к нескольким независимым сервисам, их связь и интеграция.
"Ruby DevOps: автоматизация сборки, тестирования и деплоя"
Интеграция CI/CD, автоматическая проверка и выпуск обновлений.
"Создание собственного гема: от идеи до публикации"
Разработка, тестирование и публикация собственного гема в RubyGems.
Углублённые темы и технологии
"Чистая архитектура и Hexagonal Architecture в Ruby"
Изучение принципов разделения слоёв, независимости от фреймворков и организации кода.
"Redis в Ruby: кэширование, очередь, pub/sub и хранение данных"
Использование Redis для разных задач: от кэша до систем уведомлений.
"Docker и Ruby: контейнеризация приложений и микросервисов"
Работа с Dockerfile, docker-compose, образами и запуск приложений в контейнерах.
"Работа с внешними API в Ruby: REST, OAuth и Webhooks"
Интеграция сторонних сервисов, обработка ошибок, моки и тестирование.
"Производительность Ruby-приложений: снижение нагрузки и оптимизация"
Анализ производительности, garbage collection, оптимизация ActiveRecord и использование low-level caching.
Нет элементов для просмотра