Бэкенд-разработчик Ruby (Профессиональный уровень)

Курс предназначен для опытных разработчиков, знакомых с основами Ruby и желающих углубить свои навыки бэкенд-разработки. Вы изучите продвинутые техники работы с фреймворками (например, Rails), оптимизацию производительности, проектирование архитектуры приложений, работу с базами данных, REST API, тестирование и деплой. Курс поможет выйти на профессиональный уровень и эффективно решать сложные задачи в реальных проектах.

Описание программы

Курс «Бэкенд-разработчик 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 тестированию и метрикам
 

Формат обучения

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

  1. Что такое метапрограммирование и как оно применяется в Ruby?
    Метапрограммирование — это подход, при котором программа может изменять собственное поведение во время выполнения. В Ruby его используют для автоматического создания методов, расширения классов и построения удобных DSL.

  2. Чем отличаются Proc, lambda и блоки в Ruby?
    Proc — это объект, представляющий фрагмент кода. Lambda проверяет количество переданных аргументов и использует обычный return. Блок — временный фрагмент кода, передаваемый в метод. Используются для организации повторяемой логики и работы с коллекциями.

  3. Как работают миксины (mixins) в Ruby и зачем они нужны?
    Миксины реализуются через модули и позволяют добавлять методы в класс без множественного наследования. Они помогают избежать дублирования кода и упрощают поддержку проекта.

  4. Что такое сервисные объекты и когда их стоит использовать в Rails?
    Сервисные объекты содержат бизнес-логику, которая не относится ни к модели, ни к контроллеру. Их стоит применять, когда операция требует нескольких шагов или взаимодействия между разными частями приложения.

  5. Какие преимущества даёт использование декораторов в Ruby?
    Декораторы отделяют логику отображения данных от самой бизнес-логики. Это упрощает тестирование, делает код чище и позволяет переиспользовать представление данных в разных контекстах.

  6. Что такое Railties и Engines в Rails и как они используются?
    Railties — это основной компонент Rails, который управляет стартом приложения. Engines — это небольшие Rails-приложения, которые можно встраивать в другие приложения. Используются для разделения функциональности, например, выделения админки или API.

  7. Как работает ActiveRecord и какие задачи он решает?
    ActiveRecord связывает таблицы базы данных с объектами в коде. Он позволяет легко выполнять запросы, сохранять данные, управлять отношениями между моделями и использовать миграции.

  8. Что такое паттерн Repository и почему он полезен в сложных приложениях?
    Repository абстрагирует работу с данными, скрывая детали хранения. Он упрощает тестирование, позволяет менять источники данных и централизует логику выборки и сохранения.

  9. Какие виды join-запросов существуют в SQL и как они работают?
    Inner Join выбирает совпадающие строки из двух таблиц. Left Join возвращает все строки из первой таблицы и совпадающие из второй. Right Join — наоборот. Full Join включает все записи из обеих таблиц.

  10. Что такое индексы в базе данных и зачем они нужны?
    Индексы ускоряют выполнение запросов, создавая структуру для быстрого поиска. Они особенно важны для часто запрашиваемых столбцов, но замедляют операции вставки и обновления.

  11. Какие основные принципы Clean Architecture и как они применяются в Ruby?
    Clean Architecture разделяет логику на уровни: внешняя часть зависит от внутренней, а не наоборот. Применяется через отделение бизнес-правил от фреймворков, баз данных и UI.

  12. Что такое Single Responsibility Principle и как его соблюдать в Ruby?
    Этот принцип говорит, что класс должен иметь только одну причину для изменения. Соблюдается через разделение ответственности, использование модулей и маленькие, специализированные классы.

  13. Как работают версионирование API и почему оно важно?
    Версионирование позволяет вносить изменения в API без нарушения обратной совместимости. Это важно, чтобы клиенты не ломались при обновлении серверной части. Реализуется через URL, заголовки или параметры запроса.

  14. Что такое JWT и как он используется для авторизации?
    JWT — это токен в виде строки, содержащий данные о пользователе и срок действия. Используется для безсессионной авторизации: клиент получает токен после входа и отправляет его с каждым запросом.

  15. Какие основные различия между TDD и BDD?
    TDD — это подход, при котором сначала пишут тесты, потом код. BDD фокусируется на поведении системы с точки зрения пользователя. BDD ближе к бизнес-требованиям, TDD — к технической реализации.

  16. Что такое RSpec и чем он отличается от MiniTest?
    RSpec — популярный фреймворк для тестирования с понятным языком, близким к естественному. MiniTest — встроенный в Ruby легкий фреймворк, более производительный, но менее выразительный.

  17. Как работают моки и заглушки в тестировании?
    Моки имитируют поведение объектов и проверяют, были ли вызваны нужные методы. Заглушки задают фиксированный ответ, не проверяя, как именно вызывался метод. Оба подхода нужны для изоляции тестируемого кода.

  18. Что такое XSS и как защититься от этой уязвимости в Ruby on Rails?
    XSS — это атака внедрения вредоносного скрипта через поля ввода. Защита в Rails включает автоматическое экранирование вывода, использование sanitize и ограничение разрешённых HTML-тегов.

  19. Как работает кэширование в Rails и какие его виды существуют?
    Rails поддерживает кэширование страниц, действий и фрагментов. Также есть low-level кэширование через Rails.cache. Основная цель — уменьшить нагрузку на сервер и базу данных.

  20. Что такое Redis и как он используется в Ruby-приложениях?
    Redis — это in-memory хранилище данных. Используется для кэширования, очередей задач, хранения сессий и реализации систем уведомлений.

  21. Какие основные отличия Docker от виртуальных машин?
    Docker использует контейнеры, которые легче и быстрее запускаются, так как делят ядро с хост-системой. Виртуальные машины эмулируют целую ОС, поэтому они медленнее и требуют больше ресурсов.

  22. Что такое CI/CD и как его настроить для Ruby-проекта?
    CI/CD — это автоматизация сборки, тестирования и деплоя. Для Ruby можно использовать GitHub Actions, GitLab CI или CircleCI. Настройка включает этапы установки зависимостей, запуска тестов и деплоя на production-сервер.

  23. Что такое DevOps и как он связан с ролью Ruby-разработчика?
    DevOps охватывает процессы разработки, тестирования, деплоя и эксплуатации. Ruby-разработчику важно понимать эти процессы, чтобы эффективно взаимодействовать с командой и обеспечивать бесперебойную работу приложений.

  24. Что такое Sidekiq и как он работает с ActiveJob?
    Sidekiq — это очередь задач, работающая с Redis. ActiveJob — абстракция Rails для работы с очередями. Через ActiveJob можно легко переключаться между разными адаптерми, включая Sidekiq.

  25. Что такое гем и как создать свой гем в Ruby?
    Гем — это пакет с кодом, который можно установить и использовать в других проектах. Чтобы создать свой гем, нужно использовать Bundler (bundle gem my_gem) и заполнить структуру проекта, документацию и зависимости.

  1. Что такое REST API и как он реализуется в Ruby on Rails?
    REST API — это способ взаимодействия клиент-серверного приложения по стандартным HTTP-методам. В Rails его реализуют через контроллеры, возвращающие JSON или XML, и маршруты, соответствующие ресурсной структуре.

  2. Как работает аутентификация через OAuth в Ruby-приложениях?
    OAuth позволяет пользователям войти через сторонние сервисы (например, Google или GitHub), не передавая свои учетные данные. Реализуется с помощью гемов Devise и OmniAuth.

  3. Что такое Sidekiq и как он помогает в обработке фоновых задач?
    Sidekiq — это система очередей задач, использующая Redis для хранения заданий. Он позволяет выполнять тяжелые операции в фоне, не блокируя основной процесс запроса.

  4. Почему важно использовать миграции в Rails и как они работают?
    Миграции позволяют изменять структуру базы данных программно и согласованно между разными окружениями. Они создаются через генераторы и применяются командой rails db:migrate.

  5. Какие преимущества даёт использование FactoryBot вместо фабрик на чистом Ruby?
    FactoryBot предоставляет удобный DSL для создания тестовых объектов с преднастроенными значениями. Это упрощает написание тестов и делает их более читаемыми и поддерживаемыми.

  6. Что такое Rake и как он используется в Ruby-проектах?
    Rake — это инструмент для автоматизации задач, аналогичный make в Unix. Используется для запуска миграций, очистки данных, импорта и других повторяющихся действий.

  7. Как работают callback-функции в ActiveRecord и когда их стоит использовать?
    Callback-функции вызываются в определённые моменты жизненного цикла модели, например, до сохранения или после удаления. Используются для изменения данных перед записью или отправки уведомлений.

  8. Что такое Rack и как он связан с Ruby on Rails?
    Rack — это интерфейс между веб-серверами и Ruby-приложениями. Rails построен на основе Rack и использует его для обработки HTTP-запросов и middleware.

  9. Какие основные отличия между Capybara и RSpec при тестировании?
    Capybara используется для тестирования пользовательского интерфейса и поведения браузера. RSpec больше ориентирован на юнит-тестирование логики. Оба могут использоваться вместе.

  10. Что такое VCR и как он помогает в тестировании внешних API-вызовов?
    VCR записывает реальные HTTP-запросы и сохраняет их в виде "кассет", чтобы повторно использовать в тестах. Это ускоряет выполнение тестов и делает их независимыми от внешних систем.

  11. Как работает авторизация с помощью Pundit в Rails?
    Pundit реализует политики доступа на уровне объектов. Для каждого ресурса создается класс политики, который проверяет, может ли текущий пользователь выполнять действие.

  12. Что такое DevOps и как он связан с ролью Ruby-разработчика?
    DevOps охватывает процессы разработки, тестирования, деплоя и эксплуатации. Ruby-разработчику важно понимать эти процессы, чтобы эффективно взаимодействовать с командой и обеспечивать бесперебойную работу приложений.

  13. Какие преимущества даёт использование Docker в Ruby-проектах?
    Docker упрощает настройку среды, изолирует зависимости, ускоряет развёртывание и гарантирует одинаковое поведение приложения на всех этапах: от разработки до production.

  14. Что такое Ansible и как он используется в деплое Ruby-приложений?
    Ansible — это инструмент автоматизации конфигурации серверов. С его помощью можно автоматизировать установку зависимостей, настройку сервисов и запуск приложений без необходимости писать скрипты вручную.

  15. Какие основные метрики нужно отслеживать в production среде?
    Ключевые метрики включают время отклика, количество ошибок, загрузку CPU и памяти, задержки базы данных, количество активных соединений и частоту запросов.

  16. Что такое A/B тестирование и как оно реализуется в Ruby-приложениях?
    A/B тестирование сравнивает два варианта страницы или функции, чтобы понять, какой из них лучше. Реализуется через разделение пользователей по группам и сохранение результатов.

  17. Что такое DRY, KISS и SOLID и почему они важны в проектировании кода?
    DRY — не повторяйся. KISS — держи просто. SOLID — набор принципов ООП. Все они направлены на улучшение читаемости, тестируемости и поддерживаемости кода.

  18. Какие проблемы могут возникнуть при использовании N+1 запросов и как их избежать?
    N+1 приводит к множеству лишних SQL-запросов, что замедляет приложение. Решается через eager loading (includes, eager_load) или использование гема Bullet.

  19. Что такое Grape и как он используется в создании API?
    Grape — это минималистичный фреймворк для создания RESTful API. Используется вместе с Rails или отдельно для микросервисов.

  20. Что такое Action Cable и как он работает с WebSockets?
    Action Cable добавляет поддержку WebSocket в Rails. Позволяет организовать двустороннюю связь между клиентом и сервером, например, для чата или уведомлений в реальном времени.

  21. Что такое Capistrano и как он помогает в деплое?
    Capistrano — это система автоматизации деплоя. Позволяет легко разворачивать приложения на серверах, выполнять миграции, перезапускать процессы и откатывать изменения.

  22. Как работает garbage collection в Ruby и почему он важен?
    Garbage collector освобождает память, удаляя неиспользуемые объекты. От него зависит производительность и стабильность приложения, особенно при работе с большими объемами данных.

  23. Что такое ActiveSupport и какие полезные методы он предоставляет?
    ActiveSupport — это часть Rails, расширяющая возможности языка. Предоставляет методы вроде present?, in_time_zone, try, deep_dup и другие, упрощающие работу с данными.

  24. Что такое Refile или Shrine и зачем они нужны?
    Это гемы для работы с загрузкой файлов. Они предоставляют удобный интерфейс для обработки, хранения и валидации загружаемых файлов, в том числе изображений.

  25. Какие основные отличия между Heroku и DigitalOcean при развертывании Ruby-приложений?
    Heroku — платформа как услуга, всё уже настроено, но дорого. DigitalOcean — облачный провайдер, где вы сами настраиваете сервер. Это дешевле и гибче, но требует больше знаний.

  26. Что такое Service Object и в чем его преимущество?
    Service Object — это класс, который содержит бизнес-логику вне моделей и контроллеров. Он помогает уменьшить нагрузку на контроллеры и упрощает тестирование.

  27. Что такое Concerns в Rails и как их использовать?
    Concerns — это модули, которые выносят общую логику из моделей и контроллеров. Помогают избавиться от дублирования кода и сделать его более читаемым.

  28. Что такое Repository Pattern и зачем он нужен?
    Repository абстрагирует работу с данными. Упрощает тестирование, позволяет менять источники данных и централизует логику выборки и сохранения.

  29. Что такое Query Object и когда его стоит использовать?
    Query Object инкапсулирует сложные SQL-запросы. Используется, когда логика выборки становится слишком сложной для модели.

  30. Что такое Form Object и как он помогает в обработке форм?
    Form Object инкапсулирует валидацию и обработку формы вне модели. Полезен, когда форма затрагивает несколько моделей или имеет особую логику.

  31. Как работает garbage collection в Ruby и как он влияет на производительность?
    Garbage collection освобождает память, удаляя неиспользуемые объекты. Частый GC может снижать производительность, поэтому важно управлять памятью.

  32. Что такое ORM и как ActiveRecord реализует этот подход?
    ORM — это технология, связывающая объекты с таблицами базы данных. ActiveRecord — это ORM, используемый в Rails для работы с БД.

  33. Какие виды join-запросов существуют в SQL и как они работают?
    Inner Join выбирает совпадающие строки из двух таблиц. Left Join возвращает все строки из первой таблицы и совпадающие из второй. Right Join — обратная ситуация. Full Join включает все записи.

  34. Что такое индекс в базе данных и как он ускоряет запросы?
    Индекс — это структура, которая ускоряет поиск данных. Особенно полезен для часто запрашиваемых столбцов, но замедляет операции вставки и обновления.

  35. Что такое TDD и BDD и в чём их различия?
    TDD — сначала пишутся тесты, потом код. BDD фокусируется на поведении системы с точки зрения пользователя. BDD ближе к бизнес-требованиям, TDD — к технической реализации.

  36. Что такое CI/CD и как его настроить для Ruby-проекта?
    CI/CD — это автоматизация сборки, тестирования и деплоя. Для Ruby можно использовать GitHub Actions, GitLab CI или CircleCI.

  37. Какие основные компоненты входят в архитектуру Clean Architecture?
    Clean Architecture включает слои: Entities, Use Cases, Interface Adapters, Framework & Drivers. Внутренние слои не зависят от внешних.

  38. Что такое MVC и как он реализован в Ruby on Rails?
    MVC — это архитектурный паттерн, разделяющий приложение на модель, представление и контроллер. В Rails: модель — Active Record, контроллер — ActionController, представление — ActionView.

  39. Что такое декораторы в Ruby и зачем они нужны?
    Декораторы добавляют поведение к объектам динамически, без изменения исходного класса. Используются для добавления логики отображения.

  40. Что такое Sidekiq и как он работает с Redis?
    Sidekiq — это очередь задач, работающая через Redis. Задачи добавляются в очередь и выполняются асинхронно.

  41. Что такое VCR и как он помогает в тестировании внешних API?
    VCR записывает HTTP-запросы и сохраняет их в виде кассет. Это ускоряет тесты и делает их независимыми от интернета.

  42. Что такое Devise и как он используется для аутентификации?
    Devise — популярный гем для аутентификации. Предоставляет готовые контроллеры, маршруты и модели для регистрации, входа и восстановления пароля.

  43. Что такое Pundit и как он реализует авторизацию?
    Pundит реализует политики доступа на уровне объектов. Позволяет проверять права пользователя перед выполнением действия.

  44. Что такое Docker Compose и как он используется в Ruby-проектах?
    Docker Compose позволяет запускать несколько контейнеров одновременно, например, приложение + PostgreSQL + Redis.

  45. Что такое Redis и как он используется в Ruby-приложениях?
    Redis — in-memory хранилище, которое используется для кэширования, очередей, хранения состояний и уведомлений.

  46. Что такое Grape и как он отличается от использования Rails для API?
    Grape — это легковесный фреймворк для создания API. В отличие от Rails, он не требует всего стека и предлагает меньше возможностей, но быстрее работает.

  47. Что такое RSpec и как он помогает в тестировании?
    RSpec — популярный фреймворк для тестирования, поддерживающий BDD-подход. Удобен для написания читаемых и документирующих тестов.

  48. Что такое Factory Bot и как он помогает в создании тестовых данных?
    Factory Bot — библиотека для создания тестовых объектов. Поддерживает связи, traits и переопределение полей.

  49. Что такое Postgres и как он отличается от MySQL?
    PostgreSQL — это мощная open-source СУБД с поддержкой JSON, window функций и full-text search. MySQL — более старая и простая СУБД, но менее гибкая.

  50. Что такое пулы соединений и зачем они нужны в Ruby?
    Connection Pool управляет количеством соединений с БД. Позволяет избежать перегрузки базы данных при высоких нагрузках.

  1. Какой гем используется для создания фоновых задач в Ruby?
    A) Devise
    B) Sidekiq
    C) RSpec
    D) Capybara
    Правильный ответ: B) Sidekiq

  2. Что такое ActiveRecord в Rails?
    A) Система маршрутизации
    B) ORM для работы с базами данных
    C) Инструмент для тестирования
    D) Библиотека шаблонизатора
    Правильный ответ: B) ORM для работы с базами данных

  3. Какой метод используется для предотвращения N+1 запросов в ActiveRecord?
    A) where
    B) includes
    C) map
    D) each
    Правильный ответ: B) includes

  4. Какой фреймворк используется для REST API в Ruby, помимо Rails?
    A) Grape
    B) Puma
    C) Capistrano
    D) Pry
    Правильный ответ: A) Grape

  5. Для чего используется гем Devise?
    A) Для тестирования
    B) Для авторизации
    C) Для миграций
    D) Для кэширования
    Правильный ответ: B) Для авторизации

  6. Какой объект позволяет динамически создавать методы в Ruby?
    A) Module
    B) Proc
    C) define_method
    D) eval
    Правильный ответ: C) define_method

  7. Что означает принцип DRY?
    A) Don’t Repeat Yourself
    B) Do Run Yourself
    C) Data Reduce Yourself
    D) Don’t Refactor Yourself
    Правильный ответ: A) Don’t Repeat Yourself

  8. Как реализуется наследование в Ruby?
    A) Через ключевое слово extends
    B) Через ключевое слово include
    C) Через <
    D) Через module
    Правильный ответ: C) Через <

  9. Какой инструмент используется для управления зависимостями в Ruby?
    A) Bundler
    B) Docker
    C) Ansible
    D) Capistrano
    Правильный ответ: A) Bundler

  10. Что такое 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

  11. Какой гем используется для тестирования поведения пользовательского интерфейса?
    A) RSpec
    B) FactoryBot
    C) Capybara
    D) VCR
    Правильный ответ: C) Capybara

  12. Что такое миграции в Rails?
    A) Тестовые данные
    B) Изменения в структуре базы данных
    C) Логика бизнес-процессов
    D) Файлы конфигурации
    Правильный ответ: B) Изменения в структуре базы данных

  13. Какой файл определяет маршруты в Rails?
    A) config.ru
    B) routes.rb
    C) application.rb
    D) environment.rb
    Правильный ответ: B) routes.rb

  14. Что представляет собой Rack?
    A) ORM
    B) Интерфейс между сервером и приложением
    C) Система тестирования
    D) Web framework
    Правильный ответ: B) Интерфейс между сервером и приложением

  15. Какой метод используется для записи логов в Rails?
    A) puts
    B) p
    C) logger
    D) print
    Правильный ответ: C) logger

  16. Что такое Service Object в Rails?
    A) Контроллер
    B) Объект, содержащий бизнес-логику
    C) Модель
    D) View helper
    Правильный ответ: B) Объект, содержащий бизнес-логику

  17. Какой гем чаще всего используется для кэширования в Rails?
    A) Sidekiq
    B) Redis
    C) Bullet
    D) Devise
    Правильный ответ: B) Redis

  18. Какой HTTP-статус возвращается при успешном запросе?
    A) 200
    B) 404
    C) 500
    D) 302
    Правильный ответ: A) 200

  19. Для чего используется метод method_missing в Ruby?
    A) Для вызова случайного метода
    B) Для создания ошибок
    C) Для обработки вызова несуществующих методов
    D) Для завершения программы
    Правильный ответ: C) Для обработки вызова несуществующих методов

  20. Что описывает принцип 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

  21. Какой гем используется для версионирования API в Rails?
    A) ActiveModelSerializers
    B) Grape
    C) Versionist
    D) Swagger
    Правильный ответ: C) Versionist

  22. Что такое Action Cable?
    A) Инструмент для работы с HTTP
    B) Интеграция с WebSocket
    C) Система маршрутов
    D) Механизм кэширования
    Правильный ответ: B) Интеграция с WebSocket

  23. Какой тип безопасности защищает от XSS-атак в Rails?
    A) CSRF protection
    B) SQL injection filter
    C) HTML escaping
    D) Authentication
    Правильный ответ: C) HTML escaping

  24. Для чего нужен гем Bullet?
    A) Проверка производительности
    B) Поиск N+1 запросов
    C) Оптимизация изображений
    D) Упрощение маршрутов
    Правильный ответ: B) Поиск N+1 запросов

  25. Какой командой применяются миграции в Rails?
    A) rails db:create
    B) rails db:migrate
    C) rails db:seed
    D) rails db:reset
    Правильный ответ: B) rails db:migrate

  1. Какой гем используется для автоматизации процессов развертывания в Ruby?
    A) pry
    B) rake
    C) capistrano
    D) redis
    Правильный ответ: C) capistrano

  2. Что описывает принцип SOLID?
    A) Пять основных принципов ООП
    B) Пять методов оптимизации баз данных
    C) Сет правил работы с API
    D) Формат написания миграций
    Правильный ответ: A) Пять основных принципов ООП

  3. Какой файл в Ruby on Rails отвечает за настройку маршрутов?
    A) config/application.rb
    B) config/routes.rb
    C) app/controllers/application_controller.rb
    D) Gemfile
    Правильный ответ: B) config/routes.rb

  4. Как называется подход, при котором бизнес-логика выносится из моделей и контроллеров в отдельные классы?
    A) MVC
    B) Repository Pattern
    C) Service Objects
    D) Active Record
    Правильный ответ: C) Service Objects

  5. Что такое Rack middleware в Rails?
    A) Модель данных
    B) Слой между сервером и приложением
    C) Контроллер
    D) Вспомогательная функция
    Правильный ответ: B) Слой между сервером и приложением

  6. Какой гем используется для создания пользовательских DSL в Ruby?
    A) RSpec
    B) Sidekiq
    C) metaprogramming
    D) Puma
    Правильный ответ: C) metaprogramming

  7. Что делает метод try в ActiveSupport?
    A) Вызывает случайный метод
    B) Выполняет блок кода несколько раз
    C) Позволяет вызвать метод у объекта, даже если он nil
    D) Перезапускает программу
    Правильный ответ: C) Позволяет вызвать метод у объекта, даже если он nil

  8. Какой тип проверки используется в Devise для ограничения доступа к ресурсам?
    A) CSRF protection
    B) SQL injection filter
    C) Authentication
    D) Authorization
    Правильный ответ: D) Authorization

  9. Что такое Grape в экосистеме Ruby?
    A) ORM
    B) Тестовый фреймворк
    C) Легковесный фреймворк для REST API
    D) Инструмент деплоя
    Правильный ответ: C) Легковесный фреймворк для REST API

  10. Какой гем позволяет записывать HTTP-запросы и использовать их в тестах повторно?
    A) FactoryBot
    B) VCR
    C) Capybara
    D) Bullet
    Правильный ответ: B) VCR

  11. Какой командой создается база данных в Rails?
    A) rails db:create
    B) rails db:migrate
    C) rails db:reset
    D) rails db:setup
    Правильный ответ: A) rails db:create

  12. Что такое garbage collection в Ruby?
    A) Удаление неиспользуемых файлов
    B) Освобождение памяти от неиспользуемых объектов
    C) Очистка кэша
    D) Удаление старых миграций
    Правильный ответ: B) Освобождение памяти от неиспользуемых объектов

  13. Какой гем предоставляет удобный DSL для создания тестовых данных?
    A) RSpec
    B) FactoryBot
    C) VCR
    D) Pry
    Правильный ответ: B) FactoryBot

  14. Какой метод используется для асинхронной загрузки данных в Rails?
    A) include
    B) eager_load
    C) preload
    D) background_job
    Правильный ответ: D) background_job

  15. Что такое Concerns в Rails?
    A) Модели
    B) Модули для выноса общей логики
    C) Тестовые данные
    D) Вспомогательные классы
    Правильный ответ: B) Модули для выноса общей логики

  16. Какой файл содержит зависимости проекта в Ruby?
    A) routes.rb
    B) Gemfile
    C) application.rb
    D) database.yml
    Правильный ответ: B) Gemfile

  17. Какой из следующих принципов говорит, что класс должен иметь только одну причину для изменения?
    A) Open/Closed Principle
    B) Single Responsibility Principle
    C) Liskov Substitution Principle
    D) Dependency Inversion Principle
    Правильный ответ: B) Single Responsibility Principle

  18. Какой инструмент позволяет выполнять задачи параллельно в Ruby?
    A) Thread
    B) Process
    C) Fiber
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  19. Что такое Action Cable в Rails?
    A) Система маршрутов
    B) Интеграция с WebSocket
    C) ORM
    D) Инструмент кэширования
    Правильный ответ: B) Интеграция с WebSocket

  20. Какой тип кэширования используется для хранения результатов запросов к БД?
    A) Page caching
    B) Action caching
    C) Fragment caching
    D) Low-level caching
    Правильный ответ: D) Low-level caching

  21. Какой гем используется для анализа производительности запросов к базе данных?
    A) Bullet
    B) VCR
    C) Capybara
    D) Rake
    Правильный ответ: A) Bullet

  22. Что такое Refile или Shrine в Ruby?
    A) ORM
    B) Гемы для работы с файлами и изображениями
    C) Инструменты тестирования
    D) Фреймворки для API
    Правильный ответ: B) Гемы для работы с файлами и изображениями

  23. Какой HTTP-статус означает временное перенаправление?
    A) 200
    B) 302
    C) 404
    D) 500
    Правильный ответ: B) 302

  24. Какой командой запускается консоль Ruby?
    A) ruby console
    B) irb
    C) rails console
    D) rspec
    Правильный ответ: B) irb

  25. Что такое Docker в контексте Ruby-разработки?
    A) Система контроля версий
    B) Инструмент для построения изолированных сред выполнения
    C) ORM
    D) Фреймворк для тестирования
    Правильный ответ: B) Инструмент для построения изолированных сред выполнения

  1. Какой из следующих гемов используется для работы с тестами в Ruby?
    A) Pry
    B) RSpec
    C) Sidekiq
    D) Puma
    Правильный ответ: B) RSpec

  2. Что такое миграция в Rails?
    A) Перемещение данных между серверами
    B) Изменение структуры базы данных
    C) Обновление гемов
    D) Переход на новую версию Rails
    Правильный ответ: B) Изменение структуры базы данных

  3. Какой метод позволяет выполнить код только если объект не nil?
    A) map
    B) try
    C) each
    D) select
    Правильный ответ: B) try

  4. Какой гем используется для создания и управления HTTP-запросами в тестах?
    A) FactoryBot
    B) VCR
    C) Faraday
    D) Pry
    Правильный ответ: C) Faraday

  5. Что означает принцип KISS в разработке?
    A) Делать всё максимально сложным
    B) Делать всё просто и понятно
    C) Использовать как можно больше паттернов
    D) Писать много комментариев
    Правильный ответ: B) Делать всё просто и понятно

  6. Какой тип кэширования применяется на уровне отдельных частей страницы?
    A) Page caching
    B) Action caching
    C) Fragment caching
    D) Low-level caching
    Правильный ответ: C) Fragment caching

  7. Какой командой запускается консоль Rails?
    A) rails console
    B) irb
    C) pry
    D) rails dbconsole
    Правильный ответ: A) rails console

  8. Что делает гем Bullet?
    A) Ускоряет загрузку страниц
    B) Помогает находить N+1 запросы
    C) Тестирует пользовательский интерфейс
    D) Упрощает деплой
    Правильный ответ: B) Помогает находить N+1 запросы

  9. Какой из перечисленных гемов используется для автоматизации задач?
    A) Rake
    B) RSpec
    C) Capybara
    D) VCR
    Правильный ответ: A) Rake

  10. Что представляет собой Sidekiq?
    A) Система маршрутизации
    B) Очередь фоновых задач
    C) ORM
    D) Инструмент тестирования
    Правильный ответ: B) Очередь фоновых задач

  11. Какой тип проверки используется для подтверждения личности пользователя?
    A) Authorization
    B) Authentication
    C) Validation
    D) Verification
    Правильный ответ: B) Authentication

  12. Что такое ActiveSupport в Rails?
    A) ORM
    B) Библиотека расширений языка Ruby
    C) Система тестирования
    D) Веб-сервер
    Правильный ответ: B) Библиотека расширений языка Ruby

  13. Какой из следующих методов вызывается, когда у объекта нет нужного метода?
    A) method_missing
    B) send
    C) respond_to?
    D) public_send
    Правильный ответ: A) method_missing

  14. Что такое Concern в контексте Rails?
    A) Контроллер
    B) Модель
    C) Модуль, выносящий общую логику
    D) View
    Правильный ответ: C) Модуль, выносящий общую логику

  15. Какой из следующих фреймворков используется для построения микросервисов в Ruby?
    A) Sinatra
    B) Grape
    C) Rails
    D) Все вышеперечисленное
    Правильный ответ: D) Все вышеперечисленное

  16. Какой HTTP-статус означает внутреннюю ошибку сервера?
    A) 200
    B) 302
    C) 404
    D) 500
    Правильный ответ: D) 500

  17. Что такое DevOps в контексте Ruby-разработки?
    A) Процесс написания бизнес-логики
    B) Автоматизация и интеграция процессов разработки и эксплуатации
    C) Тестирование юнитов
    D) Работа с базой данных
    Правильный ответ: B) Автоматизация и интеграция процессов разработки и эксплуатации

  18. Какой гем используется для работы с Redis в Ruby?
    A) redis
    B) sidekiq
    C) sequel
    D) mongoid
    Правильный ответ: A) redis

  19. Что такое 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

  20. Какой файл используется для хранения переменных окружения в Ruby-проектах?
    A) .env
    B) Gemfile
    C) routes.rb
    D) config.ru
    Правильный ответ: A) .env

  21. Какой из следующих методов позволяет выбрать все элементы, соответствующие условию?
    A) select
    B) reject
    C) find
    D) detect
    Правильный ответ: A) select

  22. Что такое API-first подход?
    A) Разработка начинается с UI
    B) Разработка начинается с бэкенда без учёта клиента
    C) Разработка начинается с проектирования API
    D) Разработка начинается с тестов
    Правильный ответ: C) Разработка начинается с проектирования API

  23. Какой гем используется для документирования REST API в Ruby?
    A) Swagger
    B) RDoc
    C) YARD
    D) Markdown
    Правильный ответ: A) Swagger

  24. Что такое Docker в Ruby-разработке?
    A) Система контроля версий
    B) Инструмент для создания изолированных сред
    C) ORM
    D) Фреймворк для тестирования
    Правильный ответ: B) Инструмент для создания изолированных сред

  25. Какой из следующих принципов говорит, что программы должны зависеть от абстракций, а не от конкретных реализаций?
    A) Single Responsibility Principle
    B) Dependency Inversion Principle
    C) Open/Closed Principle
    D) Liskov Substitution Principle
    Правильный ответ: B) Dependency Inversion Principle

