Модуль 02 · Лекция 2.3

Софт: из чего состоит программа_

Архитектура и слои приложения, API и базы данных, UX/UI, Git, методологии разработки и путь продукта от идеи до релиза.

~50 мин 📊 средний уровень 🎯 software

Введение: три слоя любого продукта

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

Любой цифровой продукт

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

🖥️Интерфейсто, что видит пользователь
⚙️Логикачто происходит «под капотом»
🗄️Данныечто и где хранится
0
базовых слоя любого продукта
0
операции CRUD в API
0
этапов тестирования
0
этапов производства ПО

Фронтенд и бэкенд

client side

FRONTEND

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

server side

BACKEND

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

ФронтендБэкенд
Где работаетНа устройстве пользователя (в браузере / приложении)На сервере
Что делаетПоказывает интерфейс, собирает действия пользователяОбрабатывает логику, работает с базой данных
Что видит пользовательВсё это видно и доступноНичего не видно напрямую

three partsТри составляющих любой программы

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

layer 1
🖥️

Интерфейс

То, через что человек взаимодействует с программой: экраны, кнопки, поля ввода. Это визуальная «витрина» продукта.

презентационный слой
layer 2
⚙️

Логика

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

бизнес-слой
layer 3
🗄️

Данные

Информация, которая хранится и обрабатывается: пользователи, заказы, тексты, файлы. Данные обычно живут в базе данных на сервере.

слой хранения

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

Базы данных: SQL и NoSQL

Данные редко хранятся «просто в файле» — для этого используют базы данных, и здесь есть два основных подхода. SQL (реляционные базы данных, например MySQL, PostgreSQL) хранят информацию в виде таблиц со строго заданной структурой: заранее известно, какие столбцы есть в таблице и какого типа в них данные, а связи между таблицами чётко прописаны. NoSQL (например MongoDB, Redis) — это более гибкий подход: данные хранятся не только в таблицах, но и в виде документов, пар «ключ-значение» или графов, без жёсткой заранее заданной структуры, что удобно для быстро растущих проектов с разнородными данными.

масштабирование

SQL → ВЕРТИКАЛЬНО

SQL-базы обычно масштабируют «вертикально» — усиливая один мощный сервер (больше процессора, больше памяти).

масштабирование

NOSQL → ГОРИЗОНТАЛЬНО

NoSQL масштабируют «горизонтально», просто добавляя больше серверов в общий пул.

Выбор между ними зависит от задачи: если данные структурированы и важна строгая целостность связей (банковские операции, бухгалтерия) — выбирают SQL; если данные разнородны и нужна высокая скорость роста (соцсети, логи, каталоги товаров) — чаще выбирают NoSQL.

Проверка понимания · Базы данных

Как обычно масштабируют NoSQL-базы данных (например, MongoDB)?

Как части софта общаются: API

API (Application Programming Interface)

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

Работа через API обычно состоит из трёх шагов: приложение отправляет запрос (например, «покажи данные о заказе номер 5»), сервер этот запрос обрабатывает, а затем присылает в ответ структурированные данные (обычно в формате JSON). Основные операции, которые выполняет API, описываются аббревиатурой CRUD:

CCreate — создать
RRead — прочитать
UUpdate — обновить
DDelete — удалить
api_request.log — фронтенд ⇄ бэкенд
# 1. приложение отправляет запрос
GET /api/orders/5 HTTP/1.1
Host: shop.example

# 2. сервер обрабатывает и присылает структурированные данные
HTTP/1.1 200 OK
Content-Type: application/json

{
  "id": 5,
  "status": "paid",
  "total": 12500,
  "items": ["клавиатура", "мышь"]
}

По уровню доступа выделяют открытые API (доступны любому разработчику), закрытые/внутренние (только для сотрудников внутри компании) и партнёрские (для избранных внешних партнёров).

UX и UI

UX (User Experience — пользовательский опыт) и UI (User Interface — пользовательский интерфейс) — два разных, но связанных направления в дизайне цифровых продуктов.

как это работает

UX · USER EXPERIENCE

UX отвечает на вопрос «как это работает» — это удобство, логика навигации, сценарии использования, то, насколько легко и приятно человеку решить свою задачу в продукте.

как это выглядит

UI · USER INTERFACE

UI отвечает на вопрос «как это выглядит» — цвета, шрифты, кнопки, иконки, расположение элементов на экране.

Проще говоря: UX — это скелет и логика продукта, а UI — это его внешняя «одежда». Хороший UI не спасёт продукт с плохим UX: если кнопка красивая, но пользователь не понимает, зачем на неё нажимать и куда он попадёт — это провал UX, даже при отличном визуале.

