Last summer, I visited Toronto to see my wife after being separated by pandemic-related border closures for months. While preparing for the trip, I realized that no matter how much I travel, it’s always a little stressful and now moreso with the addition of necessary safety measures like testing and vaccine checks. Add the difficulties of quickly finding boarding passes, managing delays, and tracking bags while my phone buzzes with irrelevant notifications and my heart rate skyrockets. So, I decided to use the trip as a test of the iOS 15 Focus feature and make travel less anxiety-inducing in the process.
I set up a focus mode called Travel that I manually activate or switch into automatically when I launch a flight tracking app or arrive at the airport. When I’m in this mode, a few things happen: my home screen switches to a (usually hidden) page that displays widgets for apps I always find myself searching for when I fly, my Apple Watch shows a special travel watch face, and notifications silence except for the people and apps that I’m expecting to interact with while traveling.
I found that this automation made the process of international air travel a lot smoother, and I’m looking forward to using it again when I fly to see her again soon 🤞. In the interest of sharing, here are my settings in case you want to use them as inspiration to build your personal travel focus mode.
🔴 Allowed Notifications: Messages from friends, family, Find My, Kindle, Flighty, App in The Air, Uber, and any time-sensitive notifications
⛔️ Focus Status: Off. I don’t need to telegraph to the whole world that I’m unavailable because I still check other notifications, just less frequently
📱 Home Screen: Enable the custom travel page and disable all other pages
📍 Name & Appearance: I use a purple map pin icon because I wasn’t using purple yet, and there’s no airplane icon
🎛 Turn on Automatically: While at JFK, LaGuardia, or Toronto Pearson and when using Flighty
✈️ Flighty: My gate, check-in, departure, and arrival time
🧳 Find My: The location of my suitcase (via an AirTag), so I know when it’s nearby if I’ve checked it
📒 Notes: A note called “Travel Documents” that always contains my boarding pass, COVID test, and anything else I may need to board
🌨 Weather: The current conditions in my destination city
⏰ Clock: The current time at my destination (useful if changing time zones)
🔋 Batteries: Reminds me when I need to charge my devices or where I need to conserve power during delays
The watch displays what I need to glance at most while in line or moving around the airport. I use the Infograph Modular face to pack a lot of info on screen at once.
🌎 Earth: Looks cool and reminds me I’m in the travel mode
✈️ App in the Air: Flighty doesn’t have a watch app, so I use this to check boarding info from my wrist
💬 Messages: It’s handy to have a one-tap way to message Kate that I’m delayed or arriving!
🧳 Find My Items: A faster way to locate my suitcase
🌥 Weather: Will I need my coat or umbrella when I arrive?
I hope when you’re able to travel safely again, a focus mode like this will make your trek less of a headache. For a discussion of how Myke Hurley and CGP Grey have adopted this idea in their travels, listen to episode #124 of Cortex.
This Friday, I spent an hour and a half chatting with Matthew Cassinelli about using Apple’s Shortcuts app to simplify my work and life. We went through 13 of my 156 shortcuts, showing how they work, explaining how I built them, and answering questions from the chat. As promised on the stream, here are 5 of those shortcuts that I use every day, with a brief explanation of why they save me so much time and links to download them.
As a power user of Apple software and developer of apps for their platform, I have a lot of, shall we say, feedback. So whenever I run into a paper cut bug or an API I wish existed, I run this shortcut to file a new feedback report (née radar) and then pray it gets addressed in a future OS update.
My MacBook sports a daily random wallpaper illustrated by the supremely talented artist David Lanham, whom I’ve followed for decades. But sometimes, macOS chooses an image that doesn’t fit the day’s mood. It’s times like these I run this shortcut to have the OS change my wallpaper to another random image from David’s collection without waiting for the following day when it will refresh again. The clever AppleScript it uses was written by a user of the MacWorld forum.
I hyperschedule my day in Fantastical, blocking out events for everything from work meetings to workouts to leisure reading. But sometimes, I get delayed (or overly ambitious), and I need to shift a whole bunch of events later in the day. That’s where this shortcut comes in. It’s so much faster than tapping through every event individually. Tell it how long you want to delay things, tap the events you want to move, and you’re done.
We use Slack statuses at Lickability to communicate all kinds of things: lunch breaks, doctor’s appointments, vacations, and more. This handy shortcut from Jake Bathman, which I’ve lightly customized, lets me update my Slack status from anywhere without even opening the Slack app. And it’s even better than that! I can even use it from within other shortcuts to automate my status. Jake has written a detailed setup guide that makes it super simple to use.
At the end of the workday, I like to step away from my desk and start unwinding. I run this shortcut from a button on my StreamDeck. It quits all my apps, turns on my favorite screensaver, and mutes my computer so notification sounds don’t draw me back into work. A little simple ritual for leaving my Mac how I want it for the next day.
That’s all for now! I hope these shortcuts speed up your workflows as much as they have mine. If you enjoyed this post, let me know on Twitter, and maybe I’ll share more in the future.
PowerPoint presentations get a bad reputation. That’s because most of them are terrible—they’re boring, they’re too long, and they’re full of tiny text and awkward animations.
On the other end of the spectrum, there are the highly-produced Keynotes from Apple that have been agonized over by legions of designers to sell you the company’s latest products. These decks are so intricate that they seem impossible for mere mortals to put together.
When my longtime friend and collaborator Brian Capps and I worked as iOS engineers at The New York Times, we noticed something concerning. There were a lot of intractable technical problems in the organization that seemed unsolvable due to politics and inter-team communication roadblocks. Everything from bug reports, to performance issues, to new features that needed newsroom buy-in got backed up this way.
So, as people who cared deeply about the quality of the products we were building, we searched for any way to get product people, designers, and business folks all on the same page about what we wanted to fix in the iOS app. The best tool we found (after trying many) was the humble slide deck.
Here’s what we did when we really wanted something to get fixed:
Brian and I would book a conference room together in the middle of the day, write an outline of what we wanted, and then develop a well-designed and straightforward slide presentation to make our argument. (By the way, we never told our bosses we were doing any of this.) We’d rehearse our spiel and then, we’d presell the idea by showing the deck to just a few people we knew would be critical decision-makers and solicit feedback, editing the deck as we heard their objections. Finally, we’d book a meeting with everyone in the organization who would need to be on board if we were going to make the change.
For example, once, we wanted to make sure that the NYTimes iOS app rendered all advertisements at the proper resolution on the new iPhone 4. We knew we’d need to convince a designer, the head of sales, an ad trafficker, a product manager, and our engineering manager. So we invited all of those folks to a meeting, dimmed the lights, and pitched our hearts out. For the first time, everyone in that room saw the blurry non-Retina ads for what they were—ugly and unbecoming of The Times. Everyone came out of that meeting jazzed to solve the problem, and together, we did!
This technique worked so well that we used it repeatedly, improving the app along the way. Our little slideshow sideshow became so familiar that it earned us a nickname: “the twins”. In fairness, we did have a bit of a Ringling Brothers vibe going on at the time.
Presentations are perfect for persuasion. Solid slides make information digestible; they show that you’ve thought deeply about the problem. And putting effort into them shows that you’re serious and that you care. Anyone can write an email, post a Slack message, or toss a meeting on the books. But few people will take the time to prepare a thoughtful, well-reasoned, and persuasive deck.
The next time you want to convince your coworkers, despite their differing priorities, to commit to working on something you care about: open your slideshow app of choice and make your argument in big type, one slide at a time. I bet your slides will change more minds than you expect.
I’ve been using software every day for almost 20 years. I use it to do my work, create things in my spare time, socialize, relax, and so much more. And if you’ve met me or been reading this site for a while, you know I have very strong opinions about how it should be designed and crafted. But by far, my strongest belief about software is that almost no one pays enough attention to the paper cuts. In the field of interaction design, a paper cut bug is “a trivially fixable usability bug”. The term comes from the Ubuntu team, which decided in 2009 to prioritize fixing lots of these niggling issues. GitHub followed suit in 2018.
Running up against a paper cut bug feels a little bit like getting a physical one: not the end of the world, but certainly unpleasant. These types of tiny annoyances accrete over time, especially when no one is paying attention to them. In a single day of using my phone, I encounter dozens of these minor bugs that each annoy me just a little bit, making the task I’m trying to accomplish just a little bit more complicated.
For example, I might notice a button that’s enabled even though it can’t do anything, or a form field that has a scroll bar even though there’s no scrolling content. The result is that I trust the software I use less. When software isn’t polished, when it’s full of things that feel like paper cuts, it becomes less joyful and more frustrating. It sucks all the opportunity for delight out of the room.
The more insidious thing about these bugs is that they’re rarely reported by users or caught by automated testing tools because they’re too small to complain about or too obscure to write tests for. Great QA testers can find and file these types of bugs, but they usually flounder at the end of a long backlog of new features. This means that if you’re an engineer on a piece of software, you’re the person who’s best able to notice and fix these bugs. Yes, you might have to convince your boss or your product manager to set aside some time every so often to do so, but I promise your users will be grateful, and your product will improve in meaningful ways if you do.
What kinds of things should you be looking for? How can we notice paper cuts when they’re such a part of our daily reality in every app we use? Here’s a list of some of the most frequent paper cuts I see. I hope it helps in your quest to smooth out the edges of your software—to paint the back of the fence.
Common Paper Cuts
Logouts: When I open the app, sometimes I’m randomly logged out for no good reason.
Inconsistent Copy: The text switches randomly between straight quotes and smart quotes or title case and sentence cases.
No Undo: I change something, the UI updates instantly, but there’s no way to undo the change, so now I’m out of luck if I don’t remember what I did.
Scroll Hitches: Scrolling lists cause the app to freeze up or drop frames.
Missing Options: The app is missing an option for my gender/pronouns or forces me to fill out a required field that doesn’t apply to me.
Lacking Accessibility. Some elements are missing labels for screen readers; the visuals have poor contrast, etc. (I gave a whole talk about this.)
Unlocalized: The copy and date/time formatting doesn’t match my language or region settings.
Typography: An element is improperly typeset, leading to inconsistent margins, cut-off descenders, or illegibility.
Strict Validation: Overly strict form validation prevents me from using the name I want to or including an emoji.
Flashes & Blinks: When things load from the network or disk, they flash or blink into place, or the content of the screen jumps around to accommodate them.
Loading?: Something is taking a while, but there’s no spinner progress bar to keep me informed.
No Empty View: A list becomes empty, and I’m staring into the void rather than at a nicely designed empty view so I know what I can fill it with.
Wayfinding: I can’t easily find Settings, Terms of Service, Privacy Policy, third-party code licenses, etc.
No Primary Action: The primary action on each screen isn’t differentiated or highlighted, so it’s hard to know what I’m supposed to do.
Dead Ends: There’s no way out of a screen or flow. Or there’s no way to cancel or delete my account.
Missing States: Buttons and list items don’t look any different when they’re touched, hovered over, or disabled, so it’s hard to know what state they’re in.
Where Was I?: The app forgets where I was when I reopen it or clears my selection when I go to the background.
Missing Animation: Rather than smoothly animating to a new state, the UI blinks and updates, like an unfortunate smash cut.
No Errors or Retry: When I try to do something, the operation fails without any error message or way to retry.
I challenge you to use your own app with fresh eyes on Monday morning. After an hour, are you pained by proverbial paper cuts? What are the bugs you’ve hit so many times in the software that you forgot they were bugs? You know you can fix those, right? Well, get to it.
For decades, email apps like Gmail, Outlook, and Apple Mail have all included a button to mark a message or thread as “unread”. But why? The software knows the message has been read; why is it allowing the user to override that truth and rewrite history?
There’s a simple answer: it’s useful! The unread state of messages in an email app controls things like the number next to the current folder, the application’s badge, and the status indicator next to a message reminding you to look at it. A simple button to say “Oh yep, I know I clicked into it, but I didn’t actually read it or fully process it yet” is a great affordance for users to manage their communications that has stood the test of time. While some argue that flags should be used instead for this kind of message management, they miss the point that flags cannot and do not convey, to either the user or the software, the same meaning as a message being unread.
“Mark as Unread” has been so successful and well-loved in email that it’s been copied by many messaging apps like Facebook Messenger, WhatsApp, and Instagram. And its utility in a casual messaging context is much the same in the slightly more formal email context.
Let’s say you’re riding the bus and you open a message from a friend, maybe asking you about your plans for the weekend. You have to respond to that but maybe it’s your stop already or you don’t know yet. But if you don’t say anything now, you might forget to respond and then you’ll look like a bad friend. Not to mention you might miss out on some weekend fun.
Messages routinely get forgotten and go unanswered. The missing “Mark Unread” button has no doubt caused countless accidental ghostings, avoidable arguments, and missed opportunities. And its lack has likely made life more difficult for users with conditions that affect memory or follow-through, like ADHD and depression, who may not be able to respond in the moment and have no easy way to record their intention to do so.
So why hasn’t Apple added this feature? If I put on my Product Manager hat, I can think of only one argument that’s likely been made internally to keep this wildly popular feature out of the app. It goes like this: “If we add a button that says mark as unread, wouldn’t users expect that it would unsend their read receipts?”
This is a compelling argument that I was initially sympathetic to, but looking deeper, this just isn’t a problem in the real world. Outlook, which supports both read receipts and Mark as Unread, seems to cause no significant user confusion in this regard. The read receipt exists for the sender, and the local unread status is for the recipient. Simple as that.
Even if this slight ambiguity is too much for Apple to handle, they could instead incorporate another feature from Mail instead: flagging. Allow users to flag a conversation (or an individual message) and then see all their flags in one place, when they’re ready to respond.
Whether Apple chooses to implement this feature as “Mark as Unread”, flagging, or something else entirely, they should implement it, and soon. As more of our communication, both personal and professional, moves online, it’s never been more important that we keep our commitments to each other, that we respond when we say we will, and that we keep dialogue flowing. We’ve long had a great tool for doing exactly that; now that took just needs to meet users where they are.
This article has also been filed as feedback for Apple at FB9838778.
Update: After posting this article, a friend at Apple reminded me that one of the first things he did when he got to the company was try to file a radar for this missing feature. Except he didn’t have to because he found an open bug from yours truly filed in 2009. I’ve been asking for this feature for 12 years and I don’t plan to stop any time soon! Maybe I should try this approach next.
I was thrilled to guest on episode #430 the Clockwise podcast today where we talked about the last apps we purchased, how we’d handle third-party payment options on our Apple devices, our experience with Exposure Notifications, and how we track our resolutions, themes, and habits for the new year.
Give it a listen and let me know on Twitter what your answer would have been to my question: What apps or systems do you use to track your progress toward your resolutions/themes/habits you’re trying to work on in 2022?
I was first introduced to the phrase “thought technology” by Merlin Mann and John Roderick on their long-running podcast Roderick on the Line. A thought technology isn’t quite the same as a belief or a philosophy, and it’s more than just a simple lesson. “Keep moving & get out of the way” is an example from their first ever episode about how to best traverse a city. Thought technologies like this one are ways of thinking about particular problems or situations. They’re technologies in the sense that, like a hammer or a pencil, they can be used to solve problems. Sometimes having the right thought at the right time is all you need to move forward, break through, or get unstuck.
Architects and engineers may be familiar with this concept as “design patterns”: reusable solutions that can be applied repeatedly in the creation of complex systems like buildings or computer programs. It’s not a coincidence that Merlin has also given a talk at Macworld in 2009 about design patterns, because the two concepts do share a lot of DNA. But thought technologies, as I understand them, are often more broadly applicable than design patterns, and can even cross disciplines and mediums.
Before I even knew the term, I had heard about a deck of cards called Oblique Strategies, created by Brian Eno and Peter Schmidt in 1975. The original deck contained 113 cards, each of which gave a suggestion of how to get unblocked on creative problems by encouraging lateral thinking. For example, “Try faking it!” or “Ask your body”. While at first glance these may seem like nothing more than empty aphorisms or clichés, upon deeper inspection, they’re actually hard-won lessons in creativity, distilled into ink and letter-pressed onto paper. They’re little verbal gadgets for your brain to help you be a better artist or musician or creator.
If you’re a fan or practitioner of improvisational theatre, you have likely heard of the thought technology of “Yes and…”, but improvisers have a huge collection of these that they’ve built over decades to understand and improve their art form. Sometimes they’re referred to as “the rules”. But one of the things I love about the word technology in this context specifically is that it is value-neutral. Just like floppy disks or CD-ROMs, thought technologies can become outdated, outmoded, and be replaced by better, more useful tools. There are no good or bad technologies, only better and worse uses of them.
In fact, in an incredibly meta sense, even having an awareness of the concept of thought technologies is a thought technology in itself. Once you become aware of the various mental patterns and cognitive strategies you regularly employ to interact with the world, it becomes much easier to name, record, and consciously employ them. The branch of psychology interested in Cognitive Behavioral Therapy even uses this to help treat patients with mental illness and other cognitive distortions. Once you have built up this personal library of thought technologies you use, you can then examine, improve, update, and replace them as you learn new things about yourself, your work, and the spaces you operate in.
Some of the smartest people I know have recently become invested in building bespoke systems for exploring their own thought technologies over time. Andy Matushack’s working notes, the rapidly-expanding Roam Research and Obsidian communities, Tiago Forte and Nick Milo’s respective online courses on networked thought, and the larger movement toward personal knowledge management systems all point to the idea that as knowledge workers and creative people, it’s much easier to make breakthroughs in our work when we can look at what’s going on in our brain in a more concrete form and operate on those mental models more directly. I’ve even dipped my own toe in the water by publishing 30 of my own thought technologies on my 30th birthday last year.
Giving someone a new way to think about the world is a gift. As someone who’s always trying to learn and grow, I try to treat these gifts with the same respect I have for the physical technology I carry with me in my pocket. Brian and Peter gave musicians hundreds of these gifts in a deck of cards, improvisers hand them down through books and classes, and Merlin and John broadcast them out weekly in an RSS feed. Thanks to that show, I’ve gained a way to think about thinking, and if you’ve never considered the apps that run on your own mental operating system before today, maybe you have too. Think different, I suppose.
I’ve been reading Daniel Bogan’sUses This (née The Setup) interview series since I was a teenager. They chronicle interesting people’s hardware and software setups and end up being a fascinating window into the subject’s priorities and tastes when it comes to tools and toys.
My own interview just went up on the site, so now you can read all the nerdy details of my setup. Let me know what you think!
A few years ago, I let folks on Twitter ask for software recommendations for any problem they need solved with an app. People loved it and I loved helping people find the perfect software solutions to their quandaries.
This Friday at 3 PM ET, I’m experimenting with a version of the same thing on Clubhouse co-hosted by my friend and colleague, Jillian Meehan. It’ll be be a fun, nerdy time and we’d love to see hear you there.
PS: If you need a Clubhouse invite, let me know and I’ll send you one.
Tech is always political. The way data is collected and handled is often biased, and many products are neither accessible nor inclusive. Ethical Design Guide is made to share resources on how to create ethical products that don’t cause harm.
Sarah L. Fossheim just released this wonderful collection of resources (and monthly newsletter) on how to make digital products more inclusive. It covers topics from accessibility, to race, to gender. I know I’ll be bookmarking this and referring to it often. Huge thanks to them for putting this together.
Tone indicators are most popular within some Twitter and Tumblr communities of young people with overlapping interests in identity representation, anime and K-pop fandom, twee aesthetics, and sensitivity toward mental health and gender issues. It’s a milieu where inclusivity is considered a paramount virtue. These people use and like tone indicators because they want to help others have better experiences online.
In recent weeks, several users have posted lists containing dozens of tone indicators ranging from “/j = joking” to “/lh = lighthearted” and “/nsx = nonsexual intent.”
I love how much folks in gen Z are using the tools of the internet and their digital-literacy to improve inclusion, how much they’re thinking about the needs of neurodivergent people, and how this kind of accessibility is gaining a kind of mainstream momentum.
As technologists, we should be following these conversations closely and finding ways to build support for tone indication, content notes/warnings, and other new ideas about communion directly into the tools where appropriate. We should be enabling and empowering better, more nuanced conversation within the software itself.
This week I was excited to appear as a guest on the Everyday Robots podcast, hosted by Jonathan Ruiz. We discussed my career as an iOS developer, the making of Buildwatch, and the latest Apple event. Listen below or wherever you get your podcasts.
We launched a new app yesterday at Lickability. Buildwatch is a brand new Mac menu bar app for iOS developers that lets you track, graph, and analyze your Xcode compile times. I’ve wished this app existed for a long time, and now it does. 📊
Here’s what’s on my personal WWDC wishlist this year:
✍️ Documentation for all public API
⚙️ Setting default apps
📱Redesigned SpringBoard
🔨 Buddybuild relaunch
🐦 SwiftUI usable in production
📧 Snooze + send later in Mail
💎 Cataylst improvements
💬 Mentions in Messages
🔖 Pronoun sharing in iMessage/Contacts
🖥 Shortcuts on Mac
🔗 Universal Link Settings
🔒 iCloud Keychain Import/Export
🗓 Calendar Redesign
⌚️ Apple Watch Sleep Tracking
🧠 Smart Playlists & Albums on iOS
🧭 iOS Safari Tab Redesign
📲 Customizable Lock Screen Actions
🎛 Control Center Extensions
What does it take to build software that’s truly usable for as many people as possible?
This morning, I’m giving a talk on this topic at App Builders 2020. The presentation focuses on improving the accessibility of the software we build. Drawing on examples from the fields of architecture and design, as well as my experience, it explores the how and why of iOS accessibility in the broader contexts of ability and inclusion. You’ll learn how to audit your application for accessibility and get started making changes that will open it up to new customers.
Stand clear of the closing doors please. This NYC subway soundboard app, by my pal Elle Lewis, made my day yesterday. If you’re a New Yorker, you should have this on your phone. 🚇
I’m not much of a gamer, but I am a nerd about the creative process. As such, I’ve really been enjoying Robin Sloan’s new development diary newsletter where he is chronicling the creation of a game called Perils of the Overworld. Consider subscribing if you’re nerdy about maps, game making, typography, sound design, or interactive fiction. 🗺
There is no gate keeping, no screening, just a calendar form. I just show up to whatever appointments folks booked on my calendar with hopefully a little context of what they’d like to discuss. I don’t think I’m some industry pundit, but I do recognize that anyone who has been doing roughly the same thing for 10 years might be able to provide advice for someone earlier on in their career. Also, it just feels like the right thing to do to try to give back to folks in this very small way.
My pal and former Tumblr coworker Brian Michel is opening up his office hours to the public and wrote a great post about why experienced technologists should be open to new connections and offering support, as well as some instructions on how to set it up.
If you’re in tech and wanna talk to one of the kindest, smartest folks I know, you can sign up for his office hours here. I just did.
While there are lots of great guides on how to work remote from companies like Notion, Zapier, and Slack, we thought share some of the specific tools we’re using to make this easier for our team. Hopefully, if you’re a newly remote employee or manager, you’ll see something here that can help smooth out a part of your workflow.
I wrote a new blog post over on the Lickability blog about the new tools we’re using to work from home better and some tips about how we’re using them. 🛋
As I mentioned the other day, I’m bringing back my App Critique video series, and the first submission is the app Learn Your Lines! from Andrew Cote. In this video, I walk through the app as a brand new user and point out some potential areas for improvement in the app’s UX and UI.
Since starting on the site redesign last year, I’ve known I wanted the website to have a now page:
Most websites have a link that says “about”. It goes to a page that tells you something about the background of this person or business. For short, people just call it an “about page”.
Most websites have a link that says “contact”. It goes to a page that tells you how to contact this person or business. For short, people just call it a “contact page”.
So a website with a link that says “now” goes to a page that tells you what this person is focused on at this point in their life. For short, we call it a “now page”.
I finally had some (quaran)time to make one this weekend, so if you’re ever curious what I’m up to, you can now visit /now.
As I mentioned on Twitter yesterday, I’m bringing back a project I did in 2016 called App Critique 🧐. The goal is to show how I evaluate the design of software with short video design reviews.
If you’d like your app design scrutinized, fill out this form. Preference will be given to indie devs and small companies.
The delightful weirdos over at performance art/tech company MSCHF just launched a new app. The app does what they used to do via text messages until the phone companies starting blocking their numbers: allows you to chat with them and sends you a notification every two weeks when they announce drop their new project.
Helpful Engineering is designing, sourcing and executing projects to help people suffering from the COVID-19 crisis worldwide.
We are an open community of volunteers without a commercial purpose. We believe that through a utilitarian approach, we can do the most good in the quickest time. Applying unused engineering and manufacturing resources, we can help the world cope with the threat of COVID-19.
I’m super impressed by the speed and organization of this group of volunteer engineers that are working on a number of really useful projects in the midst of the COVID-19 pandemic. If you’ve got spare time, resources, or engineering know-how, consider joining their efforts.
A man in California is haunted by the memory of a pop song from his youth. He can remember the lyrics and the melody. But the song itself has vanished, completely scrubbed from the internet. PJ takes on the Super Tech Support case.
I’m way behind on podcasts, but at least I’ve got plenty of time to catch up since it looks like we’ll all be stuck inside for the foreseeable future.
After seeing this recent episode of Reply All recommended everywhere, I gave it a listen, and it’s as good as everyone says it is. Queue it up if you’re interested in music, mysteries, obsessiveness, journalism, or the intersections thereof. Also, if you want more like this, go back and listen to Mystery Show. RIP.
The exhortation “learn to code!” has its foundations in market value. “Learn to code” is suggested as a way up, a way out. “Learn to code” offers economic leverage, a squirt of power. “Learn to code” goes on your resume.
But let’s substitute a different phrase: “learn to cook.” People don’t only learn to cook so they can become chefs. Some do! But far more people learn to cook so they can eat better, or more affordably, or in a specific way. Or because they want to carry on a tradition. Sometimes they learn just because they’re bored! Or even because—get this—they love spending time with the person who’s teaching them.
A very smart essay from Robin about an app he made for his family, but also about how truly personal software and its creation is powerful.
He reminds us that not all code has to scale or produce market value. Sometimes code can be a way to express yourself, have fun, and make life a little better for the people closest to you. Sometimes coding can be like cooking a meal for someone you love.
I’m super excited that I’ll be speaking this May at the App Builders CH conference in Lugano, Switzerland. App Builders is one of the biggest European conferences about mobile technologies, and I’ll be presenting alongside a bunch of incredibly smart folks. It’s sure to be a great time, and I hope to see you there! 🇨🇭
Of course, we didn’t purchase it to shut down or leave unchanged, so we’re planning a major makeover – Tokens 2.
Most importantly, Tokens will finally start supporting IAP promo codes! On top of that, we’ll refresh the look and make an iOS app to make it possible to generate codes on the go.
Great news for such a useful developer tool that’s been missing from my toolbelt for a while. My only question is whether Apple will approve the iOS app.
Your job as a founder or CEO is to run your company and make your customers happy, not to do every little thing by yourself. Work with the pros who will save you time and make you money. Hire a lawyer, hire an accountant, and (if you’ve got room in the budget) get some help with your operations. Trust me, you’ll be glad you did.
Over on the Lickability blog, I wrote about my company’s history of working with outside professionals and have some advice to business owners about what to look for when hiring lawyers and accountants.
It is the most dramatic new look for our magazine in its 162-year history, and one that, we hope, reflects boldness, elegance, and urgency. The redesign of the print magazine, as well as the new look of our website, was led by Peter Mendelsund, our creative director. His design work, carried out in collaboration with many teams across our magazine, is also reflected in the new Atlantic app that launched today.
Really excited about this bold new look for one of my favorite publications, and honored to have gotten to work on the development of the app at Lickability.
I’m extremely tempted to spend the $50 on this nifty application from Arrow Bit SL that claims to document and expose nearly 100% of the SwiftUI API and make it super easy to learn. Apple’s own docs are still sorely lacking at this point with 60% of the framework being completely undocumented. Anyone else try it yet?
The next day, he said, “We are looking at a way to link. Noting Motherboard explicitly—and I understand why [sic] would want this—is more complicated, however. Are we then obliged to note that The Guardian had some of the documents, too? If half a dozen other publications got a piece of the Facebook material, as well—for ‘internal’ documents, they do seem to get around—would we need note them, too? Where does it end?” The Times never added a link.
Thinking about a journalist in the NYT newsroom in not being able to figure out how to make a hyperlink cracks me up and I’m not the only one.
I’ve soft-launched a new version of this website designed by my pal Robyn Kanner and developed by Martin Giannakopoulos. If you’re reading this in RSS and haven’t seen the site in a while, come take a look around and send me feedback on Twitter.
Last March, I gave a 7-minute speech at a reading series that scratched my persistent itch to be in front of a crowd. But in 2019 I want to get back into my usual schtick of giving longer, prepared presentations with slides. I love attending conferences, and I especially enjoy having the opportunity to hone a talk and share it with a group of my peers.
Later this month, I’ll be heading north to speak at (the appropriately named) NSNorth 2019. NSNorth is Canada’s premier independent Apple developer and designer conference, and like Çingleton in years past, it’s taking place in beautiful Montréal, Québec. I’ve never been to this conference before, but I’ve met the organizers at other events, and I’ve heard great things.
My talk is called Growing Pains and it’s about the things that break as your software team or company gets bigger and what you can do to make that a less painful process. If you’d like to hear more about the conference and my experience on the topic, Dan and Phil interviewed me on the NSNorth Podcast. Give it a listen below or wherever you get your podcasts:
Finally, the organizers have announced that this is the last year for NSNorth for the foreseeable future, so if you’ve always wanted to attend, now’s your chance. If you need help convincing your boss to cover the cost, they’ve got you covered. Tickets are on sale until this Friday, April 12, so act fast.Je vais te voir là-bas!
It’s Julie’s last day at work. She’s already turned in her laptop to IT, sent her goodbye email to the team, and is wrapping up her last knowledge transfer meeting. Tonight, there’s a goodbye drinks with the whole engineering department at that bar everyone loves across the street from the office. You’ve followed all the processes as a manager to offboard this person correctly, and wished them good luck at their shiny new job with more stock options and a higher salary you just couldn’t match. “Good for her,” you think, as the night winds down over a final round of cocktails. But wait – you’re not done yet.
When you’re a manager, the way you treat the people that were on your team matters almost as much as how you treat the people that are. Your ex-employees are the people out there talking the most about your company and your team. They’re the people that get DMed when a new recruit is trying to find out what it was really like to work for your company and for you. And handled really well, ex-employees are often great folks for you to tap in a few years for the new team or company you’re working on, when they’re ready for a new challenge.
How should you treat the people you used to work with, so you won’t leave a bad taste in their mouth? Here are a few do’s and don’ts I’ve picked up from my own ex-managers over the last decade or so. Disclaimer: this advice won’t apply to every situation, including if an employee left or was pushed out on bad terms.
What to Do
Let them leave with dignity.A CTO I really respect taught me that letting people take the time they need to say their goodbyes and tie up loose ends, without rushing them out the door, pays dividends. He gave me the great advice to spend my last day on the job having coffee with everyone that had an impact on me, thanking them, and exchanging contact info.
Remember that it can be emotional to process endings, even if it was their choice, and last days can be full of paperwork and tears. It’s okay if they need to come back the next week and pick up a few more things, or need building access for a final meeting after their technical last day. Don’t be a jerk or make mean-spirited jokes about how much they must want to stay. Not cool. You want their last memory of this place to be a positive one: handshakes, hugs, and well-wishes.
Keep in touch (if they want to). Some of your reports or teammates probably view you as one of their mentors, and it can be hard to abruptly lose that guidance when they switch jobs. In your last 1:1, ask the person departing if they want to stay in touch after they get settled in their new role. If they do, set up a recurring reminder to check in with them every few months or a few times a year on their career over coffee or lunch. If they blow you off or don’t seem interested, take the hint.
Let them hang around. It’s natural for folks to miss some of their coworkers, the office, and aspects of the culture when they quit. So if you see them coming by for lunch or after work to hang out with some pals, say hello and be cordial. Obviously, also be aware of the security / guest policies of your company and make sure those are being followed. The benefits of knowledge-sharing (of things they’ve learned in their new role) with your team far outweighs the risk that they’re going to “steal all your people” or whatever other irrational fear your lizard brain has cooked up. Chill out; it’s nice to see their face again.
Take their feedback seriously. They likely understand and care about your product a lot. So it might not be long before you see a tweet or email from an ex-employee about the thing they used to work on. They might be reporting a bug or airing a grievance. While it might not be the most polite way for them to give this feedback, it’s still useful. This person is essentially doing free QA on a system they’re very knowledgeable about. If you see something like this, shoot them a message asking for more details and thanking them for the report. Stay classy and fix the issue if you can! You’ll make them feel heard and respected while helping them and lots of other users too. Win-win.
What Not to Do
Don’t blame them. A few weeks after an engineer leaves a team, there will be a bug that someone will blame on them—their code, their oversight, their fault. Resist this temptation. Your team has code review, unit tests, and architecture meetings to prevent this type of singling out of developers. Remind them that every issue is a shared responsibility, and focus on fixing the problem instead of dredging up historical evidence of whose fault it was. Don’t let folks blindly rewrite systems just because “only Jim understood how this worked.” Work to build a shared knowledge base and set of documentation so that no one person is completely indispensable.
Don’t make them work for free. There’s often a temptation to message ex-employees with “quick questions” about esoteric code or systems that they worked on after they leave the company. Please don’t do this. If you absolutely need these answers, hire this person at their consulting rate and pay them for their time and labor. This kind of arrangement is super common, and your company should hopefully already have a boilerplate agreement for this scenario. If not, now’s the time to draft one.
Don’t erase them from history. This isn’t Eternal Sunshine of the Spotless GitHub. It’s unprofessional and petty to remove folks as contributors to your open source projects (especially if they want to contribute in their spare time) or scrub their bylines from your engineering blog. I’ve even heard of bosses ignoring their former employees at conferences and industry events or blocking them on social media. This is a really bad look. Don’t be a jerk to people who worked for you.
Don’t ask them on a date. I wish this went without saying, but it doesn’t, because I’ve heard of this happening. If you had a crush on your employee and the only reason you weren’t asking them on a date is because of the HR policies in place to prevent that, now is not the time to flirt with them. The power imbalance that existed between you doesn’t magically disappear because they work somewhere else. This is a really bad idea, and you should do some soul-searching and work on your boundaries if this is your first impulse.
Many managers think a lot about how they treat their team, but very few I’ve spoken to have a philosophy about those who leave it. Treat your ex-employees like they’re professionals that helped you build and ship great things, because that’s exactly who they are. If you’re consistently nice and professional to the folks you’ve worked with in the past, it’ll help build your reputation as the kind of person that’s great to work for.
It’s scary how much email I get at work. Despite Slack’s best efforts, much of the business world still “runs on email.” In 2019, the inboxes in my life are brimming with messages from new leads, existing clients, potential vendors, folks trying to network or ask for advice, and lots of transactional bullshit: newsletters, password resets, and spam. I’m sure your inboxes feel just as overwhelming. So it’s no surprise that folks (me included) sometimes get behind on responding to their email.
But today, I’m writing about a particularly pernicious form of email non-response and how to stop it: professional ghosting. The mid-2000s millennialism “ghosting” refers to abruptly and intentionally cutting off contact with someone you’re dating without warning or justification. You stop responding to their flirty texts and date asks and don’t tell them why. In fact, you don’t tell them anything. You’re a ghost. The word gained popularity in 2015 along with the rise of Tinder and a bevy of other dating apps where “leaving people on read” has become commonplace. Professional ghosting is basically the same thing…except it’s at work, so there might be money involved.
Imagine this: you’re in an email back-and-forth with a client who has hired you to design a new website for them. After they’ve paid a deposit and you’ve started the project, you have a question about how big the logo should be. You dash off a quick email to the client to ask them. And you wait. Maybe you figure it will take them a business day or so to respond. But then you hear nothing for days. Days turn into weeks. Radio silence. You’ve been (un)professionally ghosted.
Why does this happen? It’s not always just that folks are busy. It’s often a more specific kind of anxiety and friction that causes this particular supernatural phenomenon. Maybe something in your email raised follow up questions, maybe more stakeholders behind the scenes need to be consulted, or maybe it felt like things were getting more expensive or more complicated, even if you didn’t directly say so. Professional ghosting happens when the ghoster can’t immediately respond because they’re missing something and scared to admit it for fear of looking unprepared or under-resourced. And then it’s too late, new emails are already pouring in and yours has lost priority.
While this trend of ghosting in work contexts isn’t new, it does seem like it’s on the rise. Both anecdotally in my work and industry-wide, more employees and companies are noticing ghosting behavior from their colleagues, bosses, and reports. How can we fix it? Let’s fire up our proton packs and figure it out. I ain’t afraid of no ghosts.
Advice for the Ghosted ☠️
Here are a few things I’ve done while being ghosted at work that have helped me bring back some dead threads.
Follow up. I know it might feel like you’re nagging someone to email twice in a row. But if you’re in a professional relationship, and you’ve been interacting with someone who’s vanished, they’d likely appreciate a friendly follow-up after a few days. I’ve resurrected more deals than I can count with one well-timed follow up. Use a CRM system or an app like Boomerang for Gmail to automate this.
Make responding easy. Bold the questions in your email and keep them as easy to respond to as possible. Discuss complex or sensitive matters by phone or video chat. Your goal should be that your email is the first one your recipient opens, because it’s got a great subject line and they know exactly what you want and how to give it to you. Use self-service calendaring tools like Calendly to avoid being ghosted in the midst of a long scheduling volley.
Track opens. This is controversial from a privacy perspective. But on crucial business communications like bills or contracts, I think it’s appropriate to have view tracking in place. If you know your client is seeing and opening your invoices, it can give you peace of mind that they’ll pay them on time. And if they don’t, you can let them know they don’t have a good excuse to be late, because you see that the invoice was opened the day after they received it. 👀
Advice for Ghosts 👻
If you ghost on the job, these tips might help you get a little better control of your inbox…and your humanity.
It’s never too late. Looking at your flagged emails you realize that your skin is turning a pearly, translucent shade of white. You see a list of nice people you’ve ghosted with accompanying timestamps, some of which are months ago at this point. Take a deep breath. It’s not too late to respond to these messages. You’ve got this. Wish them a happy new year and throw in a “sorry for the delayed response” like the professional, living, breathing adult human that you definitely still are.
Ignorance is bliss. It’s okay to say “I don’t know.” In fact, it’s liberating. If one of the reasons you’re ghosting a colleague or business partner right now is that you’re just not sure about something in their email, start there. “I’m not sure how to answer this. Do you mind if we schedule a 15-minute call on Monday and figure it out together? Here’s my availability.” Sometimes that admission of uncertainty all it takes to bring that thread back from the ether.
Set realistic expectations. If you know you’re prone to ghosting, don’t use an email client that lets you snooze emails; it makes it too easy to delay indefinitely. If your Fridays are always filled with meetings, don’t tell someone you’ll get them something by “end of week.” Your time and attention are valuable just like your correspondent’s, and as long as you let people know when you can realistically respond and (mostly) stick to it, it’ll be fine.
I wrote this blog post for myself as much as for anyone else. If you’re ever waiting for a message from me, feel free to link to this piece in your polite follow up. I swear I won’t mind. None of us are perfect at this stuff. We’re all human, even if we sometimes ghost each other.
This weekend, I spoke to the audience of the Difficult to Name reading series at Study Hall in Brooklyn. My talk was about the internet, my fears about building and sustaining culture there, and what we might be able to do about it. Watch the talk or read my prepared remarks below. And let me know what you think on
Twitter. I’m @mb there.
I want to tell you about a number that scares me: 404. That infamous code you see when that internet thing you meant to visit is gone or it moved and no one bothered to add a redirect or maybe it never existed at all.
I’m curious though: how many of you have ever made something you’re proud of on the Web?
So many of us have written, recorded, photographed, or created important works in our personal and professional worlds that live online. Maybe they’re your bylines at that fancy publication about tiny houses, or your YouTube seltzer reviews, or your graduate thesis about the history of pizza ovens. It’s not really important what they are, just that they exist and they’re online.
Well, until…they don’t. 404: Page Not found. 410: Gone. 500: Internal Server Error. These numbers, or status codes, tell us what went wrong but not really why. This problem, the problem of the disappearing internet, of “link rot”, is no joke. Researchers have found that over 50% of URLs cited in Supreme Court opinions no longer point to the intended content. Roughly 70% of links in academic legal journals are broken, and 20% of all science, technology and medicine articles suffer from link rot. The average life of a webpage hovers right around 100 days.
People often patly state that “the internet never forgets,” that once something is online, it will be forever. In a certain light that’s true. It’s nearly impossible to permanently remove something from the internet, on purpose. But, by the same token, the web also disappears at an alarming rate. 5% of the entire internet is lost every year, and we barely notice.
Making something on the web is not a one-time investment. Someone has to spend money every year on the domain, hosting, and maintenance. But what happens when the financial incentives to do that change? Right now the massive data centers that house all this information use 3% of all the electricity in the United States. What happens when that power gets too expensive? Or when we’ve been online for centuries and we start deleting dead people’s pages? Unlike a film, or a play, or a book, the costs of keeping art and science on the web are never-ending. We’re building one of our most important shared cultural resources on land that we rent rather than own, on borrowed time from a parking meter that’s all but guaranteed to run out.
We even saw a large-scale example of this recently when a capricious billionaire hastily took down years of content from Gothamist and DNAInfo, leaving reporters to scramble for saved and aggregated clippings of their work just to build a portfolio to get an new job.
We have heroic efforts like the Internet Archive to preserve stuff, but that's like burning down houses and then cheering on the fire department when it comes to save what's left inside. It's no way to run a culture. We take better care of scrap paper than we do of the early internet, because at least we look at scrap paper before we throw it away.
He’s right. It is no way to run a culture. We’re experiencing quantitative losses of data on par with the burning of Alexandria every year, and we’re barely blinking an eye as the stuff we’re making vanishes in a puff of smoke.
The truth is: there is no easy fix. But as writers and makers and inhabitants of the internet, we need to demand better of the platforms and services and publications we entrust with our work. It might seem safer to trust the big guys (Facebook, Twitter, Medium) with this content because they have the funding and incentives to maintain it. That’s true today, but large platforms like them have failed before, taking terabytes of data with them. Remember Friendster, TwitPic, Geocities?
There are academic efforts like Perma.cc out of the Harvard Library Innovation Lab that will solve this problem for the most important legal and scholarly works. But we can and must to do better than that.
Starting in 2014, a small group of programmers became obsessed with building what is called “content addressable” version of the internet called IPFS. IPFS stands for “InterPlanetary File System”. And “content addressable” means that files are stored and located by their content instead of an arbitrary and therefore brittle address. As I’m sure some of you have guessed by now, it’s built on top the blockchain. Insert eye roll emoji 🙄. But before you write them off, I think these nerds might be on to something. Their system, which is entirely peer to peer, and inherently resistant to the rot I’m talking about is already being used to build a mirrored version of Wikipedia that will be accessible from countries with oppressive regimes, and was used by those in Catalan seeking independence when the government blocked their pages from being accessible on the web. The IPFS team is building a system by which the websites and apps of tomorrow might be able to defend against this failing foundation, but who knows if it’ll get adopted.
The next time you make something and put it online: think about where it’s going to live, how long it’ll be around, and what you can do to preserve it, even if that means making an extra local backup, or printing it out on a dead tree. The culture we’re building together is increasingly digital, hyperlinked, and accessible from anywhere. But it’s not accessible from any when. We’re losing more and more of it every day. If we’re going to continue making things online, we need to deal with this problem systematically and soon. How? I’m not sure. Maybe IPFS, or something like it that hasn’t been invented yet. Until then, I’ll keep my printer.
I first saw the phrase “Code is poetry” pop up on websites and in conversations about the craft of software development in the early 2000s. Popularized by the Wordpress project, the idea that programming and poetry are similar forms has been the subject of Quora questions, as well as pieces in WIRED, Torque, and Smashing Magazine.
On its face, it is an appealing idea for a few reasons. We programmers would prefer to think of ourselves as lone artists creating clever works of art than a tribe of code monkeys or monastic scribes writing line after line of boilerplate to make a button do something. Sure, some methods might look so concise and beautiful that they remind you of a piece of modern poetry or so archaic that they sound like Old English. And yes, sometimes the variable names and symbols used in a script look sort of like E. E. Cummings if you squint.
But this idea is an example of elitist thinking in our discipline, and it misleads new programmers and the general public into believing that being a software developer requires natural talent, a spark of divine inspiration, or that the code they write should be inscrutable upon first glance. Nothing could be further from the truth.
Great code reads like great prose. It is succinct, expressive, and clear the first time you read it. It tries to be as linear as possible, guiding the reader through tough transitions with the knowledge that one wrong move could lose them entirely. Good code uses language and vocabulary with an understanding of its audience, and it aims for functions with a single main idea, like the paragraphs of a persuasive essay. Instances are narratives—they have a beginning (initialization), a middle (operation), and an end (deallocation).
Well-structured codebases feel more like newspapers or encyclopedias than poetry collections. Individual files operate in a shared universe and are often edited by multiple authors and revised as the facts change. Frequently used objects act like recurring characters: the more you see them, the more you begin to understand how they work.
Even language designers know this. Smalltalk, Swift, and other languages that don’t start with the letter “S” have made English prose the basis of their syntax design. Individual lines of code are called statements, the same word we use in English for the most common type of sentence.
Unlike poetry, computer code does not try to express emotion or evoke meaning through rhythm and rhyme. It aims to tell a story to two audiences: the machines that run it and the people who maintain it. It both narrates and defines how the product it powers works. As Eric Suh points out in Writing code and prose:
Those that I see write the cleanest, most maintainable code are those who write prose well, whether in documentation, in emails, or in their everyday lives.
Many aphorisms about writing style translate fairly well to coding.
So, the next time you write a piece of code and revel in its austere beauty or multi-layered meaning, think about whether it might be better suited as straightforward prose. And while you’re at it, write some actual prose in the form of documentation. Save the poetics for poetry.
You’ve been there. You’re sitting in a meeting and your boss, a product manager, or an executive is talking about Q2 goals. They’re laying out a roadmap of the features that are going to be “coming down the pike”. All of a sudden you see it. An innocuous bullet that makes your blood boil: “Auto-invite friends”, “Re-engagement notifications”, or “Disable ATS”.
The particular feature isn’t important. What matters is that you’re the engineer that’s noticed this capital-B Bad Idea. You know why it’s a problem. This time it’s not just the technical debt or the time it’d take to implement. This idea is bad because it trades a worse product for a better “business”: revenue, eyeballs, impressions, you know the drill.
You have a choice in this moment. You can stay quiet and hope it goes away or point it out, question it, and even argue against it. But so often, engineers fold. They ignore their conscience and their gut in the interest of a steady paycheck and an easier work day. Avoid conflict at all costs, especially when that cost could be their job. “Just keep your head down and do what you’re told”, they think, while they twiddle their thumbs as bad product decisions whoosh by. Sure, they complain about it over drinks with coworkers and in one-on-ones, but they don’t say anything when it counts.
We’re better than this. As software engineers and designers, we’re in the room when decisions are shaped, and the only ones who have the power to actually execute them. It’s our responsibility not to forsake the people who trust the apps we make with our silence. To stand up and refuse to implement unethical systems and dark patterns. And even more, to educate stakeholders on the real human costs of their business decisions: the time, attention, money, and trust of their customers.
It’s harder, yes, and riskier. But they can’t build it without us. We get a say. Even if it’s not in that meeting, we can think about the goals they’re trying to accomplish and propose alternatives. We don’t have to hide in our sit-stand nap pods and eye-roll while we engineer a worse world. We can do more than write code. We can research and present better alternatives. We can write memos and make slide decks to convince them of our position. We can be activist engineers.
Even though these bad ideas may buttress the metric-of-the-week, they’re at the direct expense of consumer trust and customer satisfaction. They’re a tax on our company’s reputation. We have to push the people making the decisions to measure more than just the number they’re trying to increase. Look at reviews, net promoter score, social media mentions, and team morale. All of these trends matter to the long-term health of the company, and should be treated as such.
This requires long-term thinking and the kind of organization that’s receptive to it. In many companies, quantifiable short term gains are valued more than long-term, qualitative investment. The best companies resist this temptation to make a quick buck and build upon a lasting mission and principles. But even in companies with lofty vision statements, things can go awry. A bad quarter can send the company’s hard-won principles out the window to make room for the growth hackers.
In other disciplines, engineers wear an iron ring to remind them of their commitment to their profession. Though we may not be part of the Order of the Engineer, we can learn a lot from their obligation:
As an engineer, I shall participate in none but honest enterprises. When needed, my skill and knowledge shall be given without reservation for the public good. In the performance of duty, and in fidelity to my profession, I shall give the utmost.
Of course, not every idea you dislike is a bad one, so spend your reputation thoughtfully but forcefully. Make your dissent count, but don’t be a jerk.
Our job as software engineers is to build things that make the world (or a corner of it) better, things that solve problems. But that’s not our only job. It’s also to be gatekeepers: to prevent ideas that we know are harmful from being realized. What’s the worst that could happen: we get a reputation for giving a damn?
You’ve been there. A 10,000 line pull request lands in your email and you don’t even know where to begin. No description provided.
Should you start by installing it, running the test suite, or should you just start scrolling though while your eyes glaze over from the red and green stripes? Is this developer really looking for feedback or are they on a deadline and pressuring you to say “lgtm”. Will your one innocuous comment ignite a flame war?
Code review, or more generally peer review, has a long record of finding defects in not just software engineering, but in science, academia, and many other industries. While some argue about the specific percentages of issues that it finds compared to an automated test suite, or others method of testing, code review is an incredibly useful tool in any software teams arsenal against bugs and poor software architecture. But only if it remains a sharp one. Laziness can creep into code review very easily if you’re not careful.
Jason Brennan has written two great pieces on the topic of diligently writing and reviewing pull requests, and I’ve used his series as an inspiration for my own system. I’ve also found it’s handy to have a short-form checklist to go over when performing code reviews to remind myself what I’m going for. Maybe it’ll help you and your team too.
For the engineer drafting the pull request
Provide a screenshot, GIF, or video of the change if possible. People like pictures.
Explain what changed and why.
List step-by-step how to test the changes.
Link to any relevant task(s) or ticket(s) in the bug tracker.
Link to any existing documentation that could make the change easier to understand for the reviewer.
Mark any areas that are work in progress or require follow up.
Note anything that is waiting on other departments or team members.
Call out any legal, security, or privacy concerns.
If any third-party dependencies have been added, explain what they are and why you chose them.
Double check that the code is styled, documented, and tested to your team’s standards.
Mention people who would be interested in the changeset:
Engineer(s) who wrote the old version
Designer(s)
Product manager (if they’re interested)
Give the diff one final pass yourself before asking others to take a look. You might catch a few silly things like typos in comments.
Annotate particularly tricky sections in the diff to make what’s going on even clearer. Maybe even turn these into code comments.
Get a coffee and wait for the constructive criticism to roll in.
For the reviewer
I find it’s helpful to do these in order if you can.
Most importantly, remember that the engineer on the other side of the screen is a person. Try not to be curt or hurtful in your comments.
The Pull Request
Start here to build an understanding of what you’re about to be diving into.
Let your teammate know that you’re reviewing their work however’s customary: a comment, a message, making yourself the assignee.
Read over the pull request description and any linked documents to understand the nature of the changes.
Ask questions about anything you don’t understand or if there isn’t enough detail to properly review.
The Product
Does it work as you’d expect? You can write lots of pretty code that doesn’t work.
Confirm that the changes are fully accessible to customers with disabilities.
The Code
Alright, it’s time to start looking at the code, line by line.
Deleted code
If code was deleted, was its functionality adequately replaced or is what it provided no longer required?
Added code
Does the new code introduced conform to the teams’s standards for style, documentation, and testing?
Does new code make sense when read? Is anything too clever or inexplicable?
Is new code safe?
Does it have the potential to crash or hang?
Are there any obvious race conditions or concurrency concerns?
Is new code fast?
If not, can you suggest optimizations?
Is it well-designed and well-factored?
If not, try to propose alternative solutions or schedule a time to whiteboard with the engineer.
Is it well-named?
Are the names of types and functions obvious and unambiguous?
Modified code
Do you understand why the modifications were made?
Do the modifications improve the factoring, design, or performance of the software?
Do the modifications change any of the fundamental assumptions that the original code made?
Dependencies
Make sure to understand the implications of new dependencies on third-party code, including their licenses.
Assets and Resources
Do all assets and resources exist in all the right formats and sizes?
Are they finalized and ready to go into production?
Configuration changes
Do you understand the effects of these changes and how they can be rolled back?
Adding a system like this to my own pull request reviews has helped me catch a lot more, but I’m sure there are still things I’m missing. If you have ideas about how this checklist can be improved, pull requests are welcome!
A few years ago I was tasked with helping to recruit interns for The New York Times iOS team1. I traveled around to top-tier engineering programs at universities all over the northeast talking about the Times’s engineering culture and to students about what they wanted to be when they grew up.
One of these interviews stuck with me. I asked a junior what he saw himself doing in five years, and I’ll never forget what he said.
“I want to be the idea guy at a startup”.
I wish I could have stopped the interview right then and there. I wanted to tell this guy that there is no Santa Claus, that the Easter Bunny isn’t the one hiding the eggs, and that no such role exists or ever will.
Some nights I wonder where that guy is. I’m scared to look through my notes and check up on him, but I sincerely hope that he’s found some way to bring his ideas into the world — something to do or to make.
I wish we hadn’t separated those two concepts in English. ‘Faciō’, one of my favorite Latin verbs, encapsulates both concepts in a beautiful way. Anyway, back to doing. The ideas will come.
By the way, they’re still hiring. If you want to work there, or at Tumblr for that matter, email me. ↩
Inside The New York Times Building next week, it’s going to get harder to do your job. Clifford Levy, a Pulitzer prize winning journalist, and former coworker tweeted that the way to get this company thinking mobile first, is to block the website. Wait, what?
Just like Cliff and the others, I believe very strongly that if The Times is to survive, it needs to think about its apps and mobile website a hell of a lot more than www.nytimes.com, or “triple dub” as it’s known inside the company. But is blocking the site for its own employees really the right way to do that?
It feels like a punishment. Your dad is turning off the TV and making you eat your vegetables. This kind of paternalistic attitude is not what will spur the brilliant engineers and journalists at the Times to improve their pocket-sized offerings and consider the report from a mobile angle.
So what’s a better way to get a company as large and old as The New York Times to care more deeply about its report on phones, tablets, and watches? There’s no magic bullet, but in my years there I saw incredible ideas, people, and talent wasted on a website with declining traffic while the iOS app suffered a lack of attention from the newsroom. I saw initiative after initiative to make mobile more important flounder while many of the reporters still aimed to be on the front page of a gray piece of paper.
It may be that the way to make sure that employees of the Times care more about mobile is to point out when these failures happen, to be critical of the web first mindset, and to remind people every time they try to perfect a web layout, that they’re doing so for a rapidly declining number of readers. Along with that, the Grey Lady should be celebrating the teams and people who are getting this right, without putting people who still rely on the website in time out.
The newsroom brass at the Times are trying to solve a social problem with a technical solution and I can’t imagine anyone there that’s too happy about it. It feels robotic, oppressive, and downright annoying. Honest conversation and critique of the attitudes and norms of a century old organization will almost certainly be received better than playing with the valve of information flow inside the Times. I hope they reconsider.
A year ago, I sat in a glass-walled conference room at The New York Times in a routine meeting. I listened as a business-schooled product manager spoke about yet another monetization strategy when he broke character and whispered, “now is the time to lower the gates”. He was referring to The Times’s crackdown on website users who read articles for free by googling headlines, installing NYT Clean, and clearing their cookies. Now, that defensive mindset is creeping into The Times’s mobile products.
Late last month, The New York Times quietly slashed the number of free articles in its mobile applications from 3 per day to 10 per month. It’s not hard math, each reader can access 80 fewer articles this month than they could have last month, a decrease of 89%.
While great free apps like Circa, Yahoo News Digest.1, and now Paper from Facebook, fight to take over mobile news, The Times scrambles to persuade mobile users to pay top dollar for its coverage by limiting what they get for free.
Since The Times’s mobile products are partially supported by advertising, it’s counterintuitive to drive down the number of ad impressions by cutting off enthusiastic users just as they’re getting excited about the content. Ten articles per month just aren’t enough to justify keeping the apps installed; it’s almost insulting. The proof is in the plummeting App Store ratings as well as in the company’s usage statistics, which I suspect show readers returning less frequently since the change.
From the outside, it looks as if the company is desperate to drive up subscription numbers on its confusing digital subscription packages, which are still more expensive than having the newspaper dropped on your doorstep every weekend. But I think there may be something deeper going on.
The Times plans to roll out even more digital packages this year, and people I’ve spoken to at the company are starting to worry that few will want them. Why not make its current offerings less appealing in the short term, so that they can save the day with their newer, better apps in a few months? If this is what NYT is doing, it’s downright irresponsible and counter to The Times’s commitment to integrity. There’s no integrity in misleading readers.
I asked Times spokesperson Linda Zebian about the changes and she defended the move, writing, “We continue to believe that our strategy of balancing free and accessible content with revenue from paid usages is the right one.” When asked whether the company was attempting to make the mobile applications behave identically to the website she added, “The intention is to align the meter experience on mobile apps with the website and our mobile website…”. I got no real answers to the questions of whether this change is expected to decrease advertising revenue or intended to bolster the planned new digital products.
When I raised this issue on Twitter, Jordan Kay asked me what I would do differently if I were in charge of The Times’s digital subscription strategy. If The Times wants to be the place that most Americans read their news, then it must adopt a freemium model that’s much freer than this in order to compete.
But I don’t think that’s what The Times is or should be. It’s a premium news source, and it would be much better to make that clear from the start. Everyone knows how good the journalism is. Charge for it up front with an optional free trial. As it stands, the meter devalues both the product and the brand, and any new products the Times plans to add later this year run the same risk — creating confusion and muddling the message.
The Times’s new mobile strategy forces casual readers to look for other options, and there are many out there. I hope The Grey Lady will realize her mistake and change course quickly, but knowing how things work inside an organization founded over a century ago, I’m not holding my breath. By dropping the pay gates on mobile users, the Times is ensuring its irrelevance in an increasingly mobile world.
Criticism may not be agreeable, but it is necessary. It fulfills the same function as pain in the human body. It calls attention to an unhealthy state of things.
Last week, I wrote a short blog post on my Tumblr commenting on the news that my former employer had released a new web application and critiquing the product strategy, calling it “pointless”. Apparently this struck a chord because minutes after I had shared my brief thoughts about the new Today’s Paper web app, I started receiving tweets, direct messages, and emails from former colleagues, friends, and followers. From what I’ve heard, it’s also generated several internal emails and conversations. Many of the messages I received raised the same question: why would I write this post?
The answer is simple: I care a lot. Software needs to be criticized to get better. 90% of it is crap, and very few people are willing to explain why. My blog is a place where I can express my opinion, and I have a strong opinion about this “new” product. I share my thoughts with the hope that they’ll make people think and encourage discussion, which is exactly what happened.
There are several arguments that people made about why I shouldn’t have written the post. These deserve to be addressed one by one:
Yes, I did. I don’t any more and lack of a sane product strategy is one of the reasons why. A lot of the most amazing things we learn about how companies work are from people that used to work at them. Books like Hatching Twitter, articles from former Apple employees, and a lot of the best answers on Quora wouldn’t be possible without ex-employees speaking up. Learning requires opening up.
The people that worked inside an organization are the ones that can explain and critique it with the most insight. They also tend to be more emotionally invested in the company’s success. I plan to continue criticizing (and praising) the organizations I’ve worked for, and I hope others do the same.
Why You Gotta be So Mean?
Whenever someone accuses me of being mean, I stop to consider to whom I’m being mean. In this case, there are two groups of people I mentioned in the post.
The creators of the web app (designers, developers, editors, and product managers)
The (potential) users of the web app
The only thing I say about the creators of the web app is that they are “truly great” at what they do and that their time should not have been wasted on something so silly. Doesn’t sound mean to me.
Can people’s feelings get hurt when something they work on is criticized? Absolutely, but that’s no fault of the critic. We don’t worry about Guy Fieri’s feelings before giving his restaurant a scathing review in The Times, and we shouldn’t be afraid to criticize software for this reason either.
Was I mean to the users? Well, I did say that many of them will likely die soon, but only as a way to cheekily explain the demographics demanding this product. Not mean, exactly, but a little heavy handed and likely unnecessary.
I’ve been criticized for lacking empathy towards members of this generation of people that are uncomfortable with The Times’s current offerings and prefer the simplicity of print. To the contrary, I think that generation is right. Many of the Times’s current products, especially the website, are confusing, outdated, and just plain hard to use. However, the solution is not to make yet another product. It’s to make the existing products great for everyone, just like Google and the iPhone are great for everyone. Good design is universal. No dumbing down necessary.
What’s Wrong With Skeuomorphism?
Nothing, except that’s not what this product is. It’s not just using skeuomorphic techniques to improve NYTimes.com, it’s literally another way to view the exact same content on the exact same platform. By my count there are at least 13 ways to read the Times: Paper, iOS, Android, Kindle Fire, Kindle, BlackBerry, Windows Phone, Web, Mobile Web, Replica, Times Skimmer, Time Wire, and now Today’s Paper. We don’t need more ways to read the same content that better imitate the past. We need the existing applications and websites to be much much better and focused on the future of news consumption.
The Team Had Fun
It’s fine for a couple of people to make a terrible product for fun or to learn, especially because it’s difficult to know if something will be good before it exists. But for a company that’s as large and well respected as the Times, it’s embarrassing to use the team’s enjoyment as a reason to release a product to the public. Plenty of products have been killed before release at The New York Times and this should have been one of them.
People Asked for It
Of course they did, but just because people ask for something doesn’t mean we should build it. Often, the way users phrase questions and requests is very direct: “You should do this”, but they really want us to do the thinking for them. No one asked for an iPhone before the iPhone was released, and yet hundreds of millions of people of all skill levels use and love these devices every single day.
It’s our skill and responsibility as creators and experts to understand and synthesize user feedback into great products, and not slavishly do what our users say, producing one more pointless product after another.
It’ll Make Readers Happy
Today’s Paper may very well make readers happy just like plenty of people are still happy with their dumbphones. That doesn’t make those phones good products. If the Times believes that Today’s Paper is really the right way to look at Times content, it should be the way the website and the native applications work, not a side effort that’s only available to subscribers and doesn’t even work on smartphones. This is simply a product that placates a vocal minority. These are the people that would still be asking for a faster horse years after the Model T was released. They will only drag the company and its products down.
John Gruber at Daring Fireball called Today’s Paper “utterly uncluttered”. He’s right but misses the larger economic point. This isn’t a sustainable way for the Times to publish content, even for only subscribers. It has no ads which means that if the website operated this way, the entire thing would be a money-losing operation. Gruber is presumably comparing it to the clutter of the NYTimes.com website, but guess what most of that clutter is: ads.
It’s Just an Experiment
This product is not an experiment. Experimentation is something you can do internally, via user testing, in private betas, or on whiteboards. Experiments don’t have revenue goals, and usually don’t require full-time engineers working for months. Experiments don’t have splashy launches and email campaigns to hundreds of thousands of users. Would I have criticized this publicly if it was just an experiment? Absolutely not.
“That sucks” is negativity. “That sucks, here’s why, and here’s how to fix it” is criticism, and it comes from a place of love. That’s the difference.
In media like film, theater, television, and music, quality criticism is something that’s expected and encouraged. People looks to critics to tell them what’s good, what’s terrible, and why. In software, this same culture has failed to develop. Sure, there are review websites, but the main question they ask of software is: “does it work?” and not “should it exist?”.
We live in an environment where companies and individuals are constantly releasing new products, and the signal to noise ratio is incredibly low. We need to collectively grow a pair and become comfortable criticizing each other’s work. We need fewer products that are higher quality.
In order to produce better products, we must be willing to critique openly and honestly. We must accept that we will all fail. It’s not personal.
Whenever I go to tech conferences or meetups, I almost always end up traveling with either Brian or Andrew from Lickability.
Let’s face it, I’m a nerd, and it can be a little awkward for me to walk up to a brand new group of people at a conference or a party and introduce myself. Will they like me? Am I smart enough? Are they going to eat me?
Brian and I ended up using a really simple system at WWDC 2011 that we’ve continued using to this day which makes this process fun instead of anxiety-inducing. It’s a game called “You’re Up”.
The Rules
Join a team of 2-3 people.
Pick one of you to be “up”.
If you’re up, you must introduce yourself to someone new and bring your teammates along.
Have a conversation with your new acquaintances.
Alternate who’s up.
Instead of milling around and staring at the furniture or talking to the people that you already know, it’s good to push yourself outside your comfort zone. This simple game has led to dozens of interactions and friendships with people that I still talk to regularly, and I’ve enjoyed going to industry events much more with this in my back pocket.
There are no points in this game for a reason. You don’t play it to win. The reward is in having engaging conversations with interesting people. This is just a little hack to make the hard part of socializing easier and more fun.
Just remember: most people want to meet you as much as you want to meet them, especially in social situations like this. No one would prefer to stand there and stare at their phone when there are tons of fascinating people around.