1. Зачем нужна методология программирования.
2. Что такое структурная сложность, как с ней бороться.
3. Модель системы, стандартные виды деятельности при разработке системы.
4. Процессы разработки системы, достоинства и недостатки.
5. Тестирование, зачем. Виды тестов. Когда какие тесты писать.
6. Структурная методология. Достоинства и недостатки.
7. Базовые понятия ООП. Инкапсуляция, Наследование, Полиморфизм.
8. Объектная модель системы. Стандартные способы изображения.
9. Атомарность взаимодействия. Модель актеров. Наблюдаемость.
10. Сообщения и методы. Типичные ошибки взаимодействия объектов.
11. Агрегация и атомарность взаимодействий.
12. Поддержка ООП в языке Java и C#. Виртуальные методы.
13. ОО Анализ. Идентификация объектов и классов.
14. Идентификация структур, доменов, атрибутов и сервисов.
15. ОО Проектирование, аспекты системы (пользовательский интерфейс, управление выполнением, управление данными).
16. Аспект пользовательского интерфейса. Модель-Наблюдатель.
17. Аспект управления выполнением. Нити. Синхронное и асинхронное взаимодействие.
18. Модели ввода/вывода. Влияние на модель системы.
19. Наблюдаемость. Неизменяемые объекты. Реализация Read/Write Lock.
20. Пассивная модель взаимодействия. Необходимые предположения. Команда.
21. Аспект управления данными. Сериализация.
22. ОО Программирование. Самодокументирующийся код.
23. ОО Тестирование. Жизненный цикл тестов, тестирование пользовательского интерфейса. Тестирование производительности.
24. ОО Переработка кода. Признаки необходимости переработки кода. Основные способы переработки кода.
25. Оптимизация.
26. Инструментальные средства.
27. Использованные шаблоны проектирования (фабрика, команда, наблюдатель).
28. Лицензии СПО: BSD, APL, GPL/LGPL v2, GPL/LGPL v3