Remarkable

My wife gave me a re:Markable device for my birthday, and I’ve (mostly) integrated it into my system. I tried to replace all the notebooks I have with this one device. It will reduce clutter and simplify recording information. I have boxes of notebooks, so this is a big deal. The notebooks I have fall into these buckets:

  1. Subject notes
  2. Daily Journal
  3. “Specialty” journals
  4. Story ideas / project notes
  5. Sketchbooks

(1) and (4) were replaceable with no issues. I get the benefit of writing notes long-hand and in addition, with the OCR that re:Markable supplies, I can make digital versions of these notes (or sections of them) easily.

(5) was replaceable with some issues. Sketching with the stylus wasn’t as easy or satisfying as pen and paper. But I can’t draw for anything anyway, so my sketches looked pretty much the same on either media.

(2) and (3) are going to have to stay physical. I found that an important use case for these journals was to flip back look over previous entries. I often didn’t know which entry I was looking for, so I would just flip and scan. This is much faster (for me) using a physical notebook than having to step through each page of the digital notebook.

My current process is to use the re:Markable device, organized via the PARA method, to handle the subject notes. From there I will distill those into refined notes that go into Obsidian.

However – for Christmas I received a (physical) notebook which is set up for some sort of Zettlekasten system. I’ve begun using this for subject notes, which then feed into Obsidian.

I realize that these two systems are redundant, and this dilutes the “simplify recording information” benefit, but I am enjoying the variety here.

Personal Productivity

I am continuing to use my life daybook, though it continues to be more diary-like than I would like. I envision this thing to work like an engineering daybook where I enter problems I’ve encountered and detail their solutions and lessons learned. So, there’s a reminder to myself.

I’ve got a theoretical, if not practical, handle on my personal knowledge management system. At the center of this is Obsidian. I use this application to hold daily notes, my nascent Zettlekasten system and my nascent second brain. I’m still developing these systems, but it all makes theoretical sense. And I have a place for these sort of things.

When it comes to a Personal Productivity System I have settled on Everdo. This is a good tactical tool to keep track of tasks and projects, containing lists of items that need to be done, perhaps grouped into projects. I’ve always been attracted to the GTD style of personal productivity and Everdo supports that nicely.

And I coasted on this for a while. Most things in my life are cyclical so I wasn’t surprised that I have hit and miss success here. It’s a process. However I stumbled upon this post that talks about the author’s understanding of the difference between Personal Knowledge Management Systems (PKMS) and Personal Productivity Systems (PPS). The article states that PPSs differ from my idea of a PPS in that it should start with your life’s values and goals, which makes sense to me.

My “standard cycle” with PPSs (and most things, really) is an initial excitement-fueled period where I go all in, and then ever-decreasing in amplitude and period cycles of use, until I reset the meta-cycle at some point (like, say, this post). Imagine a damped sine wave, but with increasing space between peaks.

Things That Stand In My Way

Some issues I have are:

  1. My days are filled with small-time-scale tasks that I don’t record anywhere.
  2. I listen to a lot of audiobooks while I walk, and that makes it hard to produce notes.
  3. I experience motivational troughs that not only slide my schedule to the right but also derail my habits. This happens pretty frequently.
  4. Not having the targeted list, or the overall themes of “things I want to intentionally spend my time on” constantly in front of me makes it easy for me to drift. Which I do. Come to think of it, I likely would drift even if I did have these things constantly in front of me.

Another thing to consider, though I don’t think it’s that applicable to me, is the idea that 100% allocation of time is less efficient – but I think I end up with slack time no matter what.

Another thing to consider is that I have, best case, 2 hours of discretionary time for three weekdays, and 25 hours on the weekend (though, of course, I never get that much on the weekend, and what I do get tends to be broken up). When I look at it this way it seems like I get more time than I thought, though, coming in at 32 hours.

Initial thoughts on Personal Productivity Systems

As stated above, some GTD system is good for tactical planning. But I’m missing a strategic (long-range) view. Without that strategic view I don’t have a “north star” to steer towards, so I end up drifting about from one shiny thing to another. Keeping the overall strategic view in mind when determining how to spend my time at any given moment ensures that what I’m doing supports my long-range view or is aligned with my overall goals and values.

I have been attracted to physical notebooks here of late. I don’t want to use them for my PKMS because it’s too high friction (it takes too much effort to locate where to put something such that retrieval is easy) and I don’t have one with me all the time (unlike my phone). I’ve tried bullet journalling as a way to address the friction issue, but I find that I use computer-based solutions much more frequently and consistently. I don’t want to use them for a tactical GTD system for the same reasons.

However, I see physical notebooks as the perfect tool for the strategic vision. The ability to sketch (say, a mind map or a flowchart) and the fact that I enjoy using them makes me think that I’ll get a lot of usage, and thus a lot of value, from them.

