Brian Donohue
Makin’ that Instapaper

Microservices are Technical Debt

Matt Ranney, a Principal Engineer at DoorDash, recently gave an interview called Microservices are Technical Debt. I had the opportunity to work with Matt at DoorDash, and we had a lot of conversations on this topic 1.

Are microservices technical debt?

I was strongly in the less-but-better-microservices camp at DoorDash. Like many things, there’s a balance to be struck. Microservices 2 are critical to any web-scale system. That said, when you start to microservice all the things you tend to trade one set of problems for another, and they are not necessarily an easier set of problems to deal with 3.

The thing I liked most about the statement Microservices are Technical Debt is that it’s provocative enough to start the right conversation. I do agree that a microservices-only architecture likely introduces more challenges and technical debt than it’s worth.

  1. Occasionally over several beers :-) 

  2. Maybe we should just call them “services”? 

  3. For instance you might take your monolith spaghetti code and turn it into distributed systems spaghetti instead. The former is a lot easier to fix and work with, IMO. 

Multi-Level Summarization in Instapaper

Today Instapaper launched Summaries, which is a feature I’ve wanted to build for a long time. Summaries help readers both understand an article before reading it, and help them recall the details of previously read articles.

Building summarization features has become a whole lot easier with new tools and APIs, and this post will outline the technical details on how Instapaper generates its summaries.

Instapaper Summaries are generated using a multi-level summarization technique, where the summary is generated in two steps:

  1. Extractive Summarization: Most relevant sentences extracted from the text.
  2. Abstractive Summarization: Generate an independent summary from the extracted sentences.

Below we’ll dive into the technical details on each step and how it comes together in the product…

Going Full-Time on Instapaper

After almost 8 years in big tech engineering leadership1, I’m taking the leap to go full-time on Instapaper (again!)

I have a lot of mixed feelings about the change: nervousness, excitement, and a bit of the old FUD…

  1. Has it been that long already? 

10 Years of Instapaper

Ten years ago, in the summer of 2013, my startup failed. We had run out of money, everyone was laid off, and I ran down my personal savings trying to make it work. I needed a job as soon as possible, and there was only one place I wanted to work: betaworks.

At the time, betaworks was a startup studio in NYC known for building (bitly/Chartbeat), investing in (Tumblr/Kickstarter), and acquiring companies (Digg/Instapaper). There were a few open opportunities for my skill set (full stack iOS development), and I quickly chose Instapaper because…

Building an Inclusive & Diverse Team

In 2020, our organization at Pinterest led the company in hiring from underrepresented backgrounds. Pinterest had set engineering-wide hiring goals of 25% women and 8% underrepresented engineers. Our organization vastly exceeded those goals, hiring 63% women and 25% underrepresented engineers in 2020H2.

Building an inclusive and diverse team requires dedication and active participation at all leadership levels. We greatly exceeded the eng-wide goals via a focus on inclusion, a diverse slate approach, ambitious goal setting, and full team prioritization of inclusion & diversity.

I am sharing the factors that led to such success with the hope that it can be replicated by other teams and organizations…

ethTip: Open Source Plugin for ETH Tipping

Recently, I’ve been spending time exploring Ethereum/web3 with the goal of trying to understand the technologies and opportunities. Having spent most of my career building in web2, my entire concept of building has been based on centralized systems. I’ve found that thinking about building in a decentralized ecosystem is really foreign.

To learn more in a hands on way, I built a simple open source project called ethTip which lets you add Ethereum tipping to a website with just five lines of HTML.

Building Fast and Slow

When building products, there’s a tension between building something quickly versus building something high quality. In order to build good products, it’s important to balance velocity with quality. At certain phases it’s appropriate to build it “quick and dirty”, in others it’s important to take time to create polished, high quality experiences. I’ve seen a number of cases where people struggle to create this balance, which produces low quality products. Here’s when I think it’s good to build fast and slow…

Five Years without Cigarettes

