Разобравшись с глобальными целями проекта, можно начать составлять конкретные планы дальнейших действий. Объективной истиной является тот факт, что плану почти невозможно следовать в точности, и к этому нужно быть готовым. Почти обязательно окажется, что вы что-то не предусмотрели, где-то ошиблись, что-то не так рассчитали. В результате вам придется либо совершать не ожидавшуюся ранее работу, либо возвращаться назад и что-то переделывать. Однако, вышесказанное вовсе не означает, что заниматься планированием - бессмысленно. Напротив, к составлению плана работы нужно отнестись ответственно, и постараться с самого начала предусмотреть все, что только можно.
Итак, концептуально план работы над данным моим проектом представляет собой следующее (с учетом некоторых важных поправок, о которых ниже):
1. Постановка задачи. Для начала нужно четко определиться, что мы хотим получить результатом своей работы. По сути, это самый важный пункт, поскольку решения, принятые на этом этапе, будут иметь определяющее значение на все, что будет происходить в дальнейшем. Начиная с самых общих идей, через их конкретизацию мы придем к составлению вполне конкретных документов, в которых будет четко зафиксирован будущий облик нашей игры. Говоря упрощенно, после этого останется только реализовать то, что будет уже придумано. Говоря же более строго, в дальнейшем каждый последующий этап будет все менее и менее творческим и все более и более техническим. Насколько - обязательно смотрите чуть ниже!
2. Выбор инструментов. Еще один пункт, важность которого не стоит недооценивать. Правильно выбрав средства, которые будете в дальнейшем применять, вы сможете повысить эффективность своей работы, уменьшить количество возможных ошибок и улучшить качество вашего продукта по каким-либо параметрам (надежность, потребление ресурсов, функциональность). Под инструментами я здесь подразумеваю, в частности, язык программирования, среду разработки, используемые библиотеки, API и типы различных ресурсов, и другое.
3. Проектирование. Имея перед собой четко поставленную задачу, и определившись с набором инструментов, мы начинаем эту задачу решать. Однако, мы вовсе не беремся сразу же что-то программировать. Прежде нам нужно построить структуру будущего приложения - разбить его на составляющие элементы и определить, как они друг с другом соотносятся. На самом деле, это по-прежнему еще очень творческий этап, хотя тут и начинают уже проявляться технические моменты. Надеюсь, я не удивлю вас, сказав, что этот этап самый важный после постановки задачи - ведь на этой стадии также закладываются те отношения, которые будут играть определяющую роль в дальнейшей работе. Составив четкую схему приложения, нам нужно будет только реализовать отдельные ее элементы и обеспечить необходимые взаимосвязи между ними. Опять же, упрощенно говоря.
4. Создание кода. Этот пункт включает в себя весь обширный процесс воплощения составленного проекта в программный код. Помимо собственно игры я планирую разработать некоторое количество сопутствующего инструментария (главным образом - редактор карт). Как бы ни было обидно, но в некотором отношении этот этап будет проходным - результат его выполнения не будет оказывать определяющего влияния на финальный облик игры. Структура ее определяется проектом, внешний вид - дизайном и контентом, а код - это рабочая прослойка между ними. Примерно как мышцы, являющиеся рабочей прослойкой между скелетом и кожей. Но, само собой, на этом этапе нельзя расслабляться - ошибки, сделанные здесь, могут также оказать роковое влияние на конечный результат.
5. Формирование команды. Когда у нас имеется уже почти готовый код игры, пора позаботиться и о ее внешнем виде. Точно можно сказать, что нам понадобятся специалисты по графике и звуку. Кроме того, потребуется замещение еще некоторых ролей (дизайнер уровней, дизайнер интерфейса, тестеры, писатель, модератор сайта и т.п.), но, в зависимости от нагрузки и сложности, это могут сделать уже имеющиеся члены команды.
6. Финализация проекта. Найдя необходимых нам специалистов, мы переходим к созданию игрового контента - графики, игровых уровней, музыки, фоновых звуков и т.п. Пусть только вас не обманывает слово "финализация", создавая у вас иллюзию, будто она займет лишь пару дней. Просто я не подобрал более подходящего слова для описания всего обширного процесса превращения игрового движка в конечный игровой продукт. Здесь мы постараемся максимально эффективно обыграть все технические возможности, заложенные в программный код, чтобы создать максимально приятный и увлекательный геймплей. Кстати, на этом этапе срезаются многие разработчики игр. Помимо создания новых вещей (дизайна, сюжета, контента) здесь мы занимаемся доводкой старых - доводим до ума программный код, структуру интерфейса, параметры геймплея (ИИ, игровой баланс, экономику при ее наличии, некоторые неглобальные фичи и другое). Также здесь очень важна координация усилий всей команды, что позволит в разумные сроки создать качественную и цельную игру.
Замечания
Необходимо отметить, что реально фазы работы над проектом не будут идти в точности в такой последовательности - зачастую они будут пересекаться. Так, пункты Проектирование и Создание кода на самом деле не могут идти независимо друг от друга. Очень часто придется возвращаться к ранее пройденным пунктам и вносить изменения с учетом полученного опыта или каких-то новых выявленных моментов. Процесс создания программных продуктов по природе своей итеративен, и проектирование здесь тесно связано с созданием конкретного кода.
Кроме того, пункт Выбор инструментов может быть выполнен к окончанию пункта Постановка задачи и, по крайней мере, частично найдет свое отражение в составленных в этом пункте документах.
Также замечу, что данный план в общих чертах верен в ситуации, когда проект начинается с одного программиста, который затем по мере насущной необходимости собирает команду. В уже сформировавшемся коллективе уже после постановки задачи в более или менее конкретной форме может начинаться работа ролей не только программиста, но и художника (составление концепт-арта), дизайнера уровней, писателя (создание игрового мира и сюжетной линии) и, возможно, других. (Говоря о ролях, я хочу подчеркнуть, что "один человек" != "одна функция", в небольших проектах один член команды может выполнять несколько видов работ, в больших - одну функцию могут совместно выполнять несколько участников, причем количество занятых людей будет варьироваться в зависимости от этапа развития проекта).
В моем случае я, помимо функций программиста, буду выполнять роль автора концепта (часть работы писателя), автора технической документации (относящейся к пункту Постановка задачи и Проектирование) и "коммьюнити-менеджера" (создание постов, подобных этому и осуществление обратной связи с аудиторией проекта).
Более подробный разбор пунктов данного плана будет приведен в следующих постах.