Способы организации заметок: папки и теги
Продолжим тему ведения заметок. Давайте теперь поговорим про организацию заметок с помощью тегов и папок: зачем нужно и то, и другое, или, может быть, достаточно чего-то одного.
Сразу обозначим проблемы, которые мы пытаемся решить, упорядочивая заметки тем или иным образом. Первая проблема — это поиск конкретной записи. Вы помните, что вы ее когда-то писали, но не помните, куда ее поместили. Во многом эта проблема решается глобальным поиском по тексту заметок, если вы вспомните, какие ключевые слова в ней содержались. Вторая проблема — поиск сразу нескольких похожих заметок на одну тему, например, если вам надо написать о чем-то статью, и вы помните, что на эту тему вы уже когда-то делали несколько заметок, и вам нужно их найти.
Как известно, в программах для ведения заметок конкурируют или существуют одновременно два подхода для наведения порядка в базе записей — это папки и теги (они же метки). Начнем с папок. Чтобы быстро найти какую-то заметку в будущем, нужно поместить ее туда, где логичнее всего ее будет потом искать. Но довольно быстро пользователь сталкивается с ситуацией, когда заметку можно поместить в разные папки. Например, вы прочитали книжку про Python и хотите про нее написать заметку. Где вы ее должны создать? В папке «Книги»? «Python»? «Программирование»? Или может быть вы захотите создать вложенную папку «Книги» внутри папки «Python»? А может быть наоборот, создать папку «Python» в папке «Книги»? В таких ситуациях вы должны для себя выработать какую-то общую стратегию, которой будете придерживаться какое-то время, а потом вы все равно захотите все пересортировать. И каждый раз при поиске конкретной заметки вам придется вспоминать, куда вы ее положили.
Когда я только начинал делать OutWiker, у меня даже была идея сделать что-то вроде ссылок, когда в папке создается ссылка на другую заметку, и кажется, что заметка расположена сразу в нескольких папках. Но дальше задумки эту идею я не развивал.
По идее эту проблему должны решать теги. К одной записи можно добавлять произвольное количество тегов, и при аккуратной их расстановке мы через какое-то разумное время нужную заметку найдем. И вот тут возникает вопрос, каким образом присваивать теги заметкам? Как и со всем, что связано с заметковедением, при использовании тегов вы должны сами для себя придумать какие-то правила. Обычно теги не должны быть слишком общие или слишком частные. В этот момент стоит задуматься, по каким ключевым словам (опять мы с этим термином столкнулись) вы будете искать эту заметку в далеком будущем.
Например, если мы пишем заметку про реализацию сборки мусора в Python, то вряд ли вы будете искать ее по тегу «программирование», этот тег был бы слишком общий, и, если вы действительно будете использовать этот тег, при выборе его в поиске вам программа выдаст слишком много заметок. Другая крайность — тег, названный по имени функции, о реализации которой вы пишете, например, «gc.set_threshold». Конечно, есть вероятность, что через год вы вспомните, что у вас была заметка именно про эту функцию, и вы даже может быть будете помнить, как она называется, и тогда кликнув на такой тег, вы точно найдете вашу заметку, поскольку она будет единственная, помеченная этим тегом. Но скорее всего такая ситуация будет редкая, а количество тегов при таком подходе будет разрастаться неимоверно, и искать сам тег будет уже более утомительно. Придется придерживаться какого-то промежуточного подхода. Про себя скажу, что я скорее тяготею ко второй крайности, у меня есть теги с одной записью, но когда я создавал эти теги, то надеялся, что в будущем я буду еще что-то писать на эту тему.
Важное преимущество тегов перед папками заключается в том, что теги могут связывать между собой заметки из разных областей. Например, тегом «эволюция» могут быть помечены заметки как по биологии, так и про генетические алгоритмы или метод дифференциальной эволюции.
Многие теги имеют тенденцию со временем распухать и становиться слишком общими. Например, если вы только изучаете программирование, то вполне естественно создать тег, например, «базы данных», а может быть даже и «программирование», если вы только погружаетесь в эту область. Со временем вы продолжаете делать заметки при изучении, например, баз данных MySQL, PostgreSQL, MongoDB и т.д., и продолжаете аккуратно помечать новые заметки не только тегами с именами этих баз данных, но и добавлять к ним теги «базы данных». Потом у вас появятся новые заметки с описанием особенностей каждой из перечисленных баз данных, заметки про язык SQL будут помечены тем же тегом «базы данных», а еще заметки про математические формулировки слияний таблиц и т.д. В итоге тег «базы данных» начинает распухать и вы начинаете понимать, что он стал слишком обобщенный. Если программа заметок умеет отображать облако тегов, в котором размер шрифта тега пропорционален количеству записей с этим тегом, то такие теги становятся слишком заметными, с самыми крупными размерами шрифта. Но искать записи по такому тега становится тяжело — по нему будет отображаться слишком много разнородных записей.
Причем заметьте, что я не говорю, что изначально не надо было делать такой тег, если на первых порах он помогал находить нужные записи, то и замечательно. Просто с развитием вашей базы заметок вы вряд ли станете искать информацию о том, как создавать пользователя в базе данных MongoDB по тегу «базы данных», или заметку об асинхронности в Python по тегу «программирование». Это значит, что настало время такие теги усушить.
Для этого можно пройтись по заметкам и удалить у них слишком общие теги. Например, у всех заметок про MySQL, PostgreSQL, MongoDB удалить тег «базы данных», а тем более «программирование». В OutWiker для этой цели, например, есть возможность удалить выбранную метку у всех заметок выбранной ветки дерева заметок. В принципе, тег может стать настолько обобщенным, что проще удалить сам тег целиком во всех заметках, если этот тег перестал выполнять свою задачу — поиск нужных заметок.
Правда, при массовом удалении тега может сложиться неприятная ситуация, когда какие-то заметки, обычно очень старые, были помечены только удаляемым тегом, и тогда после снятия с них этого последнего тега, они окажутся никаким образом не помеченными, и тогда их можно будет найти только каким-то другим способом. Не зря в методологии Zettelkasten требуется в явном виде проставлять ссылки на похожие или связанные заметки.
В некоторых, не очень многочисленных, программах для заметок теги имеют древовидную иерархию. Например, мы можем указать, что тег «MongoDB» является дочерним по отношению к тегу «базы данных», а тег «базы данных» — дочерним по отношению к тегу «программирование». Тогда при пометке заметки тегом «MongoDB» мы автоматически помечаем эту заметку и тегом «базы данных», и тегом «программирование». Я не сторонник такого подхода, потому что тогда возникает та же проблема, что и с папками — к какому родителю отнести тот или иной тег. С помощью тегов мы наоборот пытаемся избавиться от такой проблемы.
После всего описанного должен возникнуть вопрос, а нужны ли папки, если есть теги? Не дублируют ли эти две сущности друг друга? Зачем нам одновременно упорядочивать заметки и по тегам, и по папкам? Более того, можно сделать так, чтобы дерево заметок строилось таким образом, чтобы в качестве папок выступали теги. Тогда, если теги тоже древовидные, то это неотличимо от папок, да еще одна и та же заметка может находиться в разных участках дерева — под разными тегами. Честно говоря, я не помню софта, где это было сделано именно таким образом, но я не удивлюсь, если такое представление где-то уже реализовано.
Допустим, такого древовидно-тегового режима у нас нет. Тогда чем удобны папки? В первую очередь тем, что при выборе заметки, в дереве заметок сразу видны ее соседи по папке, часто они нужны одновременно. Иногда при работе с разными заметками близкими по теме, мы переключаемся между заметками, расположенными в одной папке, эти заметки у нас всегда отображаются рядом. Это упрощает переключение между заметками, искать каждый раз соседнюю заметку по тегу — дело утомительное. Но это мы не говорим про случай, когда мы можем одновременно открыть несколько заметок (в одном окне или во вкладках), а то мы погрязнем во всех этих комбинациях средств навигации по заметкам. Таким образом, папки нам помогают найти похожие заметки, когда мы уже нашли какую-то заметку по нашей теме. По своему опыту могу сказать, что пытаться искать нужную заметку, надеясь исключительно на свою память, в какую именно папку я поместил ту или иную заметку — трудная задача при большом ветвистом дереве. Первоначально я заметки всегда ищу по тегам, а дальше уже осматриваюсь, есть ли около найденной заметки что-то еще полезное.
И завершающий вопрос. Нужны ли теги, если у нас есть полнотекстовый поиск по всем заметкам? Вопросы скорости поиска отбросим, поиск можно сделать быстрым за счет индексации. Можно еще подключить ИИ, но с ним надо аккуратнее по нескольким причинам: безопасность, стоимость и его вероятностная природа. Если первые две причины решаются установкой какой-либо модели на своем сервере, то от вероятности никуда не деться — ИИ может что-нибудь «не заметить» при поиске.
Но допустим, мы ищем с помощью обычного полнотекстового поиска, а это более трудоемкая операция. У вас появляется слишком много вариантов, какое слово искать (еще не всякая програма поиска умеет распознавать разные формы одного и того же слова). Если вы хотите найти конкретную заметку, и вы знаете, что там было написано, то поиск для этого замечательно подойдет. Но если вам надо найти что-то по теме и вокруг нее, то поиск — слишком топорный вариант. Одинаковыми тегами вы можете помечать заметки, которые при поиске по какому-то слову могут не показаться одновременно, и какую-то из этих заметок вы можете пропустить.
Вот поэтому я считаю, что в программе для заметок должно быть несколько способов поиска заметок, каждый из которых лучше всего работает для своей задачи при поиске:
- Теги хороши для поиска заметок по теме и обнаружения связей между заметками.
- Папки удобны, когда вы уже нашли заметку и можете увидеть, какие заметки расположены рядом.
- Полнотекстовый поиск отлично помогает искать конкретную заметку.
Есть еще один способ навигации — это представление заметок в виде связанного графа, где связи обозначают ссылки между заметками. Сам я таким представлением не пользовался, ничего про него не скажу. Но такой способ требует аккуратной расстановки ссылок между заметками, что очень хорошо ложится на методологию Zettelkasten.
Какие у нас есть еще инструменты для навигации и поиска? Что я забыл упомянуть?
PS. Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.