Экзаменационный билет №1

Теоретическая часть

  1. Что такое паттерн проектирования Facade и зачем он нужен?
  2. Опишите принцип работы ORM ActiveRecord в Rails и поясните, почему оно является полезным инструментом для разработчиков backend на Ruby on Rails.

Ответы на теоретические вопросы:

  1. Паттерн Facade упрощает взаимодействие с системой сложной структуры, предоставляя единый интерфейс для взаимодействия с несколькими подсистемами. Например, он полезен для сокрытия деталей реализации сложного API-интерфейса от клиента, позволяя сосредоточиться лишь на необходимых функциях.
  2. 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

Теоретическая часть

  1. Чем отличается статический метод от инстанцированного метода в Ruby?
  2. Поясните разницу между сессиями и куки в веб-приложениях на примере их использования в Rails.

Ответы на теоретические вопросы:

  1. Статический метод принадлежит классу и доступен непосредственно через имя класса, тогда как инстанцированный метод относится к экземпляру объекта и требует наличия объекта конкретного класса для вызова. Пример: методы классов (self.method) vs методы экземпляров объектов (@instance_method).
  2. Куки хранятся на стороне браузера и отправляются обратно серверу с каждым запросом. Они полезны для хранения небольших объемов данных, связанных с браузером. Сессии же управляются сервером и хранят состояние текущего сеанса пользователя, обеспечивая возможность авторизации и персонализации интерфейсов. Обычно сессии шифруются и подписываются, что повышает безопасность.

