Architecture Decision Record

Active theme: Light

← Примеры записей решений

Запись архитектурного решения: full-stack веб-фреймворк «всё включено» для стартап-продукта

Основная цель:
Создать веб-приложение для платящих клиентов, позволяющее входить в систему, загружать файлы, обрабатывать данные и просматривать отчёты, с упором на гибкую разработку, full-stack функциональность и сильную совместимость с инструментами ИИ/МО, особенно с ноутбуками Project Jupyter.

Контекст и требования:

  1. Гибкая разработка (высокий приоритет): как стартапу нам нужна быстрая итерация и гибкость. Гибкие практики, такие как быстрое прототипирование, итеративная разработка и способность адаптироваться к изменениям, — ключ к нашему циклу разработки.

  2. Full-stack фреймворк (высокий приоритет): мы стремимся сократить накладные расходы, выбрав фреймворк, который может эффективно обрабатывать и бэкенд, и фронтенд, уменьшая потребность в отдельных фронтенд-фреймворках.

  3. Совместимость с инструментами ИИ/МО (высокий приоритет): необходима возможность лёгкой интеграции с инструментами анализа данных, такими как ноутбуки Jupyter, и экосистемой науки о данных Python (NumPy, Pandas, TensorFlow и т. д.). Это облегчит эффективную обработку данных и подготовку отчётов.

  4. Критерии низкой важности:

    • Скорость выполнения: хотя производительность уместна, в начале она не самый критичный фактор, так как нас больше волнуют скорость разработки и полнота функций.
    • Масштабируемость: мы ожидаем роста, но вопросы масштабируемости можно решить позже, и сейчас это не основное требование.
    • Обратная совместимость: мы сосредоточены на текущих технологиях и не слишком озабочены обратной совместимостью с устаревшими системами.

Оцениваемые фреймворки:

  1. Django (Python)
  2. Ruby on Rails (Ruby)
  3. Phoenix (Elixir)
  4. Loco (Rust)

1. Django (Python)

Обзор:
Django — высокоуровневый веб-фреймворк для Python, способствующий быстрой разработке и чистому, прагматичному проектированию. Он известен философией «всё включено» (batteries included), то есть включает множество функций, таких как аутентификация, маршрутизация, ORM и обработка форм, прямо из коробки.

Сильные стороны:

  • Full-stack: Django — всеобъемлющий full-stack фреймворк, способный удовлетворить потребности и бэкенда, и фронтенда со встроенными функциями (например, механизм шаблонов, интерфейс администратора).
  • Гибкая разработка: чётко определённая структура и соглашения Django обеспечивают быструю разработку и адаптивность, что важно для среды стартапа. Фреймворк поставляется с отличной документацией и богатой экосистемой сторонних пакетов, что ускоряет разработку.
  • Интеграция с ИИ/МО: экосистема Python не имеет равных в науке о данных и машинном обучении. Django, будучи основан на Python, бесшовно интегрируется с такими инструментами, как ноутбуки Jupyter, Pandas, NumPy, TensorFlow и scikit-learn.
  • Сообщество и экосистема: у Django обширное сообщество, надёжная документация и широкий набор плагинов и расширений, что значительно ускоряет разработку и устранение неполадок.

Слабые стороны:

  • Скорость выполнения: Python, как правило, медленнее таких языков, как Rust или Elixir. Однако для этого случая, когда производительность не главная забота, это может не быть решающим.
  • Масштабируемость: хотя Django хорошо масштабируется, при очень большом масштабе без тщательной оптимизации могут возникать трудности (например, при обработке большого числа одновременных запросов). Тем не менее Django можно эффективно масштабировать с помощью балансировки нагрузки и методов кэширования.

Вердикт:
Django хорошо соответствует требованиям гибкой разработки, поддержки full-stack и совместимости с ИИ/МО. Его интеграция с Python даёт бесшовный доступ к инструментам и библиотекам науки о данных, необходимым для приложения.


2. Ruby on Rails (Ruby)

Обзор:
Ruby on Rails (RoR) — зрелый full-stack фреймворк веб-приложений, известный подходом «соглашения важнее конфигурации», облегчающим быструю разработку.

Сильные стороны:

  • Full-stack: RoR поставляется со встроенными инструментами для разработки и бэкенда, и фронтенда (например, представления, шаблоны, генерация каркаса), а его богатая библиотека гемов позволяет быстро реализовать различные функции.
  • Гибкая разработка: Ruby on Rails особенно известен быстрыми циклами итерации, что выгодно для стартапов, стремящихся быстро итерировать функции. RoR поддерживает разработку через тестирование (TDD) и имеет устоявшуюся экосистему для гибких рабочих процессов.
  • Сообщество и экосистема: у RoR устоявшееся сильное сообщество и широкий набор гемов, способных ускорить разработку.
  • Простота использования: у Rails очень удобный для разработчика синтаксис, он известен тем, что делает такие задачи, как миграции баз данных, архитектура «модель — представление — контроллер» (MVC) и обработка маршрутов, быстрыми и простыми.

Слабые стороны:

  • Производительность: у Ruby, как правило, медленнее производительность во время выполнения по сравнению с Python или Elixir. Хотя RoR может масштабироваться при правильной инфраструктуре, производительность Ruby может стать узким местом для приложений, требующих тяжёлой обработки в реальном времени или высокого параллельного трафика.
  • Интеграция с ИИ/МО: хотя у Ruby есть некоторые библиотеки машинного обучения, он не так широко принят в сообществе ИИ/МО, как Python. Интеграция с такими инструментами, как ноутбуки Jupyter, не так бесшовна, что делает Python более сильным выбором для приложений, интенсивно работающих с данными.

