Полезное

Бэкенд и фронтенд: чем они отличаются? Часть 1

Просто люблю писать, переводить и давать людям возможность читать интересный контент. И пусть я не всегда идеальна — есть к чему стремиться!!!

Веб-разработка имеет свою собственную терминологию, типы заданий, инструменты и навыки, как и любая другая отрасль. Помимо прочего в сфере разработки довольно часто обсуждается соотношение бэкенда и фронтенда. Что они означают? Есть ли какие-то совпадения? Можете ли вы использовать их взаимозаменяемо?

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

Кроме того, мы поможем тем, кто только начинает работать в индустрии программирования. Например, заработаете ли вы больше денег на разработке бэкенда по сравнению с фронтенд? И каков рабочий процесс для тех, кто работает над каждой частью веб-сайта?

Разработка бэкенда и фронтенда — ключевые различия

При сравнении бэкенд- и фронтенд-разработки различия обычно проявляются в следующих категориях:

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

Давайте, начнем с простого!

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

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

А теперь более подробно.

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

Бэкенд-разработка

Вот, что вам следует ожидать от внутренней разработки:

  • Бэкенд веб-приложения или сайта обрабатывает все аспекты управления данными для проекта, особенно когда речь идет о хранении, доставке и организации данных.
  • Бэкенд — это серверная часть разработки веб-сайта. Иногда это означает, что созданный веб-сайт или приложение отображаются только на стороне сервера, например, внутренняя база данных, работающая в фоновом режиме, или файловый сервер, регистрирующий ресурсы компании. Тем не менее, в веб-разработке серверная часть зачастую напрямую связана с интерфейсом, предлагая такие процессы и услуги, как поиск в базе данных, облачное хранилище и управление файлами для тех, кто работает с интерфейсом. Примером может служить база данных пользователей (бэкенд) на сайте знакомств, где информация представляется в виде профиля (фронтенд).
  • Серверная часть почти всегда скрыта от глаз пользователя. Это похоже на волшебство за занавесом: многие люди не имеют ни малейшего представления о том, как работает веб-сайт, но именно бэкенд, как правило, говорит элементам фронтенда, что делать.
  • При разработке бэкенда используются такие языки, как PHP, Python, C++, Ruby и Java.
  • В список фреймворков для внутренней разработки входят Laravel, Spring, Rails, Django и Express, а также скриптовые языки — Ruby, GO, REST и C#.
  • Пользователи интерфейса технически взаимодействуют с серверной частью через фронтенд, но на самом деле они никогда не видят, как работает бэкенд.
  • Дополнительные задачи, такие как создание библиотек и написание API-интерфейсов, также связаны с внутренней разработкой. Программисты просто используют их для создания совершенно новой функции.
Фронтенд-разработка
  • Вот что обозначает внешняя разработка:
  • Интерфейс веб-сайта или приложения содержит область, в которой пользователь взаимодействует с ними. Его основная цель — работать с внутренними ресурсами данных для предоставления информации, позволяя пользователю принимать решения и потреблять контент с помощью таких инструментов, как кнопки, мультимедиа и калькуляторы.
  • Это то, что пользователь видит постоянно, иногда в сочетании с данными, полученными из серверной части.
  • Фронтенд является клиентской частью веб-сайта или приложения, где пользователь перемещается по интерфейсу с помощью браузера или другого способа.
  • Некоторые элементы, обычно используемые во внешнем интерфейсе, включают таблицы, кнопки, цвета, текст, навигацию, изображения и практически все визуальные элементы, с которыми вы можете столкнуться на веб-сайте.
  • Языки для разработки интерфейсов — HTML, CSS и JavaScript.
  • Две основные цели фронтенд-разработчика — повышение производительности и отзывчивости, а это означает, что они хотят, чтобы интерфейс веб-сайта загружался быстро и хорошо работал на всех типах устройств.
  • Фронтенд-фреймворки включают Flutter, SAAS, jQuery, React.js и AngularJS.
  • Пользователи внешнего интерфейса часто могут перемещаться с помощью GUI (графического пользовательского интерфейса) или командной строки.

Почему в веб-разработке разделены бэкенд и фронтенд?

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

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

Разве мы не можем сказать «разработка» и покончить с этим?

Да, мы могли бы просто объединить бэкенд и фронтенд с более общим термином, таким как «разработка», и представьте себе, именно это мы и делаем! Термин «разработка» — это просто всеобъемлющая категория, которая относится ко всем типам кодирования, дизайна и создания веб-сайтов. Кроме того, существует термин, называемый «разработкой с полным стеком», который относится как к фронтенду, так и к бэкенду.