Работа над UX/UI обычно идёт по циклу:

исследование пользователей и конкурентов проектирование структуры и сценариев создание визуального дизайна тестирование с реальными людьми доработка
Проверка понимания · UX/UI

На какой вопрос отвечает UI-дизайн?

Типы архитектуры приложений

Архитектура определяет, как организован код программы внутри и насколько легко её потом менять, масштабировать и чинить.

monolith
единое приложение

Монолитная

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

layered
представление
бизнес-логика
данные

Слоистая (многоуровневая)

Способ организовать код внутри программы так, чтобы разные типы задач были разделены по отдельным «слоям», даже если физически это всё ещё одна программа. По сути — «организованный монолит»: приложение разворачивается как одно целое, просто аккуратно разложено по полочкам внутри.

microservices
users
pay
notify
cart
search
auth

Микросервисная

Разбивает приложение на множество маленьких независимых сервисов, каждый из которых отвечает за одну конкретную бизнес-задачу. Сервисы взаимодействуют через чётко определённые интерфейсы (API) и могут быть написаны на разных языках программирования.

layersТрёхслойная структура — самый распространённый вариант

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

pros & consПлюсы и ограничения

монолит

ПЛЮСЫ И ОГРАНИЧЕНИЯ

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

микросервисы

ПЛЮСЫ И ОГРАНИЧЕНИЯ

Плюсы: каждый сервис можно обновлять, масштабировать и разворачивать отдельно от остальных без риска «положить» весь продукт; удобно, если над продуктом работает несколько разных команд одновременно. Ограничения: требует значительно более сложной инфраструктуры — нужен отдельный компонент (API Gateway) для маршрутизации запросов между сервисами, сложнее отслеживать ошибки и тестировать систему целиком, а переход с монолита на микросервисы обычно делают постепенно, сервис за сервисом, а не одним махом.

Тип архитектурыКак организованаДля чего хорошо подходитОграничения
МонолитнаяВсё в одной программе и базе кодаНебольшие проекты, стартапы, MVPТяжело поддерживать и масштабировать при росте
СлоистаяОдин проект, но код разбит на логические слоиСредние проекты, где важна структура кода без лишней сложностиВсё равно разворачивается как единое целое
МикросервиснаяМножество независимых сервисов, связанных через APIКрупные продукты, много команд, высокие нагрузкиСложная инфраструктура, дороже в поддержке
Проверка понимания · Архитектура

В какой архитектуре сервис можно обновить и развернуть отдельно, не трогая остальной продукт?

Где живёт готовый продукт: хостинг и развёртывание

После разработки продукт нужно куда-то «поселить», чтобы он был доступен пользователям — этот процесс называется развёртыванием (deployment), а место, где физически работает продукт — хостингом. Есть два основных варианта:

fixed resource

ВЫДЕЛЕННЫЙ СЕРВЕР / VPS

VPS/VDS (виртуальный сервер) — это фиксированный ресурс одного физического сервера, который выделяется в частное пользование. Даёт полный контроль и предсказуемую стоимость, но плохо подходит для резких скачков нагрузки.

elastic

ОБЛАЧНЫЙ ХОСТИНГ

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

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

gitВерсионирование кода: зачем нужен Git

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

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

git_basics.sh — контроль версий в действии
# сохранить изменения с описанием
$ git add .
$ git commit -m "добавлен модуль оплаты"

# параллельная работа над фичей — не мешает основному коду
$ git branch feature/notifications
$ git checkout feature/notifications

# аккуратно объединить, когда готово
$ git merge feature/notifications  # → основная ветка цела

Методологии разработки

Методология определяет, как команда организует сам процесс работы над продуктом — насколько жёстко распланирован проект и как часто заказчик видит промежуточные результаты.

classic
🌊

Waterfall (водопадная)

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

flexible
🔄

Agile и Scrum

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

flow
📋

Kanban

Альтернативный гибкий подход, где вместо жёстких спринтов используется визуализированная доска с задачами, что удобно, когда важно равномерно распределять нагрузку на команду без строгих временных рамок.

ПодходКак организована работаКогда подходит
WaterfallСтрого последовательные этапы, без возврата назадСтабильные требования, предсказуемый проект
Agile / ScrumКороткие спринты, регулярная демонстрация результатаНовый продукт с высокой неопределённостью
KanbanВизуальная доска задач без жёстких спринтовНужно оптимизировать поток задач и нагрузку команды
Проверка понимания · Методологии

