“Хорошая архитектура дорога? Это вы плохую не пробовали.”
– народная мудрость
Во введении в книгу “Паттерны в программированни игр” (она же “Шаблоны программирования игр”, “Шаблоны игрового программирования”, “Game Programming Patterns”) Боб Найстром пишет интересное и полезное об архитектуре программ и об оптимизации.
Вот некоторые запомнившиеся моменты.
Хорошая архитектура программы – это пригодность программы к изменениям, возможность внести нужные изменения небольшими усилиями. Если программу не требуется менять (потому что она уже совершенна или потому что совершенно никчемна) – ее архитектура несущественна.
Архитектура – это не столько про то, как писать код, сколько про то, как его организовать.
Цена хорошей архитектуры: усилия по организации кода и поддержанию порядка при внесении каждого изменения.
Самая долгая стадия программирования – изучение программы перед внесением изменений. Это ужасно долгий и дорогой процесс, так что стратегии, упрощающие и ускоряющие изучение кода, очень выгодны.
Одна из способов упростить изучение кода – уменьшение связности (разъятие, расцепление, decoupling), т.е. деление кода на части таким образом, что можно изучать и менять каждую по отдельности.
Излишнее увлечение шаблонами проектирования, уровнями абстракции, плагинами и расширяемостью не приводят ни к чему хорошему. Когда надо добавить фичу, вроде бы достаточно понять совсем небольшой кусок содержательного кода, но добраться до него и понять все промежуточные интерфейсы и абстракции само становится сложнющей задачей.
Проектируя программу, балансируем несколько факторов:
Про “когда оптимизировать рантайм-скорость”: обычно проще забавную игру сделать быстрой, чем быструю игру – забавной.
Про быстрые и не очень аккуратные прототипы: полезны, чтобы быстро проверить много идей и выбрать дальнейшее направление. Главное, чтобы грязный временный код действительно потом выкинули или переписали, а не потащили в продакшен, потому что “ну ведь уже работает”. Чтобы такого соблазна даже возникнуть не могло, можно прототип писать на языке, отличном от языка продакшен-системы.
В общем, все сложно. Если и есть универсальный рецепт, облегчающий жизнь – это простота. Делать делать данные и код максимально ясными и прозрачными. Важно: чтобы написать более простой код, обычно требуется больше времени.
Вот так. Полная веб-версия книги здесь: http://gameprogrammingpatterns.com/contents.html, там же можно купить электронный или бумажный вариант издания.