Bizzzy

These days I’m working on three different software startups: CampusPerks, where I act as CTO; 5 Blocks Out, which I co-own with my lovely wife Katrin; and a third still-under-wraps project that Katrin and I are noodling on with two other friends. We’re also the proud owner (property?) of a charming and incredibly energetic 3-year old daughter.

When someone asks what I do, I explain this. Inevitably the response is a long, blank stare, followed by one of:
- Are you out of your f’ing mind?
- Why are you doing this to yourself?
- How do you handle working on three entirely different startups?

Assume for the moment that I have good reasons for doing this, and that I may or may not be insane. Let’s talk about “how you do it”.

First of all, I try to choose very carefully what to work on. I want to work only on things I am passionate about. I like to build things I can honestly be proud of. And I aim to surround myself with people I really like and respect. After all, life is short… all else held equal, why would you work on a project you don’t really like, or produce something that customers/consumers don’t really like, or work with bozos? You’d have to pay me an immense amount of money to do that.

I’ve been fortunate to find coworkers who are willing to work with me in this way. More on that later.

I’ve been fortunate also to find projects with synergy. These are all software-based projects. My role is similar on each one: I own definition and delivery of the product, meaning the product plan and everything it takes to get it designed, built, and operating. I’m using many of the same technologies on each project, so that switching from one project to the next costs me very little time. I use many of the same processes and tools (git, Pivotal Tracker, et. al.) And most of the things I learn on one project apply well to the others.

I structure my time carefully. My weekdays generally look like this: up by 7:00; breakfast; chase 3-year old around until she is dressed; commute; daycare dropoff, some days; daytime work hours; read news during lunch; daycare pickup, some days; dinner / family time / playtime; bathtime; bedtime stories; and usually some 9pm to midnight work. Notably missing from this routine: exercise; sufficient family time; sufficient free time to think; margin for error. (Hint: you should not do what I am doing.)

Mondays through Thursdays are CampusPerks days. Fridays through Sundays I reserve for my other two projects. Urgent stuff like service outages interrupt my routine, but this is rare… all of these web sites rarely go down because I write bug-free code. (Little programmer joke there.) Firewalling projects from each other in this way is vital; without this approach I would be too mentally fragmented, and unable to reach a state of flow on any one project.

I also try to be draconian with my time, by which I mean things like being frugal with commitments, saying “no” to most new opportunities and requests (thus avoiding death by a thousand cuts), and avoiding distractions that fritter away time (cable TV, I do not miss you, not even one little bit). That said, I wish I had more time. I miss saying, “yes”. When you have a child, especially, you desperately crave more time to say “yes”.

I try to chunk work into small batches: my tasks take a few hours or at most one day, instead of days or weeks. There are so many reasons to do this, but three biggies are that you get more flexibility in choosing what to do next, you learn quickly whether you’re doing something well, and you get frequent satisfaction from finishing something. “Small batches” is something I’ve only recently learnt about, and now I’m trying hard to double down on it. I’d like to write more about it a different day.

I separate my workspaces too. Two different office spaces, three different web browsers, three different gmail accounts (one for each project), and so on. One computer, though. Many backups.

There’s lots to improve in all this, of course, but… it’s working. I’m making forward progress, a little each day. And managing to have fun while doing it.

What’s hard:
- Saying no
- Remembering passwords
- Remembering which services/accounts to use for each project
- Staying focused on doing the right thing next
- Keeping energy levels up and consistent
- Being entirely present on the task at hand (see: energy)
- Having the patience to be a good parent, coworker, etc. (see: energy)
- Exercising
- Carving out time for play (I try to remember: having the time and means to play is one of the reasons I do all these other things!)

Busy. Fun. Busy. Fun. Busyfun.

Startup Fever

It’s time for a new chapter.

I’ve been a terribly inconsistent writer on MyOwnPirateRadio over the years. I’ve written sporadically. I’ve written snotty rants, mind-numbing trivia, and esoteric technology crib notes. I’ve written about completely random and unrelated topics. In short, I’ve written so poorly that only my most patient, masochistic, and excitement-starved readers are still around. (Hi, mom! Oh, wait, she doesn’t have an internet connection.) So, dear reader(s), I’m sorry. I apologize. I’ve been a shit.

But I do want to write — it makes me happy — and so I’m going to start again.

I will write about one topic:

Life trying to get startups off the ground.

This will not be “How I succeeded at getting my startup off the ground”, or “My genius recipe for gobsmacking success in startup life”, or, ”How I built and sold my company for $10M in just 3 months with only 8 toothpicks, a pair of tweezers, and a tenth of my staggeringly massive brainpower, bitch”. This is not one of those blogs. Gloating will be kept to an absolute minimum. I intend to write more in the vein of “How I’ve worked like crazy on too many projects at once for 5+ years with little to show for it except a much smaller bank account, a bunch of hard-earned lessons, and a smug sense of satisfaction. Please send help.”.

I will write as openly and honestly as I can.

I will try really hard to write regularly, at least once a week.

I will spend no more than 30 minutes writing a post.

I will avoid the temptation to portray this lifestyle as glamorous. ‘Cuz it ain’t. Read me?

And I want to feel good about doing this. I have a lot of “priority guilt”… why write blog posts when I should be writing code, helping out at home, doing some exercise, or becoming a better husband and dad? I also fear the embarassment of screwing up in public. But I’ve come to grips with a few realities: I need to write; my privacy is largely an illusion anyway; and I’m much less interesting to everyone else than I like to think.

I’ve put off starting this for a very long time now, so I’d better post this before I manage to stop myself again.

So here goes: Startup Fever. Wish me luck.

P.S. How Canadian of me, to start off with an apology. Represent!

Getting Heroku Cedar and Rails 3.1 Asset Pipeline to Play Nicely Together

I recently migrated a Ruby on Rails 3.1 app from the Heroku Bamboo stack to Heroku Cedar. If you’re doing the same, here are a few notes to help avoid snags on getting the Rails Asset Pipeline working efficiently.

Unlike Bamboo, Cedar does not offer Varnish as a reverse proxy cache, nor does it automatically gzip content. You need to do it yourself. Heroku recommends:

  1. Use memcached, with Dalli as the memcached client. Make sure to follow the Rails 3 section.
  2. Use Rack::Cache as a substitute for Varnish. Heroku links to this article which explains how to integrate Heroku with Rack::Cache. I couldn’t get it to work, so I hunted around and pieced together the folllowing riff.
In your runtime environment file (e.g. production.rb), add this:
require 'rack-cache'
My::Application.configure do
...
  # Enable Rack::Cache
  config.middleware.use Rack::Cache,
   :metastore => "memcached://#{ENV['MEMCACHE_SERVERS']}/meta",
   :entitystore => "memcached://#{ENV['MEMCACHE_SERVERS']}/body"

You can also set HTTP headers in production.rb as follows. (3600 is an example value, make this whatever you want.)

# Add HTTP headers to cache static assets for an hour
config.static_cache_control = "public, max-age=3600"

And you may want to add this to your config.ru to get gzip working:

use Rack::Deflater

References: