Effective software organizations focus their investments on the right outcomes.
Achieving business outcomes isn’t solely about writing code or shipping new features; it requires delivering tangible results that align with business objectives, all while maintaining product quality, efficient feature delivery, operational stability, and user satisfaction.
In this chapter, we’ll explore how to structure a software development organization. Then, we’ll share a framework to guide engineering teams in balancing short-term gains with long-term sustainability. We’ll wrap up by discussing practices for successful prioritization.
The structure of an organization plays an integral role in how well the organization can deliver business outcomes. An organization’s job is to promote efficiency and productivity, communicate effectively with organization members and stakeholders, provide clarity in goals and alignment with business goals, and ultimately, deliver on those goals.
Teams, not individuals, are the atomic units that make up an engineering organization. In the beginning, an organization may have only one software development team, and there’s little complexity to manage. Team members have touched most of the codebase, and the codebase is small and tidy enough. Everyone knows everyone.
However, as a company accumulates new customers, features, and business needs, the full scope of the software grows difficult for any single person to grasp. More and more of the company’s software engineers have never touched critical parts of the software. Finding the right person to ask a technical question sometimes becomes a multi-day adventure.
This is why we have teams. By dividing into teams, an organization can take on more complex problems and tasks while effectively delivering business outcomes. The concept of a team allows a small group of people to feel connected with their objectives, codebase, and teammates.
At the same time, creating a team, by definition, creates a silo. When you put a group of people together, you’re implicitly saying that it’s more important for this group to be in sync with each other than with those outside the team. Silos are often considered in a negative light, but without some degree of siloing, everyone would have to pay attention to everything all the time, and things would undoubtedly fall between the cracks. With teams, we create focus and efficiency, even at the expense of more cross-team collaboration in some situations.
A team is more than a group of people assigned to work with each other. A viable team has common objectives and a clear understanding that success at those objectives requires team members to depend on and trust each other. Everyone on the team has clear roles and responsibilities without establishing rigid lines between how different team members contribute. Team members decide on the team’s goals in a process that values and considers the input of one another, stakeholders, and dependent teams; the success of a team is measured against its goals and objectives.
Teams have team members, typically from disciplines including software engineering, product design, and product management, among others. This cross-functional approach helps foster a sense of ownership and collaboration across the team rather than different roles that work by handing work off from one person to another.
Perhaps most importantly, a team should be substantively able to deliver value to the organization using only the resources of that team. If a group of people can only create value in partnership with another group, they’re not a team. Empowered teams are more resilient to organizational change and allow room for growth and development.
There are four key areas to consider when you’re designing teams within a software organization.
When these areas are well-defined, they establish the boundaries of a team’s ownership and responsibilities. Creating effective teams involves evaluating tradeoffs in skill set requirements, dependencies on other teams, optimal team size, support and coaching needs, standardization, architectural support, and domain complexity. You’ll almost never get it right the first time, so experimentation will be necessary before you land on a good mix.
Compromises will be necessary. Having one larger, more diverse team might be more practical than having two smaller but deeply interdependent teams (for example, a frontend team and a backend team). Sometimes it’s not feasible to include every skill set within a single team, leading to alternative solutions like formal or informal organizations for certain skills. Sometimes the deployment target — for example, iOS — warrants a team all its own.
Effective teams tend to include engineers with experience across the stack. People whose experience with various aspects of software development — from data to systems design to frontend, if needed — can accelerate an engineering effort on multiple levels.
In cases where the codebase is complex and wasn’t designed to be worked on by independent teams, you might need to address technical debt or even rearchitect parts of the system before you can achieve better scalability and team autonomy.
Developing an engineering organization requires understanding the distinct needs that different types of teams fill and the order in which to introduce each type of team. Here’s a focused approach on how to strategically develop these teams, considering their unique purposes and contributions.
The initial manifestation of an engineering organization is typically a single product team. Product teams are fundamental in owning and managing specific slices of your business domain, allowing them to operate with a high degree of autonomy and minimal dependencies.
Product teams make decisions and deliver features that directly drive business outcomes. This model aligns with rapid and effective product development, as each team becomes responsible for a distinct product segment, ensuring focused and specialized attention to their respective areas.
In practice, product teams start by focusing on key business areas or customer segments. As the organization grows, these teams expand, diversifying into more specialized units while maintaining their core focus on their segment of the product.
As an organization evolves, product teams will be the most common type of team.
Once you have a few product teams, you’ll often discover that they act like independent companies. On the one hand, this is by design; on the other hand, you generally don’t want six product teams solving essentially the same hard problem in six different ways.
Some platform needs are common across almost all software companies. For example:
However, some platform needs will be very specific to your company. The idea with platform teams is that whatever your company is doing a lot of, it should get really good at doing. These could be things like:
No matter how important an objective is for your company, you can’t suddenly assign a thousand engineers to work on it using systems built for 10 engineers and still expect results. To that end, large tech companies often invest 30-50% of their engineers in platform teams with the objective of allowing the rest of the engineers to move faster.
The evolution and eventual roster of platform teams can vary quite a bit from one organization to another. A single platform team can own many things. Still, eventually, you tend to see a platform team break into several sub-teams, each focused on providing a specific type of value to product team engineers.
As the organization continues to scale, certain areas will emerge that don’t fit neatly into existing product or platform team structures. This is where you may have to get creative and design another type of team.
Product teams and platform teams have fairly simple patterns of ownership and communication needs. At some point, you’ll want to make a tradeoff that doesn’t perfectly fit these models, and that’s fine — as long as you recognize the tradeoff you’re making.
A team might specialize in one of these aspects:
The evolution of team structures in an engineering organization typically follows a progression from product teams to platform teams and eventually to special teams, as needed. This progression aligns with the growing complexity and diversifying needs of the business.
Each type of team addresses a distinct need within the organization, and their sequential introduction aligns with the natural growth and diversification of the organization’s responsibilities and objectives.
When you’re deciding how to structure and staff an organization, tradeoffs are inevitable. We talked above about how this works at the individual team level, but similar challenges exist when designing the organization as a whole.
Where you land on these decisions will depend on the stage of the company and the input of your stakeholders, among other factors. As you design and evolve your organization, you’ll do well to ensure that you make intentional decisions about where you want to land in each of these areas.
The decisions you make here don’t have to be permanent ones; you’re going to get some things wrong, and decisions that were correct before will turn wrong over time. Don’t stick a firm stake in the ground when deciding on these tradeoffs. Instead, identify where on the spectrum you want to be for each category and determine how well you’re adhering to that — and how well it’s serving you — over time.
As you think about the different tradeoffs, there are plenty of antipatterns to avoid. Each of these antipatterns is a choice that very smart people have made in the past, but we recognize now that each of these choices sets you up for different kinds of struggles and failures.
Typically, software engineers report to a line engineering manager. These leaders are familiar with the engineers’ day-to-day work, providing guidance, oversight, and support. In a small or shallow organization, there could be very few additional layers between that line manager and the CEO or CTO. In a more mature or structured environment, more roles start to emerge. Not every organization will need every role, but these broad distinctions become fairly typical over time, and each has a part to play in an organization’s effectiveness effort.
Product roles also have a tremendous influence on an effectiveness effort. These roles often report separately from engineering roles, but individual product managers and product designers are assigned to individual teams.
High-performing teams are an exception, not the rule. They don’t just happen — they require time to form, good leadership to maintain motivation, and clear areas of ownership and autonomy.
Not long ago — and certainly some companies still do this! — teams were organized around a set of features that needed to be built. Team members had input on the technical implementation but little involvement in defining how the feature would work, and often sought (and received) little feedback on whether their work had the desired outcome. The work was the outcome.
In contemporary thinking, teams are conceived not just as functional units executing predetermined tasks but instead as strategic investments. This shift recognizes teams not as stops on an assembly line but rather as fundamental drivers of business success, where their focus is on understanding users, not just on the features or products they develop.
Once again, empowered teams — a table stake we mentioned in Chapter 1 — are essential to making this work, and those teams need to be held accountable for the outcomes they achieve. Teams that can adapt and respond to new information and changing conditions will perform best in this scenario.
Investing in teams means more than just providing tasks; it involves nurturing their growth, capabilities, and cohesion. This includes:
Again, the team, not the individual, is the fundamental unit of an engineering organization and a powerful lever for improving an organization’s effectiveness. Designing an outcome-oriented organization demands that you consider team and organization shape, as both influence how effectively work gets done.
In 2020, Matt Eccleston, a former Dropbox VP of Engineering, spelled out a framework for balancing and budgeting engineering resourcing. Our adaptation of this is what we call the Balance Framework. The Balance Framework is a model for understanding the distribution of an engineering organization’s efforts. It categorizes the organization’s work into four main areas: new things (creating new features or services), improving things (enhancing current features, services, and business processes), keeping the lights on (KTLO) (maintaining existing systems and services), and productivity work (making it easier to get work done).
One of the most potent aspects of the Balance Framework is its ability to create a shared language for people to use across various organizational roles, such as engineering, product, and senior leadership. This shared language allows for improved communication, aligning objectives, prioritizing work, and tracking progress more efficiently.
Let’s look at each category more closely:
Investing too heavily in any one category can lead to problems. For example, focusing too much on new things at the expense of KTLO could result in system instability and a decreased ability to deliver work due to technical debt. Conversely, excessive focus on KTLO might result in fewer new things and improvements, leading to a stagnating product and missed opportunities for innovation and improvement. A healthy blend tends to include at least 10% for productivity work and between 10% and 30% for KTLO work. The remaining time investment will depend on the nature of your business and your product strategy.
Never forget that a quarter, a half, and a year all have a finite number of days in them. In a quarter, there are 13 weeks, or 65 working days. When thinking about what a team can get done, remember that some percentage of that time needs to be held back for slack time (to address KTLO and reactive work), vacation time, and holidays. A team of five that starts with a theoretical 325 available engineering days in a quarter may end up having as less than half of that time available to invest in the new things and improving things category.
With that in mind, teams should also be thoughtful and intentional about how they invest their time in different areas, even if the exact breakdown doesn’t match the organization-level investment levels. Setting an investment balance intention at the team level can help make future decisions more straightforward.
The Balance Framework emphasizes that improving productivity is a collaborative effort among engineering, product management, and product design. It creates a shared language between the diverse roles involved in product development, from software engineers to the CFO.
It also empowers engineers to advocate for the kind of productivity work that often goes overlooked and understand the value of the new things they’re building. A specific allocation for improvements allows product managers and designers to make strategic near-term investments that will pay off in the long run instead of always prioritizing shiny new features. All this ensures that customer-reported issues are addressed while fostering a sense of ownership over the product among engineers, promoting a more engaged team.
Other stakeholders benefit too. Finance can use the information for forecasting and reporting. Given competing priorities, sales and marketing can use this information to understand how much feature development they can expect.
In a smaller organization, conversations around impact and priorities can happen organically; in a larger one, whole departments might exist for each role, making communication more challenging. Having a standard language through the Balance Framework saves you the pain of unintended miscommunication and helps you align priorities between stakeholders.
You can use the Balance Framework to set organizational, team, or even individual intentions around how time gets spent, as well as to give business leaders the visibility they need to determine where engineering effort is going.
With the Balance Framework, you might set a goal for an organization to reduce its KTLO investment from 40% to 20% by the end of the year while maintaining or improving quality metrics. Specific teams can put an additional 20% of their efforts into productivity by addressing technical debt and implementing automation. Product (improving things and new things) will only get 40% investment until the KTLO burden diminishes; the product team buys faster feature delivery in the future by accepting slower feature delivery today.
This example highlights essential tensions in software engineering, mainly because you always have only 100% to spend. If the team previously spent 0% of their time on the productivity improvements category, then that 20% has to come from the other three categories. In this example, product work initially got 60% of the organization’s attention; dropping that to 40% will hurt a bit.
The main challenge of the Balance Framework is that it requires you to adopt a taxonomy when labeling work across your engineering processes so that you can associate each unit of work with a Balance Framework category. The easier you make it for engineers to label their work, the more likely you will get trustworthy data. You may want to adjust the exact classifications — for example, it may be helpful to differentiate productivity improvement work from feature improvement work — but try to keep it to just a handful of adjustments.
Once the data starts to flow, you can also begin to use it to set team and individual intentions. For example, you can identify whether one person on your team is doing all the KTLO. If so, it may become a team or individual priority to spread that burden more evenly.
If you’re dealing with a substantial amount of KTLO work, it’s a clear sign that something needs to change. KTLO tasks are those necessary to maintain the existing systems and processes, and while they are essential, excessive KTLO can limit a team’s ability to innovate and deliver new value.
You can employ a few approaches if a team is swamped with KTLO work.
When you’re inundated with KTLO, it can be tempting to take shortcuts or make hasty decisions to lighten the load. Victory will be fleeting if you choose tactics like working longer hours or taking solely a firefighting approach. Quick “fixes” often exacerbate the very issues they aim to solve, adding to technical debt and leading to burnout among software engineers.
Similarly, prioritizing new features at the expense of KTLO tasks, or hastily outsourcing these tasks without proper oversight, can create more problems down the line. The key to effectively managing KTLO work isn’t simply to eliminate KTLO tasks but to approach them strategically, keeping in mind their impact on long-term product goals and the well-being of the team.
Every engineering organization, no matter its size, struggles with managing competing requests from stakeholders. It’s common to see an organization trying to decide among very different types of work. For example, finance wants engineering to cut cloud spend, product wants engineering to build things that drive customer value, and engineering wants engineering to pay down its technical debt.
With a poor prioritization strategy — or none at all — you end up with multiple competing high-priority goals. In the above scenario, if you choose to say yes to all three things, it’s entirely possible that none of them actually gets done because engineering’s finite time is split across three major projects when there is only room for one. Not only is this bad for the business, but it’s also painful for the engineers who are trying to do all the work. Quickly, you’ll see signs of:
Any one of these things can be poison to an effectiveness effort — they will make meeting the table stakes mentioned in Chapter 1 almost impossible.
Setting priorities is more than just ranking a list of tasks in order of importance. True priorities should highlight the areas where effort will have the most impact on the organization’s goals.
When something is a priority, that doesn’t necessarily mean that every engineer is continually engaged in working toward that priority. Rather, saying something is a priority implies a strategic alignment of choices, where team members, when presented with options, prioritize work that contributes to these key areas. When priorities are clear, the organization focuses on strategic outcomes while day-to-day operations continue without major disruption.
At every level of the business, priorities must be informed by product and business strategy. While empowered teams should be setting their own local priorities, these priorities must be informed by the product and business strategy — and vice versa. Effective prioritization requires knowledge and insights to flow in both directions, so team input should also inform priorities at the group, organization, and even business levels.
Priorities don’t matter much if they’re not communicated clearly. The Objectives and Key Results (OKR) framework, described by former Intel leader John Doerr in his book Measure What Matters, has emerged as a common tool for communicating priorities across an organization and tracking progress on those priorities. However, the effectiveness of this approach varies across different levels of the business and depends a lot on making sure that the overhead doesn’t outweigh the benefits.
We like to think of OKRs as a “high-five” standard; if we accomplish this, will the organization, group, or team have a moment when they all high-five each other (at least metaphorically)? OKRs should be achievable but ambitious. They should be based on outcomes, not a list of tasks to be completed or outputs to be created.
For example, consider a business objective to “hold the line on churn,” with key results of 95% net revenue retention across the customer base and 99% retention among the top 100 customers. Just like any good objective, it doesn’t tell you how to achieve these things — that falls to the teams and groups across the entire organization. It also doesn’t tell you who will do the work; efforts toward business-level objectives will often involve marketing, sales, product, and engineering (at least).
With this in mind, OKRs immediately present the challenge of managing cross-team and cross-organization work. We’ll discuss this challenge in more detail below, but at a high level, what we’ve seen work well is a system where the engineering organization also has OKRs, and those OKRs closely reflect company OKRs. Within an engineering organization, each objective and key result may be owned by a group or team.
So, in the above example, an engineering organization might set OKRs such as the following.
For some teams in the organization, these OKRs could directly intersect with their area of ownership, and they should prioritize their work accordingly. Still, OKRs should never create an all-hands-on-deck situation; part of using OKRs responsibly is accepting and explicitly acknowledging that they will never cover the full scope of work that should be happening.
A clever senior leader may share a list of OKRs but then declare, “Security is always our top priority” (or cost cutting, or KTLO, or something else that didn’t end up on the OKR list). Sometimes product and engineering will each come up with separate OKRs. If you have two lists of five top objectives, you have 10 top objectives. There must be one short list at the highest level, and everything on it should be material to the success of the business. Otherwise, every level below has to choose who to please and who to offend.
An efficient OKR process is marked by minimal overhead, with individual teams spending less than a week per quarter on OKR-related tasks. While the OKR approach does require aligning with other teams, the alignment process should not be about crafting a perfectly cascading plan across the organization but rather about ensuring that there is harmony in direction and purpose.
As you evaluate OKR progress, watch out for “watermelon status,” where the outward reporting of progress does not match the actual data, indicating a disconnect between perception and reality. Keep watch also for objectives that focus on an output or checklist vs. a specific business outcome.
OKRs must be part of a larger discussion involving investment balance and organizational design. Imposing an OKR process on a team that is under-resourced or misaligned with the company’s broader goals can lead to frustration and inefficiency. Your goal should be integrating OKRs into the organizational fabric, ensuring they complement and enhance the overall strategic direction and resource allocation without becoming a source of debilitating overhead.
At the business and organization level, OKRs excel in setting clear directions and establishing priorities. They are designed to focus on a few crucial objectives, ensuring a focused effort where it matters most. As discussed above, the key results associated with these objectives steer clear of dictating the how, focusing instead on what the achievements will look like upon completion.
Applying OKRs at the group level brings challenges, particularly in organizations where trust is low. There’s often a tendency to develop group-level OKRs that cover every team, lest some teams feel overlooked or undervalued. Furthermore, the very structure of some organizations can make it challenging to establish shared objectives that resonate across all teams.
At the team level, OKRs are useful for communicating and aligning with leadership and other teams, leaving the details to the team to work out while creating visibility for leaders. Be careful, though: the practicality of OKRs at the team level can be outweighed if you’re spending too much time developing them.
Measurement paralysis is a frequent challenge, as a team spends time figuring out how to measure the impact of an issue rather than simply resolving it. Another challenge of OKRs at the team level is that they need to serve audiences up, out, and down. Coming up with language that accurately represents work to the team, its stakeholders, and its management chain can be (and can create) far more trouble than it’s worth.
Another shortcoming of OKRs is that the “ambitious but achievable” standard doesn’t work as well for KTLO work. The OKR framework described by Doerr excludes this kind of work, focusing only on new business objectives. When OKRs focus only on new work, a team or individual can end up in a situation where their extremely necessary KTLO work is undervalued.
OKRs also don’t include reactive work — the stuff that comes up that’s difficult to predict ahead of time. This could be anything from a security issue in a software library or a production incident to a last-minute request from a VP to gather some data.
Finally, don’t ask teams to create new OKRs every quarter or on any particular cadence. At the team level, a light and occasional refresh should be sufficient. Otherwise, team OKRs often become more like to-do lists than strategic objectives, providing little value as a communication tool. The time invested in developing and tracking these OKRs can be extensive, and the benefits might not always be proportional.
Platform groups face a unique scenario when it comes to OKRs. These groups find OKRs most beneficial when the group thinks of itself as owning a product rather than just maintaining a set of services or capabilities.
For more service-oriented teams, OKRs can feel irrelevant because much of their work tends to be KTLO-shaped. Depending on their nature, platform teams may be a case where standard OKR practices don’t make much sense. Here and elsewhere, in the interest of empowered teams, listen closely to the team if it struggles to communicate its planned work this way.
One of the hardest prioritization challenges for a software company is cross-team projects. It’s rarely convenient for people across teams to suddenly work on the same thing at the same time, especially if the value of that work to the team’s users isn’t very clear. It’s imperative to keep people on the same page about the importance of the project and to understand project progress across teams.
Successfully and predictably leading complex, cross-cutting initiatives in a software engineering organization requires timely, accurate, trustworthy data about the work that’s being done toward completing the initiative. With that knowledge in hand, you can ensure that progress is made with a reasonable scope and a reasonable amount of engineering resources.
If things aren’t moving along as quickly as you’d hope, there are a few common culprits you can look for and address.
In this chapter, we emphasized the strategic connection between software development and business objectives and highlighted the Balance Framework as a key tool for managing resource allocation across near-term and long-term goals. We also explored the evolution and role of different team types — product, platform, and special teams — in effectively handling organizational complexity and driving business outcomes. We looked at examples of tradeoffs in team design and organizational structure as well as tactics for prioritizing and managing cross-team efforts.
In the next two chapters, we’ll talk about developer productivity and developer experience — two sides of the same coin that are both essential to a successful, sustainable software development organization. Business outcomes will suffer in the long run without investment in both areas.