Software Engineering Tips for Startups
Software is at the very heart of any modern startup.
The business ideas, new utilities for society and the next big thing all boil down to code. If the code is good, the startup has a chance. If the code is bad, no matter how brilliant the business people are the startup is not going to get far.
1. Must have code
The working code proves that the system is possible, it also proves that the team can build the system. The working code is the launchpad for the business. After it is ready, the business can happen.
In the old days, tech companies were funded based on the idea written on a piece of paper. Those days are long gone. Today a startup needs to have not only working code, but an assembled system and active users. Software Engineering transitioned from the post funding exercise to the means to being funding.
Software now needs to be built faster and more correctly. It needs to constantly change to address the changing nature of the market and meet customer demands. Fundamentally, software engineering in startups is now a different game.
The working system is what gets you in.
2. Must have a technical co-founder
Any startup starts with the idea and just a few people. A lot of startup co-founders these days are techies, passionate about technology and life. It was not always like that. Just a few years back a purely technical founding team would have had a hard time fund raising because there was a school of thought that you need an MBA to run the company.
In fact, a lot of the reverse was true. A few business people would get together, come up with the idea for a product and then think: Where can we get a techie to get this done?
It is misguided notion that business and technology are somehow separate and that the first one is the king while the second is marginal. It is not, because technology is what makes the business possible to begin with.
So the first tip is to always have a strong technical co-founder. Someone who shares or invents the business along with others, but also has the technical feet on the ground. Someone who can make sure the business is mapped onto technology correctly.
3. Hire A+ engineers who love coding
The software industry survived close to 30 years of crisis. Until recently, building a large scale system that worked was black magic. Most software projects suffered for years, had large engineering teams and little consensus on what needed to be done and how to accomplish it. The resulting systems were buggy, unstable, hard to maintain and extend.
The problem was that there were just too many people who were not that good who were working on the problem.
Startups can not afford to have less than A+ engineers. In a larger company there is an opportunity to mentor and grow people. In a startup every hour is precious. Not much time can be spent teaching people, you need to get people who know what they are doing.
Qualifications for A+ engineers are:
- Focused on results
- Loves coding and fluent at it
- Writes elegant quick code
- Smart and quick
- Loves refactoring
- Values testing
- Solid in Computer Science
4. Keep the engineering team small and do not outsource
A team of 2-3 rock star engineers can build pretty much any system because they are people who are good, love building software, focus on the goal and don’t get in each other’s way. The team of 20 so-so engineers will not get far.
The mythical man-month book debunked the notion of scaling by adding more programmers to the project. The truth is that most successful software today is built by just a handful of good engineers. Less is more applies equally to code and the number of people working on it.
Once you embrace the idea of just a few rock star people building the system, then outsourcing development becomes a really bad thing to do. Tech is your bread and butter, why would you outsource it? There are not many things more important than your code. Trusting people you never met to build the very foundation of your company does not make sense.
Again, it is a myth that you can scale faster with more programmers. It is even a bigger myth that outsiders can get your work done for you. This is not the place to save money. Hire a few of the best guns you can find, pay them well, give them stock options, make them happy and jazz them up about the company.
5. Ask tough questions during the interview
There is nothing worse than being soft during the interview and getting the wrong person into the company. This is bad for you, but more importantly bad for the person. In the end you will end up parting ways, but it would be best to just not make this mistake to begin with. So be tough and ask a lot of technical questions during the interview. What to ask depends on what you are looking for, but here are the basics:
- Ask standard computer science questions: data structures and algorithms. (If the person does not know what a Hashtable is or how it works or how to write one - thats a big red flag)
- Get a feel for knowledge of the language: It does not matter what language they claim fluency in - confirm it by asking specific questions
- Senior people need to know threads, queuing, distributed systems, databases
- Senior people need to know design patterns
- Senior people need to know unit testing inside out
- Most importantly, the candidates need to demonstrate love for simple and elegant code
Always ask for code samples - a lot can be revealed. Give written timed tests, even if its over the web. And always check references before making an offer.
6. Avoid hiring managers
You do not need these type of people in a small team. If everyone is sharp, knows what they are doing and executes on a task, why do you need a manager? People who try to overlay complex processes on top your objectives are going to slow you down and make you frustrated.
If during the interview someone who has been a manager says “I miss coding and want to code again”, beware that soon they might want to go back to management. Point being - the best startup engineers are people who are young and hungry to write code. More experienced people who are looking to do more management than coding will not be as passionate. And this is bad, because startups need passion and drive to build the impossible.
What you need are experienced technical people who love coding. These are going to be natural mentors for your younger engineers. Mentors and not managers.
7. Instill an agile culture
Modern startups need to move very quickly. There is no room to plan for 6 months and then execute because someone else will get there first. The new approach is to evolve the system. Of course you are doing planning for the release, but you are iterating quickly, doing frequent builds and constantly making changes.
Coding becomes sculpting. Starting with a shapeless form you continuously refine the code to satisfy the business requirements and make sure that the system is designed and implemented correctly. This is agile culture which values:
- Clean and elegant code
- Continuous refactoring
- Focus on defect-free software
- Code ownership and pride
- Team work and little ego
- Most importantly: use common sense
8. Do not re-invent the wheel
A lot of startups go overboard with the infrastructure. This includes two types of things - rebuilding the libraries and building your own world-class scaling. On the first point - there are so many fantastic open source libraries out there that it just does not make sense to write them in house. Whether you are using JavaScript or PHP or .NET or Python or Ruby likely there are major libraries that can help you. Re-writing existing libraries is a waste of your time and you are not likely to do it better.
Building a large-scale system is a different matter entirely. First you need to get to scale and then worry about it. The guys from 37Signals have written about this on many occasions including their Get real book. Why worry about having millions of users while you do not have any at all right now? Spending time making sure that you will scale big is a waste of your time. Focus on what your product does best instead.
And to that effect, we have been using Amazon Web Services and are now supporting > 1M BlueOrganizer downloads. The Simple Storage Service (S3) allowed us to build a truly distributed and scalable system. We have not started using EC2, Amazon’s compute cloud service, but are planning to re-evaluate it soon.
The point is that there are tools, solutions and services out there that can help you get to scale. It is better to use them than to spend huge amounts of time and energy and money on building these systems in house.
Wrap up
Software is critical to any modern business. So the key to success of any startup is to have rock star technical team that can quickly turn the vision into a piece of software and then evolve it and iterate it until it turns into a real business.