Register and Vote

July 21, 2016

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.

Thank you.

Live Coding at Xcoders

July 15, 2016

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.

The slides were mostly unchanged from CocoaConf version. You can find those slides here. A snapshot of the code for the project is on github.

Doing is the Thing

July 7, 2016

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.

Academic GTD

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.

Balanced GTD

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:

Next Actions Perspective

Apple Watch

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.

Next Actions Perspective

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.

Next Actions Perspective

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.

Fifth Omniversary

June 1, 2016

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.

Developing Anxiety

May 23, 2016

After two and a half years of decline, including a couple of emergency room visits, I finally sought treatment for my anxiety this spring.

I know many software developers who stuggle with anxiety. Perhaps software development attracts anxious people. We can mediate social interactions through the safety of a chat window. We spend our days in abstactions, so we can control the virtual environment — the code — in which we work. That sense of control can be comforting.

Or maybe the act of software development promotes anxiety. Our daily lives are cycles of facing failures big and small: syntax errors, logic mistakes, crashers, threading bugs, and, god forbid, provisioning problems. When we do succeed at solving a problem, there’s always another one waiting in the issue tracker. And because all code has bugs, the sense of control that appealed to us initially gives way to shipping software we know isn’t as good as it could be.

* * *

My struggle started in the fall of 2013. That summer we lost a friend and co-worker at Omni, Joel Reuter, to his battle with mental illness. The development team also worked multiple weeks without a day off through August and into September as we fought to update all our apps for Apple’s radically redesigned iOS 7.

That Labor Day weekend I had my first panic attack at the office, leading to my first ER visit. After blood tests, a chest x-ray, and lots of questions, the doctor told me to see my primary care doctor about acid reflux and sent me home. Instead of calling my doctor, I went back to the office the next day. We had apps to ship.

After shipping, we revisited work-life balance issues at Omni and haven’t pushed quite that hard since, but my anxiety issues continued. Another panic attack sent me back to the ER in November. It was the same routine, but I followed up this time, getting treatment for acid reflux. I also told my primary care doc about my anxiety. He prescribed Ativan to take the edge off and help me sleep and left it at that.

Ativan has a high addiction risk, so I was afraid to take it unless I was in really bad shape. It also made me drowzy enough that taking it at work wasn’t an option.

The panic attacks continued to get worse. Every month or so, I’d freeze trying to solve programming problems at work. Anxious thoughts would fill my head, taking up the headspace needed for programming. These thoughts tend to build on themselves. “I’m stuck on this problem. … What if I can’t solve this problem at all? … What if we fail to ship because of me? … What if I’m losing the ability to program altogether?” These spirals would spin into full-blown panic attacks.

Panic attacks lead to heart palpitations, dizziness, and shortness of breath. However, the worst part is the inner dialog that insists that you’re having a heart attack or losing your mind. After losing Joel, the latter thought was particularly terrifying. If you haven’t experienced a panic attack, it can be easy to think, “Just suck it up. You know there’s nothing to be afraid of.” You might as well tell someone five drinks into their bottle of scotch, “Just suck it up. You’re not really drunk.”

In December of last year, I had my first attack in a social situation. I’d spent the week sleeping too little preparing my Xcoders talk on OAAppearance. The talk had gone well. After the exposure of teaching for six years, public speaking doesn’t provoke my anxiety. While socializing after the talk, the boozy milkshake and fries triggered a serious bout of heartburn. That spun into a bad enough panic attack that I passed out. My friends were supportive and saw that I got home safely. Unwilling to admit to the problem, I told them that it was exhaustion or a bad cold.

In February, I lost consciousness again during an attack. This time I was at home and the attack spun out of control so fast that I didn’t have time to react. I went from the bedroom to the kitchen to find an Ativan. Before I reached the cupboard, I went from standing to prone, bouncing my head off the floor on the way down. This episode, and my wife’s reaction to it, was enough to finally prompt me to seek help.

I found a new primary care doctor and scheduled an appointment to talk specifically about anxiety and panic attacks. Unlike my previous doctor, my new doctor treated the problem seriously. A couple of stories that ended with me on the floor probably gave my symptoms a bit more punch, but I think largely it was a matter of finding a doctor who took mental health issues seriously.

Since then I’ve started taking Celexa, a selective serotonin reüptake inhibitor (SSRI). SSRIs are the most common class of anti-depressants. This might be a temporary thing while I get my head right again. Some people just need short-term treatment while they heal. It might also be a lifetime thing. We’ll reëvaluate in the fall and see how things are going.

I know some people fear that anti-depressants mask the real you. My experience has been one of uncovering the real me. Peeling away the anxiety has let me experience the contentment again that had been missing. I’m not wildly happy or giddy all the time. I’m just more able to appreciate the good people and things around me.