Практическая часть Реализовать простую аутентификацию пользователя с использованием сессий в контроллере 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

Теоретическая часть

  1. Какие виды ассоциаций поддерживает ActiveRecord и какова разница между ними?
  2. Объясните назначение Rake-задач и покажите пример их использования в Ruby on Rails.

Ответы на теоретические вопросы:

  1. ActiveRecord поддерживает такие ассоциации, как has_many, belongs_to, has_one, has_and_belongs_to_many и многие другие. Эти ассоциации позволяют моделировать связи между объектами и обеспечивают удобные способы навигации и манипуляции этими связями.
  2. 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

Теоретическая часть

  1. Расскажите о механизмах обработки исключений в Ruby и приведите пример.
  2. Что такое middleware в Rails и какую роль он играет в обработке запросов?

Ответы на теоретические вопросы:

  1. Исключения в Ruby обрабатываются блоками begin/rescue/ensure. Если исключение возникает внутри блока begin, оно перехватывается rescue-блоком, а ensure выполняется независимо от возникновения исключения. Пример:
  2. begin
  3.   # опасная операция
  4. rescue Exception => e
  5.   puts "Ошибка: #{e.message}"
  6. ensure
  7.   # очистка ресурсов

end

  1. 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

Теоретическая часть

  1. Перечислите основные принципы SOLID и объясните, как они помогают писать качественный код.
  2. Почему важно проводить рефакторинг кода и как часто это рекомендуется делать?

