Проектирование
Виды разработки (по характеру и динамике требований)
- Исследовательская разработка
- Заказная разработка (большая и маленькая)
- Продуктовая разработка
Управление требованиями (приоритезация)
- Список функциональных и нефункциональных требований к программе должен быть в базовом виде готов до начала программирования
- Требования могут изменять свой приоритет в ходе разработки
Суть проектирования
- Организация программы как набора выделенных частей, каждая из которых имеет определенный круг ответственности, а также интерфейсы к другим частям и внешним системам.
Объектное проектирование
- Программа как набор взаимодействующих объектов: каждый объект является экземпляром некоторого класса, а классы образуют иерархию.
Проектирование «не с нуля»: виды композиции и взаимодействия кода
- POSIX-подпроцессы (duplicity)
- просто скрипт поверх библиотеки (sage)
- true-объектная композиция (Django apps: middleware, contextprocessors)
BIG upfront design — достоинства и недостатки для разных задач
- большой ответственный софт (атомные реакторы, космические аппараты)
- маленький безответственный софт (веб-сервисы)
Примеры плохого проектирования (doing it wrong)
- we engineers like to (over)engineer
- overdesign example: workers, threads, statuses, queues...
- все во одном классе — OOP done wrong
- uwsgi/print example
Постепенное проектирование
- minimum viable product
- Гибкость внешних требований
- Непрерывное тестирование
- Непрерывный рефакторинг
- Хорошая тестируемость и отлаживаемость (пример с NT Service, который отлаживать сложно)
Паттерны проектирования
- Не нужно пытаться внедрить в программу их все сразу
- Хорошее основание для рефакторинга
- Спорное основание для проектирования upfront
Ссылки
Eric. S. Raymond. The art of UNIX Programming — очень толковый, с многочисленными примерами из свободных программ, обзор принципов проектирования (UNIX)
Gang of Four — Design Patterns — знаменитая монография по паттернам
Test Driven Django Development — очень толковое введение в инкрементную разработку, основанную на тестах (Test Driven Development) на примере Django.