I’ve worked at software development startups including my own throughout my career. I’ve worked as a software developer, tech lead, and CTO. I’ve written code, managed servers, created user interfaces, designed web sites, prepared documentation, and even done some marketing. I’ve hired and assisted in hiring dozens of people: both developers and non-developers. But, first things first, if you are a cash-strapped startup, you can usually get away with a team of just one or two developers and hope for the best. There’s absolutely nothing wrong with that. But if you have the funds to add new members to your team, don’t just go with more developers. Developers aren’t generally very good at designing products people want to use – they are good at implementing well-specced features. That leads to the first non-developer position I recommend filling in:

Product Manager

A good product manager is worth their weight in gold (OK maybe not that much given the price of gold these days, but you get the idea). The product manager’s job involves:

  • Knowing the product inside out. She should be the person everyone goes to if they have a product question.
  • Providing input on which features to develop first. This requires a thorough understanding of company objectives and user expectations.
  • Dividing new feature developments into manageable chunks with the help of the software tech lead. Great product managers can also make suggestions about which parts of the features should not be developed right away and can be safely deferred.
  • Writing detailed specifications for each new feature to develop.
  • Manually testing the newly developed features to see if they conform to the specification.
  • Writing documentation about features.
  • Helping with release planning.

UX Designer

Good product managers can double as UX designers to a certain extent especially in the early days of a startup, but as soon as you get the funds to hire a proper UX designer, don’t think – hire one. A good UX designer can design user interfaces that look nice and a joy to use. From a user’s perspective your product is simply what’s visible to her. A user can’t be expected to know how things work in the background. If she sees a button on the screen and presses it, she expects it to behave as she thinks it should. A good UX designer can make your product behave as the user expects it to, and that leads to happy users and fewer support requests.

A UX designer’s job involves:

  • Designing screens and deciding on how the user navigates from one screen to another.
  • Doing usability tests preferably on prototypes in software like Figma before developers implement a feature.
  • Iteratively improving existing designs by observing actual user interactions with the product.
  • Working closely with the software developers and modifying the designs if they are technically difficult to implement. Not all designs are practical to implement, and changes may be necessary to reduce development time as long as they don’t negatively affect user experience.

QA Engineer

Once you have your product manager and UX designer in place, it’s time to hire your first QA engineer. Sure, software developers can write their own automated tests, but their main job is to implement features. A dedicated QA engineer can be much more productive than developers in writing tests, especially the all important integration tests that touch multiple features. A QA engineer has a birds-eye view of your code base while developers often focus on individual parts of the code.

A QA Engineer’s job involves:

  • Having a good understanding of how each feature under test is supposed to work.
  • Writing maintainable test cases that make sure that your code base functions correctly. Using a Behavior Driven Development (BDD) tool like Cucumber helps design test flows that can be modified easily.
  • Making small modifications to your code base such as adding a class attribute to an HTML tag so that a feature is easier to test. When bigger modifications are necessary, asking software developers to write code more suited to testing.
  • Keeping test suites up to date. It’s normal for some tests to fail for reasons other than bugs, but those tests should be fixed as soon as possible, and the number of failing tests should be kept to a minimum.

Software Tech Lead

This role is usually given to the most experienced software developer in the team, but experience alone isn’t sufficient. The tech lead must have some “soft” skills in order to effectively prioritize and distribute work in her team. If your tech lead doesn’t have enough hard or soft skills, she can receive mentoring from a more experienced software developer if you have one like the CTO or a tech lead in another team.

A tech lead’s job involves:

  • Deciding on the architecture and technologies to use for the features to develop. A good tech lead is practical – she chooses simple architectures over complex ones and prefers battle-tested technologies over the latest buzzword ones.
  • Prioritizing work in coordination with the product manager.
  • Making quick estimates on how much she thinks each feature would take to complete taking into account the inevitable bugs that would need to be fixed.
  • Writing code that deals with core functionality.
  • Coming up with suggestions to improve existing code and processes.
  • Helping team members with their technical and personal issues.

Software Developer

In my experience, for small teams, having an experienced software tech lead supported by several junior software developers tends to work well. Junior developers often need assistance from the tech lead or from each other, so I have them work in groups of two or three, and make it clear that they should help each other as much as possible. The technical hurdles to cross can be overwhelming for junior developers especially when they are fresh out of school. Working in groups make them feel that they aren’t alone and it’s OK to seek help when they’re stuck.

For software developers, it isn’t important what they know as long as they have the basics covered – what’s important is that they are highly motivated to learn. It also helps if they’re quick learners.

DevOps Engineer

Strictly speaking, this position isn’t necessary if your product has few users, doesn’t require large servers to function, and your users are fine with the occasional downtime if it’s not too long. If you have a software developer in your team who can willingly devote some of her time to managing your servers then you can probably get away without hiring a DevOps engineer until you really need one.

A DevOps Engineer’s job involves:

  • Having separate test and production servers for your product.
  • Having “one-click” software deploy and rollback processes.
  • Backing up all critical data such as databases and git repos regularly, and testing those backups actually work.
  • Monitoring servers for abnormal conditions and taking corrective actions.

As a final note, for a startup it’s especially important to hire people who can take the initiative and work under minimal supervision. People who are accustomed to large corporate environments where it’s common to have a career ladder and strict processes to follow may not do well at a startup.