Вердикт:
Хотя Ruby on Rails превосходен в гибкой разработке и быстром прототипировании, он уступает по совместимости с ИИ/МО по сравнению с Python (Django). Это жизнеспособный выбор для стартапов, отдающих приоритет быстрой итерации перед глубокой интеграцией с анализом данных.


3. Phoenix (Elixir)

Обзор:
Phoenix — веб-фреймворк, построенный на Elixir, функциональном языке программирования, разработанном для масштабируемости и конкурентности. Phoenix использует виртуальную машину Erlang, известную способностью справляться с массовой конкурентностью и отказоустойчивыми системами.

Сильные стороны:

  • Масштабируемость и производительность: Phoenix блистает в масштабируемости и работе с высокой конкурентностью. Он построен на виртуальной машине Erlang, которая может поддерживать тысячи (или даже миллионы) одновременных соединений, что делает его сильным кандидатом для приложений, требующих обработки данных в реальном времени или трафика большого объёма.
  • Full-stack: Phoenix включает всё необходимое для создания и бэкенда, и фронтенда приложения. Он поддерживает live views для интерактивных обновлений UI и включает механизм шаблонов.
  • Гибкая разработка: Phoenix очень модулен, что позволяет быстро итерировать функции. Он хорошо подходит для стартапов, которым нужно двигаться быстро.
  • Совместимость с ИИ/МО: хотя у Elixir есть зарождающиеся библиотеки машинного обучения, он не так широко поддерживается для задач ИИ/МО, как Python. Интеграция с такими инструментами, как ноутбуки Jupyter, потребует обходных путей, так как экосистема Elixir для науки о данных не так зрела, как у Python.

Слабые стороны:

  • Экосистема ИИ/МО: Elixir не является основным языком, используемым в науке о данных или машинном обучении, а его экосистема не так зрела, как у Python. Поэтому интеграция с такими инструментами, как ноутбуки Jupyter, или популярными библиотеками ИИ (TensorFlow, PyTorch) будет обременительной.
  • Кривая обучения: если команда не знакома с функциональным программированием и Elixir, кривая обучения может быть круче.

Вердикт:
Phoenix — отличный выбор, если масштабируемость и конкурентность — главная забота. Однако, учитывая приоритет совместимости с ИИ/МО, Phoenix может не быть лучшим вариантом из-за ограниченной экосистемы Elixir в этой области.


4. Loco (Rust)

Обзор:
Loco — веб-фреймворк, построенный на Rust, системном языке программирования, известном производительностью, безопасностью памяти и конкурентностью. Rust всё популярнее для создания высокопроизводительных приложений.

Сильные стороны:

  • Производительность: главная сила Rust — высокая производительность и безопасность памяти, что делает его отличным выбором для приложений, требующих низкоуровневого контроля или чрезвычайно высокой производительности.
  • Конкурентность: система владения Rust обеспечивает безопасность памяти, допуская безопасное параллельное программирование, что идеально для систем, которым нужно эффективно масштабироваться и справляться с параллелизмом.

Слабые стороны:

  • Full-stack разработка: Loco, хотя и многообещающ, менее зрел, чем другие фреймворки, в плане предоставления полного full-stack решения. Он больше подходит для бэкенд-разработки, а фронтенд-экосистема вокруг Rust ещё зарождается.
  • Гибкая разработка: разработка на Rust может быть медленнее по сравнению с языками более высокого уровня, такими как Python или Ruby, из-за его более низкоуровневой природы и более крутой кривой обучения.
  • Экосистема ИИ/МО: у Rust нет такой обширной экосистемы для ИИ/МО, как у Python. Хотя в Rust растут библиотеки для численных вычислений, они гораздо менее зрелы, чем предложения Python, такие как ноутбуки Jupyter или фреймворки машинного обучения.

Вердикт:
Хотя Rust и его фреймворк Loco предлагают исключительную производительность, отсутствие поддержки full-stack, преимуществ гибкой разработки и экосистемы ИИ/МО делает его менее идеальным для этого конкретного случая. Он больше подходит для приложений, критичных к производительности, чем для быстрой веб-разработки со встроенными инструментами науки о данных.


Заключение

После оценки вариантов на основе требований проекта Django (Python) — наиболее подходящий выбор. Он предлагает следующие преимущества:

  • Возможности full-stack: Django — full-stack фреймворк, объединяющий разработку бэкенда и фронтенда.
  • Гибкая разработка: фреймворк хорошо подходит для быстрого прототипирования и итераций, что необходимо в среде стартапа.
  • Совместимость с ИИ/МО: Python — ведущий язык в ИИ/МО, и совместимость Django с такими библиотеками, как ноутбуки Jupyter, обеспечивает бесшовную интеграцию для анализа и обработки данных.
  • Сообщество и экосистема: сильная поддержка сообщества Django и обширная экосистема библиотек предоставляют множество инструментов для ускорения разработки.

Хотя Ruby on Rails также сильный претендент для гибкой разработки, его ограниченная поддержка ИИ/МО делает его менее идеальным для этого конкретного случая. Phoenix (Elixir) и Loco (Rust), хотя и превосходны по масштабируемости и производительности, уступают по интеграции с ИИ/МО и full-stack разработке. Поэтому для этого проекта рекомендуется фреймворк Django.