Що таке фреймворк: хто насправді викликає код
Фреймворк — це готовий каркас програми: набір правил, типових рішень і точок розширення, у якому вже вирішено, як запускається код, куди класти модулі й хто керує потоком виконання. Ви не «підключаєте кілька функцій», а вбудовуєте свою бізнес-логіку в уже задану архітектуру.
Саме тому новачки плутають фреймворк із бібліотекою, CMS чи «просто зручним набором інструментів». Різниця не в кількості файлів і не в зірках на GitHub. Різниця в тому, хто викликає кого: ваш код викликає чужий — це бібліотека; чужий каркас викликає ваш — це фреймворк.
Нижче — не каталог «топ інструментів», а робоча модель: як каркас влаштований зсередини, де проходить межа з іншими інструментами, які типи існують, де команди помиляються і що робити, коли обраний каркас починає гальмувати продукт, а не прискорювати його.
Каркас, а не чарівна кнопка
Англійське framework буквально означає «рама», «остов», «несуча конструкція». У програмуванні це не готовий продукт і не кнопка «зробити сайт». Це скелет, на який навішують конкретну логіку: маршрути, форми, доступ до бази, черги, шаблони сторінок, тести.
Типовий програмний фреймворк дає чотири речі одразу. Перша — архітектурний шаблон: як розділити дані, інтерфейс і керування, часто у вигляді MVC, MVVM або подібної схеми. Друга — типова поведінка за замовчуванням: обробка HTTP-запиту, сесії, валідація, міграції бази. Третя — точки розширення: хуки, колбеки, класи-нащадки, плагіни, куди ви вставляєте свій код. Четверта — конвенції: імена файлів, структура каталогів, спосіб конфігурації. Саме конвенції економлять тижні узгоджень у команді.
Слово живе ширше за код. Scrum — теж фреймворк, лише процесний: фіксовані ролі, події й артефакти, всередині яких команда сама наповнює зміст спринтів. CSS-фреймворк на кшталт Bootstrap задає сітку, типові компоненти й обмеження дизайну. У цьому сенсі «фреймворк» — універсальна ідея: хтось уже прийняв важкі рішення за вас, щоб ви не приймали їх щоразу з нуля.
Важливо не сплутати каркас із готовою системою. WordPress можна запустити й наповнити статтями майже без програмування. Laravel чи Django так не працюють: без вашого коду це порожня рама. Саме тому фреймворк виграє там, де бізнес-логіка унікальна, і програє там, де потрібен типовий блог «на вчора».
Голлівудський принцип: фреймворк викликає вас
Технічне серце визначення сформулювали ще наприкінці 1980-х. У статті Designing Reusable Classes (1988) Ральф Джонсон і Браян Фут показали: бібліотека — це набір викликів, які робить ваш код; фреймворк — це каркас, який сам викликає ваш код у заздалегідь передбачених місцях. Мартін Фаулер пізніше закріпив це як інверсію керування (Inversion of Control): «не телефонуйте нам — ми зателефонуємо вам». Цей «голлівудський принцип» і є межею між інструментом і каркасом.
Практичний контраст простий. Викликаєте lodash чи requests — самі вирішуєте, коли й навіщо. Пишете контролер у Django або маршрут у NestJS — спочатку фреймворк приймає запит, парсить URL, перевіряє middleware, створює контекст і лише потім передає керування вашій функції. Після відповіді він знову забирає контроль: логування, закриття з’єднання, відправка заголовків. Ви гостюєте в чужому життєвому циклі.
Архітектор Вольфганг Прі описав ту саму будову через frozen spots і hot spots. «Заморожені» місця — інваріантна архітектура: цикл запиту, контейнер залежностей, система плагінів. Їх не переписують у кожному проєкті. «Гарячі» місця — гачки, куди кладуть унікальну логіку: розрахунок знижки, правило модерації, формат рахунку. Гарний каркас робить заморожене надійним, а гаряче — коротким.
Звідси випливає незручна, але чесна класифікація. React офіційно є бібліотекою інтерфейсу: ви самі збираєте роутинг, стан, збір даних. Angular, Next.js, Nuxt, SvelteKit, NestJS, Django, Laravel, Spring Boot — фреймворки в строгому сенсі, бо забирають у вас головний цикл програми. У вакансіях усі їх називають «фреймворками» через звичку. Для архітектурної розмови точність важлива: якщо інструмент не викликає ваш код сам, це ще не каркас, навіть якщо ним користується пів індустрії.