Это похоже на строительство дома: в строительной бригаде у вас есть плотники, электрики, сантехники, архитекторы и многие другие работники, которые входят в полноценную команду. «Строительная бригада», «строители домов» или как бы вы не назвали эту команду, состоит из людей, работающих над достижением общей цели. Тем не менее, это широкая категория: сказать, что кто-то строит дома или занимается строительством, мало что говорит нам об их конкретных навыках, инструментах, которые они используют, или о том, над какими частями дома они работают.

Создание веб-сайта очень похоже на строительство дома. Возможно ли одному человеку построить дом самостоятельно? Конечно, но это менее эффективно и потребует, чтобы этот человек был обучен многим навыкам. То же самое можно сказать о разработке фронтенд и бэкенд. Они являются подмножеством разработки веб-сайтов, поскольку уникальны по своим возможностям. Это облегчает внутри отрасли поиск идеальных людей для каждой работы, вместо того, чтобы просеивать кучу специалистов, которые называют себя разработчиками, но это означает, что они могут работать только на одной стороне.

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

Технологии и языки, используемые для разработки фронтенд и бэкенд

Мы упоминали, что разработчики фронтенд и бэкенд имеют уникальные наборы инструментов, которые включают в себя различные:

  • Фреймворки
  • Языки
  • Библиотеки
  • Базы данных

Давайте начнем с фреймворков.

Бэкенд-фреймворки

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

Фреймворк позволяет экономить время, обеспечивает более стандартизированный мир разработки, и компании могут намного легче масштабироваться, когда им не нужно начинать с нуля. Кроме того, как правило, вам не нужно платить за фреймворки.

Как серверные, так и интерфейсные разработчики используют фреймворки для ускорения своих рабочих процессов. Некоторые из наиболее популярных бэкенд-фреймворков включают:

  • Django: платформа с открытым исходным кодом, которая может использоваться для различных приложений, а также для реализации безопасной, многофункциональной среды разработки. Разработчики предпочитают Django, поскольку он считается одним из самых быстрых фреймворков, предлагая при этом менее сложную кривую обучения, чем та, которую вы можете найти в других инструментах.
  • Spring Boot: помимо языка Java, преимущества использования Spring Boot в качестве фреймворка включают его легко настраиваемые свойства приложения, поддержку Jetty и Undertow, а также улучшенное управление зависимостями. Платформа с открытым исходным кодом лучше всего подходит для приложений.
  • Laravel: этот бэкэнд-фреймворк имеет модульную систему упаковки и встроенный менеджер зависимостей. Он отлично подходит для подключения к реляционным базам данных, живого комментирования, кэширования, улучшения вашей аутентификации и упрощения процесса API.
  • Rails: данный бэкэнд-фреймворк для приложений фокусируется на структурировании баз данных, веб-служб и полных веб-сайтов экономически эффективным и последовательным образом, предлагая один из самых популярных и простых вариантов серверной платформы. Цель Ruby заключается в достижении результатов разработки в среде, свободной от ошибок, а также в расширении веб-сайтов, даже если сайт планирует поддерживать невероятно большое количество пользователей.
  • ExpressJS: в основном используемый для создания API и приложений, фреймворк ExpressJS функционирует как серверный компонент с открытым исходным кодом, а также как внешнее решение для конкретных баз данных, таких как NoSQL. NodeJS служит языком программирования внутри ExpressJS.
  • Asp.NET: рекламируемый как модульная платформа для минимального кодирования, улучшенного обслуживания и кроссплатформенной поддержки, Asp.NET Core стремится к более высокой производительности по сравнению с другими фреймворками, а также к опыту, который ограничивает объем кода на протяжении всего проекта. Фреймворк поддерживает язык C#.
  • CakePHP: часто используемый для веб-сайтов, ориентированных на медиа, фреймворк CakePHP написан на PHP, и будучи чрезвычайно популярным инструментом с открытым исходным кодом он уходит своими корнями в систему Ruby on Rails, но в нем больше внимания уделяется отображению данных, активной записи и объектно-реляционному отображению. Его гибкость и расширяемость делают CakePHP идеальным выбором в качестве серверной среды. Это позволяет разработчикам создавать повторно используемые фрагменты кода для распространения и использования в других проектах или в рамках одного и того же проекта.
  • Phoenix: основная цель Phoenix — создавать высокопроизводительные приложения, большинство из которых изначально имеют встроенную масштабируемость. Производительность лежит в основе Phoenix, поэтому вы обнаружите меньше ошибок благодаря улучшенной отказоустойчивости и элементам, которые помогают повысить надежность. В результате, вы сможете запускать довольно много событий одновременно, ускорять процесс разработки и не беспокоиться об ошибках ввода.
