- Библиотеки
На заре развития ИТ каждый программист был вынужден писать код с нуля, но со временем появлялось все больше функций, покрытых кодом. Программисты поняли, что нет смысла каждый раз писать заново одно и тоже, и решили собрать однотипные куски кода в открытом доступе, чтобы ими могли пользоваться и другие программисты. Так появились библиотеки программирования, в которых собраны какие-то нужные функции (например, работа со строками, файлами, памятью и пр.). И другой программист место того, чтобы заново придумывать велосипед, брал библиотеку, подключал к своему коду и начинал использовать. Для каждого языка существуют свои библиотеки.
- Фреймворки
Программирование продолжало развиваться дальше и в какой-то момент стало понятно, что все приложения состоят из одинаковых частей, имеют примерно одинаковую архитектуру. Различия могут касаться частей с бизнес логикой, изображениями, запросами к базе данных, а вся остальная обвязка одинакова. Если раньше работа выглядела как написания кода, который вызывал нужные библиотеки, то теперь основную работу выполняет уже написанный, хорошо протестированный код. Программистам остается лишь дописать отличающиеся кусочки бизнес логики. Это и есть framework. Такой себе каркас.
В framework идет основное выполнение, а ваш код только подключается к нему как маленькие функции, которые этот framework будет вызывать. Получается, что вы уже не пишите основную программу – она уже написана, вы пишите только маленькие ответные части: вот на этой страничке вывести вот-то, вот здесь такой кусочек бизнес-логики и т.д.
- Стеки фреймворков
Но и на этом все не остановилось. Компании, которые разрабатывали фреймворки, поняли, что в приложениях повторяются большие глобальные куски, которые можно между собой соединять, т.е. соединить один фреймворк со вторым, с третьим и поставить рядом четвертый фреймворк, который будет ими управлять. Так появились стеки фреймворков, типа Spring.