Фреймворк, бібліотека, CMS і SDK: де проходить межа
Більшість суперечок «а React — це фреймворк?» розв’язуються таблицею, а не гаслами. Чотири сусідні поняття закривають різні шари роботи.
| Інструмент | Хто керує потоком | Що дає | Типовий приклад |
|---|---|---|---|
| Бібліотека | Ваш код викликає її | Готову функцію для вузької задачі | axios, NumPy, lodash |
| Фреймворк | Він викликає ваш код | Архітектуру, конвенції, типові підсистеми | Django, Angular, Laravel |
| CMS | Готовий продукт з адмінкою | Інтерфейс для контенту, плагіни, теми | WordPress, Drupal |
| SDK | Залежить від вмісту комплекту | Бібліотеки, API, документацію, інколи емулятор | Android SDK, Stripe SDK |
Джерело: узагальнення за визначенням IoC (Johnson, Foote, Fowler) та офіційною документацією інструментів.
CMS виграє, коли контент важливіший за унікальну логіку: медіа, лендинги, корпоративний сайт із типовими сторінками. Фреймворк виграє, коли з’являються ролі, тарифи, черги, інтеграції з 1С чи банківським API, складні права доступу. Спроба «доробити WordPress до маркетплейса» часто коштує дорожче, ніж одразу писати на Laravel чи Django. Зворотна помилка теж існує: збирати на NestJS візитку з трьох сторінок.
SDK — комплект для роботи з конкретною платформою або сервісом. Android SDK не замінює архітектуру застосунку, він дає доступ до системи. Фреймворк може використовувати SDK всередині себе. Flutter тут цікавий гібрид: це UI-фреймворк плюс інструментарій збірки, тобто каркас і SDK в одному пакеті.
Платформа — ще ширше поняття: мова, рантайм, екосистема. Node.js — платформа, Express — мінімалістичний фреймворк на ній, React — бібліотека, Next.js — фреймворк навколо React. Коли в резюме пишуть «знаю фреймворк Node.js», це сигнал, що людина змішала шари. Для найму така плутанина дрібниця. Для проєктування — джерело зайвих залежностей.
Від мікрокаркаса до «батарейок у комплекті»
Каркаси різняться не лише мовою, а ступенем думки, яку вони вже подумали за вас. На одному полюсі — мікрофреймворки: Express, FastAPI, Flask, Sinatra. Вони дають маршрутизацію, іноді валідацію й мало що більше. Решту — ORM, черги, адмінку, авторизацію — збираєте самі. Це гнучко і небезпечно: два проєкти на Express від різних команд майже ніколи не схожі.
На протилежному полюсі — підхід batteries included. Django від початку (публічний реліз — липень 2005, автори Адріан Головатий і Саймон Віллісон, редакція газети Lawrence Journal-World) тягне ORM, адмінку, автентифікацію, шаблони, i18n. Laravel (червень 2011, Тейлор Отвел) дає Eloquent, черги, події, Blade, Sanctum. Ruby on Rails (липень 2004, Девід Ханссон, витягнутий із Basecamp) приніс індустрії дві формули, які досі живуть у всіх «товстих» каркасах: convention over configuration і DRY. Spring Boot зробив те саме для Java: менше XML, більше розумних значень за замовчуванням.
За шаром застосування картина така:
| Клас | Завдання | Приклади | Коли доречний |
|---|---|---|---|
| Бекенд, «повний» | Сервер, БД, адмінка, безпека | Django, Laravel, Rails, Spring Boot | Продукт з доменною логікою |
| Бекенд, мікро | API, шлюзи, сервіси | FastAPI, Flask, Express, Fastify | Вузький сервіс, ML-ендпоінт |
| Фронтенд-каркас | Структура UI, DI, роутинг | Angular, Ember | Великий клієнтський застосунок |
| UI-бібліотека + метакаркас | Компоненти + SSR/роутинг | React + Next.js, Vue + Nuxt | Сайти й SaaS з SEO |
| Мобільний | Нативні або кросплатформні UI | Flutter, React Native, SwiftUI | iOS/Android з однією командою |
| Десктоп / оболонка | Вікно, системні API | Qt, Electron, .NET MAUI | Інструменти, панелі, офлайн |
| Тестовий | Запуск, моки, репорти | pytest, JUnit, Playwright | Регресія та E2E |
Джерело: класифікація за доменом застосування; приклади — усталені проєкти з відкритим кодом.
Окремо стоїть CSS. Bootstrap — компонентий каркас інтерфейсу зі своїми класами й сіткою. Tailwind — утилітарний шар: не керує життєвим циклом програми, але жорстко задає спосіб писати стилі. Називати Tailwind «фреймворком» звично, але за голлівудським принципом він ближчий до бібліотеки конвенцій, ніж до Angular.
Повний стек рідко дорівнює одному інструменту. Next.js, Nuxt, Remix, SvelteKit закривають і рендер на сервері, і маршрути, і інколи API-шари — тому їх називають метафреймворками. Meteor колись обіцяв «все в одному» для JavaScript; сьогодні команди частіше складають стек свідомо: окремо UI, окремо API, окремо черга. Це повільніше на старті й дешевше через рік, коли треба замінити лише один шар.

