I’ve been mulling over an idea for Getting Stuff Done™ that I think could be highly effective, but I haven’t had a chance to prove it out yet, so here goes. The aim is to define a 100-day plan for any objective that you want to accomplish. For some time now, I’ve been wanting to build a structured text editor, so I’ll use it as an exemplar of a 100-day plan.

tl;dr Define an objective, then break it down recursively into a linear sequence of smaller items; on every day that you can prioritize the objective, pick the next item and make it happen. If it turns out that the item is too large to complete in a day, break it down into smaller items. Don’t worry about gaps and distractions as long as you’re able to spend time towards your objective at least twice a week. There is no end date…but you will likely get done sometime within 6-12 months.

Background

The concept of a 100-day plan comes from two existing and popular tools for planning and execution. The first is conventional goal-setting, where you establish a time-bound target state that you wish to achieve. A goal has a what, when and a why clearly spelt out, together with exit criteria. The second is the concept of a “90-day plan”, where you organize a team to work towards goals that complete within a 90-day horizon (in business days). We adopt these ideas with a twist: in a 100-day plan, we don’t track any dates; instead, we are opportunistic about finding time to work on the things we want, recognizing that there may be other potential priorities at home and work taking precedence.

Details

A 100-day plan begins with you carefully thinking through what you want and writing it down as the “objective”. There is emphasis here on the words “you” and “want”. Don’t work on something that somebody else wants, or tasks you can’t articulate the value of (to yourself).

Objective: Build an interactive application for creating, modifying, viewing, and querying syntax trees through text-editing and command-execution interfaces, that supports arbitrary user-defined grammars. So what: Operating on syntax trees is an intuitive and powerful way of developing and maintaining software, and I want to advance the state-of-the-art of tooling on this front.

Notice the two-phase expression of the objective in terms of both “what” and “so what”. The latter is an important part of any goal expression, tying this goal to a higher level purpose that has been established a priori. It keeps your work grounded and minimizes “yak shaving”.

“Yak shaving is what you are doing when you’re doing some stupid, fiddly little task that bears no obvious relationship to what you’re supposed to be working on, but yet a chain of twelve causal relations links what you’re doing to the original meta-task.”

Yak Shaving Illustration by David Revoy. The character Pepper is depicted literally shaving a yak. License: CC BY 4.0

Notice that the objective stated above has no target date. This is a distinguishing characteristic of a 100-day plan — you don’t worry about when it is going to get done; the journey matters more than the destination. Instead, you mark off each of the days that you’ve made substantive progress towards your objective. You celebrate your successes and ignore your failures, which is as life should be.

In the case of my project, I can break it down into the following items:

Users can launch the command-line application and use it to:

  • Create, modify, view, query files using built-in or user-defined grammars.
  • Define their own grammar.
  • Define their own queries.
  • Query files using a built-in grammar.
  • Create and modify files using a built-in grammar.
  • View files using a built-in grammar.
  • Parse the buffer and get reports of syntax errors.
  • Query arbitrary text files with built-in queries.
  • Save files to the filesystem.
  • Create and modify arbitrary text files.
  • View arbitrary text files.
  • Load files from the filesystem.

I think this is a good list of items to begin with, though I expect to break them down further as I learn more. Notice that I’ve worked backwards (from top to bottom) to break things down. So the next step is to start from the items at the bottom and complete them one by one. My hope is that each item is small enough that I can complete it in a day and tag the item with the date of completion, otherwise, break it down further.

I was heavily inspired by Your Life in Weeks for the idea of a 100-day plan — a worthy next step would be to turn it into an analogous visual tool.

I wrote this poem circa 2012, about 13 years ago. I think Try is about reconciling the messiness of real life with the romantic idealism of one’s inner child. You might draw parallels between this poem and Richard Linklater’s trilogy of Before Sunrise, Before Sunset, and Before Midnight.

  • Come, my darling sit with me,
  • Where else would you want to be?
  • It breaks my heart that I made you cry,
  • But despite it all you know I try.
  • You’ve been here in this room all day,
  • All this time, just a touch away —
  • But there is a wall between us now
  • I’d break it down if I only knew how.
  • Perhaps that teardrop left a trace
  • As it slid down silent upon your face,
  • A moment’s hurt, an agonized look —
  • What price to give back what I took?
  • My heart stood still as I saw your pain,
  • Will anything ever be the same again?
  • Maybe tomorrow will wash this clear,
  • Maybe we don’t have to come back here?

