This week I re-wrote one class three times while battling buggy first-party API. I’d estimated the feature I was working on at 8 hours. I spent 4 days. Half of one of those days was simply trying to get test hardware working again.
I’m taking a much needed vacation day today, but I smelled a new personal record, so did a little work this morning.
What’s the record? Seven radars against a single API end point:
- rdar:///28066560 — CLKTextProvider should have a mechanism for generating formatted, localizable string pairs
- rdar:///28137645 — Can put entire Watch into reboot loop via complication’s text provider
- rdar:///28138051 — Localized text providers don’t work for actual complications
- rdar:///28138313 — CLKTextProvider.localizableTextProvider(withStringsFileFormatKey:, textProviders:) API doesn’t work
- rdar:///28138447 — Documentation for localized text providers should mention limitations
- rdar:///28138655 — Watch simulator produces empty complications gallery
- rdar:///28138766 — Watch simulator produces complications gallery for wrong app
And the documentation for all of this — the first link under Resources here — disappeared yesterday. It’s a 404 now.
Let’s Build a Reactive Programming Library
Functional reactive programming is a much promoted technique for building apps structured around data flow, asynchronous events, and value types.
There are several popular frameworks for reactive programming in the Apple ecosystem, including Reactive Cocoa, RxSwift, and Bond. These powerful tools can be intimidating when first trying to learn the concepts.
In this talk I’ll implement a simple reactive programming library “from scratch”, live coding the interesting bits, and using them in a small demonstration app. The talk is intended for people new to reactive programming and should help demystify the concepts so you can approach one of the more powerful frameworks with confidence.
I’m fascinated and frustrated by politics, though I try to stick to other topics here. However, the current presidential election in the US is the most dangerous the republic has faced in my lifetime and — given the stakes of both climate change and nuclear war — perhaps the most dangerous ever.
It is vitally important that every eligible voter registers to vote and goes to the polls this fall.
If you’re a user of OmniFocus, below are a couple of links that you can click/tap that will add tasks to your OmniFocus database. The links will work on Mac or iOS, though if you tap the links on iOS the tasks will include due dates.
Hopefully this is just one more nudge to encourage you to do your duty for your fellow citizens and the world.
Last night at Xcoders I reprised my CocoaConf Seattle talk, “Let’s Build a Reactive Programming Library”. It was fun to do some live coding again, and in a room with working air conditioning this time. The talk was recorded, so there will be video to share once the fine folks at Xcoders have a chance to edit it.
Over the last few months I’ve been revisiting my system for getting things done. I use a modified version of GTD (Getting Things Done) but felt I wasn’t accomplishing as much as I did in the past. I can lay part of that on some personal struggles, but mostly I hadn’t fully adjusted to the life of a recovering academic.
When I was teaching, most of my tasks were deadline driven. GTD discourages arbitrary due dates, but class sessions, grading, and conferences all have firm deadlines. With a deadline for everything, I got in the habit of just fighting today’s fires. On the rare occasion that I put all of them out, tomorrow’s were already burning.
Still, OmniFocus and GTD were a great fit in this environment. Although I had more tasks with due dates than David Allen might recommend, the system worked well for me. OmniFocus helped me capture tasks during days full of classes, meetings, and interuptions. I learned to quickly process my inbox and organize tasks into projects with clear goals. Eventually I even developed the habit of regular reviews. I realized that reviews were essential for maintaining some semblance of control during the final weeks of a term at Rose.
The habit that I lost was actually doing. Because everything had deadlines, I forgot how to choose things to do when they weren’t urgent.
As a software developer at Omni, I track most of my daily work in OmniBugZapper, our home-grown issue tracking system. Between that and some deadline-driven projects around our internship program, it’s easy for me to stay on top of my work.
Non-work projects have been a different story. These weren’t an issue when I was at Rose. There simply wasn’t time for anything but work. Now that I have a healthy work-life balance, I needed to find a way to keep these important, but not urgent, projects moving forward.
A few simple changes have made a real difference.
Monthly Goals and Flags
For many years I’ve kept lists of five year, annual, and monthly goals. I’m not slavish about these. Instead I try to glance at them regularly and keep them in mind when making decisions about what to do. I try to let these goals exert a steady pressure toward choices that make realizing my goals more likely.
In the past, I used flags in OmniFocus to mark items that were on fire on a particular day — things that I felt must be done, even though they didn’t have an actual due date. As an academic, that approach was useful to make an important task or two rise above the noise of a dozen due or overdue tasks.
Now that I’m less deadline driven, I’ve started using flags differently. I’m flagging the projects that correspond to my monthly goals. This makes the Flagged perspective in OmniFocus show just the tasks that contribute to my priorities for the month.
Next Actions Perspective
After flagging my monthly goals, the next change I made was creating a new perspective that helps me decide what I should work on.
To keep from being overwhelmed by choices, I made a Next Actions perspective that only shows the first available action in any project. It also filters to just tasks that are flagged or due soon. Because the projects related to my monthly goals are flagged, for each of my monthly goals this perspective shows one task that could help me achieve the goal. By also including tasks that are due soon, this perspective shows urgent items as well. Finally, I sorted the perspective by due date, so that the urgent items are first. This works well as long as I’m disciplined about only putting due dates on tasks that have hard deadlines.
Here are the settings that I’m using:
OmniFocus for Apple Watch has been the secret sauce to making this new approach work for me. In OmniFocus on my iPhone, I went into Settings and under Notifications → Today & Watch, chose my Next Actions custom perspective. Then on my watch, I added the OmniFocus complication to my Modular watch face.
Now with a glance at my wrist, I find a single task that is either urgent or important. With a couple of taps I can get to the full list of these tasks.
I’m pleased to have a system that works better with the rhythms of my life now. By flagging my monthly goals in OmniFocus, using a custom perspective to show the tasks that are most urgent and important, and keeping those tasks in front of me with OmniFocus for Apple Watch, I’ve been procrastinating less and getting more things done.