Hentzia2015-12-02T03:02:42+00:00http://hentzia.com/Justin Blakejustin@hentzia.comI started a new blog2015-12-01T00:00:00+00:00http://hentzia.com/blog/new-blog<p>It’s at <a href="http://blog.blaix.com/">http://blog.blaix.com/</a></p>
How to Sell Pair Programming2014-08-31T00:00:00+00:00http://hentzia.com/blog/my-experience-pairing<p>A while back I had an email discussion with an old colleague who was trying to
introduce some <a href="http://www.extremeprogramming.org/">XP principles</a> into his
team’s process. Part of the discussion focused on
<a href="http://www.extremeprogramming.org/rules/pair.html">pair programming</a>. Since
I’ve had discussions like this several times, I decided to convert it into a
blog post so I can point here instead of repeating myself. Efficiency!</p>
<hr />
<p>I’ve been on a couple teams that said they do pair programming “sometimes” and
on another that says they do it “always”. In my experience, pairing “sometimes”
really means “every once in a while when someone is having a problem”. It’s
more like “occasional pair debugging” in those cases. The team that did it
always really did do it always. Not pairing was the exception for that team.
And let me tell you: I got a <em>lot</em> of work done every day working on that team.
When you pair all the time, it’s very hard to get distracted. At the end of the
day I was mentally and physically exhausted!</p>
<p>The team also rotated pairs. I think this is important. You do want to
mix it up so juniors get mixed with seniors, people with lots of
context/knowledge on a subject get paired with people with little, and
you want to avoid cliques and silos. Doing it this way brings up the
level of the entire team. Junior people progress to senior level skill
and everyone has shared knowledge of the project as a whole instead of
each person knowing their small piece.</p>
<p>It is sometimes a tough sell. It’s easy to see it as
cutting your productivity in half. It might be easier to sell a couple “pairing
days” per week to test the waters. See how the team likes it and if they do
they can help sell it. Or hey, maybe once or twice a week just slowly becomes 3
or 4 days a week and no one notices.</p>
<h2 id="the-selling-points-of-pairing">The selling points of pairing:</h2>
<ul>
<li>
<p>Programmers are more likely to stay on task. Especially if you
rotate the pairs: you WANT there to be a bit of uncomfortableness to
avoid people buddying up and goofing off. Instead, they’re more likely
to avoid doing things like checking email, facebook, whatever and
spend more time getting down to business. In my experience, in the
long run, you get more done in the same amount of time because of
this.</p>
</li>
<li>
<p>If someone is sick, on vacation, etc. you don’t run the risk of
loosing all the context for a particular piece of the system. You no
longer hear “oh, Joe was the one working on that. I don’t know
anything about it” because with rotation, everyone is working on
everything.</p>
</li>
<li>
<p>The skillset and coding style of the team begins to coalesce. That
means code reviews take much less time and you are less likely to hear
“Joe wrote this code, it’s going to take me a while to figure out what
he was doing…”.</p>
</li>
<li>
<p>The skill level of everyone improves. With rotation, people learn
from each other. The backend pros get better at frontend work by
working with the frontend pros and vice versa (just one example).</p>
</li>
<li>
<p>Programmers spend less time over-thinking a problem. When you are working
with someone else, you want to keep the momentum going and are more likely to
move on once you have an adequate solution instead of getting bogged down
trying to come up with the perfect solution.</p>
</li>
</ul>
<p>All this can add up to more business value for a team where pairing is a good
fit. And don’t think remote workers means pairing isn’t a good fit (usually
it’s more about time zones and work schedules), but that’s a subject for
another post.</p>
My Thoughts on the Mocking Backlash2014-06-22T00:00:00+00:00http://hentzia.com/blog/mock-backlash<p>There’s been a recent backlash against using mocks in your test code. Some of
the <a href="http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html">complete and utter hatred for them</a> I haven’t felt the need to comment
on (<a href="https://www.destroyallsoftware.com/blog/2014/tdd-straw-men-and-rhetoric">others have done that very well</a>). But some of the more subtle
criticisms reminded me of my own initial reaction to mocking. For example:</p>
<h2 id="mocks-can-give-your-tests-false-positives">“Mocks can give your tests false positives”</h2>
<p>The first objection that reminded me of my initial resistance to mock is the
idea that <a href="http://www.thoughtworks.com/insights/blog/mockists-are-dead-long-live-classicists">isolating code from your own code is dangerous</a> because it lets
you mock/stub methods that don’t actually exist, and can therefore give you a
passing test for broken code.</p>
<p>When I raised this concern myself several years ago, I was reminded that
catching “false positives” like this is one of the jobs of your integration
tests.</p>
<p>Your test suite should have two layers: An inner layer of unit tests
that assert the unit being tested is behaving correctly, and an outer layer of
integration tests that assert your system as a whole is behaving correctly.
Part of your system behaving correclty is that your units are communicating
with each other as designed. Your unit tests can use mocks, but your integration
tests should not. That means if you’re working on something test first, and
your unit needs to send a message to another unit, and you use a mock, yes,
your unit test will pass before the message on that other unit even exists, but
that’s when your outer layer of integration tests show a failure due to the
first unit calling a method that doesn’t exist. That tells you what your next
unit test should be: start test driving the new method (or fix that typo if you
mocked the wrong method).</p>
<h2 id="mocks-make-your-code-hard-to-refactor">“Mocks make your code hard to refactor”</h2>
<p>Another objection I had at the time that I’m seeing again now is that
mocks make your code harder to refactor. The problem is that true mocks are
used to verify messages passed between objects. This can lead to test code
with assertions being made on many methods, verifying many arguments, and
mocks that return mocks (that return mocks).</p>
<p>When this happens it’s true that your code is hard to refactor, since you’ve
basically rewritten your implementation in the tests. The simplest conclusion
is that mocks are bad and you shouldn’t use them. A better conclusion is that
your code is bad and your tests are trying to tell you that.</p>
<p>Mocks work best when they are testing code that follows certain design
principles:</p>
<ul>
<li><strong>Single Responsibility Principle:</strong> If you find yourself creating two, three,
four, ten mocks to run one test, that’s usually telling you that your code is
doing too much and needs to be split up into smaller objects.</li>
<li><strong>Law of Demeter:</strong> If you find yourself creating mocks that return mocks
(that return mocks) that’s usually telling you that your code is violating
<a href="http://c2.com/cgi/wiki?LawOfDemeter">the law of demeter</a>.</li>
<li><strong>Tell Don’t Ask:</strong> If you find yourself verifying many arguments or multiple
combinations of arguments on your mocks, that’s usually suggesting that your
code could be improved by following <a href="http://pragprog.com/articles/tell-dont-ask">the “tell don’t ask” principle</a>.</li>
</ul>
<p>If you don’t follow these principles, and you are driving your code with mocks
in your tests, that test code is going to be extremely verbose, hard to write,
and brittle. Listen to that pain! Make your tests easier to write by following
those principles. Because those principles make your code
<em>easier</em> to refactor!</p>
<p>And don’t forget, if you’ve got an outer layer of integration tests, even if
you do end up in a situation where you feel like your unit tests are preventing
you from refactoring, throw them out! Drive a new implementation with better
unit tests while your integration tests act as your safety net.</p>
My Thoughts on "Trying to learn to Vim"2014-03-25T00:00:00+00:00http://hentzia.com/blog/switching-to-vim<p>Don’t bother learning it unless you have a good reason to.</p>
<p>Several times I tried to start using vim because it seemed like this holy
grail. I convinced myself that I would like it. I even gave it a month of
almost exclusive use. It never stuck and I wasted a lot of time being much less
productive than I normally was.</p>
<p>Then I was in a position that I needed to do a lot of work on remote servers.
Instead of multiple tabs + nano I forced myself to use tmux and vim whenever I
was doing that work. But when I was doing other work, <em>I let myself use my
normal editor if I wanted to</em>. Instead of going all in for everything, I let
vim be a tool that I used when I needed it.</p>
<p>I started building up my own tmux and vim configs as I went. When I felt some
pain, I sought out a solution for only that pain point, and only when the pain
of learning a new thing outweighed the pain of lacking it. I picked small
pieces from other people’s configs as needed, instead of copying a
“recommended” config whole-hog or using something like
<a href="https://github.com/carlhuda/janus">janus</a>.</p>
<p>Eventually, I started to really enjoy vim (and tmux), and I reached for my
other editor less and less. Now I’m 100% on vim for all of my work. I wouldn’t
say I’m any more productive than I was before, but I definitely don’t want to
go back.</p>
<p>The vim sweet spot for me was working in the terminal. I now do most of my work
on a remote vps with many persistent tmux sessions. But I think you should use
whatever fits your situation the best. And always be taking small steps for
constant improvement. You can be as productive in Sublime or Atom or Notepad++
as in vim if you get good at it. Whenever you come across something you think
could be improved by using a shortcut or customizing some config, do it. It
will be slower at first, but faster in the long run.</p>
<p>There’s nothing magic about vim in particular for productivity.</p>
BDD-style Tests in Python2014-02-15T00:00:00+00:00http://hentzia.com/blog/bdd-with-python<p>BDD stands for Behavior Driven Development. You can go straight to
<a href="http://dannorth.net/introducing-bdd/">the horse’s mouth</a> for all the details,
but for the purposes of this post, when I talk about a “BDD-style” test, I
mean a test that reads like a sentence describing some behavior of the object
being tested. And I do mean sentence. For example, instead of:</p>
<pre><code>test_post_publisher
</code></pre>
<p>you want:</p>
<pre><code>PostPublisher:
- sets published_at to given date
- emits post_published event with post id
- does nothing for published posts
</code></pre>
<p>If you haven’t already, you really should read
<a href="http://dannorth.net/introducing-bdd/">Dan North’s introduction of BDD</a> for all
the ways tests like these can improve your development process.</p>
<p>This way, your test suite should read like a set of requirements or
specifications. In fact, BDD-style tests are usually referred to as “specs”.</p>
<p>To get there, you can use <a href="https://nose.readthedocs.org/en/latest/">nose</a> (a
handy extension to python’s <code>unittest</code>) with the
<a href="http://darcs.idyll.org/~t/projects/pinocchio/doc/">pinocchio</a> plugin (a handy
set of extensions to nose).</p>
<pre><code>pip install nose
pip install pinocchio
</code></pre>
<p>and write your tests with a structure like this:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="k">class</span> <span class="nc">Test</span><span class="p">[</span><span class="n">the</span> <span class="n">thing</span> <span class="n">being</span> <span class="n">tested</span><span class="p">](</span><span class="n">TestCase</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">test_</span><span class="p">[</span><span class="n">sentence</span> <span class="n">describing</span> <span class="n">the</span> <span class="n">behavior</span><span class="p">](</span><span class="bp">self</span><span class="p">):</span>
<span class="o">...</span></code></pre></div>
<p>For example:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="kn">from</span> <span class="nn">unittest</span> <span class="kn">import</span> <span class="n">TestCase</span>
<span class="k">class</span> <span class="nc">TestPostPublisher</span><span class="p">(</span><span class="n">TestCase</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">test_sets_published_at_to_given_date</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">def</span> <span class="nf">test_emits_post_published_event_with_post_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="o">...</span>
<span class="k">def</span> <span class="nf">test_does_nothing_for_published_posts</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="o">...</span></code></pre></div>
<p>Then run <code>nosetests</code> with the <code>--with-spec</code> option provided (by pinocchio) and
you should see your beautiful specs instead of a boring row of dots.</p>
<p>But wait, since all of the underscores are turned into spaces, the specs that
mention variable names are a bit confusing (e.g. “published at” instead of
“published_at”). You can fix that with docstrings. If nose sees one, it will
use that instead of converting the Class or method name. For example:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="k">def</span> <span class="nf">test_sets_published_at_to_given_date</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">"""sets published_at to given date"""</span>
<span class="o">...</span></code></pre></div>
<p>You can also use the <code>--spec-color</code> option to easily see the status of your
specs (yellow: pending, red: fail, green: pass).</p>
<p>If you want to write specs like this with Django, configure nose as your
test runner in <code>settings.py</code> with:</p>
<div class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">TEST_RUNNER</span> <span class="o">=</span> <span class="s">'django_nose.NoseTestSuiteRunner'</span>
<span class="n">NOSE_ARGS</span> <span class="o">=</span> <span class="p">[</span><span class="s">'--with-spec'</span><span class="p">,</span> <span class="s">'--spec-color'</span><span class="p">]</span></code></pre></div>
<p>This only covers the specific nuts and bolts of getting spec output with
python. I hope this marks my return to blogging, because I have lot more to say
on the subject of testing in general.</p>
Cucumber & RSpec boilerplate with bddgen2010-11-22T00:00:00+00:00http://hentzia.com/blog/bddgen<p>Whenever I add things like <a href="http://cukes.info/">Cucumber</a> and
<a href="https://github.com/rspec/rspec">RSpec</a> to a ruby project, I always have to
go back to old (or other people’s) code to remember the best way to add and
configure things. Particularly the rake tasks. So I wrote
<a href="https://github.com/blaix/bddgen">a gem to generate all that boilerplate for me</a>.
I called it <strong>bddgen</strong>. It can do <a href="http://yardoc.org">YARD</a> too.</p>
<p>All the instructions are in <a href="https://github.com/blaix/bddgen">the README on github</a>.
I almost repeated it all here. Then I didn’t.</p>
<p>Of course, this is for projects that don’t already have generators for things
like that. If you’re writing a rails app or something, then
<a href="http://www.penny-arcade.com/comic/2004/3/24/">it’s not <em>for</em> you</a>.</p>
Upload Failed in Evernote Android App2010-11-11T00:00:00+00:00http://hentzia.com/blog/upload-failed-evernote-android<aside>
Are you getting the "Upload Failed" error since upgrading
the Evernote Android app? Log out and log back in to fix it.
**See updates below.**
</aside>
<p><a href="/blog/gtd-with-evernote.html">I really like Evernote</a>, and
<a href="http://blog.evernote.com/2010/11/08/evernote-for-android-takes-a-huge-leap-forward-with-version-2-0/">the new version of the Android app</a>
is awesome, but after upgrading, I noticed I was getting <strong>Upload Failed</strong>
errors a lot. I would sometimes get these in the past when my signal was bad,
and the note would upload fine later, but I soon realized that since the 2.0
upgrade, <em>none</em> of my notes were getting uploaded. I saw them on the phone,
but not online and not in the desktop app.</p>
<p>I restarted the phone, checked for newer updates, shook it violently, nothing
helped. Google was no help either. When I finally fixed it I figured I should
help out with the lack of Google support by internet blogging about the fix on
my internet website.</p>
<p>In the end what fixed it was simply
<strong>logging out of the app on the phone, and then logging back in</strong>.</p>
<p>The downside is logging out clears the cache on your phone, which means
<strong>all the notes I added since the upgrade were lost</strong>. Luckily they weren’t
too important. Just stuff like “todo: check if notes added on my phone are
being synced properly”.</p>
<h2 id="update">Update:</h2>
<p>I started experiencing the upload issue again. I didn’t want to lose any notes
this time so I contacted support. They recommended I upgrade to the beta
version by visiting <a href="http://s.evernote.com/androidbeta">this url</a> on my phone,
but by the time I go the message the uploads started working again.</p>
<h2 id="update-2---jan-4-2010">Update 2 - Jan 4, 2010:</h2>
<p>I’m on the latest version and this has mostly been resolved. For some reason I
usually see upload failed errors after sending something to evernote via the
“share” menu of another app (Twitter in particular). Eventually the notes do
sync, but it’s quite annoying. Anyone else seeing this or have suggestions?</p>
Getting Things Done with Evernote2010-10-28T00:00:00+00:00http://hentzia.com/blog/gtd-with-evernote<!--7fb4a30919da4e7ca961bdafcb9c6d45-->
<aside>
Already know your way around Evernote? Already understand the basics of GTD?
Hate the way I use words to make sentences?
<a href="/blog/gtd-with-evernote-tldr.html">Here's the tl;dr version</a>.
</aside>
<p>There are many posts about this. Here’s mine.</p>
<h2 id="getting-things-done-with-a-capital-gtd">Getting Things Done with a capital GTD</h2>
<p>My concept of Getting Things Done is loosely based on
<a href="http://www.davidco.com/">David Allen</a>’s book about Getting Things Done. I say
loosely because I never finished it. Seriously that thing should have been
about half as long. But here’s what I took from it and have been applying in
my own life for MAXIMUM BENEFIT:</p>
<h3 id="have-a-system-trust-the-system">Have a system. Trust the system.</h3>
<p>You should have a system in place to manage your tasks and you should trust
that system completely. Like you’d play the trust game with it where you
fall backwards. You’d admit to it that you really like that new Taylor Swift
song. Etc.</p>
<p>The whole point is to get all these tasks out of your head so you don’t have
to worry about them. You know you’ll get to them because you have a system. If
you don’t trust the system you’ll worry.</p>
<h3 id="have-contexts">Have contexts</h3>
<p>The system should have a concept of “contexts”. A context is “where” you are
when you are peforming tasks. For example, I have a “work” context and a
“home” context. I don’t want to think about work tasks while I’m at home,
and vice versa.</p>
<h3 id="have-an-inbox">Have an inbox</h3>
<p>The system should have a dumping ground for new tasks. Official GTD dogma
calls this dumping ground the inbox. I call it that too because I like
things that can be confused with email.</p>
<p>You don’t want to manage tasks in your head. When you think “Oh snap I really
need to do X” at a time when you can’t do X, instead of trying to decide when
you should do X and what are all the details and where does it fall in your
priorities and you better add it to the project wiki and AGH! Just dump your
half-thought-out thought into your inbox and forget about it. Get on with what
you’re doing right now with a clear head. You know that thought is somewhere
safe. You trust your system, remember? You’ll come back to it later.</p>
<p class="cough">I just realized "Do X" can be interpreted as a literal
task if you do drugs.</p>
<p>Later, when you’re actually ready to Get some Things Done you can review your
inbox. Maybe that thing wasn’t really all that important and you can just
delete it. Maybe it’s something that can be done in 2 minutes so you just go
ahead and take care of it right away. Maybe it’s something you want to do, but
not right now. That’s when you file it under a context. Additionally you might
flesh out some of the details or prioritize it as part of a project.</p>
<h2 id="evernote">Evernote</h2>
<p>The system I use for this is <a href="http://www.evernote.com/">Evernote</a>. It’s not
explicitely designed for GTD, but I think that’s a good thing. It’s designed
to take and organize notes. A note can be a simple text document, an email, a
photo, a screenshot, a PDF…</p>
<p>It’s also very easy to take these notes, whether you are in the app or not.
This is important. If you have to run to your computer or even just jump to a
particular app to dump something out of your head, you’re a lot less likely to
do it.</p>
<h3 id="notes">Notes</h3>
<p><img src="http://img.skitch.com/20101028-m25rkxjnu66gm3nwtsjmybgxsf.jpg" alt="Some example Evernote notes" /></p>
<p>For me, a note in Evernote may correspond to a task, it may contain a list of
tasks, or it may just be what the app was originally designed for: a note.</p>
<h3 id="notebooks">Notebooks</h3>
<p><img src="http://img.skitch.com/20101028-cupkidsurjwkkb8gji96fyhuqy.jpg" alt="My Evenote Notebooks" /></p>
<p>Every note in Evernote belongs to a notebook. I set up the following:</p>
<p><strong>Inbox</strong>: I tell Evernote to put new notes here by default. Pro tip: I
name it “!nbox” so it shows up first alphabetically.</p>
<p><strong>TODO</strong>: When I go through my inbox (daily at least) and I come across a note
that I consider a task but I don’t want to do it right now, I tag it (more on
that later) and then file it in the TODO notebook.</p>
<p><strong>Reference</strong>: Anything that’s not a task, but still something I want to
remember gets tagged and moved to the Reference notebook. I use this for
things like server login credentials (Evernote supports encryption!),
requirement lists, etc.</p>
<h3 id="tags">Tags</h3>
<p><img src="http://img.skitch.com/20101028-tccahwyqxwm4s3xmmt7nk6213i.jpg" alt="My Evernote Tags" /></p>
<p>I use tags in Evernote for contexts and projects and priorities. Three
things because haven’t you heard? Tags are versatile!</p>
<p>In order to make sense of things, I prepend context tags with @. So I might
have tags like @work and @home. Prioritization tags are prepended with an
underscore (e.g. _urgent). The rest of the tags represent a project (or just a
category, e.g. “receipts”).</p>
<p>The neat thing is that since tags are organized alphabetically, naming them
this way makes contexts fall at the top of the list, followed by priorities,
then projects/categories. Making it easy to do some cmd-clicks to see all of
my @work tasks that are _urgent.</p>
<h3 id="getting-tasks-out-of-your-head">Getting tasks out of your head</h3>
<p>Since Evernote has lots of neat extensions and peripherals, I can easily throw
something into my inbox from anywhere.</p>
<h4 id="at-my-computer">At my computer</h4>
<p><img src="http://img.skitch.com/20101028-twqnkiicpjen6sn8ax6eyf9hji.jpg" alt="Some global Evernote shortcuts" /></p>
<p>Having Evernote installed gives me some global shortcuts I can use even when
I’m not in the Evernote application. I can hit a key combination to enter a
quick text note, “clip” all or part of my screen to a new note, or paste the
contents of my clipboard to a new note.</p>
<p>Clipping (taking a screenshot) of part of my screen is especially handy for
saving receipts of online orders or remembering IM conversations about a task
I’ll need to do later.</p>
<p>There are also browser extensions for saving web pages to a new note. You can
“clip” the whole page, or simply save the url and add a text note to it. I’ll
use this if there’s a web app I want to check out later, an article I want to
read later, or a blog post about some sweet new Ruby on Rails feature I want to
apply in one of my many and amazing internet web applications.</p>
<p>I said “browser extensions” (plural) but I’m actually only aware of
<a href="https://chrome.google.com/extensions/detail/pioclpoplcdbaefihamjohnefbikjilc">the Chrome one</a>.
It’s good. There are probably others. Maybe.</p>
<p><a href="https://addons.mozilla.org/en-US/firefox/addon/8381/">Yes. There are.</a></p>
<h4 id="not-at-my-computer-oh-no">Not at my computer (oh no)</h4>
<p>When I’m away from my computer I always have my smart telephone with me so I
use the <a href="http://www.appbrain.com/app/evernote/com.evernote">Evernote Android app</a>.
There’s an iPhone version too if that’s how you roll.</p>
<h4 id="email">Email</h4>
<p><img src="http://img.skitch.com/20101028-d69w45e8yfmqewwuhsixsuabmk.jpg" alt="Forwarding an email to Evernote" /></p>
<p>Evernote gives you a special email address. Anything sent to that address will
be added to your inbox. I add that address to my contacts and since I use
gmail I can quickly add tasks from anywhere. I mostly use this to forward emails
that require action from me. This keeps my email inbox clean. When I review
the email later in my Evernote inbox I can complete the task or clean it up and file
it under a context to do later.</p>
<p>It even works with attachments.</p>
<h4 id="at-a-sucky-computer">At a sucky computer</h4>
<p>When I’m on a computer where Evernote is not installed (or not supported…
<span class="cough">Linux</span>) everything is also accessible via the
website.</p>
<p>Plus there’s still the browser extensions and email integration. Those work from
any computer. Unless that computer isn’t connected to the Internet. But then,
is that really a computer?</p>
<p><em>And it’s all synced!</em></p>
<h3 id="prioritization">Prioritization</h3>
<p>One (seemingly) bad thing about using a note storage app as a task management
app is that you lose fine-grained prioritization of tasks.</p>
<p>So I prioritize with tags.</p>
<p>Using tags for prioritization has actually turned this downside into an upside
for me. I only have three tags for this: _urgent, _important, and _billable.</p>
<p>The difference between _urgent and _important is subtle: _urgent tasks have
to be addressed RIGHT NOW or <em>the world will end</em>. _important tasks are tasks
that don’t have to be addressed right now, but I don’t want them to get
burried under all the trivial stuff. “Fix the bug that’s publishing everyone’s
social security numbers to Facebook!” would be tagged _urgent. “Pay the
bills” would be _important.</p>
<p>_billable should be obvious…</p>
<p>The simplicity keeps me from wasting time micro-managing my todo list. Maybe
this isn’t a problem for most people but I tend to obsess over things like
that.</p>
<p>It also keeps me from letting the list of tasks get too long. Since I only
have these few tags, I don’t want to let the list of _urgent tasks get to the
point that I feel like I need a _really_urgent tag to distinguish between
them.</p>
<p>Other than that the notes are sorted by the “created on” date, oldest first.</p>
<h4 id="but-but">But…! But…!</h4>
<p><img src="http://img.skitch.com/20101027-erttceuhuf9u52w9attpsds8xt.jpg" alt="Example of multiple tasks in one note" title="Example of multiple tasks in one note" /></p>
<p>But sometimes you have a big long list of things that absolutely have to be
completed in a very specific order and that order may not map directly to a
note’s “created on” date. Calm down! In those cases I just throw all the tasks
into one note. One task does not have to correspond to one note. I never said
that. Stop saying that I said that.</p>
<h2 id="disclaimer">Disclaimer</h2>
<p>“Start a tech blog” has been one of my tasks for like… a year, and this is the
first post. I hope that doesn’t invalidate everything you just read. Maybe
just pretend like I didn’t tell you that.</p>