Five years ago today, I smoked my last cigarette. Previously, I smoked a pack a day for ten years. Time for a bit of reflection on that. I always enjoyed this quote from Choire Sicha on his article about stopping smoking:

It’s like KonMari, except easy, because the only things you throw out are your cigarettes and your entire sense of self.

Migrating from Mailgun to SES

While sheltered in place, I finally had the time to do something I’ve been meaning to do for years: migrate Instapaper’s email service from Mailgun to Amazon’s Simple Email Service (SES).

In 2018, Mailgun changed their email pricing from volume-based to tier-based and, as a result, the cost of sending the Instapaper Weekly nearly doubled. Shortly after the price change, we disabled the Weekly email while taking the steps toward making Instapaper GDPR compliant, but it’s remained off because it was prohibitively expensive to continue operating the email.

After a few weeks of work, we are almost entirely migrated onto SES. As a result, we finally re-enabled the Weekly email after an almost 2 year hiatus! I open sourced several tools we used for the integration, and I’ll share the steps we took for the migration below…

Getting the Bigger Role

As a manager, I spend a lot of time with people discussing their career goals. Ambitious people want to see forward movement in their careers, which most often translates to “getting the bigger role”. That might mean promotion, becoming the team tech lead, switching to management, or growing into a manager of managers.

In my career I’ve had success “getting the bigger role” in both a four person startup and in an organization with thousands of employees. Luck and privilege did play a significant role in that success, but the other most important factor was that I was already “doing the bigger role” before getting it.

Appification of Browser Extensions

With Safari 13 launch in September 2019, Safari deprecated the old-style Safari Extensions in favor of Safari App Extensions. The newer extensions are bundled within a macOS app, and are closer in spirit to iOS app extensions then they are to traditional browser extensions.

Before this change, Safari Browser Extensions were fairly similar in structure to all modern browser extensions. More specifically, all modern browser extensions are comprised of a “background script” and “content scripts”, with communication between the two parts happening via messages over a JavaScript-to-JavaScript bridge. The “background script” can access local storage, extension settings, or a web service that interacts with the extension, and the “content scripts” have access to all of the content on the webpages the extension has access to.

With Safari App Extensions, the “background script” is now written in native code, either Objective-C or Swift. There’s some implications here for browser extension developers…

Converting Legacy Safari Extensions

In the process of converting Instapaper’s Safari App Extension, I found Apple’s documentation on Converting a Legacy Safari Extension to a Safari App Extension to be pretty limited and unclear. Outside of the most simple of Safari Extensions, there is no great upgrade or conversion path from the legacy extensions to the new extensions. From the documentation:

If you already have a Legacy Safari Extension and you want to convert it to a Safari App Extension, you’ll need to modify parts of it and completely rewrite others.

What’s missing from the documentation is what exactly you would need to modify or completely rewrite, which I hope to outline a bit more clearly…

Dark Mode for Web

Since the launch of dark mode on iOS 13 and Android 10, I found myself wanting dark mode for web. Dark mode is ideal for night time phone use, but it’s really jarring to open a link in a dark mode app and be blinded by the white backgrounds of the web.

Fortunately, Apple launched Dark Mode Support in WebKit in May of this year, and most major browsers now support the prefers-color-scheme media query to customize CSS for dark mode…

Advice for Software Apprentices

As the demand for software engineers continues to outpace the supply of Computer Science graduates from four-year universities, opportunities have opened for people from non-traditional software backgrounds to enter into the industry.

Coding bootcamp programs have opened across the country to help train people interested in entering the software industry. These programs range from 3 months to 1 year and focus on teaching software essentials to help their students become software apprentices at tech companies, with the ultimate goal being to convert into a full-time software engineer.

I’ve volunteered at several bootcamps in a variety of roles, including helping with curriculum development, giving technical talks, and mentoring students. At Pinterest I’ve also been on the industry-side of apprentice programs, managing and mentoring apprentices who we have hired from bootcamps.

In the course of mentoring and managing apprentices, I’ve found some themes around the challenges that apprentices face entering the industry, and I’m offering this advice with the hope that it will be helpful to apprentices who I won’t have the opportunity to work with directly…