I’ve also been seeing a therapist. He’s helped me learn some techniques for coping with anxiety and for diverting or riding out panic attacks. We’ve also talked through past episodes, a process called exposure therapy, which has been helpful in reducing meta-anxiety—anxiety about anxiety.

Finally, I’ve been practicing mindfulness meditation. I’m at 68 days in a row. It’s not easy to sit still—I don’t idle well—but there’s a reason it’s called a meditation practice. I’ve gotten better at it. The Headspace iPhone app has been great for this.

It’s been three months since I’ve had a panic attack, and several weeks since I’ve had any anxiety at all beyond the normal everyday worries of life. I feel like I’ve turned a corner and wanted to share my story to remind others that they aren’t alone. Things can get better.

* * *

If you’re struggling with anxiety, there are many things you can do.

Self Care

Be careful with hydration and nutrition. As developers, we can often focus to a fault. If the kitchen staff at Omni didn’t announce when lunch was ready, I’d forget to eat. The Due app has been great to remind me to take a break and have a snack in the afternoon. I always have a glass of water on my desk.

Practice good sleep hygiene. The most important thing here, counterintuitively to me, is getting up at the same time everyday. No sleeping in on weekends. If you go to bed and can’t sleep, get up again. Train your brain that the bedroom is for sleeping. You might get less sleep initially, but the fifteen minute power nap is your friend.

Exercise. You don’t have to become a marathoner. Simply taking a brisk 20 minute walk everyday is enough. It’s also a great way to solve tricky programming problems. I’ve done some of my best coding walking around Green Lake.


Start a meditation practice. There is ample evidence that mindfulness boosts happiness and life satisfaction. As developers, we do our work in our minds. Meditation helps us leave that office inside our heads. Headspace has been super helpful for me, particularly the series on stress and on anxiety.

Professional Help

See if your employee benefits include an Employee Assistance Program. These programs often include initial mental health consultations at no cost without having to get a referal. Most programs include a contact phone number to seek help. Many also provide email or web contact options if you find the phone intimidating.

Find an understanding primary care doctor. If your anxiety is interfering with your work or your personal life, it’s serious enough that you should seek professional help. If your current doctor doesn’t take your concerns seriously, find one who will. Mental health is as important as physical health. They’re really all part of the same thing, your health.

If your doctor recommends medication, ask about side effects and follow up. A challenge with medication for mental illness is that individuals respond very differently to different drugs. You and your doctor may have to try a variety of things to find what works. Your doctor should be clear about this and willing to schedule appropriate follow-up visits to work through the options.

Seek therapy. The combination of medication and cognitive behavioral therapy is more effective than either alone. The allure of a cure-all pill is strong, maybe even stronger than the idea that we can go it alone. However, the hard work of talking through your issues with another human being, one with professional training and experience, can be key to developing effective coping strategies.


Anxiety seems to be common with software developers. Three articles helped spur me to write this post.

From Andy Culp:

Yesterday I was approached by a developer, apprentice, friend, and sometimes mentor, who was having some personal issues. … During the conversation it was revealed how they’re experiencing huge anxiety, complete with panic attacks, and are even consulting a physician who prescribed medication for it. As this person spoke I could see the anxiety levels grow within through their body language , and witnessed the “deer caught in headlights” look as they wrestled on the precipice of going into another panic attack. “Developer Anxiety, we’re not alone”, by Andy Culp

From Greg Hurrell:

I was aware of all of these [perfectionism, procastination, and paralysis], but it is only recently that I identified the root cause that lies at the heart of all of them. It is a very simple emotion: fear. All of these can be reduced to fear. Fear of failing in the eyes of others and of myself, fear of not being good enough, fear of saying something stupid, fear of building the wrong abstraction, fear of repeating a past mistake, fear of being misunderstood or misjudged, fear of treading on somebody’s toes… “Conquering my demons”, by Greg Hurrell

From Kent Beck, who is confronting my single greatest fear:

When I was about 10 I read Flowers for Algernon, the story of a mentally challenged man who is subjected to an IQ-increasing treatment that only works temporarily. The story is written as a diary, with spelling and vocabulary tracking his changing mental abilities. As a child, the story was exciting because I could see how much smarter I was going to be and I could see all the new ways I could think and the worlds that would open up.

When I re-read Flowers for Algernon recently I was just sad. The second half of the story, where his mind is going away, is brutal. He can remember how smart he was but knows it’s gone for good.

I’m living through something eerily similar. “Me an’ Algernon”, by Kent Beck

Finally, I owe a debt to my friend and co-worker Rachael for her openness about her own battle. That’s been instrumental in my journey. Thank you, Rachael.