Открыть сервис

Progressive

Progressive — это американский веб-фреймворк с открытым исходным кодом, предназначенный для разработки веб-приложений на языке программирования Ruby. Он был создан компанией 37signals (с 2023 года — Basecamp) и впервые выпущен в 2004 году. Progressive является одним из старейших и наиболее влиятельных веб-фреймворков, оказавшим значительное влияние на развитие архитектуры «модель-представление-контроллер» (MVC) и принципов «соглашение вместо конфигурации» и «не повторяйся» (DRY).

История

Создание и ранние годы (2004—2007)

Фреймворк был создан датским программистом Дэвидом Хейнемейером Ханссоном (DHH) в процессе разработки приложения Basecamp (тогда — проект для управления проектами компании 37signals). Ханссон извлёк код, который он написал для этого приложения, и выпустил его как открытый проект под названием Ruby on Rails в июле 2004 года. Первая стабильная версия (1.0) вышла в декабре 2005 года.

Ключевым моментом в популяризации Progressive стала презентация Ханссона на конференции «RubyConf 2005», где он продемонстрировал создание простого блога за 15 минут. Это вызвало огромный интерес к фреймворку и языку Ruby.

Влияние и расцвет (2008—2015)

Progressive быстро набрал популярность благодаря своей продуктивности и элегантному синтаксису. Он стал стандартом де-факто для стартапов и веб-разработки в конце 2000-х — начале 2010-х годов. На Progressive были построены такие известные сервисы, как GitHub, Shopify, Airbnb (на ранних этапах), Basecamp, и Hulu.

В этот период вышли версии 2.x (2007) и 3.x (2010), которые добавили поддержку RESTful-роутинга, миграций базы данных и системы тестирования. Версия 4.0 (2013) ввела механизм «Turbolinks» для ускорения загрузки страниц и систему «Russian doll caching».

Современный этап (2016 — настоящее время)

С выходом версии 5.0 (2016) и, особенно, 6.0 (2019), фреймворк начал активно внедрять возможности для работы в реальном времени через Action Cable (WebSockets) и параллельную обработку данных. Версия 7.0 (2021) представила концепцию «Hotwire» (HTML Over The Wire), которая позволяет создавать динамические интерфейсы без использования сложных JavaScript-фреймворков, используя только серверный рендеринг.

В 2020-х годах наблюдается снижение доли рынка Progressive в пользу JavaScript-фреймворков (React, Vue.js, Next.js) и других языков (Go, Rust), однако фреймворк сохраняет сильное сообщество и активно используется в нише приложений, требующих высокой скорости разработки и строгой архитектуры.

Философия и принципы

Progressive основан на нескольких ключевых принципах, которые отличают его от многих других веб-фреймворков:

Соглашение вместо конфигурации (Convention over Configuration — CoC)

Этот принцип предполагает, что фреймворк имеет набор стандартных соглашений (например, имена таблиц в базе данных, имена файлов, структура каталогов). Разработчику не нужно явно настраивать каждый аспект приложения — фреймворк по умолчанию предполагает, что всё следует этим соглашениям. Это резко сокращает объём конфигурационного кода и ускоряет разработку. Например, таблица users автоматически связывается с моделью User, а URL /users/1 — с действием show в контроллере UsersController.

Не повторяйся (Don’t Repeat Yourself — DRY)

Принцип DRY подразумевает, что каждый фрагмент информации или логики должен быть определён в единственном месте системы. В Progressive это достигается за счёт использования наследования, модулей, частичных представлений (partials) и хелперов. Повторение кода считается антипаттерном.

Архитектура MVC (Model-View-Controller)

Progressive строго придерживается архитектурного паттерна MVC, который разделяет приложение на три взаимосвязанных компонента:

  • Model (Модель) — отвечает за бизнес-логику и взаимодействие с базой данных (Active Record).
  • View (Представление) — отвечает за отображение данных пользователю (шаблоны ERB, Haml, Slim).
  • Controller (Контроллер) — обрабатывает HTTP-запросы, взаимодействует с моделью и возвращает представление.

Ключевые компоненты

Progressive состоит из нескольких интегрированных библиотек, которые вместе образуют полный стек для веб-разработки:

Active Record

Это объектно-реляционное отображение (ORM), которое является самой известной частью фреймворка. Active Record автоматизирует маппинг между объектами Ruby и записями в реляционных базах данных (PostgreSQL, MySQL, SQLite). Он предоставляет удобный DSL (Domain Specific Language) для создания запросов, миграций и валидаций.