Фронтенд-фреймворки (и библиотеки)

Что касается внешнего интерфейса, разработчики могут выбирать из фреймворков и библиотек. Иногда грань между библиотекой и фреймворком размыта, но в целом фреймворк — это шаблон файлов, языков и инструментов для быстрого создания, а также масштабирования интерфейсной части веб-приложения или веб-сайта. При сравнении бэкенда и фпрнтенда инфраструктура второго выполняет такие задачи, как стилизация веб-сайта, управление запросами AJAX и определение того, как файлы бэкенда используются и представляются во фронтенде.

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

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

Взгляните на некоторые популярные интерфейсные фреймворки и библиотеки:

React.js: позиционируется как библиотека JavaScript для создания пользовательских интерфейсов, и это именно то, что вы должны ожидать от библиотеки, управляемой Facebook. Функции React.js включают компоненты пользовательского интерфейса, которые остаются стабильными и безопасными на протяжении всего процесса разработки; оптимизированный для SEO набор инструментов, идеально подходящий для повторного использования в других частях приложения или в других проектах; быстрая отладка; повышенная скорость; и привязка данных, которая выполняется однонаправленным образом.

  • AngularJS: фронтенд-фреймворк AngularJS создан ребятами из Google. Он использует язык программирования Typescript вместе с синхронизацией в реальном времени между моделью разработки и фактическим представлением продукта. Язык TypeScript был реализован в Angular, чтобы помочь разработчикам, которые хотят быстро находить ошибки, устранять ошибки при написании и сохранять весь код аккуратным и понятным; все это предлагается с помощью TypeScript (который связан с JavaScript).
  • Bootstrap: если вы планируете создать интерфейс для адаптивного веб-сайта, вы, вероятно, рассматриваете фреймворк Bootstrap. Некоторые люди называют его фреймворком, но это скорее библиотека с невероятным набором интерфейсных инструментов, различными встроенными компонентами и некоторыми впечатляющими плагинами для объединения с любыми файлами HTML, CSS или JavaScript, которые вы планируете внедрить на веб-сайт, оптимизированный для мобильных устройств.
  • Vue.js: это еще один интерфейсный фреймворк/библиотека, использующий язык JavaScript и похожий на React.js, основной целью которого является разработка одностраничных приложений и онлайн-интерфейсов. Это один из самых простых фреймворков по дизайну, предлагающий встроенные CSS-анимации и переходы, различные HTML-шаблоны и гораздо меньший размер, чем другие сопоставимые фреймворки.
  • jQuery: будучи также фреймворком с языком JavaScript, корни jQuery уходят в 2006 год, что делает его одним из самых ранних вариантов для разработчиков, позволяющих легко создавать внешние интерфейсы (jQuery можно найти в значительной части Интернета, и у него есть сильное сообщество, которое помогает тем, кто работает с фреймворком). В целом, этот удобный для браузера, ориентированный на мобильные устройства фреймворк, наиболее примечателен тем, что сводит к минимуму количество кода JavaScript, необходимого для интерфейсов веб-сайтов.
  • Ember.js: в продолжение разговора р фреймворках, созданных на JavaScript, Ember.js обеспечивает более быстрый потенциал разработки, улучшенную организацию и возможности для больших команд по интеграции, отладке и созданию стабильной системы в целом. Используется ведущими компаниями, такими как LinkedIn, Apple и Square. Ember.js довольно хорош, главным образом из-за своей упрощенной методологии разработки, шаблонов, распространенных идиом и стандартных практик, которые могут понять больше людей.
  • Flutter: этот инструмент может показаться уникальным после рассказа о стольких библиотеках и фреймворках, которые обслуживают пользователей CSS, HTML и JavaScript. Вместо отраслевых стандартов Flutter опирается на язык программирования под названием Dart, который помогает создавать высокопроизводительные мобильные, настольные и веб-приложения, извлекая все из единой кодовой базы.
  • Semantic-UI: придерживаясь более простых, стандартизированных языков, таких как HTML и JavaScript, Semantic-UI подходит для тех, кто хочет быстро разрабатывать внешние интерфейсы и создавать адаптивные макеты веб-сайтов с использованием краткого HTML, упрощенных инструментов отладки и тысяч переменных тем. Наряду с более чем 50 компонентами пользовательского интерфейса и 5000 коммитов, это фреймворк, который хорошо сочетается с другими библиотеками и обеспечивает вам большую гибкость.
  • Materialize: как следует из названия, этот фреймворк ускоряет разработку современных адаптивных веб-сайтов с использованием подхода Material Design. В состав фреймворка включено несколько тем, в то время как разработчикам предлагается использовать JavaScript и CSS для управления компонентами или создания элементов, таких как формы, и создания веб-дизайна с яркими графическими элементами и движением, чтобы привлечь внимание.
  • Backbone.js: функционируя как библиотека для веб-приложений, Backbone.js предоставляет ускоренную платформу для работы над проектами с использованием JavaScript и для создания одностраничных веб-приложений, но с дополнительными преимуществами синхронизации нескольких частей. Инструмент работает вместе с jQuery, а также другими фреймворками и библиотеками, такими как Underscore.js.
  • Foundation: вы можете создавать широкий спектр мобильных веб-приложений, сайтов и даже электронных писем в формате HTML с помощью Foundation, поскольку данный фреймворк представляет собой быструю, отзывчивую сетку для разработки с использованием CSS и HTML. Разработчик может воспользоваться преимуществами базовых элементов, таких как кнопки, фрагменты и навигационные меню, а также использовать готовые шаблоны. Это делает Foundation распространенным выбором для многих разработчиков интерфейса, поскольку он предлагает некоторые из наиболее распространенных шаблонов, необходимых для создания мобильного веб-сайта.
