Thoughts on Personalizing Software

I’ve been obsessed with productivity software for most of my life. I’ve sampled dozens, from simple personal tools (like Apple Notes) to full-featured productions complete with the kitchen sink (like Phabricator and JIRA). None of them ever felt comfortable — many were too simplistic, some were too prescriptive, and some were overwhelmingly customizable (although not necessarily in the ways that I would’ve liked).

The fundamental challenge is that software products are more-or-less centrally designed, and even assuming a product is well-designed with many use cases covered, software products are exactly as-is, no more or less. Without the ability to add specific functionality, change certain flows, or remove unnecessary complexity, most software ends up being prescriptive and less-than-ideal for most specific use-cases.

For example:

Google Calendar is a complex and extensively-designed product, but at some scale, any product will overlook or choose not to include certain use-cases that might be important to a subset of users. The end result is a product that’s not “just right” for anyone.

But does it have to be this way? Does software have to built towards a one-size-fits-all paradigm that exists in real-world products at the intersection of economics and the laws of physics?

To be fair, there are examples of customizable and extendible software. Some apps ship with extensive options. The proliferation of APIs provides a foundation for countless products built on the same underlying data (Nylas is a great example of an easy-to-use API over email and calendars, which normally depend on arcane protocols). And, developer experience aside, Salesforce Apex is a first step towards a world of personalized software.

Screen Shot 2018-05-20 at 12.17.04
Customization options for iTerm 2

I’d love to see a world of software that allows any user to change the way certain workflows work, add custom inputs, and automate steps that should happen after a particular trigger.

Technically, we’re starting to see the building blocks that would make this possible — serverless execution is getting faster, and GraphQL makes it easier to discover and understand APIs.

Practically, I think this would mean a shift in the way we think about software product design along two dimensions:

  • How extensive is the base product? At the minimalist extreme, the product is essentially an API to the underlying data, with minimal functionality out-of-the-box. At the kitchen-sink extreme, the product is likely complex, with built-in solutions for a lot of use cases, but may be harder to customize.
  • How much customizability gets exposed? It’s easy to follow the rabbit hole of maximizing optionality, leading to a product that lacks cohesion and becomes incredibly difficult to maintain or change.

Beyond that, there’s also the question of how customizations would be implemented. Perhaps writing software will eventually become a form of basic literacy, and everyone can plug in personal code into a product at customization points. Or perhaps a product figures out an effective visual programming environment for its domain, and customization becomes possible without having to “write code”.

The obstacles between prescriptive software and personalized software echo fundamental debates in software engineering and UX design. But personalized software could unlock a massive amount of value in knowledge work if every worker could leverage software’s scale and computation capabilities in a way that matches the way they work.

Photo by rawpixel on Unsplash


For many years, I dogmatically resisted using mind maps to take notes or organize my thoughts. I was always afraid I’d get “stuck” if I used pen and paper — that my map would end up too cramped (or too sparse, which seemed wasteful), and the software always seemed too expensive and a bit clunky. I would always fall back to verbose, linear notes (written out top-to-bottom, left-to-right), often ending up with walls of text that I would then have to decipher.

Recently, I had a long-form writing project, and somewhat arbitrarily decided to build my outline in a mindmap. I dowloaded Mindnode — the app is ergonomic and a delight to use on both Mac and iPad, and syncs flawlessly through iCloud. Mindnode’s keyboard shortcuts made it feel like taking linear notes, and got me close to operating at the speed of thought.

This post isn’t a review of Mindnode the app. More importantly, the medium has been a significant shift in how I get work done. I find myself enjoying the experience more than I thought I would, and I now use mindmaps almost exclusively for taking notes and organizing my thoughts.

The first thing I noticed: the visual structure forced me to be more concise, capturing the essence of an idea rather than transcribing verbatim. In many cases, this becomes a forcing function ensuring that I really understand the topic; it forces me to be a more disciplined thinker.

I love that mindmaps exist in 2D. It lets me use my positional memory, which personally is significantly better than my temporal memory. This means that it’s much easier for me to remember to “go back” to a thought when I can literally scroll to it on a canvas, rather than having to scan through linear notes to recall the topic to which I wanted to return.

This has been fantastically useful during conversations (especially interviews), which might go deep into a topic or off on a tangent. It’s really easy for me to remember a dangling topic direction somewhere “over there” on my mindmap, and to come back to it at a later point.

The visual structure also makes it much easier to revisit and actually use my notes. The tree layout preserves the semantic structure of my notes, making it much easier to browse topics and reorganize them than manually manipulating a wall of text.

Currently, I have a large canvas with all the ideas I have for potential blog posts. I add details as I think about those topics, and I write about topics that are well-developed.

Mindmapping mindmap
My mindmap for this post