I wrote this poem circa 2005, about 20 years ago. Normally, I wouldn’t care too much about something written ages ago, but I make an exception for poetry when it has continued to resonate with me at a deeper level. To me, each poem feels like an emotion that is frozen in time… The operative theme that I ascribe to Paranoia is ‘cynicism…but justified’.

  • You think you know the way of the world,
  • You build your castle of silver and gold,
  • In your marble tower you proudly stand,
  • And smile upon your kingdom, your land.
  • It isn’t so, it isn’t so —
  • You do not see the unseen foe,
  • There is no stone to hold your fort,
  • You have no gun, you have no moat.
  • They have no need for dagger or gun,
  • They come with hate, not joy, not fun,
  • They come to pull you down to the earth,
  • To snatch your joy and kill your mirth.
  • They come, they come — do you not see?
  • This is no place for you to be!
  • Run my friend — find a safe spot!
  • I shall keep them at bay, no matter what!
  • I see you running, keep going, my friend —
  • Safety you will find beyond the riverbend.
  • Till then I will fight these monsters of hate,
  • Fear not for me! Find haven and wait!
  • Now that you’re gone, I cast off this mask —
  • For indeed I am finished with my task.
  • I climb up the tower, this kingdom is mine,
  • The food is exquisite, and so is the wine.
  • You ask why I lied, maledict me you may —
  • You know the way of the world you say.
  • When you saved your self, precious though it be,
  • Why did you not stay — at least for me?

I use the i3 tiling window manager on Gentoo Linux, and avoid heavy-weight desktop environments like GNOME or KDE. One consequence of this choice is that there isn’t any ‘system theme’ to speak of, that influences ‘Light’ and ‘Dark’ modes within GTK-based applications like Firefox. What this means is that I have no way to switch to ‘Dark’ mode for websites that follow the system theme — like this blog — unless I specially set it up.

My solution for this is fairly straightforward: add a button on my desktop that allows me to switch between light and dark modes. When I click the button, it invokes a script that toggles modes. You can see the button — the one with the 🌓 icon — in the screenshots of my desktop below, right at the bottom of the screen.

Light Mode

Desktop: Light Mode

Dark Mode

Desktop: Dark Mode

Details

The toolbar at the bottom is rendered by i3blocks, with the following configuration block:

[switch-theme]
full_text=🌓
command=/data/bin/switch-theme

The switch-theme script that the command above invokes is quite simple:

#!/bin/bash
#
# Script to toggle GTK light & dark modes.
#
# The mode is toggled by using the `xsettingsd` daemon,
# which should already be running. The `.xsettingsd`
# configuration file is updated, with exactly one of the
# following values:
#
# Net/ThemeName "Adwaita"     # Light
# Net/ThemeName "AdwaitaDark" # Dark
#
# Note that the Adwaita and Adwaita-dark themes must already
# be installed on the system.
#
# The script sends a HUP signal to the process, causing the
# setting to take effect at once.

set -euxo pipefail

CFG_PATH="$HOME/.xsettingsd"
DEF_THEME="Adwaita"
ALT_THEME="Adwaita-dark"
OLD_THEME=$(pcregrep -o1 'Net/ThemeName "(.*)"' "$CFG_PATH")
KEY="Net/ThemeName"

if [ "$?" -eq 0 ]
then
    NEW_THEME=$([ "$OLD_THEME" == "$DEF_THEME" ] &&        \
        echo -ne $ALT_THEME ||                             \
        echo -ne $DEF_THEME)
    sed -i 's#'$KEY' .*#'$KEY' "'$NEW_THEME'"#' "$CFG_PATH"
else
    echo $KEY' "'$DEF_THEME'"' >> "$CFG_PATH"
fi

killall -HUP xsettingsd

For the script above to work, you must first install the gnome-themes-standard and xsettingsd packages on Gentoo, or their equivalents on other Linux distributions. You also need to have the xsettingsd process running, which I’ve added to my .xinitrc startup script.

Lake 22 is another short and easy hike, an hour and twenty minutes away from Bellevue. It is a roundtrip of 5.4 miles with an elevation gain of 1,350 feet. The toughest thing about this hike was finding parking — it turned out to be surprisingly busy at 8:30am, and we ended up parking half a mile away from the trailhead. In fact, it was so busy initially that we had a large group of people blocking our path ahead on the trail and I started regretting my choice of hike. But fortunately, we managed to break through the crowd and sprint ahead.

People who are inconsiderate enough to park their cars with unnecessary gaps, thus depriving others of precious parking spots — some say these are the folks who end up in “Parking Hell” when they die…where they’re forced to drive around mindlessly looking for parking spots, and everytime they find one, someone else swoops in and takes it from them. (Some others disagree, they say they just get sent to Capitol Hill in Seattle to find parking.)

This might be a bit of a quirk, but when it’s just us, Anu and I prefer to get to the turnaround point of the hike as quickly as possible. We might take a break every couple of miles to have a few sips of water, but we seldom pause to take in the sights or take photos. No, all that must wait until the return journey.

Lake 22 offers a pleasant view with calm waters. There’s actually some snow and ice on the mountain across the lake, which reflects on the surface of the water. There are some gorgeous views of the landscape along the trail. You also pass by several gushing waterfalls. Quite a few old tree trunks lie along the route.

I quite enjoyed seeing the diverse flora along the trail. The most interesting of the lot is a orange-and-yellow wildflower called ‘Western columbine’ (aquilegia formosa). That’s the one on the right, below. I also noticed some wonderfully polished rocks that absolutely deserved to be photographed.

Overall, our parking situation added an extra mile for us to walk, but I’m not sure if that ought to count as part of the hike.