2. План занятия
Проектирование: от системы к компонентам
Борьба со сложностью на всех этапах
проектирования
Программирование: от компонентов к коду модулей
Эксплуатация: выбор инструментария
2
3. Этапы создания проекта
Этапы:
1. Анализ предметной области и постановка задачи
2. Проектирование, уточнение ТЗ
3. Разработка
4. Анализ разработанного продукта (ревью, тесты)
5. Ввод в эксплуатацию
3
4. Проектирование
Перевод ТЗ от слов к делу
Закладка фундамента сервиса, подсистемы
Уточнение ТЗ по итогам проектирования
4
6. Проектирование
Проектирование — один из важнейших этапов
Многие ограничения (или ошибки) закладываются
на этапе проектирования
Исправление ошибок проще всего на этом этапе
6
7. Проектирование
Что влияет на сложность?
Технологии
— архитектура системы
Реализация решения
— архитектура кода
Эксплуатация решения — железо + системное ПО
7
8. Борьба со сложностью
Общие принципы
K.I.S.S
Keep it simple, stupid!
Преждевременная оптимизация — корень всех бед
8
9. Борьба со сложностью
При проектировании
Используйте знакомые технологии
Большую часть веб-проектов можно сделать на LAMP
Используйте минимальный набор технологий
Чем меньше разных компонентов, тем надежнее система
9
10. Борьба со сложностью
При проектировании. Примеры:
Как писать в несколько баз одновременно?
Как обрабатывать ошибки?
10
11. Борьба со сложностью
При разработке
Чем проще код, тем проще поддерживать
Не злоупотребляйте парадигмами
Не используйте сложные инструменты для простых
вещей
11
12. Борьба со сложностью
При разработке. Парадигмы
Не злоупотребляйте парадигмами
Классовая борьба — это не Маркс,
это страшный сон программиста
12
13. Борьба со сложностью
При разработке. Инструменты
use XML::LibXML;
sub make_xml{
my ( $mod, $data ) = @_;
my $doc = XML::LibXML->createDocument( $mod->{xml}->{version}, $mod->{xml}->{encoding} );
my $reestr = $doc->createElement( 'reestr' );
for my $payment ( @{ $data->{reestr} } ){
my $payment_element = $doc->createElement( ‘payment’ );
$reestr->appendChild( $payment_element );
_add_element( $doc, $reestr, ‘currency', 643);
_add_element( $doc, $reestr, ‘amount', $payment->{pay_amount} );
}
$doc->setDocumentElement( $reestr );
return $doc->toString( 1 );
}
13
14. Борьба со сложностью
При разработке. Инструменты
<?xml version="1.0" encoding="windows-1251"?>
<reestr>
<tmpl_loop payments>
<payment id="<tmpl_var payment_id>">
<currency="643” amount="<tmpl_var amount>“ />
</payment>
</tmpl_loop>
</reestr>
14
15. Борьба со сложностью
При эксплуатации
Выбирайте инструменты, соответствующие уровню
Разные инструменты на разных этапах
Советуйтесь с отделом эксплуатации
15
16. Проектирование
Этапы проектирования
1. Обобщение требований и перевод абстракций в
формализованную систему
2. Разбиение системы на части (компоненты)
3. Выбор инструментов для реализации компонентов
16
18. Проектирование кода
От проектирования архитектуры
к проектированию кода:
От абстракции к системе
От целой системы к компонентам
От компонентов к проектированию модулей
От проектирования модулей к реализации методов
18
19. Проектирование кода
Принципы модульного программирования во многом
сходны с принципами нисходящего проектирования:
Сначала определяются состав и взаимосвязи функций,
а затем — набор программных модулей,
реализующих эти функции.
19
20. Модульное программирование
Модуль — это самостоятельная часть программы,
имеющая определенное назначение и
обеспечивающая заданные функции обработки
автономно от других частей
20
24. Модульное программирование
Восходящее и нисходящее программирование
Восходящее:
для каждого модуля запрограммированы все модули, к которым он
может обращаться
Нисходящее:
программируется с главного модуля, нижние представляются в виде
вызовов (заглушки)
24
26. Эксплуатация
Выбор «железа»: сколько вешать в граммах?
Ответы:
1 фронтенд на 1 млн. хитов в сутки
Деньги:
1 сервер очередей на 300 процессов
Рассылки:
1 рассыльщик на 5 млн. писем
26
29. Эксплуатация
Погоня за «аптаймом»
100% аптайма — редко достижимый результат
Ресурсами железа не обойтись
Допустимый уровень аптайма
В разных системах и компонентах — разный
29
30. Резюме
Проектирование — один из самых важных этапов
Чем проще, тем лучше
Нисходящее проектирование систем снижает
сложность
Разные системы — разные подходы к инструментам
Идеалы недостижимы, но стремиться можно
30