Part 1 - EnvironmentThe right environment is critical to product development. You need the right tools, low administrative overhead, and good understanding of people.
It is critical that you use the right tool for the right job. Although you can hammer in a screw, it's not optimal. And I suppose you could try and hammer in a nail with a screw driver, but really, who does that? Here are the most important tools we use on a daily basis.
- AWS - Because you never know what hardware you need until after you bought it.
- Github - Because you should always use version control, and there is no better service.
- Puppet - Spin up a new server, and it configures itself. No manual intervention required.
- Trello - Centralized todo lists. Easy to use, keeps us on track.
- SQL - When you have highly structured relational data and the schema is fairly stable.
- Neo4j - When your data is actually a graph, use a graph database.
- Couchbase - When your schema is loose and your data is not relational.
- Memcache - When you are using key value pairs that aren't persistent (ie, session storage)
- Elasticsearch/Lucene - When you need something more robust than %like%
Nothing is more of an anchor that administrative overhead. Every report, every status update, and every request for permission slows things down. To move fast you MUST reduce this to the barest minimum. Here are some of the things we do to keep overhead down.
- Max of 1 recurring meeting - We only have 1 scheduled meeting per week. It's on Friday, and its purpose is to review the week and schedule out the next week. Every other meeting is called as needed, and only if it is needed.
- Good delegation - If you hire the right people and you delegate appropriately, asking for permission to do something or to get something done shouldn't happen very often. If everything is working correctly, the majority of communication along these lines is limited to broadcasting the decisions we made, rather than trying to get decisions made.
- No decisions by committee - For every decision, there is always a person who has final call. This means that no decisions are made via committee or consensus. This doesn't mean that things aren't discussed. This means that after the discussion is over, there is a decision made by one and only one person. And the decision is respected, even if other people may not agree.
- Let the administrative process build itself - Instead of creating process and structure up front, we take a "lets try this" approach. We take a minute and decide on the process we want to try and use, and then test to see if it works. After we've tried it, we ask ourselves a simple question: Do we use this process next time? If so, we use that process. If not, we try something else. It boils down to having a mindset of "lets figure out what works for us".
- 1 task, 1 person - For each task, only one person should be responsible for it. Having two people responsible for the same task is asking for trouble. Not only do they have to collaborate on the task itself, but they have to figure out who is ultimately responsible anyway. Just assign it to one person in the first place and give them the authority to get it done. Note that this doesn't mean not collaborating, it just means assigning responsibility to 1 and only 1 person for a task.
- Outsource - Only hire people for what you can't outsource at a reasonable cost. We have outsourced everything we can. Payroll, accounting, taxes, building maintenance, etc. Just make sure to choose well, because one of the main reasons you outsource is to gain time. The time you are not spending managing is time you can spend creating.
- Do without - Ask yourself if you can do without before you do. If you can do without something or someone, even for a little while, it reduces the amount of people and things you have to deal with. You can now move faster because you have more time to spend on other things.
In part 2 we discuss the importance of a proper mentality.