So that’s the direction I’m going to go here.

Life Daybook

I ran into the idea of an engineering daybook whilst reading The Pragmatic Programmer . This was a notebook which was used to keep track of all the issues and their solutions that an engineer ran into daily. I like the idea, so I keep one with varying degrees of attention paid to the habit.

This Christmas season my son gave me a notebook that I thought looked pretty cool. I am already using Obsidian as my electronic notebook, and I have a Monk Manual for my hard-copy planning activities. So what should I use this notebook for? After ruminating on the question for a bit I’ve decided to turn it into my “Life Daybook”. A book “in which (I) record what (I) did, things (I’ve) learned, sketches of ideas, readings from meters: basically anything to do with ” my life.

The first bit sees more standard diary-like usage than I’d imagined, but with some focus I’ll put it to the use I envision.

That’s the idea, anyway.

A Month In

I have a gap between “listening to a book” and “making a book report”. So much so that I end up with low-quality notes, or none at all. I’ve heard that Readwise can help me out with books on Kindle, but there’s not much to be done when listening to a book on Audible whilst walking the dog.

When I am reading a book or taking an on-line class then taking notes during or immediately afterwards is easy. But this activity represents a relatively small percentage of my time spent thinking.

I have fallen out of the habit of having a morning habit. These days I get up and attend to immediate demands until I am almost ready to go to sleep. This leads to pretty chaotic days.

Taking all that into account, I am making the following changes:

  1. After dropping my child off at school I will create a day plan
  2. I will concentrate more on Fleeting Notes
  3. Due to (2), at 9p I will spend time to ingest fleeting notes from wherever they are. I will tag them with #new
  4. Since I’ve let this one slip, at 9p on Sunday I will review new notes (untag them) and start any literature notes that this exercise produces.

None of this addresses the issue that lead this post off – the absence of an easy way to make notes whilst listening to a book whilst walking the dog. I suppose I’ll just have to try and hold on to any of those ideas until I get home.

Optimal Trading

When writing software (or living life, really) you frequently have to make trade offs. And it’s often the case that these trade offs will be made whether you think about it or not; you can’t avoid making the trade off, but you will not have any say in the matter if you don’t pay attention.

This post is concerned with one of the more common trade offs software engineers are called on to make – optimizing time/space use against maintainability. These decisions are easy to make on the extremes. If you can get a 100x improvement in time or space complexity at the expense of having to add some comments to deal with the decrease in readability then you should take it. Or, if your system is performing well enough and the improvement in performance you could get would render the code completely unreadable, then you should not make that trade off.

It’s the middle bit that is tricky. If you can get a modest improvement in performance for a slight reduction in maintainability, what should you do?

I tend to optimize for maintainability. It’s a well-known saying that code is written once and read many times. The time you can save the reader of your code (including future you) is multiplied. Of course, if your system would be unusable below a certain performance metric then you need to ensure that performance remains above that threshold, even at the expense of maintainability.

To illustrate the tradeoff between optimization and maintainability let’s look at problem 1 from projecteuler.net. The fine folk at Project Euler have stated that they’re ok with public discussion of the first 100 of their problems. This first problem asks us to add all the multiples of 3 or 5 below 1000 together. A direct (to my mind) translation of this into code would look something like this pseudo-code:

total = 0
for each i in the range
    if i is a multiple of 3 or 5
        add i to the total

I’d like to introduce two definitions:
The Problem Domain is the set of concepts that are found in the problem you are trying to solve. In this case, “multiple” and “total” and “number” are concepts from the problem domain. When talking to a customer who wants you to make them a house perhaps things like “square footage”, “bedroom” and “electrical outlets” would be concepts from the problem domain.

The Solution Space (I really wanted to call this Solution Domain for symmetry, but that’s not really what I call it) is the set of concepts that are found in the solution you are trying to develop. In this case the same concepts from the problem domain are found in the solution space. To me this is a hallmark of readable, understandable code. When building a house for a customer you might have concepts like “tensile strength”, “drainage field” and “residential building code” in your solution space.

As we look at this initial solution, we note that it does not appear to be optimal. It looks at all numbers in the range. This seems sub-optimal. After looking at the numbers we wish to sum up one notices that the list of those numbers can be generated by starting at 3 and successively adding 2,1,3,1,2,3,3. This leads to this solution:

differences = [2,1,3,1,2,3,3]
number = 3
total = 0
index = -1
MAX_VALUE = 1000

#
#  Generate numbers from 3 to strictly less than MAX_VALUE
#  And add them to total
#  We generate the number by adding the next entry in our first order differences list
#
while number < MAX_VALUE:
    total = total + number
    index = (index + 1) % len(differences)
    number = number + differences[index]

print(total)

