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

Это персональный десктопный менеджер задач, написанный на Python+Qt. В наши дни менеджеров задач для GTD можно найти в интернете сколько угодно, но у моего есть свои киллер-фичи. Ради них я и взялся за разработку, хотя на это раскачивался очень долго, стараясь использовать существующие решения. В чём же его главная особенность?

Работая программистом, я постоянно сталкиваюсь с сложными задачами. Эта сложность складывается из разных факторов:

  • Большое количество подзадач: написать кусок функциональности, провести некоторый рефакторинг, проверить гипотезу, обсудить с кем-то вопрос, и так далее.
  • Непредсказуемая глубина задач. Не так уж редко оказывается, что простой, на первый взгляд, этап оборачивается отдельной крупной задачей с десятками подзадач.
  • Нетривиальные зависимости между этими подзадачами. Не все из них можно выполнять в произвольном порядке. Часто бывает так, что один шаг блокирует несколько других. Типичный пример - TODO-решение в коде, когда вместо “правильного” решения ставится “костыль” (потому что для “правильного” решения не хватает времени или информации). В этом случае мы не планируем вводить “правильное” решение, пока не получим нужную информацию, или пока не завершим более приоритетные шаги текущей задачи.
  • Исследовательский характер многих задач. Заранее неизвестно, какой путь к цели является правильным. Приходится пробовать несколько вариантов решения, прежде чем найдётся подходящий.

За фасадом типичных современных таск-менеджеров (по крайней мере, тех, что попадались мне) прячется простая абстракция: плоский список задач. Чтобы немного облегчить жизнь, эти списки можно некоторым образом группировать. Например, карточка в Trello может служить контейнером для нескольких списков. Это достаточно неплохо работает для небольших задач, но и только.

Как, например, работать в том же Trello с задачей, которая из нескольких начальных шагов разрастается до нескольких десятков и длится несколько недель (да пусть даже несколько дней)? Я пробовал применять разные подходы. Если держать всё в одной карточке, то она надолго застревает в списках “Делается”, чем сильно демотивирует. Плюс, становится неудобно работать с подзадачами. Если разбивать задачу на несколько карточек, то теряется связь между ними. Сложнее становится понимать, сколько сделано, а сколько осталось.

В какой-то момент я решил перестать обманывать себя и не пытаться превращать граф подзадач в список. А вместо этого стал работать с ним именно как с графом.

пример реального графа

Вдохновением для этого послужила книжка про Mikado Method, который я пробовал применять для рефакторинга. Хорошее описание на русском есть, к примеру, здесь. А начальным инструментом для рисования графа задач стал прекрасный graphviz. Собственно говоря, сам SiebenApp в режиме работы по-умолчанию до сих пор использует graphviz для рендеринга. Хотя это уже скоро изменится.

Мои главные успехи последней недели - это появление более-менее приемлемого “нативного” рендеринга (т.е., средствами Python+Qt, без использования сторонних программ). Для этого пришлось продраться через пару книг по отрисовке графов и как следует поломать голову на практике. Математика там не самая тривиальная, шаг влево или вправо - и ты уже будешь решать NP-полную задачу. Поэтому приходится пробовать разные варианты, опытным путём находить правильный порядок решения задачи, закрывать десятки плодящихся мелких подзадач, а что-то откладывать на потом.

В общем, делать именно то, для чего мне был нужен SiebenApp. Не лишним будет добавить, что управление его развитием я вёл в нём же буквально с первой недели, как взялся за работу. Dog fooding - это реально полезная вещь! Позволяет лучше понимать, в какую сторону следует развивать проект.

Думаю, в ближайшие несколько недель я улучшу нативный рендеринг, и тогда можно будет окончательно отказаться от использования graphviz. Ещё пара улучшений - и приложение можно будет считать готовым для комфортного бета-тестирования. Хотя, по факту, смельчаки могут пробовать его уже сейчас!

Подробная инструкция по запуску и использованию есть в README на странице проекта. Плюс, я начал потихоньку вести англоязычный блог проекта. Буду рад услышать любой фидбек по этому проекту!

Надеюсь, он окажется полезным не только мне :)