Ответы на теоретические вопросы:

  1. Принципы SOLID включают:
    • Single Responsibility Principle (SRP): Один класс должен иметь одну ответственность.
    • Open/Closed Principle (OCP): Программные сущности должны быть открыты для расширения, но закрыты для модификации.
    • Liskov Substitution Principle (LSP): Подтипы должны заменять типы родительского класса без нарушения поведения программы.
    • Interface Segregation Principle (ISP): Клиенты не должны зависеть от методов, которыми они не пользуются.
    • Dependency Inversion Principle (DIP): Модули высокого уровня не должны зависеть от модулей низкого уровня.
  2. Рефакторинг улучшает качество кода, делая его более читаемым, поддерживаемым и расширяемым. Рекомендуется регулярно выполнять рефакторинг, особенно после введения новых функций или исправления ошибок.

Практическая часть Преобразовать следующий фрагмент кода в соответствии с принципом 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

Теоретическая часть

  1. Что такое символическое обозначение (:symbol) в Ruby и в чем его преимущество перед строковыми значениями ("string")?
  2. Как организовать тестирование RESTful API с помощью RSpec в проекте Ruby on Rails?

Ответы на теоретические вопросы:

  1. Символы в Ruby представляют собой уникальные идентификаторы, занимающие меньше памяти и работающие быстрее, поскольку создаются однократно. Строки дублируются при каждом объявлении, увеличивая нагрузку на память. Использование символов предпочтительно там, где важна производительность и однозначность значения.
  2. Для тестирования 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

