2015-05-25

Об идее

Давайте немного посмотрим, как работают мозги системного архитектора. Например, на примере меня и одной моей идеи, которая копошится в мозге и требует быть выраженной в виде красивых диаграмм и понятного текста.
Как я уже писал, мой предыдущий подход к GTD завершился созданием своей собственной программки. Чем мне не нравились другие GTDшные программки, некоторые даже весьма неплохие? Своей жесткостью, и проистекающих из этой жесткости ограниченностью и сложностью. Все понимают GTD буквально. И в результате у нас есть задачи, задачи расположены в нескольких корзинках, у задач есть набор свойств. Количество свойств жестко задано. И все эти контексты, приоритеты, персоны и т.д. — это лишь списки, пусть и кастомизируемые. И каждой задаче можно назначить лишь один элемент из списка, включить лишь в один контекст.
Но ведь GTD, да и любая правильная система организации личных дел, должна быть гибкой. Системы бывают разными. Например, дорофеевская джедайская техника — это четыре корзинки: сегодня, на неделе, потом, плюс инбокс. Ну и, собственно, все. Правда, рекомендуемая им Micromiles еще добавляет цели (Goals), контексты и категории. А также даты, периодичность, возможность скрывать задачу до определенной даты. Причем цели сами по себе — какие-то комплексные сущности, с которыми еще надо разобраться. А у каждой задачки еще имеется справочная информация в виде текстовых заметок, чеклистов и/или вложений.
Но система должна быть гибкой. Micromiles хороши, но мне, например, хочется еще корзинку для задач на завтра, куда кидать задачи из сегодня, которые по какой-то причине должны быть отложены, но откладывать на неделю — это сильно далеко. И я, бывает, использую чеклисты в задачах, как списки подзадач. Ну беда такая, я часто вижу задачу на несколько шагов вперед, и это тоже надо где-то записать. Но вот уровней вложенности задач-подзадач часто требуется больше двух. В конце концов проекты-задачи-подзадачи — это сущности одного типа, в моем понимании. Просто что-то упорядоченное и иерархичное.
В общем, попытка с одной стороны упростить, уменьшить число сущностей, а с другой стороны, добавить гибкости, привела к созданию вот такой модели в этой самой моей программке.
Action-Folder Data Model
У нас есть лишь две сущности: папки и действия. Папки организованы в обычную древесную иерархию. Папки представляют собой любые измерения для группировки действий, какие вы захотите и сколько захотите. У папок есть типы, которые могут иметь специальное значение. Действия располагаются в папках как файлы. Причем одно и то же действие может одновременно находится в нескольких папках, как жесткие ссылки в файловой системе. В результате, например, завершенность действия означает всего лишь нахождение его в папке с типом "Сделано", пусть в UI это и делается простановкой галочки. Или можно, например, составить списки покупок для разных магазинов, где вы бываете. Но если вы купили колбасу в одном магазине, она будет помечена как купленная и в другом списке. Порядок действий в папке задается явно, ибо я считаю это важным.
А в Micromiles можно задавать у действий и чеклисты и просто текстовые примечания. А что, если еще уменьшить количество сущностей? Объединить папки и действия? Пусть будет лишь один Item. Вот такой.
Item
Item содержит и текстовое примечание, и упорядоченный список других айтемов — чеклист. И сам входит в дочерние списки родительских айтемов. Собственно, получается граф. Можно добавить аттачменты. А еще стоит добавить теги, вместо типов папок, чтобы различать, что у нас сделано, что инбокс, а что еще что, чтобы понятнее выражать операции над айтемами.
Item
Раз это граф, можно и мыслесхемы так выражать ;)
Item hierarchy
Как хранить эту модель? Ну можно в реляционной базе, благо в Android у нас уже есть SQLite. А можно и в документной, например, в Couchbase Lite. А проще всего, пожалуй, в графовой БД. Выделяем вопрос хранения в отдельный архитектурный слой, и принимаем архитектурное решение выбрать конкретную реализацию этого слоя позднее. В конце концов, нам нужно еще другие, более важные вопросы решить, которые можно обкатать и тупо на объектах в памяти.
Storage Layer
Какие операции возможны в этой модели? Пусть корневой айтем нашей иерархии задач/заметок всегда существует. Нам нужно создавать новый айтем как дочерний к текущему айтему, добавлять его на определенную позицию в списке. Нам нужно менять свойства айтема, менять заголовок и заметки, переупорядочивать дочерние айтемы в списке. Нам нужно копировать айтем в дочерний список другого айтема, создавать жесткую ссылку, добавлять еще одного родителя. Нужно удалять айтем из списка дочерних, а когда у него не останется ни одного родителя, удалять вообще. Вот, собственно, и все базовые операции. Ну понятно, что нам еще нужно читать айтемы, искать их по имени, а, пожалуй, и по полному тексту заметок, а еще искать по тегам.
Но кроме этих базовых нужен еще набор более высокоуровневых операций. Которые будут соответствовать нажатию на одну кнопку в интерфейсе. Например, установка чекбокса на айтеме должна делать следующее: найти айтемы, помеченные тегом "сделано", скопировать данный айтем в дочерние списки всех "сделанных" айтемов. Нужно еще действие на перенос в другой список: скопировать в дочерний список другого айтема и удалить из дочернего списка текущего айтема. Это пригодится для переноса задач из одной коробки в другую. Много еще каких действий можно придумать. Собственно, набор действий, и соответствующих им кнопочек интерфейса, и даст нам конкретную реализацию, будь то классический GTD или джедайская техника, которую можно выстроить поверх этой модели. Появляется слой операций.
Operations Layer
Самое главное, чего не хватает в существущей моей программке, и что жизненно необходимо для подобной утилиты, — это синхронизация. Причем нужна не только синхронизация между различными устройствами одного пользователя, чтобы везде был один и тот же список задач, но и синхронизация между пользователями, чтобы можно было вести совместные списки. Тут нужен журнал изменений. Все действия над локальными айтемами записываются в журнал. Этот журнал передается на другое устройство. Полностью, для синхронизации между устройствами одного пользователя. Или частично, для поддерева айтемов, для синхронизации этого поддерева с другим пользователем. Как в том же Дропбоксе, расшариваем папку. На другой стороне журнал должен проигрываться и применяться к локальным айтемам. Будут конфликты. Хорошо, что в нашем случае конфликты можно легко разрешить — если с одной стороны сказали "А", а с другой сказали "Б", то пусть в списке будет и "А", и "Б".
Operation Log
Понятно, что при передаче журнала операций на некий удаленный адрес, его нужно фильтровать. Передавать только те операции, которые относятся к нужному поддереву айтемов, не передавать операции, инициированные самим этим адресом. Важно, что ведение журнала и применение входящих изменений легко могут быть отделены от собственно передачи журнала. Передавать можно как угодно, хоть через XMPP, хоть через Bluetooth. В общем, не важно. Принимаем еще одно архитектурное решение: реализуем и отрабатываем синхронизацию данных через журнал операций, откладывая решение о механизме передачи журнала на потом. Появляются еще слои.
OpLog/Sync Layers
Забавно, что в этой архитектуре нет центрального хранилища данных, как это нынче принято в наших облаках. Даже если появится веб-версия приложения, это будет лишь еще один клиент, который будет синхронизироваться с другими аналогичными клиентами.
Само собой, нужен еще слой взаимодействия с пользователем. Под Андроид и, может быть, веб. Может быть, с возможностью назначать свои кнопочки для раскладывание задачек по своему индивидуальному набору коробочек. (А на самом деле, копирования айтемов из одного дочернего списка в другой, ориентируясь на теги).
All Layers
Гибко? Красиво? Хотите написать это на Котлине?      

