Architecture Decision Record

Active theme: Light

← Приклади записів рішень

Запис архітектурного рішення: вебфреймворк «все в одному», повний стек, для стартап-продукту

Основна мета:
Побудувати вебзастосунок, у якому клієнти, що платять, можуть входити, завантажувати файли, обробляти дані та переглядати звіти, з акцентом на гнучку розробку, повнофункціональність повного стеку та сильну сумісність з інструментами ШІ/МН, особливо з ноутбуками Project Jupyter.

Контекст і вимоги:

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

  2. Фреймворк повного стеку (високий пріоритет): ми прагнемо мінімізувати накладні витрати, обравши фреймворк, який ефективно обробляє і серверну, і клієнтську частини, зменшуючи потребу в окремих клієнтських фреймворках.

  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 і обробка форм, одразу «з коробки».

Сильні сторони:

  • Повний стек: Django — всеосяжний фреймворк повного стеку, що може обробляти і серверні, і клієнтські потреби за допомогою інтегрованих функцій (напр., рушій шаблонів, інтерфейс адміністратора).
  • Гнучка розробка: чітко визначена структура та конвенції Django дозволяють швидку розробку й адаптивність, що критично для середовища стартапу. Фреймворк постачається з відмінною документацією та багатою екосистемою сторонніх пакетів, що пришвидшує розробку.
  • Інтеграція з ШІ/МН: екосистема Python не має рівних у науці про дані та машинному навчанні. Django, будучи заснованим на Python, безшовно інтегрується з такими інструментами, як ноутбуки Jupyter, Pandas, NumPy, TensorFlow і scikit-learn.
  • Спільнота та екосистема: Django має розлогу спільноту, надійну документацію та широкий спектр плагінів і розширень, що значно пришвидшує розробку й усунення несправностей.

Слабкі сторони:

  • Швидкість виконання: Python має тенденцію бути повільнішим порівняно з мовами, як-от Rust чи Elixir. Проте для цього випадку, де продуктивність не є головною турботою, це може не бути критичним.
  • Масштабованість: хоча Django дуже масштабований, на дуже великому масштабі без ретельної оптимізації можуть виникати труднощі (напр., під час обробки великої кількості одночасних запитів). Проте Django все ж можна ефективно масштабувати за допомогою балансування навантаження та технік кешування.

Висновок:
Django добре відповідає вимогам до гнучкої розробки, підтримки повного стеку та сумісності з ШІ/МН. Його інтеграція з Python забезпечує безшовний доступ до інструментів і бібліотек науки про дані, потрібних застосунку.


2. Ruby on Rails (Ruby)

Огляд:
Ruby on Rails (RoR) — зрілий вебфреймворк повного стеку, відомий підходом «конвенція замість конфігурації», що сприяє швидкій розробці.

Сильні сторони:

  • Повний стек: RoR постачається з вбудованими інструментами і для серверної, і для клієнтської розробки (напр., подання, шаблони, скафолдинг), а його багата бібліотека gem-ів дозволяє швидко реалізовувати різні функції.
  • Гнучка розробка: Ruby on Rails особливо відомий швидкими циклами ітерацій, що є перевагою для стартапів, які прагнуть швидко ітерувати функції. RoR підтримує розробку через тестування (TDD) і має усталену екосистему для гнучких робочих процесів.
  • Спільнота та екосистема: RoR має усталену, сильну спільноту та широкий масив gem-ів, які можуть пришвидшити розробку.
  • Простота використання: Rails має дуже дружній до розробників синтаксис і відомий тим, що робить такі завдання, як міграції бази даних, архітектура model-view-controller (MVC) та обробка маршрутів, швидкими й простими.

Слабкі сторони:

  • Продуктивність: Ruby має тенденцію до повільнішої продуктивності виконання порівняно з Python чи Elixir. Хоча RoR може масштабуватися з правильною інфраструктурою, продуктивність Ruby може стати вузьким місцем для застосунків, що потребують інтенсивної обробки в реальному часі або високого одночасного трафіку.
  • Інтеграція з ШІ/МН: хоча Ruby має деякі бібліотеки машинного навчання, він не так широко поширений у спільноті ШІ/МН, як Python. Інтеграція з інструментами, як-от ноутбуки Jupyter, не така безшовна, що робить Python сильнішим вибором для застосунків, насичених даними.

Висновок:
Хоча Ruby on Rails відмінно підходить для гнучкої розробки та швидкого прототипування, він поступається Python (Django) щодо сумісності з ШІ/МН. Це життєздатний вибір для стартапів, які надають пріоритет швидкій ітерації над глибокою інтеграцією аналізу даних.


3. Phoenix (Elixir)

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

Сильні сторони:

  • Масштабованість і продуктивність: Phoenix вирізняється масштабованістю та обробкою високого паралелізму. Він побудований на віртуальній машині Erlang, яка може підтримувати тисячі (або навіть мільйони) одночасних з’єднань, що робить його сильним кандидатом для застосунків, які потребують обробки даних у реальному часі або великого обсягу трафіку.
  • Повний стек: 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 забезпечує безпеку пам’яті, водночас дозволяючи безпечне паралельне програмування, що робить його ідеальним для систем, які потребують ефективного масштабування та обробки паралелізму.

Слабкі сторони:

  • Розробка повного стеку: Loco, хоч і багатообіцяючий, не такий зрілий, як інші фреймворки, у забезпеченні повного рішення повного стеку. Він більше підходить для серверної розробки, а клієнтська екосистема навколо Rust ще формується.
  • Гнучка розробка: розробка на Rust може бути повільнішою порівняно з мовами вищого рівня, як-от Python чи Ruby, через її нижчий рівень і крутішу криву навчання.
  • Екосистема ШІ/МН: Rust не має такої розлогої екосистеми для ШІ/МН, як Python. Хоча бібліотек Rust для чисельних обчислень стає дедалі більше, вони значно менш зрілі, ніж пропозиції Python, як-от ноутбуки Jupyter чи фреймворки машинного навчання.

Висновок:
Хоча Rust та його фреймворк Loco пропонують виняткову продуктивність, відсутність підтримки повного стеку, переваг гнучкої розробки та екосистеми ШІ/МН робить його менш ідеальним для цього конкретного випадку. Він більше підходить для застосунків, критичних до продуктивності, ніж для швидкої веброзробки з інтегрованими інструментами науки про дані.


Висновок

Оцінивши варіанти за вимогами проєкту, Django (Python) — найбільш придатний вибір. Він пропонує такі переваги:

  • Можливості повного стеку: Django — фреймворк повного стеку, що інтегрує і серверну, і клієнтську розробку.
  • Гнучка розробка: фреймворк добре підходить для швидкого прототипування та ітерацій, що необхідно в середовищі стартапу.
  • Сумісність з ШІ/МН: Python — провідна мова в ШІ/МН, а сумісність Django з бібліотеками на кшталт ноутбуків Jupyter забезпечує гладку інтеграцію для аналізу та обробки даних.
  • Спільнота та екосистема: сильна підтримка спільноти Django та розлога екосистема бібліотек надають численні інструменти для пришвидшення розробки.

Хоча Ruby on Rails також є сильним претендентом для гнучкої розробки, його обмежена підтримка ШІ/МН робить його менш ідеальним для цього конкретного випадку. Phoenix (Elixir) і Loco (Rust), хоч і відмінні щодо масштабованості та продуктивності, поступаються в інтеграції з ШІ/МН і розробці повного стеку. Тому Django — рекомендований фреймворк для цього проєкту.