24 декабря 2010

TODO -> DONE

Привет. Я хочу рассказать о такой практике ведения хобби-проектов, как метод TODO -> DONE. Это не претендующая на уникальность мутант выращенный методом скрещивания GTD и roadmap, мутирующий до неузнаваемости.

Зачем? Время на хобби появляется самым случайным образом, причем в совершенно произвольном размере. Применяя свое время к хобби-проекту важно использовать его максимально эффективно. Поэтому я и придумал для себя метод TODO -> DONE, который применим не только к хобби-проектам.

В двух словах метод заключается в использование TODO-дерева, где узлы дерева это TODO, а листья это подзадачи для родительского узла. Возьмем простой пример (я кстати использую org-mode из стандартной поставки GNU/Emacs):

#+STARTUP: showall
* Супер игра
  Там можно будет бродить по подземелью и убивать монстров.

Это не правильно. Когда у нас появиться свободное время, такое описание не даст нам представления о том что уже сделано, а что еще только придется сделать.

#+STARTUP: showall
* Супер игра
  Там можно будет бродить по подземелью и убивать монстров.
* TODO Подземелья
* TODO Игрок
* TODO Монстр
* TODO Перемещения
* TODO Кровопускание

Это уже лучше, но...

  1. Мало информативно, опять не понятно что сделано, а что нет. Но уже лучше.
  2. Не дает информации о последовательности действий. Мы не знаем что зачем идет, и важна ли последовательность.

Что же делать? Сначала нужно сделать дерево.

#+STARTUP: showall
* Супер игра
** Общая идея
   Там можно будет бродить по подземелью и убивать монстров.
** TODO Можем показывать
*** TODO Подземелья
*** TODO Игрок
*** TODO Монстр
*** TODO Перемещения
*** TODO Кровопускание

Уже лучше, но опять нет информации о последовательности действий и ее по прежнему мало. Действуем по следующему алгоритму:

  1. Берем корень (Можем показывать)
  2. Определяем всех потомков (Подземелье, Игрок, Монстр, Перемещения, Кровопускания)
  3. Определяем самое простое что мы можем добавить (монстр)
  4. Возвращаемся к шагу один, считая что корень это монстр, если потомков нет то продолжаем дальше.
  5. Разбив задачу монстр выбираем следующую по простоте и делаем с ней тоже самое.
  6. Заново составляем дерево.

Последний пункт поясню после примера:

#+STARTUP: showall
* Супер игра
** Общая идея
   Там можно будет бродить по подземелью и убивать монстров.
** TODO Можем показывать
*** TODO Подземелья
**** TODO Комнаты
**** TODO Двери
**** TODO Коридоры
**** TODO Объекты
***** TODO Предметы
***** TODO Декорации
**** TODO Монстр
***** TODO Характеристики
****** TODO Здоровье
****** TODO Урон
****** TODO Защита
****** TODO Опыт
****** TODO Уровень
***** TODO Инвентарь
****** TODO Предмет
******* TODO Добавления предмета
******* TODO Выбрасывание предмета
******* TODO Использование предмета
******* TODO Ограничение на предметы
***** TODO Поведение
****** TODO AI или Управление игроком
***** TODO Перемещения
***** TODO Сражение двух монстров

Получилась иерархичная структура, которая немного пугает. Правда? Как видите, мы изменили изначальную иерархию дерева, это из-за пункта в котором мы заново составляем дерево.

Теперь упрощаем дерево и удаляем дублирования:

#+STARTUP: showall
* Супер игра
** Общая идея
   Там можно будет бродить по подземелью и убивать монстров.
** TODO Можем показывать
   - [ ] Подземелья
     - [ ] Комнаты
     - [ ] Коридоры
     - [ ] Объекты
       - [ ] Двери
       - [ ] Монстр [0%]
         - [ ] Характеристики
           - [ ] Здоровье [0%]
             - [ ] Урон
             - [ ] Защита
             - [ ] Опыт
             - [ ] Уровень
         - [ ] Инвентарь
           - [ ] Предметы [0%]
             - [ ] Добавления предмета
             - [ ] Выбрасывание предмета
             - [ ] Использование предмета
             - [ ] Ограничение на предметы
         - [ ] Поведение
           - [ ] AI
             - [ ] Поиск пути
             - [ ] Следование пути
           - [ ] Управление игроком
         - [ ] Сражение двух монстров
       - [ ] Декорации

Это чек боксы, они не так пугают и выглядят менее нагружено, к тому же они влияют на состояние готовности родительских элементов. Я использую проценты для узлов которые имеют четыре и более потомков, мне так больше нравиться.

На последнем этапе стоит постараться дать себе оценку по времени. Если это сделать, то когда вы будете выбирать задачу для решения, вы сможете выбрать ту которую успеете сделать, или ту которая займет меньше времени.

Если вы не сделали то что планировали, это нужно пометить, возможно стоит добавить к узлу еще потомков, что бы можно было отметить то что уже сделано.

#+STARTUP: showall
* Супер игра
** Общая идея
   Там можно будет бродить по подземелью и убивать монстров.
** TODO Можем показывать
   - [ ] Подземелья
     - [ ] Комнаты (2h)
     - [ ] Коридоры (1h)
     - [ ] Объекты
       - [ ] Двери (1h 30m)
       - [ ] Монстр [0%]
         - [ ] Характеристики
           - [ ] Здоровье [0%]
             - [ ] Урон (15m)
             - [ ] Защита (15m)
             - [ ] Опыт (15m)
             - [ ] Уровень (15m)
         - [ ] Инвентарь
           - [ ] Предметы [0%]
             - [ ] Добавления предмета (30m)
             - [ ] Выбрасывание предмета (30m)
             - [ ] Использование предмета (1h)
             - [ ] Ограничение на предметы (1h)
         - [ ] Поведение
           - [ ] AI
             - [ ] Поиск пути (3h)
             - [ ] Следование пути (2h)
           - [-] Управление игроком (4h)
             - [X] Перехват событий клавиш
             - [X] Оброботка событий
             - [ ] Определения столкновений (1h)
         - [ ] Сражение двух монстров (2h)
       - [ ] Декорации (1h)

Так мы можем понять последовательность задач и что от чего зависит. Главное помнить что время не обязательно стараться оценивать точно, это просто ранжирование по предполагаемой сложности. Важно помнить что могут быть взаимосвязанные задачи, это нужно помечать, можно описанием к задаче, или еще каким-то образом. Не бойтесь менять дерево и дробить задачи, если это возможно. Чем больше листов у дерево, тем лучше и легче для вас в исполнении. Задачи должны быть в идеале на 15-30 минут. Не стоит забывать что сразу продумать все не возможно, лучше по началу не углубляться в реализацию (то есть писать что тут нужно реализовать список, а тут добавить метод), делать это стоит только тогда, когда вы беретесь за конкретно этот лист, и уже можете на практике посмотреть что же он на самом деле из себя представляет и что потребуется для его реализации.

Самое главное, хобби-проекты должны делаться по настроению, никогда не планируйте что-то сделать в какой-то конкретный срок, относитесь к хобби, как к хобби, это очень экономит время, не придется переписывать то, что написано в состоянии лишь бы отделаться. Врать плохо, себе врать в двойне плохо. Под настроение все делается в двойне быстрее.