Note that we still have the concept of a total, but no other concepts from the problem domain exist in the solution space. And we’ve introduced concepts like “differences” and the index into the differences array. This seems more optimal as we only consider items which need to be summed (there is no “if” here). However, we have traded understandability for optimization. Was it worth it? Likely not. We arrived at the values for “differences” by direct observation, we have no idea why those numbers are what they are and thus we could not explain it to future readers of this code. A future reader of this code will be hard-pressed to map the problem domain to the solution space, and thus will spend extra time trying to understand what they are looking at. This extra time is multiplied by the number of readers of this code and thus likely dwarfs the cycles you save by making this optimization.

Here I would like to post Donald Knuth’s quote on optimization:

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature optimization is the root of all evil (or at least most of it) in programming

Donald Knuth

This is applicable here, because I ran timing tests on the above two implementations and the first version; the one I labeled sub-optimal, outperformed the second version by ~10% on average. Shows what I know.

Of course, everything we do exists in a larger context. We can get caught up in making local optimizations that are not the global optimal. An optimization might appear to have too small of an impact to warrant the decrease to readability, but if looked at in context – perhaps this code is called inside a tight loop and the milliseconds saved here are multiplied by many orders of magnitude – the change is indeed warranted.

Introduction (mine)

Hi. My name’s Lee and I’ve been a programmer in some sense of the word for decades now. I’m not particularly good but I’ve seen a lot of things and failed in a lot of ways. These posts talk about computer programming from that perspective.

I value simplicity and understandability over everything else; so less-than-optimal approaches that are easily understood and reasoned about are more appealing to me than highly-optimal approaches that are difficult to understand.

As an extension of that I am a big fan of the principle of least surprise . I think you should build things to work in the way that most people would expect it to work.

I concentrate mostly on code quality and maintenance issues, as anyone can write code that does most things, but it takes careful thought to write correct, maintainable code that does those things.

That’s what most of this is going to be about.

Workflow (ingestion)

Here is my current note-taking workflow. I’ve not used it for very long, and I’m currently reading material on this subject, so I suspect this is going to change in the near future to adapt to feedback from usage and study.

  1. Record a fleeting note, try to get at least one tag. I make a folder for broad areas (books, projects, subjects) and try to put fleeting notes in folders.
  2. On a scheduled (currently weekly) basis I collect my thoughts together and make a literature note. This is supposed to be a more polished short article-like note about a particular subject.
  3. On an ad-hoc basis I put together permanent notes by editing together the literature notes and producing more fleeting notes in the process.

If I’m sitting at my computer then this is easy. I simply create fleeting notes as I think of them. I notice that the “On a weekly basis” bit (step 2 up there) isn’t always true. I will often do this step when I wrap up a chapter or a book.

If I’m not sitting at my computer though, the ingestion step is more difficult. For this I depend on having either my phone or a notebook with me. As soon as I can (at least daily) I take what I record on my phone or a physical device and turn it into a fleeting note.

Looking Forward

I have seen the concept of a “Map of Content” as a way to provide a physical (well, virtually physical?) place to record an explicit list of notes that support a single idea (as opposed to the implicit list one gets from looking at tags). I’ve not used this idea yet, but I suspect I will once my set of notes reaches some critical mass.

Agile Notes

In the last post I mentioned that the Zettlekasten system had something in common with GTD in that they both are predicated on the idea that long-term thoughts are best stored in a trusted external system. I see a similar parallel between Zettlekasten and Agile.

I suppose a quick overview of Zettlekasten as I currently understand it would be in order. German for “slip box” this note taking/knowledge management system was developed by this guy as a way to both arrange his thoughts and, more importantly, give himself a head start when it comes to producing output such as articles and books. This clearly worked out for him as he wrote “more than 70 books and nearly 400 scholarly articles published on a variety of subjects”. Not bad for a fellow who was born in 1927, as there wasn’t a world-wide-web for almost all of his life. In a nutshell the system encourages starting with small, fleeting notes which are then developed into more permanent notes that can be linked to each other. Using this system you can allow your course of study/investigation to develop organically. It encourages you to not just store notes as verbatim copies of things you encounter, but rather to paraphrase these things you encounter, putting them into your own words and allowing you to develop and record your understanding of the concepts. Using the links between these notes you can then mine your system for a head start on any further course of study or for the creation of an article or book.

I ran into this idea a year or so ago, but I wasn’t interested because I know myself and I knew that even if I stuck with it I would most likely end up with a completely disorganized pile of notes that had no real value post their initial creation. This is what happened with my photo gallery – I knew that if I wanted to get anything out of my collection of pictures I’ve taken I would need to be able to locate the one I wanted when I wanted it, otherwise I might as well throw it all out. So I came up with a plan to tag all pictures with a set of tags that were answers to questions that I thought the picture would be an answer to: “Where is that shot that is downtown, with the busted window and the telephone pole?” would get tagged with “urban” “decay” “black and white” “broken window”. I did this, for about 2 months. Now I have a pile of unsearchable photos. Lesson learned.