Помилки, через які каркас стає тягарем
Перша помилка — обирати за модою. Репозиторій з сотнею тисяч зірок не знає вашого дедлайну, стека команди й вимог до аудиту. У реальних кейсах часто беруть те, «що вже трохи знає фронтендер», і через пів року бекенд живе в обхідках, бо обраний каркас не вміє нормально робити фонові задачі чи складні транзакції.
Друга — видавати бібліотеку за повний каркас. Команда стартує з «чистого React», потім екстрено додає роутер, Redux, React Query, збірку, SSR. Через рік виходить саморобний Next.js гіршої якості. Або навпаки: на лендинг із форми заявки ставлять NestJS, Kafka і мікросервіси «про запас». Запас з’їдає бюджет ще до першого користувача.
Третя — боротися з каркасом. Django розрахований на ORM і свої міграції; якщо кожен запит писати сирим SQL «бо так швидше», виплачуєте ціну каркаса й не отримуєте його переваг. Laravel має черги й події; дублювати їх власним самописом — типовий шлях до розсинхрону. Правило просте: або приймаєте конвенції, або берете мікрофреймворк і збираєте самі. Напіврішення найдорожчі.
Четверта — ігнорувати цикл життя. Фреймворк — це залежність із власним розкладом релізів, політикою LTS і дірами в безпеці. AngularJS довго тримав корпоративні кабінети, доки спільнота не пішла. Залишитись на мажорній версії, яку вже не латають, — це не «стабільність», це відкладений інцидент. Перед вибором дивляться не демо, а календар підтримки й розмір breaking changes між версіями.
П’ята — міф про швидкість і «справжніх програмістів». Каркас додає абстракції, але вузьке місце майже ніколи не в «оверхеді фреймворка». Вузьке місце — N+1 запити до бази, синхронні виклики зовнішніх API, відсутність кешу, важкі зображення. Писати все на голому HTTP-сервері не робить систему швидшою, якщо доменна модель та сама. «Справжній» інженер вимірює, а не демонструє чистоту стека.
Окремий міф для початківців: «спочатку вивчу фреймворк, мову підтягну потім». З практики онбордингу видно інше. Найважче не синтаксис декораторів Django і не модулі NestJS, а розуміння, що запит вам не належить. Без впевненого володіння мовою каркас перетворюється на набір магічних рядків, які страшно чіпати.
Як обрати каркас під задачу, а не під хайп
Почніть не з назви, а з обмежень. Скільки людей у команді? Яка мова вже є в проді? Чи потрібен SEO? Чи є офлайн? Який SLA? Чи проходить безпека зовнішній аудит? Каркас, який ідеально виглядає в туторіалі, може провалити перевірку логів і прав доступу.
Три типові сценарії дають різні відповіді. Маркетплейс-MVP на вісім тижнів: важливі швидкість, адмінка, платежі, пошта. Тут виграють Laravel або Django — багато готового, велика кількість розробників, зрозумілий деплой. Внутрішній портал банку з аудитом і довгим життям: частіше Spring Boot або .NET, бо так простіше закрити вимоги безпеки, інтеграції та найм у корпоративному ринку. API над моделлю машинного навчання: FastAPI забирає перемогу майже без дискусії — нативна робота з Python, типізація, автодокументація OpenAPI, мала вага.
Для інтерфейсів розвилка інша. Великий ентерпрайз-кабінет з формами, ролями й довгим циклом життя добре лягає на Angular: жорстка структура зменшує хаос у великій команді. Продуктовий SaaS зі SSR і маркетинговими сторінками — Next.js або Nuxt. Мобільний клієнт з однією командою на iOS і Android — Flutter, якщо важлива однакова UI-логіка; нативні SwiftUI/Kotlin — якщо платформні стандарти важливіші за швидкість поставки.
Чек-лист перед фіксацією стека:
- Мова вже є в команді, чи доведеться наймати з нуля.
- Є LTS і зрозумілий шлях апгрейду на 3–5 років.
- Документація покриває саме ваш клас задач, не лише todo-додаток.
- Є перевірені бібліотеки під платежі, черги, SSO, файли.
- На ринку України й сусідніх ринках реально знайти людей не за зіркову зарплату.
- Ліцензія дозволяє комерційне використання без сюрпризів.
- Каркас не змушує тягнути хмарного вендора, якщо вам це не потрібно.
- Прототип ключового сценарію (логін + головна дія + звіт) збирається за кілька днів, а не тижнів.
Якщо пункт 8 провалюється, ви обрали занадто важкий інструмент або ще не вмієте ним користуватися. Обидва варіанти — стоп-сигнал перед тим, як розписувати епіки на квартал.