Теоретическая часть

  1. Что такое блоки и прокси-методы (&block) в Ruby? Приведите пример использования блоков.
  2. Какой механизм обеспечивает хранение конфигурации среды окружения в Ruby on Rails и как правильно его настроить?

Ответы на теоретические вопросы:

  1. Блоки в Ruby позволяют передавать анонимные фрагменты кода в качестве аргументов методов. Прокси-метод (&block) передает блок в виде параметра. Пример использования блока:

[1, 2, 3].each { |num| puts num } # выводит числа массива

  1. Конфигурация среды окружения в 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

Теоретическая часть

  1. Что такое метаклассы в Ruby и как они работают?
  2. Что означает понятие "область видимости" в Ruby и какие существуют уровни области видимости?

Ответы на теоретические вопросы:

  1. Метакласс в Ruby — это класс, связанный с объектом и содержащий методы, специфичные именно для этого объекта. Каждый экземпляр объекта имеет собственный метакласс, наследующий поведение от своего базового класса. Таким образом, Ruby реализует концепцию методов, определенных для отдельных объектов.
  2. Области видимости определяют доступность переменных и методов в разных частях программы. Основные уровни областей видимости в 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

Теоретическая часть

  1. В чем заключается особенность архитектуры MVC в Ruby on Rails и какие её ключевые элементы?
  2. Какие инструменты и подходы используют для оптимизации производительности Rails-приложений?