Владимир:
На мой взгляд при поиске целесообразно использовать метод «морфологического ящика». Для чего каждой заметке сопоставить некоторое цело число «битовый индекс», биты которого выставлены по наличию или отсутствию определенного морфологического признака (обычное число Integer может содержать 32 таких бита, ничто не мешает увеличить число морфологических признаков, изменив размер числа). Заметки при записи упорядочиваются по такому числу, созданному по набору морфологических признаков, выбранных пользователем. Перечень морфологических признаков содержится в отдельной таблице, с индексом соответствующим номеру бита. При фильтрации записей из всего линейного массива вытаскиваются только записи с соответствующей битовой маской, то есть по совокупности морфологических признаков, выбранных пользователем из перечня. Это работает очень быстро. Этот метод происходит от каталогов с перфорированным верхним краем, в ящик в перфорацию карточек вставлялись спицы, на которых извлекались карточки не соответствующие набору морфологических признаков, в ящике оставались только искомые карточки.
Владимир:
«Например, если мы пишем заметку про реализацию сборки мусора в Python, то вряд ли вы будете искать ее по тегу «программирование», этот тег был бы слишком общий, и, если вы действительно будете использовать этот тег, при выборе его в поиске вам программа выдаст слишком много заметок» —
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
всего 3 морфологических признака (бита) «программирование» + «Python» + «мусора» легко отфильтруют нужные записи, ибо морфология это комбинаторика, глубина которой неисчерпаема даже при малых размерах битового индекса.
Jenyay:
Пожалуй, я согласен, если в программе можно фильтровать заметки сразу по нескольким меткам. В заметке я исходил из предположения, что поиск работает только по одной метке. Интересное дополнение, спасибо!
Владимир:
Да, вспомнил еще, сами карточки могут лежать в произвольном порядке — упорядочивание не требуется и не ускорит поиск (как и в случае с каталожным ящиком, там карточки просто засовывались обратно в ящик лицом к себе 🙂