Tappable Essays

In April 2012, Robin Sloan launched Fish in the App Store. The App is a “tap essay” about the transient nature of Internet content. The essay was broken into full-screen slides, and tapping on the screen would advance you to the next slide in the essay. The only catch was “there is no back button”…

Thirty

Thirty on the thirtieth! Today is like any other, but I suppose it’s as good a day as any to reflect on the past ten years of my life and look forward to the next ten.

In the past ten years I…

Minimum Viable Team

In Product Engineering, one of the major charters is to evolve the product by building new features. It’s often the hope that a new feature will change usage patterns to unlock step function growth.

Building something that unlocks step function growth is extremely challenging, especially with respect to mature products, and only occurs at the intersection of strong execution and feature/market fit. The most recent example that comes to mind is Instagram Stories, which not only curbed competitor Snapchat’s growth, but accelerated Instagram’s YOY growth from 25% to ~40%…

Open Source: IPShortcut

It took a considerable amount of effort to support Smart Keyboard shortcuts for Instapaper 7.7. Given that most of the functionality is basic for keyboard-enabled computers and not specific to Instapaper, I decided to open source a library called IPShortcut to automatically enable this functionality on view controllers displaying UITableView, UICollectionView, or UIScrollView.

Most of the functionality supported is simple…

Medium to Jekyll Conversion Tool

This past weekend I was working on setting up a Jekyll blog and importing my Medium posts to it. The process was fairly tedious since you need to…

  1. Convert Medium posts to Markdown
  2. Download the images from the Medium post
  3. Replace the image URLs in the post to URLs on your Jekyll blog
  4. Strip extraneous information from the Medium posts (title, footer, etc)
  5. Add the Jekyll frontmatter to the markdown

In order to help with this process, I wrote a Medium to Jekyll conversion tool that automates this entire process:

python medium_to_jekyll.py <path-to-Medium-posts-directory> <path-to-Jekyll-root-directory>

The script does the following…

Y Combinator Podcast: Operating Instapaper Through an Acquisition

First time talking publicly about coming into leadership position at Instapaper, the acquisition, the spinout, and running it independently.

Three-day no-meeting schedule for engineers

Note: This post originally appeared on Pinterest’s engineering blog

About 100 days ago, the Pinterest product engineering team began experimenting with a three-day no-meeting schedule for individual contributors on our teams…

Open Letter to the Stevens Committee on the Gianforte Academic Center

To the Committee Members considering the naming of the Gianforte Academic Center:

It is from a position of great concern that I write this letter to you. I was taken by surprise upon receiving President Farvardin’s email about the creation of this committee, as I was unaware that Greg Gianforte is not only a Stevens alumnus, but has made a $20 million dollar donation to the university to aid in the construction of a new academic building: the Gianforte Academic Center.

While I understand and appreciate the depth of Mr. Gianforte’s generosity toward the university, he has proven himself to be a man of a character unfit to have this building (or any other on campus) named in his honor. Furthermore, Mr. Gianforte’s conduct and worldview are wholly incompatible with the values of Stevens Institute of Technology. It is my firm belief that the Gianforte Academic Center, as named, would represent a blight on our history, campus, and institute of technology for the following reasons…

Instapaper Outage Cause & Recovery

The Instapaper service experienced an extended outage between Wednesday, February 9 at 12:30PM PT through Thursday, February 10 at 7:30pm PT. We brought the Instapaper service back up with limited access to archives as a short-term solution while we worked to restore the service completely. Today, February 14, we completed the full recovery of the service.

The critical system that failed was our MySQL database, which we run as a hosted solution on Amazon’s Relational Database Service (RDS). Here we’ll cover what went wrong, how we resolved the issue and what we’re doing to improve reliability moving forward…

Rebuilding Instapaper Search

TL;DR: What follows is a long (good Instapaper material), highly-technical post about re-building Instapaper’s full-text search feature. I’d recommend at least a rudimentary understanding of Amazon Web Services before continuing. If you’d like to read about the product launch, which should be friendly for everyone, you can read the blog post on the Instapaper blog.

