For the second week in a row, I'm tackling reader question Monday a little late. This time, my excuse involves the mini-move my wife and I made over the weekend that I originally mentioned on Friday. So traveling, unpacking, and all that. But, better late than never. Today, I'll talk about how to get work done.
Here's a reader question that I received a while back.
I enjoyed your article on 10x developers. Environment is very much a large part of the equation. My current question is: What is the ideal way to increase one's software efficacy? To increase their doneness?
A little context is that I'm feeling the need to become more "effective." In the words of Steve Yegge of the "done, and get things smart " dichotomy, I'm comfortable getting things smart. I like cleaning up code and making systems more readable, leaving documentation, and removing hurdles for the team. But it takes me a long time to do so.
I'm at a startup venture right now and will be here for a year or two longer. After that I'd like to take a month off, then spend 3-6 months (or maybe longer if the solution requires it) focusing on 'closing the loop,' getting more stuff done, being a better programmer.
Some possible options I'm considering:
- Finding a new job with this as primary motivating factor.
- Apprenticeship at 8th light or similar.
- Grad school.
- Some dev bootcamp.
- Self direction + contracting.
- Finding mentorship here.
I would love to get your thoughts, if you wanted to increase your general ability to get things done, how would you do it? Where does one learn to get things done?
Clarifying "Get Work Done"
First of all, let's do a bit of clarification. In his blog post, Steve Yegge riffs on Joel Spolsky's "smart and gets things done" theme. Steve's take on "get things smart" refers to burrowing into existing systems and improving them - making them smarter.
So the reader question here is envisioning a spectrum of sorts between "done" and "smart." When forced to choose, someone on the "done" spectrum would opt for quick and dirty. On the other hand, the "smart" folks would perhaps push the deadline in favor of having uncompromising standards.
You could interpret this question as "how do I stop perfecting and start shipping?" But I think it's more than that. It's a question of, once you've figured out how to "get things smart," how do you get them done more efficiently and know where to make trade-offs?
So let's take a look at that. What are some strategies to deliver more stuff?
Let's start with something of a project management concern. You should set WIP limits for yourself. WIP stands for "work in progress," and this approach borrows from Kanban and the Lean movement.
Picture a Trello board. On this board, you have three columns:
A WIP limit means that you place a hard ceiling on the number of cards in "Doing." When you hit that limit and you want to start something new, you must first finish something that you're doing.
The WIP limit approach can seem overly simplistic. But it's easy to lose sight of how much you're taking on when you don't pay a ton of attention. WIP limits force you to complete (or abandon) things.
Of course, you'll have to define a granularity that makes sense for you. I'm not saying that you can't have a side hustle going while also doing laundry, reading a book, and having a snack. When it comes to software, give yourself a relatively low WIP limit with projects. This forces you to stop tinkering and ship if you want to do something new.
Prefer External Valuations
Generally speaking, WIP limits force you to concentrate more on fewer things. This puts your inherent love of new ideas and projects at odds with your perfectionism. You then hope that love of new ideas wins.
Let's look at another strategy for busting perfectionism: external and objective valuations. To understand what I mean, let's look at two different ways to call a project done. You've decided to start a blog and you want to make sure it looks good. You can:
- Work on theme/styling until you decide that you're happy with it.
- Work on the theme/styling until 3 out of 5 people you ask tell you that it looks good.
The first approach invites you to work forever, indulging perfectionism as long as you want. The second approach, on the other hand, gives you a clear exit criterion. For those who have perfectionist tendencies, this can really snap you out of endless iteration.
When you start on something, sit down and establish an external, objective goal that seems reasonable.
If you work for an employer and that employer gives you a deadline, you'll probably ship something. The consequences force your hand.
But what about when you're working on a never-truly-complete internal thing? Or some side project? In this situation, nothing forces your hand (unless you've already taken my advice and brainstormed an external valuation).
A commitment device is a way in which you force your own hand. Promise the software to someone. Write a blog post publicly announcing that you're going to have it by a certain date. In short, do something that forces your hand. This also serves to get you out of endless fiddling mode and focused on deliverables.
On a related note, you can always engage in some strategic procrastination. There is an adage known as Parkinson's Law that I have always found to be true.
Work expands so as to fill the time available for its completion.
Let's go back to the case of you starting a blog. If I give you an hour to accomplish this, you'll probably go to some hosted site like Blogger or WordPress, pick some default theme, and come back with 10 minutes to spare. But if I give you a week, you'll probably shop around for hosting, weight the merits of a static site generator, do a bunch of research, spend hours picking out a theme, etc. You'll spend a week on it.
Understand this property of human nature and use it to your advantage. Procrastinate.
Well, I don't actually mean to procrastinate in the "wait until the 11th-hour" sense. Rather, I suggest hard time boxes on your activities. Give yourself an hour instead of a week. Work on something a little ahead of heading out for the day. Or set aside time to start on your blog in the hour before family comes over. Use Parkinson's Law to compress your available time window.
Understand That You Can Always Improve Later
The last bit of advice that I'll offer is perhaps both more philosophical than the others and also simpler. It's understanding that the universe requires you to perfect absolutely nothing right now.
Use some of the techniques that I've outlined here. Timebox yourself, impose WIP limits, etc. That'll trigger you to get a prototype or gen 1 thing out the door without turning it into some kind of Rembrandt-esque piece of code. That means that you'll ship more things in life and get more done. But it can also create a feeling of bleakness, especially in those of us with a penchant for perfectionism. Trust me, I empathize.
And that's why I close with this piece of advice. Meet your commitment and move it out of the WIP column so that you gain a reputation for delivering things. But do so knowing that you can always add another card to your TODO column to come back and improve it. Doing this allows you to make steady progress but without feeling like you've sold out or done anything with half-measures. Even if it's half done in your mind, that's because you've only done half of what you want to - not because you've lowered your standards by 50% and declared victory.
You're never going to build the perfect thing. But don't let that stop you from taking pride in building something and then in the knowledge that you can always improve as you go.