What is the right engineering team structure?
There are several factors to consider when deciding on the structure of an engineering team. These include the size and complexity of the project or product, the size of the overall engineering organization, and the company's culture and management style.
One common approach is to organize teams around specific product or feature areas. This can make it easier for team members to become experts in their area and for teams to work independently with minimal coordination.
Another approach is to organize teams around specific technologies or platforms. This can be beneficial for companies that have multiple products or projects that use similar technologies, as it allows engineers to build expertise in those technologies and more easily share knowledge and best practices across teams.
But, I want to focus on the overall structure of small engineering teams. My recommendations are ideal for engineering teams that have 10-20 engineers.
The complexity of the application
You can prepare a laundry list of the factors that could influence the structure of the team like budget, availability of talent, existing relationships, and so on.
But, the single most important parameter that decides the structure of the engineering team is the complexity of the application that you are trying to build.
Complex Application (Engineering driven)
I'm not talking about business complexity, of course!
If your product is technically hard to implement, with one or more of the requirements below:
- Scalability: Building systems that can handle large amounts of traffic or data requires a deep understanding of distributed systems, networking, and performance optimization. Senior developers are often needed to design and implement solutions that can scale horizontally and handle unexpected spikes in traffic.
- Concurrency and parallelism: Building systems that can take advantage of multi-core processors and leverage concurrency and parallelism effectively is a complex task that requires a deep understanding of system architecture, algorithms, and programming languages. Senior developers are often needed to design and implement solutions that can take full advantage of the available hardware.
- Security: Building systems that are secure against malicious attacks requires a deep understanding of cryptography, secure coding practices, and threat modeling. Senior developers are often needed to design and implement solutions that can protect against known and unknown threats.
- High-performance computing: Building high-performance computing systems requires understanding of the underlying hardware and software architectures, optimization techniques and machine learning algorithms.
- Distributed systems: Building distributed systems that can handle failures, consistency and data replication is a complex task that requires understanding of distributed algorithms, consensus protocols and distributed databases.
- Machine Learning: Building systems that can learn from data and make predictions is an active research field and developing a high-performance machine learning pipeline is a complex task that requires experience with different libraries and platforms and a deep understanding of the underlying algorithms and techniques.
- Concurrent and real-time systems: Building systems that can handle time-sensitive data, real-time decision-making, or handling multiple streams of data at the same time requires an understanding of algorithms, data structures, and system architectures for concurrent and real-time systems.
All of these challenges require a deep understanding of computer science, algorithms and problem-solving abilities, and years of experience in developing, testing and deploying complex software systems.
The second-order derivative of hard requirements: Self-driven.
When you are solving a hard problem, you'll need team members who are autonomous and collaborative. This calls for engineers who have spent 5-6 years solving real-world problems.
This is what is expected of such team members.
- Clear communication: Members of a great software development team are able to clearly communicate their ideas, concerns, and progress to one another, as well as to stakeholders outside of the team.
- Good collaboration: Members of a great software development team are able to work well together, with each person contributing their own strengths and ideas to the project.
- Strong technical skills: Members of a great software development team have strong technical skills and are able to design, implement, and test high-quality software.
- Continual learning and improvement: Members of a great software development team are always learning and looking for ways to improve their skills and the quality of their work.
- Effective time management and prioritization: A great software development team is able to effectively manage their time and prioritize tasks to meet deadlines and deliver software on schedule.
- Strong sense of ownership: Members of a great software development team take pride in their work and take ownership of the codebase, processes and practices.
- Agile mindset: A great software development team practices an agile mindset by being flexible, collaborative, and responsive to change.
The ideal team for engineering-driven companies
The ideal team would consist of an engineering manager to oversee the team. The team will also be assisted by an architect whenever required. The team members are a combination of senior software engineers (at least 50%) and software engineers.
Problems with engineering-driven team structure
The composition of the team which consists of a lot of senior software engineers results in a few problems. The engineering manager and the team members have to work together to address these issues.
- Strong opinions: When there are engineers with a lot of experience, there are chances that the team may take time to converge on a technical solution or a stack.
- High cost: The high cost for senior software engineers means that your runway gets shorter and you can not scale the team.
- Attrition: Tech companies have an unlimited appetite for senior software engineers due to the value they bring to the table. Good senior engineers are hard to come by and they are always on recruiters' radar.
- Hiring: Senior software engineers are more mature and look for the culture of the organization, career progression, work-life balance, technology stack, the reputation of the hiring manager, perks, and brand value of the company apart from their paycheck.
Vertical Solution (Product driven)
A product-driven organization generally focuses on solving a "market problem" rather than building a new technology or a patent.
While the strength of the technical solution determines the success of an engineering-lead application, the success of the product-lead application depends on these factors (do not confuse this with product-led growth. This article is differentiating the type of product from an engineering point of view):
- Sales and marketing
- Product vision
- The velocity of adding and removing features
- Cost of adding new features
Of course, all these are important in the case of engineering-driven products also, but more so in the case of product-driven organizations. This is because it is easier for the competition to reach feature parity by building on top of existing off-the-shelf technologies.
The ideal team for product-driven companies
A product-driven organization has to
- Keep the velocity high: Product management and engineering management have to work well together by following agile practices to the T.
- Keep the cost of a feature low: Have more software engineers vs senior software engineers. Have a full-time lead on the team to guide software engineers.
- Keep the number of bugs low: Add a QA person to compensate for high velocity/lack of unit tests.
An engineering-driven organization involves coming up with a new technology/patent and should consist of many senior software engineers in the team. A product-driven organization should focus more on the agile process and have a higher ratio of software engineers.
Co-founder & Chief Architect
Priyank is passionate about building and leading high-performing teams. He has a decade of experience in building and delivering software. He has a master's in Computer Science from the University of Essex. In his free time, he likes to conduct technology meetups and play chess.Linkedin