Коли фреймворк почав заважати
Сигнали з’являються раніше, ніж команда готова їх назвати. Нова фіча вимагає обходу ядра каркаса. Оновлення мажорної версії відкладають третій рік. Половина логіки живе в «службових» класах поза прийнятою архітектурою. Онбординг новачка триває місяці, бо «у нас не як у документації». Тести крихкі, бо доводиться піднімати весь контейнер заради дрібної перевірки.
Перша реакція — не перепис з нуля. Великий bang-rewrite майже завжди заморожує продукт і народжує другий легасі ще до смерті першого. Працює візерунок странглера: новий код пишеться в іншому модулі або сервісі, старі ендпоінти поступово замінюються, каркас звужується до тих зон, де він ще корисний. API-шар при цьому лишається стабільним для клієнтів.
Іноді проблема не в інструменті, а в його використанні. ORM генерує сотні запитів — це лікується select_related, проєкціями, інколи одним ручним SQL, а не викиданням Django. Express «не тягне навантаження» — часто не вистачає пулу з’єднань і кешу, а не самого Express. Перед судом над каркасом потрібен профіль: CPU, запити до БД, зовнішні таймаути.
Мігрувати варто, коли збігаються три умови: каркас більше не розвивається або ламає безпеку; доменна модель постійно з ним конфліктує; у команди є ресурс на співіснування двох світів щонайменше пів року. Одна умова — ще не вирок.
Коли варто кликати фахівця ззовні: немає людини, яка вже проводила мажорний апгрейд саме цього каркаса; є регуляторні вимоги, яких стандартні middleware не покривають; проєкт зав’язаний на форк ядра. Зовнішній архітектор тут дешевший за рік боротьби «між спринтами».
Куди змістився акцент у виборі каркасів
Ринок змістився від «чистих» UI-бібліотек до метакаркасів. React лишається найуживанішим інструментом для інтерфейсів, але нові продукти все частіше стартують одразу з Next.js, а не з саморобної обгортки. Vue тримається там, де важлива пологість входу. Angular нікуди не зник із корпоративного сегмента — він програє хайп, не контракти.
На бекенді помітний розкол. «Товсті» каркаси нікуди не ділися: Django виграв друге дихання через Python у даних і ШІ, Laravel досі зручний для продуктових команд, Spring Boot — стандарт для великих Java-контурів. Водночас FastAPI в опитуванні розробників Stack Overflow 2025 дав один із найбільших стрибків серед веб-фреймворків — плюс п’ять відсоткових пунктів за рік — саме завдяки API для моделей і швидким сервісам. Flask при цьому віддає частку: мікрокаркас без типізації виглядає блідіше поруч із сучасним конкурентом.
Окремий індикатор — не популярність, а захоплення. Phoenix на Elixir три роки поспіль лишається найбільш «admired» веб-фреймворком у тому ж опитуванні: близько 79% тих, хто ним користувався, хочуть лишитися. Це не привід терміново переписувати інтернет-магазин на Elixir. Це сигнал, що модель акторів і живі оновлення каналів закривають клас задач, який класичний MVC вирішує важко: чати, біржові дошки, спільне редагування.
Ще два зсуви, які вже не тренд, а нова норма. Перший — TypeScript як очікувана мова каркаса, навіть якщо рантайм — JavaScript. Другий — ШІ-асистентів легше годувати проєктами зі строгими конвенціями: генератор коду менше галюцинує, коли структура директорій передбачувана. Це знову грає на користь opinionated інструментів.
Що з цим робити на практиці: не стрибати в кожен новий метакаркас. Дивитися, чи живе спільнота, чи передбачувані релізи, чи можна найняти людей. Стабільний Laravel, який команда знає, майже завжди корисніший за «модний» стек, який ніхто в проді ще не рятував о третій ночі.
Ключові інсайти. Фреймворк — це не набір бібліотек, а інверсія керування: каркас викликає ваш код і нав’язує архітектуру. Бібліотека, CMS і SDK закривають інші шари; плутанина між ними коштує тижнів. «Товстий» каркас виграє в продуктах із доменною логікою, мікрокаркас — у вузьких сервісах. Найдорожчі помилки — мода, боротьба з конвенціями і великий перепис замість поступової заміни. Обирайте мовою команди, календарем підтримки й прототипом головної дії, а не зірками на GitHub.