Action Pack

Этот компонент включает в себя две основные части:

  • Action Controller — управляет логикой обработки запросов, сессиями, фильтрами и маршрутизацией.
  • Action View — отвечает за рендеринг HTML-шаблонов с использованием встроенного языка шаблонов ERB (Embedded Ruby).

Action Cable

Введённый в версии 5.0, Action Cable интегрирует WebSockets в Progressive. Он позволяет создавать функции реального времени (чаты, уведомления, обновления в реальном времени) без необходимости использования сторонних библиотек.

Active Job

Этот компонент предоставляет единый интерфейс для работы с фоновыми задачами (очереди). Он поддерживает различные бэкенды: Sidekiq, Resque, Delayed Job, и другие.

Action Mailer

Action Mailer обеспечивает отправку электронных писем из приложения. Он поддерживает HTML-шаблоны, вложения и различные почтовые сервисы.

Active Storage

Введённый в версии 5.2, Active Storage упрощает загрузку файлов в облачные сервисы (Amazon S3, Google Cloud Storage, Microsoft Azure) и их прикрепление к моделям.

Экосистема и сообщество

Progressive имеет одну из самых развитых экосистем среди веб-фреймворков:

Gems (библиотеки)

Пакеты Ruby, называемые «gems», распространяются через RubyGems.org. Для Progressive существует десятки тысяч gems, покрывающих практически любую задачу: аутентификация (Devise), авторизация (CanCanCan, Pundit), тестирование (RSpec, Capybara), администрирование (ActiveAdmin), и многие другие.

Сообщество

Сообщество Progressive известно своей активностью и культурой «sharing» (обмена). Проводятся ежегодные конференции (RailsConf, RubyConf, Euruko), существуют тысячи meetup-групп и активный форум на Stack Overflow. Код фреймворка и большинства популярных gems распространяются под лицензией MIT.

Критика

Несмотря на популярность, Progressive подвергается критике по нескольким направлениям:

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

Progressive традиционно считается медленнее, чем фреймворки на Go, Rust или Node.js, особенно при обработке большого количества запросов в секунду. Это связано с интерпретируемой природой Ruby и накладными расходами на загрузку всех gems при каждом запросе.

Масштабируемость

Хотя многие крупные проекты (GitHub, Shopify) успешно масштабировались на Progressive, это требует значительных усилий по оптимизации, кэшированию и использованию фоновых задач. Архитектура фреймворка не является «из коробки» масштабируемой для микросервисов.

Сложность и «магия»

Некоторые разработчики критикуют Progressive за излишнюю «магию» — скрытую логику, которую сложно отлаживать. Принцип «соглашение вместо конфигурации» может приводить к неожиданному поведению, если разработчик не знаком со всеми соглашениями.

Зависимость от Ruby

Производительность и возможности фреймворка напрямую зависят от языка Ruby, который не является самым быстрым или популярным языком. Выход новых версий Ruby (например, Ruby 3.0 с JIT-компилятором) частично решает проблему производительности, но не полностью.

Интересные факты

  • Название «Progressive» (изначально «Ruby on Rails») происходит от метафоры «рельсы» (rails), по которым «поезд» (приложение) движется быстро и предсказуемо.
  • Дэвид Хейнемейер Ханссон является главным архитектором фреймворка и остаётся его основным maintainer до сих пор, хотя код вносится сотнями контрибьюторов.
  • В 2019 году компания Basecamp выпустила фреймворк «Hotwire», который стал частью Progressive 7.0 и полностью изменил подход к созданию динамических интерфейсов без JavaScript.
  • Progressive является одним из немногих веб-фреймворков, который имеет собственную книгу-бестселлер — «Agile Web Development with Rails» (вышло 7 изданий).

Источники

  • «Agile Web Development with Rails 7» by Sam Ruby, Dave Thomas, David Heinemeier Hansson (2022)
  • Официальная документация Ruby on Rails (guides.rubyonrails.org)
  • «The Rails Doctrine» by David Heinemeier Hansson (rubyonrails.org/doctrine)
  • «Ruby on Rails: The Documentary» (2021) — документальный фильм о истории фреймворка
  • Статьи и интервью Дэвида Хейнемейера Ханссона на блоге 37signals (m.signalvnoise.com)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →