2 модуль, 2021/2022 учебный год, ВШЭ ВШБ ДБИ
Курс про все, что связано с созданием ПО, кроме непосредственно написания программного кода
Курс состоит из лекций и семинарских занятий.
Лекционный материал включает краткий обзор важных с точки зрения процесса разработки понятий: методы отладки и этапы исправления дефектов ПО, критерии хорошей и неудачной архитектуры, этапы проектирования и разработки, методологии разработки. Семинарский материал состоит из рассказа о важных инструментах программиста: системы контроля версий, системы сборки, gdb, valgrind, развертывание и настройка систем непрерывной интеграции.
Цель курса — дать слушателям, которые параллельно изучают языки программирования, алгоритмы и т. п., информацию и дополнительные знания, какими инструментами можно пользоваться и на что обращать внимание при создании рыночного программного продукта.
✅ Лекция №0 (неделя 1)
- План курса
- Правила оценки
- Информация о заданиях
- Контрольные мероприятия
✅ Лекция №1 (неделя 1)
- Что такое архитектура ПО
- Что такое "Проектирование ПО"?
- По каким критериям можно оценить архитектуру?
- Критерии хорошей архитектуры
- Эффективность
- Гибкость
- Расширяемость
- Масштабируемость, тестируемость, возможность повторного использования, сопровождаемость
- Критерии неудачной архитектуры
- Жесткость
- Хрупкость
- Неподвижность
- Критерии хорошей архитектуры
- Принцип High Cohesion / Low Coupling
✅ Лекция №2 (неделя 1)
- Принципы SOLID
- Single responsibility principle
- Open-closed principle
- Liskov substitutional principle
- Interface segregation principle
- Dependency inversion principle
- Закон Деметры
- YAGNI
- DRY / DIE
- KISS
✅ Лекция №3 (неделя 2)
- Что такое UML?
- Базовое понятие о нотации UML
- Диаграмма вариантов использования
- Понятие о вариантах использования
- Понятие об акторах
- Нотация диаграммы вариантов использования
- Диаграмма классов
- Понятие о классах
- Нотация диаграммы классов
- Выделение сущностей
- Карточки CRC
- Метод Аббота
- Диаграмма последовательности
- Нотация диаграммы последовательности
- Диаграмма состояний
- Нотация диаграммы состояний
- Диаграмма деятельности
- Нотация диаграммы деятельности
✅ Лекция №4 (неделя 2)
- Основные этапы жизненного цикла проектирования, реализации и внедрения ПО
- Формирование требований
- Разработка концепции
- Техническое задание
- Эскизный проект
- Понятие о MVP и примеры MVP
- Технический проект
- Рабочая документация
- Поставка / ввод в действие
- Сопровождение
- Вывод из эксплуатации
✅ Лекция №5 (неделя 3)
- Основные понятия
- Факторы, оказывающие влияние на процесс разработки
- Внешние факторы
- Внутренние факторы
- Каскадная модель
- V-модель
- Инкрементная модель
- Итерационная модель
- Спиральная модель
- RAD-модель
- Семейство гибких методологий
- Agile-манифест
- Scrum
- Kanban
✅ Лекция №6 (неделя 3)
- Основные этапы отладки ПО
- Воспроизведение дефекта
- Необходимая информация для воспроизведения
- Анализ дефекта
- Понятие root-cause
- Условия возникновения
- Область повреждения
- Необходимые выводы
- Дизайн исправления
- Технический
- Архитектурный
- Технологический
- Исправление дефекта
- Валидация исправления
- Интеграция исправления в код или целевую систему
- Дополнительные валидации после интеграции
✅ Лекция №7 (неделя 4)
- Запуск программ в отладчике (трассировка)
- Софтверный дебаггер
- "Железный" дебаггер
- Удаленный дебаггер
- Логирование
- Работы системы
- Программного кода
- Анализ программного кода без исполнения программы
- "Метод пристального взгляда"
- Статические анализаторы
- Анализ поведения системы
- Упрощение сценария
- Ограничение объема данных
- Упрощение данных / запроса
- UNIT-тестирование
- Прототипирование
- Отладка с помощью дампов
- Отладка с помощью перехватов
- Профилирование кода
- Выполнение кода в другой среде
- Отладка методом RPC (Remote procedure call)
- Отладка путем анализа документации
- Отладка трансляцией кода
- Трансляция "вниз"
- Трансляция "вверх"
- Отладка разработкой интерпретатора
- Метод индукции
- Метод дедукции
- Обратное движение по алгоритму
✅ Лекция №8 (неделя 4)
- Понятие о качестве ПО
- Характеристики и атрибуты качества ПО
- Основые аспекты качества ПО
- Парадокс тестировщика
- Соответствие ожиданиям stakeholder'ов
- Качество и деньги
- Десятичное правило качества
- Важные аспекты
- Ручное тестирования
- Класс эквивалентности
- Граничные значения
- 7 ключевых инструментов качества
- Причинно-следственная диаграмма Исикавы
- Блок-схема
- Контрольный листок
✅ Лекция №9 (неделя 5)
Лекционную контрольную по итогу решено проводить отдельно в дополнительное время
- 7 ключевых инструментов качества (продолжение)
- Контрольная карта (карта Шухарта)
- Примеры
- Гистограмма
- Диаграмма Парето
- Диаграмма разбрасывания
- Контрольная карта (карта Шухарта)
- Ручное тестирование. Практические советы
- Автоматизированное тестирование
- Основные аспекты
- Жизненный цикл автотеста
- Практические советы
- Как на практике?
✅ Лекция №10 (неделя 5)
- CI/CD/CD
- Понятие о Continuous Integration
- Понятие о Continuous Delivery
- Понятие о Continuous Deployment
- Пример организации процесса разработка из индустрии
- Этап проектирования
- Этап реализации
- Этап сдачи задачи
- Подготовка к выпуску версии
✅ Лекция №11 (неделя 6)
- Классификация архитектуры ПО
- Локальные
- Распределенные
- Файл-серверные
- Клиент-серверные
- Двухзвенные
- Трехзвенные
- Многозвенные
- Локальные приложения
- MVC (Model-View-Controller)
- Клиент-серверная архитектура
- Тонкий и толстый клиент
- Трехзвенная архитектура
- Оценка нагрузки на систему
- Тип проекта и влияние на нагрузку
- Ресурсы для обеспечения производительности
- Масштабирование
- Горизонтальное
- Вертикальное
- Функциональное разбиение
- Шардинг
- Типичная архитектура веб-сервиса
- Типичная архитектура нагруженной информационной системы
✅ Лекция №12 (неделя 6)
- Парадигмы программирования
- Императивное программирование
- Описание
- Примеры
- "Вложенные парадигмы"
- Процедурное программирование
- Структурное программирование
- Аспектно-ориентированное программирование
- Объектно-ориентированное программирование
- Обобщенное программирование
- Декларативное программирование
- Пример-объяснение
- "Вложенные парадигмы"
- Логическое программирование
- Функциональное программирование
- Общая схема парадигм
- Метапрограммирование
- Реализация парадигм в языках программирования
- Императивное программирование
- Компилируемые и интерпретируемые языка
- Определения
- Примеры
- Типизация
- Сильная / слабая типизация
- Статическая / динамическая типизация
- Явная / неявная типизация
Системы контроля версий, 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
Отработка на семинаре навыков построения диаграмм, решение небольших задач. Диаграммы классов пока не рассматриваем.
План семинара:
- решаем задачку на диаграмму вариантов использования (например, "варианты использования сайта аэропорта")
- решаем задачку на диаграмму последовательности (например, "снимаем деньги в банкомате")
- решаем задачку на диаграмму деятельности (например, "поступаем в университет")
- решаем задачку на диаграмму состояний ("рассматриваем сдачу курса: изучается-сдан-пересдача-не сдан")
- понятие о python и интерпретаторе
- запускаем интерпретатор и считаем парочку арифметических выражений
- показываем переменные
- пишем скрипт на сложение чисел
- пишем скрипт "Hello world"
- показываем условные переходы и циклы
- пишем простую функцию расчета факториала
Показываем дебаггер в IDE, точки останова, как с этим работать. (опционально) показываем gdb & valgrind
План семинара:
- запускаем любимую IDE
- пишем простую программу (лучше на питоне), запускаем дебагер
- показываем точки останова, шаг вперед / шаг с заходом / шаг с обходом
- показываем значения переменных
- опционально показываем профилировщик
- опционально показываем gdb - как работать из консоли (опять же, на простом примере)
- опционально показываем valgrind в простейших сценариях (память не освобождена, переменная не инициализирована, используется неинициализированная переменная в условном переходе)
Отработка на семинаре простейших примеров написания тестов на python, демонстрация разных видов тестов
План семинара:
- пишем на питоне пару простых функций (например, сложение и умножение чисел)
- показываем юнит-тесты (каждую функцию)
- показываем нагрузочное тестирование (запускаем много итераций теста, смотрим производительность)
- показываем сценарное тестирование (на уровне "посчитаем значения выражения")
Отрабатываем практические навыки проектирования (без погружения в программный код) понятных предметных задач: заказ такси через приложение, покупка в интернет-магазине...Рисуем диаграммы классов UML
План семинара:
- решаем простую задачу на проектирование локального приложения (мобильного или десктопного), без взаимодействия с сервером. Например, проектируем простейшее приложение для создания и хранения заметок. Жетально проектировать на уровне классов. Если идет сложно - сначала пытаемся выделить варианты использования и придумать, как их реализовать. Даже если получится по итогу криво, главное, чтобы получилось хоть что-то..
- решаем задачу посложнее на проектирование клиент-серверного приложения. Например, приложение для заказа такси. Обязательно надо подстветить проблему, что запрос от клиента до сервера может не дойти (или от сервера до клиента), как это можно решать (спойлер - таймлимитом)
- Пройдет 23 ноября в 20:00
- Продолжительность контрольной - 30 минут
- Вопросы будут только по материалам лекций №1 - №8
- Не нужно задавать уточняющие вопросы по вопросам контрольной в общем чате по курсу и т.п. Для уточнений пишите лектору в личные сообщения в Teams
- Контрольная проходит на базе Google Forms
- Вы можете указать любую удобную вам почту (на нее придет письмо с копией ответов) - необязательно корпоративную
- При нажатии кнопки "Отправить" на последней странице контрольной Google выведет капчу - так что имейте в виду, что нужно иметь 30-60 секунд в запасе, чтобы ее пройти
- Если у вас сломался интернет - не закрывайте и не перезагружайте страницу. В целом Google сохраняет промежуточные стадии заполнения формы, но при перезагрузке страницы иногда содержание все же теряется. Если интернет оборвался - дождитесь восстановления и продолжайте работу
- Если у вас технические сложности - обязательно сообщите об этом лектору до конца контрольной работы (после окончания никакие вопросы не принимаются)
- Вы можете использовать любые материалы, как и те, которые есть в этом репозитории, так и те, которые найдете в интернете. Запрещено только коллективное творчество с однокурсниками и списывание друг у друга
- Прокторинга не будет
- Контрольная состоит из 4 блоков
- 1-ый блок - организационный. Нужно заполнить ФИО и номер группы. Номер группы, пожалуйста, указывайте просто числом (без букв)
- 2-ой блок - тестовые вопросы. Нужно выбрать только один вариант ответа. Это проверка базовых знаний. 17 вопросов, 16 из них "стоят" 1 балл, 1 вопрос "стоит" 2 балла. Всего можно набрать 18 баллов
- 3-ий блок - вопросы со свободным ответом. Постарайтесь отвечать лаконично. Это проверка понимания полученных знаний. Всего можно набрать 6 баллов
- 4-ый блок - вопросы на оценку отлично. Это также вопросы со свободным ответом. Тут проверяется уже ваше умение применять полученные знания и умение рассуждать. Постарайтесь, опять же, отвечать лаконично, но обязательно аргументируйте ваши ответы. Просто тезисы без аргументации приниматься не будут. За этот блок можно набрать 10 баллов
- Всего на контрольной вы можете набрать 34 балла. Оценка за работу (КР) = (Баллы за работу) / 3.4 (без округления)
- Важно: если мы обнаружим в ваших работах просто скопированный текст из интернета или идентичные ответы у разных студентов - все причастные получат 0 баллов за КР. Даже если вы что-то прочитали в интернете - осознайте это и напишите ответ своим текстом, а не копируйте.
🔚 Дедлайн: 21 ноября, 23:59
Вам необходимо написать bash-скрипт, который работает с файлами.
- (1 балл) скрипт умеет принимать 3 аргумента: имя
директории для обработки
, имядиректории для сохранения результатов работы
,имя архива
- (2 балла) скрипт может рекурсивно обойти
директорию для обработки
и вывести на экран статистику: общее количество вложенных директорий, общее количество файлов, размер директории (сколько памяти занимает) - (2 балла) скрипт может скопировать все файлы
директории для обработки
(любого уровня вложенности) в кореньдиректории для сохранения результатов
(обратите внимание, повторение иерархии вложенных папокдиректории для обработки
вдиректории для сохранения результатов
не только не требуется, но и противоречит заданию) - (1 балл) скрипт может создать архив с именем
имя архива
, в который добавлены все файлы издиректории для обработки
- (2 балла) скрипт при копировании файлов из
директории для обработки
вдиректорию для сохранения результатов
умеет корректно (без потери информации) обрабатывать ситуации, когда вдиректории для обработки
имеются файлы с одинаковым именем - (1 балл) скрипт при передаче параметра
-h
(help) выводит краткую справку о том, что он делает, и какие параметры принимает - (1 балл) скрипт при передаче параметра
-s
(silence) продолжает выполнять все те же действия, но ничего не выводит в консоль
input_dir:
-
A
- test.txt
- readme.md
-
B
- test.txt
my_script input_dir output_dir archive_name
2 dirs, 3 files, 1,5Kb
output_dir
- test.txt
- test_2.txt
- readme.md
Отправьте выполненное задание в формате скрипта (в формате .sh) на электронную почту вашего семинариста.
Обязательно укажите тему письма в формате ТП2_ТЗ1_ГРУППА_ФАМИЛИЯ (например, ТП2_ТЗ1_292_ПЕТРОВ)
Составлять диаграммы можно в любом удобном для вас ПО или с помощью любого веб-сервиса. Мы предлагаем варианты: draw.io, Miro, plantuml
🔚 Дедлайн: 28 ноября, 23:59
Вам необходимо составить несколько UML-диаграмм для описания процесса снятия денег в банкомате. Обратите внимание на описание пунктов задания. Ничего "сверх" описанного делать не нужно, баллы за это, конечно, не снимаются, но и дополнительные баллы не начисляются. Также обратим внимание, что от вас не требуется знание того, как этот процесс устроен в действительности в реальных банкоматах (и проверять это мы не будем). Ваша задача описать процесс таким, каким вы его себе представляете (но тем не менее, он должен был логичным, последовательным и не противоречить здравому смыслу). Все диаграммы, выполненные в рамках задания, должна быть согласованы между собой (не должны противоречить друг другу).
- (2 балла) Составьте
диаграмму вариантов использования
(предполагаем, что банкомат умеет только выдавать деньги, больше ничего - ни платежей, ни внесения наличных). Не забудьте, что банкомат действует не сам по себе, а взаимодействует с серверами банка. При этом мы говорим именно о вариантах использования банкомата. Правильно расставьте границы системы. - (3 балла) Составьте
диаграмму последовательности
для процесса снятия денег. Не забудьте, что любые операции, производимые на банкомате, требуют согласованности с серверами банка. Также не забудьте о том, что связь между банкоматом и серверами банка может работать нестабильно, либо вообще не работать - в таком случае можно и отказать в выполнении операции. - (2 балла) Составьте
диаграмму состояний
банкомата в процессе работы, с учетом выполнения операции выдачи денег. Обязательно укажите внутренние состоятия процесса выдачи денег (например,проверка пин-кода
,ожидание ответа сервера
). Решения с одним состояниемвыдает деньги
приниматься не будут. - (2 балла) Составьте
диаграмму деятельности
для процесса получения денег в банкомате. - (1 балл) Подумайте, как обеспечить возможность работы банкомата в случае отсутствия связи с серверами банка (например, для выдачи небольших сумм денег). Отразите предлагаемое решение на
диаграмме деятельности
. Обратите внимание, не нужно вносить изменения в уже сделанную диаграмму - сделайте копию, и внесите необходимые корректировки. Т.е. вы будете присылать семинаристу на проверку две диаграммы деятельности: 1) обычный режим работы 2) работа в случае отсутствия связи с серверами банка.
Отправьте выполненное задание в формате изображений (jpg, png) или pdf-файла на электронную почту вашего семинариста.
Обязательно укажите тему письма в формате ТП2_ТЗ2_ГРУППА_ФАМИЛИЯ (например, ТП2_ТЗ2_293_ИВАНОВ)
🔥 Общий дедлайн: 19 декабря, 23:59
Реализуйте на Python простейшую программу, которая будет считывать из файла числа, а далее отдельными функциями искать среди этих чисел минимальное число, максимальное число, считать их общую сумму и произведение. Для этой программы подготовьте тесты:
- проверяющие корректность работы функций поиска минимума и максимума
- проверяющие корректность работы функций сложения и умножения
- проверяющие скорость работы программы при увеличении размера входного файла
В файле: 1 4 2 3
Минимальное: 1
Максимальное: 4
Сумма: 10 (1+2+3+4)
Произведение: 24 (1*2*3*4)
Для получения оценки "1": реализуйте функции чтения из файла, поиска минимального числа, поиска максимального числа, сложения и умножения всех чисел из файла
Для получения оценки "2": реализуйте тесты для проверки корректности функций поиска минимума, максимума, сложения и умножения
Для получения оценки "3": реализуйте тесты для проверки скорости работы программы при увеличении размера входного файла
Для получения оценки "4": реализуйте любой другой тест на ваше усмотрение
Для получения оценки "5": реализуйте программу так, чтобы не возникало аварийного завершения работы программы из-за ошибки переполнения (что может легко случиться, если чисел в файле много, и они все достаточно большие - произведение будет очень быстро расти).
Теперь вам необходимо настроить CI-систему для своего мини-проекта.
Для получения оценки "1": заведите репозиторий для своего проекта на GitHub. Оформите простейший README.md (туториал по markdown (файлы формата .md)). Загрузите в репозиторий файлы своего мини-проекта (код, тесты, README.md).
Для получения оценки "2": подключите к вашему проекту любую CI-систему (выше есть подсказки с вариантами систем, но мы крайне рекомендуем использовать GitHub Actions в рамках этого задания, только если Ваш семинарист не демонстрировал вам другую систему). Обеспечьте возможность запуска тестов в ручном режиме (например, по щелчку кнопки в веб-интерфейсе CI-системы)
Для получения оценки "3": настройте CI таким образом, чтобы прогон тестов запускался автоматически при любом новом коммите в репозиторий вашего проекта
Для получения оценки "4": сделайте интеграцию CI-системы и вашего репозитория на GitHub: сделайте бэйдж в README.md, который будет показывать текущий статус тестов. Для информации смотрите тут, тут или в аналогичном доке для выбранной вами CI-системы. Как выглядят бэйджи в целом, можно посмотреть в любом проекте на GitHub, где они сделаны, например, в репозитории Telegram.
Для получения оценки "5": сделайте любую интеграцию CI-системы и какого-либо мессенджера (например, telegram, slack, msteams и т.п.). Настройте систему так, чтобы при успешном прохождении теста посылалось сообщение "все ок", при неуспешном - посылалась информация, какие именно тесты не пройдены
Отправьте выполненное задание на электронную почту вашего семинариста. В письме должно быть:
- Часть 1:
- Файл с кодом (*.py)
- Файл(ы) с тестами
- Часть 2:
- Ссылка на репозиторий вашего проекта на GitHub (не забудьте сделать репозиторий публичным)
- Ссылка на страницу вашего проекта в CI-системе (не забудьте сделать ее публичной)
- Если сделали интеграцию с мессенджером - запишите короткое видео, что после коммита-сборки-тестов вам приходит сообщение от CI
- Ваш семинарист может попросить дополнительную информацию для проверки (например, доступ к репозиторию на GitHub, чтобы сделать проверочный коммит, или конфигурационный файл CI-системы)
Обязательно укажите тему письма в формате ТП2_ТЗ3_ГРУППА_ФАМИЛИЯ (например, ТП2_ТЗ3_293_ИВАНОВ)
- Пройдет 21 декабря в 11:00 (сначала в Teams подключение, вводные слова, начнем сам экзамен строго в 11:10)
- Продолжительность экзамена - 80 минут (1 час 20 минут)
- Вопросы будут только по материалам лекций (лекция №12 в экзамен не входит)
- Не нужно задавать уточняющие вопросы по вопросам экзамена в общем чате по курсу и т.п. Для уточнений пишите лектору в личные сообщения в Teams
- Экзамен проходит на базе Google Forms
- Вы можете указать любую удобную вам почту (на нее придет письмо с копией ответов) - необязательно корпоративную
- При нажатии кнопки "Отправить" на последней странице контрольной Google выведет капчу - так что имейте в виду, что нужно иметь 30-60 секунд в запасе, чтобы ее пройти
- Если у вас сломался интернет - не закрывайте и не перезагружайте страницу. В целом Google сохраняет промежуточные стадии заполнения формы, но при перезагрузке страницы иногда содержание все же теряется. Если интернет оборвался - дождитесь восстановления и продолжайте работу
- Если у вас технические сложности - обязательно сообщите об этом лектору до конца экзамена (после окончания никакие вопросы не принимаются)
- Вы можете использовать любые материалы, как и те, которые есть в этом репозитории, так и те, которые найдете в интернете. Запрещено только коллективное творчество с однокурсниками и списывание друг у друга
- Прокторинга не будет
- Экзамен состоит из 4 блоков
- 1-ый блок - организационный. Нужно заполнить ФИО и номер группы. Номер группы, пожалуйста, указывайте просто числом (без букв)
- 2-ой блок - тестовые вопросы. Нужно выбрать только один вариант ответа. Это проверка базовых знаний. 5 вопросов, 1 балл за каждый, всего 5 баллов
- 3-ий блок - вопросы со свободным ответом. Постарайтесь отвечать лаконично. Это проверка понимания полученных знаний. Всего можно набрать 46 баллов
- 4-ый блок - вопросы на оценку 9 и 10. Это также вопросы со свободным ответом. Тут проверяется уже ваше умение применять полученные знания и умение рассуждать. Постарайтесь, опять же, отвечать лаконично, но обязательно аргументируйте ваши ответы. Просто тезисы без аргументации приниматься не будут. За этот блок можно набрать 14 баллов
- Всего на экзамене вы можете набрать 65 баллов. Оценка за работу (ЭКЗ) = (Баллы за работу) / 6.5 (без округления)
- Важно: если мы обнаружим в ваших работах просто скопированный текст из интернета или идентичные ответы у разных студентов - все причастные получат 0 баллов за экзамен. Даже если вы что-то прочитали в интернете - осознайте это и напишите ответ своим текстом, а не копируйте.
Оценка = Округление (0,25*(ТЗ1 + ТЗ2 + ТЗ3)/3 + 0,25*КР + 0,5*ЭКЗ)