I was chatting today with a European freelance developer who is thinking about setting up a software agency. He asked me if I had any advice for him after building Salsita from a guy in his bedroom to a 40 person company with 25 full-time developers in a little over four years. It turned out that I had quite a lot to say on this topic, so I started to take notes with the idea of turning my 30-minute monologue into a blog post.

This is that blog post.

Know how you want to grow

Before you do anything else, you need to figure out where you want to fall on the continuum from pile-em-high-and-sell-em-cheap bodyshop to pricey high-end consultancy. To a large degree this will be driven by geography. If you're in Bangladesh, you'll probably want to compete on price. If you're in Sausalito, you'll probably want to compete on quality and charge an arm and a leg for your services.

This decision will also drive your hiring strategy. If we were an outsourcing shop in India or Kazakhstan, 25 developers would be insignificant. Because we are targeting the high end, we have been much more judicious about our hiring practices. In this context, 25 developers is already quite a lot, which is why I think this post is worth writing.

Know how to attract and retain great developers

The most important lesson is to know what developers want. Software is a seller's market nowadays. Obviously it's important to take care of your clients, but it's arguably even more important to take care of your developers.

What programmers hate above all is having a bozo non-technical manager hounding them with stupid questions and demands. Stick to technical or product-savvy managers who make visible contributions to projects and earn the developers' respect.

Useless restrictions and bureaucracy are a close second. Be as accommodating about vacation, working hours and remote work as possible. Money, free food and company karaoke outings are nice, but freedom and flexibility are far more important.

Be prepared to fire people

Part of maintaining developer quality is being willing to let people go. Firing people is the worst part of being a manager. Everyone is convinced that they should be given a "second chance", and earlier in my career I made the mistake a couple of times of granting one. I always regretted it. This only forces you to go through the whole unpleasant experience again a month or two later. If someone is dragging the level of your team down, grit your teeth and show them the door.

Build your team in one location, then go remote

In the early days, having everyone colocated in the same office is a huge advantage. We are true believers in remote development, but it is best when it builds on a solid foundation. We have invested considerable time and effort into creating an enjoyable and practical working environment. It is a lot easier to foster a strong company culture and team spirit this way than if the entire company is distributed. Once you have established this, you can start to bring remote developers into the fold.

Have a strong and constantly improving development process

We have a very opinionated development process. I see a lot of service companies that think they can just hire great developers and turn them loose. You won't distinguish yourselves from a talented freelancer unless you work together as a team. This requires structure and discipline.

Everyone uses scrum these days, but it doesn't ensure software quality by itself. Two game-changers for us have been mandatory code reviews and weekly all-hands meetings for the development team. By getting together every week to talk about what is good and bad about our process, we explicitly accept the reality that our process is not and will never be perfect. Everyone, not just an elite cadre of managers, is involved and drives us to keep improving.

Know how you are going to get clients

You must know how you are going to market and sell your services. This is where most software consultancies hit a wall, once they have exhausted or outgrown their personal networks. There are obviously many ways to skin this cat.

We specialized initially on browser extension development, which is a narrow niche that lends itself nicely to targeted marketing. This got us to 10-12 developers, at which point we had the budget to move up the food chain to larger markets. Even then, we concentrated on specific niches like AngularJS and Node (with more recent additions like React and Cordova) rather than broader targets like "web app development" where the competition and noise are harder (and more expensive) to overcome.

As Obie Fernandez points out in "Do The Hustle" (chock-filled with great tips for marketing and selling software services), your website is the main window that clients have into your company when making a buying decision. Our website is disgustingly overengineered, but then who would want to hire us if it wasn't?

Be picky about your clients

Be careful to choose your clients carefully. Make sure that they are willing to serve as a reference. What's the point of doing great work if you can't tell anyone about it?

The best projects are the ones where you add the most value, not the ones where you charge the highest rate. If the client is pushing you to move too fast to use your development process properly, or their developers are constantly blocking you, you can't work to your full potential (and your staff will end up frustrated and unhappy). You might make lots of money in the short run, but eventually your clients will notice that they can't justify what they are paying you.

Focus on customer satisfaction

Speaking of which, make sure your clients are happy, and remember that all the rest is just a means to this end.