2. #1 Что нужно знать?
Обычно начинают с:
- языки программирования
- библиотеки и фреймворки
- олимпиадные задачи
- задачи для собеседований
3. #2 Что нужно знать?
Это все чушь собачья:
- языки программирования
- библиотеки и фреймворки
- олимпиадно-ориентированное п.
- собеседование-ориентированное п.
4. #3 Что нужно знать?
Чтоб быть полноценным инженером
- парадигмы программирования
- предметная область
- широкая техническая эрудиция
- абстрактное мышление
- коммуникативные способности
5. #4 Откуда брать знания?
Зато мы знаем, где нас научат:
- курсы ВУЗов
- статьи и видео в интернетах
- в компаниях научат
- на своих проектах научусь
6. #5 Откуда брать знания?
Бред сумасшедшего:
- курсы ВУЗов
- статьи и видео в интернетах
- в компаниях научат
- на своих проектах научусь
7. #6 Откуда брать знания?
Но мы добудем знания:
- перенять у профессионала
- участвовать в OpenSource разработке
- опыт в сложной предметной области
- смежные области знаний
- учить других
8. #7 Проблемы отрасли
В современном мире делать хорошо невыгодно
- писать хорошо - сложно, долго и дорого
- все уже можно найти и склеить
- все вроде есть, пока чего не хватишься...
- программируем на мусорку
9. #8 Проблемаы отрасли
Программная инженерия оторвалась от науки
- не отвечает на вопрос почему так, а не иначе
- программируем на фреймворках
- нет научного осмысления паттернов и приемов
- маркетологи уничтожат цивилизацию...
10. #9 Проблемаы отрасли
Сложность интеграции
- по частям есть, но не вместе
- связать сложнее, чем разработать часть
- стыки должны совпадать
- как устроено внутри
12. #11 Технологии и техники
Асинхронное программирование
(reactor, event loop)
Параллельное и распределенное
программирование, исполнение на
многопроцессорных системах
Объектно-ориентированный подход:
анализ, проектирование и программирование
Визуальное программирование (ER, RUP, CAD/CAM)
13. #12 Разница парадигм
Императивная
• Алгоритмический подход и пошаговое исполнение
• Изменение значений переменных
• Условные переходы и циклы
Функциональная
• Функции, выражения и суперпозиция
• Возможно параллельное исполнение
• Не меняем аргументы, нет переменных
• Рекурсивные вызовы вместо циклов
14. #13 Что общего в парадигмах
Императивная
• Построение абстракций, композиция
• Наследование (ООП, прототипы)
• Полиморфизм и инкапсуляция
Функциональная
• Построение абстракций, композиция
• Частичное применение и каррирование
• Замыкания, функторы, монады
15. #14 Прочие парадигмы и техники
• Реактивное программирование
• Событийно-ориентированное
• Функционально-реактивное
• Модель акторов
• Мультипарадигменное программирование
• Метапрограммирование
18. #17 Как не деградировать?
на однотипных и неинтересных задачах
• Cookie cutter - подумал эксплуататор
• Monkey job - подумал эксплуатируемый
19. #18 Как не деградировать?
на однотипных и неинтересных задачах
• Эксплуататору лучше думать - SaaS
• Эксплуатируемуму лучше думать -
системное программирование
20. #19 Как же найти общий язык?
между разными специальностями в разработке
• Банально - разговаривать
• По умному - формализация
21. #20 Как же найти общий язык?
Виды формализации
• Шаблоны
• Стандарты: RFC, Ecma, ISO...
• Модели: UML, ERD...
• Методологии: RUP, Agile…
• Формальные языки
22. #21 Задачи прог. инженерии
Справиться со сложностью
Управление состоянием
Структура и архитектура
23. #22 Задачи прог. инженерии
Справиться со сложностью
• Сложность задачи
(декомпозиция и модель)
• Спрятать сложность
(модули, слои, черный ящик)
24. #23 Задачи прог. инженерии
Управление состоянием
• Предотвращение скрытого состояния
• Минимизация глобального состояния
• Предотвращение комбинаторного взрыва
25. #24 Задачи прог. инженерии
Структура и архитектура
• декомпозиция
• именование
• связывание
26. #25 Преодоление сложности
Компонентный подход
увеличение переиспользования
кода и надежности
Отделение прикладного кода от системного.
Выделение и вынесение наружу
системных библиотек, инструментов,
DSL из проектов