Бэкенд-языки

Возможно, вы заметили, что все фреймворки и библиотеки в предыдущих разделах работают с определенными языками программирования. Это происходит потому, что фреймворки служат основой при разработке интерфейсных или серверных веб-приложений, а части, которые скрепляют эти основы вместе — языки программирования.

Возвращаясь к нашей аналогии со строительством дома, фреймворки подобны наборам окон, гипсокартона и инструментов, используемых для строительства дома. Языки программирования подобны сырью, которое входит в эти элементы, чтобы заставить их работать, например, как клей, стекло и дерево для окон.

Языки программирования позволяют разработчикам писать сценарии, инструкции и файлы сайта, которые в конечном итоге выполняются компьютером. Поэтому разработчик фронтенд или бэкенда должен хорошо разбираться в определенном языке, чтобы создать приложение или веб-сайт.

Затем можно использовать фреймворки в качестве ярлыков, а также вводить свой собственный код, используя тот же язык. Языки вводятся в нечто вроде текстового или HTML-редактора, компилируются для организации, после чего преобразуются в машинный язык, чтобы компьютер мог обрабатывать данные и выполнять необходимый набор инструкций.

Бэкенд-языки напрямую коррелируют с серверными фреймворками и помогают обрабатывать внутренние процессы, такие как бизнес-логика, вызовы баз данных, создание сетей, обработка изображений и многое другое.