2015-05-09

О джедайской технике

Приезжала к нам фея по имени Макс. И проводила волшебный тренинг о джедайской технике повышения личной эффективности. О том, как не продалбывать, и доводить дела до конца (ДДДК). Уже третья ИТ компания в Омске проходит этот тренинг. И количество джедаев в Омске опасно увеличивается ;)
Jedi Max
Проблема-то известна. Мы забываем, что хотели сделать. Мы забываем, что надо сделать. Мы забываем, как мы это собирались сделать. Мы не успеваем. Мы откладываем. Мы не хотим. И вообще, пойду вконтактик почитаю или понечек на девиантарте посмотрю.
И если на работе таки есть Жира или Редмайн. Есть хоть какой-то список задач. И есть могучий менеджер с кнутом и пряником. То что делать с личными делами? Мама еще полгода назад просила что-то мелкое сделать? Что же она просила?
Как вообще жить, если с аурами что-то не то?
Решение-то простое. Если не запоминаете, то записывайте. Я уже десять лет записываю. (На самом деле неправда.) На самом деле записывайте вообще все. Если вы записали какую-то новую задачу в задачник, можно о ней благополучно забыть, и вернуться к тому, чем вы занимались до того, как возникла задача. Если вам внезапно пришла мысль, запишите её и снова забудьте. Пусть голова будет пустой. И тогда в неё смогут влезть другие мысли. Может быть, даже более важные.
Метод Дамблдора. Выкидывать из головы лишние и опасные мысли в омут памяти (протез мозга). Чтобы воспользоваться ими (или кто-то другой мог воспользоваться) потом.
Dumbledore Memory
Ведь именно компьютеру пророчили роль усилителя интеллекта. (Не путать с расширителями сознания.) И ведь именно сейчас они могут выполнить эту роль. По крайней мере помнить вместо вас.
Эта конкретная джедайская техника — в каком-то смысле упрощение GTD. Только вот все реализации GTD понимают всё слишком буквально. И диктуют свои, часто необоснованно жесткие, правила. Мои предыдущие подходы к снаряду закончились созданием собственного мобильного приложения для, типа, GTD. Однако и это приложение пока осталось лишь локальным менеджером заметок.