The Agile Methodology is a way of working on software development that was popularized by 17 guys who whipped up this nifty manifesto. For the purposes of this blog I’ll pull out only this tenet:

Responding to change over following a plan

This bit acknowledges the reality that we gain relevant knowledge while executing the plan that would’ve been helpful to know before crafting the plan, and thus encourages delaying decisions as late as possible in order to make those decisions with the most complete understanding we can have.

Thinking about this in light of the Zettlekasten system it occurs to me that the system itself (the structure of it) can adapt to knowledge gained from using the system, allowing me to course-correct as needed. If things are getting dis-organized then impose some structure – I wouldn’t even need to refactor the existing pile of notes, just create some links into the new structure to ensure accessibility.

So I’ll give it a try and see if this work in practice.

Connections – another type

I’ve been on an endless quest for the right organizational system. As I’ve previously mentioned, I am much more motivated by the setup step than the implementation step, thus the “endless” part of this quest. I’ve used a ton of applications/journals and so far I get a couple days to a couple weeks into it and then it lies fallow for ages (just look at the update frequency of this blog).

For personal project/task management I’ve settled on GTD for quite a while now. It has two overarching principles that resonate with me:

  • Get everything out of your head an into a trusted system. Your brain works for short-term memory and problem solving, but long-term storage is better left to an external system designed for that purpose. Otherwise you have this constant nagging in your head to refresh all the long-term stuff and it impacts your ability to do problem solving.
  • You don’t work on projects – you work on tasks. So saying you need to work on “cleaning the garage” is not helpful – you need to come up with an actionable next action and say you’ll work on that.

I’ve tried lots of apps, as well as pen and paper, and nothing seems to work noticeably better than anything else. So I’ve selected something that covers all the bases:

  1. Allows quick entry
  2. Understands the idea of contexts and next actions
  3. Shows me only the next actions
  4. Allows me to add “must be done today” tasks that I can see quickly
  5. Syncs across devices

That covers the basic GTD workflow, except for the “Reference” part. This was covered by Evernote, then One Note, then pen and paper, then Google Docs, and none of that really worked out for me. I found a basic note taking application called CherryTree that had more-or-less what I was looking for, but I wanted to sync it across devices (without resorting to Dropbox sync).

And then I stumbled onto Obsidian, The Second Brain, and the Zettlekasten system. The Second Brain idea in the abstract, and Zettlekasten in the concrete, also espouse the first point of GTD – get things out of your head and into a trusted system.

The idea here is that the brain is good at making tactical decisions and coming up with ideas, but could use some help when it comes to persisting longer-term ideas that need quick retrieval at arbitrary times in the future. So rather than spend cycles constantly refreshing an ever-growing list of tasks and facts, get them into a trusted system and free those cycles up for more creative work.

Keeping in mind that I like the “setup” phase more than the “doing the thing” phase, we’ll see how this goes.

Connections

Back in the late 90’s I encountered the song “Cicciolina” by Machines of Loving Grace. I looked into the song title and it turned out to be the name of an Italian porn star-turned politician, but I never looked into the name of the band.

About this same time I encountered the song “Twin Rocks, Oregon” by Shawn Mullins. In it there are the lines:

I met him on the cliffs
of Twin Rocks, Oregon
He was sittin’ on his bedroll
Lookin’ just like Richard Brautigan
I thought he was an old man
He wasn’t but 37

I dug the song, and I think I looked into who Richard Brautigan was but not very deeply as the only thing I remembered about him is that I didn’t know who he was.

Here we are almost 30 years later and I’m reading “Hackers: Heroes of the Computer Revolution” by Steven Levy and I come to a passage discussing Ted Nelson and Community Memory, whose parent company was Loving Grace. That name came from a poem by Richard Brautigan which ends with:

I like to think
(it has to be!)
of a cybernetic ecology
where we are free of our labors
and joined back to nature,
returned to our mammal
brothers and sisters,
and all watched over
by machines of loving grace.

I dig it when things connect like that.

Less direct, but still diggable, is the fact that this bit of the book concerns Ted Nelson, whose Project Xanadu is the precursor to HTML (and he coined the word “hypertext”). Around the same time as I was listening to the above two songs I discovered hypertext in the form of some long-forgotten freeware DOS or Windows implementation and I was excited by how it matched how I thought; so much so that I would write letters using this program, which meant I had to mail 3.5″ diskettes with the program and my letter to whoever I was corresponding with.

30 years on and I get to type it into this editor and publish it to the web – but the idea is still the same.