1 модуль, 2022/2023 учебный год, ВШЭ ВШБ ДБИ
Курс про все, что связано с созданием ПО, кроме непосредственно написания программного кода
Курс состоит из лекций и семинарских занятий.
Лекционный материал включает краткий обзор важных с точки зрения процесса разработки понятий: методы отладки и этапы исправления дефектов ПО, критерии хорошей и неудачной архитектуры, этапы проектирования и разработки, методологии разработки. Семинарский материал состоит из рассказа о важных инструментах программиста: системы контроля версий, системы сборки, gdb, valgrind, развертывание и настройка систем непрерывной интеграции.
Цель курса — дать слушателям, которые параллельно изучают языки программирования, алгоритмы и т. п., информацию и дополнительные знания, какими инструментами можно пользоваться и на что обращать внимание при создании рыночного программного продукта.
Для успешного выполнения практики на Семинаре №2 вам понадобятся некоторые инструменты, для разных операционных систем на вашем ПК действия разные:
- Если у вас Windows, варианты:
- (
в.1
) Поставить себе Linux - наиболее удобный способ- Рекомендуем использовать дистрибутив Ubuntu 22.04.1 LTS (скачать можно тут)
- Вы можете либо поставить Ubuntu второй системой, либо же развернуть в виртуальной машине
- (
в.2
) Установить себе WSL (Windows Subsystem for Linux) - (
в.3
) Использовать online-консоль (наименее приоритетный вариант, использовать только если другое не получилось) - Если вы остановились на
в.2
илив.3
, то вам еще необходимо установитьGit
- Скачать его можно тут
- (
- Если у вас MacOS - у вас есть уже приложение Terminal
- Очень желательно, кроме того, установить
brew
- Инструкция тут
- Достаточно в Terminal вставить команду
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- Достаточно в Terminal вставить команду
- Инструкция тут
- После установки
brew
- установитьGit
- Инструкция тут
- Достаточно в Terminal вставить команду
brew install git
- Достаточно в Terminal вставить команду
- Инструкция тут
- Очень желательно, кроме того, установить
- Если у вас Linux (любой дистрибутив) - у вас уже есть приложение Терминал / Эмулятор терминала / "что-то подобное" - точно есть во всех дистрибутивах, просто поищите
- Нужно установить
Git
- Достаточно в Терминале набрать команду
sudo apt-get install git
(если выпадает ошибка - стоит погуглить, какой менеджер пакетов используется в вашем дистрибутиве)
- Достаточно в Терминале набрать команду
- Нужно установить
Неделя 1
Организационное
- План курса
- Правила оценивания
- Информация о заданиях
- Контрольные мероприятия
Неделя 1
Этапы развития проекта
- Основные этапы жизненного цикла проектирования, реализации и внедрения ПО
- Формирование требований
- Разработка концепции
- Техническое задание
- Эскизный проект
- Понятие о MVP и примеры MVP
- Технический проект
- Рабочая документация
- Поставка / ввод в действие
- Сопровождение
- Вывод из эксплуатации
Неделя 1
Базовые понятия о языках программирования
- Парадигмы программирования
- Императивное программирование
- Описание
- Примеры
- "Вложенные парадигмы"
- Процедурное программирование
- Структурное программирование
- Аспектно-ориентированное программирование
- Объектно-ориентированное программирование
- Обобщенное программирование
- Декларативное программирование
- Пример-объяснение
- "Вложенные парадигмы"
- Логическое программирование
- Функциональное программирование
- Общая схема парадигм
- Метапрограммирование
- Реализация парадигм в языках программирования
- Императивное программирование
- Компилируемые и интерпретируемые языка
- Определения
- Примеры
- Типизация
- Сильная / слабая типизация
- Статическая / динамическая типизация
- Явная / неявная типизация
Неделя 2
Основные диаграммы UML
- Что такое UML?
- Базовое понятие о нотации UML
- Диаграмма вариантов использования
- Понятие о вариантах использования
- Понятие об акторах
- Нотация диаграммы вариантов использования
- Диаграмма классов
- Понятие о классах
- Нотация диаграммы классов
- Выделение сущностей
- Карточки CRC
- Метод Аббота
- Диаграмма последовательности
- Нотация диаграммы последовательности
- Диаграмма состояний
- Нотация диаграммы состояний
- Диаграмма деятельности
- Нотация диаграммы деятельности
Неделя 2
CI/CD/CD
- CI/CD/CD
- Понятие о Continuous Integration
- Понятие о Continuous Delivery
- Понятие о Continuous Deployment
- Пример организации процесса разработка из индустрии
- Этап проектирования
- Этап реализации
- Этап сдачи задачи
- Подготовка к выпуску версии
Неделя 3
Отладка ПО, ч.1: работа с ошибками ПО
- Основные этапы отладки ПО
- Воспроизведение дефекта
- Необходимая информация для воспроизведения
- Анализ дефекта
- Понятие root-cause
- Условия возникновения
- Область повреждения
- Необходимые выводы
- Дизайн исправления
- Технический
- Архитектурный
- Технологический
- Исправление дефекта
- Валидация исправления
- Интеграция исправления в код или целевую систему
- Дополнительные валидации после интеграции
Неделя 3
Отладка ПО, ч.2: техники отладки
- Запуск программ в отладчике (трассировка)
- Софтверный дебаггер
- "Железный" дебаггер
- Удаленный дебаггер
- Логирование
- Работы системы
- Программного кода
- Анализ программного кода без исполнения программы
- "Метод пристального взгляда"
- Статические анализаторы
- Анализ поведения системы
- Упрощение сценария
- Ограничение объема данных
- Упрощение данных / запроса
- UNIT-тестирование
- Прототипирование
- Отладка с помощью дампов
- Отладка с помощью перехватов
- Профилирование кода
- Выполнение кода в другой среде
- Отладка методом RPC (Remote procedure call)
- Отладка путем анализа документации
- Отладка трансляцией кода
- Трансляция "вниз"
- Трансляция "вверх"
- Отладка разработкой интерпретатора
- Метод индукции
- Метод дедукции
- Обратное движение по алгоритму
Неделя 4
Управление качеством ПО, ч.1
- Понятие о качестве ПО
- Характеристики и атрибуты качества ПО
- Основые аспекты качества ПО
- Парадокс тестировщика
- Соответствие ожиданиям stakeholder'ов
- Качество и деньги
- Десятичное правило качества
- Важные аспекты
Неделя 4
Управление качеством ПО, ч.2
- Ручное тестирования
- Класс эквивалентности
- Граничные значения
- 7 ключевых инструментов качества
- Причинно-следственная диаграмма Исикавы
- Блок-схема
- Контрольный листок
- Контрольная карта (карта Шухарта)
- Примеры
- Гистограмма
- Диаграмма Парето
- Диаграмма разбрасывания
- Ручное тестирование. Практические советы
- Автоматизированное тестирование
- Основные аспекты
- Жизненный цикл автотеста
- Практические советы
- Как на практике?
Неделя 5
Принципы проектирования ПО, часть 1
- Что такое программа, как она устроена, как она работает (вопросы к аудитории, если есть понимание - быстро двигаемся дальше)
- Что такое архитектура ПО
- Что такое "Проектирование ПО"?
- По каким критериям можно оценить архитектуру?
- Критерии хорошей архитектуры
- Эффективность
- Гибкость
- Расширяемость
- Масштабируемость, тестируемость, возможность повторного использования, сопровождаемость
- Критерии неудачной архитектуры
- Жесткость
- Хрупкость
- Неподвижность
- Критерии хорошей архитектуры
- Принцип High Cohesion / Low Coupling
Неделя 5
Принципы проектирования ПО, часть 2
- Принципы SOLID
- Single responsibility principle
- Open-closed principle
- Liskov substitutional principle
- Interface segregation principle
- Dependency inversion principle
- Закон Деметры
- YAGNI
- DRY / DIE
- KISS
Неделя 6
Архитектурные паттерны
- Классификация архитектуры ПО
- Локальные
- Распределенные
- Файл-серверные
- Клиент-серверные
- Двухзвенные
- Трехзвенные
- Многозвенные
- Локальные приложения
- MVC (Model-View-Controller)
- Клиент-серверная архитектура
- Тонкий и толстый клиент
- Трехзвенная архитектура
- Оценка нагрузки на систему
- Тим проекта и влияние на нагрузку
- Ресурсы для обеспечения производительности
- Масштабирование
- Горизонтальное
- Вертикальное
- Функциональное разбиение
- Шардинг
- Типичная архитектура веб-сервиса
- Типичная архитектура нагруженной информационной системы
Неделя 6
Методологии разработки ПО
- Основные понятия
- Факторы, оказывающие влияние на процесс разработки
- Внешние факторы
- Внутренние факторы
- Каскадная модель
- V-модель
- Инкрементная модель
- Итерационная модель
- Спиральная модель
- RAD-модель
- Семейство гибких методологий
- Agile-манифест
- Scrum
- Kanban
Основы Python
- понятие о python и интерпретаторе
- запускаем интерпретатор и считаем парочку арифметических выражений
- показываем переменные
- пишем скрипт на сложение чисел
- пишем скрипт "Hello world"
- показываем условные переходы и циклы
- пишем простую функцию расчета факториала
Базовые инструменты разработки ПО
Системы контроля версий, git, git-flow (опционально).
Bash и основные команды.
План семинара:
- показываем bash (на лекции предупрежу, что надо иметь Linux / macOS или WSL)
- базовые команды bash: touch, rm, cd, mkdir, rmdir, ls, cp, mv, cat, echo, ...
- пишем простой скрипт на bash (Например, считаем количество файлов в директории)
- рассказываем про системы контроля версий в целом (зачем нужно, какие есть)
- рассказываем основы git: что такое репозиторий, что такое ветки, что такое коммиты, pull-request'ы
- показываем: создание репозитория на github, клонирование локально, создание файла, коммит, push origin
Инструменты отладки
Показываем дебаггер в IDE, точки останова, как с этим работать. (опционально) показываем gdb & valgrind
План семинара:
- запускаем любимую IDE
- пишем простую программу (лучше на питоне), запускаем дебагер
- показываем точки останова, шаг вперед / шаг с заходом / шаг с обходом
- показываем значения переменных
- опционально показываем профилировщик
- опционально показываем gdb - как работать из консоли (опять же, на простом примере)
- опционально показываем valgrind в простейших сценариях (память не освобождена, переменная не инициализирована, используется неинициализированная переменная в условном переходе)
Тестирование ПО
Отработка на семинаре простейших примеров написания тестов на python, демонстрация разных видов тестов
План семинара:
- пишем на питоне пару простых функций (например, сложение и умножение чисел)
- показываем юнит-тесты (каждую функцию)
- показываем нагрузочное тестирование (запускаем много итераций теста, смотрим производительность)
- показываем сценарное тестирование (на уровне "посчитаем значения выражения")
- показываем, как настроить простейший CI в GitHub Actions
Диаграммы UML
Отработка на семинаре навыков построения диаграмм, решение небольших задач. Диаграммы классов пока не рассматриваем.
План семинара:
- решаем задачку на диаграмму вариантов использования (например, "варианты использования сайта аэропорта")
- решаем задачку на диаграмму последовательности (например, "снимаем деньги в банкомате")
- решаем задачку на диаграмму деятельности (например, "поступаем в университет")
- решаем задачку на диаграмму состояний ("рассматриваем сдачу курса: изучается-сдан-пересдача-не сдан")
Практика проектирования
Отрабатываем практические навыки проектирования (без погружения в программный код) понятных предметных задач: заказ такси через приложение, покупка в интернет-магазине...Рисуем диаграммы классов UML
План семинара:
- решаем простую задачу на проектирование локального приложения (мобильного или десктопного), без взаимодействия с сервером. Например, проектируем простейшее приложение для создания и хранения заметок. Жетально проектировать на уровне классов. Если идет сложно - сначала пытаемся выделить варианты использования и придумать, как их реализовать. Даже если получится по итогу криво, главное, чтобы получилось хоть что-то..
- решаем задачу посложнее на проектирование клиент-серверного приложения. Например, приложение для заказа такси. Обязательно надо подстветить проблему, что запрос от клиента до сервера может не дойти (или от сервера до клиента), как это можно решать (спойлер - таймлимитом)
❗ Контрольная работа пройдет на лекции 28 сентября в 18:10, в формате онлайн.
- Продолжительность - 30 минут
- Максимальный балл за работу - 20 первичных. Оценка КР = (Первичные баллы) / 2 (без округления)
- Формат - дистанционный опрос на базе Google Forms
- Вопросы могут быть разных форматов:
- Тестовые (нужно выбрать 1 или несколько правильных ответов)
- С открытым ответом (нужно написать развернутый ответ словами)
- Вопросы будут только по материалам лекций №1 - №6
Пишем простую программу на Python
Вам нужно написать простую программу на Python, которая поможет разобраться с вашей базой контактов. Графический интерфейс делать не нужно, достаточно просто консольной программы.
Контакты хранятся в виде текстового файла, в каждой строке которого - ФИО (первое слово - фамилия, второе при наличии - имя, третье при наличии - отчество),
номер телефона (формата +Х
, где X - от 9 до 11 цифр), адрес электронной почты (формата [email protected]
, состоящий из букв латинского алфавита, знака @
и точки).
Обратите внимание, что ФИО может быть неполное (например, только ФИ, или только Фамилия), номер телефона и/или адрес электронной почты может быть не заполнен.
ФИО, номер телефона, адрес электронной почты отделены друг от друга запятыми, если не заполнено - запятые все равно расставлены.
Пример файла с базой контактов:
Иванов Иван Иванович, +79999999995, [email protected]
Петров Коля,, [email protected]
Сидоров, +79966969669,
Пушкин Александр Сергеевич,,
За задание вы можете получить максимум 10 баллов.
Семинарист при проверке может выставить за какой-либо пункт частичный балл, если требования пункта выполнены не полностью.
1 балл
Создан класс Contact с необходимыми полями1 балл
Реализовано чтение базы контактов из файла (имя файла вводится в консоль) в коллекцию объектов типа Contact. Если телефон или адрес электронной почты не указан, нужно корректно это учесть в программе. NB: прямо это на семинаре могли не показывать, но это действительно очень просто (не просто так это первые пункты задания). Если будут сложности - задайте вопросы на семинаре №3, объясним :)1 балл
Реализован поиск по номеру телефона1 балл
Реализован поиск по адресу электронной почты2 балла
Реализован поиск по Фамилии, Имени, Отчеству как в отдельности, так и вместе (т.е. можно искать Иван, а можно искать Иван Иванов, например)2 балла
Реализован поиск и вывод на экран всех контактов, у которых не заполнен номер телефона и/или адрес электронной почты2 балла
Реализована возможность редактирования любого контакта (подумайте, как это сделать удобно)
Есть два дедлайна - мягкий
и жесткий
.
- Если вы присылаете ваше решение до
мягкого дедлайна
- то ваш семинарист проверяет работу, дает замечания, и далее у вас есть 3 дня на то, чтобы внести исправления (и получить балл выше). Обратите внимание, допускается именно исправление замечаний, а не доработка каких-то пунктов задания, которые вы изначально не сделали. Вы можете не вносить исправления и согласиться на тот балл, который получили по итогам первой проверки. - Если вы присылаете ваше решение после
мягкого дедлайна
, но дожесткого дедлайна
- семинарист проверяет вашу работу и выставляет балл. Исправления не допускаются. - Если вы присылаете ваше решение после
жесткого дедлайна
, то задание не проверяется, и вы получаете 0 баллов
Вариант 1 - если у вас уже прошел семинар №2
Мягкий дедлайн
25.09Жесткий дедлайн
02.10
Вариант 2 - если у вас еще не было семинара №2
Мягкий дедлайн
дата семинара №2 + 1 неделяЖесткий дедлайн
дата семинара №2 + 2 недели
Задание вы сдаете своему семинаристу. Результаты выполнения задания должны быть загружены в репозиторий на GitHub. Канал отправки ссылки на репозиторий семинаристу - на усмотрение семинариста.
Добавляем тесты и разворачиваем простейший CI/CD
Задание состоит из двух частей. Каждая часть оценивается максимум в 5 баллов. Общий максимальный балл за задание: 5 + 5 = 10 баллов
Реализуйте на Python
простейшую программу, которая будет считывать из файла числа, а далее отдельными функциями искать среди этих чисел минимальное число, максимальное число, считать их общую сумму и произведение.
Функции должны называться, соответственно _min
(минимальное число), _max
(максимальное число), _sum
(сумма всех чисел), _mult
(произведение всех чисел).
Числа в файле записаны в одной строке, друг от друга отделены пробелами. В файле есть минимум одно число. Максимально возможное количество чисел в файле - 1 млн.
Для этой программы подготовьте тесты:
- проверяющие корректность работы функций поиска минимума и максимума
- проверяющие корректность работы функций сложения и умножения
- проверяющие скорость работы программы при увеличении размера входного файла (при увеличении количества чисел в файле).
В файле: 1 4 2 3
Минимальное: 1
Максимальное: 4
Сумма: 10 (1+2+3+4)
Произведение: 24 (1*2*3*4)
1 балл
: реализуйте функции чтения из файла, поиска минимального числа, поиска максимального числа, сложения и умножения всех чисел из файла1 балл
: реализуйте тесты для проверки корректности функций поиска минимума, максимума, сложения и умножения1 балл
: реализуйте тесты для проверки скорости работы программы при увеличении размера входного файла1 балл
: реализуйте любой другой тест на ваше усмотрение1 балл
: постройте график зависимости времени выполнения от кол-ва чисел в файле
Теперь вам необходимо настроить CI-систему для своего мини-проекта.
1 балл
: заведите репозиторий для своего проекта на GitHub. Оформите простейший README.md (туториал по markdown (файлы формата .md)). Загрузите в репозиторий файлы своего мини-проекта (код, тесты, README.md).1 балл
: подключите к вашему проекту любую CI-систему (выше есть подсказки с вариантами систем, но мы крайне рекомендуем использовать GitHub Actions в рамках этого задания, только если Ваш семинарист не демонстрировал вам другую систему). Обеспечьте возможность запуска тестов в ручном режиме (например, по щелчку кнопки в веб-интерфейсе CI-системы)1 балл
: настройте CI таким образом, чтобы прогон тестов запускался автоматически при любом новом коммите в репозиторий вашего проекта1 балл
: сделайте интеграцию CI-системы и вашего репозитория на GitHub: сделайте бэйдж в README.md, который будет показывать текущий статус тестов. Для информации смотрите тут, тут или в аналогичном доке для выбранной вами CI-системы. Как выглядят бэйджи в целом, можно посмотреть в любом проекте на GitHub, где они сделаны, например, в репозитории Telegram1 балл
: сделайте любую интеграцию CI-системы и какого-либо мессенджера (например,telegram
,slack
,msteams
и т.п.). Настройте систему так, чтобы при успешном прохождении теста посылалось сообщение "все ок", при неуспешном - посылалась информация, какие именно тесты не пройдены. Обратите внимание, тут не нужно писать код, тут нужно взять готовые аддоны / расширения и просто настроить
Правила дедлайнов такие же, как и по ТЗ1 - есть мягкий
и жесткий
дедлайны.
Вариант 1 - если у вас уже прошел семинар №4
Мягкий дедлайн
09.10Жесткий дедлайн
16.10
Вариант 2 - если у вас еще не было семинара №4
Мягкий дедлайн
дата семинара №4 + 1 неделяЖесткий дедлайн
дата семинара №4 + 2 недели
Проектируем небольшое приложение по требованиям
tbd
tbd
Неделя | Лекции | Семинары | Выдача заданий | Сдача заданий |
---|---|---|---|---|
✅ 1 | Организационное + Этапы развития проекта + Базовые понятия о языках программирования | Основы Python | Установить необходимое ПО для курса на свои машины | |
✅ 2 | Основные диаграммы UML + CI/CD/CD | Базовые инструменты разработки ПО | ТЗ1: Пишем простую программу на Python | |
✅ 3 | Отладка ПО, ч.1: работа с ошибками ПО + Отладка ПО, ч.2: техники отладки | Инструменты отладки | ||
✅ 4 | КР + Управление качеством ПО, ч.1 + Управление качеством ПО, ч.2 | Тестирование ПО | ТЗ2: Добавляем тесты и разворачиваем простейший CI/CD | ТЗ1: Пишем простую программу на Python |
🔥 5 | Принципы проектирования ПО, часть 1 + Принципы проектирования ПО, часть 2 | Диаграммы UML | ТЗ3: Проектируем небольшое приложение по требованиям | |
6 | Архитектурные паттерны + Методологии разработки ПО | Практика проектирования | ТЗ2: Добавляем тесты и разворачиваем простейший CI/CD | |
7 | ЭКЗ | ТЗ3: Проектируем небольшое приложение по требованиям |
Финальная оценка = Математическое округление (0.2*КР
+ 0.15*ТЗ1
+ 0.15*ТЗ2
+ 0.15*ТЗ3
+ 0.35*ЭКЗ
)