Ниже приведены языки, которые чаще всего используются в бэкэнд-фреймворках или при работе над бэкэнд-проектом в любой форме:

  • PHP: возможно, один из самых известных бэкенд-языков, PHP предоставляет всеобъемлющий, общий язык сценариев для всех видов веб-разработки. Он взаимодействует с фронтенд-языком HTML, но отличается от того, как взаимодействует JavaScript. PHP доступен для всех основных операционных систем, предлагает отчеты об ошибках, безопасен и дает разработчику полный контроль без использования длинных строк кода.
  • Java: этот бэкенд-язык был представлен в 1995 году, что делает его надежным для мобильных приложений, настольных приложений, веб-серверов, веб-приложений, подключений к базам данных и многого другого. Хотя многие считают, что Java является предшественником или каким-то образом связан с JavaScript, это совершенно разные языки. Когда дело доходит до функций, Java представляет собой бесплатный язык с открытым исходным кодом, работает в большинстве основных операционных систем и в некоторой степени безопасен, быстр и прост в использовании. Это объектно-ориентированный язык для управляемой среды разработки, и многие люди переключаются на Java и C++ (или Java и C#) или наоборот, поскольку эти языки очень похожи.
  • Python: еще один распространенный серверный язык называется Python. Вы можете найти Python, реализованный в приложениях и на веб-сайтах, таких как Instagram, Facebook, Quora и многих других крупных технологических компаниях. Python хорошо подходит для разработки программного обеспечения, написания сценариев и его более распространенного использования: серверной веб-разработки.
  • C++: язык программирования C++, который часто преподается в школе для выполнения математических функций, также служит способом создания онлайн-приложений, элементов веб-сайта и высокопроизводительных вычислений. Будучи популярным (если не одним из самых популярных) языком программирования, его серверное использование удобно для адаптации к нескольким платформам, повторного использования ранее созданных программ и интеграции практически с любым графическим пользовательским интерфейсом. Не говоря уже о том, что C++ выглядит похожим на Java и C#, поэтому людям, изучающим эти языки, будет легко переходить с одного языка на другой.
  • JavaScript: мы сказали, что JavaScript отличается от Java, и это правда. JavaScript обеспечивает потенциал разработки как для внутренних, так и для внешних целей, и используется в обоих типах фреймворков. Когда дело доходит до разработки бэкенда, JavaScript расширяет все основные языки, предоставляя определенные объекты для всего веб-сайта, например, заставляя приложение взаимодействовать с базой данных.
  • Ruby: язык Ruby продолжает набирать популярность для бэкенд-разработки веб-приложений и сайтов, в первую очередь потому, что его намного легче читать и писать. Это также объектно-ориентированный язык, который устраняет необходимость в компиляторе для запуска веб-сайтов и приложений, и он идеально сочетается со своей партнерской платформой Rails.
Фронтенд-языки

Языки интерфейса, используемые при разработке на стороне клиента, в большей степени ориентированы на клиента. Таким образом, эти языки лучше известны широкой публике. Это те языки, о которых думает обычный человек, когда упоминается какой-либо тип веб-разработки.

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

Выбирая правильный язык интерфейса, разработчики начинают с того, что они знают, а затем выбирают конкретные фреймворки и языки, которые соответствуют желаемому результату. Например, HTML предлагает пользователям необходимый высокопроизводительный интерфейс, что имеет смысл для создания простых веб-сайтов. А CSS делает HTML еще на один шаг дальше, когда дело доходит до стиля.

Однако вы никогда не должны забывать, что некоторые из этих языков работают вместе, чтобы добиться наилучшего результата. Многие веб-сайты имеют комбинацию HTML, CSS и JavaScript, работающих весьма согласованно.

Вот основные языки разработки интерфейсов:

  • HTML: являясь синонимом основных основ веб-дизайна, HTML (язык гипертекстовой разметки) обеспечивает основной язык разметки для разработки любого типа веб-сайтов в Интернете. HTML может создавать все, от текста до изображений, от ссылок до заголовков, а также предоставлять определенные уровни стиля, чтобы показать, где эти элементы могут оказаться на странице. Сам по себе HTML хорошо работает для создания статических веб-страниц. Тем не менее, в сочетании с другими языками, такими как JavaScript и CSS, вы можете выполнять гораздо более сложные задачи, создавать современный стиль и влиять на поведение других языков в написании кода сайта.
  • CSS: аббревиатура от Cascading Style Sheets (каскадные таблицы стилей). CSS — это манипулирование элементами внешнего интерфейса, чтобы сделать их более презентабельными, очистить объем необходимого HTML-кода и стилизовать процессы, которые невозможны с помощью одного только HTML. В то время как HTML содержит фактическое внешнее содержимое веб-сайта (и несколько основных параметров стиля из-за ограничений на теги в HTML), CSS обеспечивает стиль для этого содержимого, и все это хранится во внешних таблицах стилей, которые входят в файлы CSS на сервере.
  • JavaScript: мы говорили о JavaScript как о самом популярном языке программирования для бэкенда, но он также считается одним из самых популярных языков для разработчиков внешнего интерфейса. Фронтенд-версия JavaScript работает в тандеме с HTML и CSS для создания красивого макета. В то время как HTML фокусируется на структуре документа, а CSS на стилизации, JavaScript предоставляет важное решение, позволяющее интерфейсному клиенту взаимодействовать с сервером.
  • Dart: известный своим сходством с языками Java и C, Dart предназначен для разработки и программирования мобильных приложений, а это означает, что вы можете создавать на этом языке практически все, включая приложения, веб-сайты, серверы и программное обеспечение для настольных компьютеров.

Продолжение следует…

Источник

  • 2348