Базовых правил ведь всего несколько.
Думайте над постановкой задач. Разделите мозговые усилия между придумыванием задачи и её исполнением. Лучше сесть и две минуты подумать, чтобы придумать такое предложение (с глаголом в неопределенной форме), чтобы потом, когда придет время делать, пришлось бы только взять и сделать, а не вспоминать, что же такое имелось в виду. Прямо пишите, сколько именно денег из какого банка в какой надо перевести. По какому телефону именно нужно позвонить и что спросить (впрочем, это уже справочная информация).
А чтобы не откладывать задачу бесконечно на потом, придумайте её достаточно короткой. Чтобы вы могли сделать её «за полчаса с наполовину выключенным мозгом». Или за пятнадцать минут случайного времени, подаренного волшебной феей. А если так и не осилили взяться за задачу, переформулируйте, чтобы не было страшно лень взяться и начать. В конце концов, задача «подумать полчаса над формулировкой первой задачи, чтобы начать двигаться к такой-то цели» — это тоже вполне себе задача.
Разделяйте задачи и все остальное. Список задач — это список того, что нужно сделать. Команды самому себе. Не меньше, но и не больше. Календарь — это список тех случаев, когда нужно физически оказаться в нужном месте в нужное время. Это отличается от задач вообще. Задачи как правило не привязаны к конкретному времени, почти все можно отложить на послезавтра :) И не сильно привязаны к месту, работать можно и из дома. А вот какой-нибудь перелёт в другой город — точно в календарь. Причем Макс помещает в календарь и такие события, как поездка в аэропорт.
Еще есть справочная информация. Это не задачи. Это не то, что нужно сделать. Это то, что понадобится, чтобы что-то сделать. Заметки, списки покупок, записки мыслей, чеклисты, статьи, ссылки, телефоны, и прочее. Можно хранить их рядом с задачами, если будет удобно. Можно хранить это в каких-нибудь гуглодокументах или дропбоксах. Можно рисовать мыслесхемы, как это делает Макс. Хотя лично я предпочитаю обычные вложенные ненумерованные списки. Главное, чтобы вы точно знали, где искать нужную справочную информацию для выполнения задачи. Не думая. Начали делать задачу, и сразу открыли нужную справку.
Есть еще входящие. Источники ваших новых задач. Я был неправ, считая, что инбокс гмейла можно рассматривать как список задач. Нет, это лишь инбокс. Входящие — это инбоксы ваших почтовых ящиков. Это заметки в блокноте. Это содержимое вашей головы, которое надо оттуда вынуть. Главное постараться, чтобы входящих было как можно меньше. Например, устроить переадресацию всей почты на один адрес. По результатам просмотра входящих уже формируются задачи. Это основной источник вдохновения :)
Откуда берутся заметки в бумажном блокноте в XXI веке? Ну это вопрос к Максу. Он практикует интернет-шабат. Это когда целый день нельзя прикасаться к устройствам, имеющим выход в интернеты.
Регулярно просматривайте задачи. Макс рекомендует раскладывать их по трем папочкам: на сегодня, на неделе, потом. В GTD папочек было побольше. Соответственно, и просмотры нужно делать ежедневно и еженедельно. При ежедневном обзоре вы формируете свой следующий день. При еженедельном обзоре вы просматриваете все входящие и формируете новые задачи. А также удаляете уже неактуальные задачи и вообще наводите красоту в своем задачнике.
А для задачника Макс использует Micromiles. Действительно неплохая программка, с вебмордой и мобильными приложениями. Тут можно вести список задач, по феншую — по трем корзинкам. Можно писать заметки и чеклисты к задачам — справочная информация. Можно задавать цели-проекты — способ группировки задач. И даже как-то делиться этим делом с друзьями.
Не отвлекайтесь, когда выполняете задачи. Сосредоточьтесь и делайте. И отключите всякие уведомления, которые любят на вас сыпать всякие почты и чатики. Особенно в мобильной реинкарнации. Люди слишком часто «трогают себя за смартфон в общественных местах». Ну действительно, какая разница, прямо сейчас вы прочитаете, кто вам поставил +1 в гуглоплюсе, или через полчаса, когда вам все-равно понадобится прерваться и слегка расслабить мозг. Отключите все уведомления. Это необходимое, но недостаточное, условие, чтобы войти в поток.
Jedi Components
Я пока что страшно загорелся энтузиазмом позаписывать все забытые и забитые задачки. И записывать все хотелки и мысли. Возможно этот энтузиазм скорее вызван новой удобной тулзой для задачника. Посмотрим, надолго ли хватит.
Максу хорошо. Он ушел в рекурсию. Он занимается обучением тому, что сам постоянно использует по жизни, чтобы эффективно обучать людей тому, что сам постоянно использует по жизни. Попробуй попроводи все эти тренинги в разных городах без грамотной организации собственных мыслей и своего времени.