How I Take Notes

The older I get, the more notes I take. Historically I've been a terrible at it.

I have exercise books from the past 10 years at work, filled with useless scribble - the working notes for algorithms and data structures, doodles and the occasional meeting note. Undated, uncategorised and completely inaccessible. I've tried to start a diary every couple of years since G.H.W Bush invaded Kuwait. Until late last year, none of them lasted more than a month.

The keys to me taking more (and better) notes have been speed, access and simplicity. Regardless of my intentions, I don't take notes unless it's quick, I can do it anywhere, and I don't have to think about the mechanism.

My first push in the right direction came from reading Mind Performance Hacks. The main "hack" that left an impression on me was having a system to catch ideas as they occur, instead of trying to remember to write them down later. They had some detailed system about carrying (physical!) cards with columns on them, but that was never going to fly. Instead, I came up with my own system based on text files, which I can easily modify on my phone, tablet or computer (one of which is almost always handy).

I created a folder called "catch" and added one file per category - for example, "blog". Whenever I had an idea for a blog post, I'd add it in. I decided to take notes on some books I was reading, so I added another folder called "books" and created a document for each book.

I use btsync to sync the files across my devices, but you could easily use Dropbox, Google Drive etc.

This worked well enough, but I found it a little slow and cumbersome. I wanted to be able to get the idea out of my head quickly, without having to find the right file. Enter the bash script!

function record(){
    output=*"$(date +%F)$(date +%r)* "$3" \n\n"
    target="$1"/"$2".md

    #echo "Writing \"$3\" to $target"
    if [ -z "$2" ]; then
        ls "$1"    
    elif [ -z "$3" ]; then 
            vim "$target"
    else
            printf "$output" >> "$target"
    fi
}

alias catch="record ~/notes/catch"
alias book="record ~/notes/books"

At work I usually have a cygwin terminal open, and at home I spend most of my time in a terminal. My record() function (and the aliases that point to it) let me really quickly take notes. For example, if I type

$ catch blog "How I take notes"

a new line, prepended with the date, is added to my blog file:

*2014-10-29 09:11:29 PM* How I take notes 

If I type catch blog, my blog file opens in my text editor. If I type catch, I get a list of my catch files/categories.

Lately, I've started taking notes about what I do at work:

$ wl "Adding <feature> to <program>:
> - remember the <blah> has to be hooked up to the <hoosit>"

This feels like it will be very beneficial going forward, particularly for those rare jobs whose precise details I always forget.

For well-categorized ideas, I can search within a document to find something. If I can't remember where exactly I put something, I can use the usual file system tools to help me. grep happily tells the files that match the phrase I'm looking for:

$ grep -rin "notes" .
./blog.md:5:*2014-10-2909:11:29 PM* How I take notes 

I've been taking notes for about a year, and I'm starting to see the benefits. Each time an idea resurfaces, I flesh out the notes a little more, so the concept progresses.

comments powered by Disqus