Ответы на теоретические вопросы:

  1. Архитектура MVC (Model–View–Controller) разделяет приложение на три компонента:
    • Модель (Model) управляет данными и бизнес-логикой.
    • Представление (View) отображает данные пользователю.
    • Контроллер (Controller) координирует взаимодействие между моделью и представлением.
  2. Оптимизация производительности 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

Теоретическая часть

  1. В чем отличие методов include и extend в модулях Ruby?
  2. Как эффективно интегрировать внешний сервис в Rails-проект, используя Faraday?

Ответы на теоретические вопросы:

  1. Метод include подключает модуль к экземплярам класса, добавляя методы модуля как методы экземпляра. Метод extend делает методы модуля методами самого класса.
  2. Интеграция внешнего сервиса с помощью 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

Теоретическая часть

  1. Назовите особенности управления зависимостями в Ruby с помощью Bundler и Gemfile. Какие команды чаще всего используются для работы с пакетами?
  2. Объясните термин "сервер приложений" и укажите, какие наиболее распространенные решения применяются в экосистеме Ruby/Rails.

Ответы на теоретические вопросы:

  1. Управление зависимостями в Ruby реализовано через инструмент Bundler, использующий файл Gemfile. Этот инструмент автоматически устанавливает необходимые пакеты, разрешая конфликты версий. Наиболее частые команды: bundle install, bundle update, bundle exec.
  2. Сервер приложений (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

Теоретическая часть

  1. Дайте определение понятию "метапрограммирование" в Ruby и опишите, каким образом этот механизм применяется в реальной практике.
  2. Объясните назначение Rack-межуровней (middleware) и какой основной функционал они выполняют в Ruby/Rails приложениях.

Ответы на теоретические вопросы:

  1. Метапрограммирование — это способность программы динамически менять своё собственное поведение во время исполнения. В Ruby это реализуется с помощью механизмов отражения и динамического определения методов и классов. Используется для создания гибких фреймворков и библиотек, например, ActiveSupport и Railties.
  2. 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

Теоретическая часть

  1. В чем состоит ключевое различие между рельсовым генератором generate scaffold и ручным созданием контроллеров, представлений и моделей?
  2. Назовите две стратегии деплоя (развёртывания) Ruby on Rails приложений и перечислите их плюсы и минусы.

Ответы на теоретические вопросы:

  1. Генерация scaffold создаёт готовый шаблон проекта с контроллером, моделями, видами и маршрутом, автоматически настраивая минимальный функционал. Ручное создание даёт больше контроля и возможности кастомизировать каждую деталь, однако занимает больше времени.
  2. Две основные стратегии развёртывания:
    • 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

Теоретическая часть

  1. Описать цикл жизни запроса в Rails и объяснить порядок прохождения через роутинг, контроллер и представление.
  2. Объяснить суть термина "циклическая зависимость" в Ruby и как избежать подобного явления в крупных проектах.

Ответы на теоретические вопросы:

  1. Цикл жизни запроса начинается с попадания на сервер (обычно Nginx/Puma), далее передается в роутер (routes.rb), который определяет подходящий контроллер и действие. Затем контроллер исполняет логику, возможно взаимодействуя с моделью. Наконец, генерируется представление и отправляется клиенту ответ.
  2. Циклическая зависимость возникает, когда классы взаимозависимы друг от друга, создавая замкнутый круг. Избежать этого можно путём разделения функциональности, использования интерфейсов и внедрения сторонних сервисов для декомпозиции зависимостей.

Практическая часть

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

# 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

Теоретическая часть

  1. В чем принципиальное отличие подхода "Active Model" от традиционной модели MVC в Ruby on Rails?
  2. Зачем нужны мьютексы (Mutex) в многопоточных приложениях Ruby и как их применять?

Ответы на теоретические вопросы:

  1. Active Model вводит концепции "моделей" и "валидаторов", расширяя традиционную архитектуру MVC возможностью организации единой точки проверки данных, не зависящей от конкретных реализаций (например, база данных или внешняя система).
  2. Мьютексы (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, который будет соответствовать современным стандартам.

 

Роли в команде

Роль
Описание
Архитектор
Отвечает за общую архитектуру API, маршруты, версионирование, выбор инструментов
Backend-программист
Реализует модели, контроллеры, бизнес-логику, сервисные объекты
Тестировщик
Пишет тесты, проверяет работоспособность API, ищет ошибки
DevOps-инженер
Настройка окружения, запуск сервера, деплой локального 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).
  • Практика использования сервисных объектов, декораторов и миграций.
  • Работа в команде, общение между специалистами, управление задачами.
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Не работает POST-запрос
Неправильное использование strong parameters
Проверить метод permit в контроллере
Тесты падают
Нет фабрик или неверные условия
Проверить FactoryBot и RSpec
Нет версионирования API
Не настроены namespace или заголовки
Использовать версию в URL или Accept-заголовке
Не работает сериализация JSON
Нет ActiveModel::Serializer или Jbuilder
Настроить сериализацию
Ошибки при запуске сервера
Конфликты гемов или не установлено окружение
Проверить Gemfile и bundle install
Нет документации
Не использовался Swagger или Markdown
Написать документацию вручную или использовать Swagger UI
API медленно отвечает
Нет eager loading или индексов
Оптимизировать запросы, добавить includes

Дополнительно

  • Можно использовать готовый шаблон проекта с установленными гемами: rspec, factory_bot, swagger-ui, puma.
  • Предложить командам реализовать дополнительные фичи:
    • Авторизация через JWT.
    • Поиск товаров по параметрам.
    • Статусы заказов.
    • Пагинация.
    • Логирование запросов.

Ролевая игра №2: "Разработка системы оплаты на Ruby"

Цель игры

Научить студентов проектировать безопасную систему обработки платежей с использованием сторонних сервисов (Stripe, PayPal), а также интегрировать платёжные операции в Rails-приложение. Имитировать командную разработку с акцентом на безопасность и транзакции.

 

Формат

  • Тип: Образовательная ролевая игра
  • Участники: 5–6 человек
  • Продолжительность: 4 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблон проекта на Ruby on Rails
 

Сеттинг

Вы — команда разработчиков, которая получает задание от заказчика: внедрить систему оплаты в существующий онлайн-магазин. Клиент хочет, чтобы пользователи могли выбрать товар, оформить заказ и оплатить его через Stripe или PayPal. Демонстрация должна состояться уже завтра.

 

Роли в команде

Роль
Описание
Архитектор
Отвечает за общую логику работы системы оплаты, выбор API, маршруты
Backend-программист
Реализует модели Order, Payment, взаимодействие с платёжным API
Тестировщик
Проверяет работу оплаты, пишет тесты, ищет уязвимости
DevOps-инженер
Настройка окружения, переменных окружения, запуск приложения
Специалист по безопасности
Отвечает за защиту данных, проверяет обработку ошибок, работу с токенами
Менеджер проекта
Следит за выполнением задач, распределяет нагрузку, проводит встречи

Этапы игры

Этап 1: Брифинг

  • Архитектор представляет концепцию: «Система оплаты товаров через Stripe/PayPal, с подтверждением транзакций и обновлением статуса заказа».
  • Менеджер проекта делит задачи:
    • Создание моделей Order, Payment
    • Интеграция Stripe API
    • Реализация формы оплаты
    • Написание тестов
    • Настройка окружения и переменных
    • Подготовка презентации

Этап 2: Разработка

  • Каждые 10–15 минут проводится короткая встреча (stand-up):
    • Что сделал?
    • Над чем работаешь?
    • Есть ли блокеры?

Этап 3: Презентация

  • Команда демонстрирует работу системы:
    • Выбор товара → создание заказа → оплата → изменение статуса
    • Все участники проверяют:
      • Корректность работы с API
      • Безопасность передачи данных
      • Логирование и обработку ошибок
 

Обучающие эффекты

  • Знакомство с платёжными API (Stripe, PayPal)
  • Изучение принципов безопасной обработки данных
  • Практика работы с транзакциями в ActiveRecord
  • Углубление знаний о тестировании внешних API
  • Работа в команде и управление задачами
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Не работает оплата
Неправильный ключ или URL
Проверить .env файлы и документацию
Статус заказа не обновляется
Нет обработчика webhook или callback
Добавить контроллер для webhook
Тесты падают
Нет мока для внешнего API
Использовать VCR или WebMock
Ошибка 400 при запросе к Stripe
Неверно собран payload
Проверить параметры метода charge
Нет логирования
Не используется logger или Sentry
Включить логирование в контроллере
Ошибка CSRF
Не настроен protect_from_forgery
Добавить skip_before_action в контроллер платежей

Дополнительно

  • Можно использовать заготовленный проект с установленным 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.


Роли в команде

Роль
Описание
DevOps-инженер
Настройка CI/CD, сервера, Docker
Backend-программист
Готовит приложение к деплою
Тестировщик
Пишет тесты, проверяет автоматический запуск
Системный администратор
Настройка сервера, базы данных, домена
Git-специалист
Работает с ветками, мерджами, pull request'ами
Менеджер проекта
Следит за выполнением задач, распределяет нагрузку

Этапы игры

Этап 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
  • Работа в команде и совместная настройка инфраструктуры
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Тесты не запускаются
Неправильно написан workflow
Проверить .github/workflows
Docker-образ не собирается
Ошибки в Dockerfile
Проверить пути, зависимости
Приложение не доступно
Ошибка в deploy скрипте или Nginx
Проверить логи на сервере
База данных не создаётся
Нет миграций или не запущены
Добавитьrails db:migrateв deploy
Переменные окружения не найдены
Нет .env или они не передаются
Добавить в workflow secrets
Конфликты в Git
Несколько людей правят один файл
Решать через merge или rebase

Дополнительно

  • Можно использовать готовый проект с тестами и Dockerfile.
  • Предложить командам реализовать:
    • Деплой на Heroku / DigitalOcean / AWS
    • Автоматическое создание релизов
    • Отправку уведомлений в Slack
    • Rollback версии
    • Canary release или blue/green deployment
 

Ролевая игра №4: "Разработка микросервисной архитектуры на Ruby"

Цель игры

Научить студентов проектировать и разрабатывать микросервисную архитектуру, работать с несколькими независимыми сервисами, организовывать обмен данными между ними. Имитировать масштабируемую систему и командную разработку.

 

Формат

  • Тип: Образовательная ролевая игра
  • Участники: 5–6 человек
  • Продолжительность: 4 академических часа
  • Материалы: доска, стикеры, карточки ролей, описание задания, шаблоны сервисов на Ruby
 

Сеттинг

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

 

Роли в команде

Роль
Описание
Архитектор
Проектирует общую архитектуру, связи между сервисами
Сервис-программист #1
Реализует сервис товаров
Сервис-программист #2
Реализует сервис заказов
Сервис-программист #3
Реализует сервис уведомлений
Тестировщик
Проверяет работу каждого сервиса и их интеграцию
DevOps-инженер
Настройка Docker, сетей, запуск всех сервисов
Менеджер проекта
Следит за выполнением задач, распределяет нагрузку

Этапы игры

Этап 1: Брифинг

  • Архитектор объясняет: «Нужно разбить монолит на микросервисы, каждый из которых будет отвечать за свою часть бизнес-логики».
  • Менеджер проекта делит задачи:
    • Создание отдельных сервисов
    • Реализация REST API для каждого
    • Настройка связи между сервисами
    • Тестирование и запуск

Этап 2: Разработка

  • Каждые 10–15 минут проводится stand-up:
    • Что сделал?
    • Над чем работаешь?
    • Есть ли блокеры?

Этап 3: Презентация

  • Команда запускает все сервисы через Docker Compose.
  • Все участники проверяют:
    • Работу каждого сервиса
    • Интеграцию между ними
    • Обработку ошибок и логирование
 

Обучающие эффекты

  • Знакомство с микросервисной архитектурой
  • Изучение принципов разделения ответственности
  • Практика работы с REST API и HTTP-запросами между сервисами
  • Освоение Docker Compose
  • Работа в команде и управление зависимостями
 

Возможные проблемы и вызовы во время игры

Проблема
Возможная причина
Как решить
Сервисы не видят друг друга
Неправильная настройка сети в Docker
Использовать Docker Compose
Запросы между сервисами падают
Неверные URL или порты
Проверить env-файлы
Тесты падают
Нет мока или нет контейнера
Использовать WebMock или shared mocks
Не работает сборка
Ошибки в Dockerfile
Проверить зависимости и команды
Нет логирования
Не используются logger или stdout
Добавить вывод в терминал или файл
Конфликты в коде
Несколько людей правят один сервис
Разделить задачи внутри сервиса

Дополнительно

  • Можно использовать готовые шаблоны сервисов на 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.

 

Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
13:43
24
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.