В какой методологии работа идёт короткими спринтами с ежедневными встречами и регулярной демонстрацией результата?

Этапы производства программного обеспечения

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

stage 01

Техническое задание и планирование

Всё начинается со сбора требований: заказчик и команда разработки договариваются, что должен делать продукт, кто его пользователи, какие у него ограничения по бюджету и срокам. На этом этапе составляется техническое задание (ТЗ) — документ, описывающий функциональность продукта, — и проводится оценка сроков и ресурсов, необходимых для реализации.

stage 02

Прототипирование

Прототип — это упрощённая рабочая модель будущего продукта, которая показывает основные функции без полной реализации внутренней логики. Сначала создаётся простой набросок структуры (вайрфрейм), который постепенно детализируется и превращается в интерактивный прототип. Прототип показывают заказчику и будущим пользователям для получения обратной связи, после чего вносятся правки — и так несколько раз, прежде чем прототип передают в разработку.

stage 03

UX/UI-дизайн

Параллельно с прототипированием (или сразу после него) идёт этап дизайна: сначала прорабатывается UX — логика экранов и сценарии использования, а затем UI — визуальное оформление.

stage 04

Разработка (итерации)

Сама разработка редко идёт одним большим блоком — чаще она разбивается на итерации (короткие циклы, обычно от одной до нескольких недель), в конце каждой из которых готова рабочая, тестируемая часть продукта. Такой подход позволяет быстрее находить ошибки, корректировать курс по ходу проекта и показывать заказчику промежуточные результаты, а не ждать полной готовности продукта.

stage 05

Автоматизация выпуска: CI/CD и DevOps

DevOps — это культура и набор практик, объединяющих команду разработки (Dev) и команду эксплуатации (Ops), чтобы устранить разрозненность между написанием кода и его запуском на реальных серверах. Часть DevOps-подхода — практика CI/CD, которая автоматизирует процесс доставки кода от разработчика до пользователей.

stage 06

Тестирование

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

stage 07

Безопасность

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

stage 08

Запуск и сопровождение

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

CI (Continuous Integration, непрерывная интеграция) — разработчики регулярно, несколько раз в день, добавляют свой код в общий репозиторий, и после каждого изменения автоматически запускаются тесты, чтобы сразу проверить, ничего ли не сломалось.

CD (Continuous Delivery/Deployment, непрерывная доставка/развёртывание) — если тесты прошли успешно, изменения автоматически или полуавтоматически доставляются в рабочую среду — на сайт или в приложение, без долгого ручного процесса выпуска обновлений. Такой подход снижает риск ошибок при выпуске новых версий и позволяет доставлять обновления пользователям намного быстрее, чем при ручном процессе.

  1. Работа с требованиями — команда тестировщиков знакомится с ТЗ и обсуждает, каким должен быть итоговый продукт.
  2. Разработка стратегии тестирования — оценка сроков, определение среды тестирования.
  3. Создание тестовой документации — написание сценариев проверки функционала.
  4. Тестирование прототипа — проверка основного функционала, донастройка целей.
  5. Основное тестирование — полная проверка продукта по всем сценариям.
  6. Стабилизация — устранение найденных ошибок (багов).
  7. Эксплуатациярегресс-тестирование уже после запуска, устранение ошибок, которые нашли реальные пользователи.

Основные компоненты и их взаимосвязь

Программный продукт — это не «просто код», а система слоёв и процессов. Интерфейс показывает и собирает действия, логика принимает решения по правилам, данные живут в базе; фронтенд выполняется у пользователя, бэкенд — на сервере, а связывает их API. Архитектура (монолит, слои, микросервисы) определяет, насколько легко продукт менять и масштабировать; хостинг и Git — где он живёт и как не потерять наработки; методологии и этапы — как команда доходит от идеи до работающего решения и сопровождает его дальше.

Ключевые выводы

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

Данные требуют правильного хранилища: SQL — для структурированных данных со строгой целостностью (банки, бухгалтерия), NoSQL — для разнородных и быстро растущих (соцсети, логи, каталоги). UX отвечает на вопрос «как это работает», UI — «как это выглядит», и хороший UI не спасёт плохой UX.

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

Продукт не заканчивается на релизе: Git защищает код от потерь и параллельных правок, методологии (Waterfall/Scrum/Kanban) организуют процесс под уровень неопределённости, а запуск переводит расходы в постоянный режим — хостинг, обновления, мониторинг безопасности и сопровождение идут весь жизненный цикл продукта.