Software Personality

blog.fetchnotes.com

fetchnotes:

Last semester, Chase and I took a business communication class in which we dissected the PR crisis that resulted from someone trashing an Airbnb user’s home. At the time, it seemed very abstract and unlikely — crises never happen to those who prepare! Well, one just happened to us.

There’s an important lesson here. Don’t be too afraid to show a little personality in your products. Let your team’s humanity show. Keep the character in mind, and be true to it.

Think, “If this product were a person, what kind of person it be like? How would it dress? What would it feel? What would it say to you when you’re having a bad day, or when you come to it with good news that you’re excited to tell?”

In developing npm, this has always been chief in my thoughts. Very early on, I started imagining npm as a friendly helper and developer cheering-section. It just wants you to succeed so much. It loves your program like a parent, and is proud of the day when it can get all its dependencies taken care of, and leave your warm embrace to go out into the harsh world of deployment. It wants to know you’re prepared, that you’ve run all your tests. It will help you find friends and allies, try to warn you which ones to steer clear of. This can be a little smothering at times, but when your program is out there in the wild, maybe you’ll require() a little something, and there it’ll be, because of how much npm cared for it, and it’ll think warmly of the place it grew up, back in the $HOME directory on your laptop.

This mental image is what inspired the “npm loves you” meme. (It’s right in the faq.)

On the other hand, Node.js has a slightly different personality. It doesn’t shield you from harsh realities. It’ll go with you out into the wild, and handle all the incoming requests with you. It’ll be by your side through thick and thin, and follow your commands to the bitter end. It won’t go out of its way to be a jerk, but if there’s ever a choice between being fast and being nice, you know what it’s going to pick. If something needs to break between versions, well, then that’s what has to happen. It knows you’re going to be able to deal with it.

This, in my opinion, is the chief conceptual difference between a “platform” and a “tool”. Of course, to some extent, every platform is a tool for interacting with the system, but you really want a different personality from your platform than you do from a tool. A tool gets you there, and then is left behind; a platform is a part of the show from start to finish.

Bryan Cantrill has mentioned to me that every software project carries the esthetic of its creator. I think there’s a lot of truth to this. But, just as children don’t necessarily grow up into copies of their parents, software’s personality doesn’t necessarily match the personality of its creator. In many ways, Ryan is much nicer than I am, but npm is certainly more friendly than Node.

This phenomenon is uniquely challenging for companies that want to appear “grown up” and be taken seriously. The line between “grown up” and “robotic” is so subtle. Certainly, cursing at your users in a test message is a very risky way to breathe life into a product, but nevertheless, I find myself unsurprised by the reaction to the fetchnotes flub.