Вопрос 1.

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

Инструментальные средства разработки ПО (или CASE-средства) — это специализированные программы, которые используются разработчиками для создания, отладки, тестирования и сопровождения программного обеспечения. Простыми словами, это «инструменты для создания инструментов» — то есть всё то, без чего современный программист не может написать ни одной строчки кода.

К инструментальным средствам относятся:

Инструментальные средства делятся на три большие группы:

  1. Для разработки (редакторы, компиляторы, отладчики).
  2. Для анализа и тестирования (профилировщики, статические анализаторы, фреймворки для юнит-тестов).
  3. Для управления проектом (системы контроля версий, баг-трекеры, CI/CD).

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




Вопрос 2.

Классификация инструментальных средств разработки ПО.

Классифицировать инструментальные средства можно по разным признакам. На практике чаще всего используют функциональную классификацию — по тому, какую задачу решает инструмент.

1. По этапу жизненного цикла ПО:

2. По способу распространения:

3. По уровню интеграции:

4. По типу платформы:

5. По языку программирования:

6. По назначению (узкая специализация):

Классификация помогает выбрать правильный инструмент под конкретную задачу. Например, для стартапа на Python и React можно взять VS Code + Git + GitHub + pytest, а для крупного банковского проекта на Java — IntelliJ IDEA Ultimate + Jira + Jenkins + SonarQube.



Вопрос 3.

Интегрированная среда разработки: назначение, состав, функции

Краткая теория: IDE (Integrated Development Environment) объединяет редактор, компилятор, отладчик и Git в одной программе.

Состав (что внутри):

  1. Редактор кода (подсветка, автодополнение)
  2. Компилятор / интерпретатор
  3. Отладчик (точки останова, просмотр переменных)
  4. Система сборки (кнопка «Запустить»)
  5. Интеграция с Git
  6. Терминал

Основные функции:

Примеры IDE и для чего:

Пример: В PyCharm ты пишешь код, он сам подчёркивает ошибки, а по кнопке «Run» запускает программу и показывает результат в том же окне.



Вопрос 4.

Компиляторы, интерпретаторы и трансляторы: различия

Виды:

Пример различия (одна и та же программа):

python

# Простая программа
x = 10
y = 0
print(x / y)  # Ошибка: деление на ноль

Сравнение простыми словами:

КомпиляторИнтерпретатор
Создаёт файл .exeДаНет
Скорость работыБыстроМедленнее
Виден ли исходник пользователю?Нет (только машинный код)Да
Пример языковC, C++, Go, RustPython, PHP, JS, Ruby

Пример компилятора: GCC (для C++) — скомпилировал один раз, получил program.exe, отдал пользователю.

Пример интерпретатора: Python — пользователь запускает файл .py, интерпретатор построчно читает и выполняет.

Переводит с одного высокоуровневого языка на другой. Пример: TypeScript → JavaScript (браузер понимает только JS, а разработчик пишет на TS).шибки, а по кнопке «Run» запускает программу и показывает результат в том же окне.



Вопрос 5.

Этапы создания программного продукта

Программа создаётся не «сразу кодом», а проходит 6 обязательных этапов. Пропуск любого этапа ведёт к проблемам.

Схема этапов (как строительство дома):

  1. Анализ требований — что делать? → Техническое задание (ТЗ)
  2. Проектирование — как сделать? → схемы, чертежи, UML
  3. Кодирование — пишем код → исходники
  4. Тестирование — ищем ошибки → отчёт о багах
  5. Внедрение — отдаём пользователю → программа в работе
  6. Сопровождение — исправляем баги после релиза → новые версии

Пример для приложения «Калькулятор»:

ЭтапЧто делаемРезультат
АнализСпрашиваем у заказчика: нужно сложение, вычитание, умножение, деление, память, проценты?ТЗ из 8 пунктов
ПроектированиеРисуем расположение кнопок на экране, решаем, как хранить число в памяти, выбираем архитектуруМакет в Figma, схема классов
КодированиеПишем код на Python (или C++, или JS)main.py (500 строк)
ТестированиеПроверяем: 2+2=4? 5-3=2? 10/0 → ошибка? Сохраняется ли число в память?Нашли 3 бага, исправили
ВнедрениеДаём программу бабушке, устанавливаем на её компьютерБабушка пользуется
СопровождениеЧерез месяц бабушка просит добавить кнопку «√» (корень)Новая версия 1.1

Важные уточнения:

Почему нельзя пропустить анализ? Если не спросить у заказчика, нужна ли ему функция «проценты», можно потратить неделю на её реализацию, а заказчику она не нужна. Это потеря времени и денег.

Дополнительный пример: Классический провал проекта — когда заказчик говорит «сделайте удобную систему», программисты пишут код без анализа, а в итоге система работает, но не решает бизнес-задачу.



Вопрос 6.

Жизненный цикл программного обеспечения

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

5 фаз жизненного цикла (аналогия с жизнью человека):

ФазаВ жизни человекаВ жизни ПОПример для игры «Сапёр»
1. ИнициацияЗачатие, рождение идеиПридумали идею, оценили бюджет«Сделаем игру, где нужно открывать клетки, не наступив на мину»
2. РазработкаРост, взрослениеПроектирование, кодирование, тестирование3 месяца работы команды из 2 человек
3. ВнедрениеРождение (появление на свет)Выложили в магазин, установили на серверПоявилась в Google Play и App Store
4. ЭксплуатацияЖизнь, работаПользователи работают, выходят обновления2 года популярности, 100 тысяч скачиваний
5. Вывод из эксплуатацииСмертьОтключили серверы, удалили из магазиновУдалили из магазинов, закрыли онлайн-таблицу рекордов

Подробное описание каждой фазы:

Фаза 1. Инициация и определение требований

Фаза 2. Разработка (проектирование, кодирование, тестирование)

Фаза 3. Внедрение (переход в эксплуатацию)

Фаза 4. Эксплуатация и сопровождение

Фаза 5. Вывод из эксплуатации (снятие с поддержки)

Примеры длительности ЖЦ для разных типов ПО (реальные цифры):

Тип ПОРазработкаЭксплуатацияВыводВсего ЖЦ
Мобильная игра-однодневка1 месяц6 месяцев1 месяц8 месяцев
Популярная мобильная игра6–12 месяцев2–3 года3–6 месяцев3–4 года
Корпоративная CRM-система1–2 года


Вопрос 7.

Модели жизненного цикла программного обеспечения

Модель ЖЦ — это схема, которая определяет порядок выполнения этапов разработки. Разные модели подходят для разных проектов. Выбор модели влияет на сроки, бюджет, гибкость и риски.

Основные модели ЖЦ (сравнение):

МодельСутьКогда применятьПлюсыМинусы
Каскадная (Waterfall)Этапы строго по очереди, назад нельзяВоенные, медицинские, авиационные системы (требования стабильны годами)Простота, чёткие контрольные точкиОшибку в требованиях обнаружат только на тестировании
ИтеративнаяДелаем кусками (итерациями), после каждой — работающий прототипКрупные проекты с понятными, но уточняемыми требованиямиЗаказчик видит результат раноНужна хорошая архитектура
Спиральная (Spiral)Каждый виток: анализ рисков → разработка части → планирование следующегоКосмические системы, АЭС, инновационные R&D-проектыПостоянный контроль рисковСложно, дорого, много документации
Agile (Scrum, Kanban)Спринты 1–4 недели, работающий продукт после каждогоВеб-сервисы, стартапы, быстро меняющиеся требованияБыстрая реакция на измененияНе подходит для систем с жёсткими требованиями

Пример выбора модели на практике:

СитуацияКакая модельПочему
Система управления ракетойКаскаднаяТребования известны на 10 лет, ошибка стоит жизни
Корпоративная CRM на годИтеративнаяЗаказчик хочет видеть прогресс каждые 2 месяца
Разработка нового лекарства (софт для моделирования)СпиральнаяОгромные риски, дорого ошибиться
Мобильное приложение для доставки едыAgile (Scrum)Рынок меняется каждую неделю, нужно быстро реагировать

Дополнительно — Kanban (разновидность Agile):

Визуализация задач на доске:

To DoIn ProgressDone
Задача 1Задача 3Задача 5
Задача 2Задача 4Задача 6

Ограничение: не больше 3 задач в столбце «In Progress» (WIP limit). Нет спринтов — задачи берутся по мере готовности.



Вопрос 8.

Понятие репозитория, коммита, ветки и слияния

Это основы Git — системы контроля версий. Git хранит историю изменений, позволяет работать в команде и не бояться что-то сломать. Без Git командная разработка превращается в хаос из папок «проект_финал_3_исправленный_вася_2».

Основные понятия (с аналогиями):

ПонятиеАналогияЧто это в Git
РепозиторийБаза данных всех сохранений игрыПапка .git (скрытая), где хранятся все версии файлов
КоммитСохранение в игре (чекпоинт)Снимок всех файлов в определённый момент, с комментарием
ВеткаОтдельная дорожка разработки (как сохранение «эксперимент»)Указатель на цепочку коммитов
Слияние (merge)Объединение двух сохраненийВзяли изменения из ветки A и добавили в ветку B
КонфликтДва игрока изменили одну и ту же строку по-разномуGit не знает, что выбрать — решает человек

Как выглядит репозиторий (графически):

text

Коммиты:  A ← B ← C ← D  (главная ветка main)
              \
               E ← F ← G  (ветка feature)

После слияния (merge):

text

main:     A ← B ← C ← D ← H (коммит слияния, содержит E+F+G)
               \         /
feature:        E ← F ← G

Пример работы с Git (команды):

bash

# Создать новый репозиторий в текущей папке
git init

# Склонировать удалённый репозиторий
git clone https://github.com/user/project.git

# Посмотреть статус (какие файлы изменены)
git status

# Добавить файл в зону ожидания
git add main.py

# Создать коммит
git commit -m "Добавлена функция сложения"

# Посмотреть историю коммитов
git log --oneline
# a1b2c3d Добавлена функция сложения
# e4f5g6h Создан проект

# Создать новую ветку
git branch feature/new-button

# Переключиться на ветку
git checkout feature/new-button

# Или создать и переключиться одной командой
git checkout -b feature/new-button

# Слить ветку в текущую (находясь в main)
git merge feature/new-button

# Отправить коммиты на удалённый репозиторий
git push origin main

# Скачать чужие коммиты с удалённого репозитория
git pull origin main

Типичный конфликт слияния и его решение:

python

# В main:
def get_price():
    return 100

# В feature (ветке):
def get_price():
    return 200

При слиянии Git пишет:

text

CONFLICT in file.py
Auto-merge failed

Разработчик открывает файл и видит:

python

<<<<<<< HEAD
    return 100
=======
    return 200
>>>>>>> feature

Нужно вручную выбрать (или оставить оба варианта, или написать новый). После правки:

python

    return 150  # ручное решение

Затем: git add file.py && git commit (конфликт разрешён).

GitFlow (популярный процесс работы с ветками):

ВеткаНазначениеСоздаётся отСливается в
mainТолько стабильные релизы
developОсновная разработкаmainmain (при релизе)
feature/названиеНовая функцияdevelopdevelop
release/версияПодготовка релиза (только баги)developmain и develop
hotfix/названиеСрочное исправление бага в продакшенеmainmain и develop

Упрощённый вариант (GitHub Flow):

Практические советы:

Чаще делайте git pull, чтобы не было конфликтов.

Коммиты должны быть маленькими (один коммит — одно изменение)

Сообщение коммита понятное: Исправлен баг с нулевой ценой (а не фикс)

Не коммитьте сломанный код (тесты должны проходить)



Вопрос 9.

Работа с удалёнными репозиториями GitHub, GitLab, Bitbucket

Краткая теория: Удалённые репозитории — это Git-серверы в облаке или на своём сервере. Они позволяют команде иметь общий доступ к коду, делать код-ревью, автоматическую сборку и тестирование. Три основных хостинга: GitHub, GitLab, Bitbucket.

Сравнение трёх платформ (главное):

ХарактеристикаGitHubGitLabBitbucket
ВладелецMicrosoftGitLab Inc.Atlassian
ПопулярностьОгромная (100+ млн)СредняяНиже
Бесплатные приватные репозиторииДа (без лимита)Да (до 5 пользователей)Да (до 5 разработчиков)
Self-hosted (свой сервер)Платно (Enterprise)Бесплатно (CE)Платно (Server)
Встроенный CI/CDGitHub ActionsGitLab CI (лучший)Bitbucket Pipelines
Интеграция с JiraЧерез плагиныОграниченнаяРодная (глубокая)
Open Source сообществоОгромноеСреднееМаленькое
Лучшая фишкаСообщество, ActionsCI/CD, self-hostedСвязка с Jira

Что такое Pull Request (GitHub) / Merge Request (GitLab):

Запрос на слияние твоей ветки в основную. Включает:

Процесс работы через Pull Request:

text

1. Создал ветку feature/payment на локальном компьютере
2. Написал код, сделал коммиты
3. git push origin feature/payment (отправил на GitHub)
4. На GitHub нажал "Compare & pull request"
5. Написал описание: "Добавлена оплата картой"
6. Коллеги видят PR, оставляют комментарии
7. Автоматически запускаются тесты (CI)
8. После одобрения (approve) нажимают "Merge pull request"
9. Ветка слита в main, можно её удалить

Особенности каждой платформы:

GitHub:

GitLab:

Bitbucket:

Пример файла CI/CD для GitHub Actions (.github/workflows/test.yml):

yaml

name: Run tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: '3.11'
      - run: pip install pytest
      - run: pytest tests/

При каждом push или PR автоматически запускаются тесты.

Выбор хостинга по ситуации:

СитуацияКакой выбрать
Open Source проектGitHub (сообщество, звёзды, форки)
Стартап с маленькой командойGitHub (бесплатно, Actions)
Банк или госорганы (свой сервер)GitLab (self-hosted бесплатно)
Компания уже использует Jira и ConfluenceBitbucket (родная интеграция)
Нужен мощный CI/CD без болиGitLab
Студент, хочет портфолиоGitHub (профиль с зелёными квадратиками)


Вопрос 10.

Виды ошибок в программном обеспечении

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

1. Классификация по времени обнаружения:

Вид ошибкиКогда проявляетсяПримерКак искать
СинтаксическаяПри компиляции или запуске интерпретатораpritn("Hello") вместо printКомпилятор/интерпретатор укажет строку
Времени выполнения (runtime)Во время работы программыДеление на ноль, нулевой указательОтладчик, логирование
ЛогическаяПрограмма работает, но выдаёт неверный результатКалькулятор выводит 2+2=5Тесты, сравнение с эталоном

Примеры каждого вида:

python

# 1. Синтаксическая ошибка
if x = 5:        # Ошибка: должно быть ==, а не =
    print(x)

# 2. Ошибка времени выполнения
y = 0
x = 10 / y       # ZeroDivisionError

# 3. Логическая ошибка
def is_even(n):
    return n % 2 == 1   # Ошибка: должно быть == 0

2. Классификация по серьёзности (баг-трекеры Jira, YouTrack):

УровеньОбозначениеЧто значитПримерДействие
BlockerP0Дальше работать нельзя, программа не запускаетсяПриложение падает при стартеИсправить немедленно (релиз отложить)
CriticalP1Важная функция полностью не работаетКнопка «Оплатить» ничего не делаетИсправить до релиза
MajorP2Важная функция работает с ошибками, но есть обходной путьЦена отображается неверно, но в чеке правильнаяИсправить в следующем релизе
MinorP3Мелкий баг, не влияет на основную работуКнопка чуть съехала влевоВ плановом порядке
TrivialP4Косметическая ошибкаОпечатка в подсказкеЕсли есть время

3. Классификация по происхождению (причине):

Тип ошибкиПримерКак предотвратить
Ошибка ввода-выводаФайл не найден, нет прав на запись, диск заполненПроверять результат операций ввода-вывода
Ошибка многопоточностиRace condition (гонка данных), deadlock (взаимная блокировка)Использовать блокировки, атомарные операции
Ошибка памятиУтечка памяти, выход за границы массива, double freeУмные указатели (C++), сборщик мусора (Java, Python)
Ошибка бизнес-логикиПри скидке 10% вычитается 10 рублей, а не 10%Более тщательное тестирование, TDD
Ошибка окруженияНа компьютере разработчика работает, на сервере — нетКонтейнеризация (Docker), CI/CD
Ошибка целочисленного переполнения2000000000 + 2000000000 = -294967296 (в 32-битном int)Использовать типы с контролем переполнения
Ошибка неинициализированной переменнойint x; cout << x; (выведет мусор)Всегда инициализировать переменные
Ошибка округления (float)0.1 + 0.2 = 0.30000000000000004Использовать Decimal для денег

Пример ошибки с плавающей точкой (неожиданный результат):

python

a = 0.1
b = 0.2
c = a + b
print(c)  # 0.30000000000000004, а не 0.3

4. Классификация по способу воспроизведения:

ТипЧто значитПримерСложность исправления
Стабильные (постоянные)Воспроизводятся всегдаКнопка «Вход» не работает при пустом паролеНизкая
Плавающие (эпизодические)Возникают случайно, 1 раз из 100Программа падает раз в день, неясно почемуВысокая (очень трудно искать)
Зависимые от данныхПоявляются только на определённых данныхОшибка возникает только при сумме > 1 000 000Средняя

Плавающие ошибки — самые сложные. Часто связаны с:

Как писать сообщение об ошибке (баг-репорт):

ПолеЧто писатьПример
ЗаголовокКратко суть«Кнопка «Купить» не работает в Safari на iPad»
Шаги воспроизведенияЧто нажать, в каком порядке1. Открыть Safari 2. Зайти на сайт 3. Нажать «Купить»
Ожидаемый результатКак должно работатьОткрывается форма оплаты
Фактический результатЧто происходит на самом делеНичего не происходит, ошибка в консоли
ОкружениеОС, браузер, версияiPadOS 16.4, Safari 16.4
Скриншот / логДоказательство(вложение)
СерьёзностьBlocker/Critical/Major/MinorMajor

Пример правильного баг-репорта:

text

Заголовок: При попытке оплаты на Safari падает ошибка "undefined is not an object"

Шаги:
1. Открыть сайт на iPad Safari
2. Добавить товар в корзину
3. Нажать "Перейти к оплате"
4. Ввести карту 1111 2222 3333 4444
5. Нажать "Оплатить"

Ожидание: Оплата проходит, появляется чек
Реальность: Ошибка "undefined is not an object" (строка 147 в payment.js)

Окружение: iPadOS 16.4, Safari 16.4, версия сайта от 10.06.2024
Серьёзность: Critical (оплата не работает)


Вопрос 11.

Методы поиска и исправления ошибок в программе

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

Основные методы поиска ошибок (сравнение):

МетодКак работаетКогда применятьПример
Визуальный осмотр кода (code review)Другой разработчик смотрит кодДо слияния ветки, перед релизомКоллега заметил if x = 5 (присваивание вместо сравнения)
Отладка с точками остановаПрограмма останавливается на нужной строкеКогда ошибка воспроизводитсяОстановились перед делением — увидели, что делитель = 0
Пошаговое выполнениеВыполняем код по одной строкеКогда неясно, где именно ошибкаПрошли 10 строк — переменная x стала отрицательной
ЛогированиеВывод отладочных сообщений в файл/консольПлавающие ошибки, серверная разработкаlog.debug(f"x={x}, y={y}")
Модульные тестыПишем тесты, проверяющие каждый кусокПостоянно, после исправления ошибкиТест: assert divide(10,2) == 5
АссертыВставка проверок, которые «кричат» при нарушенииДля инвариантов (что всегда должно быть верно)assert y != 0, "Делитель не может быть нулём"
Статический анализ (линтеры)Программа проверяет код без запускаРегулярно, в IDE или CIPylint: «переменная определена, но не используется»
ПрофилированиеАнализ времени выполнения функцийКогда программа работает медленноПрофилировщик показал: 80% времени в sort_data()
Бинарный поиск (git bisect)Git ищет коммит, где появилась ошибкаКогда ошибка появилась недавноGit нашёл коммит от вторника, где изменили формулу
Метод «утиной отладки»Объясняем ошибку кому-то (или утке)Когда зашли в тупикВ процессе объяснения сами поняли причину
Воспроизведение на минимальном примереСокращаем код до минимума, где ошибка ещё проявляетсяКогда код большой и сложныйИз 1000 строк оставили 10 — ошибка осталась

Пример отладки с точками останова (пошагово):

python

def calculate_price(price, discount):
    result = price - discount * 2  # Ошибка: лишнее умножение на 2
    return result

final = calculate_price(100, 20)  # Ожидаем 80, получаем 60

Процесс отладки:

ШагДействиеЧто видим
1Ставим точку останова на строке result = price - discount * 2Строка подсвечена
2Запускаем отладку (Debug)Программа остановилась
3Смотрим значения переменныхprice = 100discount = 20
4Выполняем строку (Step Over)result стал 60
5Понимаем: формула невернаяИсправляем на price - discount

Метод «разделяй и властвуй» (бинарный поиск ошибки):

Если программа из 1000 строк выдаёт ошибку, ищем не с начала:

ШагДиапазонДействиеРезультат
11–1000Проверяем строки 1–500Ошибки нет → ошибка в 501–1000
2501–1000Проверяем 501–750Ошибка есть → в 501–750
3501–750Проверяем 501–625Ошибка есть → в 501–625
4501–625Проверяем 501–563Ошибки нет → в 564–625

За 4 шага нашли 62 строки, за 10 шагов можно найти одну строку в 1000.

Метод «утиной отладки» (rubber duck debugging):

Берёте игрушечную утку (или просто представляете собеседника) и объясняете:

В процессе объяснения ошибка становится очевидной.

Исправление ошибок (алгоритм):


Шаг
ДействиеПример
1Понять причину, а не следствиеДеление на ноль из-за того, что y не проверяется
2Исправить минимальным изменениемДобавить if y == 0: return 0
3Написать тест, который ловит эту ошибкуassert divide(10, 0) == 0
4Проверить, что не сломали другоеЗапустить все старые тесты
5Закоммитить с понятным сообщениемgit commit -m "Исправлен баг с делением на ноль"
Важное правило: Исправляйте причину, а не следствие. Если исправить следствие (например, просто подавить ошибку try-except), она появится снова в другом месте.



Вопрос 12.

Тестирование программного обеспечения: понятие и цели

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

Основные цели тестирования:

ЦельЧто значитПример
Найти ошибкиОбнаружить дефекты до того, как их увидит пользовательКнопка «Купить» не работает после обновления
Проверить соответствие требованиямПрограмма делает то, что написано в ТЗВ ТЗ: «скидка 10% при сумме > 1000» — проверяем
Оценить качествоПонять, готова ли программа к релизу50 критических багов → не готово; 2 мелких → можно
Предотвратить ошибкиУлучшить процесс разработки на основе найденных баговЧасто ошибаются в модуле оплаты → усилить code review
Дать информацию для решенийРуководитель решает: выпускать или нет95% тестов пройдено → можно выпускать
Снизить рискиУбедиться, что критичные функции работаютПроверили списание денег — это критично

Уровни тестирования (по объёму проверяемого кода):

УровеньЧто тестируемКто пишетПример
Модульное (unit)Отдельные функции, классыПрограммистФункция sum(2,3) должна вернуть 5
ИнтеграционноеКак модули работают вместеПрограммист или тестировщикБаза данных + бизнес-логика: запрос возвращает данные
СистемноеВся программа целикомТестировщикПолный сценарий: регистрация → покупка → оплата
Приёмочное (UAT)Программа решает бизнес-задачи заказчикаЗаказчикБухгалтер проверяет отчёт по налогам

Виды тестирования (по характеру проверок):

ВидЧто проверяемИнструментыПример
ФункциональноеРаботают ли функции по ТЗJUnit, pytest, SeleniumКнопка «Вход» открывает форму
НагрузочноеПоведение под большой нагрузкойJMeter, k6, Locust1000 пользователей → время ответа < 2 сек
БезопасностиМожно ли взломатьOWASP ZAP, Burp SuiteSQL-инъекции не проходят
ЮзабилитиУдобно ли пользоватьсяРучное тестированиеКнопка «Купить» заметна и на месте
РегрессионноеНе сломались ли старые функцииАвтоматические тестыДобавили скидки — проверили обычную покупку
Дымовое (smoke)Запускается ли программа вообщеРучной запускПрограмма не падает при старте
Alpha-тестированиеВнутри команды разработкиРучноеРазработчики проверяют новую версию
Beta-тестированиеРеальные пользователиСбор отзывовВыпустили бета-версию для 1000 пользователей

Принципы тестирования (важные истины):

ПринципСмыслПример
Нельзя протестировать всёВсегда будут неохваченные сценарииТестируем только типичные и граничные случаи
Отсутствие ошибок не гарантияТесты прошли — но другие сценарии могут упастьНа Windows работает, на Linux — нет
Скопление дефектов80% ошибок в 20% модулейСамые сложные модули — самые бажные
Парадокс пестицидаПовторяя одни тесты, новых ошибок не найдёшьНужно обновлять тесты
Тестирование зависит от контекстаРазный подход для разных системИгру и банк тестируют по-разному

Пирамида тестирования

Самая вершина пирамиды: 10% UI-тесты (медленные, дорогие)

Середина пирамиды: 20% интеграционные тесты
Низ пирамиды: 70% модульные тесты (быстрые, дёшевые)

Пример тестирования простой функции:

python

def divide(a, b):
    return a / b

Набор тестов:

ТестВходОжидаемый результат
Обычное делениеdivide(10, 2)5
Деление на 1divide(10, 1)10
Деление на отрицательноеdivide(10, -2)-5
Деление нуляdivide(0, 5)0
Деление на нольdivide(10, 0)ZeroDivisionError
Отрицательное на отрицательноеdivide(-10, -2)5




Вопрос 13.

Инструменты для тестирования программного обеспечения

Для разных видов тестирования существуют свои инструменты. Они автоматизируют проверки, позволяя находить ошибки быстрее и надёжнее. Выбор инструмента зависит от языка программирования, типа приложения и бюджета.

1. Инструменты модульного тестирования (Unit testing):

ИнструментЯзыкОсобенностьПример кода
JUnitJavaСтандарт де-фактоassertEquals(5, calculator.add(2, 3))
pytestPythonПростой синтаксисassert add(2, 3) == 5
unittestPythonВстроенный в Pythonself.assertEqual(add(2,3), 5)
JestJavaScript (React)Снэпшот-тестыexpect(sum(1,2)).toBe(3)
Google TestC++От GoogleEXPECT_EQ(5, add(2, 3))
NUnitC#/.NETАналог JUnit[Test] public void AddTest()

2. Инструменты интеграционного тестирования (API, БД):

ИнструментЧто делаетПример использования
PostmanТестирование REST APIЗапрос GET /users/1 → проверка JSON ответа
SoapUISOAP и REST APIТестирование веб-сервисов
REST AssuredREST API на Javagiven().get("/users/1").then().statusCode(200)
TestcontainersЗапуск БД в DockerПоднять PostgreSQL, выполнить тесты, уничтожить

3. Инструменты тестирования UI (пользовательского интерфейса):

ИнструментЧто делаетПример кода
SeleniumАвтоматизация браузераdriver.find_element(By.ID, "login").click()
CypressUI-тесты для веб (быстрее Selenium)cy.get('#login').click()
PlaywrightОт Microsoft (все браузеры)await page.click('#login')
AppiumМобильные приложенияНажать на кнопку в Android/iOS

4. Инструменты нагрузочного тестирования (Performance):

ИнструментЧто делаетОсобенность
JMeterСоздаёт нагрузку на сервер1000 одновременных запросов
k6Современный, на JShttp.get('https://test.com')
LocustНа Python, распределённый1000 пользователей кладут товары в корзину
LoadRunnerПрофессиональный (дорогой)Для банковских систем

5. Инструменты тестирования безопасности:

ИнструментЧто делаетПример
OWASP ZAPИщет уязвимости в вебSQL-инъекции, XSS
Burp SuiteПерехват и модификация запросовИзменить цену в запросе
SonarQubeАнализирует код на уязвимостиНашёл "SELECT * FROM users WHERE id = " + userId

6. Статический анализ кода (линтеры):

ИнструментЯзыкЧто проверяет
ESLintJavaScriptСтиль, неиспользуемые переменные
PylintPythonОценка кода (10/10), проблемы
CheckstyleJavaОтступы, названия
BlackPythonАвтоформатирование

7. Управление тестами и багами:

ИнструментЧто делает
JiraБаг-трекер, управление задачами
YouTrackАналог Jira от JetBrains
TestRailХранение тест-кейсов и результатов
AllureКрасивые HTML-отчёты с графиками

Пример выбора инструментов по ситуации:

СитуацияИнструменты
Небольшой проект на Pythonpytest + Postman + ручное UI
Веб-приложение на JavaJUnit + Selenium + JMeter + SonarQube
Мобильное приложениеAppium + JUnit + Firebase Test Lab
Критичная система (банк)Все выше + LoadRunner + Burp Suite




Вопрос 14.

Документирование программного обеспечения

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

Зачем нужна документация:

ПричинаОбъяснение
Обучение новых разработчиковЧитают руководство программиста → быстро входят в курс
Упрощение сопровожденияЧерез год вспоминают, почему приняли решение
Общение с заказчикомТЗ подписано — меньше споров
Установка и настройкаREADME: «скачай, запусти install.bat»
API для других разработчиковДокументация REST API: URL, параметры, ответы

Классификация документации по назначению:

ТипДля когоЧто содержит
ПользовательскаяКонечные пользователиУстановка, запуск, использование, настройки
ТехническаяРазработчикиАрхитектура, API, схемы БД, алгоритмы
УправленческаяМенеджеры, заказчикиТЗ, планы, отчёты, бюджеты

Основные виды документации (с примерами):

ВидКто создаётСодержание
Техническое задание (ТЗ)АналитикФункции, сроки, бюджет, требования
Руководство пользователяТехнический писательКак войти, как создать отчёт, горячие клавиши
Руководство администратораТехнический писательУстановка, настройка БД, бэкапы
Руководство программистаРазработчикиОписание модулей, API, сборка
READMEРазработчикиЧто за проект, как установить, как запустить
API-документацияРазработчикиGET /users/{id} → JSON с полями
Комментарии в кодеПрограммисты# Функция сортирует массив по возрастанию
Релизные заметкиМенеджерЧто нового в версии 2.0
CHANGELOGРазработчикиИстория изменений по версиям

Золотые правила документирования:

ПравилоПочему
Пиши для человека через годЧерез год ты забудешь детали
Не дублируй код`i++ // увеличиваем i» — бесполезно |
Объясняй «почему», а не «что»Код показывает «что», комментарий — «почему»
Обновляй вместе с кодомУстаревшая документация хуже, чем её отсутствие
Используй автогенерациюJavadoc, Doxygen экономят время




Вопрос 15.

Виды программной документации

Программная документация — это не один документ, а целый набор. В разных стандартах (ГОСТ, ISO) перечисляются обязательные виды. На практике набор зависит от проекта: для мобильной игры — минимум, для авиационной системы — десятки документов.

Сводная таблица всех видов документации:

ВидСодержаниеОбязательностьДля кого
Техническое задание (ТЗ)Требования заказчика: функции, сроки, бюджетОбязательно для госзаказаЗаказчик, менеджеры
Пояснительная запискаОбоснование выбора архитектуры, алгоритмовЧастоРазработчики
Руководство пользователяКак пользоваться программойПочти всегдаПользователи
Руководство администратораУстановка, настройка БД, бэкапыДля серверных системАдминистраторы
Руководство программистаОписание модулей, API, сборкаДля крупных проектовРазработчики
Описание APIЭндпоинты, параметры, ответыДля веб-сервисовКлиенты
Спецификация требований (SRS)Детальные требования, use casesДля крупных проектовРазработчики, тестировщики
План тестированияЧто тестируется, как, какие инструментыДля серьёзных проектовТестировщики
Программа и методика испытанийКак будет проводиться приёмочное тестированиеПо ГОСТТестировщики, заказчик
READMEКратко: установка, запуск, примерыВсегда для Open SourceВсе
CHANGELOGИстория изменений по версиямЧастоРазработчики, пользователи
CONTRIBUTINGКак помочь проектуДля Open SourceКонтрибьюторы
ЛИЦЕНЗИЯ (LICENSE)Условия использования кодаДля Open SourceВсе
Архитектурная документацияДиаграммы компонентов, слоёвДля крупных системАрхитекторы
Схема БД (ER-диаграмма)Таблицы, связи, индексыДля систем с БДРазработчики, DBA

Пример набора документации для разных проектов:

Тип проектаМинимальный наборДополнительно
Студенческая курсоваяПояснительная записка + листинг кода
Мобильное приложениеREADME + комментарии + API (если есть)Руководство пользователя
Веб-сервис (стартап)README + API (Swagger) + Release notesРуководство программиста
Корпоративная системаТЗ + руководства (пользователя, админа, программиста) + схема БДПлан тестирования
Авиационная системаВсе выше + десятки документов по ГОСТСертификационные документы

Структура руководства пользователя (пример):

text

1. Введение
- Назначение программы
- Системные требования

2. Установка и запуск
- Установка
- Первый запуск
- Регистрация

3. Работа с программой
- Главное окно
- Создание отчёта
- Экспорт данных
4. Настройки
- Профиль пользователя
- Параметры отображения
5. Часто задаваемые вопросы (FAQ)
6. Решение типичных проблем
7. Алфавитный указатель




Вопрос 16.

Требования к оформлению технической документации

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

Основные требования к оформлению (по ГОСТ 19.106-78 и современной практике):

ТребованиеЧто значитПример
Стандартный шрифтTimes New Roman или Arial, размер 12–14 птВесь документ одним шрифтом
Полуторный межстрочный интервалСтроки не слипаются1,5 интервала
ПоляЛевое — 30 мм, правое — 10 мм, верхнее/нижнее — 20 ммДля подшивки в папку
Нумерация страницСверху или снизу, по центру или справаСтраница 5 из 50
Нумерация разделов1., 1.1., 1.1.1. — не более 4 уровней2.3.1. Описание функции
ЗаголовкиЖирный шрифт, отделены от текста1. Общие положения
ТаблицыСквозная нумерация, заголовок над таблицейТаблица 3 — Характеристики
РисункиСквозная нумерация, подпись под рисункомРисунок 2 — Схема алгоритма
СсылкиНа разделы, таблицы, рисунки — по номерам«как показано на рисунке 3»
СокращенияРасшифровка при первом употребленииПО (программное обеспечение)
ПриложенияОтдельная нумерация (Приложение А, Б)Приложение А — Листинг кода

Структура технического документа (по ГОСТ):

ЧастьЧто содержит
Титульный листНазвание, автор, организация, дата
АннотацияКраткое содержание (1 абзац)
СодержаниеСписок разделов с номерами страниц
Нормативные ссылкиГОСТы, на которые ссылаетесь
Определения и сокращенияРасшифровка терминов
Основная частьРазделы по теме документа
ПриложенияДополнительные материалы
Лист регистрации измененийКто и когда менял документ

Требования к тексту (стилистика):

ТребованиеПравильноНеправильно
Безличные предложения«Программа сохраняет файл»«Я написал программу, которая сохраняет файл»
Единообразие терминов«пользователь», «окно», «кнопка»то «юзер», то «оператор», то «пользователь»
Краткость«Нажмите кнопку ОК»«Для того чтобы подтвердить действие, необходимо нажать на расположенную в правом нижнем углу кнопку с надписью ОК»
Активный залог«Программа открывает окно»«Окно открывается программой»

Что НЕЛЬЗЯ делать в технической документации:





Вопрос 17.

Назначение технического задания на разработку ПО

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

Назначение ТЗ (зачем он нужен):

НазначениеОбъяснениеПример
Фиксация требованийЗаказчик говорит, что хочет; исполнитель записывает«Кнопка «Купить» должна быть зелёной и в правом верхнем углу»
Правовая защитаЕсли спор — смотрят ТЗ«Вы сказали сделать красную кнопку, а в ТЗ зелёная»
Планирование сроков и бюджетаПо ТЗ оценивают, сколько времени нужно10 экранов → 2 недели → 200 000 руб
Основа для приёмкиЗаказчик проверяет по ТЗ, всё ли сделаноПо ТЗ должна быть авторизация — проверили, работает
Снижение рисковМеньше недопонимания между сторонамиЗаказчик думал про «управление пользователями», а ТЗ уточняет: «добавление, удаление, редактирование»

Что даёт ТЗ каждой стороне:

СторонаЧто получает от ТЗ
ЗаказчикУверенность, что сделают то, что нужно; есть на что ссылаться при приёмке
Исполнитель (разработчик)Чёткие границы работы; защита от «а давайте ещё добавим» без доплаты
МенеджерОснова для планирования сроков и ресурсов
ТестировщикЧто проверять; что считается ошибкой, а что — не предусмотрено

Пример из жизни: Заказчик говорит: «Сделайте интернет-магазин». Без ТЗ разработчик делает самый простой вариант. А заказчик хотел: интеграцию с 1С, скидки по промокодам, личный кабинет с историей заказов. Спор. С ТЗ всё чётко: что есть в ТЗ — делаем, чего нет — не делаем или за доплату.

Когда ТЗ не нужно:

СитуацияПочему
Студенческая курсоваяПреподаватель дал задание устно
Свой проект для себяСам себе заказчик
Очень маленькая доработка«Поменять цвет кнопки» — можно в чате
Open Source проектОбычно обходятся README и Issues




Вопрос 18.

 Назначение технического задания на разработку ПО

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

Назначение ТЗ (зачем он нужен):

НазначениеОбъяснениеПример
Фиксация требованийЗаказчик говорит, что хочет; исполнитель записывает«Кнопка «Купить» должна быть зелёной и в правом верхнем углу»
Правовая защитаЕсли спор — смотрят ТЗ«Вы сказали сделать красную кнопку, а в ТЗ зелёная»
Планирование сроков и бюджетаПо ТЗ оценивают, сколько времени нужно10 экранов → 2 недели → 200 000 руб
Основа для приёмкиЗаказчик проверяет по ТЗ, всё ли сделаноПо ТЗ должна быть авторизация — проверили, работает
Снижение рисковМеньше недопонимания между сторонамиЗаказчик думал про «управление пользователями», а ТЗ уточняет: «добавление, удаление, редактирование»

Что даёт ТЗ каждой стороне:

СторонаЧто получает от ТЗ
ЗаказчикУверенность, что сделают то, что нужно; есть на что ссылаться при приёмке
Исполнитель (разработчик)Чёткие границы работы; защита от «а давайте ещё добавим» без доплаты
МенеджерОснова для планирования сроков и ресурсов
ТестировщикЧто проверять; что считается ошибкой, а что — не предусмотрено

Пример из жизни: Заказчик говорит: «Сделайте интернет-магазин». Без ТЗ разработчик делает самый простой вариант. А заказчик хотел: интеграцию с 1С, скидки по промокодам, личный кабинет с историей заказов. Спор. С ТЗ всё чётко: что есть в ТЗ — делаем, чего нет — не делаем или за доплату.

Когда ТЗ не нужно:

СитуацияПочему
Студенческая курсоваяПреподаватель дал задание устно
Свой проект для себяСам себе заказчик
Очень маленькая доработка«Поменять цвет кнопки» — можно в чате
Open Source проектОбычно обходятся README и Issues




Вопрос 19.

Пользовательская документация и руководство пользователя

Пользовательская документация — это документы, которые читает конечный пользователь программы. Главный из них — Руководство пользователя. Оно объясняет, как установить, запустить и пользоваться программой, не углубляясь в технические детали.

Назначение руководства пользователя:

НазначениеОбъяснение
Обучить пользователяЧеловек впервые открыл программу — прочитал и понял, что делать
Снизить нагрузку на поддержкуПользователи сами находят ответы, не звонят в техподдержку
Зафиксировать workflowКак правильно выполнять типовые задачи
Объяснить настройкиЧто означает каждый параметр

Структура руководства пользователя (стандартная):

РазделЧто содержитПример
1. ВведениеНазначение программы, для кого«Программа учёта товаров для кассиров»
2. Системные требованияЧто нужно для работыWindows 10, 4 ГБ RAM, 100 МБ диска
3. УстановкаКак установить программу«Запустите setup.exe, следуйте инструкции»
4. Первый запускКак запустить, регистрация«Ярлык на рабочем столе, логин: admin, пароль: admin»
5. ИнтерфейсОбзор экранов и кнопокСкриншот с подписями элементов
6. Типовые задачиПошаговые инструкции«Как добавить товар: нажмите «Добавить» → введите данные → нажмите «Сохранить»»
7. НастройкиИзменение параметров«Как сменить язык интерфейса»
8. Часто задаваемые вопросы (FAQ)Типичные проблемы«Что делать, если забыл пароль?»
9. Сообщения об ошибкахЧто означают ошибки«Ошибка 404 — файл не найден»
10. Алфавитный указательБыстрый поиск терминов«Кнопка → 15, Корзина → 23, Отчёт → 45»

Пример раздела «Как добавить товар» (руководство пользователя):

5.2. Добавление нового товара
Чтобы добавить товар в систему:
1. Нажмите на кнопку «Товары» в левом меню.
→ Откроется список товаров.
2. Нажмите на кнопку «+ Добавить товар» в правом верхнем углу.
→ Откроется форма добавления товара.
3. Заполните поля:
- Название товара (обязательно)
- Цена (только цифры)
- Количество на складе (целое число)
- Категория (выберите из списка)
4. Нажмите на кнопку «Сохранить».
→ Появится сообщение: «Товар успешно добавлен».
5. Новый товар появится в списке товаров.

Примечание: Поле «Название товара» не может быть пустым. Если вы не заполните его, кнопка «Сохранить» будет неактивна.

Требования к руководству пользователя:

ТребованиеЧто значитПример
Простой языкБез технического жаргонаВместо «аутентификация» — «вход по логину и паролю»
Много скриншотовПользователь видит, что должно быть на экранеСкриншот окна с подписями кнопок
Пошаговые инструкцииНумерованные списки1. Сделай это, 2. Сделай то
Выделение важногоВнимание, примечание, совет«Важно: перед удалением товара сделайте бэкап»
Алфавитный указательБыстрый поиск«Корзина — стр. 45, Оплата — стр. 67»

Онлайн-документация (современный подход):

Вместо PDF-файла многие делают веб-страницы:

ПлатформаОсобенность
ReadTheDocsБесплатно для Open Source
GitHub WikiВстроенная вики в репозитории
ConfluenceКорпоративная вика (от Atlassian)
MkDocsMarkdown → красивый HTML-сайт
Notion / GitBookСовременные инструменты для документации




Вопрос 20.

Совместная разработка программного обеспечения

Совместная разработка — это когда над одним проектом работает команда из нескольких человек (от 2 до сотен). Это требует дисциплины, инструментов (Git, баг-трекеры, чаты) и чёткого распределения ролей. Без этого код превращается в хаос.

Основные проблемы совместной разработки и их решения:

ПроблемаРешениеИнструменты
Код перезаписываетсяСистема контроля версийGit
Непонятно, кто что делаетЗадачи, баг-трекерJira, YouTrack, Trello
Разные стили кодаЛинтеры, форматтеры, code styleESLint, Black, Prettier
Ошибки попадают в продакшенCode review, CI/CD, тестыPull Request, GitHub Actions
Нет документацииВики, README, комментарииConfluence, MkDocs
Разработчики не синхронизированыЕжедневные встречи (daily standup)Zoom, Slack, Discord

Модели совместной разработки:

МодельКак работаетПлюсыМинусы
ЦентрализованнаяОдин репозиторий, все пушат в mainПростоЛегко сломать
С интеграционной веткойВетка develop, туда сливают фичиСтабильный mainЧуть сложнее
GitFlowmain + develop + feature + release + hotfixПолный контрольМного веток
GitHub FlowТолько main + короткие feature-веткиПросто, быстроНе для частых релизов
Форки (Open Source)Каждый делает форк репозиторияБезопасноСложно синхронизировать

Пример командной работы с Git (сценарий):

Петя и Вася работают над проектом.

1. Петя создаёт ветку feature/login:
   git checkout -b feature/login

2. Петя пишет код для входа, коммитит:
   git add .
   git commit -m "Добавлена форма входа"

3. Петя пушит ветку:
   git push origin feature/login

4. Вася делает свою ветку feature/payment:
   git checkout -b feature/payment

5. Вася пишет код оплаты, коммитит, пушит.

6. Петя открывает Pull Request на GitHub.

7. Вася (или тимлид) смотрит код, ставит аппрув.

8. Петя сливает ветку в main:
   git merge feature/login

9. Петя удаляет ветку (локально и на GitHub).

10. Вася перед началом работы подтягивает изменения:
    git pull origin main
    (переключается на свою ветку и сливает туда main, чтобы не было конфликтов)

Что такое Code Review (проверка кода):

АспектЧто проверяютПример замечания
ЛогикаПравильно ли работает«Здесь ты делишь на ноль, если y=0»
СтильСоответствует ли стандарту«Назови переменную user_id вместо uid»
ЭффективностьМожно ли быстрее«Вместо O(n²) можно сделать O(n)»
БезопасностьНет ли уязвимостей«Конкатенация в SQL — риск инъекции»
ТестыЕсть ли тесты на новый код«Добавь тест на случай, когда скидка 0%»
ДокументацияПонятно ли, что делает код«Добавь комментарий к этой функции»

Правила хорошего Code Review:

ПравилоЧто значит
Будь вежлив«Может, тут лучше использовать цикл?» вместо «Ты написал фигню»
Объясняй почемуНе просто «так не надо», а «так не надо, потому что…»
Не мельчиНе придирайся к опечаткам, если их можно исправить автоматически
Хвали за хорошее«Отлично, что добавил тест на этот случай»
Смотрите вместеИногда полезно посмотреть код на созвоне




Вопрос 21.

Роли участников команды разработки ПО

В современной команде разработки ПО есть несколько ролей. У каждой роли свои задачи и зона ответственности. В маленькой команде один человек может совмещать несколько ролей; в крупной (20+ человек) каждая роль может быть разделена на подроли.

Основные роли в команде разработки (сравнение):

РольГлавная задачаКому подчиняетсяТипичный опыт
Product Owner (PO)Определяет, какие функции делатьБизнес5+ лет
Project Manager (PM)Следит за сроками и бюджетомРуководство5+ лет
Team Lead (TL)Техническое руководство командойРуководство / PM5+ лет
Бизнес-аналитик (BA)Собирает и формализует требованияPO / PM3+ года
АрхитекторПроектирует архитектуру системыTL / CTO7+ лет
Разработчик (Developer)Пишет кодTL1–10 лет
Тестировщик (QA)Проверяет программу на ошибкиTL / PM1–8 лет
DevOpsНастраивает серверы, CI/CD, деплойTL / CTO3+ года
Технический писательПишет документациюPM1–5 лет
UX/UI дизайнерПроектирует интерфейсPO / PM2+ года
Системный администраторОбслуживает серверыDevOps / IT2+ года

Подробное описание каждой роли:

1. Product Owner (Владелец продукта)

2. Project Manager (Менеджер проекта)

3. Team Lead (Тимлид)

4. Бизнес-аналитик (Business Analyst)

5. Архитектор (System Architect)

6. Разработчик (Developer)

7. Тестировщик (QA Engineer)

8. DevOps (Development Operations)

Пример состава команды для разных размеров проекта:

Размер проектаКоманда
Стартап (3-5 чел)1 PM (он же PO), 2 разработчика, 1 тестировщик, 1 дизайнер (совмещает UI/UX)
Средний проект (10-15 чел)PO, PM, TL, 2 аналитика, 5 разработчиков, 2 тестировщика, 1 DevOps, 1 дизайнер
Крупный проект (30+ чел)Все роли + подроли (бэкенд, фронтенд, мобильные) + несколько тимлидов




Вопрос 22.

Системы управления задачами в разработке ПО

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

Популярные системы управления задачами:

СистемаКому подходитБесплатная версияОсобенность
JiraКрупные и средние компанииДо 10 пользователейМощная, сложная, от Atlassian
YouTrackКоманды, которые любят JetBrainsДо 10 пользователейБыстрая, можно на свой сервер
TrelloМаленькие команды, стартапыДа (с ограничениями)Простая, доски-колонки
AsanaМенеджмент любых задачДа (с ограничениями)Красивый интерфейс
RedmineOpen Source проектыПолностью бесплатныйСтарый, но надёжный
GitHub IssuesПроекты на GitHubДаВстроен в репозиторий
GitLab IssuesПроекты на GitLabДаВстроен, с досками
ClickUpМалый бизнесДа (с ограничениями)Много функций

Основные сущности в системах управления задачами:

СущностьЧто значитПример
Задача (Task/Issue)Единица работы«Исправить баг с нулевой ценой»
Проект (Project)Набор задач«Разработка интернет-магазина»
Спринт (Sprint)Период работы (1–4 недели)«Спринт 12: 10-24 июня»
СтатусГде находится задачаTo Do → In Progress → Review → Done
Тип задачиЧто это за задачаБаг, Фича, Технический долг
ПриоритетНасколько срочноBlocker, Critical, Major, Minor
Оценка (Story Points)Трудоёмкость2 SP (≈ 2 часа)
Исполнитель (Assignee)Кто делаетИванов И.
Наблюдатели (Watchers)Кто следитПетров П.
Эпик (Epic)Крупная задача из подзадач«Интеграция с платежной системой»

Типичный жизненный цикл задачи:

1. Создание задачи (кто-то завёл баг или новую фичу)
2. To Do (задача в очереди)
3. In Progress (разработчик взял, делает)
4. Code Review / Testing (готово к проверке)
5. Done (проверено, закрыто)

Пример задачи в Jira (поля):

text

Тип: Баг
Заголовок: Не работает кнопка «Купить» при пустой корзине
Приоритет: Critical
Исполнитель: Иванов И.
Наблюдатели: Петров П., Сидорова А.
Статус: In Progress
Описание:
Шаги:
1. Зайти в корзину
2. Не добавляя товаров, нажать «Купить»
3. Ошибка 500
Ожидание: Сообщение «Корзина пуста»
Окружение: Chrome 120, Windows 11

Интеграция с Git (важная фишка):

ДействиеКак работает
Привязать коммит к задачеВ сообщении коммита: PROJ-123 Исправлен баг с ценой
Автозакрытие задачиgit commit -m "PROJ-123 #close Исправлен баг"
Переход задачи по статусуПри пуше в ветку feature/PROJ-123 задача переходит в In Progress

Выбор системы по ситуации:

СитуацияКакую систему взять
Один разработчикGitHub Issues (достаточно)
Маленький стартап (3-5 чел)Trello или YouTrack
Средняя команда (5-20 чел)Jira или YouTrack
Крупная компания (20+ чел)Jira (стандарт индустрии)
Open Source проектGitHub Issues или GitLab Issues
Бюджет = 0Trello (бесплатный) или YouTrack (до 10 чел)




Вопрос 23.

Средства разработки веб-приложений

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

Классификация средств разработки веб-приложений:

КатегорияЧто делаютПримеры
Фронтенд (клиентская часть)Внешний вид и поведение в браузереReact, Vue, Angular, Svelte
Бэкенд (серверная часть)Логика, база данных, APINode.js, Django, Spring Boot, Laravel
Базы данныхХранение данныхPostgreSQL, MySQL, MongoDB, Redis
Средства сборкиОбъединяют файлы, оптимизируютWebpack, Vite, Parcel, esbuild
Отладка и тестированиеПоиск ошибокChrome DevTools, Jest, Postman, Selenium
CI/CD и деплойАвтовыкладка на серверGitHub Actions,

Архитектура веб-приложения:

УровеньЧто делаетГде работаетПримеры технологий
ФронтендОтображает интерфейс, обрабатывает действия пользователяВ браузере пользователяReact, Vue, Angular, Svelte
БэкендЛогика приложения, работа с БД, авторизация, APIНа сервереNode.js, Django, Spring Boot, Laravel, Ruby on Rails
База данныхХранит все данные (пользователей, товары, заказы)На отдельном сервереPostgreSQL, MySQL, MongoDB, Redis

Инструменты для фронтенд-разработки:

ИнструментНазначениеПример использования
ReactБиблиотека для построения интерфейсовСоздание динамических страниц (лента новостей, корзина)
VueПрогрессивный фреймворкПроще, чем React, для небольших проектов
AngularПолноценный фреймворк от GoogleКрупные корпоративные приложения
SvelteСовременный фреймворк без виртуального DOMВысокая производительность
WebpackСборщик модулейОбъединяет все файлы в один бандл
ViteБыстрый сборщик для современных проектовЗамена Webpack в новых проектах
Chrome DevToolsОтладка прямо в браузереПросмотр HTML, CSS, сети, консоли

Инструменты для бэкенд-разработки:

ИнструментНазначениеДля каких задач
Node.jsСерверная среда выполненияВысоконагруженные приложения, чаты, API
DjangoПолноценный фреймворкБыстрая разработка, админка из коробки
Spring BootФреймворк на JavaКрупные корпоративные системы
LaravelФреймворк на PHPВеб-сайты, интернет-магазины
ExpressМинималистичный фреймворк для Node.jsREST API, микросервисы
FastAPIСовременный фреймворкВысокопроизводительные API

Инструменты для работы с базами данных:

Тип БДЧто хранитПримерыКогда использовать
Реляционные (SQL)Структурированные данные с жёсткими связямиPostgreSQL, MySQL, OracleФинансы, учёт, заказы
Документные (NoSQL)Свободные документы (JSON)MongoDB, CouchDBКаталоги товаров, логи
Ключ-значениеОчень быстрый доступ по ключуRedis, MemcachedКэширование, сессии
ГрафовыеСвязи между объектамиNeo4j, ArangoDBСоциальные сети, рекомендации

Инструменты для API (обмена данными между фронтендом и бэкендом):

ИнструментНазначениеОсобенность
PostmanТестирование APIОтправка запросов, просмотр ответов
Swagger (OpenAPI)Документация APIИнтерактивная документация с возможностью отправки запросов
GraphQLАльтернатива RESTКлиент сам решает, какие поля ему нужны
REST APIСтандарт для веб-APIИспользует HTTP-методы (GET, POST, PUT, DELETE)

Инструменты для сборки и деплоя (выкладки на сервер):

ИнструментНазначениеЧто делает
DockerКонтейнеризацияУпаковывает приложение со всеми зависимостями
KubernetesОркестрация контейнеровУправляет множеством контейнеров
GitHub ActionsCI/CDАвтоматически собирает и выкладывает приложение
GitLab CICI/CDАналог GitHub Actions, встроен в GitLab
JenkinsCI/CD (классический)Гибкая настройка для сложных проектов
NginxВеб-серверРаздаёт статику, проксирует запросы
ApacheВеб-серверКлассический веб-сервер

Типичный набор инструментов для разных типов веб-приложений:

Тип приложенияФронтендБэкендБаза данных
Простой сайт-визиткаHTML/CSS (без фреймворков)Не нуженНе нужна
Блог или интернет-магазинReact или VueDjango или LaravelPostgreSQL или MySQL
Чат или онлайн-играReact (с WebSocket)Node.jsRedis (для быстрых операций)
Крупная корпоративная системаAngularSpring BootOracle или PostgreSQL
Микросервисная архитектураReact или SvelteNode.js или FastAPIMongoDB (документная)

Этапы разработки веб-приложения (без кода):

ЭтапЧто делаемКакие инструменты
1. ПроектированиеРисуем макеты, схемы БДFigma, Draw.io
2. Разработка фронтендаСоздаём интерфейсReact/Vue, Vite, Chrome DevTools
3. Разработка бэкендаПишем API, подключаем БДDjango/Node.js, Postman
4. ИнтеграцияСвязываем фронтенд с бэкендомSwagger, Postman
5. ТестированиеПроверяем, ищем ошибкиJest (фронт), pytest (бэк), Selenium
6. ДеплойВыкладываем на серверDocker, GitHub Actions, Nginx
7. МониторингСледим за работойGrafana, Prometheus, Sentry




Вопрос 24.

Основные требования к качеству программного обеспечения

Качество ПО — это степень, в которой программа удовлетворяет заявленным требованиям и ожиданиям пользователей. Существуют стандарты качества (ISO 25010, ГОСТ Р ИСО/МЭК 25010-2015), которые выделяют несколько характеристик качества.

Модель качества ПО (по ISO 25010 — 8 характеристик):

ХарактеристикаЧто означаетПример нарушения
Функциональная пригодностьПрограмма делает то, что обещаноКалькулятор неправильно считает
НадёжностьПрограмма не падает, работает стабильноВылетает раз в час
ПроизводительностьРаботает достаточно быстроСтраница грузится 30 секунд
Удобство использования (юзабилити)Пользователю понятно и комфортноКнопка «Купить» находится в неожиданном месте
БезопасностьДанные защищены от несанкционированного доступаПароли хранятся в открытом виде
СопровождаемостьКод легко читать и изменятьЛюбое изменение ломает три других модуля
СовместимостьРаботает с другими системами и в разных окруженияхНе открывается в Safari
ПереносимостьМожно установить на разные ОС и оборудованиеРаботает только на Windows 10

Подробное описание каждой характеристики с подхарактеристиками:

1. Функциональная пригодность:

ПодхарактеристикаЧто значит
ПолнотаВсе заявленные функции реализованы
ПравильностьРезультаты работы верные
УместностьФункции соответствуют потребностям пользователя

2. Надёжность:

ПодхарактеристикаЧто значит
Отсутствие сбоевНе падает при нормальной работе
Устойчивость к ошибкамНе падает при некорректном вводе
ВосстанавливаемостьМожет восстановиться после сбоя
ДоступностьРаботает нужный процент времени (например, 99.9%)

3. Производительность:

ПодхарактеристикаЧто значит
Время откликаБыстро отвечает на действия пользователя
Пропускная способностьОбрабатывает много запросов в секунду
Использование ресурсовНе жрёт всю память и CPU

4. Удобство использования (юзабилити):

ПодхарактеристикаЧто значит
ПонятностьПользователь понимает, что делать
ОбучаемостьЛегко освоить новичку
ЭстетикаПриятный внешний вид
Доступность (инклюзивность)Удобно для людей с ограничениями (экранные дикторы, контрастность)

Примеры требований к качеству (как они выглядят в ТЗ):

ХарактеристикаКонкретное требование
ПроизводительностьВремя загрузки главной страницы — не более 2 секунд
НадёжностьСистема должна быть доступна 99.9% времени (не более 8 часов простоя в год)
БезопасностьПароли должны храниться в зашифрованном виде (bcrypt)
СовместимостьПоддержка последних 2 версий Chrome, Firefox, Safari
Удобство использованияКоличество кликов для оформления заказа — не более 5

Как измеряется качество (метрики):

ХарактеристикаКак измеритьХорошее значение
НадёжностьСреднее время между сбоями (MTBF)> 1000 часов
ПроизводительностьВремя ответа на запрос< 200 мс
БезопасностьКоличество критических уязвимостей0
СопровождаемостьВремя на добавление новой функции< 2 дней
ЮзабилитиПроцент пользователей, выполнивших задание без подсказки> 80%

Что важнее — качество или скорость выхода на рынок?

СитуацияПриоритетПочему
Банковское приложениеКачество (безопасность, надёжность)Ошибка стоит миллионов
Игра или развлекательное приложениеСкорость выходаЛучше выпустить быстро, потом доделать
Медицинское ПОКачествоОшибка может стоить жизни
MVP стартапаСкорость выходаНужно проверить гипотезу минимальными средствами




Вопрос 25.

 Понятие программного обеспечения

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

Три составляющих ПО (по определению):

СоставляющаяЧто входитПример
ПрограммыИсполняемый код (инструкции для компьютера)Файл calc.exe
ДанныеИнформация, с которой работают программыБаза данных клиентов
ДокументацияИнструкции, описание, комментарииРуководство пользователя

Отличие ПО от других видов продуктов:

ХарактеристикаПОФизический продукт (стол)
ИзносНе изнашивается от использованияИзнашивается
КопированиеБесплатно и мгновенноТребует материалов и времени
ОшибкиМожно исправить без замены носителяБракованный стол надо переделывать
РазработкаТребует только умственного трудаТребует материалов и станков

Классификация ПО по назначению (кратко, подробнее в вопросе 26):

ГруппаПримерыНазначение
Системное ПОWindows, Linux, драйверыУправление компьютером
Прикладное ПОWord, Excel, браузеры, игрыРешение задач пользователя
Инструментальное ПОКомпиляторы, IDE, GitСоздание других программ

Свойства ПО как продукта:

СвойствоЧто значит
НематериальностьЕго нельзя потрогать, только результат работы
МасштабируемостьМожно установить на миллион компьютеров без доп. затрат
СложностьСовременное ПО может содержать миллионы строк кода
ОбновляемостьМожно исправлять ошибки и добавлять функции без замены всего продукта
Зависимость от окруженияМожет работать на одном компьютере и не работать на другом

История ПО (очень кратко):

ПериодЧто появилосьПримеры
1940-1950Первые программы на машинном языкеПрограммы для ENIAC
1950-1960Ассемблеры, первые компиляторыFortran, COBOL
1960-1970Операционные системы, базы данныхIBM OS/360
1970-1980Персональные компьютерыMS-DOS, Apple DOS
1980-1990Графический интерфейс, офисные пакетыWindows, Mac OS, Microsoft Office
1990-2000Интернет, веб-браузерыNetscape, Internet Explorer
2000-2010Мобильные приложения, облакаiOS, Android, SaaS
2010-2020AI, блокчейн, контейнеризацияChatGPT, Docker, смарт-контракты

Самые большие программы в истории (по объёму кода):

ПрограммаОценка строк кодаЧто делает
Google (все сервисы)2+ миллиардаПоиск, сервисы
Windows 11~50 миллионовОперационная система
Linux (ядро + окружение)~30 миллионовОперационная система
Android~15 миллионовМобильная ОС
Chrome~10 миллионовБраузер




Вопрос 26.

Классификация программного обеспечения

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

Основная классификация по назначению (три главных класса):

КлассЧто делаетПримерыДля кого
Системное ПОУправляет компьютером, обеспечивает работу других программWindows, Linux, macOS, драйверы, BIOSДля компьютера и других программ
Прикладное ПОРешает конкретные задачи пользователяWord, Excel, 1С, браузеры, игры, PhotoshopДля конечных пользователей
Инструментальное ПОИспользуется для создания других программКомпиляторы, IDE, Git, системы тестированияДля разработчиков

Детальная классификация системного ПО:

ПодклассЧто делаетПримеры
Операционные системыУправляют ресурсами компьютераWindows 11, Ubuntu, macOS, Android, iOS
ДрайверыОбеспечивают работу устройствДрайвер видеокарты, принтера, звуковой карты
УтилитыВыполняют вспомогательные функцииАнтивирусы, дефрагментаторы, архиваторы
Программы резервного копированияДелают бэкапыAcronis, Time Machine, rsync

Детальная классификация прикладного ПО:

ПодклассЧто делаетПримеры
Офисное ПОРабота с документами, таблицами, презентациямиMicrosoft Office, LibreOffice, Google Docs
Графическое ПОСоздание и редактирование изображений, видеоPhotoshop, GIMP, Figma, Premiere
БраузерыПросмотр веб-страницChrome, Firefox, Safari, Edge
Бухгалтерское ПОВедение бухгалтерии, учёта1С, SAP, Oracle EBS
ИгрыРазвлечениеMinecraft, The Witcher, GTA
Образовательное ПООбучениеЭлектронные учебники, тренажёры
Медицинское ПОДиагностика, учёт пациентовМИС (медицинские информационные системы)
Коммуникационное ПОСвязь, общениеZoom, Telegram, Slack, Outlook

Классификация ПО по способу распространения:

ТипЧто значитПримерыПлюсыМинусы
Бесплатное (Freeware)Можно скачать и использовать бесплатноChrome, Skype, TelegramБесплатноМожет содержать рекламу
Открытое (Open Source)Исходный код доступен, можно изменятьLinux, Firefox, GIMPСвобода, безопасностьНужны специалисты
ПроприетарноеИсходный код закрыт, нужно купить лицензиюWindows, Microsoft Office, PhotoshopПоддержка, гарантииДорого
Условно-бесплатное (Shareware)Бесплатно на пробный периодWinRAR, многие игрыМожно попробоватьОграничения по времени
SaaS (Software as a Service)Аренда через браузерGoogle Docs, Figma, SalesforceНе надо устанавливатьНужен интернет
AdwareБесплатно, но показывает рекламуМногие мобильные игрыБесплатноРаздражает реклама

Классификация ПО по архитектуре:

ТипЧто значитПримеры
Локальное (десктопное)Установлено на один компьютерMS Office, Photoshop, игры
Клиент-серверноеРазделено на серверную и клиентскую частиПочта, веб-приложения, 1С (сервер)
Веб-приложениеРаботает через браузерGoogle Docs, Gmail, Trello
МобильноеРаботает на смартфонахInstagram, Uber, приложения банков
ОблачноеРаботает в облаке, данные на серверахGoogle Drive, Dropbox, iCloud
ВстраиваемоеРаботает на устройствах (микроволновки, машины)ПО микроволновки, ЭБУ автомобиля

Классификация ПО по лицензии (юридическая):

Тип лицензииЧто можно делатьПримеры
GPL (General Public License)Можно использовать, изменять, распространятьLinux, Git, WordPress
MIT LicenseОчень свободная, почти без ограниченийReact, Node.js, jQuery
Apache LicenseПохожа на MIT, но с патентными оговоркамиKubernetes, Android
Proprietary (коммерческая)Только использование по лицензииWindows, Office, Photoshop
FreewareБесплатное использование, но код закрытSkype, TeamViewer (бесплатная версия)

Классификация ПО по уровню доступа к исходному коду:

ТипИсходный код виден?Можно изменять?
Open SourceДаДа (с соблюдением лицензии)
Closed Source (проприетарное)НетНет
Source AvailableДа (можно смотреть)Нельзя изменять




Вопрос 27.

Понятие технологии разработки программного обеспечения

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

Три составляющих технологии разработки ПО:

СоставляющаяЧто включаетПримеры
МетодыКак подходить к решению задачАнализ требований, проектирование, тестирование
ИнструментыЧем пользоватьсяIDE, Git, Jira, CI/CD
ПроцессыВ каком порядке что делатьКаскад, Agile, Scrum, Kanban

Классификация технологий разработки ПО:

КлассификацияВидыПримеры
По модели ЖЦКаскадная, итеративная, спиральная, AgileWaterfall, Scrum, Kanban
По подходу к кодированиюСтруктурный, объектно-ориентированный, функциональныйOOP, FP, структурное программирование
По организации командыТрадиционная (иерархия), Agile (самоорганизация), DevOpsScrum-команда, отдел разработки
По автоматизацииРучная, автоматизированная, CI/CDJenkins, GitHub Actions

Сравнение классических и современных технологий:

АспектКлассические технологии (1970-1990)Современные технологии (2000+)
Модель ЖЦКаскадная (Waterfall)Agile (Scrum, Kanban)
ДокументацияОгромная, обязательнаяМинимальная, работающий код важнее
Общение с заказчикомВ начале и в конце проектаПостоянно (каждый спринт)
ТестированиеОтдельный этап в концеПараллельно с разработкой
РелизыРаз в годНесколько раз в день
ИнструментыМало (компилятор + редактор)Много (IDE, Git, CI/CD, Docker)

Основные современные технологии разработки (подходы):

ТехнологияСутьКлючевая идея
Agile (Scrum, Kanban)Гибкая разработка, короткие спринтыАдаптация к изменениям важнее следования плану
DevOpsСовместная работа разработки и эксплуатацииАвтоматизация, CI/CD, мониторинг
TDD (Test-Driven Development)Сначала пишутся тесты, потом кодТесты как спецификация
BDD (Behavior-Driven Development)Тесты на естественном языкеСценарии поведения пользователя
DDD (Domain-Driven Design)Фокус на бизнес-логикуКод отражает модель предметной области
Continuous Integration (CI)Частое слияние кода в общую веткуИнтегрироваться каждый день
Continuous Delivery (CD)Автоматическая выкладка в тестовую средуВсегда готово к релизу
MicroservicesПриложение как набор маленьких сервисовКаждый сервис независим

Жизненный цикл технологии разработки (с точки зрения внедрения):

ЭтапЧто происходитПример для Agile
1. ПоявлениеНовая технология предложенаМанифест Agile (2001)
2. Раннее внедрениеЭнтузиасты пробуютПоявление Scrum
3. ЗрелостьСтандарт индустрииScrum — доминирующая методология
4. ЗакатПоявляется что-то лучшееВозможно, со временем

Как выбрать технологию для проекта (факторы выбора):

ФакторЧто учитыватьКакой выбор
Размер команды1 человек или 100Для маленькой — Agile, для огромной — каскад + Agile
Стабильность требованийМеняются или нетСтабильные → каскад, нестабильные → Agile
БюджетСколько денегМало → Agile (меньше документации), много → можно и каскад
РискиВысокие или низкиеВысокие → спиральная модель
КритичностьОшибка стоит жизни?Да → каскад или спираль (нужна документация)




Вопрос 28.

Основные этапы разработки программного обеспечения

Этапы разработки ПО — это последовательность действий, которые нужно выполнить, чтобы создать программу от идеи до готового продукта. Количество и названия этапов могут различаться в зависимости от модели ЖЦ, но суть одна. Ниже приведены этапы в классическом понимании.

Шесть основных этапов разработки ПО (с результатами):

ЭтапЧто делаемРезультат
1Анализ требованийСобираем и фиксируем, что должна делать программаТехническое задание (ТЗ)
2ПроектированиеПродумываем архитектуру, модули, БД, интерфейсПроектная документация, схемы
3Реализация (кодирование)Пишем код, тесты, интегрируем с БДИсходный код
4ТестированиеПроверяем, что работает правильно, ищем ошибкиОтчёт о тестировании, список багов
5ВнедрениеУстанавливаем у пользователя, обучаемПрограмма в эксплуатации
6СопровождениеИсправляем баги, добавляем функции, адаптируемНовые версии

Детальное описание каждого этапа (что входит):

1. Анализ требований:

ДействиеРезультат
Интервью с заказчикомСписок пожеланий
Анализ конкурентовОтчёт об аналогах
Формулировка функциональных требованийСписок функций
Формулировка нефункциональных требованийТребования к производительности, безопасности
Согласование ТЗПодписанный документ

2. Проектирование:

ДействиеРезультат
Архитектурное проектированиеСхема компонентов
Проектирование БД (ER-диаграмма)Схема таблиц и связей
Проектирование интерфейсаМакеты экранов
Детальное проектирование (классы, модули)Спецификации модулей
Выбор технологийСписок используемого ПО (языки, фреймворки)

3. Реализация (кодирование):

ДействиеРезультат
Написание кодаИсходные файлы
Написание модульных тестовФайлы с тестами
Настройка системы сборкиСкрипты сборки
Интеграция с БД и внешними APIПодключения и настройки
Code reviewПроверенный код

4. Тестирование:

УровеньЧто тестируемКто проводит
МодульноеКаждая функцияРазработчик
ИнтеграционноеМодули вместеРазработчик или тестировщик
СистемноеВся программа целикомТестировщик
Приёмочное (UAT)Соответствие бизнес-задачамЗаказчик

5. Внедрение:

ДействиеРезультат
Установка на серверы или компьютерыПрограмма установлена
Перенос данных из старых системДанные перенесены
Обучение пользователей (вебинары, инструкции)Пользователи обучены
Запуск в «боевую» эксплуатациюПрограмма работает с реальными данными
Настройка мониторингаСистема отслеживания сбоев

6. Сопровождение:

Вид сопровожденияЧто делаем
КорректирующееИсправляем ошибки, найденные после релиза
АдаптивноеАдаптируем под новые ОС, версии БД
СовершенствующееДобавляем новые функции
ПрофилактическоеРефакторим, улучшаем архитектуру без изменения поведения

Как этапы распределены во времени (процент от проекта):

ЭтапКлассический водопадAgile (в сумме по спринтам)
Анализ15%5% (в каждом спринте)
Проектирование20%10% (в каждом спринте)
Кодирование40%50% (в каждом спринте)
Тестирование20%30% (в каждом спринте)
Внедрение5%5% (в конце проекта)




Вопрос 28.

Основные этапы разработки программного обеспечения

Краткая теория: Этапы разработки ПО — это последовательность действий, которые нужно выполнить, чтобы создать программу от идеи до готового продукта. Количество и названия этапов могут различаться в зависимости от модели ЖЦ, но суть одна. Ниже приведены этапы в классическом понимании.

Шесть основных этапов разработки ПО (с результатами):

ЭтапЧто делаемРезультат
1Анализ требованийСобираем и фиксируем, что должна делать программаТехническое задание (ТЗ)
2ПроектированиеПродумываем архитектуру, модули, БД, интерфейсПроектная документация, схемы
3Реализация (кодирование)Пишем код, тесты, интегрируем с БДИсходный код
4ТестированиеПроверяем, что работает правильно, ищем ошибкиОтчёт о тестировании, список багов
5ВнедрениеУстанавливаем у пользователя, обучаемПрограмма в эксплуатации
6СопровождениеИсправляем баги, добавляем функции, адаптируемНовые версии

Детальное описание каждого этапа (что входит):

1. Анализ требований:

ДействиеРезультат
Интервью с заказчикомСписок пожеланий
Анализ конкурентовОтчёт об аналогах
Формулировка функциональных требованийСписок функций
Формулировка нефункциональных требованийТребования к производительности, безопасности
Согласование ТЗПодписанный документ

2. Проектирование:

ДействиеРезультат
Архитектурное проектированиеСхема компонентов
Проектирование БД (ER-диаграмма)Схема таблиц и связей
Проектирование интерфейсаМакеты экранов
Детальное проектирование (классы, модули)Спецификации модулей
Выбор технологийСписок используемого ПО (языки, фреймворки)

3. Реализация (кодирование):

ДействиеРезультат
Написание кодаИсходные файлы
Написание модульных тестовФайлы с тестами
Настройка системы сборкиСкрипты сборки
Интеграция с БД и внешними APIПодключения и настройки
Code reviewПроверенный код

4. Тестирование:

УровеньЧто тестируемКто проводит
МодульноеКаждая функцияРазработчик
ИнтеграционноеМодули вместеРазработчик или тестировщик
СистемноеВся программа целикомТестировщик
Приёмочное (UAT)Соответствие бизнес-задачамЗаказчик

5. Внедрение:

ДействиеРезультат
Установка на серверы или компьютерыПрограмма установлена
Перенос данных из старых системДанные перенесены
Обучение пользователей (вебинары, инструкции)Пользователи обучены
Запуск в «боевую» эксплуатациюПрограмма работает с реальными данными
Настройка мониторингаСистема отслеживания сбоев

6. Сопровождение:

Вид сопровожденияЧто делаем
КорректирующееИсправляем ошибки, найденные после релиза
АдаптивноеАдаптируем под новые ОС, версии БД
СовершенствующееДобавляем новые функции
ПрофилактическоеРефакторим, улучшаем архитектуру без изменения поведения

Как этапы распределены во времени (процент от проекта):

ЭтапКлассический водопадAgile (в сумме по спринтам)
Анализ15%5% (в каждом спринте)
Проектирование20%10% (в каждом спринте)
Кодирование40%50% (в каждом спринте)
Тестирование20%30% (в каждом спринте)
Внедрение5%5% (в конце проекта)




Вопрос 29.

Жизненный цикл программного обеспечения Дубл.

Жизненный цикл ПО (ЖЦПО) — это период времени от момента возникновения идеи создать программу до момента, когда программа полностью прекращает своё использование. Вопрос 6 уже рассматривался, здесь — углубление: процессы ЖЦ по стандарту ISO 12207.

Процессы жизненного цикла ПО (по ISO/IEC 12207):

Стандарт ISO 12207 выделяет несколько групп процессов:

Группа процессовЧто включаетПримеры процессов
Основные процессыНапрямую связаны с созданием и использованием ПОРазработка, эксплуатация, сопровождение
Вспомогательные процессыОбеспечивают качество и управлениеДокументирование, тестирование, верификация
Организационные процессыУправление проектом и инфраструктуройУправление проектом, управление конфигурацией

Основные процессы (детально):

ПроцессЧто делаетВходВыход
ПриобретениеЗаказчик закупает или заказывает ПОПотребности бизнесаКонтракт, ТЗ
ПоставкаИсполнитель передаёт ПО заказчикуГотовое ПОАкт приёмки
РазработкаСоздание ПОТребованияПродукт + документация
ЭксплуатацияИспользование ПО пользователямиПродуктРешённые задачи
СопровождениеПоддержка и модификацияПродукт + запросыНовые версии

Вспомогательные процессы (детально):

ПроцессЧто делает
ДокументированиеЗапись всей информации о продукте и процессах
ВерификацияПроверка, что продукт соответствует требованиям
ВалидацияПроверка, что продукт решает задачи пользователя
Совместный анализОбсуждение результатов с заинтересованными лицами
АудитПроверка соответствия стандартам и планам
Управление проблемамиОбработка ошибок и запросов на изменения

Организационные процессы (детально):

ПроцессЧто делает
Управление проектомПланирование, контроль, управление рисками
Управление конфигурациейУчёт версий компонентов (через Git)
Управление инфраструктуройОбеспечение оборудованием и ПО для разработки
Улучшение процессовАнализ и оптимизация процессов разработки
ОбучениеПовышение квалификации сотрудников

Связь между стандартами ЖЦ:

СтандартГде применяетсяОсобенность
ISO/IEC 12207МеждународныйБазовый стандарт для всех процессов
ГОСТ 34.601-90Россия (информационные системы)Для автоматизированных систем
ГОСТ 19.xxxРоссия (программная документация)Устаревший, но используется в госзаказе
IEEE 1074США, IT-индустрияАдаптирован под реальную практику

Пример ЖЦ для разных типов ПО (повтор с углублением):

Тип ПОРазработкаАктивная эксплуатацияЗатуханиеПолный ЖЦ
Мобильная игра6 месяцев2 года1 год3.5 года
Корпоративная CRM1.5 года8 лет2 года11.5 лет
Операционная система4 года10 лет3 года17 лет
ПО для АЭС7 лет25 лет5 лет37 лет

Что происходит на каждой фазе ЖЦ (таблица расходов):

Фаза% времени% бюджетаОсновные затраты
Анализ и проектирование15%10%Аналитики, архитекторы
Разработка25%20%Разработчики
Тестирование20%15%Тестировщики
Внедрение5%5%DevOps, обучение
Сопровождение35%50%Поддержка, исправление багов




Вопрос 30.

Модели жизненного цикла программного обеспечения Дубл.

Модель ЖЦ — это схема, описывающая порядок выполнения этапов разработки. Основные модели уже были рассмотрены в вопросе 7. Здесь — углублённое сравнение и дополнительные модели.

Сравнение четырёх основных моделей (сводная таблица):

ХарактеристикаКаскаднаяИтеративнаяСпиральнаяAgile
Размер проектаКрупныйКрупный/среднийОчень крупныйСредний/малый
Стабильность требованийАбсолютно стабильныУточняемыеНестабильныеПостоянно меняющиеся
РискиНизкиеСредниеВысокиеСредние
Заказчик видит результатВ самом концеПосле каждой итерацииПосле каждого виткаПосле каждого спринта
Объём документацииОгромныйСреднийБольшойМинимальный
Стоимость измененийОчень высокаяСредняяВысокаяНизкая
Типичная длительность1–5 лет6–24 месяца2–10 лет1–12 месяцев

Дополнительные модели (менее известные, но важные):

МодельСутьКогда применять
V-Model (V-образная)Расширение каскада: на каждый этап разработки приходится этап тестированияТам, где нужна строгая верификация (медицина, авиация)
RAD (Rapid Application Development)Быстрая разработка через прототипыПроекты с жёсткими сроками
Lean DevelopmentМинимизация потерь, делать только нужноеСтартапы с ограниченным бюджетом
Extreme Programming (XP)Экстремальное программирование (парное, TDD, постоянный рефакторинг)Высокорисковые проекты с меняющимися требованиями
DevOps-модельРазработка + эксплуатация как единый процессОблачные сервисы, непрерывный деплой

RAD-модель (схема текстом):

Фаза 1: Планирование требований (совместно с заказчиком)
Фаза 2: Пользовательское проектирование (прототипы, обратная связь)
Фаза 3: Быстрая разработка (итерациями по 2–4 недели)
Фаза 4: Переход (внедрение, обучение)

Extreme Programming (XP) — ключевые практики:

ПрактикаЧто значит
Парное программированиеДва разработчика за одним компьютером
TDD (Test-Driven Development)Сначала тест, потом код
Постоянная интеграция (CI)Слияние несколько раз в день
Коллективное владение кодомЛюбой может менять любой код
РефакторингПостоянное улучшение кода
Заказчик всегда в командеОнлайн или офлайн для вопросов
Короткие итерации1-3 недели

Как выбрать модель (алгоритм для менеджера):

ВопросЕсли ДАЕсли НЕТ
Требования стабильны и понятны?Каскад или V-ModelAgile или спираль
Риски очень высоки (ошибка стоит жизни)?СпиральнаяAgile или каскад
Нужна быстрая реакция на рынок?Agile (Scrum, XP)Каскад
Команда маленькая (до 10 человек)?AgileКаскад или спираль
Проект крупный (более 100 человек)?Каскад (с элементами Agile)Чистый Agile
Нужна полная документация (госзаказ)?Каскад или V-ModelAgile

Тренды в моделях ЖЦ (что популярно сейчас):

ПериодДоминирующая модельПочему
1970-1990КаскаднаяКомпьютеры дорогие, ошибки исправлять долго
1990-2000RAD, итеративнаяПоявление персональных компьютеров
2000-2010Agile (Scrum)Манифест Agile, потребность в гибкости
2010-2020Scrum, Kanban, DevOpsКонтейнеризация, облака, CI/CD
2020-н.в.Agile + DevOps (DevSecOps)Безопасность с самого начала




Вопрос 31.

Понятие требований к программному обеспечению

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

Что такое требование (определение):

АспектЧто значит
ПотребностьПользователю нужно что-то
УсловиеПри определённых обстоятельствах
ВозможностьПрограмма может что-то сделать
СвойствоПрограмма обладает характеристикой

Три уровня требований (по степени детализации):

УровеньНазваниеДля когоПример
ВысокоуровневыеБизнес-требованияТоп-менеджмент«Увеличить продажи через интернет-магазин»
Среднего уровняПользовательские требованияПользователи«Пользователь может добавить товар в корзину»
НизкоуровневыеФункциональные требования (детальные)Разработчики«При нажатии кнопки «Добавить» товар появляется в корзине, а кнопка меняет цвет на зелёный»

Отличие требований от технического задания:

ХарактеристикаТребованияТехническое задание (ТЗ)
Кто пишетАналитик (совместно с заказчиком)Аналитик или разработчик
Для когоДля согласования с заказчикомДля разработчиков
Степень детализацииДостаточная для понимания заказчикомДостаточная для реализации
Содержит ли технические деталиНет (минимум)Да (протоколы, форматы данных)

Основные свойства хороших требований (по стандарту IEEE 830):

СвойствоЧто значитПример нарушения
КорректностьТребование истинно, не противоречит реальности«Программа должна работать на калькуляторе» (на калькуляторе нет ОС)
ОднозначностьТолько одно толкование«Быстрый поиск» (что значит «быстрый»?)
ПолнотаОписаны все ситуацииНет требования про восстановление пароля
НепротиворечивостьТребования не противоречат друг другу«Кнопка должна быть красной и синей одновременно»
АтомарностьОдно требование — одна мысль«Пользователь может войти и купить товар» (это два требования)
ПроверяемостьМожно проверить, выполнено или нет«Интерфейс должен быть красивым» (проверить нельзя)
ПриоритетностьЗадана важностьВсе требования помечены как «обязательные» (без приоритетов)
ОтслеживаемостьМожно связать с исходным источникомНепонятно, кто попросил эту функцию

Пример требования с нарушением и исправлением:

Плохое требованиеПроблемаХорошее требование
«Программа должна работать быстро»Непроверяемо«Время загрузки главной страницы должно быть не более 2 секунд при скорости интернета 10 Мбит/с»
«Система должна быть удобной»Непроверяемо«90% пользователей должны успешно оформить заказ с первой попытки без подсказок»
«Пользователь может войти»Неатомарно«Система должна предоставлять форму входа с полями «Логин» и «Пароль»» + «Система должна проверять логин и пароль на сервере»

Что бывает, когда требования плохие (риски):

ПроблемаПоследствие
Нет требованийРазработчик делает, что хочет; заказчик получает не то
Противоречивые требованияСпоры, переделки, дополнительное время
Неполные требованияВ конце проекта обнаруживаются пропущенные функции
Непроверяемые требованияНепонятно, когда проект можно сдавать
Частые изменения требованийБесконечная разработка, срыв сроков




Вопрос 32.

Виды требований к программному обеспечению

Требования к ПО делятся на две большие группы: функциональные (что программа делает) и нефункциональные (как программа это делает). Это деление — основа любого технического задания.

Схема классификации требований

Требования к ПО
1.Функциональные требования (что делает)
-Пользовательские функции
-Административные функции
-Системные функции (автоматические)
2.Нефункциональные требования (как делает)
-Производительность
-Надёжность
-Безопасность
-Удобство использования (юзабилити)
-Совместимость
-Сопровождаемость
-Переносимость
-Ограничения

Функциональные требования (F — Function):

КатегорияЧто описываетПример
Пользовательские функцииЧто может делать пользователь в системе«Пользователь может зарегистрироваться, указав email и пароль»
Административные функцииЧто может делать администратор«Администратор может заблокировать пользователя»
Системные функцииЧто система делает автоматически«Система отправляет email после регистрации»
Внешние интерфейсыКак система общается с другими«Система импортирует товары из 1С каждую ночь»

Нефункциональные требования (NFR — Non-Functional Requirements):

КатегорияЧто описываетПример
ПроизводительностьСкорость, пропускная способность«Время ответа API — не более 200 мс»
НадёжностьДоступность, восстановление после сбоев«Доступность 99.9% (не более 8 часов простоя в год)»
БезопасностьЗащита данных, аутентификация«Пароли хранятся в зашифрованном виде (bcrypt)»
ЮзабилитиУдобство для пользователя«Количество кликов для заказа — не более 5»
СовместимостьРабота с другими системами, браузерами«Поддержка Chrome, Firefox, Safari последних 2 версий»
СопровождаемостьЛёгкость изменений и добавления функций«Код должен быть покрыт тестами не менее 70%»
ПереносимостьВозможность работы на разных ОС«Работает на Windows, Linux, macOS»
МасштабируемостьСпособность выдерживать рост нагрузки«Система должна поддерживать 1000 одновременных пользователей»
ЛокализацияПоддержка разных языков и культур«Интерфейс на русском и английском»

Сравнение функциональных и нефункциональных требований:

ХарактеристикаФункциональныеНефункциональные
Отвечают на вопрос«Что делает?»«Как делает?»
Можно ли проверить по TDDДа (написать тест)Сложнее (измерять производительность)
Есть ли в пользовательской документацииДа (инструкция)Частично (системные требования)
Кто в основном задаётПользователь, заказчикАрхитектор, технический специалист
Стоимость нарушенияНе работает функцияРаботает, но плохо

Примеры требований для интернет-магазина:

ТипТребование
ФункциональноеПользователь может добавить товар в корзину
ФункциональноеПользователь может удалить товар из корзины
ФункциональноеПользователь может оформить заказ с указанием адреса
НефункциональноеВремя добавления товара в корзину не более 0.5 секунды
НефункциональноеСистема должна обрабатывать 100 одновременных оформлений заказа
НефункциональноеДанные о заказах хранятся не менее 3 лет
НефункциональноеКнопка «Купить» должна быть заметной (размер не менее 40×40 пикселей)

Как приоритизировать требования (методы):

МетодЧто значитПример
MoSCoWMust have (обязательно), Should have (очень желательно), Could have (можно), Won’t have (не сейчас)Обязательно: вход и регистрация; Очень желательно: восстановление пароля
Kano modelБазовые (ожидаемые), Производительность (чем больше, тем лучше), Восхищающие (неожиданные)Базовые: товар можно добавить в корзину; Восхищающие: рекомендации товаров
Стоимость реализацииСколько времени/денег стоит функцияДешёвое и важное — делать в первую очередь
ЗависимостиКакие функции нужны для другихРегистрация нужна для оформления заказа




Вопрос 33.

 Функциональные требования к ПО

Функциональные требования описывают, что именно должна делать программа, какие действия выполнять, какие данные обрабатывать. Это «глаголы» системы — вход, регистрация, поиск, покупка, отчёт.

Что описывают функциональные требования (детализация):

АспектЧто значитПример
Входные данныеЧто получает программа«Форма логина: email и пароль»
Выходные данныеЧто выдает программа«При успешном входе — перенаправление на главную страницу»
ДействияКакие операции выполняет«Проверка пароля на сервере»
Правила бизнес-логикиКакие условия применяются«Скидка 10% при сумме заказа более 1000 рублей»
Граничные случаиЧто при особых условиях«При неверном пароле — сообщение об ошибке»

Типичные функциональные требования для разных систем:

Тип системыТиповые функциональные требования
Сайт / веб-приложениеРегистрация, вход, поиск, фильтрация, корзина, оплата, история заказов
Мобильное приложениеПуш-уведомления, авторизация через соцсети, камера, геолокация
CRM-системаУправление контактами, сделки, задачи, отчёты, импорт/экспорт
ERP-системаУчёт товаров, склад, закупки, продажи, производство, кадры
Бухгалтерская системаПроводки, счета, отчётность, налоги, выгрузка в госорганы
ИграСоздание персонажа, уровни, сохранение, мультиплеер, внутриигровые покупки

Формат записи функциональных требований (шаблон use case):

Элемент use caseЧто значитПример для «Вход в систему»
НазваниеКраткое описание«Аутентификация пользователя»
АкторКто выполняетЗарегистрированный пользователь
ПредусловиеЧто должно быть до началаПользователь не авторизован
Основной сценарийУспешный путь1. Пользователь вводит логин и пароль
2. Система проверяет
3. Система открывает главную страницу
Альтернативный сценарийЧто при ошибке2а. Неверный пароль → сообщение об ошибке
ПостусловиеЧто после успехаПользователь авторизован

Пример функционального требования (полный):

ПолеЗначение
IDFR-012
НазваниеДобавление товара в корзину
ОписаниеАвторизованный пользователь может добавить товар в корзину со страницы товара
Входные данныеID товара, количество (по умолчанию 1)
Выходные данныеСообщение «Товар добавлен», обновлённая корзина
ПредусловиеПользователь авторизован, товар есть в наличии
ПостусловиеВ корзине появился товар с указанным количеством
ИсключенияЕсли товара нет в наличии — сообщение «Товар временно отсутствует»
ПриоритетMust have (обязательно)

Граничные случаи, которые нужно описывать в функциональных требованиях:

Граничный случайПример
Пустые значенияЧто при пустом поле «Имя»?
Максимальные значенияЧто при количестве товара 999999?
Минимальные значенияЧто при количестве товара 0?
Отрицательные значенияЧто при цене -100?
СпецсимволыЧто при имени пользователя <script>?
ДублированиеЧто при попытке добавить товар, который уже в корзине?
Одновременные действияЧто если два пользователя покупают последний товар?

Проверка функциональных требований (контрольные вопросы):

ВопросНазначение
Каждое требование начинается с глагола?Требование описывает действие
Можно ли написать тест на это требование?Проверяемость
Нет ли в одном требовании двух разных действий?Атомарность
Описаны ли граничные случаи?Полнота
Понятно ли пользователю (не техническому)?Понятность




Вопрос 34.

Нефункциональные требования к ПО

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

Основные категории нефункциональных требований (детально):

КатегорияЧто описываетКак измеритьПример
ПроизводительностьСкорость работыВремя отклика, запросов в секундуВремя загрузки страницы < 2 секунд
НадёжностьСтабильность, доступностьПроцент времени работы, MTBFДоступность 99.9%
БезопасностьЗащита данныхУровень шифрования, количество уязвимостейШифрование трафика TLS 1.3
ЮзабилитиУдобство использованияВремя выполнения задачи, ошибки пользователяОформление заказа за < 3 минут
СовместимостьРабота с другими системамиСписок поддерживаемых ОС, браузеровРаботает на Windows 10/11, macOS 12+
СопровождаемостьЛёгкость измененийВремя на добавление новой функцииДобавление поля в форму < 2 часов
ПереносимостьРабота на разных платформахКоличество поддерживаемых платформРаботает на Windows, Linux, macOS
МасштабируемостьРост под нагрузкойКоличество пользователей, данныхПоддержка 10 000 одновременных пользователей
ЭффективностьИспользование ресурсовПамять, CPU, дискЗанимает не более 1 ГБ оперативной памяти
ЛокализацияПоддержка языков и культурКоличество языков, форматы датПоддержка русского, английского

Детализация требований к производительности:

ПоказательЧто значитХорошее значение
Время отклика (response time)Время от запроса до ответа< 200 мс (для API)
Время загрузки страницыПолная загрузка в браузере< 2 секунд
Пропускная способностьЗапросов в секунду1000 RPS
TTFB (Time To First Byte)Время до первого байта< 100 мс
Время запуска приложенияОт клика до готовности< 5 секунд

Детализация требований к надёжности:

ПоказательЧто значитФормула/значение
Доступность (availability)Процент времени, когда система работает99.9% (3 девятки) → 8.76 часа простоя в год
MTBF (Mean Time Between Failures)Среднее время между сбоями> 1000 часов
MTTR (Mean Time To Recovery)Среднее время восстановления после сбоя< 30 минут
Вероятность отказаШанс, что система упадёт< 0.001
RTO (Recovery Time Objective)Целевое время восстановления< 4 часов
RPO (Recovery Point Objective)Максимальный возраст данных, которые можно потерять< 15 минут

Детализация требований к безопасности:

АспектЧто значитПример требования
АутентификацияПроверка личности пользователяДвухфакторная аутентификация для администраторов
АвторизацияПроверка прав доступаПользователь видит только свои заказы
ШифрованиеЗащита данных при передаче и храненииПередача данных только по HTTPS
Хранение паролейПароли в базе данныхХеширование с солью (bcrypt)
Защита от атакПредотвращение взломаЗащита от SQL-инъекций, XSS
АудитЛогирование действийВсе действия администратора логируются
Безопасность сетиЗащита на уровне сетиТолько белые IP-адреса для доступа к админке

Детализация требований к юзабилити (удобству):

АспектЧто значитПример требования
ОбучаемостьКак легко освоить новичку80% пользователей выполняют задачу без подсказок
ЭффективностьКак быстро выполняются задачиОформление заказа занимает не более 3 минут
ЗапоминаемостьКак легко вспомнить после перерываПользователь помнит, где кнопка «Купить» через месяц
ОшибкиКак часто пользователь ошибаетсяНе более 5% ошибок при заполнении формы
УдовлетворённостьНравится ли пользователямОценка не менее 8 из 10 в опросе

Пример полного нефункционального требования:

ПолеЗначение
IDNFR-023
КатегорияПроизводительность
НазваниеВремя поиска товаров
ОписаниеПоиск по каталогу из 100 000 товаров должен занимать не более 1 секунды
Условия измеренияСервер: 4 ядра, 8 ГБ ОЗУ; БД: PostgreSQL с индексами
МетрикаВремя от отправки запроса до получения результата
ПриоритетHigh

Измеримость нефункциональных требований (плохо vs хорошо):

Плохо (непроверяемо)Хорошо (проверяемо)
«Система должна работать быстро»«Время загрузки главной страницы < 2 секунд»
«Система должна быть надёжной»«Доступность 99.9% (не более 8.8 часов простоя в год)»
«Система должна быть безопасной»«Все пароли должны храниться в виде bcrypt-хешей»
«Программа должна быть удобной»«90% пользователей оформляют заказ с первой попытки»




Вопрос 35.

 Методы сбора требований к программному обеспечению

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

Основные методы сбора требований (сравнение):

МетодСутьКогда использоватьПлюсыМинусы
ИнтервьюЛичная беседа с заказчикомНачало проектаГлубокая информацияТрудоёмко
АнкетированиеПисьменные опросыМного пользователейОхват аудиторииПоверхностно
НаблюдениеСмотрим, как работают пользователиДля улучшения существующих процессовРеальное поведениеЗанимает время
Анализ документовИзучаем инструкции, регламентыЕсть существующая документацияОбъективноДокументы могут устареть
Мозговой штурмГрупповое обсуждениеГенерация идейКреативностьМного шума
ПрототипированиеСоздаём демо-версиюНепонятны требованияНаглядностьЗатраты на прототип
Мастерские требованийСовместные сессии с заказчикомСложные, спорные требованияБыстрое согласованиеТребует опытного фасилитатора
Этнографическое исследованиеДолгое наблюдение в среде пользователяДля сложных, критичных системГлубокое пониманиеОчень дорого

Подробное описание каждого метода:

1. Интервью:

АспектЗначение
ФорматОдин на один (аналитик + заинтересованное лицо)
Длительность30–60 минут
ВопросыОткрытые («Что вы делаете?», «Что было бы удобно?»), закрытые («Вам нужно восстановление пароля?»)
РезультатРасшифровка беседы, список требований
Типичный вопрос«Расскажите, как вы сейчас решаете эту задачу? Что вам мешает?»

2. Анкетирование:

АспектЗначение
ФорматПисьменные вопросы (бумага, Google Forms, SurveyMonkey)
АудиторияОт 10 до 10 000 респондентов
ВопросыПреимущественно закрытые (с вариантами ответов)
РезультатСтатистика: сколько процентов хотят ту или иную функцию
Типичный вопрос«Как часто вы используете функцию поиска? (Ежедневно / Раз в неделю / Никогда)»

3. Наблюдение:

АспектЗначение
ФорматАналитик наблюдает за работой пользователя (иногда с записью экрана)
Длительность1–2 часа за пользователем
Что узнаёмРеальные рабочие процессы, неудобства, лайфхаки пользователей
РезультатКарта текущего процесса, список «болей»
Типичное наблюдение«Пользователь копирует данные из Excel вручную, потому что нет функции импорта»

4. Мастерские требований (requirements workshop):

АспектЗначение
УчастникиАналитик (фасилитатор), заказчик, пользователи, разработчик, тестировщик
Длительность2–4 часа (или несколько дней)
ПроцессГрупповая работа: мозговой штурм, голосование, приоритизация
РезультатСогласованный список требований за одну сессию
Когда нуженСпорные требования, много стейкхолдеров

5. Прототипирование:

АспектЗначение
Уровень прототипаНизкая детализация (бумага, каркасы), средняя (Figma без логики), высокая (кликабельный макет)
Что даётЗаказчик может «потрогать» интерфейс и сказать, что не так
РезультатУточнённые требования, исправленные ошибки до разработки
Типичный кейс«А, я думал, кнопка «Купить» будет здесь! А она в другом месте»

Сравнение методов по затратам и эффективности:

МетодЗатраты (время аналитика)ЭффективностьЛучше всего подходит для
ИнтервьюВысокиеВысокаяГлубокое понимание
АнкетированиеНизкиеСредняяМассовый сбор мнений
НаблюдениеОчень высокиеОчень высокаяВыявление реальных проблем
МастерскиеСредниеОчень высокаяБыстрое согласование
ПрототипыВысокиеВысокаяУточнение интерфейсов

Какой метод выбрать (рекомендации):

СитуацияРекомендуемые методы
Новый проект (нет аналогов)Интервью + мастерские + прототипы
Улучшение существующей системыНаблюдение + интервью + анализ документов
Много пользователей (тысячи)Анкетирование + наблюдение (выборочно)
Очень сжатые срокиМастерские + прототипы (быстро)
Распределённая командаАнкетирование + онлайн-интервью




Вопрос 36.

 Анализ требований к программному обеспечению

Анализ требований — это процесс проверки собранных требований на полноту, непротиворечивость и реалистичность. На этом этапе аналитик понимает, что на самом деле нужно заказчику (часто заказчик сам не может это сформулировать).

Задачи анализа требований:

ЗадачаЧто делаемРезультат
Выявление скрытых требованийИщем то, о чём заказчик забыл сказатьПолный список
Разрешение конфликтовСогласовываем противоречивые требованияКомпромисс
ПриоритизацияРаспределяем по важностиСписок с приоритетами
Оценка реализуемостиПроверяем, можно ли сделатьОценка рисков
МоделированиеСоздаём диаграммы, use casesВизуальное представление
ВалидацияПодтверждаем с заказчикомПодписанные требования

Модели, используемые при анализе требований:

Тип моделиЧто показываетИнструментыПример
Use case diagramКто (акторы) и что (use cases) делаетUMLПользователь, Админ, «Войти», «Купить»
Activity diagramПоследовательность действийUMLБлок-схема процесса заказа
State diagramСостояния объектаUMLЗаказ: Новый → Оплачен → Отправлен → Доставлен
Sequence diagramВзаимодействие объектов во времениUMLКак пользователь, сервер и БД обмениваются сообщениями
Domain modelСущности и их связиUML, ER-диаграммыТовар – Склад – Заказ – Пользователь

Этапы анализа требований (процесс):

ЭтапЧто делаемВопросы
1. КлассификацияРазделяем на функциональные и нефункциональныеЭто что или как?
2. Проверка свойствПроверяем каждое требование на корректность, однозначность, проверяемостьМожно ли это проверить?
3. Обнаружение конфликтовИщем противоречия«Красная кнопка» и «Синяя кнопка» — конфликт
4. Оценка реализуемостиМожно ли сделать за бюджет и срокиСлишком дорого → ищем альтернативу
5. ПриоритизацияMust have / Should have / Could have / Won’t haveЧто делаем в первую очередь?
6. ВалидацияПоказываем заказчику, получаем подписьВы это имели в виду?

Типичные проблемы при анализе требований и их решения:

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

Пример анализа конфликтующих требований:

КонфликтАнализРешение
Требование A: Кнопка должна быть краснойТребование B: Кнопка должна быть синейКрасная кнопка — стандарт для опасных действий, синяя — для обычных. Уточнить, что делает кнопка
Требование A: Программа должна работать на Windows 7Требование B: Программа должна использовать технологии, не совместимые с Windows 7Оценить долю пользователей на Windows 7. Если <5% — отказаться от поддержки

Что такое «скрытые требования» (примеры):

Скрытое требованиеКак выявить
Пользователь хочет не просто вход, а чтобы пароль не надо было вводить каждый деньСпросить: «Как часто вы входите в систему? Раздражает ли вас это?»
Пользователь хочет не просто поиск, а умный поиск с подсказкамиПосмотреть, как пользователь сейчас ищет (вбивает много слов, исправляет ошибки)
Заказчик хочет не просто отчёт, а отчёт в Excel, как он привыкСпросить: «В каком формате вы работаете с отчётами?»




Вопрос 37.

Документирование требований

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

Основные документы для требований (сравнение):

ДокументСодержаниеКто пишетДля когоОбъём
ТЗ (Техническое задание)Требования + условия выполнения + срокиАналитик / менеджерЗаказчик, разработчики20–100 страниц
SRS (Software Requirements Specification)Детальные функциональные и нефункциональные требованияАналитикРазработчики, тестировщики50–300 страниц
Пользовательские сценарии (User Stories)Короткие описания функций с точки зрения пользователяАналитик / владелец продуктаКоманда разработки1–3 предложения




Вопрос 38.

Техническое задание на разработку программного продукта

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

Почему ТЗ так важен (три главные причины):

ПричинаОбъяснение
Единое пониманиеЗаказчик и разработчик одинаково представляют результат
Юридическая защитаЕсли заказчик просит то, чего нет в ТЗ — это отдельная работа за доплату
Основа для приёмкиПрограмма принята, если соответствует ТЗ

Типичные ошибки при составлении ТЗ:

ОшибкаПоследствие
ТЗ слишком общее («удобный интерфейс»)Непонятно, когда считать работу выполненной
В ТЗ нет приоритетовРазработчик делает всё, а заказчик говорит «это было неважно»
ТЗ пишут после начала разработкиУже написанный код могут не принять
ТЗ не подписалиПри споре не на что ссылаться

Что должно быть в ТЗ (основные разделы с пояснениями):

РазделЧто содержитПример
Цель разработкиЗачем нужна программа, какие бизнес-проблемы решает«Автоматизация учёта товаров, сокращение ручного труда на 50%»
Функциональные требованияЧто программа должна делать (список функций с деталями)«Пользователь может добавить товар в корзину, указав количество»
Нефункциональные требованияПроизводительность, безопасность, надёжность«Время ответа не более 2 секунд, доступность 99.9%»
Требования к составу документацииКакие документы нужно передать заказчику«Руководство пользователя, руководство администратора»
Условия эксплуатацииКакое оборудование, ОС, сетевое окружение«Windows 10/11, сервер Linux Ubuntu 22.04»
Порядок контроля и приёмкиКак проверяют, кто подписывает, какие тесты проводят«Приёмочное тестирование заказчиком в течение 10 рабочих дней»
Сроки и этапыДорожная карта: когда что должно быть готово«Этап 1 (15.02.2025) — прототип, Этап 2 (15.04.2025) — релиз»
Порядок изменений ТЗКак вносить изменения после подписания«Изменения оформляются дополнительным соглашением»

Пример хорошей формулировки функции в ТЗ:

«Программа должна предоставлять форму авторизации с полями «Логин» (текст, 3–50 символов) и «Пароль» (текст, скрытый ввод, 6–100 символов). При успешном вводе пользователь перенаправляется на главную страницу. При трёх последовательных неудачных попытках учётная запись блокируется на 15 минут с выводом сообщения «Слишком много попыток, попробуйте через 15 минут». Пароль должен передаваться по протоколу HTTPS и храниться в базе данных в зашифрованном виде с использованием bcrypt.»

Почему ТЗ не может быть идеальным (причины):

ПричинаЧто с этим делать
Заказчик не знает, чего хочет, пока не увидит результатИспользовать гибкие методологии (Agile)
Требования меняются в процессе разработкиФиксировать изменения документально
Полное ТЗ занимает слишком много времениДелать ТЗ на первую версию (MVP), потом уточнять

в зашифрованном виде (bcrypt).»





Вопрос 39.

Структура технического задания

Структура ТЗ описана в ГОСТ 19.201-78, но на практике её адаптируют под конкретный проект. Важно не слепое следование стандарту, а полнота и понятность документа. Ниже — типичная структура, которая встречается в большинстве коммерческих ТЗ и проверена практикой.

Стандартная структура ТЗ (8 разделов):

РазделЧто входитЗачем нужен
1. ВведениеНазвание программы, назначение, область примененияЧтобы все понимали, о чём речь
2. Требования к функциональностиСписок функций по модулям (что должно быть реализовано)Основа для разработки и тестирования
3. Требования к надёжностиДоступность, восстановление после сбоевЧтобы программа не падала
4. Требования к производительностиСкорость работы, нагрузкаЧтобы программа работала быстро
5. Требования к безопасностиШифрование, защита данных, аутентификацияЧтобы данные не украли
6. Требования к документацииКакие документы нужно предоставитьЧтобы было чему обучать пользователей
7. Сроки и этапыДорожная карта с датамиЧтобы контролировать выполнение
8. Порядок приёмкиКак проверяют, кто подписываетЧтобы избежать споров при сдаче

Пример раздела «Функциональные требования» (фрагмент):

IDФункцияПриоритетОписание
FR-01РегистрацияMustПользователь может создать аккаунт по email
FR-02Вход в системуMustВход по email и паролю
FR-03Восстановление пароляShouldСброс пароля через email
FR-04Просмотр товаровMustКаталог с поиском и фильтрацией
FR-05Добавление в корзинуMustИз каталога со страницы товара
FR-06Оформление заказаMustАдрес, способ оплаты, подтверждение
FR-07История заказовCouldПросмотр предыдущих заказов

Что означает приоритет (обозначения):

ОбозначениеЧто значитПример
Must haveБез этого система не имеет смыслаАвторизация, добавление товара в корзину
Should haveОчень важно, но можно отложитьВосстановление пароля
Could haveПриятно, но не критичноРекомендации товаров
Won’t haveНе делаем в этой версии (в следующей)Интеграция с 1С

Пример раздела «Нефункциональные требования» (фрагмент):

IDКатегорияТребование
NFR-01ПроизводительностьВремя загрузки главной страницы не более 2 секунд
NFR-02ПроизводительностьПоиск по каталогу из 100 000 товаров не более 1 секунды
NFR-03НадёжностьДоступность 99.9% (не более 8.8 часов простоя в год)
NFR-04БезопасностьПароли хранить в зашифрованном виде (bcrypt)
NFR-05СовместимостьПоддержка Chrome, Firefox, Safari последних 2 версий

Кто подписывает ТЗ и зачем:

ПодписьКтоЧто подтверждает
От заказчикаРуководитель проекта или директорСогласен с требованиями
От исполнителяРуководитель разработкиБерется выполнить за указанные сроки и бюджет
СогласующиеЮрист, главный инженер (в крупных проектах)Документ не противоречит законам и нормативам




Вопрос 40.

 Назначение спецификации требований

Спецификация требований (SRS — Software Requirements Specification) — это детальный технический документ, который описывает все требования к ПО на уровне, достаточном для разработки и тестирования. В отличие от ТЗ, SRS более техническая и содержит меньше коммерческих условий (сроки, бюджет). SRS — это «инструкция для разработчиков».

Основное отличие SRS от ТЗ:

ХарактеристикаТехническое задание (ТЗ)Спецификация требований (SRS)
Основное назначениеЮридическая основа контрактаТехническая основа для разработки
Содержит сроки и бюджетДаНет
Содержит детальные use casesНе всегдаДа, обязательно
Содержит модели (диаграммы)РедкоДа, часто
Для кого пишутЗаказчик, менеджер, разработчикиРазработчики, тестировщики
Длина10–50 страниц50–300 страниц

Что входит в SRS (по стандарту IEEE 830):

РазделСодержаниеПример
ВведениеЦель документа, область действия, термины, ссылки«Документ описывает требования к системе учёта товаров»
Общее описаниеКонтекст системы, пользовательские характеристики, ограничения, допущения«Предполагается, что пользователи имеют базовые навыки работы с ПК»
Функциональные требованияДетальное описание каждой функции: входные данные, выходные, исключения, предусловия, постусловияТаблица с FR-01, FR-02…
Нефункциональные требованияПроизводительность, безопасность, надёжность, юзабилити, совместимостьТаблица с NFR-01, NFR-02…
Внешние интерфейсыПользовательский интерфейс, API, аппаратные интерфейсы«API соответствует OpenAPI 3.0»
Модели и диаграммыUse case diagram, ER-диаграммы, диаграммы состояний, диаграммы последовательности(вставка рисунка)
ПриложенияГлоссарий, справочные материалы, примеры«Глоссарий из 30 терминов»

Пример фрагмента SRS для функции «Вход» (детализация):

ПолеЗначение
IDFR-001
НазваниеАутентификация пользователя
ОписаниеПользователь может войти в систему, указав логин и пароль
Входные данныеЛогин: строка, 3–50 символов, допустимые символы: латиница, цифры, @, ., -, _ . Пароль: строка, 6–100 символов, любые символы
Выходные данныеПри успехе: сессионный токен (UUID), перенаправление на /dashboard. При ошибке: сообщение «Неверный логин или пароль»
ПредусловиеПользователь не авторизован, учётная запись существует и не заблокирована
ПостусловиеПользователь авторизован, сессия создана
Исключения1) Неверный логин → ошибка. 2) Неверный пароль → ошибка. 3) 3 неудачных попытки → блокировка на 15 минут. 4) Блокированная учётная запись → ошибка «Аккаунт заблокирован»
ПриоритетMust have

Почему SRS важна для разработки:

ПричинаОбъяснение
Разработчики знают, что делатьНет двусмысленностей
Тестировщики знают, что проверятьКаждое требование можно превратить в тест
Оценка сроков становится точнееПо детальным требованиям проще оценить трудоёмкость
Меньше споров при приёмкеВсё чётко описано




Вопрос 41.

Проектирование программного обеспечения

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

Два уровня проектирования (детализация):

УровеньЧто делаемРезультатКто делаетЗачем
Высокоуровневое (архитектурное)Выбираем общую структуру: клиент-сервер, микросервисы, слои. Определяем компоненты и их связиАрхитектурная схема, выбор технологического стекаАрхитекторЧтобы не переделывать всё потом
Низкоуровневое (детальное)Проектируем классы, функции, схемы БД, конкретные алгоритмы, протоколы взаимодействияДетальные спецификации, UML-диаграммы классов, ER-диаграммыВедущий разработчикЧтобы программисты писали одинаково

Что даёт проектирование (преимущества):

ПреимуществоОбъяснениеБез проектирования
Понятная структураВсе модули чётко определеныХаотичный код, где всё связано со всем
Распараллеливание работыРазные модули делают разные людиЖдут друг друга
Лёгкое тестированиеКаждый модуль тестируется отдельноТестировать можно только всю программу целиком
Возможность заменыМожно заменить один модуль на другойЛюбое изменение ломает всё
Документация для новичковСхемы помогают понять системуНовичок читает код месяцами

Основные артефакты проектирования (что должно получиться):

АртефактЧто показываетПример
Архитектурная схемаКрупные блоки и их связи (прямоугольники и стрелки)Фронтенд ↔ Бэкенд ↔ БД
UML-диаграмма классовКлассы, их поля, методы и связи между нимиКласс User: поля name, email; методы register(), login()
UML-диаграмма последовательностиПорядок взаимодействия объектов во времени (кто кому что посылает)Пользователь → Контроллер → Сервис → БД
Диаграмма состоянийСостояния одного объекта и переходы между нимиЗаказ: Новый → Оплачен → Отправлен → Доставлен
ER-диаграмма БДТаблицы, поля (атрибуты), первичные и внешние ключи, связиТаблица Users связана с Orders по user_id
Макет интерфейсаКак выглядит экран, где расположены кнопки, поля, менюFigma с прототипом экрана входа
Спецификация APIКакие эндпоинты, какие параметры, какие ответы, коды ошибокPOST /login принимает {email, password}, возвращает {token}

Когда проектирование особенно важно (а когда можно пропустить):

СитуацияНужно ли проектированиеПочему
Проект на 1000 строк кода (один разработчик)Минимальное (набросок на салфетке)Проще написать и переделать
Проект на 100 000 строк (команда 10 человек)Обязательно детальноеБез схем люди запутаются
Проект на 1 млн строк (команда 100 человек)Очень детальное, с документациейИначе хаос
Прототип для проверки идеи (MVP)МинимальноеВсё равно переделают
Критичная система (банк, медицина)Обязательно, с верификациейОшибки дорого стоят




Вопрос 42.

Основные принципы проектирования ПО

Принципы проектирования — это проверенные практикой правила, которые помогают создавать код, который легко читать, изменять и тестировать. Самые известные принципы — SOLID (для объектно-ориентированного проектирования) и несколько общих (DRY, KISS, YAGNI).

Принципы SOLID (пять принципов для ООП):

ПринципНазваниеСмысл простыми словамиПример нарушения
SSingle ResponsibilityУ класса должна быть одна причина для изменения (одна обязанность)Класс «Отчёт» и считает данные, и рисует графики, и отправляет email
OOpen-ClosedКласс открыт для расширения, но закрыт для измененияЧтобы добавить новый тип отчёта, приходится менять код существующего
LLiskov SubstitutionДочерний класс должен заменять родительский без сбоевПодкласс «Квадрат» от «Прямоугольник» ломает логику (несоразмерное изменение)
IInterface SegregationНе заставляй класс реализовывать то, что ему не нужноИнтерфейс «Работник» заставляет повара уметь программировать
DDependency InversionЗависеть от абстракций (интерфейсов), а не от конкретных классовКласс «Уведомление» привязан напрямую к классу «Email», а не к интерфейсу «Отправитель»

Пример нарушения Single Responsibility (было и стало):

Было (плохо)Стало (хорошо)
Один класс отвечает и за расчёт цены, и за сохранение в БД, и за отправку emailОтдельный класс для расчёта цены, отдельный — для работы с БД, отдельный — для email
При изменении email надо править класс с расчётом ценыКаждый класс меняется только по своей причине

Другие важные принципы проектирования (не из SOLID):

ПринципНазваниеСмыслПример нарушения
DRYDon’t Repeat YourselfНе повторяй один и тот же код в двух местахОдин и тот же алгоритм расчёта скидки написан в трёх разных местах
KISSKeep It Simple, StupidПростое решение лучше сложногоВместо сложной архитектуры с десятью классами достаточно одной функции
YAGNIYou Aren’t Gonna Need ItНе делай того, что может не понадобитьсяСделали систему кэширования, а она никогда не использовалась
Least AstonishmentПринцип наименьшего удивленияПользователь (или программист) не должен удивляться поведениюФункция add_to_cart не добавляет товар в корзину, а удаляет — это неожиданно

Что даёт соблюдение принципов проектирования:

ХарактеристикаЧто значитПочему хорошо
Низкое сцепление (loose coupling)Модули мало зависят друг от другаМодуль можно изменить, не ломая другие
Высокая связность (high cohesion)Внутри модуля всё связано по смыслуМодуль легко понять и тестировать
Лёгкая тестируемостьКаждый класс можно проверить отдельноЛегче находить ошибки
Лёгкая сопровождаемостьНовый разработчик быстро понимает кодМеньше времени на доработки

Антипаттерны (чего делать не надо):

АнтипаттернЧто этоПример
Божественный объектОдин класс знает и делает всёКласс «Application» на 10 000 строк
Спагетти-кодКод, в котором всё связано со всемОдна функция вызывает другую, та — третью, и так по кругу
Золотой молотокОдно и то же решение для всех задачВезде использовать микросервисы, даже для калькулятора




Вопрос 43.

Архитектура программного обеспечения

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

Что определяет архитектура (четыре ключевых аспекта):

АспектЧто решаетПример
Разделение на компонентыИз каких крупных частей состоит системаФронтенд (интерфейс), бэкенд (логика), база данных (хранение)
Связи между компонентамиКак компоненты общаются друг с другомПо HTTP API, через очереди сообщений, через общую базу данных
Место размещенияГде работает каждый компонентВ браузере пользователя, на сервере в облаке, на сервере БД
Технологический стекКакие технологии использовать для каждого компонентаReact + Python + PostgreSQL

Зачем нужна архитектура (пять главных причин):

ПричинаОбъяснениеБез архитектуры
Управление сложностьюРазбиваем большую систему на понятные частиОгромный непонятный монолит
МасштабированиеЗнаем, что нужно увеличивать при росте нагрузкиДобавили серверов — не помогло
ПереиспользованиеКомпоненты можно использовать в других проектахКаждый раз пишем заново
Распределение работыРазные команды делают разные компонентыВсе ждут один компонент
Устойчивость к изменениямИзменение в одном компоненте не ломает другиеПочинил одно — сломал другое

Ключевые понятия в архитектуре (обязательные к пониманию):

ПонятиеЧто значитПример
КомпонентКрупная часть системы, имеющая своё назначениеМодуль авторизации, модуль оплаты
ИнтерфейсСпособ взаимодействия компонентов (контракт)REST API, очередь сообщений
ЗависимостьЕсли компонент А не может работать без компонента БФронтенд без бэкенда не работает
АбстракцияСкрытие сложности за простым интерфейсомПользователь не знает, как работает база данных
Архитектурное решениеВыбор, который трудно изменить потомВыбрали базу данных PostgreSQL — менять сложно

Кто отвечает за архитектуру в проекте:

РольЧто делаетКогда нужна
АрхитекторПринимает ключевые архитектурные решения, выбирает стиль и технологииВ крупных проектах (10+ разработчиков)
Ведущий разработчик (Team Lead)Детализирует архитектуру до уровня модулейВ средних проектах (3–10 разработчиков)
Вся командаОбсуждает и согласовывает архитектуру (архитектурный комитет)В больших проектах (50+ разработчиков)




Вопрос 44.

Виды архитектуры программного обеспечения

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

Основные архитектурные стили (подробное сравнение):

АрхитектураСутьПлюсыМинусыКогда применять
МонолитнаяВся программа в одном развёртываемом файле (одно приложение)Простота разработки, один язык, легко тестироватьТрудно масштабировать, одно обновление — перезапуск всегоМаленькие проекты, стартапы, прототипы
Клиент-сервернаяКлиент (интерфейс) и сервер (данные и логика) разделены по сетиРазделение ответственности, централизованные данныеСеть как узкое место, сложность отладкиВеб-приложения, почтовые системы
Многоуровневая (n-tier)Несколько слоёв (презентация, бизнес-логика, данные, интеграция)Чёткое разделение, можно заменять слоиКаждый запрос проходит через все слои — медленнееКорпоративные системы (CRM, ERP)
МикросервиснаяДесятки маленьких независимых сервисов, каждый со своей БДМасштабируемость, независимые релизы, разные технологииСложность управления, распределённые транзакцииКрупные проекты (Netflix, Amazon, Uber)
Событийно-ориентированнаяКомпоненты реагируют на события (слабая связанность)Легко добавлять новые обработчики, хороша для асинхронных системТрудно отлаживать, сложно гарантировать порядокСистемы реального времени, IoT
Шина данныхВсе модули общаются через центральную шину (промежуточное ПО)Простое добавление новых модулейЕдиная точка отказа (сама шина)Интеграция разных систем, корпоративные сервисные шины

Простое объяснение каждого стиля (для новичков):

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

Дополнительные архитектурные стили (менее распространённые, но важные):

СтильСутьКогда использовать
Плагинная (микроядро)Ядро системы минимально, все функции — подключаемые модулиIDE (VS Code), браузеры (расширения)
Потоковая (pipe-and-filter)Данные проходят через цепочку обработчиков (фильтров)Компиляторы, ETL-процессы
P2P (Peer-to-Peer)Нет выделенного сервера, все узлы равныТорренты, блокчейн
Бессерверная (Serverless)Код выполняется на облачных функциях без управления серверамиLambda-функции AWS, событийно-ориентированные приложения

Как выбрать архитектуру (алгоритм для принятия решения):

ВопросОтветРекомендованная архитектура
Проект маленький (до 10 000 строк кода)?Да Монолит
Проект будет расти и меняться 2+ года?Да Не монолит
Команда большая (50+ человек)?Да Микросервисы
Нужна реакция на события в реальном времени (интерактив)?Да Событийно-ориентированная
Система должна работать без остановки (24/7)?Да Микросервисы (обновление частями)
Есть жёсткие требования к консистентности данных (банк)?Да Монолит или многоуровневая




Вопрос 45.

Модульная архитектура программного обеспечения

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

Что такое модуль (четыре ключевых свойства):

СвойствоЧто значитПример
Функциональная законченностьМодуль делает что-то одно, законченноеМодуль «Авторизация» только отвечает за вход и регистрацию
Скрытие внутренностей (инкапсуляция)Другие модули не знают, как он работает внутриМодуль «Платежи» скрывает внутреннюю логику расчётов
Чёткий интерфейсЕсть понятный способ взаимодействия (входы и выходы)Модуль имеет функцию pay(amount) и не имеет других точек входа
НезависимостьМодуль можно разрабатывать и тестировать отдельноМодуль «Отчёты» не зависит от модуля «Авторизация»

Пример разбиения интернет-магазина на модули:

МодульЗа что отвечаетИнтерфейс (как с ним работать)
Модуль авторизацииВход, регистрация, восстановление пароляlogin()register()resetPassword()
Модуль каталогаОтображение товаров, поиск, фильтрацияgetProducts()search()filter()
Модуль корзиныДобавление, удаление, изменение количестваadd()remove()updateQuantity()
Модуль заказовОформление, история, статусыcheckout()getHistory()getStatus()
Модуль оплатыИнтеграция с платёжными системамиpay()refund()
Модуль уведомленийEmail, push, SMS-уведомленияsendEmail()sendPush()

Преимущества модульной архитектуры (почему это хорошо):

ПреимуществоОбъяснениеПример из жизни
Параллельная разработкаРазные модули могут делать разные люди одновременноОдна команда делает корзину, другая — оплату
Тестирование по отдельностиМожно протестировать модуль без всей системыТестируем модуль оплаты, не трогая каталог
ПереиспользованиеМодуль авторизации можно взять в другой проектТот же модуль входа для магазина и форума
ЗаменаМожно заменить модуль оплаты на другой (сменили провайдера)Была оплата через Qiwi, стала через ЮKassa
Изоляция ошибокОшибка в одном модуле не ломает всю системуУпал модуль «Рекомендации», но покупки работают
ПонятностьНовый разработчик изучает один модуль, не всю системуНовичок сразу берёт модуль «Каталог»

Два важных понятия: связность (cohesion) и сцепление (coupling):

ПонятиеЧто значитХорошоПлохо
Связность (внутри модуля)Как тесно связаны элементы внутри одного модуляВысокая связность




Вопрос 46.

Связность и сцепление программных модулей

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

Связность (Cohesion) — что внутри модуля

Связность показывает, насколько сильно элементы внутри одного модуля связаны друг с другом по смыслу. Чем выше связность, тем лучше. Идеальный модуль делает одну вещь и делает её хорошо.

Шкала связности (от плохой к хорошей):

УровеньНазваниеЧто значитПример
1 (худший)Случайная связностьВ модуле собраны совершенно не связанные вещиМодуль «Утилиты» содержит и вычисление налогов, и форматирование дат, и отправку email
2Логическая связностьЭлементы связаны логически (все операции ввода/вывода), но внутри разныеМодуль «Ввод-вывод» содержит и чтение файлов, и запись в БД, и печать на принтер
3Временная связностьЭлементы выполняются в одно время (инициализация)Модуль «Загрузка системы» открывает соединения с БД, загружает конфиги, инициализирует кэш
4Процедурная связностьЭлементы связаны порядком выполнения (сначала А, потом Б, потом В)Модуль «Обработка заказа»: проверить товар → зарезервировать → списать деньги
5Коммуникационная связностьЭлементы работают с одними и теми же даннымиМодуль «Работа с клиентом»: добавить клиента, удалить клиента, найти клиента
6Последовательная связностьВыход одного элемента — вход для другогоМодуль «Компилятор»: лексический анализ → синтаксический анализ → генерация кода
7 (лучший)Функциональная связностьМодуль делает ровно одну законченную функциюМодуль «Расчёт НДС»: принимает сумму, возвращает сумму с НДС

Пример хорошей и плохой связности:

Плохо (низкая связность)Хорошо (высокая связность)
Модуль «Магазин»: и авторизация, и каталог, и корзина, и оплата, и отчёты, и логиМодуль «Авторизация» — только авторизация
Изменение в одном месте ломает всёМодуль «Каталог» — только каталог
5000 строк кода в одном файлеМодуль «Корзина» — только корзина

Сцепление (Coupling) — между модулями

Сцепление показывает, насколько сильно один модуль зависит от другого. Чем ниже сцепление, тем лучше. Идеальный модуль можно заменить, не трогая другие модули.

Шкала сцепления (от хорошего к плохому):

УровеньНазваниеЧто значитПример
1 (лучший)Сцепление по даннымМодули обмениваются только простыми данными (числа, строки) через параметрыМодуль «Расчёт цены» получает price и quantity, возвращает total
2Сцепление по образцамМодули обмениваются структурами данных (объектами), но не их внутренним устройствомПередаём объект «Заказ» целиком, но не лезем внутрь
3Сцепление по управлениюМодуль передаёт другому флаг, который меняет его поведениеprocess(order, is_express=true) — флаг управляет логикой
4Сцепление по внешним ссылкамМодули используют одни и те же глобальные переменныеОба модуля читают и пишут global_config
5Сцепление по общей информацииМодули работают с одной и той же областью памяти или файломОба модуля пишут в один и тот же лог-файл
6Сцепление по управляющим структурамОдин модуль передаёт другому управление (goto, longjmp)Модуль А прыгает внутрь модуля Б
7 (худший)Сцепление по содержимомуМодуль напрямую обращается к внутренностям другого модуляМодуль А меняет private-переменную модуля Б

Как связаны связность и сцепление

ХарактеристикаХорошая архитектураПлохая архитектура
СвязностьВысокая (функциональная)Низкая (случайная)
СцеплениеНизкое (по данным)Высокое (по содержимому)
ИтогЛегко менять, тестировать, пониматьСложно менять, любое изменение ломает всё

Пример для понимания (калькулятор):

МодульКак сделаноСвязностьСцепление
ХорошоМодуль «Сложение»: только складывает два числаФункциональная (отлично)По данным (принимает два числа, возвращает сумму)
ПлохоМодуль «Вычисления»: и сложение, и вычитание, и умножение, и логированиеЛогическая (плохо)По общей информации (пишут в один лог-файл)


Вопрос 47.

Декомпозиция программной системы

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

Зачем нужна декомпозиция

ПричинаОбъяснение
Упрощение пониманияМаленький модуль понять легче, чем огромную систему
Разделение работыРазные люди могут делать разные модули параллельно
Повторное использованиеОдин модуль можно использовать в нескольких проектах
Изоляция измененийИзменяя один модуль, не нужно трогать другие
Независимое тестированиеКаждый модуль тестируется отдельно

Виды декомпозиции

Вид декомпозицииЧто разбиваемНа что разбиваемПример
ФункциональнаяФункции программыПодфункции (по действиям)Авторизация → Проверка логина → Проверка пароля → Выдача токена
ДанныхДанные, которые хранит программаТипы данных, сущностиПользователь → Имя, Email, Пароль, Адрес
ПроцесснаяПроцессы обработкиЭтапы процессаОбработка заказа → Проверка → Оплата → Отгрузка
СобытийнаяРеакция на событияОбработчики событийНажатие кнопки → Обработчик клика
ПространственнаяФизическое размещениеСерверы, клиентыБэкенд (сервер), Фронтенд (браузер), БД (отдельный сервер)

Пример декомпозиции интернет-магазина

Уровень 1 (система): Интернет-магазин

Уровень 2 (подсистемы):

Уровень 3 (модули бэкенда):

Уровень 4 (функции модуля каталога):

Принципы хорошей декомпозиции

ПринципЧто значитНарушение
Один уровень абстракцииВсе элементы одного уровня должны быть примерно одинаковой детализацииСмешали «показать товар» и «переместить байт в регистр»
ОртогональностьМодули не должны пересекаться по функциямДва модуля оба умеют отправлять email
ЗавершённостьВсе функции системы охвачены модулямиЕсть функция, которая не попала ни в один модуль
Минимизация интерфейсовМодули должны общаться через минимум параметровМодуль требует 10 параметров для работы

Ошибки при декомпозиции

ОшибкаЧто значитПример
Недостаточная декомпозицияМодули слишком большиеОдин модуль «Всё» на 50 000 строк
Избыточная декомпозицияСлишком много мелких модулейКаждая функция — отдельный модуль
Неверное разделениеФункции, которые часто меняются вместе, разнесены по разным модулямКнопка «Купить» и логика покупки в разных модулях
Циклические зависимостиМодуль А зависит от Б, Б от АА → Б → А (замкнутый круг)


Вопрос 48.

Алгоритмизация в разработке программного обеспечения

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

Что такое алгоритм (определение)

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

Пример алгоритма «Как сварить яйцо всмятку»:

  1. Взять яйцо
  2. Поставить кастрюлю с водой на огонь
  3. Дождаться кипения воды
  4. Опустить яйцо в кипящую воду
  5. Варить 3 минуты
  6. Вынуть яйцо
  7. Положить в холодную воду на 1 минуту

Свойства алгоритма (6 свойств)

СвойствоЧто значитПример нарушения
ДискретностьАлгоритм разбит на отдельные шаги«Сделай всё быстро» — не дискретно
ДетерминированностьКаждый шаг понятен и недвусмыслен«Добавь немного соли» — не детерминировано
КонечностьАлгоритм заканчивается за конечное число шаговБесконечный цикл — нарушение
РезультативностьАлгоритм даёт правильный результатАлгоритм не решает задачу
МассовостьАлгоритм работает для всех допустимых входных данныхРаботает только для числа 5, а для 6 — нет
ПонятностьАлгоритм можно понять и выполнитьНаписан на неизвестном языке

Пример алгоритма с нарушением свойства

ШагПлохой алгоритмХороший алгоритм
1Обработать данные как-нибудь (не детерминированно)Считать число X из файла input.txt
2Если X больше примерно 5… (не дискретно)Если X > 5, то перейти к шагу 3
3Сделать что-то умное (не понятно)Y = X * 2
4И так пока не надоест (бесконечно)Повторить шаги 2-4, пока X < 100
5Написать результат (не массово)Записать Y в файл output.txt


Вопрос 49.

Способы записи алгоритмов

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

Основные способы записи алгоритмов

СпособКак выглядитДля когоПример
Словесный (естественный язык)Текст на русском или английскомДля человека«Взять два числа, сложить их, результат вывести»
Графический (блок-схема)Геометрические фигуры со стрелкамиДля человекаПрямоугольники, ромбы, стрелки
ПсевдокодСмесь естественного языка и конструкций программированияДля человека и программистаif x > 0 then print(x) else print(-x)
ФормульныйМатематические формулыДля математиковy = a * x + b
Программа на языке программированияКод на Python, C++, JavaДля компьютераprint(a + b)

Пример одного алгоритма разными способами

Задача: Найти максимальное из двух чисел.

Словесный способ:

  1. Ввести два числа A и B
  2. Если A больше B, то результатом будет A
  3. Иначе результатом будет B
  4. Вывести результат

Псевдокод:

text

ВВЕСТИ A, B
ЕСЛИ A > B ТО
    РЕЗУЛЬТАТ = A
ИНАЧЕ
    РЕЗУЛЬТАТ = B
ВЫВЕСТИ РЕЗУЛЬТАТ

Программа на Python:

python

a = int(input())
b = int(input())
if a > b:
    result = a
else:
    result = b
print(result)

Сравнение способов записи

ХарактеристикаСловесныйБлок-схемаПсевдокодПрограмма
Понятен неспециалистуДаДа (с объяснением)СреднеНет
Можно выполнить на компьютереНетНет (без специальных средств)НетДа
ТочностьНизкаяВысокаяВысокаяАбсолютная
ТрудоёмкостьНизкаяСредняяСредняяВысокая
Используется в документацииДа (редко)Да (часто)Да (иногда)Да (в коде)


Вопрос 50.

Блок-схемы алгоритмов

Блок-схема — это графическое представление алгоритма с использованием геометрических фигур (блоков), соединённых стрелками. Это один из самых наглядных способов представления алгоритмов, особенно для обучения и документации. Стандарт блок-схем описан в ГОСТ 19.701-90.

Основные элементы блок-схем

ФигураНазваниеЧто обозначаетПример
ОвалТерминатор (начало/конец)Начало или конец алгоритмаНачало, Конец
ПрямоугольникПроцесс (действие)Выполнение операцииx = a + b
РомбРешение (условие)Ветвление (да/нет)x > 0 ?
ПараллелограммВвод/выводВвод данных или вывод результатаВвод a, Вывод s
ШестиугольникПредопределённый процессВызов подпрограммыВызов сортировки
СоединительПереход на другую страницуТочка соединения (если схема не влезает)A1
СтрелкаЛиния потокаНаправление выполнения→, ↓, ←, ↑

Примеры блок-схем

Пример 1 — линейный алгоритм:

    [Начало]
        ↓
    [Ввод a, b]
        ↓
    [c = a + b]
        ↓
    [Вывод c]
        ↓
     [Конец]

Пример 2 — разветвляющийся (нахождение модуля числа):

     [Начало]
         ↓
     [Ввод x]
         ↓
      ◇ x >= 0 ?
        /     \
       Да      Нет
       ↓        ↓
    [y = x]  [y = -x]
       └───┬───┘
           ↓
     [Вывод y]
           ↓
        [Конец]

Пример 3 — цикл (сумма чисел от 1 до N):

        [Начало]
            ↓
        [Ввод N]
            ↓
        [s = 0, i = 1]
            ↓
           ◇ i <= N ?
           /     \
          Да      Нет
           ↓       ↓
      [s = s + i]  ↓
           ↓       ↓
        [i = i+1]  ↓
           ↓       ↓
           └───────┘
                ↓
          [Вывод s]
                ↓
            [Конец]

Правила построения блок-схем

ПравилоЧто значит
Линии только сверху вниз и слева направоОсновное направление — сверху вниз, слева направо
Стрелки не пересекаютсяПо возможности избегать пересечений
Один вход и один выходУ каждого блока (кроме начала и конца)
Подписи внутри фигурЧто именно делает блок
Точки соединения при разрывеЕсли схема не влезает на один лист


Вопрос 51.

Линейные алгоритмы

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

Характеристики линейного алгоритма:

ХарактеристикаЧто значит
ПоследовательностьШаги выполняются строго друг за другом
ОднократностьКаждый шаг выполняется один раз
Отсутствие ветвленийНет условий (если… то…)
Отсутствие цикловНет повторяющихся действий
ПростотаСамый простой для понимания вид

Пример линейного алгоритма (расчёт площади прямоугольника):

  1. Ввести длину стороны A
  2. Ввести длину стороны B
  3. Вычислить площадь: S = A × B
  4. Вывести значение S

Здесь нет условий («если сторона больше нуля») и нет повторений. Каждый шаг — один раз.

Примеры задач, решаемых линейными алгоритмами:

ЗадачаДействия
Сложение двух чиселВвод A → Ввод B → C = A + B → Вывод C
Перевод из метров в сантиметрыВвод M → C = M × 100 → Вывод C
Расчёт скоростиВвод S (расстояние) → Ввод T (время) → V = S / T → Вывод V
Конвертация валютыВвод рублей → Курс = 0.01 → Доллары = Рубли × Курс → Вывод

Где используются линейные алгоритмы:

ОбластьПример
Математические расчётыПлощадь, периметр, объём
Преобразование данныхПеревод единиц измерения
Последовательная обработкаЧтение строки, разбор на части, вывод
ИнициализацияУстановка начальных значений переменных

Ограничения линейных алгоритмов:

ОграничениеЧто нельзя сделать
Нет выбораНельзя выполнить разные действия при разных условиях
Нет повторовНельзя выполнить действие много раз
Нет пропусковНельзя пропустить шаг при определённом условии

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



Вопрос 52.

Разветвляющиеся алгоритмы

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

Основные конструкции ветвления:

КонструкцияСмыслСхема словесно
Полное ветвлениеЕсли условие истинно, делаем действие 1; иначе — действие 2«Если дождь, то взять зонт, иначе надеть панаму»
Неполное ветвлениеЕсли условие истинно, делаем действие; иначе — ничего«Если дождь, то взять зонт»
Множественное ветвлениеВыбор одного из нескольких вариантов«Если оценка = 5, то «отлично»; если 4, то «хорошо»; если 3, то «удовлетворительно»»

Пример полного ветвления (определение модуля числа):

  1. Ввести число X
  2. Если X >= 0, то Y = X
  3. Иначе Y = -X
  4. Вывести Y

Пример неполного ветвления (проверка пароля):

  1. Ввести пароль
  2. Если пароль = «12345», то вывести «Доступ разрешён»
  3. (Если пароль неверный, ничего не делать — программа просто завершится)

Пример множественного ветвления (оценка за тест):

БаллыРезультат
90–100«Отлично»
75–89«Хорошо»
50–74«Удовлетворительно»
0–49«Неудовлетворительно»

Сложные условия (логические операции):

ОперацияСмыслПример
И (AND)Истинно, если оба условия истинны«Если сегодня суббота И солнечно, то идём гулять»
ИЛИ (OR)Истинно, если хотя бы одно условие истинно«Если сегодня суббота ИЛИ воскресенье, то выходной»
НЕ (NOT)Меняет истину на ложь и наоборот«Если НЕ дождь, то идём гулять»

Пример сложного условия (покупка товара со скидкой):
«Если сумма покупки больше 1000 рублей И пользователь является постоянным клиентом, то предоставить скидку 10%»

Где используются разветвляющиеся алгоритмы:

ОбластьПример
АвторизацияПроверка логина и пароля
Валидация данныхПроверка, что введённые данные корректны
КлассификацияОпределение категории по значению
Обработка ошибокЕсли ошибка, то показать сообщение
ИгрыПроверка условий победы/поражения

алгоритма недостаточно — нужно использовать разветвляющийся алгоритм.



Вопрос 53.

Циклические алгоритмы

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

Три типа циклов:

Тип циклаКогда повторяемКогда заканчиваемПример
Счётный (for)Заданное количество разПосле выполнения нужного числа повторений«Повторить 10 раз»
С предусловием (while)Пока условие истинноКогда условие становится ложным«Пока в баке есть бензин, ехать»
С постусловием (do-while)Хотя бы один раз, затем пока условие истинноКогда условие становится ложным«Нажать кнопку; повторять, пока не выйдет»

Пример цикла со счётчиком (сумма чисел от 1 до N):

  1. Ввести N
  2. S = 0
  3. Для I от 1 до N выполнять: S = S + I
  4. Вывести S

Пример цикла с предусловием (ожидание правильного ввода):

  1. Ввести возраст
  2. Пока возраст < 0 или возраст > 150, выполнять:
    • Вывести «Ошибка, введите возраст от 0 до 150»
    • Ввести возраст заново
  3. Вывести «Возраст принят»

Пример цикла с постусловием (меню программы):

  1. Повторять:
    • Показать меню: 1 — продолжить, 0 — выход
    • Ввести выбор
    • Если выбор = 1, выполнить действие
  2. Пока выбор != 0

Сравнение типов циклов:

ХарактеристикаСчётный (for)С предусловием (while)С постусловием (do-while)
Количество повторенийИзвестно заранееНеизвестно заранееНеизвестно заранее
Минимальное количество0 (если 0 раз)0 (если условие сразу ложно)1 (хотя бы один раз)
Когда использоватьПеребор массива, табуляцияОжидание события, ввод данныхМеню, повтор до правильного ввода
РискНетБесконечный цикл (если условие всегда истинно)Бесконечный цикл (если условие всегда истинно)

Пример задачи, где нужен цикл (поиск максимального числа в списке):

Без цикла (плохо)С циклом (хорошо)
Сравнить число 1 и 2Максимум = первое число
Сравнить результат с числом 3Для каждого следующего числа:
Сравнить результат с числом 4Если число > максимума, то максимум = число
… (повторять для каждого числа)(Одна и та же инструкция для любого количества чисел)

Как избежать бесконечного цикла (правила):

ПравилоЧто делать
Менять условие внутри циклаУвеличивать счётчик, считывать новые данные
Проверять граничные условияУбедиться, что цикл когда-нибудь закончится
Использовать защиту от зацикливанияОграничить максимальное количество итераций
Логировать подозрительные циклыВыводить сообщение, если цикл выполняется слишком долго


Вопрос 54.

Вспомогательные алгоритмы и подпрограммы

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

Основные понятия:

ПонятиеЧто значитПример
ПодпрограммаИменованный блок кода, который можно вызвать по имени«Вычислить квадратный корень»
Вызов подпрограммыОбращение к подпрограмме из другого места«вызвать сортировку_массива»
Параметры (аргументы)Данные, которые передаются в подпрограммуЧисла A и B для сложения
Возвращаемое значениеРезультат работы подпрограммыСумма A+B
Локальные переменныеПеременные, которые видны только внутри подпрограммыВременная переменная для обмена значений

Зачем нужны подпрограммы (преимущества):

ПреимуществоОбъяснение
Переиспользование кодаОдин и тот же алгоритм можно использовать в разных местах
Упрощение отладкиПодпрограмму можно отлаживать отдельно
Сокрытие сложностиОсновная программа становится короткой и понятной
Разделение работыРазные люди могут писать разные подпрограммы
Тестирование по частямКаждую подпрограмму можно протестировать независимо

Пример без подпрограмм (плохо):

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

Пример с подпрограммой (хорошо):

Создаётся подпрограмма «факториал». В трёх местах программы просто вызывается эта подпрограмма. Код факториала написан один раз. Если нужны изменения — меняем в одном месте.

Виды подпрограмм:

ВидЧто делаетПример
ПроцедураВыполняет действия, но ничего не возвращает«Напечатать отчёт»
ФункцияВычисляет и возвращает результат«Квадратный корень из X»

Сравнение процедуры и функции:

ХарактеристикаПроцедураФункция
Возвращает значениеНетДа
Используется как часть выраженияНетДа (например, в формуле)
Пример«Отправить email»«Рассчитать НДС»
ВызовКак отдельная командаВнутри вычислений

Пример использования вспомогательных алгоритмов в жизни:

ЗадачаВспомогательные подпрограммы
Сборка автомобиляСобрать двигатель, собрать кузов, установить колёса, покрасить
Приготовление обедаПочистить картошку, сварить суп, пожарить котлеты, нарезать салат
Написание отчётаСобрать данные, рассчитать показатели, построить графики, оформить

Рекурсия — особый вид подпрограмм:

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

Пример рекурсии (вычисление факториала):

Правила хороших подпрограмм:

ПравилоЧто значит
Одна задачаПодпрограмма делает что-то одно
Небольшой размерНе более 50–100 строк (обычно)
Понятное имяИмя отражает, что делает подпрограмма
Минимум параметровНе более 3–5 параметров
ДокументацияКратко описано, что делает, что принимает, что возвращает


Вопрос 55.

Основные структуры данных

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

Основные структуры данных (сравнение):

СтруктураКак устроенаОсновные операцииКогда использовать
МассивЭлементы одного типа, расположенные в памяти последовательноОбращение по индексу — быстро; вставка/удаление — медленноФиксированное количество элементов, частый доступ по индексу
Список (связный)Элементы связаны ссылками (каждый знает следующий)Вставка/удаление — быстро; поиск по значению — медленноЧастые вставки и удаления, не важен порядок
СтекLIFO (последним пришёл — первым ушёл)Добавление (push), извлечение (pop) — быстроОтмена действий, проверка скобок, обход графов
ОчередьFIFO (первым пришёл — первым ушёл)Добавление в конец, извлечение из начала — быстроОбработка запросов, печать документов
Хеш-таблицаКлюч → значение (как словарь)Поиск, вставка, удаление по ключу — очень быстроБыстрый поиск по ключу (телефонная книга)
ДеревоИерархическая структура (корень, ветви, листья)Поиск, вставка, удаление — быстроИерархические данные (файловая система), поиск
ГрафВершины и рёбра (связи)Поиск пути, обходСети (дороги, соцсети, интернет)

Подробнее о каждой структуре:

Массив:

Связный список:

Стек:

Очередь:

Хеш-таблица (словарь):

Дерево:

Граф:

Сравнение скорости операций (обобщённо):

СтруктураДоступ по индексу/ключуПоиск по значениюВставкаУдаление
МассивОчень быстроМедленноМедленно (сдвиг)Медленно (сдвиг)
Связный списокМедленно (идти от начала)МедленноБыстроБыстро
СтекТолько верхнийНетБыстроБыстро
ОчередьТолько первый/последнийНетБыстроБыстро
Хеш-таблицаОчень быстро (по ключу)Нет смыслаОчень быстроОчень быстро
ДеревоСредне (по значению)СреднеСреднеСредне

Как выбрать структуру данных (вопросы для решения):

ВопросЕсли ДАЕсли НЕТ
Нужен быстрый доступ по номеру (индексу)?МассивСписок или хеш-таблица
Часто вставляются и удаляются элементы?Связный списокМассив
Данные обрабатываются в порядке LIFO (последним пришёл — первым ушёл)?СтекОчередь
Данные обрабатываются в порядке FIFO (первым пришёл — первым ушёл)?ОчередьСтек
Нужен очень быстрый поиск по ключу (например, по имени)?Хеш-таблицаДерево или список
Данные имеют иерархическую структуру?ДеревоГраф или список
Данные имеют сложные связи (дороги, соцсети)?ГрафДерево


Вопрос 56.

Понятие базы данных в программной системе

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

Основные понятия баз данных:

ПонятиеЧто значитПример
ДанныеИнформация, которая хранитсяИмя пользователя, цена товара
База данных (БД)Хранилище организованных данныхСписок всех клиентов магазина
Система управления базами данных (СУБД)Программа для работы с БД (добавление, поиск, удаление)MySQL, PostgreSQL, Oracle
ТаблицаДанные, организованные в строки и столбцыТаблица «Пользователи»
Строка (запись)Один объект в таблицеИванов Иван, ivan@mail.ru
Столбец (поле)Одна характеристика всех объектовemail, возраст, город
КлючУникальный идентификатор строкиID пользователя (1, 2, 3…)

Пример таблицы «Пользователи»:

IDИмяEmailГород
1Иванivan@mail.ruМосква
2Марияmaria@mail.ruСПб
3Пётрpetr@mail.ruКазань

Зачем нужна база данных (а не простой файл):

ВозможностьФайл (Excel, CSV)База данных
Поиск по 1 млн записейМинутыСекунды (доли секунды)
Поиск по нескольким таблицамСложно, вручнуюЛегко (JOIN)
Одновременный доступ 1000 пользователейНет (файл блокируется)Да
Безопасность, разграничение правМинимальнаяРазвитая
Ограничения (возраст не может быть отрицательным)НетДа
Резервное копирование и восстановлениеВручнуюАвтоматически

Типы баз данных (по модели данных):

ТипКак хранит данныеПримерыКогда использовать
Реляционные (SQL)Таблицы со строками и столбцами, связи между таблицамиPostgreSQL, MySQL, Oracle, SQLiteБольшинство бизнес-приложений (учёт, заказы, клиенты)
Документные (NoSQL)Документы в формате JSON (гибкая структура)MongoDB, CouchDBКаталоги товаров, логи, контент
Ключ-значениеПара «ключ → значение» (очень быстрый доступ по ключу)Redis, Memcached, DynamoDBКэширование, сессии пользователей
ГрафовыеВершины и рёбра (как графы в математике)Neo4j, ArangoDBСоциальные сети, рекомендации, поиск путей
КолоночныеДанные хранятся по столбцам, а не по строкамClickHouse, CassandraАналитика, большие данные, хранилища данных

Основные операции с базой данных (CRUD):

ОперацияАнглийскийЧто делаетПример
СозданиеCreateДобавить новую записьЗарегистрировать нового пользователя
ЧтениеReadНайти и прочитать данныеПоказать профиль пользователя
ОбновлениеUpdateИзменить существующие данныеСменить пароль
УдалениеDeleteУдалить записьУдалить аккаунт пользователя

Где используются базы данных (примеры):

СистемаЧто хранитТип БД
Интернет-магазинТовары, заказы, пользователиРеляционная
Социальная сетьПользователи, друзья, посты, лайкиГрафовая + реляционная
БанкСчета, транзакции, клиентыРеляционная (строгая надёжность)
Корзина товаров на сайтеВременные данные (сессия)Ключ-значение (быстро)
Аналитика (отчёты)Миллиарды записейКолоночная
Система логированияЛоги серверовДокументная


Вопрос 57.

 Проектирование базы данных для программного продукта

Проектирование базы данных — это процесс создания структуры БД: какие таблицы нужны, какие поля в них будут, как таблицы связаны между собой. Хорошо спроектированная БД — основа быстрой и надёжной работы программы. Плохая БД приводит к замедлению, ошибкам и дублированию данных.

Основные этапы проектирования БД:

ЭтапЧто делаемРезультат
1. Анализ требованийВыясняем, какие данные нужно хранитьСписок сущностей (пользователи, товары, заказы)
2. Логическое проектированиеОпределяем сущности, атрибуты, связи (без привязки к конкретной СУБД)ER-диаграмма (сущность-связь)
3. Физическое проектированиеВыбираем типы данных, индексы, конкретную СУБДСхема БД (CREATE TABLE …)
4. ОптимизацияДобавляем индексы, нормализуем или денормализуемБыстрая и надёжная БД

Основные понятия проектирования:

ПонятиеЧто значитПример для интернет-магазина
СущностьОбъект, о котором храним данныеПользователь, Товар, Заказ
АтрибутХарактеристика сущностиИмя, цена, дата заказа
Первичный ключУникальный идентификатор записиID пользователя (1, 2, 3…)
Внешний ключСсылка на запись в другой таблицеID пользователя в таблице «Заказы»
СвязьКак таблицы связаны друг с другомУ пользователя может быть много заказов

Типы связей между таблицами:

Тип связиЧто значитПример
Один к одномуОдной записи в таблице А соответствует одна запись в таблице БУ пользователя — один паспорт
Один ко многимОдной записи в таблице А соответствует много записей в таблице БУ пользователя — много заказов
Многие ко многимМного записей в А соответствует много записей в БТовары и категории (товар может быть в нескольких категориях)

Пример структуры БД для интернет-магазина:

ТаблицаПоляТип
ПользователиID (ключ), Имя, Email, Пароль, ГородОдин ко многим с Заказами
ТоварыID (ключ), Название, Цена, КоличествоОдин ко многим с Заказами (через корзину)
ЗаказыID (ключ), ID_пользователя (внешний ключ), Дата, СуммаМногие к одному с Пользователями
Заказы_ТоварыID_заказа, ID_товара, КоличествоСвязь многие ко многим

Что такое нормализация (приведение БД к правильному виду):

Нормализация — это процесс устранения дублирования данных и обеспечения их целостности.

Пример ненормализованной БД (плохо):

ПользовательТовары (список через запятую)
ИванЯблоки, Груши, Бананы
МарияЯблоки, Апельсины

Проблемы:

Пример нормализованной БД (хорошо):

ПользователиТоварыПокупки (связь)
1 — Иван1 — Яблоки1,1
2 — Мария2 — Груши1,2
3 — Бананы1,3
4 — Апельсины2,1
2,4

Преимущества нормализации:

Когда нужны индексы (для ускорения поиска):

СитуацияНужен индекс?
Поиск по ID (первичному ключу)Да (автоматически)
Поиск по полю, по которому часто ищут (Email)Да
Сортировка по полюДа (если сортируют часто)
Поле, которое редко используется в поискеНет
Маленькая таблица (до 1000 записей)Не обязательно
Частые вставки и обновленияОсторожно (индексы замедляют вставку)

Что такое транзакция (группа операций как одно целое):

Транзакция — это последовательность операций, которая выполняется либо полностью, либо не выполняется вообще.

Пример транзакции (перевод денег):

  1. Списать 100 рублей со счёта А
  2. Зачислить 100 рублей на счёт Б

Если после шага 1 произошёл сбой, то шаг 2 не выполнится, и 100 рублей пропадут. Транзакция откатит шаг 1, и деньги вернутся на счёт А.

Свойства транзакций (ACID):

СвойствоЧто значит
АтомарностьВсе операции выполняются или все отменяются
СогласованностьПосле транзакции данные остаются корректными
ИзоляцияПараллельные транзакции не мешают друг другу
ДолговечностьПосле подтверждения данные не теряются


Вопрос 58.

Этапы создания пользовательского интерфейса

Создание пользовательского интерфейса (UI — User Interface) — это многоэтапный процесс, который начинается задолго до того, как дизайнер откроет Figma или Photoshop. Основная цель — сделать интерфейс понятным, удобным и приятным для пользователя. Хороший интерфейс не требует инструкции — пользователь интуитивно понимает, что делать.

Полный список этапов создания интерфейса (8 этапов с деталями):

ЭтапЧто делаемРезультатКто делаетДлительность
1. Исследование пользователейИзучаем целевую аудиторию: кто они, чем занимаются, какие у них цели и ограниченияПерсонажи (портреты пользователей), сценарии использованияUX-исследователь, аналитик1-3 недели
2. Информационная архитектураОпределяем структуру: сколько экранов, как они связаны, где какие блокиКарта сайта (sitemap), схема навигацииUX-дизайнер2-5 дней
3. Прототипирование (Wireframes)Создаём каркасы экранов (чёрно-белые, без цвета и шрифтов)Набор wireframes (низкая детализация)UX-дизайнер1-2 недели
4. UI-дизайн (макеты)Добавляем цвета, шрифты, тени, иконки, отступы, анимациюМакеты высокой детализации в FigmaUI-дизайнер2-4 недели
5. Интерактивный прототипСвязываем макеты ссылками, добавляем переходы, анимациюКликабельный прототип (можно тыкать)UI/UX-дизайнер3-7 дней
6. Юзабилити-тестированиеДаём пользователям потыкать прототип, наблюдаем, где они спотыкаютсяОтчёт с проблемами и рекомендациямиUX-исследователь1-2 недели
7. Передача разработчикамЭкспортируем ресурсы (иконки, картинки), готовим спецификацииНабор ресурсов, макеты с размерами и цветамиДизайнер2-5 дней
8. Контроль вёрсткиПроверяем, как разработчики сверстали интерфейс, даём правкиСвёрстанный интерфейс, соответствующий макетамДизайнерВ процессе разработки

Пример исследования пользователей (что выясняем):

ВопросЗачемПример ответа
Какой возраст пользователей?Подбираем размер кнопок, шрифтов50-65 лет (кнопки должны быть крупными)
Как часто они пользуются компьютером?Определяем уровень сложностиРедко (интерфейс должен быть максимально простым)
Какая у них цель?Понимаем, какие функции главныеКупить билет (кнопка покупки — самая заметная)
В каких условиях используют?Учитываем отвлекающие факторыВ метро, одной рукой (кнопки крупные, снизу

Что такое Wireframe (пример описания):

Wireframe — это схематичное изображение экрана без цвета, шрифтов и картинок. Только блоки и их расположение.

Описание wireframe для экрана входа:

Как тестировать интерфейс (методы):

МетодКак работаетЧто выявляет
НаблюдениеСмотрим, как пользователь выполняет задачу (не подсказываем)Где пользователь зависает, где ошибается
Опрос после тестаСпрашиваем: «Что было неудобно?»Субъективные впечатления
A/B-тестированиеПоказываем двум группам разные версии, сравниваемКакая версия работает лучше
Тепловые картыСмотрим, куда пользователь чаще кликаетКакие элементы привлекают внимание
Анализ времени выполненияЗасекаем, сколько времени на задачуНасколько интерфейс эффективен

Типичные проблемы интерфейса, которые выявляет тестирование:

ПроблемаПримерИсправление
Кнопка не заметнаБелая кнопка на белом фонеСделать контрастной
Непонятная иконкаИконка «шестерёнка» для настроек — понятно, а иконка «три точки» — нетДобавить текст
Мелкий шрифтТекст 8 пикселей на экране телефонаУвеличить до 14-16
Много шагов10 шагов для регистрацииСократить до 3-5
Нет обратной связиНажал кнопку — ничего не происходитДобавить спиннер или сообщение


Вопрос 59.

Требования к пользовательскому интерфейсу

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

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

ГруппаЧто включаетПример
ВизуальныеЦвета, шрифты, отступы, выравнивание, контрастностьКнопка «Купить» должна быть зелёной и заметной
ЭргономическиеУдобство, доступность, минимум движенийКнопка подтверждения не рядом с кнопкой удаления
ПоведенческиеРеакция на действия пользователя, обратная связьПри нажатии кнопка должна менять цвет
ТехническиеСкорость загрузки, адаптивность, совместимостьИнтерфейс должен работать на всех браузерах
ИнклюзивныеДоступность для людей с ограничениямиПоддержка экранных дикторов

Детальные требования к интерфейсу (по стандартам и лучшим практикам):

Визуальные требования:

ТребованиеЧто значитПример
КонтрастностьТекст должен легко читаться на фонеЧёрный текст на белом фоне (контраст 21:1)
Единый стильВсе кнопки выглядят одинаковоВсе кнопки «Сохранить» одного цвета и размера
ИерархияГлавное — крупное и заметное, второстепенное — мелкоеЗаголовок больше, чем текст под ним
Воздух (отступы)Элементы не слипаютсяМежду кнопками 10 пикселей, а не 2
Цветовая гармонияЦвета не режут глаз, сочетаются друг с другомСиний, белый, серый — спокойная гамма

Эргономические требования (удобство):

ТребованиеЧто значитПример
Закон ФиттсаЧем ближе и крупнее цель, тем легче попастьКорзина в правом верхнем углу (близко к курсору)
Правило 3 кликовЛюбое действие — не более 3 кликовОплата заказа: Корзина → Оформить → Подтвердить
Правило «золотого сечения»Важные элементы в определённых точках экранаГлавная кнопка в правом нижнем углу (для пальца)
Минимизация нагрузки на памятьНе заставлять пользователя запоминатьПоказывать список недавних документов
Обратная связьПользователь понимает, что происходит«Загрузка…», «Сохранено», «Ошибка»

Поведенческие требования (как ведёт себя интерфейс):

ТребованиеЧто значитПример
ПрогнозируемостьОдинаковые действия — одинаковый результатКнопка «Назад» всегда ведёт на предыдущую страницу
Предотвращение ошибокИнтерфейс не даёт сделать ошибкуКнопка «Удалить» спросит подтверждение
Восстановление после ошибокМожно отменить действиеКнопка «Отменить» (Ctrl+Z)
Сохранение состоянияНе теряются данные при случайном закрытииФорма сохраняет введённый текст
Постоянство элементовЗнакомые элементы на знакомых местахМеню всегда сверху, корзина справа

Технические требования:

ТребованиеЧто значитПример
АдаптивностьХорошо выглядит на любом экранеТелефон, планшет, компьютер
КроссбраузерностьРаботает во всех браузерахChrome, Firefox, Safari, Edge
Скорость загрузкиИнтерфейс появляется быстроПервый экран — менее 1 секунды
Доступность (Accessibility)Для людей с ограничениямиЭкранные дикторы, высокая контрастность
ИнтернационализацияПоддерживает разные языки и культурыРусский, английский, дата в формате ДД.ММ.ГГГГ

Как проверить, соответствует ли интерфейс требованиям (методы):

МетодЧто проверяетИнструменты
Экспертная оценкаВсе требования (эксперт смотрит)Чек-лист из 50+ пунктов
Юзабилити-тестированиеУдобство для пользователейЗапись экрана, наблюдение
A/B-тестированиеКакая версия лучшеСтатистика конверсий
Автоматические проверкиКонтрастность, размер шрифта, адаптивностьLighthouse, WAVE
Опрос пользователейСубъективная удовлетворённостьGoogle Forms


Вопрос 60.

Принципы удобства и эргономики интерфейса

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

10 главных принципов удобства интерфейса (по Якобу Нильсену):

ПринципЧто значитПример нарушенияХорошее решение
1. Видимость состоянияПользователь знает, что происходитНажал кнопку — ничего не изменилосьКнопка стала неактивной, появился спиннер
2. Соответствие реальному мируИспользуются понятные пользователю слова и образы«Аутентификация не пройдена»«Неверный логин или пароль»
3. Свобода и контрольПользователь может отменить действиеНет кнопки «Назад»Есть кнопка «Отменить»
4. Стандарты и единообразиеОдинаковые элементы выглядят одинаковоКнопка «Сохранить» в одном месте зелёная, в другом — синяяВсе кнопки сохранения одного цвета
5. Предотвращение ошибокИнтерфейс не даёт сделать ошибкуПользователь может удалить всё одним кликомСпросить подтверждение перед удалением
6. Узнавание, а не припоминаниеПользователь видит варианты, а не вспоминаетНадо помнить точное название командыВыпадающий список с вариантами
7. Гибкость и эффективностьДля опытных пользователей есть быстрые способыНет горячих клавишCtrl+S, Ctrl+C, Ctrl+V
8. Эстетика и минимализмНичего лишнего, только нужноеМного рекламы, лишних кнопокТолько нужные элементы
9. Помощь в обнаружении ошибокСообщение подсказывает, как исправить«Ошибка 500»«Поле Email должно содержать @»
10. Помощь и документацияЕсли что-то непонятно, можно прочитатьНет раздела «Помощь»Инструкция, подсказки

Дополнительные принципы эргономики:

ПринципЧто значитПример
Закон ХикаВремя выбора растёт с количеством вариантов2 варианта лучше, чем 10 (да/нет вместо выбора из списка)
Закон МиллераЧеловек удерживает в памяти 7±2 объектаНе больше 7 пунктов в меню
Эффект близостиБлизкие элементы воспринимаются как связанныеГруппировать связанные поля формы
Эффект сходстваОдинаковые элементы воспринимаются как связанныеВсе кнопки действий — одного цвета
Эффект ориентираПервый и последний элемент запоминаются лучшеСамые важные пункты — в начало и конец меню
Принцип F-образного чтенияПользователь сканирует экран буквой FВажная информация — по левому краю

Принципы доступности (для людей с ограничениями):

ПринципДля когоЧто значитПример
Текстовые альтернативыДля незрячих (экранные дикторы)У каждой картинки есть текстовое описание<img alt="Красное яблоко">
Достаточный контрастДля слабовидящихТекст легко читается на фонеЧёрный на белом, контраст 21:1
Навигация с клавиатурыДля людей с нарушениями моторикиМожно управлять Tab, Enter, стрелкамиTab переключает поля, Enter — выбор
Достаточный размерДля людей с нарушениями моторикиКнопки достаточно крупные40×40 пикселей (не 10×10)
Не только цветДля дальтониковИнформация передаётся не только цветом«Красный» + «Значок ошибки»
Адаптивный размер шрифтаДля слабовидящихМожно увеличить шрифт без поломкиИнтерфейс «резиновый», а не фиксированный

Как измерить удобство интерфейса (метрики):

МетрикаЧто измеряетКак вычислитьХорошее значение
Время выполнения задачиСколько секунд нужно, чтобы сделать действиеЗасечь от начала до конца< 30 секунд
Количество ошибокСколько раз пользователь ошибсяПосчитать< 2 на задачу
Успешность выполненияКакой процент пользователей выполнил задачуУспешно / Всего × 100%> 90%
Удовлетворённость (SUS)Как пользователю нравитсяОпросник из 10 вопросов> 70 баллов
ОбучаемостьКак быстро новичок становится эффективнымВремя с первого раза до 5-го< 5 повторений


Вопрос 61.

Прототипирование пользовательского интерфейса

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

Уровни прототипирования (от низкой детализации к высокой):

УровеньНазваниеЧто включаетИнструментыДлительность
1Бумажный прототипРисунки от руки, вырезанные элементыБумага, карандаш, ножницыЧасы-день
2Цифровой каркас (Wireframe)Схемы, блоки, без цвета и шрифтовBalsamiq, Figma (базовая)2-5 дней
3Макет низкой детализации (Lo-Fi)Схемы + логические связки (кликабельно)Figma, Axure, Adobe XD1-2 недели
4Макет высокой детализации (Hi-Fi)Цвета, шрифты, иконки, анимация, кликабельноFigma, Sketch, Adobe XD2-4 недели
5Интерактивный прототипПочти готовый интерфейс с логикойAxure, ProtoPie, Framer3-6 недель

Что даёт каждый уровень прототипирования:

УровеньПлюсыМинусыКогда использовать
БумажныйБыстро, дёшево, легко менятьНельзя кликнуть, нереалистичноСамое начало, грубое согласование
WireframeПонятно расположение блоковНет визуала, трудно оценить эстетикуУтверждение структуры
Lo-FiУже можно кликать, проверять логикуНет цветов, скучныйТестирование сценариев
Hi-FiПочти как готовый продуктДолго делать, дорого менятьТестирование визуала, передача разработчикам
ИнтерактивныйПолная симуляцияОчень дорого, долгоСложные анимации, демо для инвесторов

Пример перехода от идеи к прототипу (процесс):

ЭтапДействиеПример для кнопки «Купить»
1БумагаРисуем прямоугольник, пишем внутри «Купить», вырезаем
2WireframeПрямоугольник 200×50, посередине текст «Купить»
3Lo-FiПрямоугольник, по клику переходит на страницу оплаты
4Hi-FiЗелёный прямоугольник, белый шрифт, тень, скруглённые углы
5ИнтерактивПри нажатии появляется спиннер, затем переход с анимацией

Инструменты для прототипирования (сравнение):

ИнструментУровниЦенаСложностьДля кого
Бумага + карандашБумажныйБесплатноОчень низкаяВсе, быстрое начало
BalsamiqWireframeПлатнаяНизкаяПроектировщики
FigmaВсе уровниБесплатно (базовая)СредняяСамый популярный
SketchHi-FiПлатная (только Mac)СредняяДизайнеры на Mac
Adobe XDВсе уровниПлатная (есть бесплатный план)СредняяПользователи Adobe
AxureВсе уровни + сложная логикаПлатнаяВысокаяКрупные проекты
ProtoPieИнтерактивныйПлатнаяВысокаяСложная анимация

Что должно быть в прототипе для передачи разработчикам:

ЭлементЧто указываемПример
РазмерыШирина, высота элементовКнопка 200×50 пикселей
ОтступыРасстояние между элементамиОтступ от края экрана 20 пикселей
ЦветаHEX-коды или названия#FF0000 (красный)
ШрифтыНазвание, размер, начертаниеRoboto, 16 px, полужирный
СостоянияОбычное, при наведении, при нажатииКнопка: зелёная → тёмно-зелёная при наведении
АнимацияДлительность, тип, как меняется0.3 сек, плавное появление
Логика переходовПри каком действии что происходитКлик по «Вход» → открыть экран входа

Как тестировать прототип (методы):

МетодКак работаетНа каком уровне
Самостоятельная проверкаДизайнер сам кликает и ищет нестыковкиЛюбой
Проверка с коллегамиПоказываем коллегам, собираем мненияЛюбой
Тестирование с пользователямиПриглашаем реальных пользователей, даём задачиLo-Fi, Hi-Fi
A/B-тестирование прототиповПоказываем два варианта, спрашиваем мнениеHi-Fi
Проверка на доступностьПроверяем контрастность, шрифты, управление с клавиатурыHi-Fi


Вопрос 62.

Кодирование как этап разработки программного обеспечения

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

Место кодирования в общем процессе разработки:

ЭтапДо кодированияКодированиеПосле кодирования
Что делаемАнализ требований, проектированиеПишем кодТестирование, внедрение, сопровождение
% времени (водопад)35%20%45%
% времени (Agile)15% (в каждом спринте)40% (в каждом спринте)45% (в каждом спринте)

Что входит в этап кодирования (не только написание кода):

ДействиеЧто делаемПочему важно
Написание кодаПишем функции, классы, модули по проектуОсновная работа
Написание юнит-тестовПишем тесты для проверки своего кодаБез тестов нельзя быть уверенным
Форматирование кодаПриводим код к единому стилю (отступы, пробелы)Код читается легче
КомментированиеДобавляем пояснения к сложным местамЧерез год сами поймём
Работа с GitДелаем коммиты, создаём ветки, пушимКонтроль версий
Code reviewПоказываем код коллегам, они проверяютОшибки ловятся раньше
ИнтеграцияОбъединяем свой код с общим репозиториемЧтобы не было конфликтов
Запуск тестов в CIАвтоматическая проверка всех тестовУбеждаемся, что ничего не сломали

Этапы кодирования одной задачи (сценарий):

ШагДействиеВремя
1Взять задачу из Jira (баг-трекера)5 минут
2Создать ветку от develop1 минута
3Переключиться на новую ветку1 минута
4Написать код (сама задача)2 часа
5Написать юнит-тесты30 минут
6Проверить код (локальный запуск)15 минут
7Сделать коммит с понятным сообщением5 минут
8Отправить ветку на сервер (push)1 минута
9Открыть Pull Request5 минут
10Ждать code review (коллеги смотрят)от 1 часа до 1 дня
11Исправить замечания (если есть)переменная
12Получить одобрение (approve)1 минута
13Влить (merge) ветку в develop1 минута
14Удалить ветку (локально и на сервере)1 минута

Что делает код хорошим (критерии качества кода):

КритерийЧто значитПример нарушения
ЧитаемостьКод понятен другому разработчикуПеременные a, b, c вместо meaningful names
ПростотаНет лишней сложности50 строк там, где можно 5
МодульностьКод разбит на маленькие функцииОдна функция на 500 строк
ТестируемостьК каждому блоку легко написать тестФункция использует глобальные переменные
ЭффективностьКод работает достаточно быстроЦикл в цикле для 10 элементов
ДокументированностьСложные места поясненыСложный алгоритм без комментариев
Отсутствие дублированияОдна и та же логика не повторяетсяОдин и тот же расчёт в 5 местах

Что мешает писать хороший код (факторы, снижающие качество):

ФакторЧто происходитКак бороться
Дедлайны («сделать вчера»)Программист «забивает» на качествоРеалистичные сроки
«Потом починю»Оставляем временный костыль, который становится постояннымРефакторить сразу
Непонятные требованияПрограммист додумывает за заказчикаУточнять требования до кода
Отсутствие code reviewОшибки никто не проверяетВнедрить обязательный code review
Устаревшая документацияКод пишут по старому, а надо по-новомуОбновлять документацию


Вопрос 63.

Требования к качеству программного кода

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

Основные требования к качеству кода (7 характеристик):

ХарактеристикаЧто значитПочему важно
ЧитаемостьКод понятен другому разработчику (или себе через год)Меньше времени на понимание
ПростотаМинимум лишних сложностейМеньше ошибок
МодульностьКод разбит на маленькие, независимые частиЛегко тестировать и менять
Отсутствие дублированияОдна логика — в одном местеИсправляем один раз — везде работает
ТестируемостьК каждой части можно написать тестУверенность в правильности
ЭффективностьКод использует ресурсы разумноПрограмма не тормозит
БезопасностьКод не содержит уязвимостейДанные не украдут

Как измерить качество кода (метрики):

МетрикаЧто измеряетКак вычислитьХорошее значение
Цикломатическая сложностьСложность логики (количество путей)Количество ifforwhile< 10 на функцию
Покрытие тестамиКакой процент кода проверен тестами(Строки в тестах / Все строки) × 100%> 70%
КомментарииКод понятен без комментариев?СубъективноКомментарии объясняют «почему», а не «что»
Количество строк функцииНе слишком ли функция длинная?Посчитать строки< 50 строк (часто < 30)
Количество параметровНе слишком ли много параметров?Посчитать параметры< 5 (часто < 3)
Глубина вложенностиНе слишком ли много вложенных if?Посчитать уровень< 4 уровня
Количество замечаний линтераНарушение стиляЗапустить линтер0 критических замечаний

Что такое технический долг (плохой код как кредит):

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

Тип технического долгаПримерКак быстро растётКак исправлять
Дублирование кодаОдна логика в 10 местахМедленноВыделить общую функцию
Сложные функцииФункция на 300 строкБыстроРазбить на маленькие
Отсутствие тестовРучное тестированиеОчень быстроНаписать тесты
Устаревшие зависимостиСтарая библиотека, не обновлялиСкачкообразноОбновить
«Костыли»Временные решения, которые стали постояннымиПостоянноПереписать нормально

Золотые правила написания хорошего кода (с примерами):

ПравилоПлохо (нарушение)Хорошо
Понятные именаa, b, c, x, y, zprice, quantity, total, userName
Не использовать магические числаif x > 7MAX_LOGIN_ATTEMPTS = 7
Одна функция — одна задачаФункция и считает, и пишет в БД, и отправляет emailРазбить на 3 функции
Не повторяться (DRY)Расчёт НДС в 5 местахВынести в функцию calculateVAT()
Комментировать «почему»x = x + 1 // увеличиваем x на 1// Добавляем скидку, потому что постоянный клиент
Избегать глубокой вложенностиif (a) { if (b) { if (c) { ... } } }Ранний return


Вопрос 64.

Стандарты оформления программного кода

Стандарты оформления кода (code style) — это набор правил о том, как должны называться переменные, где ставить пробелы, как делать отступы, где писать фигурные скобки. Единый стандарт в команде делает код читаемым для всех. Без стандарта каждый пишет как хочет, и код превращается в «кашу», где трудно разобраться.

Зачем нужны стандарты оформления кода (4 причины):

ПричинаОбъяснение
ЧитаемостьКод выглядит одинаково, его легче читать и понимать
Упрощение code reviewПроверяющий не отвлекается на стиль, только на логику
Снижение ошибокОднообразный стиль помогает заметить опечатки
Быстрое вхождение новичковНовый разработчик быстро привыкает к единому стилю

Основные элементы стандарта кода (что регулируется):

ЭлементЧто регулируетПример
ИменованиеКак называть переменные, функции, классыuserName (camelCase) или user_name (snake_case)
ОтступыСколько пробелов на один уровень вложенности4 пробела (не табуляция)
ПробелыГде ставить пробелы вокруг операторовa = b + c, а не a=b+c
Длина строкиМаксимальное количество символов в строкеНе более 79 (PEP 8) или 100-120 (другие стандарты)
Пустые строкиКогда разделять блоки кода пустой строкойМежду функциями 2 пустые строки
КомментарииКак оформлять комментарии# Это комментарий (с пробелом после #)
ИмпортыВ каком порядке подключать библиотекиСначала стандартные, потом сторонние, потом свои
Фигурные скобкиГде ставить открывающую скобкуНа той же строке или на новой

Популярные стандарты кода для разных языков:

ЯзыкСтандартОсобенность
PythonPEP 8Отступы 4 пробела, snake_case для переменных
JavaGoogle Java StylecamelCase, фигурные скобки на той же строке
JavaScriptAirbnb Style GuideТочки с запятой обязательны, пробелы вокруг скобок
C++Google C++ Style GuideОтступы 2 пробела, имена классов с большой буквы
C#Microsoft .NET Coding ConventionscamelCase, this. для полей класса
GoEffective GoОчень строгий, gofmt автоматически форматирует
PHPPSR-12Отступы 4 пробела, camelCase для методов

Пример различий в стандартах (именование):

ЭлементPython (PEP 8)Java (Google)JavaScript (Airbnb)
Переменнаяuser_nameuserNameuserName
КонстантаMAX_SIZEMAX_SIZEMAX_SIZE
Функцияget_user_name()getUserName()getUserName()
КлассUserAccountUserAccountUserAccount
Приватное поле_internalinternal__internal

Как внедрить стандарт в команде (пошагово):

ШагДействиеИнструменты
1Выбрать стандарт (существующий или создать свой)PEP 8, Google Style, Airbnb
2Настроить автоматический форматтерBlack (Python), Prettier (JS), clang-format (C++)
3Настроить линтер (проверку стиля)Pylint, ESLint, Checkstyle
4Добавить проверку стиля в CI (при каждом коммите)GitHub Actions, GitLab CI
5Настроить IDE, чтобы она форматировала автоматическиVS Code, PyCharm, IntelliJ
6Провести обучение команды (1 час)Демонстрация, разбор примеров

Автоматические инструменты для проверки и исправления стиля:

ИнструментЯзыкЧто делаетЗапуск
BlackPythonАвтоматически форматирует кодblack my_file.py
PylintPythonПроверяет стиль и находит проблемыpylint my_file.py
ESLintJavaScriptПроверяет стиль и потенциальные ошибкиeslint my_file.js
PrettierJS, TS, CSS, JSONАвтоформатированиеprettier --write .
CheckstyleJavaПроверка стиляcheckstyle -c /sun_checks.xml MyFile.java
clang-formatC, C++Автоформатированиеclang-format -i my_file.cpp
gofmtGoАвтоформатирование (встроен в язык)gofmt -w my_file.go

Пример автоматического форматирования (что делает Black с Python-кодом):

Было (нарушает стандарт)Стало (после Black)
x=5x = 5
if x==5: print(x)if x == 5: print(x)
def f(): return x+1def f(): return x + 1
{"a":1,"b":2}{"a": 1, "b": 2}

Что делать, если стандарт нарушен (уровни нарушений):

УровеньЧто значитДействие
КритическийНарушение делает код непонятнымНе пропустить код без исправления
ПредупреждениеНарушение стиля, но код читаемРекомендовать исправить
ИнформационноеНезначительное отклонениеМожно игнорировать


Вопрос 65.

Виды программной документации Дубл.

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

Классификация документации по ГОСТ 19.xxx (ЕСПД — Единая система программной документации):

ГОСТ 19.101-77 определяет следующие виды документов:

КодНазвание документаСодержаниеОбязательность
19.101Техническое задание (ТЗ)Назначение, требования, срокиДля госзаказа
19.102Пояснительная запискаОбоснование выбора архитектуры, алгоритмовДля госзаказа
19.103Руководство программистаОписание модулей, API, сборкаДля госзаказа
19.104Руководство пользователяУстановка, запуск, использованиеДля госзаказа
19.105Описание языкаСинтаксис, семантика языкаДля языковых процессоров
19.106Текст программыРаспечатка кода (редко)По требованию
19.107Программа и методика испытанийКак тестировать, какие тестыДля госзаказа

Современная классификация (по назначению и аудитории):

КатегорияДля когоДокументыОбязательность
МаркетинговаяЗаказчик, инвесторыПрезентация, коммерческое предложение, брошюраДля продажи
КонтрактнаяЗаказчик, юристыТехническое задание (ТЗ), контрактДля любого коммерческого проекта
Техническая (внешняя)Пользователи, администраторыРуководство пользователя, руководство администратораПочти всегда
Техническая (внутренняя)РазработчикиАрхитектурная документация, описание API, комментарииДля крупных проектов
ПроцесснаяМенеджеры, командаПлан проекта, отчёты, протоколы встречДля управления

Какие документы нужны для разных типов проектов (матрица):

Тип проектаТЗРуководство пользователяРуководство администратораАрхитектурная документацияКомментарии в коде
Студенческая работаДаНетНетНетМинимум
Мобильное приложение (своё)Нет (или кратко)Можно кратко (внутри приложения)НетНетДа
Мобильное приложение (заказ)ДаДаНетНетДа
Сайт-визиткаНетНетНетНетНет
Интернет-магазин (команда 5 чел)ДаДа (для менеджеров)Да (для хостинга)МинимальнаяДа
Корпоративная система (10+ чел)ДаДаДаДаДа
Open Source проектНет (README)README + WikiREADMEREADME + диаграммыДа (обязательно)

Что такое «живая документация» (документация, которая всегда актуальна):

ПодходКак работаетПримеры
Документация из кодаГенерация документации из комментариевJavadoc, Doxygen, Sphinx
Документация как кодДокументация в репозитории, обновляется с кодомMarkdown + Git, MkDocs
API-документация из спецификацииПо спецификации генерируется и документация, и кодSwagger / OpenAPI
Тесты как документацияТесты показывают, как использовать кодТесты с примерами (pytest)

Чего не должно быть в хорошей документации:

Что не нужноПочемуПример нарушения
Устаревшая информацияВредит больше, чем отсутствие«Кнопка «Сохранить» слева» (а она справа)
Очевидные вещиЗасоряет документ«Здесь вы видите окно программы»
Слишком много технических деталейПользователь не поймёт«JSON-объект содержит поле id типа integer»
Отсутствие структурыНевозможно найти нужное100 страниц текста без оглавления
Размытые скриншотыНепонятно, что на нихСкриншот 200×150 пикселей


Вопрос 66.

Пользовательская документация

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

Основные виды пользовательской документации:

ВидЧто содержитДля когоПример
READMEКратко: что за программа, как установить, как запуститьВсе (разработчики, пользователи)README.md на GitHub
Руководство пользователяПолное описание всех функций, пошаговые инструкцииКонечные пользователиPDF на 100 страниц
Быстрый старт (Quick Start)Самые основные действия (3-5 шагов)НовичкиКарточка «Первые шаги»
Справка (Help)Встроенная в программу помощь (F1)Все пользователиОкно помощи в приложении
FAQ (Частые вопросы)Ответы на типовые проблемыПользователи, у которых проблемыРаздел на сайте
ВидеоурокиВидео с действиямиВизуалы, ленивые читатьYouTube-канал продукта
Подсказки (Tooltips)Краткие пояснения при наведении на элементВсе пользователиВсплывающее окно «Сохранить»
Интерактивные турыПошаговое обучение прямо в программеНовичкиПодсветка кнопок и стрелки

Структура руководства пользователя (классическая):

РазделСодержаниеПример
1. ВведениеНазначение программы, для кого, основные возможности«Программа предназначена для учёта товаров в магазине»
2. Системные требованияКакие компьютер, ОС, память нужныWindows 10, 4 ГБ RAM, 100 МБ диска
3. Установка и запускКак установить, как запустить«Запустите setup.exe, следуйте инструкции»
4. Обзор интерфейсаСкриншот с подписями: где кнопки, поля, меню«1 — кнопка «Вход», 2 — поле логина»
5. Основные операцииПошаговые инструкции«Как добавить товар: нажмите + → введите название → сохранить»
6. НастройкиИзменение параметров«Как сменить язык интерфейса»
7. Часто задаваемые вопросы (FAQ)Типичные проблемы и их решения«Что делать, если забыл пароль?»
8. Сообщения об ошибкахСписок ошибок и их значения«Ошибка 404 — файл не найден»
9. ГлоссарийОбъяснение терминов«API — способ общения программ»
10. Алфавитный указательБыстрый поиск терминов«Кнопка — 15, Корзина — 23»

Требования к хорошему руководству пользователя (8 правил):

ПравилоЧто значитПример нарушенияХорошее решение
Простой языкБез технического жаргона«Аутентификация не пройдена»«Неверный логин или пароль»
Много скриншотовПользователь видит, что должно бытьТолько текст, ни одной картинкиСкриншот каждого окна
Пошаговые инструкцииНумерованные спискиАбзац текста без номеров1. Сделай это. 2. Сделай то.
Выделение важногоВнимание, примечание, советВсё одинаковым шрифтомКрасное поле, жёлтая рамка
ОглавлениеМожно быстро найти раздел100 страниц без оглавленияОглавление на первой странице
Алфавитный указательПоиск по терминамНет«Корзина — стр. 45»
АктуальностьСоответствует последней версииНаписано про кнопку, которой нетОбновлять при каждом релизе
КраткостьНе слишком длинно10 страниц про запуск программы1 страница про запуск

Онлайн-документация (современный подход):

ПлатформаОсобенностьПлюсыМинусы
ReadTheDocsБесплатно для Open SourceАвтоматическая сборка из GitТребует настройки
GitHub WikiВстроенная вики в репозиторииПросто, бесплатноОграниченные возможности
ConfluenceКорпоративная вики (от Atlassian)Мощная, интеграция с JiraПлатная
MkDocsMarkdown → красивый HTML-сайтПросто, быстро, бесплатноТребуется хостинг
GitBookСовременный, красивые шаблоныУдобный интерфейсПлатная (есть бесплатный план)
NotionБаза знаний с любым контентомОчень гибкий, простойНе специализирован для документации

Как писать хорошие пошаговые инструкции (пример):

Плохая инструкцияХорошая инструкция
«Чтобы добавить товар, перейдите в каталог, нажмите добавить и заполните форму»1. Нажмите на кнопку «Каталог» (в левом меню)
2. Нажмите на кнопку «+ Добавить» (в правом верхнем углу)
3. Заполните поля:
— Название товара (например, «Молоко»)
— Цена (только цифры)
4. Нажмите «Сохранить»


Вопрос 67.

Техническая документация

Техническая документация — это документы, которые описывают программу «под капотом»: архитектуру, модули, API, базы данных, алгоритмы. Её читают разработчики, архитекторы, тестировщики, системные администраторы. В отличие от пользовательской документации, техническая документация требует специальных знаний.

Основные виды технической документации:

ВидКто читаетЧто содержитЗачем
Архитектурная документацияАрхитекторы, ведущие разработчикиСхема компонентов, связи, выбор технологийПонять общую структуру
Документация по APIРазработчики (клиентов)Эндпоинты, параметры, ответы, коды ошибокИнтеграция с другими системами
Документация по базе данныхРазработчики, DBAER-диаграммы, описание таблиц, индексовПонимание структуры данных
Руководство программистаРазработчики (сопровождающие)Описание модулей, классов, функций, сборкаСопровождение и доработка
Руководство администратораСистемные администраторыУстановка, настройка, бэкапы, мониторингРазвёртывание и поддержка
Техническая спецификацияРазработчики, тестировщикиДетальное описание требований (SRS)Разработка и тестирование
Инфраструктурная документацияDevOps, сисадминыСерверы, сеть, CI/CD, мониторингЭксплуатация

Структура архитектурной документации (по стандарту Arc42):

РазделЧто содержитПример
1. Введение и целиЗачем этот документ, для кого«Документ описывает архитектуру интернет-магазина»
2. ОграниченияТехнические, бизнес-ограничения«Должно работать в облаке, бюджет — 1000 $/мес»
3. Контекст системыКак система взаимодействует с внешним миромПользователи, платёжная система, служба доставки
4. Обзор архитектурыСхема компонентов и их связейФронтенд → Бэкенд → БД
5. СценарииГлавные сценарии использованияПокупка товара, регистрация, поиск
6. КомпонентыКаждый компонент: назначение, интерфейс, зависимостиМодуль оплаты: принимает сумму, возвращает статус
7. Кросс-срезные концепцииБезопасность, логирование, кэшированиеВсе API используют HTTPS
8. Технологический стекКакие технологии выбраны и почемуPostgreSQL (надёжность), Redis (кэш)

Структура руководства программиста (что нужно новичку в проекте):

РазделЧто содержитЗачем
1. Как собрать проектКакие команды выполнитьgit clonepip install -r requirements.txt
2. Как запустить проект локальноКоманды для запускаpython main.py
3. Структура проектаКакие папки за что отвечают/src — код, /tests — тесты
4. Описание модулейКаждый модуль: назначение, зависимостиМодуль auth — авторизация, зависит от db
5. API (внутреннее)Как вызывать функции в других модуляхauth.login(username, password)
6. Схема БДТаблицы, поля, связиusers (id, name, email)
7. Настройка окруженияПеременные окружения, конфигиDATABASE_URL=postgresql://...
8. Как запустить тестыКоманда для тестовpytest tests/
9. Как отлаживатьСоветы по отладкеУстановка точек останова, логирование
10. Code styleСтандарты оформленияPEP 8

Структура руководства администратора (для системных администраторов):

РазделЧто содержитПример
1. Системные требованияКакое оборудование нужно4 ядра CPU, 8 ГБ RAM, 100 ГБ SSD
2. УстановкаКак развернуть на сервереDocker, apt-get, systemd
3. НастройкаПеременные окружения, конфигурационные файлыconfig.yml
4. Запуск и остановкаКак запустить, перезапустить, остановитьsystemctl start myapp
5. Резервное копированиеКак делать бэкапы, как восстанавливатьpg_dump каждую ночь
6. МониторингКакие метрики смотреть, гдеPrometheus, Grafana
7. ЛогированиеГде логи, как их читать, уровни/var/log/myapp/
8. ОбновлениеКак обновить версию без простояRolling update
9. Устранение неполадокТипичные проблемы и их решения«Не стартует — проверьте порт 8080»

Документация API (самая важная для интеграции):

ЭлементЧто содержитПример
ОписаниеЧто делает API«API для управления корзиной интернет-магазина»
ЭндпоинтURL и методPOST /api/cart/add
Параметры запросаЧто передать{ "product_id": 123, "quantity": 2 }
ОтветЧто вернёт{ "status": "ok", "cart_total": 500 }
Коды ошибокЧто значит ошибка400 — неверные параметры, 404 — товар не найден
ПримерПример запроса и ответаcurl -X POST https://...

Инструменты для создания технической документации:

ИнструментДля чегоОсобенность
JavadocДокументация из комментариев JavaГенерация HTML
DoxygenДокументация из комментариев (C++, C, Java, Python)Много языков
SphinxДокументация для PythonИспользует reStructuredText
MkDocsДокументация на MarkdownПростой, красивый
Swagger (OpenAPI)Документация REST APIИнтерактивная (можно отправлять запросы)
PlantUMLUML-диаграммы из текстаДиаграммы как код
Draw.io / diagrams.netСхемы, диаграммыБесплатно, онлайн


Вопрос 68.

Руководство пользователя

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

Требования к руководству пользователя (по стандарту ISO/IEC 26514):

ТребованиеЧто значитПочему важно
ПонятностьНаписано на языке пользователя, без технического жаргонаПользователь не должен быть программистом
ПолнотаОписаны все функции программыПользователь не гадает, что делает кнопка
ТочностьИнструкции соответствуют реальной программеУстаревшая документация вредит
СтруктурированностьОглавление, главы, алфавитный указательЛегко найти нужное
НаглядностьСкриншоты, схемы, выделение важногоЛегче воспринимать
ПошаговостьИнструкции в виде нумерованных шаговЛегко следовать

Пример хорошего описания функции в руководстве пользователя:

«Как добавить товар в корзину:

  1. На главной странице найдите нужный товар (можно использовать поиск в верхней части экрана).
  2. Нажмите на кнопку «Купить» под картинкой товара.
  3. После этого товар появится в корзине. Чтобы увидеть корзину, нажмите на иконку корзины в правом верхнем углу (она выглядит как тележка).
  4. Если вы хотите изменить количество товара, нажмите на цифру рядом с товаром и введите новое число.

Примечание: Если товар закончился на складе, кнопка «Купить» будет серой и неактивной.»

Различия между руководством пользователя и другими документами:

ДокументДля когоОбъёмСтильПримеры
Руководство пользователяКонечные пользователи50-500 страницПростой, пошаговый«Нажмите кнопку «Вход»»
Руководство администратораСисадмины30-200 страницТехнический«Настройте переменную окружения DB_HOST»
READMEВсе (кратко)1-5 страницКраткий, сухой«Склонируйте репозиторий, запустите main.py»
FAQПользователи с проблемами5-20 вопросовВопрос-ответ«Что делать, если забыл пароль?»
ВидеоурокиВизуалы1-10 минут видеоДемонстрационный«Смотрим, как оформить заказ»


Вопрос 69.

Руководство программиста

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

Зачем нужно руководство программиста (4 причины):

ПричинаОбъяснение
Смена командыПришли новые разработчики — прочитали и быстро вошли в курс
Сопровождение через годАвтор забыл, как работает код, который сам написал
Передача проекта другому подрядчикуНовая команда понимает, куда смотреть
Большая командаРаспределение работы между модулями

Структура руководства программиста (основные разделы):

РазделЧто содержитВопросы, на которые отвечает
1. Обзор системыНазначение, архитектура, основные компоненты«Из каких частей состоит система?»
2. Сборка и запускКак скомпилировать, собрать, запустить локально«Как запустить проект у себя?»
3. Структура проектаПапки, файлы, их назначение«Где лежит модуль авторизации?»
4. Описание модулейКаждый модуль: назначение, интерфейс, зависимости«Что делает этот модуль? От чего зависит?»
5. Описание классов/функцийКлючевые классы, их методы, параметры«Как вызвать функцию расчёта цены?»
6. Схема базы данныхER-диаграмма, описание таблиц и полей«Где хранится email пользователя?»
7. APIВнутренние и внешние API, параметры, ответы«Как получить список товаров?»
8. Настройка окруженияПеременные окружения, конфигурационные файлы«Как поменять порт сервера?»
9. ТестированиеКак запустить тесты, как написать новый тест«Как проверить, что я ничего не сломал?»
10. ОтладкаИнструменты, методы, логирование«Как найти причину ошибки?»
11. Внесение измененийGitFlow, правила code review«Как добавить новую функцию?»

Пример описания модуля в руководстве программиста:

«Модуль cart (корзина) отвечает за управление корзиной покупок.

Назначение: Добавление, удаление, изменение количества товаров в корзине.

Зависимости:

Основные функции:

Пример использования (в коде):
(здесь будет пример кода, но по условию мы его не пишем)

Примечание: При добавлении товара проверяется, есть ли он на складе. Если товара нет, возвращается ошибка «Товар временно отсутствует».»

Кто пишет руководство программиста:

РольЧто пишетПочему
РазработчикОписание своих модулейТолько он знает детали
Ведущий разработчикОбщую архитектуру, сборкуОн видит всю картину
Технический писательРедактирование, стандартизацияПрофессионально оформляет
DevOpsРаздел про сборку и деплойОн настраивал CI/CD

Альтернативы руководству программиста (современные подходы):

ПодходКак работаетПлюсыМинусы
Самодокументируемый кодПонятные имена, небольшие функции, комментарии по делуВсегда актуальноТребует дисциплины
Документация из комментариевJavadoc, Doxygen генерируют HTMLАвтоматическиНадо писать комментарии
ВикиConfluence, GitHub WikiЛегко редактироватьМожет устареть
Диаграммы как кодPlantUML, Mermaid (диаграммы в текстовом виде)Хранятся в Git, версионируютсяТребует инструментов


Вопрос 70.

Сопровождение программного обеспечения

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

Почему сопровождение такое дорогое (основные причины):

ПричинаОбъяснение
Долгий срок жизниПрограмма может эксплуатироваться 10-20 лет
Накопление технического долгаНедоделки и костыли требуют исправлений
Изменение окруженияВыходят новые ОС, браузеры, версии БД
Рост нагрузкиПользователей становится больше, чем планировали
Новые требованияБизнес меняется, нужны новые функции

Четыре вида сопровождения (по ISO/IEC 12207):

ВидЧто значитПример% от времени
КорректирующееИсправление ошибок, найденных после релиза«Упала кнопка «Купить» при нулевой цене»20%
АдаптивноеАдаптация под новое окружение«Обновили Windows — программа перестала работать»25%
СовершенствующееДобавление новых функций«Заказчик попросил добавить скидочные купоны»50%
ПрофилактическоеРефакторинг, улучшение без изменения поведения«Переписали старый модуль, чтобы он работал быстрее»5%

Подробно о каждом виде сопровождения:

1. Корректирующее сопровождение (исправление ошибок):

Тип ошибокПримерСложностьПриоритет
Критические (Blocker)Программа не запускаетсяСредняяВысший
Логические ошибкиКалькулятор неправильно считаетВысокаяВысокий
Ошибки интерфейсаКнопка съехала влевоНизкаяНизкий
Ошибки производительностиСтраница грузится 10 секундВысокаяСредний
Ошибки безопасностиПароли хранятся в открытом видеВысокаяВысший

2. Адаптивное сопровождение (подстройка под окружение):

Изменение окруженияЧто нужно делатьПример
Обновление ОСПроверить совместимость, исправить ошибкиWindows 10 → Windows 11
Обновление СУБДОбновить драйверы, исправить запросыPostgreSQL 12 → 15
Обновление браузераИсправить CSS/JS, устаревшие APIChrome 100 → 120
Обновление железаНовые процессоры, больше ядерОптимизировать под многопоточность
Изменение законовНовые требования к хранению персональных данныхДобавить согласие на обработку данных

3. Совершенствующее сопровождение (новые функции):

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

4. Профилактическое сопровождение (рефакторинг):

ДействиеЧто значитПример
РефакторингПереписываем код, не меняя поведениеРазбить большую функцию на маленькие
Обновление зависимостейПоднять версии библиотекОбновить устаревшую библиотеку
Улучшение тестовДобавить недостающие тестыНаписать тесты для старого кода
Улучшение документацииОбновить устаревшие разделыДописать комментарии к сложным местам

Процесс сопровождения (как устроен):

ЭтапЧто делаемКто делает
1. Поступление запросаПользователь сообщает об ошибке или просит новую функциюПользователь, менеджер
2. Анализ запросаОцениваем сложность, приоритет, влияние на системуАналитик, разработчик
3. ПланированиеЕсли запрос одобрен — включаем в план следующего релизаМенеджер
4. РеализацияПишем код, тесты, документациюРазработчик
5. ТестированиеПроверяем, что исправили, и ничего не сломалиТестировщик
6. РелизВыкатываем новую версиюDevOps
7. МониторингСледим, не появились ли новые ошибкиВсе

Типичные проблемы сопровождения и их решения:

ПроблемаПроявлениеРешение
Отсутствие документацииНепонятно, как устроен кодДокументировать по ходу исправления
Нет тестовИсправление одной ошибки порождает три новыеПисать тесты перед исправлением
Устаревшие технологииБиблиотека больше не поддерживаетсяПлановый рефакторинг (миграция)
Высокая связанностьЛюбое изменение затрагивает 10 модулейРефакторинг, снижение связанности
Текучесть командыНет знающих людейДокументация, парное программирование

Сравнение разработки и сопровождения (таблица):

ХарактеристикаРазработка новой версииСопровождение существующей
ДлительностьМесяцы — годыГоды — десятилетия
РискиВысокие (новая технология)Низкие (известная система)
ТребованияМеняются (Agile)Стабильные (бизнес-процессы)
КомандаСпециалисты высокой квалификацииПоддержка (включая новичков)
Бюджет20-30% от общего70-80% от общего
ИнтересСоздание новогоРутина, исправление чужих ошибок


Вопрос 71.

Виды сопровождения программного обеспечения

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

Детальная таблица видов сопровождения (с примерами и инструментами):

ВидЧто делаемПримерИнструментыКто отвечает
КорректирующееИсправляем ошибки«При оформлении заказа падает ошибка 500»Баг-трекер (Jira), отладчик (GDB)Команда поддержки, разработчики
АдаптивноеПодстраиваем под новое окружение«Обновили PostgreSQL с 11 на 14»CI/CD, Docker, тестовые стендыDevOps, разработчики
СовершенствующееДобавляем новые функции«Добавить кнопку экспорта в Excel»Git (ветки), CI/CD, JiraРазработчики, аналитики
ПрофилактическоеУлучшаем без изменения поведения«Переписать старый модуль на новый фреймворк»Рефакторинг, тесты, линтерыРазработчики

Как организовать корректирующее сопровождение (процесс):

ШагДействиеВремя
1Пользователь сообщает об ошибке (через форму, email, телефон)5 минут
2Техподдержка проверяет: действительно ли ошибка15 минут
3Создаётся баг в Jira (с приоритетом, описанием, шагами)10 минут
4Разработчик берёт баг в работу1 минута
5Разработчик воспроизводит ошибку локально30 минут — 2 часа
6Исправляет ошибку1 час — 2 дня
7Пишет тест, который ловит эту ошибку30 минут
8Открывает Pull Request5 минут
9Code review, тестирование2 часа — 1 день
10Релиз (выкатка на сервер)30 минут
11Закрытие бага, уведомление пользователя5 минут

Типы ошибок по срочности (слайды):

ПриоритетНазваниеПримерМаксимальное время исправления
P0BlockerПрограмма не запускается1 час
P1CriticalНе работает оплата4 часа
P2MajorОшибка в отчёте (но отчёт можно обойти)2 дня
P3MinorНеправильный цвет кнопки1 неделя
P4TrivialОпечатка в подсказке1 месяц (или не исправлять)

Как организовать адаптивное сопровождение (пример):

СобытиеДействияКто делает
Выход новой версии WindowsПроверить программу на Windows 11Тестировщик
Найдены проблемы (10 ошибок)Завести баги, расставить приоритетыТестировщик
Исправление ошибокРазработчики исправляютРазработчики
Сборка под новую ОСНастроить CI под Windows 11DevOps
РелизВыпустить обновлениеDevOps

Как организовать совершенствующее сопровождение (добавление новых функций):

ШагДействиеОсобенность
1Сбор требований на новую функциюОбщаться с пользователями
2Оценка влияния на существующую системуНе сломаем ли старое?
3Проектирование (как вписать новую функцию в старую архитектуру)Без рефакторинга всей системы
4Реализация в отдельной веткеНе мешать другим
5Тестирование (функциональное + регрессионное)Проверить, что старое работает
6Релиз вместе с другими исправлениямиОбычно раз в месяц

Как организовать профилактическое сопровождение (рефакторинг):

ШагДействиеРиски
1Анализ «запахов кода» (code smells)Можно пропустить важное
2Планирование рефакторинга (отдельная ветка)Уходит время от новых функций
3Изменение кода без изменения поведенияЛегко сломать что-то неожиданное
4Запуск всех тестовДолжно быть зелёное покрытие
5Code reviewКоллеги проверяют
6СлияниеНе влиять на другие задачи

Кто отвечает за сопровождение (роли и обязанности):

РольОбязанности по сопровождению
Менеджер поддержкиПриоритизация запросов, общение с заказчиком
Техподдержка (1 линия)Приём сообщений, первичная диагностика
Техподдержка (2 линия)Воспроизведение ошибок, создание багов в Jira
РазработчикИсправление ошибок, добавление функций
ТестировщикПроверка исправлений, регрессионное тестирование
DevOpsРелизы, обновление окружения
АналитикАнализ новых требований (для совершенствующего)

Метрики сопровождения (как измерить эффективность):

МетрикаЧто измеряетФормулаХорошее значение
MTTR (Mean Time To Repair)Среднее время исправленияСумма времени на все баги / количество багов< 24 часа для критических
Количество багов на релизКачество кодаПодсчёт< 10 критических в месяц
Удовлетворённость пользователейКак пользователи оценивают поддержкуОпрос> 4.5 из 5
Время реакции на заявкуКак быстро ответилиОт заявки до первого ответа< 1 часа (рабочее время)
Пропускная способность командыСколько багов/функций сделано за месяцПодсчётЗависит от команды


Вопрос 72.

Модификация и обновление программного продукта

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

Виды обновлений по масштабу:

ТипЧто меняетсяКак меняется номер версииПример
МинорноеИсправление ошибок, мелкие улучшения1.0 → 1.1Исправлен баг с ценой
Мажорное (крупное)Новые функции, изменения интерфейса1.9 → 2.0Добавлен модуль отчетов
Патч (срочное)Исправление критической ошибки1.0.1 (третья цифра)Исправлена уязвимость
Сервис-пакНабор исправлений и улучшенийWindows SP1, SP2Множество исправлений

Семантическое версионирование (SemVer — стандарт):

Формат: MAJOR.MINOR.PATCH

КомпонентКогда увеличиваетсяПример
MAJORНесовместимые изменения API2.0.0 (переход с 1.x.x на 2.x.x)
MINORДобавлена новая функция (обратно совместимо)1.2.0 (добавлена новая функция, старые работают)
PATCHИсправлены ошибки (обратно совместимо)1.1.5 (исправлены баги)

Пример жизненного цикла версий:

ВерсияЧто изменилосьТип
1.0.0Первый релиз
1.0.1Исправлен баг с авторизациейПэтч
1.1.0Добавлена функция поискаМинор
1.1.1Исправлены мелкие ошибкиПэтч
1.2.0Добавлен экспорт в ExcelМинор
2.0.0Переход на новую архитектуру (несовместимо)Мажор

Стратегии обновления (как доставлять изменения пользователям):

СтратегияЧто значитПлюсыМинусыПример
АвтоматическоеПрограмма сама скачивает и устанавливает обновленияПользователь не думает, всегда свежая версияМожет сломаться без спросаChrome, Windows
УведомлениеПрограмма сообщает о новом обновлении, пользователь решаетПользователь контролируетНекоторые не обновляются годамиИгры в Steam
ПринудительноеБез обновления программа не работает100% актуальная версияЗлые пользователиНекоторые банковские приложения
РучноеПользователь сам скачивает с сайтаПолный контрольМногие не обновляются, старые версии с багамиУстаревшее ПО

Как обновляют серверные приложения (без остановки работы):

МетодЧто значитРиски
Остановка и обновлениеОстанавливаем сервер, обновляем, запускаемВремя простоя (пользователи не могут работать)
Blue-Green развёртываниеДва идентичных сервера: «синий» работает, «зелёный» обновляем, потом переключаемДорого (два сервера)
Rolling updateОбновляем серверы по очереди (один перезапустили, другие работают)Сложность, версии разные одновременно
Canary развёртываниеСначала обновляем 1% серверов, проверяем, потом всеДолго, сложно

Что входит в релиз новой версии (пакет обновления):

КомпонентЧто содержитЗачем
Исполняемые файлыОбновлённые .exe, .dll, .soСама программа
Миграции базы данныхСкрипты изменения структуры БДНе потерять данные
Конфигурационные файлыНовые настройки по умолчаниюНовые параметры
ДокументацияОбновлённое руководствоПользователь знает о новом
Релизные заметкиЧто нового, что исправленоПользователь понимает изменения

Релизные заметки (Release Notes) — пример содержания:

«Версия 2.1.0 (выпущена 15.06.2024)

Новые возможности:

Исправленные ошибки:

Известные проблемы:



Вопрос 73.

Оптимизация программного обеспечения

Оптимизация ПО — это процесс улучшения программы для повышения её производительности, уменьшения потребления ресурсов (памяти, CPU, диска, сети) или увеличения скорости работы. Оптимизация нужна, когда программа работает медленно или потребляет слишком много ресурсов. Но преждевременная оптимизация (до того, как измерили) часто вредна.

Когда нужна оптимизация (признаки):

ПризнакЧто значитЧто измерять
Программа тормозитДолго реагирует на действияВремя отклика
Программа «жрёт» памятьЗанимает гигабайты оперативной памятиОбъём RAM
Программа нагружает CPUПроцессор работает на 100% постоянноЗагрузка CPU
Программа медленно загружаетсяСтарт занимает минутыВремя запуска
Много жалоб пользователей«Что-то у вас всё медленно»Опросы, поддержка

Виды оптимизации (по чему оптимизируем):

ВидЧто улучшаемИнструменты измеренияПример
По скоростиВремя выполнения операцийПрофилировщик (cProfile, Py-Spy)Сократить время поиска с 5 секунд до 0.5
По памятиОбъём оперативной памятиValgrind, heap profilerУменьшить потребление с 500 МБ до 50 МБ
По CPUЗагрузка процессораtop, htop, Activity MonitorСнизить загрузку с 90% до 20%
По дискуКоличество обращений к дискуiostat, perfУменьшить число чтений с диска
По сетиОбъём передаваемых данныхWireshark, NetmonСжать ответы API с 10 МБ до 1 МБ
По энергопотреблениюСколько энергии тратит программа (мобильные устройства)Battery profiler (Android)Увеличить время работы от батареи

Три золотых правила оптимизации:

ПравилоЧто значитПочему
Не оптимизируй преждевременноСначала сделай работающую версию, потом оптимизируйМожно потратить время на то, что не нужно
Измеряй перед оптимизациейСначала измерь, где узкое место, затем оптимизируйБез измерений оптимизируешь не то
Измеряй после оптимизацииПроверь, стало ли лучше (иногда становится хуже)Ошибки в оптимизации

Типичные узкие места (что чаще всего тормозит):

Узкое местоПочему тормозитТипичное улучшение
1База данных (запросы)Нет индексов, сложные JOIN, много запросовДобавить индексы, оптимизировать запросы, кэшировать
2Сеть (API)Медленный интернет, большие объёмы данныхСжимать ответы, уменьшить количество запросов
3Диск (ввод-вывод)Чтение/запись файлов медленнее памятиКэшировать, использовать память
4Алгоритмы (сложность)O(n²) вместо O(n log n)Заменить алгоритм на более эффективный
5Визуализация (интерфейс)Перерисовка экрана слишком частоУменьшить перерисовки, виртуализация
6МногопоточностьБлокировки (locks), ожидания (deadlock)Уменьшить блокировки, асинхронный код

Алгоритмическая оптимизация (самая эффективная):

СложностьНазваниеПример1 000 элементов1 000 000 элементов
O(1)КонстантнаяДоступ по индексу1 мс1 мс
O(log n)ЛогарифмическаяБинарный поиск10 мс20 мс
O(n)ЛинейнаяПростой поиск1 000 мс1 000 000 мс
O(n log n)Линейно-логарифмическаяБыстрая сортировка10 000 мс20 000 000 мс
O(n²)КвадратичнаяПузырьковая сортировка1 000 000 мс10¹² мс (годы)

Профилирование — поиск узких мест (как делать):

ШагДействиеЧто узнаём
1Запустить программу под профилировщикомГде программа проводит больше всего времени
2Смотреть топ функций по времениКакая функция самая медленная
3Смотреть топ функций по количеству вызововКакая функция вызывается слишком часто
4Смотреть использование памятиЕсть ли утечки, какие объекты занимают больше всего
5Принять решение, что оптимизироватьНачинаем с самой нагруженной функции

Пример результата профилирования (текстовое описание):

«Профилирование показало, что 80% времени программа тратит на функцию search_products(). Внутри этой функции 70% времени уходит на базу данных, 30% — на обработку результатов. Оптимизация запроса к БД может дать наибольший эффект.»

Что делать после профилирования (стратегия):

ПриоритетДействиеОжидаемый эффект
1Оптимизировать самый медленный запрос к БД (добавить индекс)Ускорение в 10-100 раз
2Уменьшить количество запросов (объединить несколько в один)Ускорение в 2-10 раз
3Добавить кэш для часто запрашиваемых данныхУскорение в 10-1000 раз для кэшируемых операций
4Оптимизировать алгоритм (O(n²) → O(n log n))Ускорение в 10-100 раз
5Оптимизировать код на микроуровне (последнее, когда всё остальное сделано)Ускорение в 1.1-2 раза

Типичные ошибки при оптимизации (чего делать не надо):

ОшибкаЧто делаютПочему плохо
Ранняя оптимизацияОптимизируют код до того, как написан работающий прототипТратят время на неважное
Оптимизация без измерений«Кажется, это медленно, давай перепишем»Может быть, это и не узкое место
Оптимизация читаемостиКод стал быстрым, но непонятнымТрудно поддерживать, много багов
Микро-оптимизацияМеняют x + y на x - (-y)Выигрыш 0.0001%, код стал нечитаемым


Вопрос 74.

Надёжность программного обеспечения

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

Основные характеристики надёжности (по стандарту ISO 25010):

ХарактеристикаЧто значитКак измеритьПример
БезотказностьНе падает при нормальной работеКоличество сбоев за час работы0 сбоев за 1000 часов
Устойчивость к ошибкамНе падает при некорректном вводеКак программа реагирует на неверные данныеПри пустом пароле — сообщение, а не падение
ВосстанавливаемостьМожет восстановиться после сбояВремя восстановления (MTTR)Восстановление за 15 минут
ДоступностьРаботает нужный процент времени(Время работы) / (Общее время) × 100%99.99% доступности
ЗрелостьКак долго программа работает без измененийКоличество ошибок, найденных после релиза5 ошибок за первый месяц

Количественные метрики надёжности:

МетрикаЧто измеряетФормулаХорошее значение
MTBF (Mean Time Between Failures)Среднее время между сбоямиСуммарное время работы / Количество сбоев> 1000 часов
MTTR (Mean Time To Recovery)Среднее время восстановленияСуммарное время простоя / Количество сбоев< 30 минут
ДоступностьПроцент времени, когда система работаетMTBF / (MTBF + MTTR) × 100%99.9% («три девятки»)
Интенсивность отказов (λ)Количество отказов в единицу времениКоличество отказов / Время< 0.001 в час
Вероятность безотказной работыШанс, что система не откажет за время texp(-λ × t)> 0.999 за 100 часов

Уровни доступности (сколько времени можно не работать):

Доступность«Девятки»Время простоя в годДля каких систем
99%две девятки3.65 дня (87.6 часа)Внутренние системы
99.9%три девятки8.76 часаОбычные сервисы
99.99%четыре девятки52.56 минутыПлатёжные системы
99.999%пять девяток5.26 минутыТелефония, критическая инфраструктура
99.9999%шесть девяток31.5 секундыКосмос, АЭС

Факторы, влияющие на надёжность ПО:

ФакторКак влияетЧто делать
Сложность кодаЧем сложнее, тем больше ошибокУпрощать, разбивать на модули
Качество тестированияЧем лучше тесты, тем надёжнееПисать тесты, использовать TDD
Обработка ошибокЕсли ошибки не обрабатываются — программа падаетОбрабатывать все возможные исключения
НагрузкаПод нагрузкой могут проявляться скрытые ошибкиНагрузочное тестирование
Внешние зависимостиЕсли БД упала — программа упалаРезервирование, retry-механизмы
Количество пользователейС ростом числа пользователей растёт число ошибокМасштабирование, нагрузочное тестирование

Способы повышения надёжности (основные):

СпособЧто значитПример
Резервирование (redundancy)Дублирование критических компонентовДва сервера БД (основной и реплика)
Автоматическое восстановлениеПри сбое система перезапускается самаSupervisor, systemd, Kubernetes
Graceful degradationПри отказе части функций, остальные продолжают работатьЕсли не работает поиск, товары всё равно видны
Failover (переключение на резерв)При сбое автоматически переходим на резервный серверБалансировщик переключает трафик
Heartbeat (контроль жизнеспособности)Программа периодически сообщает «я жива»Мониторинг, health check
Retry (повтор)При временном сбое повторить операциюПовтор запроса к БД через 1 секунду

Что такое отказоустойчивость (fault tolerance):

Отказоустойчивость — это способность системы продолжать работать при отказе одного или нескольких компонентов.

Примеры отказоустойчивых архитектур:

АрхитектураЧто делаетПример
Репликация БДНесколько копий базы данныхMaster-Slave (один пишет, много читают)
КластеризацияНесколько серверов работают как одинLoad balancer распределяет нагрузку
ShardingДанные разбиты на части, каждая на своём сервереУпадёт один шард — потеряется часть данных
Асинхронные очередиЗадачи ставятся в очередь, обрабатываются постепенноОчередь RabbitMQ


Вопрос 75.

Производительность программного обеспечения

Производительность ПО — это скорость выполнения операций и способность обрабатывать определённый объём работы за единицу времени. Это одна из ключевых нефункциональных характеристик. Низкая производительность делает программу неудобной, даже если все функции работают правильно. Пользователь не будет ждать 10 секунд загрузки страницы.

Основные метрики производительности:

МетрикаЧто измеряетКак измеритьХорошее значение
Время отклика (Response Time)Время от отправки запроса до получения ответаЗасечь время< 200 мс для API
Время загрузки страницы (Page Load Time)Полная загрузка страницы в браузереChrome DevTools, Lighthouse< 2 секунд
Пропускная способность (Throughput)Количество операций в секундуКоличество запросов / время> 1000 RPS
Задержка (Latency)Время одного запроса (без обработки)Время в сети< 50 мс
TTFB (Time To First Byte)Время до первого байта ответаЗасечь< 100 мс
Время запуска (Startup Time)Время от клика до готовности программыЗасечь< 5 секунд

Факторы, влияющие на производительность:

ФакторКак влияетЧто можно сделать
АлгоритмыПлохой алгоритм (O(n²)) может быть очень медленнымВыбрать эффективный алгоритм (O(n log n))
База данныхМедленные запросы, отсутствие индексовДобавить индексы, оптимизировать запросы
СетьМедленный интернет, большие объёмы данныхСжимать данные, уменьшить количество запросов
ПамятьНехватка памяти → подкачка на диск (очень медленно)Увеличить память, оптимизировать использование
Диск (I/O)Медленные операции чтения/записиИспользовать SSD, кэшировать в памяти
МногопоточностьБлокировки (locks), гонкиУменьшить блокировки, использовать асинхронность
ВизуализацияЧастые перерисовки экранаВиртуализация списков, отложенная загрузка

Методы улучшения производительности (от самых эффективных к наименее):

МетодЧто делаетОжидаемое улучшениеСложность
КэшированиеХраним часто используемые данные в быстрой памяти10-1000 разСредняя
АсинхронностьНе ждём медленные операции, делаем их в фоне2-10 разСредняя
Оптимизация БДИндексы, нормализация, оптимизация запросов10-100 разСредняя
Сжатие данныхУменьшаем объём передаваемых данных2-10 разНизкая
Оптимизация алгоритмовМеняем O(n²) на O(n log n)10-100 разВысокая
МикрооптимизацииМелкие улучшения в коде1.1-2 разаНизкая

Что такое кэширование и как оно работает:

Тип кэшаГде хранитсяВремя доступаПример использования
Кэш в памяти (RAM)Оперативная память100 нсRedis, Memcached
Кэш на дискеSSD/HDD100 000 нс (в 1000 раз медленнее памяти)Браузерный кэш
CDN (Content Delivery Network)Серверы по всему мируЗависит от географииСтатические файлы (картинки, CSS)
Кэш браузераЖёсткий диск пользователя100 000 нсКартинки, CSS, JS

Пример эффекта от кэширования:

СитуацияВремя ответаУскорение
Без кэша (запрос к БД, сложный JOIN)500 мс
С кэшем (данные уже в памяти)5 мс100×

Что такое асинхронность и параллелизм:

ПодходЧто значитКогда использоватьПример
Синхронный (последовательный)Делаем A, ждём, делаем B, ждёмПростые сценарииЧтение файла, потом его обработка
Асинхронный (неблокирующий)Запустили A, не ждём, делаем B, когда A готов — обрабатываемОперации ввода-вывода (сеть, диск)Загружаем несколько картинок параллельно
Параллельный (многопоточный)Несколько операций выполняются одновременно на разных ядрах CPUВычислительные задачиОбработка большого массива данных по частям

Профилирование производительности (поиск узких мест):

ИнструментДля чегоЧто показывает
cProfile (Python)Профилирование CPUКакая функция сколько времени заняла
Py-Spy (Python)Профилирование без остановки программыГрафик, где программа тратит время
Valgrind (C/C++)Профилирование памяти, утечкиГде выделена память, где утечка
Chrome DevToolsПрофилирование веб-приложенийВремя загрузки, время рендеринга
VisualVM (Java)Профилирование JVMПамять, потоки, CPU
Grafana + PrometheusМониторинг в реальном времениТекущая нагрузка, тренды

Как интерпретировать результаты профилирования (пример):

ФункцияВремя (сек)% от общегоКоличество вызововЧто делать
get_products_from_db45.275%100Оптимизировать запрос, добавить индекс
render_product_list10.117%100Виртуализация списка
parse_user_input3.56%10 000Микрооптимизации (не критично)

Типичные ошибки при оптимизации производительности:

ОшибкаПримерПравильно
Оптимизация без измерений«Кажется, этот цикл медленный, перепишем»Сначала измерить профилировщиком
Ранняя оптимизацияОптимизируем код, пока программа ещё не написанаСделать работающую версию, потом оптимизировать
Микрооптимизация главного узлаМеняем x++ на ++x (экономия 0.0001%), а БД не трогаемОптимизировать БД (может дать 1000%)
Оптимизация читаемостиКод стал быстрым, но непонятнымОптимизировать только критичные места


Вопрос 76.

Безопасность программного обеспечения

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

Основные угрозы безопасности ПО:

УгрозаЧто делает злоумышленникПримерКак защититься
Несанкционированный доступПолучает доступ к данным, к которым не долженПодбор пароляДвухфакторная аутентификация
SQL-инъекцияВставляет SQL-код в поле ввода, чтобы украсть данные' OR '1'='1 в поле входаПараметризованные запросы
XSS (межсайтовый скриптинг)Вставляет вредоносный JavaScript на страницу«<script>alert(1)</script>» в комментарийЭкранирование вывода
CSRF (подделка запроса)Заставляет пользователя выполнить действие без его ведомаПереход по ссылке «Сменить пароль»CSRF-токены
Переполнение буфераПишет данные за пределами выделенной памятиДлинная строка ломает программуКонтроль границ, безопасные языки
Подделка данныхИзменяет данные при передачеИзменить цену товара в запросеШифрование, подписи
Отказ в обслуживании (DoS)Перегружает сервер запросами, чтобы он упалТысячи запросов в секундуRate limiting, WAF
Перехват трафикаСлушает сеть, крадёт паролиWi-Fi в кафеШифрование (HTTPS)
Утечка данныхОшибка в конфигурации раскрывает данныеS3-бакет с открытым доступомПроверка конфигурации
Социальная инженерияОбманывает человека, чтобы тот выдал парольЗвонок от «техподдержки»Обучение сотрудников

Три основных принципа безопасности (CIA Triad):

ПринципЧто значитПример нарушенияЗащита
Конфиденциальность (Confidentiality)Доступ к данным только у тех, у кого есть правоПароль хранится в открытом видеШифрование, контроль доступа
Целостность (Integrity)Данные не могут быть изменены без разрешенияЗлоумышленник изменил цену товараКонтрольные суммы, подписи
Доступность (Availability)Данные доступны, когда они нужныDoS-атака, сервер упалРезервирование, защита от DoS

Что такое аутентификация и авторизация (разница):

ПонятиеЧто значитПримерОшибка
АутентификацияПроверка, что пользователь — это тот, за кого себя выдаётВвод логина и пароляСлабая аутентификация (только пароль)
АвторизацияПроверка, есть ли у пользователя право на действиеПроверка, что пользователь — администраторОшибка: пользователь может видеть чужие заказы

Лучшие практики безопасности (что нужно делать обязательно):

ПрактикаЧто значитПример
Шифрование в покоеХранить данные в зашифрованном видеПароли хранить только хешированными (bcrypt)
Шифрование при передачеПередавать данные только по зашифрованным каналамHTTPS, TLS 1.3
Минимизация привилегийДавать пользователю ровно столько прав, сколько нужноПользователь может читать свои заказы, но не чужие
Валидация вводаПроверять все данные, которые приходят от пользователяНе доверять полю «id», проверять, что это число
Экранирование выводаЗащищать от XSS«<script» → &lt;script&gt;
Безопасная работа с БДИспользовать параметризованные запросыSELECT * FROM users WHERE id = $1
Логирование действийЗаписывать важные действия (логины, удаления)Записать «Пользователь admin удалил запись №123»
Обновление зависимостейРегулярно обновлять библиотеки, чтобы не было известных уязвимостейОбновить библиотеку с уязвимостью CVE-2024-1234

Что такое уязвимость и как её ищут:

ЭтапЧто делаютРезультат
1Сканирование портовУзнаём, какие сервисы работают
2Автоматический сканер уязвимостей (Nessus, OpenVAS)Список известных уязвимостей
3Ручной пентест (этичный взлом)Неизвестные уязвимости
4Анализ кода (статический)Поиск потенциальных проблем в коде
5Анализ кода (динамический)Запуск программы с тестами безопасности

Примеры известных уязвимостей (из реальной жизни):

НазваниеЧто былоКак исправили
Heartbleed (2014)Утечка памяти в OpenSSLОбновить OpenSSL
Log4Shell (2021)Уязвимость в библиотеке Log4j (Java)Обновить Log4j
Spectre/Meltdown (2018)Аппаратные уязвимости процессоровМикрокод, патчи ОС
Spring4Shell (2022)Уязвимость в Spring Framework (Java)Обновить Spring

OWASP Top 10 (10 главных угроз для веб-приложений — актуальный список 2021):

УгрозаКраткое описание
1Нарушение контроля доступаПользователь видит чужие данные
2Криптографические ошибкиПароли хранятся небезопасно
3Инъекции (SQL, NoSQL, LDAP)Злоумышленник вставляет вредоносный код
4Небезопасная конфигурацияСтандартные пароли, лишние порты
5Уязвимости аутентификацииСлабые пароли, сессии не защищены
6Межсайтовый скриптинг (XSS)Внедрение JavaScript на страницу
7Уязвимости компонентовСтарые библиотеки с уязвимостями
8Ошибки при логированииНе логгируем важные действия
9SSRF (Server-Side Request Forgery)Сервер делает запросы туда, куда не надо
10Подделка запросов (CSRF)Пользователь выполняет действие без ведома

Что делать, если уязвимость найдена (процесс):

ШагДействиеСрок
1Подтвердить уязвимость (воспроизвести)1 час
2Оценить критичность (Blocker/Critical/Major)1 час
3Найти исправление (патч, изменение кода)1 день
4Исправить в отдельной ветке (hotfix)1 день
5Протестировать исправление1 день
6Выпустить срочный релиз (патч)1 час
7Уведомить пользователей (если нужно)1 час


Вопрос 77.

Защита информации в программных системах

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

Уровни защиты информации (4 уровня):

УровеньЧто защищаетПримеры мер
ЗаконодательныйПравовые нормыЗакон «О персональных данных» (152-ФЗ)
ОрганизационныйПроцессы и людейДоговор о неразглашении, пропускная система
АппаратныйОборудованиеМежсетевые экраны, HSM (аппаратное шифрование)
ПрограммныйПрограммы и данныеАнтивирус, шифрование, DLP-системы

Основные методы защиты информации:

МетодЧто делаетПримерЭффективность
ИдентификацияПользователь называет себяВвод логинаНизкая
АутентификацияПользователь доказывает, что это онВвод пароля, отпечаток пальцаСредняя
АвторизацияПроверка правПользователь может только читатьВысокая
ШифрованиеПреобразование данных в нечитаемый видAES-256Высокая
Контроль доступаОграничение, кто что может делатьСписки ACLСредняя
Аудит (логирование)Запись всех действийЛог: «Пользователь X удалил файл Y»Высокая
Резервное копированиеВосстановление после сбоя или атакиЕжедневные бэкапыВысокая
DLP (Data Loss Prevention)Предотвращение утечки данныхБлокировка отправки файлов на почтуСредняя

Типы аутентификации (по факторам):

ФакторЧто используетсяПримерБезопасностьУдобство
То, что вы знаетеПароль, PIN-кодПароль «qwerty123»НизкаяВысокое
То, что вы имеетеФизический объектUSB-токен, смарт-карта, телефонСредняяСреднее
То, что вы естьБиометрияОтпечаток пальца, лицо, радужка глазаВысокаяВысокое

Что такое двухфакторная аутентификация (2FA):

Двухфакторная аутентификация — это комбинация двух разных факторов. Например:

Шифрование (как работает):

Вид шифрованияЧто значитПримерКогда использовать
СимметричноеОдин ключ для шифрования и расшифровкиAES-256, DES, RC4Хранение данных на диске
АсимметричноеПара ключей: публичный (шифрует) и приватный (расшифровывает)RSA, ECCПередача данных, TLS/HTTPS
ХешированиеОдностороннее преобразование (нельзя расшифровать)SHA-256, bcryptХранение паролей

Что такое HSM (Hardware Security Module):

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

Где HSM применяетсяЗачем
БанкиДля работы с банковскими картами (PIN)
Платёжные системыДля шифрования транзакций
Государственные системыДля ЭЦП (электронная подпись)
Крупные корпорацииДля хранения секретов (пароли, ключи)

Что такое DLP (Data Loss Prevention):

DLP — это система предотвращения утечек данных. Она контролирует, что пользователи копируют, отправляют, печатают.

Что контролирует DLPПример действия
EmailОтправить файл на личную почту → заблокировать
USB-накопителиСкопировать на флешку → заблокировать
МессенджерыОтправить скриншот в Telegram → заблокировать
ПечатьРаспечатать документ → заблокировать
Облачные хранилищаЗагрузить в Google Drive → заблокировать

Законодательство в области защиты информации (Россия):

ЗаконЧто регулируетДля кого
152-ФЗ «О персональных данных»Сбор, хранение, обработка персональных данныхЛюбые компании с клиентами
187-ФЗ «О безопасности КИИ»Защита критической информационной инфраструктурыБанки, энергетика, транспорт
149-ФЗ «Об информации»Общие принципыВсе
ГОСТ Р 57580Безопасность информационных системБанки

Что нужно для соответствия 152-ФЗ (для интернет-магазина):

ТребованиеЧто сделать
Политика обработки ПДнДокумент на сайте
Согласие на обработкуГалочка «Я согласен»
Хранение ПДн на территории РФСерверы в России
Защита ПДн (шифрование)HTTPS, хеширование паролей
Уведомление об утечкеСообщить в РКН в течение 24 часов


Вопрос 78.

Оценка качества программного обеспечения

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

Модели качества (стандарты):

СтандартЧто описываетКогда использовать
ISO 250108 характеристик качества (функциональность, надёжность, производительность…)Международный стандарт
ISO 9126Устаревшая версия ISO 25010Заменён на 25010
ГОСТ Р ИСО/МЭК 25010-2015Российский аналог ISO 25010Госзаказ
CMMIЗрелость процессов разработкиКрупные компании
McCall11 факторов качества (старая модель)Образование, история

Модель качества ISO 25010 (8 характеристик с подхарактеристиками):

ХарактеристикаПодхарактеристикиЧто проверяем
Функциональная пригодностьПолнота, правильность, уместностьВсе ли функции работают правильно
НадёжностьБезотказность, готовность, восстанавливаемостьНе падает ли программа
ПроизводительностьВремя отклика, пропускная способностьБыстро ли работает
Удобство использованияПонятность, обучаемость, эстетикаЛегко ли пользоваться
БезопасностьКонфиденциальность, целостность, неотказуемостьЗащищены ли данные
СопровождаемостьМодульность, повторяемость, анализируемостьЛегко ли менять код
СовместимостьСосуществование, взаимодействиеРаботает ли с другими системами
ПереносимостьУстанавливаемость, заменяемостьРаботает ли на разных ОС

Методы оценки качества (как оценивать):

МетодЧто делаетКто проводитРезультат
ТестированиеПроверка программы в действииТестировщикиСписок найденных багов
Анализ кодаСтатический анализ, code reviewРазработчики, линтерыОценка качества кода
Измерение метрикСбор количественных показателейИнструменты (SonarQube)Цикломатическая сложность, покрытие тестами
Экспертная оценкаПриглашённые эксперты смотрят программуВнешние экспертыОтчёт с замечаниями
Опрос пользователейПользователи оценивают удобствоМаркетологи, UXNPS, SUS
Сравнение с аналогамиСравниваем с конкурентамиАналитикиОтчёт о сравнении

Метрики качества (количественные показатели):

МетрикаЧто измеряетФормулаХорошее значение
Плотность дефектовКоличество ошибок на размер кодаОшибки / 1000 строк кода< 1
Покрытие тестамиКакой % кода проверен тестамиСтроки в тестах / Все строки × 100%> 70%
Время между сбоями (MTBF)НадёжностьЧасы работы / Количество сбоев> 1000 часов
Время исправления (MTTR)Скорость реакцииСумма времени простоя / Количество сбоев< 24 часа
Индекс удобства (SUS)ЮзабилитиОпросник из 10 вопросов> 70
Цикломатическая сложностьСложность кодаКоличество путей в функции< 10
Процент дублированияПовторы кодаДублированные строки / Все строки × 100%< 5%

Что такое статический анализ кода:

Статический анализ — это проверка кода без его запуска. Инструмент просматривает код и находит потенциальные проблемы.

Тип проблем, которые находит статический анализПример
Потенциальные ошибкиПеременная не инициализирована
Стиль кодаОтступы, пробелы, длина строки
БезопасностьКонкатенация в SQL (риск инъекции)
Дублирование кодаОдин и тот же фрагмент в двух местах
СложностьФункция слишком длинная или вложенная
Мёртвый кодНеиспользуемые переменные, функции

Инструменты для оценки качества:

ИнструментДля чегоЧто даёт
SonarQubeСтатический анализ, качество кодаОценка кода (A,B,C,D,E), список проблем
JaCoCoПокрытие тестами (Java)Процент покрытых строк
pytest-covПокрытие тестами (Python)Отчёт в HTML
SUS опросникЮзабилитиОценка удобства от 0 до 100
LighthouseПроизводительность вебОценка от 0 до 100


Вопрос 79.

Критерии качества программного продукта

Критерии качества — это конкретные, измеримые требования, по которым можно определить, хороша программа или нет. Они конкретнее характеристик качества. Если характеристика — это «производительность», то критерий — «время загрузки страницы не более 2 секунд».

Критерии качества по ISO 25010 (с примерами измеримых требований):

ХарактеристикаКритерий (измеримое требование)Как проверитьХорошее значение
Функциональная пригодность100% функций реализовано в соответствии с ТЗПрогнать тесты100% тестов пройдено
НадёжностьДоступность 99.9%Измерить простой за месяц< 8.8 часов простоя в год
ПроизводительностьВремя загрузки главной страницы < 2 секундИзмерить в Chrome DevTools< 2 секунд
Удобство использования90% пользователей выполняют задачу без подсказокЮзабилити-тест> 90%
БезопасностьНет критических уязвимостейСканер уязвимостей0 критических
СопровождаемостьПокрытие тестами > 70%JaCoCo, pytest-cov> 70%
СовместимостьРаботает в Chrome, Firefox, SafariПрогнать тесты в разных браузерахВсе тесты пройдены
ПереносимостьУстанавливается на Windows и LinuxПопробовать установитьУспешная установка

Как превратить характеристику в критерий (примеры):

ХарактеристикаРазмытое требование (не критерий)Конкретный критерий (измеримый)
Производительность«Программа должна работать быстро»«Время ответа API не более 200 мс при 1000 запросов в секунду»
Надёжность«Программа не должна падать»«MTBF > 1000 часов, доступность > 99.9%»
Безопасность«Программа должна быть безопасной»«Пароли хранятся в виде bcrypt-хешей, передача только по HTTPS»
Удобство«Программа должна быть удобной»«90% новых пользователей оформляют заказ с первой попытки за 3 минуты»

Приоритеты критериев (что важнее):

ПриоритетКритерийПочему
ВысшийФункциональная пригодностьЕсли функция не работает — всё остальное не важно
ВысокийБезопасностьУтечка данных может убить бизнес
ВысокийНадёжностьЕсли программа падает — ей нельзя доверять
СреднийПроизводительностьМедленно, но работает — лучше, чем не работает
НизкийУдобство использованияНекрасиво, но работает — пользователи привыкнут
НизкийСовместимостьЕсли не работает в Safari, скажут «откройте в Chrome»

Пример оценки программы по критериям (оценка от 1 до 5):

КритерийВесОценкаВзвешенная оценка
Все функции по ТЗ5525
Время ответа < 200 мс3412
Доступность 99.9%4312
Покрытие тестами > 70%2510
Нет критических уязвимостей5210
Итого1969 (из 95)



Вопрос 80.

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

Стандарты качества — это официальные документы, которые описывают требования к процессам разработки, документации и самому программному продукту. Они помогают разным компаниям говорить на одном языке, упрощают госзаказ и аудит. Стандарты бывают международные (ISO/IEC), национальные (ГОСТ) и отраслевые.

Основные международные стандарты качества ПО:

СтандартЧто описываетКто используетГод принятия
ISO 25010Характеристики качества продукта (8 штук)Все (международный)2011 (актуален)
ISO 12207Процессы жизненного цикла ПО (основные, вспомогательные, организационные)Разработчики, заказчики1995 (обновляется)
ISO 9001Система менеджмента качества (не только ПО)Любые компании1987 (обновляется)
CMMIЗрелость процессов разработки (уровни 1-5)Крупные компании (банки, аутсорс)2002 (актуален)
ГОСТ 19.xxx (ЕСПД)Программная документация (устаревший, но используется в госзаказе)Госзаказ, оборонка1970-1980 (устарел)
ГОСТ 34.xxxАвтоматизированные системыГосзаказ1990 (устарел)
IEEE 829Документация тестированияКрупные проекты1998 (обновлён)
ISO 27001Информационная безопасностьЛюбые компании2005 (актуален)

Подробно об ISO 25010 (качество продукта):

ХарактеристикаКоличество подхарактеристикОсновная идея
Функциональная пригодность3Программа делает то, что нужно
Надёжность4Программа не падает
Производительность3Программа работает быстро
Удобство использования5Программой легко пользоваться
Безопасность4Данные защищены
Сопровождаемость4Код легко менять
Совместимость2Работает с другими системами
Переносимость3Работает на разных ОС

Подробно об ISO 12207 (процессы ЖЦ):

Группа процессовПроцессыЧто делают
ОсновныеПриобретение, поставка, разработка, эксплуатация, сопровождениеСоздание и использование ПО
ВспомогательныеДокументирование, верификация, валидация, аудитОбеспечение качества
ОрганизационныеУправление проектом, управление инфраструктурой, обучениеУправление ресурсами

Уровни зрелости CMMI (от хаоса до оптимизации):

УровеньНазваниеЧто значитПример компании
1Начальный (Initial)Процессы непредсказуемы, хаосСтартап, маленькая команда
2Управляемый (Managed)Процессы задокументированы, повторяемыСредняя компания
3Определённый (Defined)Процессы стандартизированы для всей компанииКрупная компания
4Количественно управляемыйПроцессы измеряются статистическиБанк, аутсорсер
5Оптимизирующий (Optimizing)Постоянное улучшение процессовЛидеры рынка

Российские стандарты (ГОСТ) — что осталось актуальным:

СтандартЧто описываетАктуален лиКогда используют
ГОСТ 19.101-77Виды документовФормально даГосзаказ (по требованию)
ГОСТ 19.201-78Техническое заданиеФормально даГосзаказ
ГОСТ 34.601-90Стадии создания АСФормально даГосзаказ
ГОСТ Р ИСО/МЭК 25010-2015Качество ПОДа (актуальный)Все (добровольно)

Что такое сертификация по стандартам (зачем нужна):

СтандартЗачем сертифицироватьсяСложностьСтоимость
ISO 9001Для доверия клиентов, участия в тендерахСредняя300-500 тыс. руб
CMMIДля крупных заказчиков (банки, гос)ВысокаяОт 1 млн руб
ISO 27001Для работы с персональными даннымиВысокая500-800 тыс. руб
ГОСТ 19Для госзаказа (обязательно)Средняя200-400 тыс. руб

Как выбрать стандарт для своего проекта:

СитуацияКакой стандарт нужен
Своя разработка (не для госзаказа)Никакой (использовать лучшие практики)
Участие в тендере (коммерческий)ISO 9001 (часто требуется)
Госзаказ (Россия)ГОСТ 19 или ГОСТ 34 (обязательно)
Крупный заказчик (банк)CMMI (уровень 2-3)
Работа с персональными даннымиISO 27001 + 152-ФЗ
Международный контрактISO 12207 + ISO 25010



Вопрос 81.

Управление проектом разработки программного обеспечения

Управление проектом (Project Management) — это применение знаний, навыков, инструментов и методов для достижения целей проекта в рамках заданных ограничений (сроки, бюджет, качество, объём). Управление проектом включает планирование, организацию, контроль и мотивацию команды.

Основные ограничения проекта (треугольник проекта):

ОграничениеЧто значитВзаимосвязь
Объём (Scope)Что должно быть сделано (функции, задачи)Чем больше объём, тем больше сроки и бюджет
Сроки (Time)Когда нужно закончитьЧем меньше сроки, тем меньше объём или больше бюджет
Бюджет (Cost)Сколько денег можно потратитьЧем меньше бюджет, тем меньше объём или больше сроки
Качество (Quality)Насколько хорошо сделаноЭкономия на качестве снижает объём, но увеличивает риски

Управление проектом — основные области знаний (по PMBOK):

Область знанийЧто включаетПример
Управление интеграциейСвязывает все процессыСоздание устава проекта, плана
Управление содержаниемЧто входит в проект, а что нетТребования, ТЗ
Управление срокамиПланирование и контроль времениДиаграмма Ганта
Управление стоимостьюБюджетирование, контроль затратСмета, отчёты
Управление качествомОбеспечение качества, контрольПланы тестирования
Управление ресурсамиЛюди, оборудованиеРаспределение задач
Управление коммуникациямиОбмен информациейЕжедневные встречи, отчёты
Управление рискамиВыявление и снижение рисковРеестр рисков
Управление закупкамиПривлечение подрядчиковТендеры, контракты
Управление стейкхолдерамиРабота с заинтересованными лицамиРегулярные встречи

Жизненный цикл проекта (фазы управления):

ФазаЧто делаемРезультат
ИнициацияОпределяем цели, зачем проект, кто заказчикУстав проекта
ПланированиеСоставляем план, график, бюджет, рискиПлан управления проектом
ИсполнениеВыполняем работы по плануПродукт (промежуточный)
Мониторинг и контрольСравниваем факт с планом, корректируемОтчёты, изменения
ЗавершениеСдача продукта, закрытие контрактовАкт приёмки

Документы управления проектом (основные):

ДокументЧто содержитКто создаёт
Устав проектаЦели, бюджет, сроки, ответственныеСпонсор, менеджер
План управленияКак будем управлять (сроками, рисками, качеством)Менеджер
Расписание (Гант)Задачи, сроки, зависимостиМенеджер
Реестр рисковЧто может пойти не так, вероятность, мерыМенеджер
БюджетСтатьи расходов, плановые и фактическиеМенеджер, бухгалтер
Отчёты о статусеЧто сделано, что в работе, проблемыМенеджер (еженедельно)

Инструменты управления проектом (сравнение):

ИнструментДля чегоПлюсыМинусы
JiraУправление задачами, AgileМощный, интеграция с GitСложный, дорогой
TrelloПростые доски (Kanban)Простой, бесплатныйМало функций
YouTrackБаг-трекер, AgileБыстрый, от JetBrainsМеньше интеграций
MS ProjectДиаграммы Ганта, ресурсыПрофессиональныйДорогой, только Windows
AsanaУправление задачамиУдобный интерфейсОграничения в бесплатной версии
RedmineOpen SourceБесплатныйСтарый интерфейс

Ключевые метрики управления проектом:

МетрикаЧто измеряетФормулаХорошее значение
CPI (Cost Performance Index)Эффективность бюджетаEV / AC> 1 (меньше 1 — перерасход)
SPI (Schedule Performance Index)Эффективность сроковEV / PV> 1 (меньше 1 — отставание)
Velocity (Agile)Скорость команды (Story Points за спринт)Сумма SP за спринтСтабильна или растёт
Отклонение от графикаНа сколько дней отстаёмПлан — Факт< 5% от срока
Burn-down chartСколько осталось до конца спринтаГрафикТенденция к нулю

Что такое EV, AC, PV (метод освоенного объёма):

ТерминРасшифровкаЧто значитПример (за 1 месяц)
PVPlanned ValueПлановая стоимость работ по плануДолжны были сделать на 100 000 руб
EVEarned ValueОсвоенная стоимость (сколько сделали фактически)Сделали на 80 000 руб
ACActual CostФактические затратыПотратили 90 000 руб

Выводы по метрикам:




Вопрос 82.

Распределение ролей в команде разработки ПО

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

Основные роли в команде разработки (таблица):

РольЗона ответственностиТипичные задачиНеобходимые навыки
Product OwnerЧто делать (приоритеты)Формирование бэклога, приёмка работыПонимание бизнеса, коммуникация
Project ManagerКогда делать (сроки, бюджет)Планирование, отчёты, рискиОрганизационные навыки
Team LeadКак делать (технически)Распределение задач, code review, менторствоТехнические + лидерские
Аналитик (BA)Сбор и формализация требованийИнтервью, написание ТЗ, диаграммыАналитическое мышление
АрхитекторСтруктура системыВыбор технологий, архитектурные решенияГлубокое техническое знание
РазработчикНаписание кодаРеализация функций, тесты, багиПрограммирование
Тестировщик (QA)Проверка качестваТест-кейсы, ручное/автоматическое тестированиеВнимательность, скрупулёзность
DevOpsИнфраструктура, CI/CDСерверы, сборка, деплой, мониторингLinux, сети, облака
Технический писательДокументацияРуководства пользователя, админа, APIПисьменная речь

Примеры распределения ролей для разных размеров команды:

Команда 3 человека (стартап):

СотрудникОсновная рольСовмещает
АРазработчик (бэкенд)DevOps, архитектор
БРазработчик (фронтенд)Тестировщик
ВProduct OwnerАналитик, Project Manager

Команда 10 человек (средний проект):

РольКоличество человек
Product Owner1
Project Manager1
Team Lead1
Аналитик1
Разработчики (бэкенд)2
Разработчики (фронтенд)2
Тестировщики1
DevOps1 (совмещает с администрированием)

Команда 50 человек (крупный проект):

РольКоличество человек
Product Owner2 (разные модули)
Project Manager2
Team Lead4 (по модулям)
Аналитики5
Архитекторы2
Разработчики25
Тестировщики8
DevOps3
Технические писатели2

Что такое RACI-матрица (распределение ответственности):

RACI — это таблица, где для каждой задачи указываются роли и их уровень участия.

R — Responsible — Исполнитель — Кто делает работу
A — Accountable — Ответственный — Кто принимает решение, подписывает
C — Consulted — Консультируется — Кого спрашивают перед действием
I — Informed — Информируется — Кого ставят в известность

Пример RACI-матрицы для задачи «Внедрение новой функции»:

ЗадачаPMPOTLDevQADevOps
Собрать требованияARCI
Согласовать бюджетARC
СпроектироватьCIRCIC
Написать кодICR
ПротестироватьICR
Выкатить на серверIAR



Вопрос 83.

Подготовка программного продукта к релизу

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

Этапы подготовки к релизу (чек-лист):

ЭтапЧто проверяемКто отвечаетСрок
1Код-фриз (code freeze)Запрет изменений, кроме критическихPM/TLЗа 1-2 недели до релиза
2Функциональное тестированиеВсе функции работают по ТЗQAЗа 1-2 недели
3Регрессионное тестированиеНе сломали ли старое новымQAЗа 1 неделю
4Нагрузочное тестированиеВыдерживает ли ожидаемую нагрузкуQA, DevOpsЗа 1 неделю
5Тестирование безопасностиНет критических уязвимостейSecurity QAЗа 1 неделю
6Тестирование установкиУстановка работает на целевых ОСQAЗа 3 дня
7Сборка релизной версииСоздание установщика или контейнераDevOpsЗа 1 день
8Релизные заметкиЧто нового, что исправленоPM, техписЗа 2 дня
9Обновление документацииРуководства соответствуют новой версииТехписЗа 2 дня
10Резервное копированиеПеред обновлением — бэкап данныхDevOpsЗа 1 час до релиза
11РелизВыкладка пользователямDevOpsВ назначенное время
12Мониторинг после релизаСледим за ошибками, нагрузкойDevOps, QA24-48 часов

Что такое код-фриз (code freeze):

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

Тип код-фризаЧто можно менятьКогда используют
МягкийИсправления багов, мелкие правкиЗа 1 неделю до релиза
ЖёсткийТолько критические баги (Blocker)За 2-3 дня до релиза
ПолныйНичего (только в экстренных случаях)За 1 день до релиза

Типы релизов (как выкладываем):

ТипЧто делаемРискиКогда использовать
Big BangВсё сразу, все пользователиВысокиеНебольшая аудитория
RollingПостепенно (сначала 1%, потом 10%, потом 100%)НизкиеВеб-сервисы
CanaryСначала на тестовую группу, потом на всехНизкиеКрупные системы
Blue-GreenДва окружения: синее работает, зелёное обновляем, потом переключаемОчень низкиеКритичные системы
Feature ToggleРелиз есть, но новая функция скрыта под флагомНизкиеA/B-тестирование

Релизный чек-лист (для DevOps перед выкладкой):

ПроверкаСтатус
1Все тесты (unit, integration, system) прошли+
2Все критические баги (P0, P1) исправлены+
3Регрессионные тесты пройдены+
4Нагрузочные тесты пройдены (при необходимости)+
5Документация обновлена+
6Релизные заметки написаны+
7Резервные копии созданы+
8План отката (rollback) готов+
9Команда оповещена о времени релиза+
10Мониторинг настроен после релиза+

Что делать, если релиз пошёл не так (план отката):

ПроблемаДействиеВремя
Критический баг в новой версии (падения)Откат на предыдущую версию5-15 минут
Медленная работа после релизаОтключить новые функции (feature toggle)5 минут
Ошибка в данных (неправильно сохранились)Восстановить из резервной копии30-60 минут
Проблема только у части пользователейCanary-релиз — откатить для всех10 минут



Вопрос 84.

Подготовка программного продукта к внедрению

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

Этапы подготовки к внедрению (план внедрения):

ЭтапЧто делаемКто отвечаетДлительность
1Планирование внедренияСоставляем график, назначаем ответственныхPM1-2 дня
2Подготовка инфраструктурыУстанавливаем сервера, настраиваем сетьDevOps, сисадмин1-2 недели
3Установка ПОСтавим программу на серверы и ПКDevOps, сисадмин1-3 дня
4Миграция данныхПереносим данные из старых системРазработчик, аналитик1-5 дней
5Обучение пользователейПроводим тренинги, вебинары, раздаём инструкцииТехпис, менеджер1-5 дней
6Тестовый запуск (пилот)Запускаем на ограниченной группе пользователейQA, PM1-7 дней
7Исправление проблемПравим ошибки, найденные в пилотной эксплуатацииРазработчики1-5 дней
8Промышленный запускЗапуск для всех пользователейDevOps, PM1 день
9Сопровождение после запускаПомощь пользователям, исправление срочных баговТехподдержка, разработчики1-4 недели

Стратегии внедрения (как переходить со старой системы на новую):

СтратегияЧто делаемПлюсыМинусыКогда использовать
ПараллельнаяСтарая и новая системы работают одновременноБезопасно (есть откат)Дорого (две системы), двойная работаКритичные системы (банки)
ПоэтапнаяВнедряем по частям (сначала один модуль, потом другой)Управляемый риск, быстрая обратная связьДолгоБольшие системы
Революционная (Big Bang)Переход в один моментБыстроВысокий рискНебольшие системы
ПилотнаяСначала на одной группе, потом на всехТестирование на реальных данныхДолгоВсе системы

Пример плана внедрения для интернет-магазина (поэтапная стратегия):

ЭтапЧто внедряемПользователиДлительность
1Каталог товаров (только просмотр)Все1 день
2Корзина и оформление заказаТестовая группа (10%)3 дня
3Корзина и оформление заказаВсе1 день
4Личный кабинет и история заказовВсе2 дня
5Интеграция с учётной системойСотрудники склада2 дня
6Отчёты и аналитикаМенеджеры2 дня

Подготовка пользователей к внедрению (чему учим):

Тип обученияФорматДлительностьДля кого
Очный тренингГрупповое занятие с демонстрацией1-2 дняКлючевые пользователи
Веб-семинарОнлайн-лекция с демонстрацией2-4 часаВсе пользователи
ВидеоурокиЗаписанные короткие видео (3-5 минут)По требованиюВсе
Письменная инструкцияPDF или печатное руководствоСамостоятельноВсе
Подсказки в программеВсплывающие подсказки при первом использованииПостоянноВсе
Чат-бот поддержкиОтветы на частые вопросыПостоянноВсе

Миграция данных (что нужно знать):

Этап миграцииЧто делаемРиски
Анализ старых данныхСмотрим, какие данные есть, в каком форматеДанные могут быть неполными
Очистка данныхУдаляем дубликаты, исправляем ошибкиМожно удалить нужное
Преобразование данныхПереводим в формат новой системыПотеря данных при конвертации
Перенос данныхЗагружаем в новую системуОбрыв соединения, частичный перенос
ПроверкаСравниваем старые и новые данные (выборочно)Не все ошибки найдены

Проверка после внедрения (что проверяем):

Что проверяемКак проверяемПриемлемый результат
1Все функции работаютПрогнать smoke-тесты100%
2Данные не потеряныСравнить количество записей100%
3Новые данные сохраняютсяСоздать запись, найти её100%
4ПроизводительностьЗамерить время операцийСоответствует ТЗ
5Пользователи могут работатьНаблюдениеНет жалоб в первые часы

План отката (rollback) — на случай, если внедрение пошло не так:

ШагВремя
1Остановить новую систему1 минута
2Запустить старую систему5 минут
3Восстановить данные из резервной копии (созданной перед внедрением)30-60 минут
4Проверить, что старая система работает10 минут
5Сообщить пользователям о возврате к старой системе5 минут



Вопрос 85.

Подготовка программного продукта к передаче заказчику (приёмка)

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

Этапы приёмки ПО заказчиком:

ЭтапЧто делаемКто участвуетРезультат
1Предварительная приёмкаДемонстрация всех функций заказчикуРазработчик, заказчикСписок замечаний
2Устранение замечанийИсправляем ошибки, найденные заказчикомРазработчикИсправленная версия
3Приёмочное тестирование (UAT)Заказчик сам тестирует по своему сценариюЗаказчик, QAАкт тестирования
4Согласование документацииПередаём все документы (ТЗ, руководства)Менеджеры, техписДокументы подписаны
5Подписание акта приёмкиОфициальное подтверждениеЗаказчик, исполнительПодписанный акт
6Передача исходного кода (если по договору)Выгрузка кода в репозиторий заказчикаDevOpsДоступ к репозиторию

Что проверяет заказчик при приёмке (типовой чек-лист):

Что проверяемВопросы заказчика
1Соответствие ТЗВсе ли функции из ТЗ работают?
2Полнота документацииЕсть ли руководство пользователя? инструкция админа?
3Удобство использованияПонятно ли, как пользоваться?
4ПроизводительностьНе тормозит ли программа?
5НадёжностьПадает ли при нестандартных действиях?
6БезопасностьНет ли очевидных дыр?
7Внешний видТак ли выглядит, как обсуждали?

Акт приёмки (структура документа):

РазделСодержаниеПример
1. ЗаголовокНазвание документа, номер, дата«Акт сдачи-приёмки работ №12 от 15.06.2024»
2. СтороныЗаказчик и ИсполнительООО «Ромашка» и ИП Иванов
3. ПредметКакая работа принята«Разработка программного продукта «Система учёта товаров»»
4. Соответствие ТЗПрограмма соответствует ТЗ«Согласно Техническому заданию №5 от 01.02.2024»



Вопрос 86.

Понятие программного обеспечения и программного продукта

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

Определения:

ПонятиеОпределениеПример
Программное обеспечение (ПО)Совокупность программ, данных и документации, предназначенная для решения задач на компьютереОперационная система Linux, драйвер принтера, библиотека функций
Программный продуктПО, готовое к поставке пользователю, обладающее определёнными потребительскими качествамиMicrosoft Office, 1С:Бухгалтерия, Photoshop

Отличия программного продукта от ПО (таблица):

ХарактеристикаПрограммное обеспечение (ПО)Программный продукт
НазначениеДля внутреннего использования или как часть другого продуктаДля продажи или массового распространения
Потребительские свойстваНе требуются (важна только функциональность)Обязательны (удобство, надёжность, документация)
ПоддержкаМожет отсутствоватьОбязательна (техподдержка, обновления)
ЛицензияЛюбая (вплоть до отсутствия)Чётко определена (пользователь знает свои права)
ДокументацияМинимальная (для разработчиков)Полная (для пользователей и администраторов)
ПримерБиблиотека для работы с JSONAdobe Photoshop

Программный продукт как товар (особенности):

Особенность товара «программный продукт»ОбъяснениеПоследствия
НематериальностьНельзя потрогать, только результат работыСложно оценить качество до покупки
Неразрывность производства и потребленияСоздаётся один раз, потребляется многократноОгромная маржинальность при масштабировании
ИзменчивостьМожет обновляться, исправлятьсяПокупатель получает не финальный, а постоянно меняющийся продукт
Эффект масштабаКопирование — бесплатноСебестоимость одной копии стремится к нулю
Сетевой эффектЦенность растёт с числом пользователейМессенджер бесполезен без других пользователей

Составляющие программного продукта (что входит в поставку):

КомпонентЧто входитПример
Исполняемые файлы.exe, .dll, .so, .jarsetup.exe
ДанныеБазы данных, конфигурации, шаблоныБД клиентов, настройки по умолчанию
ДокументацияРуководство пользователя, админа, APIPDF-файлы, встроенная справка
ЛицензияТекст лицензионного соглашения (EULA)Лицензионный договор
Программа установкиИнсталляторsetup.msi, install.sh
ОбновленияПатчи, новые версииservice pack, точка-релиз

Классификация программных продуктов по способу распространения:

ТипЧто значитПримерМодель оплаты
КоробочныйФизический носитель (DVD, флешка) в упаковкеWindows (старые версии), игры в магазинеЕдиновременная покупка
Цифровая дистрибуцияСкачивание из интернетаSteam, App Store, Google PlayПокупка, подписка
SaaS (Software as a Service)Использование через браузер, арендаGoogle Docs, Figma, SalesforceЕжемесячная/ежегодная подписка
Open SourceСвободное распространение с исходным кодомLinux, Firefox, GIMPБесплатно (доход от поддержки)
FreemiumБазовая версия бесплатно, за расширенную — платаDropbox, Zoom, LinkedInБесплатно + платные опции
AdwareБесплатно, но с рекламойМногие мобильные игрыРекламодатели

Жизненный цикл программного продукта (как товара):

ЭтапЧто происходитМаркетинговые задачи
ВнедрениеПродукт выходит на рынокИнформирование, создание спроса
РостРастёт число пользователейРасширение функционала, масштабирование
ЗрелостьРост замедляется, максимум пользователейУдержание, улучшение качества, снижение цены
СпадПользователи уходят к конкурентамВыпуск новой версии, вывод с рынка

Примеры успешных программных продуктов (что сделало их успешными):

ПродуктУспех благодаряМодель
WindowsЛицензирование OEM (поставлялась с компьютерами)Коробочная + OEM
Microsoft OfficeИнтеграция с Windows, формат .doc как стандартКоробочная → подписка (365)
Adobe PhotoshopСтал стандартом в индустрии (ниша профессионального дизайна)Коробочная → подписка (Creative Cloud)
SlackУдобство, интеграции, модель freemiumFreemium → подписка
LinuxОткрытость, сообщество, бесплатностьOpen Source



Вопрос 87.

Современные принципы разработки программного обеспечения

Современные принципы разработки ПО — это набор идей, практик и подходов, которые сформировались в ответ на неэффективность старых методов (каскадной модели). Главные принципы: гибкость, итеративность, постоянное тестирование, близость к заказчику, автоматизация. Эти принципы легли в основу Agile-манифеста и современных методологий.

Манифест Agile (2001 год) — 4 ценности:

ЦенностьЧто значитПротивоположность (не Agile)
1Люди и взаимодействие важнее процессов и инструментовКоманда решает, а не регламентСлепое следование стандартам без учёта контекста
2Работающий продукт важнее исчерпывающей документацииКод, который работает, важнее 100-страничной документацииСначала документ, потом код (водопад)
3Сотрудничество с заказчиком важнее согласования контрактаОбщение, а не бумаги«Всё по ТЗ, даже если это неудобно»
4Готовность к изменениям важнее следования плануМеняем планы под реальностьЖёсткий план на год вперёд

12 принципов Agile (кратко):

ПринципСмысл
1Наивысший приоритет — удовлетворение заказчикаДелаем то, что нужно, а не то, что запланировали
2Приветствуем изменения требований даже в конце разработкиГибкость важнее жёсткости
3Поставляем работающее ПО часто (от 2 недель до 2 месяцев)Маленькие релизы лучше больших
4Бизнес и разработчики работают вместе каждый деньНет стены между заказчиком и командой
5Работаем с мотивированными профессионаламиДоверие, а не контроль
6Лицом к лицу — лучший способ передачи информацииЖивое общение эффективнее документов
7Работающее ПО — главный измеритель прогрессаНе отчёты, а работающий код
8Устойчивый темп работы (не авралы)Переработки снижают качество
9Техническое совершенство улучшает гибкостьЧистый код легче менять
10Простота — искусство не делать лишнегоМинимум ненужных функций
11Самоорганизующиеся команды дают лучшие архитектурыКоманда сама решает, как делать
12Регулярная рефлексия («ретроспектива») для улучшенияКаждые 2 недели — как стать лучше

Другие современные принципы (не из Agile, но важные):

ПринципЧто значитПроявление
DRY (Don’t Repeat Yourself)Не повторяй кодОбщие функции в одном месте
KISS (Keep It Simple, Stupid)Простота важнее навороченностиНе усложняй там, где можно просто
YAGNI (You Aren’t Gonna Need It)Не делай то, что может не понадобитьсяНе пишем код для «гипотетических» потребностей
Continuous Integration (CI)Интегрируйся часто (каждый день)Все коммиты в общую ветку ежедневно
Continuous Delivery (CD)Всегда готов к релизуАвтоматические тесты и сборка
Test-Driven Development (TDD)Сначала тест, потом кодНачинаем с написания падающего теста
Pair ProgrammingДва разработчика за одним компьютеромОдин пишет, второй смотрит
Code ReviewПроверка кода коллегами перед слияниемPull Request на GitHub

Сравнение традиционных и современных принципов:

АспектТрадиционные принципы (1970-1990)Современные принципы (2000+)
ПланированиеЖёсткий план на весь проектГибкое планирование (спринты)
ДокументацияПодробная, обязательнаяМинимальная, «живая»
ТестированиеВ конце проектаПостоянно (TDD, CI)
ИзмененияНежелательны, дорогиПриветствуются
Роль заказчикаВ начале и в концеВ команде (Product Owner)
РелизыРаз в годРаз в 2 недели (или чаще)
АрхитектураПроектируется целиком в началеЭволюционирует (рефакторинг)

Что изменилось в разработке за последние 20 лет (главные тренды):

ТрендЧто изменилосьПример
Agile вместо WaterfallВместо жёсткого плана — короткие итерацииScrum, Kanban
DevOpsРазработка и эксплуатация вместеCI/CD, Docker, Kubernetes
Облачные технологииНе нужно покупать серверыAWS, Google Cloud, Azure
МикросервисыВместо монолита — сотни маленьких сервисовNetflix, Amazon
Автоматизация тестированияТесты запускаются автоматическиGitHub Actions, Jenkins
Открытый кодИспользование Open Source библиотекnpm, PyPI, Maven Central



Вопрос 88.

Жизненный цикл программного обеспечения Дубл.

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

Фазы жизненного цикла (управленческий взгляд):

ФазаЧто происходитКлючевые решенияКто принимает
ИнициацияОценка бизнес-ценности, анализ рынкаЗапускать или нет проектБизнес-спонсор
РазработкаСоздание продуктаВыбор методологии, технологийРуководитель проекта, архитектор
ВнедрениеПередача пользователямСтратегия внедрения (поэтапно или сразу)Руководитель проекта, заказчик
ЭксплуатацияИспользование пользователямиМодернизация или заменаБизнес-владелец
Вывод из эксплуатацииОтключение системыМиграция данных, уведомление пользователейБизнес-владелец, IT-директор

Стандарты, описывающие ЖЦ (сравнение):

СтандартЧто описываетДля когоАктуален ли
ISO/IEC 12207Процессы ЖЦ (основные, вспомогательные, организационные)Международные проектыДа
ГОСТ 34.601-90Стадии создания автоматизированных системГосзаказ РФФормально да
ГОСТ 19.102-77Стадии разработки ПО (ЕСПД)Госзаказ РФУстарел, но формально действует
IEEE 1074Процессы ЖЦ (адаптирован под практику)Крупные компанииДа

Процессы ISO 12207 (детально):

ГруппаПроцессЧто делает
ОсновныеПриобретениеЗаказчик покупает или заказывает ПО
ПоставкаИсполнитель передаёт ПО заказчику
РазработкаСоздание ПО
ЭксплуатацияИспользование ПО пользователями
СопровождениеПоддержка и модификация
ВспомогательныеДокументированиеЗапись информации
ВерификацияПроверка соответствия требованиям
ВалидацияПроверка, что решает задачи пользователя
АудитПроверка соответствия стандартам
ОрганизационныеУправление проектомПланирование, контроль
Управление конфигурациейУчёт версий
Управление инфраструктуройОбеспечение ресурсами
ОбучениеПовышение квалификации

Экономика жизненного цикла (распределение затрат):

ФазаПроцент затрат (классический проект)Процент затрат (Agile-проект)
Анализ требований10%5% (в каждом спринте)
Проектирование20%10% (в каждом спринте)
Разработка (код)25%35% (в каждом спринте)
Тестирование20%25% (в каждом спринте)
Внедрение5%5%
Сопровождение (первые 3 года)20%20%
Итого (разработка + 3 года сопровождения)100%100%

Когда выводить ПО из эксплуатации (признаки устаревания):

ПризнакЧто значитЧто делать
Высокая стоимость сопровождения> 80% бюджета уходит на поддержкуРассмотреть замену
Устаревшие технологииЯзык/платформа больше не поддерживаютсяМиграция
Несоответствие современным требованиям безопасностиКритические уязвимости, не подлежащие исправлениюСрочная замена
Потеря компетенцийНет специалистов, которые могут поддерживатьПереписать на современном стеке
Появление более эффективного аналогаКонкурент делает лучшеПереход на готовое решение

Пример расчёта совокупной стоимости владения (TCO) за 10 лет:

Статья расходовГод 1 (разработка)Годы 2-10 (эксплуатация)Итого
Разработка2 000 000 руб02 000 000 руб
Техподдержка0100 000 × 9 = 900 000900 000 руб
Серверы и хостинг60 00060 000 × 9 = 540 000600 000 руб
Обучение персонала100 0000100 000 руб
Итого2 160 000 руб1 440 000 руб3 600 000 руб



Вопрос 89.

Основные модели жизненного цикла ПО Дубл.

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

Подробное сравнение пяти моделей (добавлена Lean-модель):

МодельЭтапыПлюсыМинусыКогда применять
Каскадная (Waterfall)Анализ → Проект → Код → Тест → ВнедрениеПростота, чёткие этапыОшибки дороги, нет гибкостиСтабильные требования, госзаказ, авиация
ИтеративнаяЦиклы: анализ+проект+код+тест для части функционалаЗаказчик видит прогрессТребует хорошей архитектурыКрупные проекты с уточняемыми требованиями
Спиральная (Spiral)Риски → Разработка → План → повторКонтроль рисковСложно, дорогоВысокорисковые проекты (космос, инновации)
Agile (Scrum, XP)Спринты 1-4 недели, работающий продукт каждый спринтБыстрая реакция на измененияМинимум документацииВеб-сервисы, стартапы
LeanУстранение потерь, быстрая доставка ценностиМинимум лишней работыТребует дисциплиныПроекты с ограниченным бюджетом

Гибридные модели (сочетают лучшие черты):

Гибридная модельЧто сочетаетПример применения
Water-Scrum-FallКаскад (требования, документация) + Scrum (разработка) + Каскад (внедрение)Крупные компании с регуляторными требованиями
Scrum-banScrum (спринты) + Kanban (визуализация потока, WIP limit)Команды, где нужна гибкость и предсказуемость
SAFe (Scaled Agile Framework)Agile для больших команд (50+ человек)Крупные корпорации

SAFe (Scaled Agile Framework) — уровни:

УровеньЧто управляетДлительностьКто участвует
Портфель (Portfolio)Стратегия, бюджет, направления развитияКварталы-годыРуководство
Программа (Program)Крупный проект (ART — Agile Release Train)10-12 недельМенеджеры программ
Команда (Team)Спринты (Scrum или Kanban)1-2 неделиКоманды разработки

Как выбрать модель (алгоритм для руководителя):

ВопросЕсли ДАЕсли НЕТ
Требования стабильны и понятны с самого начала?Каскад или V-ModelAgile, итеративная
Высокие риски (ошибка может стоить жизни или миллионов)?СпиральнаяAgile
Нужна быстрая реакция на рынок (стартап)?Agile (Scrum, XP)Каскад
Команда маленькая (до 10 человек)?AgileКаскад или SAFe
Есть жёсткие регуляторные требования (авиация, медицина, госзаказ)?Каскад, V-ModelAgile (чистый)
Проект крупный (100+ человек, несколько лет)?SAFe (Agile для крупных)Чистый Scrum

Типичные ошибки при выборе модели:

ОшибкаПримерПоследствиеКак избежать
Слепое следование Agile без учёта контекстаИспользуем Scrum, но заказчик хочет подробный план на годКонфликт, недовольствоАдаптировать под заказчика
Слепое следование каскаду в меняющемся окруженииФиксируем ТЗ, через 3 месяца рынок изменилсяПродукт никому не нуженВыбрать Agile
«Клоунский гибрид»Берём худшее из каскада и худшее из AgileХаосИспользовать проверенные гибриды



Вопрос 90.

Требования к программному обеспечению Дубл.

Требования к ПО — это описание того, что должна делать программа и какими свойствами обладать. Это основа всего проекта. Плохо собранные требования — причина 70% провалов проектов ПО. Вопрос уже рассматривался, здесь — углубление про уровни требований и их взаимосвязь.

Пирамида требований (от бизнеса до кода):

1.Бизнес-требования (Vision, Business Case)
2.Пользовательские требования (User Stories, Use Cases)
3.Функциональные требования (SRS)
4.Нефункциональные требования (NFR)
5.Технические требования (спецификации, протоколы)

Каждый уровень подробно:

УровеньЧто описываетПримерДля кого
Бизнес-требованияКакие бизнес-цели достигаются«Увеличить онлайн-продажи на 30%»Владельцы бизнеса
Пользовательские требованияЧто пользователи могут делать«Пользователь может добавить товар в корзину»Пользователи, заказчик
Функциональные требованияКонкретные функции системы«Система при нажатии «Купить» проверяет наличие товара на складе»Аналитики, разработчики
Нефункциональные требованияСвойства качества«Время ответа API < 200 мс»Архитекторы, разработчики
Технические требованияТехнологии, протоколы«Использовать протокол HTTPS, TLS 1.3»Разработчики, DevOps

Пример развёртывания требований (от бизнеса до кода):

ШагУровеньФормулировка
1Бизнес-требование«Увеличить продажи через интернет-магазин»
2Пользовательское требование«Пользователь должен иметь возможность быстро оформить заказ в 1 клик»
3Функциональное требование«Система предоставляет кнопку «Быстрый заказ» на странице товара, которая автоматически заполняет данные из последнего заказа»
4Нефункциональное требование«Время оформления быстрого заказа не более 10 секунд»
5Техническое требование«Данные последнего заказа хранятся в cookie с именем last_order, время жизни 30 дней»

Классификация требований по происхождению (откуда берутся):

ИсточникЧто даётПримерПриоритет
ЗаказчикБизнес-цели, ключевые функции«Должен быть отчёт по продажам»Высший
ПользователиУдобство, эффективность«Чтобы ввести дату, можно было выбрать из календаря»Высокий
РегуляторыСоответствие законам«Хранить персональные данные на серверах в РФ»Высший
РазработчикиТехнические ограничения«Использовать PostgreSQL 14+»Средний
КонкурентыФункции-аналоги«Как у конкурента, тоже сделать быстрый поиск»Низкий
СтейкхолдерыДополнительные требования«Интеграция с нашей учётной системой»Высокий

Что такое «заморозка требований» (requirements freeze):

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

Тип заморозкиКогда наступаетЧто можно менять
Мягкая заморозкаПосле утверждения ТЗТолько изменения, не влияющие на сроки и бюджет
Жёсткая заморозкаНачало кодированияТолько критические ошибки
Полная заморозкаЗа 2 недели до релизаНичего

Типичные ошибки при работе с требованиями:

ОшибкаПримерПоследствиеКак избежать
Предположения вместо фактов«Мы думали, вам нужен экспорт в Excel, а вы хотели CSV»ПеределкаУточнять, прототипировать
Непроверяемые требования«Программа должна быть удобной»Непонятно, когда сдаватьКонкретизировать: «90% пользователей выполняют задачу за 2 минуты»
Золотое сечениеТребование выполняет только один пользователь, но на нём настаиваютТрата ресурсов на неважноеОценить бизнес-ценность
Потеря источникаНе помним, кто попросил эту функциюНепонятно, нужна ли онаТрассировка требований (матрица)



Вопрос 91.

Классификация требований к ПО Дубл.

Классификация требований — это их разделение на группы по определённым признакам. Основное деление — на функциональные и нефункциональные требования. Дополнительные классификации помогают управлять требованиями и приоритизировать их.

Основная классификация (функциональные vs нефункциональные):

Тип требованийЧто описываетВопросКто задаёт
Функциональные (FR)Что система делает (функции)«Что?»Пользователь, заказчик
Нефункциональные (NFR)Как система это делает (свойства)«Как? Насколько?»Архитектор, разработчик

Расширенная классификация (по стандарту ISO 25010):

КатегорияПодкатегорииПример
Функциональная пригодностьПолнота, правильность, уместность100% функций из ТЗ реализованы
НадёжностьБезотказность, готовность, восстанавливаемостьДоступность 99.9%
ПроизводительностьВремя отклика, пропускная способность, использование ресурсов1000 RPS, время < 200 мс
Удобство использованияПонятность, обучаемость, эстетика90% пользователей выполняют задачу без подсказок
БезопасностьКонфиденциальность, целостность, неотказуемостьПароли хешированы (bcrypt)
СовместимостьСосуществование, взаимодействиеРаботает с 1С версии 8.3+
СопровождаемостьМодульность, повторяемость, анализируемостьПокрытие тестами > 70%
ПереносимостьУстанавливаемость, заменяемостьРаботает на Windows, Linux, macOS

Классификация по приоритету (MoSCoW):

БукваРасшифровкаЧто значитПример% от общего числа
MMust haveОбязательно, без этого система не имеет смыслаАвторизация, добавление в корзину60%
SShould haveОчень важно, но можно отложить на первый релиз? НетВосстановление пароля20%
CCould haveПриятно, но не критичноРекомендации товаров15%
WWon’t haveНе делаем в этой версии (в следующей)Интеграция с 1С5%

Классификация по стабильности:

ТипЧто значитПримерКак часто меняются
СтабильныеНе меняются в течение проектаТребования законодательстваРедко (годы)
ЭволюционирующиеМеняются по мере пониманияИнтерфейс, удобствоЧасто (спринт к спринту)
ВолатильныеМеняются быстро, под рынокМаркетинговые функции (акции, скидки)Очень часто

Классификация по происхождению:

ИсточникТип требованийПример
БизнесБизнес-требования, OKR«Увеличить конверсию в покупку на 15%»
ПользователиПользовательские истории«Как пользователь, я хочу видеть статус заказа»
ЗаконРегуляторные требования«Хранение персональных данных на территории РФ»
ТехническиеТехнические ограничения«Не использовать библиотеки GPL в коммерческом продукте»
СтандартыТребования соответствия«Документация по ГОСТ 19»

Классификация по способу проверки:

ТипКак проверятьПримерИнструменты
Автоматически проверяемыеНаписать тест«При вводе 2+2=4»JUnit, pytest
Ручные проверяемыеДействие человека«Кнопка «Купить» должна быть зелёной»Ручное тестирование
ИзмеряемыеИзмерить инструментом«Время ответа < 200 мс»JMeter, Lighthouse
ЭкспертныеОценка эксперта«Интерфейс должен быть современным»Экспертная оценка



Вопрос 92.

Техническое задание на разработку программного обеспечения Дубл.

Юридическая сила ТЗ (почему важно):

СитуацияБез ТЗС ТЗ
Заказчик говорит: «А я хотел, чтобы кнопка была красной»Спор, переделка за счёт исполнителяСмотрим ТЗ: «кнопка зелёная» → доплата за изменение
Заказчик добавляет новую функциюПриходится делать бесплатно (или спорить)«Это не в ТЗ, давайте дополнительное соглашение»
Исполнитель сделал не тоДоказать сложноАкт приёмки сверяется с ТЗ
Срыв сроков«Слово давали»В ТЗ написаны сроки, есть ответственность

Кто и зачем подписывает ТЗ:

ПодписьКтоЧто подтверждаетПоследствия подписи
ЗаказчикРуководитель или уполномоченныйСогласен с требованиями, обязуется принять работу по этим критериямНельзя потом сказать «я не то имел в виду»
ИсполнительРуководитель разработкиБерётся выполнить за указанные сроки и бюджетНельзя сказать «мы не знали, что так сложно»
СогласующиеЮрист, главный инженер (в крупных проектах)Документ не противоречит законам и стандартамЗащита от претензий госорганов

Какие разделы ТЗ имеют юридическую силу в первую очередь:

РазделПочему важенЧто должно быть чётко
Цель разработкиОпределяет, зачем проектИзмеримый бизнес-результат
Функциональные требованияЧто должно работатьКонкретные функции, а не «удобный интерфейс»
Сроки и этапыКонтроль выполненияКонкретные даты, а не «в течение месяца»
Порядок приёмкиКак принимают работуКто подписывает, сколько времени на проверку
Стоимость и порядок оплатыФинансыСумма, аванс, этапы оплаты, штрафы
Ответственность сторонЧто за срыв сроков, некачественную работуШтрафы, гарантийные обязательства

Типовые ошибки в ТЗ, которые приводят к спорам:

ОшибкаКак выглядитПоследствиеКак исправить
Расплывчатые формулировки«Интерфейс должен быть интуитивно понятным»Непонятно, когда считать готовым«90% пользователей выполняют задачу за 1 минуту без подсказок»
Отсутствие приоритетовВсе функции помечены как «обязательные»Спор, что важнееMoSCoW (Must/Should/Could/Won’t)
Нет описания граничных случаев«Пользователь вводит логин и пароль»Что при пустом поле? Что при 1000 символов?Описать обработку исключений
Нет порядка изменения ТЗЗаказчик добавляет функции, разработчик делаетБесконечная разработкаПункт «Порядок изменений ТЗ»
ТЗ без подписейЭлектронкой переслали, но не подписалиНе юридически значимоПодписать сканы, приложить к договору

Пример плохой и хорошей формулировки в ТЗ:

АспектПлохо (спорно)Хорошо (чётко)
Скорость«Программа должна работать быстро»«Время загрузки главной страницы не более 2 секунд при скорости интернета 10 Мбит/с»
Надёжность«Программа не должна падать»«Доступность 99.9% (не более 8.76 часов простоя в год). В случае падения — автоматический перезапуск менее чем за 1 минуту»
Безопасность«Программа должна быть безопасной»«Пароли хранятся в виде bcrypt-хешей. Передача данных только по HTTPS. Защита от SQL-инъекций»
Внешний вид«Красивый дизайн»«Скриншот макета (приложение 1). Цвета: #FFFFFF, #000000, #3366FF. Шрифт: Roboto 14px»



Вопрос 93.

Структура технического задания Дубл.

Структура ТЗ — это стандартный набор разделов, который обеспечивает полноту документа. ГОСТ 19.201-78 описывает структуру для госзаказа. В коммерческой практике используется адаптированная структура, но ключевые разделы сохраняются. Вопрос уже рассматривался, здесь — углубление о том, как адаптировать структуру под разные типы проектов.

Структура ТЗ по ГОСТ 19.201-78 (для госзаказа):

РазделСодержание
1ВведениеНаименование, область применения
2Основания для разработкиДокумент, на основании которого ведётся разработка
3Назначение разработкиФункциональное и эксплуатационное назначение
4Требования к программеФункциональные, к надёжности, к информационной совместимости
5Требования к программной документацииСостав документации
6Технико-экономические показателиОжидаемая эффективность
7Стадии и этапы разработкиЧто и когда делаем
8Порядок контроля и приёмкиКак принимают

Адаптированная структура ТЗ для коммерческой разработки (12 разделов):

РазделЧто содержитОбязательность
1Цель разработкиБизнес-задачи, которые решает продуктОбязательно
2Функциональные требованияСписок функций с приоритетами (MoSCoW)Обязательно
3Нефункциональные требованияПроизводительность, безопасность, надёжностьОбязательно
4Требования к интерфейсуВнешний вид, сценарии, мобильная версияОбязательно
5Требования к документацииРуководства, инструкцииОбязательно
6Состав проектаКакие модули и компоненты входятОбязательно
7Технологический стекЯзыки, фреймворки, базы данныхОбязательно
8Этапы и срокиДорожная карта с датамиОбязательно
9Порядок приёмкиКак проверяем, кто подписываетОбязательно
10Стоимость и порядок оплатыЦена, аванс, этапы оплатыОбязательно
11Ответственность сторонШтрафы, гарантии, форс-мажорОбязательно
12Порядок изменений ТЗКак вносить изменения, цена измененийРекомендуется

Как адаптировать структуру под тип проекта (примеры):

Тип проектаКакие разделы усилитьКакие разделы сократить
Мобильное приложениеТребования к интерфейсу (адаптивность, жесты), требования к производительности (батарея)Технико-экономические показатели
Веб-сервис (API)Требования к API (Swagger/OpenAPI), требования к безопасности (JWT, OAuth), нагрузочное тестированиеТребования к интерфейсу (если нет UI)
Сайт-визиткаТребования к интерфейсу (дизайн), SEO-требованияНефункциональные требования (минимально)
Корпоративная система (ERP, CRM)Интеграционные требования, требования к безопасности, требования к аудиту, обучение пользователейТехнологический стек (заказчику не важно)
ГосзаказВсё по ГОСТ 19, полная документация, порядок приёмкиЛюбые сокращения недопустимы

Пример оглавления ТЗ для интернет-магазина (коммерческая структура):

text

1. Цель разработки
   1.1. Бизнес-цели
   1.2. Целевая аудитория
   1.3. Ключевые показатели эффективности (KPI)

2. Функциональные требования
   2.1. Каталог товаров (FR-01...FR-15)
   2.2. Корзина и оформление заказа (FR-16...FR-25)
   2.3. Личный кабинет (FR-26...FR-35)
   2.4. Административная панель (FR-36...FR-50)

3. Нефункциональные требования
   3.1. Производительность (NFR-01...NFR-05)
   3.2. Безопасность (NFR-06...NFR-12)
   3.3. Надёжность (NFR-13...NFR-15)

4. Требования к интерфейсу
   4.1. Дизайн (ссылка на макет в Figma)
   4.2. Адаптивность (мобильная, планшетная версии)

5. Технологический стек
   5.1. Бэкенд: Python + Django
   5.2. Фронтенд: React
   5.3. База данных: PostgreSQL
   5.4. Хостинг: Yandex Cloud

6. Этапы и сроки
   6.1. Этап 1: Прототип (15.03.2025)
   6.2. Этап 2: MVP (15.05.2025)
   6.3. Этап 3: Полная версия (15.08.2025)

7. Порядок приёмки
   7.1. Критерии приёмки
   7.2. Процедура приёмочного тестирования (UAT)
   7.3. Акт приёмки

8. Порядок изменений ТЗ
   8.1. Инициация изменений
   8.2. Оценка стоимости и сроков
   8.3. Дополнительное соглашение

Приложение 1. Макеты интерфейса (Figma)
Приложение 2. Схема базы данных (ER-диаграмма)
Приложение 3. Глоссарий



Вопрос 94.

Порядок разработки и согласования технического задания

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

Полный процесс разработки и согласования ТЗ (8 этапов):

ЭтапЧто делаемКто участвуетДлительностьРезультат
1. Сбор исходных данныхИнтервью, анкетирование, изучение бизнес-процессовАналитик, заказчик1-2 неделиСписок требований (сырой)
2. Подготовка черновика ТЗФормализация требований, структурированиеАналитик1-2 неделиЧерновик ТЗ (для внутреннего ревью)
3. Внутреннее ревьюПроверка полноты, реализуемости, оценка трудоёмкостиАрхитектор, разработчики, QA2-3 дняЗамечания к черновику
4. Передача заказчикуОтправка черновика заказчикуМенеджер1 деньЧерновик у заказчика
5. Согласование с заказчиком (итерации)Обсуждение, уточнение, исправление замечанийАналитик, заказчик2-4 неделиУточнённые версии (v0.2, v0.3…)
6. Финальная версияУчёт всех правок, проверка, согласованиеАналитик, заказчик1-3 дняФинальный черновик
7. Юридическая проверкаСоответствие законам, договоруЮрист1-2 дняПравки (если есть)
8. ПодписаниеОбе стороны подписывают ТЗРуководители1 часПодписанный ТЗ

Роли в процессе разработки ТЗ:

РольОбязанностиЧто делает
АналитикВедущий процесса, пишет ТЗИнтервьюирует, структурирует, пишет, правит
ЗаказчикПредоставляет требования, утверждаетОтвечает на вопросы, проверяет черновики, подписывает
АрхитекторПроверяет реализуемость, оценивает трудоёмкостьЧитает черновик, говорит «это сложно, давайте проще»
РазработчикОценивает трудозатратыПримерная оценка: функция X — 5 дней
QAПроверяет проверяемость требований«Это требование нельзя проверить, переформулируйте»
МенеджерУправляет сроками и коммуникациейСогласовывает встречи, следит за дедлайнами
ЮристПроверяет юридическую чистотуНет ли противоречий с договором, законами

Типовые проблемы при согласовании ТЗ и их решения:

ПроблемаПроявлениеРешение
«Мы не знаем, чего хотим»Заказчик не может сформулировать требованияПрототипирование, «давайте сделаем прототип, посмотрим»
«Сделайте как у них»Сравнение с конкурентом без деталейПопросить скриншоты, видео, конкретные сценарии
Бесконечные итерацииЗаказчик правит бесконечноЗафиксировать лимит итераций (например, 3 раунда)
«Это же очевидно!»Заказчик не описывает очевидное (по его мнению)Чек-лист «очевидных» вещей (авторизация, валидация)
Конфликтующие требованияРазные заказчики хотят разноеВынести на встречу, голосование, назначить Product Owner

Как ускорить согласование ТЗ (советы):

СоветПочему работает
Использовать прототипыЗаказчику легче «потрогать», чем читать
Фиксировать время на согласованиеДедлайн стимулирует
Ограничить количество правок«Две итерации бесплатно, дальше — платно»
Привлекать одного Product OwnerОдин голос вместо десяти
Использовать чек-листыНе пропустить важное
Согласовывать по частямСначала функциональные требования, потом всё остальное

Что делать, если заказчик не подписывает ТЗ (крайние меры):

СитуацияДействие
Заказчик тянет времяПисьменно зафиксировать, что без ТЗ работа не начинается
Заказчик хочет начать без ТЗПодписать «ТЗ-минимум» (только ключевые функции)
Заказчик меняет требования после подписанияДополнительное соглашение (деньги и время)
Спор о трактовке ТЗВ ТЗ должен быть раздел «Термины и определения»



Вопрос 95.

Проектирование архитектуры программной системы

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

Архитектура отвечает на вопросы (4 ключевых):

ВопросЧто значитПример ответа
Из каких частей состоит система?Крупные компоненты, модули, сервисыФронтенд, бэкенд, база данных, очередь сообщений
Как эти части взаимодействуют?Каналы связи, протоколыHTTP API, WebSocket, очередь RabbitMQ
Где работают эти части?Физическое размещениеВ браузере пользователя, на сервере в облаке, на сервере БД
Какие технологии используются?Языки, фреймворки, БДReact, Python, PostgreSQL, Redis

Процесс проектирования архитектуры (этапы):

ЭтапЧто делаемРезультатКто делает
1. Анализ требованийСобираем нефункциональные требования (масштабируемость, безопасность)Список архитектурных требованийАрхитектор, аналитик
2. Выбор архитектурного стиляМонолит, микросервисы, клиент-сервер, событийно-ориентированныйВыбранный стильАрхитектор
3. Разделение на компонентыОпределяем крупные компоненты и их обязанностиДиаграмма компонентовАрхитектор
4. Определение связейКак компоненты общаются (синхронно, асинхронно)Схема взаимодействияАрхитектор
5. Выбор технологического стекаЯзыки, фреймворки, БД, инфраструктураСписок технологийАрхитектор + команда
6. Проектирование данныхСхема БД, потоки данныхER-диаграммаАрхитектор, DBA
7. Оценка и ревьюПроверка архитектуры, поиск рисковУтверждённая архитектураКоманда, лиды

Архитектурные требования (что нужно учесть при проектировании):

КатегорияЧто нужно предусмотретьПример
МасштабируемостьКак расти: вертикально (больше ресурсов) или горизонтально (больше серверов)Горизонтальное масштабирование через балансировщик
ПроизводительностьВремя отклика, пропускная способностьКэширование, асинхронность
ДоступностьПроцент времени работыРезервирование, отказоустойчивость
БезопасностьЗащита данных, аутентификацияHTTPS, шифрование, изоляция
СопровождаемостьЛёгкость внесения измененийМодульность, документация
ТестируемостьВозможность тестировать части отдельноИнверсия зависимостей, mock-объекты

Архитектурные риски (что может пойти не так):

РискПроявлениеКак снизить
Выбор неподходящего стиляМикросервисы для маленькой командыАнализировать контекст, не гнаться за модой
Слишком сложная архитектура10 компонентов для задачи «Калькулятор»KISS, YAGNI
Слабое место (bottleneck)Все сервисы зависят от одной БДРезервирование, шардирование
Вендор-лок (vendor lock-in)Привязались к конкретному облачному провайдеруИспользовать абстракции, контейнеризацию
Отсутствие документацииАрхитектура только в голове архитектораДокументировать (диаграммы, ADR)

Что такое Architectural Decision Record (ADR):

ADR — это документ, в котором фиксируется важное архитектурное решение, его контекст, альтернативы и обоснование.

ПолеЧто содержитПример
НазваниеКраткое описание решения«Выбор базы данных PostgreSQL»
ДатаКогда принято15.06.2024
СтатусПредложено, принято, устарелоПринято
КонтекстПроблема, ограниченияНужна ACID, реляционные данные, объём до 1 ТБ
РешениеЧто выбрали и почемуPostgreSQL, потому что ACID, open source, знакомы команде
АльтернативыКакие были варианты и почему не подошлиMySQL (нет полноценного JSON), MongoDB (нет ACID)
ПоследствияЧто меняетсяНужен специалист по PostgreSQL



Вопрос 96.

Понятие программного модуля

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

Свойства программного модуля (4 основных):

СвойствоЧто значитПример
Функциональная законченностьМодуль делает что-то одно, законченноеМодуль «Авторизация» — только вход и регистрация
Скрытие внутренностей (инкапсуляция)Другие модули не знают, как он работает внутриМодуль «Платежи» скрывает алгоритм расчёта комиссии
Чёткий интерфейсЕсть понятный способ взаимодействия (входы и выходы)Функция calculateVAT(amount) — понятно, что передать и что получим
НезависимостьМодуль можно разрабатывать и тестировать отдельноТестируем модуль «Отчёты» без модуля «Авторизация»

Модуль vs Класс vs Компонент vs Сервис (сравнение):

ПонятиеРазмерЧто делаетПример
МодульСреднийЛогически законченная функцияМодуль «Корзина» (несколько классов)
КлассМаленькийОдна сущность или ответственностьКласс Cart
КомпонентКрупныйНесколько модулей, решающих общую задачуКомпонент «Управление заказами»
СервисКрупныйОтдельно развёртываемая единица (в микросервисах)Сервис «Оплата»

Критерии хорошего модуля (как проверить):

КритерийВопрос к модулюХорошоПлохо
Единая ответственностьУ модуля одна причина для изменения?ДаНет (делает и авторизацию, и платежи)
Слабая связанностьМодуль зависит от немногих других?Да (1-2 зависимости)Нет (10 зависимостей)
Сильная связность внутриВнутри модуля всё логически связано?ДаНет (сборник утилит)
Понятный интерфейсПонятно, как пользоваться?ДаНет (нужно знать внутренности)
ТестируемостьМожно протестировать без других модулей?ДаНет (требует всю систему)

Пример плохого и хорошего модуля:

Плохой модуль «Утилиты»Хорошие модули
Функция validateEmail()Модуль «Валидация»
Функция sendEmail()Модуль «Уведомления»
Функция formatDate()Модуль «Форматирование»
Функция calculateDiscount()Модуль «Расчёт скидок»
Функция logError()Модуль «Логирование»

Плохо потому что, изменение в логировании требует перетестировать всё, потому что всё в одном модуле. Изменение формата даты может сломать отправку email.




Вопрос 97.

Проектирование пользовательского интерфейса

Проектирование пользовательского интерфейса (UI — User Interface) — это процесс создания внешнего вида программы и способов взаимодействия пользователя с ней. Хороший интерфейс не требует инструкции — пользователь интуитивно понимает, что делать. Интерфейс должен быть удобным, понятным, эстетичным и доступным.

Основные этапы проектирования UI (детально):

ЭтапЧто делаемРезультатИнструменты
1. Исследование пользователейИзучаем целевую аудиторию: кто, какие задачи, в каких условияхПерсонажи, сценарииИнтервью, опросы
2. Информационная архитектураСтруктура: какие экраны, как связаны, где какие блокиКарта сайта, схема навигацииBalsamiq, Draw.io
3. Прототипирование (Wireframes)Каркасы экранов (чёрно-белые, без дизайна)Набор схемBalsamiq, Figma
4. Визуальный дизайн (UI)Цвета, шрифты, тени, отступы, иконки, анимацияМакеты высокой детализацииFigma, Sketch
5. Интерактивный прототипКликабельный прототип с переходамиДемоFigma, Axure, ProtoPie
6. Тестирование с пользователямиНаблюдение за пользователями, которые выполняют задачиОтчёт с проблемамиZoom, UserTesting
7. Передача разработчикамСпецификации, вырезанные ресурсы, гайдлайныНабор ресурсовZeplin, Figma Dev Mode

Законы UX (пользовательского опыта) — кратко:

ЗаконЧто значитПример
Закон ФиттсаЧем крупнее и ближе цель, тем легче попастьКорзина в правом верхнем углу (близко к курсору)
Закон ХикаВремя выбора растёт с количеством вариантов2 кнопки лучше, чем 10
Закон МиллераЧеловек удерживает в памяти 7±2 объектаНе более 7 пунктов в меню
Эффект близостиБлизкие элементы воспринимаются как связанныеГруппировать поля формы
Эффект последовательностиПервый и последний элементы запоминаются лучшеСамые важные — в начало и конец списка
Закон ЯкобаПользователи ожидают, что ваш сайт будет похож на другиеНе изобретайте велосипед — корзина справа сверху

Требования к хорошему UI (10 правил Нильсена):

ПравилоОбъяснение
1Видимость состоянияПользователь всегда знает, что происходит
2Соответствие реальному мируПонятные слова, образы
3Свобода и контрольМожно отменить действие
4Стандарты и единообразиеОдинаковые элементы выглядят одинаково
5Предотвращение ошибокНе дать сделать ошибку
6Узнавание, а не припоминаниеВарианты под рукой, не надо вспоминать
7Гибкость и эффективностьГорячие клавиши для опытных
8Эстетика и минимализмНичего лишнего
9Помощь в обнаружении ошибокПодсказка, как исправить
10Помощь и документацияИнструкция на крайний случай

UI для разных устройств (особенности):

УстройствоРазмер экранаВзаимодействиеОсобенности
ДесктопБольшой (13-27″)Мышь + клавиатураМного информации, сложные сценарии
ПланшетСредний (7-12″)Тач, палец, пероКрупные элементы, учёт разных положений
СмартфонМаленький (4-7″)Тач, один палецКрупные кнопки (44×44), контент снизу вверх
Смарт-часыОчень маленький (1-2″)Тач, голос, поворотМинимум текста, простые действия

Пример плохого и хорошего UI (описание):

Плохой UIХороший UI
10 пунктов в меню5 пунктов в меню
Белая кнопка на белом фонеКонтрастная кнопка
Текст 8pxТекст 16px
Нет обратной связи при нажатииКнопка меняет цвет при нажатии
Поле ввода без подписиПоле ввода с подписью и примером
Ошибка «500 Internal Server Error»Ошибка «Не удалось загрузить данные, попробуйте позже»



Вопрос 98.

Документирование программного обеспечения Дубл.

Документирование — это процесс создания, поддержки и сопровождения документации на протяжении всего жизненного цикла ПО. Документация бывает для разных аудиторий: пользователей, администраторов, разработчиков, менеджеров. Хорошая документация экономит время и деньги. Плохая (устаревшая) документация — хуже, чем её отсутствие, потому что вводит в заблуждение.


Зачем нужна документация (5 главных причин)

ПричинаОбъяснениеПример из жизни
Обучение новых сотрудниковНовый разработчик или пользователь быстро входит в курс делаПрочитал руководство программиста — через 2 дня уже делает задачи
Снижение нагрузки на поддержкуПользователи сами находят ответы, не звонят в техподдержкуFAQ на сайте: 80% вопросов решаются без звонка
Юридическая защитаЗафиксированные требования — основа приёмки«В ТЗ написано, что кнопка зелёная, а вы сделали красную»
Передача проекта другому подрядчикуНовая команда понимает, куда смотреть и как всё работаетПередали проект с документацией — запустили за месяц
Сопровождение через годАвтор забыл детали, документация напоминаетЧерез год читаешь свой комментарий и понимаешь, зачем так сделано

Классификация документации по аудитории

АудиторияВиды документацииЯзыкФорматПример фразы
Конечные пользователиРуководство пользователя, быстрый старт, FAQ, подсказки в интерфейсеПростой, без технического жаргонаPDF, встроенная справка, видео«Нажмите кнопку «Вход», введите логин и пароль»
АдминистраторыРуководство администратора, инструкция по установке, настройке, бэкапам, мониторингуТехнический, но без кодаPDF, Wiki, Confluence«Установите Docker, выполните docker-compose up -d»
РазработчикиАрхитектурная документация, описание API, комментарии в коде, ADR, руководство программистаТехнический, профессиональныйWiki, Javadoc, Swagger, Markdown«Класс User имеет методы login(), logout(), getProfile()»
Менеджеры / заказчикТЗ, SRS, план проекта, отчёты, презентацииБизнесовый, управленческийWord, Excel, PowerPoint«Бюджет проекта — 5 миллионов рублей, срок — 6 месяцев»

Виды документации по времени создания

ВидКогда создаётсяКто пишетПримерПочему важно
УпреждающаяДо начала разработкиАналитик, архитекторТехническое задание (ТЗ), архитектурная документацияФиксирует договорённости, без неё непонятно, что делать
СопутствующаяВ процессе разработкиРазработчики, техписКомментарии в коде, API-документация (Swagger), ADRВсегда актуальна, потому что создаётся вместе с кодом
РеактивнаяПосле завершения разработкиТехпис, QAРуководство пользователя, релизные заметкиНужна для пользователей, но риск устаревания

Что такое «живая документация» (документация, которая не устаревает)

ПодходКак работаетПримеры инструментовЭффективностьПочему не устаревает
Документация из кодаКомментарии в коде → автоматическая генерация HTML-документацииJavadoc (Java), Doxygen (C++, C, Java, Python), Sphinx (Python)ВысокаяДокументация рядом с кодом, обновляется вместе с ним
Документация как кодТекстовые файлы в репозитории (Markdown, reStructuredText), версионируются через GitMkDocs, Sphinx, GitBook, GitHub WikiВысокаяХранится в Git, можно делать code review изменений
API из спецификацииСпецификация (OpenAPI) → автоматическая генерация и документации, и кода, и клиентских библиотекSwagger/OpenAPI, Postman (документация из коллекции)Очень высокаяЕдиный источник правды, код и документация генерируются из одного файла
Тесты как документацияТесты показывают, как использовать код (хорошие названия тестов, BDD-сценарии)pytest (с хорошими именами), Cucumber (BDD), JBehaveСредняя (требует дисциплины)Тесты всегда актуальны, иначе они падают

Структура руководства пользователя (классическая, 10 разделов)

РазделЧто содержитПример
1. ВведениеНазначение программы, для кого она, основные возможности«Программа предназначена для учёта товаров в розничном магазине»
2. Системные требованияКакие компьютер, ОС, память, диск, экран нужны«Windows 10/11, 4 ГБ RAM, 100 МБ свободного места»
3. Установка и запускКак установить, как запустить в первый раз«Скачайте setup.exe с сайта, запустите, следуйте инструкции мастера установки»
4. Обзор интерфейсаСкриншот с подписями всех элементов (меню, кнопки, поля)«1 — кнопка «Вход», 2 — поле ввода логина, 3 — поле ввода пароля»
5. Основные операции (типовые задачи)Пошаговые инструкции для самых частых действий«Как добавить товар: нажмите + → введите название и цену → сохранить»
6. НастройкиКак изменить параметры под себя«Как сменить язык интерфейса: настройки → язык → русский»
7. Часто задаваемые вопросы (FAQ)Типичные проблемы и их решения«Что делать, если забыл пароль? Нажмите «Забыли пароль», следуйте инструкции»
8. Сообщения об ошибкахСписок ошибок, что они означают, что делать«Ошибка 404 — страница не найдена. Проверьте адрес или вернитесь на главную»
9. ГлоссарийОбъяснение терминов, которые могут быть непонятны«API — способ общения программы с другими программами»
10. Алфавитный указательБыстрый поиск терминов по страницам«Кнопка — 15, Корзина — 23, Оплата — 45, Скидка — 67»

Инструменты для создания документации (подробное сравнение)

ИнструментТип документацииПлюсыМинусыЦенаДля кого
ConfluenceКорпоративная викиМощный, интеграция с Jira, шаблоны, комментарии, версионированиеТяжёлый, медленный, платныйОт $5/мес за пользователяКрупные компании (Atlassian-экосистема)
GitHub WikiПростая вики в репозиторииБесплатно, просто, хранится в GitБазовые функции (нет поиска по всей вики, нет версионирования страниц)БесплатноOpen Source, маленькие проекты
MkDocsСайт документации из MarkdownБесплатно, красивые темы, быстрый, версионируется в GitНужно настроить (Python, pip, конфиг), требует хостингаБесплатно (open source)Техническая документация, API
ReadTheDocsХостинг для MkDocs/SphinxБесплатно для Open Source, автосборка из Git, версионирование версийТребует настройки, платный для приватных проектовБесплатно (open source) / платно (private)Open Source проекты
SphinxДокументация Python (и не только)Очень мощный, перекрёстные ссылки, индексы, поддержка reStructuredTextКрутая кривая обучения, сложная настройкаБесплатно (open source)Крупные проекты (например, документация самого Python)
Swagger/OpenAPIДокументация REST APIИнтерактивная (можно отправлять запросы), генерирует клиентский кодТребует аннотаций в коде или отдельного YAML-файлаБесплатно (open source)REST API
JavadocДокументация Java из комментариевАвтоматическая генерация из кода, всегда актуальнаТолько для Java, скучный внешний видБесплатноJava-проекты
DoxygenДокументация C++, C, Java, Python, и ещё 20+ языковПоддерживает много языков, генерирует диаграммыСложный в настройке, громоздкийБесплатно (open source)Крупные проекты на C++
NotionБаза знанийКрасивый, интуитивно понятный, гибкийНе специализирован для технической документации, нет версионированияБесплатно (базовый) / платно (команда)Стартапы, маленькие команды
Google DocsТекстовые документыПростой, доступный, совместная работа в реальном времениНеудобно для больших документов, нет версионирования для разработчиковБесплатно (до 15 ГБ) / платноПользовательская документация (PDF)

Чек-лист хорошей документации (что проверить перед публикацией)

ПроверкаВопрос себеПример нарушенияКак исправить
1АктуальностьСоответствует ли документация последней версии программы?Кнопка «Сохранить» слева (а на самом деле справа)Обновлять документацию при каждом релизе
2ПолнотаОписаны ли все функции? Есть ли оглавление?Про функцию «Поиск» ни словаДобавить раздел, сделать оглавление
3ПонятностьПоймёт ли целевой читатель (не разработчик)?«Для аутентификации используйте базовую авторизацию»«Введите логин и пароль»
4НаглядностьЕсть ли скриншоты, схемы, примеры?Только текст, ни одной картинкиДобавить скриншоты с подписями
5ПоискМожно ли быстро найти нужный раздел?100 страниц без оглавления и указателяДобавить оглавление, алфавитный указатель
6СтруктураЛогично ли разбита на разделы?Всё в одном файле, разделы не выделеныРазбить на главы, добавить подзаголовки
7ОрфографияНет ли опечаток и грамматических ошибок?«Прогамма выводит ошибку»Проверить орфографию (Word, Grammarly)

Типичные ошибки в документации и их последствия

ОшибкаКак выглядитПочему плохоПоследствиеКак исправить
Устаревшая информация«Кнопка «Сохранить» находится в левом верхнем углу» (а её там уже нет)Пользователь ищет кнопку, не находит, злитсяЗвонки в поддержку, негативные отзывыОбновлять документацию при каждом релизе
Очевидные вещи«Здесь вы видите главное окно программы. В главном окне есть меню. Меню содержит пункты…»Засоряет документ, пользователь теряет вниманиеПользователь не читает дальше, пропускает важноеПисать только то, что не очевидно
Слишком технический язык«В случае возникновения исключительной ситуации NullPointerException отображается модальное окно»Пользователь не понимаетИгнорирует, звонит в поддержку«Если программа не может найти данные, появляется окно с сообщением «Ошибка»»
Отсутствие структуры100 страниц текста подряд, без оглавления, глав, нумерации страницНельзя найти нужноеПользователь бросает читатьДобавить оглавление, разбить на главы
Размытые скриншотыСкриншот 200×150 пикселей, не видно, что на нём подписаноБесполезенПользователь не понимает, о чём речьСкриншот с хорошим разрешением, обрезать лишнее, подписи стрелками
Нет алфавитного указателяВ конце 100-страничного документа нет указателяНельзя быстро найти терминПользователь листает вручнуюДобавить алфавитный указатель
Документация в одном экземпляреТолько PDF на сайте, нет встроенной справкиПользователь вынужден переключаться между окнамиНеудобно, снижает эффективностьВстроенная справка (F1), подсказки в интерфейсе

Пример хорошей и плохой документации (сравнение)

Плохая документация (что не так):

«Наша программа очень удобная. Вы можете добавлять товары. Для этого нужно нажать на кнопку. Товары добавляются в корзину. Корзина находится в правом верхнем углу. Цена товара рассчитывается автоматически. Если у вас возникли проблемы, обратитесь в техподдержку.»

Анализ ошибок:


Роли и ответственность в документировании

РольЧто документируетКак часто обновляетОтветственность
АналитикТехническое задание (ТЗ), спецификация требований (SRS), use cases, диаграммыПо мере изменения требованийТребования зафиксированы и понятны
АрхитекторАрхитектурная документация, ADR (Architectural Decision Records), диаграммы компонентовПри изменении архитектурыАрхитектура задокументирована и обоснована
РазработчикКомментарии в коде, Javadoc/Doxygen, API-документация, руководство программистаПри каждом изменении кодаКод понятен другим разработчикам
Технический писательРуководство пользователя, руководство администратора, FAQ, релизные заметкиПри каждом релизеПользователь может самостоятельно освоить продукт
QA (тестировщик)Тест-кейсы, планы тестирования, отчёты о тестированииПри изменении функционалаТесты воспроизводимы и понятны
DevOpsИнструкции по развёртыванию, настройке, мониторингу, бэкапамПри изменении инфраструктурыАдминистратор может развернуть систему
Project ManagerПлан проекта, отчёты о статусе, протоколы встречРегулярно (еженедельно)Команда и заказчик видят прогресс

Золотые правила документирования (памятка для разработчика и техписа)

ПравилоСмыслПример нарушенияКак правильно
1. Пиши для человека, который будет поддерживать твой код через годПредставь, что ты ничего не помнишь«// это цикл»«// Обходим все товары в корзине, чтобы пересчитать общую сумму»
2. Не дублируй код в комментарияхКомментарий не должен повторять то, что и так видноx = x + 1 // увеличиваем x на 1Комментарий вообще не нужен (код очевиден)
3. Объясняй «почему», а не «что»Код показывает «что», комментарий — «почему именно так»// сортируем массив// Используем пузырьковую сортировку, потому что массив маленький (до 100 элементов), а код должен быть простым
4. Обновляй документацию вместе с кодомУстаревшая документация хуже, чем её отсутствиеДокументация говорит «кнопка зелёная», а она синяяПри каждом изменении кода проверять и обновлять документацию
5. Используй автогенерацию там, где можноJavadoc, Doxygen, Sphinx экономят времяРучное написание HTML-документацииКомментарии в коде → генерация HTML
6. Проверяй документацию так же, как кодCode review для документацииОпечатки, устаревшие скриншотыВключить документацию в pull request



Вопрос 99.

Тестирование программного обеспечения Дубл.

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

Стратегии тестирования (как выбирать подход):

СтратегияЧто значитКогда использоватьРиски
Полное тестирование всех путейТестируем каждую возможную комбинациюТолько для тривиальных программ (10 путей)Невозможно для реальных систем
Тестирование на основе рисковВ первую очередь тестируем критичные функцииВсегда (разумный подход)Могут быть пропущены неочевидные баги
Тестирование на основе требованийТестируем каждое требование из ТЗГосзаказ, приёмочные испытанияНе тестируется то, что не в ТЗ
Исследовательское тестированиеТестировщик импровизирует на основе своего опытаКогда нет документации, при поиске сложных баговЗависит от квалификации тестировщика
АвтоматизированноеТесты пишутся и запускаются автоматическиРегрессионное тестирование, CI/CDНе найдёт ошибки в UI (легко)

Пирамида тестирования (рекомендуемое соотношение):

Уровень% тестовВремя выполненияСложность поддержкиЧто тестируем
Модульные (unit)70%СекундыНизкаяОтдельные функции, классы
Интеграционные20%МинутыСредняяВзаимодействие модулей, БД
UI / End-to-End10%Десятки минутВысокаяПолные сценарии пользователей

Уровни тестирования по объёму (детально):

УровеньЧто тестируемКто пишетДлительностьПример
Модульное (unit)Одна функцияРазработчикСекундыassert add(2,2) == 4
ИнтеграционноеДва модуля вместеРазработчик/QAСекунды-минутыБД + бизнес-логика
СистемноеВся программаQAЧасыПолный сценарий: регистрация → покупка
Приёмочное (UAT)Решает ли бизнес-задачиЗаказчикДниБухгалтер проверяет отчёт

Метрики тестирования (как измерить качество тестирования):

МетрикаЧто измеряетФормулаХорошее значение
Покрытие кода тестамиКакой % кода выполняется при тестахСтроки_в_тестах / Все_строки × 100%> 70%
Плотность дефектовСколько ошибок на объём кодаОшибки / 1000 строк кода< 1
Эффективность тестовКак много ошибок нашли тестыОшибки / Общее_число_ошибок_в_системе> 80%
Автоматизированных тестовКакой % тестов автоматизированАвто_тесты / Все_тесты × 100%> 50% (для регрессии)
Время выполнения тестовКак быстро проходят тестыИзмерить< 10 минут (CI)

Что такое тест-кейс (правильный пример):

ПолеЗначение
IDTC-045
НазваниеУспешный вход с валидными учётными данными
ПредусловиеПользователь зарегистрирован, не авторизован
Шаги1. Открыть страницу входа
2. Ввести логин «user@example.com»
3. Ввести пароль «123456»
4. Нажать кнопку «Войти»
Ожидаемый результатПеренаправление на главную страницу, отображается приветствие «Здравствуйте, user»
Фактический результат(Заполняется после выполнения)
СтатусPassed / Failed / Blocked
ПриоритетHigh



Вопрос 100.

Виды тестирования программных продуктов

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

Полная классификация видов тестирования:

1. По уровню тестирования (объёму):

ВидЧто тестируемКто проводит
Модульное (unit)Отдельные функции, классыРазработчик
ИнтеграционноеВзаимодействие модулейРазработчик / QA
СистемноеВся программа целикомQA
Приёмочное (UAT)Решение бизнес-задачЗаказчик

2. По характеру тестирования:

ВидЧто проверяемИнструментыПример
ФункциональноеРаботают ли функции по ТЗJUnit, pytest, SeleniumКнопка «Купить» работает
НагрузочноеПоведение под нагрузкойJMeter, k6, Locust1000 одновременных пользователей
БезопасностиУязвимости, взломOWASP ZAP, Burp SuiteSQL-инъекции, XSS
ЮзабилитиУдобство использованияРучное тестирование, опросыПонятна ли навигация
РегрессионноеНе сломались ли старые функцииАвтоматические тесты (JUnit, Selenium)После добавления скидок — проверка обычной покупки
Дымовое (smoke)Запускается ли программаРучной запуск, простой скриптНе падает ли при старте

3. По способу выполнения:

ВидКак выполняетсяПлюсыМинусы
РучноеЧеловек выполняет шаги тест-кейсаНаходит UI-ошибки, творческий подходДолго, дорого, подвержено ошибкам
АвтоматизированноеСкрипты выполняют тестыБыстро, многократно, дёшево в долгосрочной перспективеНе находит визуальные ошибки, требует поддержки

4. По знанию системы:

ВидЧто знает тестировщикЧто проверяет
Тестирование белого ящика (white box)Знает код, архитектуруВнутренние пути, граничные условия
Тестирование чёрного ящика (black box)Не знает код, знает только требованияСоответствие требованиям, внешнее поведение
Тестирование серого ящика (grey box)Знает частичноТесты API, баз данных

5. По объекту тестирования:

ВидЧто тестируемПример
UI-тестированиеГрафический интерфейсПроверка расположения кнопок
API-тестированиеПрограммный интерфейсPOST /login возвращает 200 OK
БД-тестированиеЗапросы, схемы, целостностьSELECT возвращает правильные данные
Мобильное тестированиеПриложения на iOS/AndroidЖесты, повороты экрана, батарея
Встраиваемое тестированиеПО на устройствах (микроволновки, авто)Работа с железом, ограниченные ресурсы

6. По времени проведения:

ВидКогда проводитсяЦель
Alpha-тестированиеВнутри команды разработкиНайти баги до передачи заказчику
Beta-тестированиеРеальными пользователями (ограниченная группа)Найти баги в реальных условиях
Приёмочное (UAT)Перед подписанием акта приёмкиЗаказчик подтверждает, что всё работает

Пример выбора видов тестирования для интернет-магазина:

ПриоритетВид тестированияПочему важен
1ФункциональноеКнопка «Купить» должна работать
2НагрузочноеНе должно падать в чёрную пятницу
3БезопасностиДанные карт не должны украсть
4ЮзабилитиПользователь должен понять, как купить
5РегрессионноеПосле обновления не сломать старое
6Модульное (unit)Для разработки



Вопрос 101.

Отладка программного обеспечения

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

Этапы отладки (полный цикл):

ЭтапЧто делаемВопросыПример
1. ВоспроизведениеНаходим способ стабильно воспроизвести ошибкуПри каких условиях? Какие входные данные?Ошибка появляется при вводе отрицательной цены
2. ЛокализацияСужаем круг поиска до места в кодеВ каком модуле? В какой функции? На какой строке?Ошибка в функции calculateTotal()
3. ДиагностикаПонимаем причинуПочему программа ведёт себя не так?Переменная discount не инициализирована
4. ИсправлениеВносим минимальное изменениеЧто минимально изменить, чтобы исправить?Присвоить discount = 0 по умолчанию
5. ПроверкаУбеждаемся, что ошибка исчезла и не появились новыеЗапустить тест на эту ошибку, прогнать регрессиюТест проходит, старые тесты зелёные
6. ФиксацияКоммит с понятным сообщением, обновление баг-трекераЧто написать в коммите? Закрыть баг?git commit -m "Исправлен баг #123: не инициализирована переменная discount"

Методы отладки (как искать ошибку):

МетодКак работаетКогда эффективенПример
Трассировка (printf debugging)Выводим значения переменных в консоль или логПростые ошибки, нет отладчикаprint(f"x={x}, y={y}")
Отладка с точками остановаОстанавливаем программу, смотрим состояниеСложные ошибки, когда есть отладчикIDE (PyCharm, VS Code)
Пошаговое выполнениеВыполняем код по одной строкеКогда не понятно, в какой строке ошибкаStep Into, Step Over, Step Out
Наблюдение за переменными (watches)Смотрим, как меняются переменныеКогда нужно отследить конкретную переменнуюДобавили total в окно наблюдения
Бинарный поискДелим код пополам, проверяем половинуКод большой, ошибка не локализована«Ошибка в первых 500 строках или во вторых?»
Git bisectGit находит коммит, в котором появилась ошибкаОшибка появилась недавноgit bisect start; git bisect bad; git bisect good
Утиная отладкаОбъясняем ошибку утке (или коллеге)Когда зашли в тупик«Смотри, у меня есть функция, которая принимает цену и скидку… А, понял!»

Инструменты для отладки (по языкам):

ЯзыкИнструментЧто умеет
Pythonpdb, ipdb, PyCharm DebuggerТочки останова, пошаговое выполнение, просмотр переменных
JavaJDB, IntelliJ Debugger, Eclipse DebuggerВсё то же + профилирование
JavaScriptChrome DevTools, VS Code DebuggerОтладка в браузере, работа с DOM, сеть
C/C++GDB, LLDB, Visual Studio DebuggerОтладка низкого уровня, память, ассемблер
ВебChrome DevTools, React DevTools, Redux DevToolsКомпоненты, состояние, сеть, производительность

Что такое логирование как инструмент отладки:

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

Уровень логированияКогда использоватьПример
DEBUGДля отладки (только на тестовых стендах)DEBUG: user_id=123, action=login
INFOИнформация о нормальной работеINFO: Пользователь 123 вошёл в систему
WARNINGЧто-то не так, но программа работаетWARNING: Попытка входа с неверным паролем
ERRORОшибка, но программа продолжает работуERROR: Не удалось отправить email
CRITICALКритическая ошибка, программа падаетCRITICAL: База данных недоступна

Типичные ошибки при отладке:

ОшибкаЧто делаютПочему плохоКак правильно
Исправление следствия, а не причиныДобавляют try-except, чтобы подавить ошибкуОшибка появится снова в другом местеНайти и исправить первопричину
Случайные изменения («метод тыка»)Меняют код наугад, надеясь, что ошибка исчезнетТрата времени, новые ошибкиВоспроизвести, локализовать, понять
Отладка без воспроизведенияПытаются исправить ошибку, не повторив еёНепонятно, исправлено лиСначала стабильно воспроизвести
Слишком сложное исправлениеПереписывают половину программыРиск новых ошибок, трата времениМинимальное изменение



Вопрос 102.

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

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

Виды сопровождения (повторение с новыми деталями):

Вид% времениПримерКто делаетТипичная сложность
Корректирующее20%Исправление бага в расчёте скидкиРазработчикиНизкая-средняя
Адаптивное25%Переход с PostgreSQL 11 на 15DevOps, разработчикиВысокая
Совершенствующее50%Добавление экспорта в ExcelРазработчики, аналитикиСредняя-высокая
Профилактическое5%Рефакторинг старого модуляРазработчикиВысокая

Процесс сопровождения (по шагам):

ШагЧто делаемДлительностьКто отвечает
1Поступление запроса (баг, идея, вопрос)1 минута — 1 часТехподдержка
2Триаж (оценка)Приоритет, сложность, ответственныйPM, лид
3ПланированиеВключение в спринт или отдельный хотфиксPM
4РазработкаИсправление, тестыРазработчик, QA
5РелизВыкатка на серверы или пользователямDevOps
6МониторингПроверка, что всё работает, сбор обратной связиQA, техподдержка

Что такое технический долг (сопроводительная часть):

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

Тип технического долгаПримерРостСнижение
Дублирование кодаОдна логика в 10 местахМедленныйВыделить общую функцию
Отсутствие тестовВсё тестируется вручнуюБыстрыйПисать тесты
Сложная архитектура100 классов там, где нужно 10БыстрыйРефакторинг
Устаревшие зависимостиИспользуется библиотека 2015 годаСкачкообразныйОбновить
«Костыли»Временное решение стало постояннымПостоянныйПереписать нормально

Стратегии развития продукта (куда двигаться):

СтратегияЧто значитПримерРиски
Новые функцииДобавляем то, что просят пользователиЭкспорт в PDF, интеграция с CRMРазрастание функционала
Улучшение существующегоДелаем быстрее, удобнее, стабильнееУскорить поиск в 2 разаНе видно «снаружи»
Техническое переоснащениеПереписываем старые модулиПереход с устаревшего фреймворка на новыйДорого, долго
Вывод устаревших функцийУбираем то, чем не пользуютсяОтключить старую форму отчётовНедовольство некоторых пользователей
МасштабированиеГотовим систему к ростуПереход с монолита на микросервисыСложность

Метрики сопровождения (как измерить эффективность):

МетрикаЧто измеряетФормулаХорошее значение
MTTR (Mean Time To Repair)Среднее время исправления ошибкиСуммарное время / Кол-во ошибок< 24 часа для критических
MTBF (Mean Time Between Failures)Среднее время между сбоямиСуммарное время работы / Кол-во сбоев> 1000 часов
Коэффициент закрытых баговКак быстро закрываем багиЗакрытые за месяц / Поступившие за месяц> 80%
Удовлетворённость поддержкойОценка пользователейСредняя оценка (1-5)> 4.5
Технический долг% времени на рефакторингВремя на рефакторинг / Общее время< 20%

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

ПризнакЧто значитЧто делать
Рост технического долгаВсё сложнее добавлять функцииПровести рефакторинг (профилактическое сопровождение)
Устаревший стекТехнологии больше не поддерживаютсяМиграция на современный стек
Новые потребности бизнесаПрограмма не решает новые задачиДобавление функций или новая версия
Высокая стоимость сопровождения> 80% бюджета уходит на поддержкуРассмотреть замену
Появление сильного конкурентаРынок уходитКрупное обновление или новый продукт

Финал жизненного цикла — вывод из эксплуатации (как правильно завершить):

ШагЧто делаемЗачем
1Уведомление пользователейСообщить дату отключенияЧтобы пользователи подготовились
2Миграция данныхПеренести данные в новую системуЧтобы не потерять историю
3АрхивацияСохранить резервную копию на случайЕсли потребуется восстановить
4ОтключениеОстановить серверы, удалить приложенияПрекратить расходы на поддержку
5Уничтожение данныхБезопасно удалить персональные данныеВыполнить требования 152-ФЗ