2. #1 Проблемы отрасли
Инженерное образование
- курсы ВУЗов
- общепринятая терминология
- статьи и видео в интернетах
- накопление опыта
3. #2 Проблемы отрасли
В современном мире делать хорошо невыгодно
- писать хорошо - сложно, долго и дорого
- все уже можно найти и склеить
- все вроде есть, пока чего не хватишься...
- программируем на мусорку
4. #3 Проблемаы отрасли
Программная инженерия оторвалась от науки
- не отвечает на вопрос почему так, а не иначе
- программируем на фреймворках
- нет научного осмысления паттернов и приемов
- маркетологи уничтожат цивилизацию...
5. #4 Проблемаы отрасли
Сложность интеграции
- по частям есть, но не вместе
- связать сложнее, чем разработать часть
- стыки должны совпадать
- как устроено внутри
6. #5 Понимание инженерии ПО
Это наука?
Да, мы должны использовать научный метод,
измерения, анализ, эксперименты, логические
выводы
Это технологии?
Да, мы используем знания для получения
конкретной пользы от программного
обеспечения
7. #6 Понимание инженерии ПО
Это бизнес?
Да, ИТ компании используют зависимость
заказчиков для конвертации кода, времени и
прав в деньги
Это искусство?
Да, мы все же применяем наш вкус и интуицию,
чтобы сделать лучше
8. #7 Определения
Программирование это решение задач при
помощи вычислительной техники, управляемой
программным обеспечением.
Программная инженерия включает в себя
исследования, архитектуру, проектирование,
разработку, тестирование, внедрение и поддержку
программных систем.
9. #8 Основы
Математика
Алгебры, логика, топология, матанализ,
дискретная и компьютерная математика, теория
множеств, графов, категорий, вероятностей...
Электроника
Аналоговая и цифровая полупроводниковая
электроника, микроконтроллеры,
микропроцессоры, сети, память, накопители
10. #9 Основы
Алгоритмы
Теория алгоритмов, конечные автоматы, машина
Тьюринга, архитектура фон Неймана, теория
компиляторов
Абстрактное мышление
Моделирование, системный анализ, построение
абстракций данных и управления
11. #10 Моделирование
Модель это упрощенная система которая
воспроизводит поведение и структуру реальной
системы в одном или нескольких аспектах.
Мы применяем компьютерное моделирование
для исследования, экспериментов,
построения ПО и ИС.
13. #12 Классификация моделей
Модели процесса решения задачи
- императивные пошаговые алгоритмы
- ветвление
- деревья решений
- логическое программирование
14. #13 Классификация моделей
Модель результата
- Декларативное программирование
(описывает результат)
- Функциональное программирование
(результат как функция)
15. #14 Классификация моделей
Модель предметной области
- ООП и прототипное программирование
- автоматное программирование,
- реактивное программирование,
- DSL (формальный синтаксис описания
предметной области)
16. #15 Парадигмы
Парадигма программирования это
непротиворечивый набор концепций и
фундаментальных идей для моделирования
(как аксиомы для математики)
• утверждения и допущения
• структуры и ограничени
• подход, стиль и методика
18. #17 Технологии и техники
Асинхронное программирование
(reactor, event loop)
Параллельное и распределенное
программирование, исполнение на
многопроцессорных системах
Объектно-ориентированный подход:
анализ, проектирование и программирование
Визуальное программирование (ER, RUP, CAD/CAM)
19. #18 Разница парадигм
Императивная
• Алгоритмический подход и пошаговое исполнение
• Изменение значений переменных
• Условные переходы и циклы
Функциональная
• Функции, выражения и суперпозиция
• Возможно параллельное исполнение
• Не меняем аргументы, нет переменных
• Рекурсивные вызовы вместо циклов
20. #19 Что общего в парадигмах
Императивная
• Построение абстракций, композиция
• Наследование (ООП, прототипы)
• Полиморфизм и инкапсуляция
Функциональная
• Построение абстракций, композиция
• Частичное применение и каррирование
• Замыкания, функторы, монады
21. #20 Прочие парадигмы и техники
• Реактивное программирование
• Событийно-ориентированное
• Функционально-реактивное
• Модель акторов
• Мультипарадигменное программирование
• Метапрограммирование
22. #21 Два основных направления
Системное программирование
Прикладное программирование
23. #22 Задачи прог. инженерии
Справиться со сложностью
Управление состоянием
Структура и архитектура
24. #23 Задачи прог. инженерии
Справиться со сложностью
• Сложность задачи
(декомпозиция и модель)
• Спрятать сложность
(модули, слои, черный ящик)
25. #24 Задачи прог. инженерии
Управление состоянием
• Предотвращение скрытого состояния
• Минимизация глобального состояния
• Предотвращение комбинаторного взрыва
26. #25 Задачи прог. инженерии
Структура и архитектура
• декомпозиция
• именование
• связывание
27. #26 Преодоление сложности
Принцип одной ответственности
Запрет перемешивания абстракций слоев
(доступ к данным, бизнес-логика, сеть, UI)
28. #27 Преодоление сложности
Компонентный подход
увеличение переиспользования
кода и надежности
Отделение прикладного кода от системного.
Выделение и вынесение наружу
системных библиотек, инструментов,
DSL из проектов
29. #28 Связывание данных и логики
Максимальное разделение
• API or lib + data structures
• Анемичная модель предметной области
• MVC, MVP, MVVP patterns
30. #29 Связывание данных и логики
Комбинирование
• Часто в императивном, процедурном и
обобщенном программировании
• Иногда в функциональном (функуторы, монады)
• Почти всегда в ООП и компонентном подходе
31. #30 С чего начинать
Data- со структур данных или классов
centric начинаем с ERD и схем БД
Process- начинаем с моделей бизнес процессов
сentric начинаем с модели процессов обработки
UI- начинаем с UI/UX и набросков дизайна
сentric пользователь нарисовал мне тут...
32. #31 С чего начинать
Инженер все вместе держит в голове
Нет другого решения
33. #32 Системная интеграция
Оказалось, что все вместе собрать можно, только если
все по частям было так спроектировано, что
предполагалась сборка.
Определение интерфейсов и контрактов
• Спецификация API
• Выбор коммуникационных шаблонов
req/rep, pub/sub
• Выбор протоколов: RPC, Bus, Queue...