I’ve been embarrassed about Instapaper’s full-text search for some time now…

Build your First Alexa Skill

Last night betaworks and Amazon hosted the first NYC Amazon Alexa Meetup to bring Alexa owners and enthusiasts together to build their first Alexa Skill. For the uninitiated, the Amazon Alexa service is the speech recognition and voice synthesis engine that powers the Echo, Dot, and Tap. The Alexa Skills Kit allows third-parties to create their own Alexa Skills that will then work with any Alexa-enabled devices…

Instapaper Tweetshots

In 72 hours…

It’s amazing how a (somewhat) slight product change can define a whole new set of behaviors. On October 29th 2013, Twitter launched inline image previews directly in the timeline, allowing users to view images without clicking through a link. In the one year since inline images launched, there has been a trend of sharing screenshots of text (usually from mobile devices) to Twitter, which allows the user to share specific parts of an article without exceeding the 140 character limit…

Hacking TestFlight Invites

Beta distribution on iOS has always been a pain in the ass. At the end of 2010, TestFlight launched a solution that made iOS beta distribution considerably less painful. TestFlight provided a platform that allowed developers to manage a set of beta testers, upload beta versions of their apps, distribute those betas to the testers, and manage feedback from beta testers. TestFlight was a godsend for iOS developers…

Bookmarklets are Dead

… we just don’t know it yet.

I first encountered the Content Security Policy HTTP header earlier this year when one of our users reported the Instapaper bookmarklet wasn’t working on GitHub. Triggering the bookmarklet, and inspecting element on the page revealed the problem…

Making Instapaper Free

Toward the end of January 2014, Andrew McLaughlin (CEO Digg & Instapaper), John Borthwick (CEO betaworks), and I had our first meeting since my promotion from lead iOS developer to General Manager of Instapaper to discuss the company’s roadmap. Since joining the Instapaper team in June 2013, I had advocated internally to eliminate Instapaper’s paid download and, instead, focus on adding value to the subscription. At the time, Instapaper’s subscription was priced at $1 per month, and the primary feature offered was full-text search.

Instapaper Fragmentions

When we built automatic sharing for Instapaper highlights, the team had several discussions about how to properly share a highlight link to another service. Here are two solutions we came up with:

  1. A page on Instapaper that showed the highlight, who shared it, and the original link to the article.
  2. A page on Instapaper that embedded the original article in a full screen iframe, highlighted the correct text, and scrolled to the highlight.

We knew neither of those solutions were great…

Instapaper Onboarding

The onboarding process for Instapaper is inherently complicated by the fact that the “Save to Instapaper” workflow is split across the mobile apps, desktop browsers, and third-party integrations. However, prior to the Betaworks acquisitions, Instapaper’s onboarding was still not the best experience it could be. For instance, this is what iOS users saw after logging in the first time:

There are some obvious problems with this approach…

Work as hard as everyone else

This was originally written for and posted on the Listserve 8/20/2012

Alpine Country Club 15th Hole, Looking backwards from the green

I worked as a caddie on a golf course during my teenage years. One morning I was working for Rappaport and Haas, two older gentleman that had retired and played golf together every morning. The three of us went through almost the entire round without saying more than a few words to one another. The silence was broken on the tee box of the 16th hole, a 180 yard par 3, while waiting for a group of ladies to finish up on the green. Haas said to me, “So Brian what are you studying in college?” as he swung his golf club lazily against the short grass. I replied, “Computer Science.” Then Haas asked, “What do you want to do with your degree in Computer Science?” I answered, “I’m not really sure, but I know I want to be independently wealthy so I can play golf like you guys.” Mr. Rappaport’s ears perked, he turned, pulled the cigar from his mouth, and interjected, “If you want to be successful it’s very simple: All you have to do is work as hard as everyone else, and then work harder.” And I stood there in silence for he taught me as one having authority, and not as the scribes.