Agile Knowledge Management

Copyright (C) 2005 Kristian Dupont Knudsen
Significant updates were made in January 2007.

I have found that using raw text for storing my knowledge, be it bookmarks, code snippets, recipes, task lists or ideas, works very well. Using a text editor that supports folding/outlining makes it very simple to manage and browse.
This article describes my strategy with personal knowledge management.

Storing your knowledge as raw text

I have found that using raw text works for almost everything I need to remember. This has replaced my combination of post-it notes, Outlook task lists, bookmarks and random documents lying around. I have tried various knowledge management software which was all fine but which I always found myself not using after a period of time.

The Power of Raw text

Understand the power of raw text say The Pragmatic Programmers. I am only beginning to understand the truth in that statement.
Raw text is a powerful, generic primitive. It can be used for all kinds of information such as PIM data (address books, calendars/schedules, task lists), random notes and ideas etc. etc. The real power, however, lies in the way that you can adapt your format to suit the exact needs you have - right now.
Programmers are used to working with text files and version control. All communication that goes through code works efficiently because everybody is good at keeping the source in sync. However, there is always an amount of information regarding the project that is not code, such as specifications and various discussions which are often stored as word processing documents and emails. All this information tends to be more or less of a mess. Text files are more easily kept in sync among a number of users. Even if you are just one user, using version control offers significant advantages. I store all my own projects in Subversion, including these text files.

Code Browser

Raw text, however, is limited by the flat structure that is its nature. To make structure, you have to use the filesystem, another powerful generic primitive. The problem is that structuring through the filesystem can be a bit tedious.
A solution to this is to use a text editor that supports folding (which is sometimes referred to as “outlining”, though that term is sometimes used a little differently). I use Code Browser, a small, open source editor which works with both Windows and Linux. CB supports folding and linking, a concept that derives naturally from folding. The concept is really simple - a folder is like a smaller file inside a file, and a link is, well, a link to another file or folder. With folders, you can make a hierarchical structures, but if that doesn’t suit you current need, you can use links to complement the folders, resulting in a relational structure.
There are other editors that have similar capabilities. Many editors have outlining as a way of hiding part of a file, Vim and Emacs and clones have numerous plugin’s including folding and Wiki-specific ones. These are all great and if you like these editors, you might well be as satisfied with these features as I am with Code Browser.

At first, it might seem like “nice to have”, along the lines of syntax highlighting but to me at least, it means the world.

When writing, it being code or anything else, folders fill a gap between “headlinish” text and seperate files, which are the two common ways to separate information. Do you often put lines like this in your code:

// --------------------------------------------------
// Foo Implementation
// --------------------------------------------------

That is a “headlinish” text in the middle of a file. You put it there so it’s easy to notice when scrolling down through the code fast, looking for a certain piece of code that you are going to modify. What you would really like is for that piece of code to stand alone but it may not be isolated enough to justify creating a separate file for it. Well, with CB, you will simply create a folder for it, which looks and acts like a separate file to the programmer, but doesn’t bother the compiler, project file and whatnot.
While this is great for programming purposes, it works just as nicely for plain writing which can be structured similarly.

Simple Wiki

What you get is in fact a simple Wiki. Wiki’s works because they are easy to use. Using links, you can simulate the behaviour of a wiki quite well, only CB takes the “easy to use” one step further in that being an editor, you can always and instantly edit a page. Most of the knowledge that I store is programming related and this is why CB is especially well suited for that purpose. For instance, I have a kb.cpp file which contains my c++ knowledge. I have a link to it from my general knowledge base so I don’t notice that I switch to a different file. But I get syntax highlighting and tabs the way I like it etc.
Now, to make such a base work, there are two things you need to learn, which I am only beginning to learn: 1) you must write stuff into it and 2) you must read it. Both are equally hard. Regarding 1), I have taught myself to write small notes whenever I find myself in the following situation:
- I have just had a problem
- I have done some research or thinking in order to solve the problem
- I have validated the solution

Most often, such information comes from the web in which case I can usually copy/paste directly from the website, along with my own notes.

Projects

Being so lightweight, a text file fits perfectly as a low level “catch-all” kind of project file as you can link to everything and write stuff down that doesn’t fit anywhere. I often have Visual Studio projects and CB “projects” for the same thing. At BestBrains, we have a large Subversion repository containing projects and all sorts of documents. Every new project we make has a .cbi file (cbi is a generic Code Browser format) which is sort of a sketch board for the project. It contains task lists, notes, links and what have you.
Lately, I have worked at a company that does embedded programming with the a development package called Multi. I didn’t like the editor part of this IDE, so I simply made my own CB project with links to all the files that I needed, including the Multi project files which, fortunately, were raw text as well. This doesn’t interfere with their usual way of working and it is very fast for me to set up.

When I’m working on a new project, I start by making a new folder somewhere in top.cbi, a generic “start page” file I have, which is always open on my pc. This gives me a clean workspace which is very important to me - I need cognitive space, I think, more than most.
Now, such a new workspace invites you to start writing things that are on your mind. The obvious starting point is to write a small task list. I have used Outlook tasks for todo items for some time and it works somewhat. But not entirely. I am not sure why, but I think it has to do with the fact that it involves dialogs, which made me not keep everything up to date all the time. It seems to me that in order for a task list to work, items in it should be no older than about a week. Once an item is more than a week old, it becomes sort of invisible to me and I have to really concentrate to notice it.

Mind Mapping

This process is very similar to that of making mind maps. I have used mind maps on various occasions and I find them to be an excellent tool. My problem with them is that they are paper-based which has a number of obvious disadvantages - the most sincere not being that you cannot “save” them - but the fact that they are immutable, to some extent at least. Therefore, if you want to change something, you have to clone the good parts and then insert edited stuff. Yes, there are electronic alternatives. There is the open source FreeMind which seems really nice, and there is TheBrain which I have actually tried real hard to use on several occasions. Problem was, I had to make myself use it and it just didn’t seem right to me. Code Browser, however, has really worked for me. As a programmer, I guess I just feel very “at home” in an editor.

The Idea Database

One particular kind of knowledge that I keep, is ideas. I didn’t have a systematic way of storing ideas before, and I have lost a lot of them because of this. Ideas are bits of gold that you should store even if you aren’t going to do anything about it right away. I now have a large number of ideas for all kinds of things written down and the funny thing that happens, when I “surf” around every now and then, is that some of them merge and reveal a pattern of some greater idea which might end up being worth implementing. You should write down everything - and link to everything that is even slightly related. Not only that; you should write problems down as well - problems to which you don’t know or see a good solution. Let it simmer, and given some time, a problem will evolve into ideaspace, ending up being a challenge rather than a point of irritation.

-->