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.
I’ve been a software developer with the Omni Group for five years now. In this business, that’s a long time in one job. Even so, of our seventeen person engineering team, thirteen of my co-workers have been with Omni longer. Only three have less time at Omni than me. (One of them is Brent Simmons. Time at Omni is certainly the only metric where I’m more senior than Brent.)
Although we’re always working to improve our apps, there is a certain grind to maintaining a family of products over many years. At nine years old, OmniFocus is the youngest app in the family. Despite that, Omni is a company that invites loyalty. What is it about Omni that leads to such perseverance?
Omni’s apps are what initially piqued my interest in the company. As I wrote in 2011:
I’ve been a fan of the work of The Omni Group since I discovered OmniOutliner pre-installed on my 12 inch PowerBook G4 back in 2003.
Now I spend my days working on OmniFocus for Mac and iOS. Focus — we tend to drop the prefixes — is one of my favorite apps ever. I managed my teaching career with it, used it to lead several research and project teams, and ultimately used it to earn tenure. I feel tremendously lucky to work on an app I love.
My co-workers at Omni also make the work special. Omni has some of the most experienced Objective-C developers in the world, and we’re rapidly developing Swift expertise. But the true joy for me as a former teacher is how willing people are to teach and mentor. Rather than lord their experience over more junior developers, everyone is happy to share what they know. The chances are high that you’ll get five different correct answers to a question in company chat. “It depends” is one outcome of hard won knowledge.
The willingness to teach and mentor is an example of Omni’s culture of caring. People here care about each other, care about making great products, and care about helping our customers. That care is reflected in the central role our support humans play. They answer customer emails and phone calls and write articles for our support website. Support humans are also members of our product teams. They, along with our product managers, are the voice of the customer on the team.
Ultimately, the customers are what make all the hard work worthwhile. It’s satisfying to work on productivity apps. We provide tools that our customers use to multiply their own efforts. Our customers are demanding. They should be; we sell premium products at prices to match. Our customers are also quick to praise. It’s gratifying to hear how they’re using our tools to achieve their goals.
In five years at Omni, I’m astounded by how much I’ve learned. I look forward to continue working with my friends and colleagues for many years to come. I’m grateful to Ken and Tim for giving me a chance and to everyone at Omni for helping in this recovering academic’s journey. I can’t imagine a better place to practice my craft. It’s a privilege to be part of the Omni Group.