6 Mar 2016 c.e.
A Case for Extravagance

tl;dr: Learning the art of extravagance has made me better at my job (programmer) in delightful & surprising ways.

It's rare to hear software developers talk about how indulgent the system that they work on is. Conversations about optimization and efficiency, and reducing 'technical debt' -- take a glance at any recent software conference topics and I guarantee you'll find at least one talk covering these topics. Common discourse in software has a lot to say about how systems should be built, how to make them run faster, how to write better tests, etc. Talking about building 'extravagant' systems, or systems that are pleasant to use, although often the subtext, is rarely addressed outright.

What do I mean by software being 'extravagant'? My use of the term is probably similar to what most would consider a well-built system. It's a project that has both a staging and a production environment. It's got buttons to easily replicate data between them. It makes it simple to verify your changes. Maybe it's a library that takes very little mental overhead to figure out how to use and put into use. Chances are, you've encountered software that fits some or all of this criteria. Extravagant software is often deceptively simple. It's the kind of software that is intuitive, yet powerful, software that really takes to heart the idea of being a 'tool'.

What is it about these libraries or projects that makes them easy to use? That makes them delightful? How do these delightful, extravangant systems come into being?

I find it helpful to consider 'extravagant' as a foil to 'flintiness'. Flintiness is the kind of ruthless frugality that airlines indulge in by making you pay for peanuts, carry-on baggage, and breathing room. Extravagance is what becomes possible when you're freed from the worry about cost for cost's sake. Bistros in Europe that give you a sugar cookie with your espresso are extravagant. Getting a warm towel after your sushi meal -- that's extravagant.

For me, learning how to write systems extravagantly took some deliberate mental retooling. I am not an extravagant person by nature, in fact I would say that I was raised to value and admire efficiency and flintiness. I grew up in a frugal home. We were comfortably well-off financially, but astringently frugal in mindset, the kind of frugality that dictates no television on weekdays and prefers boneless skinless chicken for both its convenience and relative affordability, say nothing of its taste.

About a year ago, I made a resolution to shed my frugality, and fully learn how to be extravagant, to master the art of spending lavishly. The motivation for the experiment was curiosity -- what was the sum of all my heart's consumer wants? How far outside of my means could my desires possibly go? Can money buy me more happiness than I have right now? Instead of thinking in terms of cost, would it be possible to teach myself to think in terms of payoff?[1]

Extravagance, I discovered, is more than the money you spend. It's what that money enables that is the true power of cash.

I learned that to be optimally extravagant, you have to think ahead. You need foresight into what you'll need tomorrow in order to know what to spend your money on now. A trip to the spa is a great idea, but what's the use of getting that terry cloth bathrobe and fluffy slippers if they won't arrive until a week after your trip?[2]

Let's say that you're planning a 10 day backpacking trip. You've never been camping before and your budget is limitless. What do you buy? Well, you'll need a sleeping bag. But which one to pick? You can't very well buy all of them. One way to pick a bag would be to walk into the nearest sporting goods store and buy the most expensive sleeping bag that they have. This assumes that there's some rough parity between price and usefulness; buying the most expensive bag isn't guaranteed to be the best one. You could ask for assistance and buy the bag that the sales representative recommends. Would the recommended bag be the best for a 10 day hike in the mountains? It's very probable, but you're relying on the sales rep's judgement until you're actually able to try it out on the trail. Ten miles down the trail will be too late to make any corrections if it isn't actually the best bag. And remember, we're being extravagant here. I don't want just any bag. I want the absolute best bag that money can buy.

So: what makes a bag the best bag? In order to define "best", we need a broader understanding of the actual problems that a sleeping bag solves. These can also be framed as problems I might encounter while on the 10 day hike. What's the coldest weather I'll need it for? How much does the bag weigh? Can it get wet? If it gets wet, how long will it take to dry? How much space in my backpack will the bag take up? Is it long enough for me? Can I roll over in it without dislocating my pyjama bottoms midroll?

As this task of finding a sleeping bag illustrates, although my experiment started with the intention of just spending a lot of money, it quickly became less about the actual dollar value of the money that I was spending, and more about having a clear understanding of what I trying to accomplish, or what potential problems or inconveniences I might encounter, and doing everything I could to counteract them, pre-emptively.

Can you see where I'm going with this? How this kind of questioning and approach to time and money, a goals oriented approach, is applicable to building software that is not only extravagantly pleasant to use, but also to extend and work with? Systems that are pleasant to push code to, that are built with a strong idea of their purpose in mind. Extravagantly pleasant systems, that are simple and clear and explicit, because you took the time up front to consider what was necessary out of the program, and what the best solution looks like as a finished, or near finished product.

I've been spending money extravagantly now for a little over a year now. I have not gone into debt, in fact I definitely have more money than when I started (a year of working will help do that). A few of my habits have changed: I buy books compulsively now. A book with a good review in the New Yorker is usually on it's way to my apartment within 10 minutes of my hearing about it (thanks Amazon Prime). I'm getting help from some private coaches for a side hobby that's important to me. I take the time to eat at the fancy restaurants in airports, the ones with nice chairs and china. The food costs about the same as the options in the food court, and the choices are often incomparably superior. When I really want to go over the top, I give myself more than enough time to get somewhere, because true extravagance is 10 minutes of reading, free from worry about train delays.

Above just life habits, I write software differently now, too. The biggest change has been that I am unafraid to consider what I want the end product to be (the API interface, the flow of navigation thru an app, how the system should recover from errors, what an always on screen should do if it can't, for some reason, reach our servers.) Schedule, cost, scope: all of these are things that can be shaped or bent to accomodate the goal of building good product. In practice, I've found that the details do take time, but much less than you think they will. Like with the sleeping bag, the key is knowing what problems you're solving. If you're focused on what the cost is, in terms of schedule or just hours in the day, I guarantee that you're missing out an opportunity to give yourself or your co-workers, or your fellow project maintainers something delightful and extravagantly well-designed.

[1] My disposable income in a calendar year, after taxes and retirement savings etc, is under $50K.

[2] Or maybe you called ahead and found out that they supply slippers and bathrobes, which renders your purchase moot. The point is that you had to think ahead.

#software #life-experiments