Building an Effective App Maintenance Team: Roles, Skills and Structure

An NBA team cannot build a winning roster by signing five great scorers.

Someone has to control the pace of the game. Someone has to defend the paint. Someone has to create shots for other players, cover difficult matchups and come off the bench when the starting lineup needs rest.

A roster can contain enormous individual talent and still fail because the pieces do not cover what the game demands.

Application maintenance teams have the same problem.

A company may have excellent developers but nobody clearly responsible for production reliability. It may have strong infrastructure engineers but no one translating recurring support problems into product work. Security expertise may exist somewhere in the organization, yet nobody knows when that team should be brought into a maintenance change.

When something breaks, capable people eventually solve it.

That is not the same as having an effective maintenance team.

An effective app maintenance team is structured so that the responsibilities required to keep a live application healthy are clearly covered, people have the skills and authority to perform those responsibilities, and work can move from detection to diagnosis to resolution without depending on one individual knowing everything.

Microsoft's current Azure Well-Architected guidance makes a similar point. It recommends building workload teams with a range of technical and business disciplines—including software engineering, QA, SRE, infrastructure, security, product and support—and assigning clear responsibilities for designing, deploying and operating the workload.
Microsoft Azure Well-Architected Framework: Workload teams

For Levelworks, this is where App Health becomes useful as a team-design lens. A maintenance organization does not need one person assigned to each App Health aspect, but responsibilities such as Observable, Secure, Resilient, Performant, Supported, Tested and Current & Updated should not exist in an organizational blind spot.

The objective is coverage, not titles.

Start with responsibilities before choosing job titles

A common mistake is to begin maintenance-team design by asking:

How many developers do we need?

Developers are important, but the better first question is what the application needs people to be responsible for.

A live application typically requires recurring responsibility for:

  • triaging defects and user issues;
  • understanding product priorities;
  • diagnosing and fixing application code;
  • testing changes;
  • deploying releases;
  • monitoring production;
  • responding to incidents;
  • maintaining infrastructure;
  • addressing security concerns;
  • handling dependencies and platform upgrades;
  • supporting users;
  • preserving technical knowledge.

Depending on the application, several of these responsibilities may belong to the same person.

A small SaaS product does not necessarily need a full-time SRE, security engineer, DBA, QA engineer and product manager dedicated exclusively to maintenance.

It does need somebody accountable for reliability, security, data, testing and prioritization.

That distinction matters:

roles describe responsibilities; people fill roles.

One engineer may cover several roles in a small application. In a larger business-critical platform, a single responsibility may require several specialists.

NIST's Secure Software Development Framework follows the same principle. It recommends explicitly defining and periodically reviewing SDLC roles and responsibilities, including developers, testers, security specialists, product owners, operations and platform engineers.
NIST Secure Software Development Framework (SSDF)

The maintenance lead: someone needs to own the whole queue

An app maintenance team benefits from one person who can see the work as a whole.

This role might be called:

  • maintenance lead;
  • application owner;
  • engineering lead;
  • service owner;
  • technical delivery lead.

The title matters less than the responsibility.

This person should be able to answer:

  • What are the highest-risk current issues?
  • Which maintenance work is committed?
  • What needs engineering investigation?
  • Which issues are waiting on another team?
  • Are recurring incidents generating permanent fixes?
  • Which upgrades are approaching?
  • Does the team have enough capacity for planned and unplanned work?

The maintenance lead does not personally make every decision.

They make sure a decision has an owner.

Microsoft's Operational Excellence guidance recommends clearly defining decision-making authority and using a directly responsible individual where necessary so responsibility is distributed without leaving decisions unresolved.

This role becomes particularly valuable because maintenance work arrives from many directions: monitoring, support, security advisories, technical debt, product requirements and platform changes.

Without somebody maintaining the overall view, the queue often becomes whoever shouted most recently.

[Internal Link: “How to Prioritize Bugs, User Issues and Feature Requests”]

Application engineers are the technical core

Software engineers usually form the largest part of the maintenance team because most application problems eventually involve understanding or changing code.

The exact mix depends on the technology.

A web application may need:

  • frontend engineering;
  • backend engineering;
  • database knowledge.

A mobile application may require iOS and Android skills.

A distributed platform may need engineers capable of working across APIs, queues, storage and services.

Maintenance engineering differs slightly from greenfield development.

Writing new code is only one part of the job.

A strong maintenance engineer also needs to be comfortable:

  • reading unfamiliar code;
  • debugging production behavior;
  • tracing a problem across components;
  • working with logs and metrics;
  • assessing change risk;
  • understanding historical constraints;
  • making small, contained corrections rather than always redesigning the system.

This is why experienced generalists are often valuable on maintenance teams.

They may not be the organization's deepest specialist in every technology, but they can investigate a problem across enough of the application to determine where specialist expertise is actually needed.

QA should protect existing behavior, not just test new features

Maintenance changes frequently touch mature functionality that users already depend on.

That creates a different testing challenge from validating a newly introduced feature.

The team needs confidence that fixing one behavior has not broken another.

QA responsibility should therefore cover:

  • regression strategy;
  • risk-based test selection;
  • test automation;
  • exploratory testing where appropriate;
  • release verification;
  • tracking areas with weak test coverage.

In some teams, developers own most automated testing and a QA specialist concentrates on strategy and complex validation.

In others, dedicated QA engineers maintain broader regression suites.

Either model can work.

The dangerous structure is one in which testing is assumed to be somebody else's job but nobody actually owns it.

Tested App Health is not created by having a QA job title. It comes from having reliable testing responsibilities embedded in how maintenance changes move toward production.

SRE, DevOps or platform capability keeps maintenance operationally safe

Once an application is in production, somebody needs to understand the environment surrounding the code.

Depending on the organization, this work may sit with:

  • SRE;
  • DevOps engineering;
  • platform engineering;
  • cloud/infrastructure engineering.

Responsibilities often include:

  • CI/CD;
  • production environments;
  • observability;
  • infrastructure changes;
  • capacity;
  • reliability;
  • deployment safety;
  • incident tooling;
  • operational automation.

Microsoft's Well-Architected guidance explicitly includes DevOps engineers, infrastructure engineers and SREs among the disciplines that may make up a workload team, while recommending that teams take end-to-end responsibility for operating their workload even when centralized specialists provide support.

This function should not become a release gate that application engineers throw work over.

DORA's research on loosely coupled teams finds better delivery capability where teams can complete changes, test and release without requiring constant fine-grained coordination with external teams.
DORA: Loosely Coupled Teams

The healthier model is for maintenance engineers to understand enough operational practice to own their application, while platform specialists provide reusable capability and deeper expertise.

Security expertise should be part of the operating model

A maintenance team does not necessarily need a security specialist sitting permanently inside it.

It does need a defined security relationship.

Someone must be responsible for questions such as:

  • Who reviews a high-risk security change?
  • Who evaluates new vulnerabilities?
  • Who owns dependency remediation?
  • Who responds to a security incident?
  • When does a maintenance release require security testing?

NIST's SSDF explicitly recommends integrating security responsibilities into software-development roles and identifying security specialists, champions and other relevant participants rather than leaving secure development outside the normal SDLC.

A practical model is often:

core team owns everyday secure development practices; specialist security teams support higher-risk analysis.

This avoids two bad extremes.

In the first, developers assume security belongs entirely to the security team.

In the second, every routine maintenance change waits for a scarce central specialist.

Support needs a direct path into the maintenance team

Support teams see application problems from a perspective engineering cannot reproduce through monitoring alone.

They hear:

“This keeps happening every Monday.”

“Only administrators seem affected.”

“Customers have started using this workaround.”

That evidence should reach the people maintaining the product.

A useful relationship is:

Customer

   ↓

Support

   ↓

Triage

   ↓

Maintenance engineering

   ↓

Product / technical decision

Support should not forward every user question directly to developers.

Nor should engineering remain unaware of repeated problems because support continues solving them manually.

A strong maintenance structure creates an explicit path for:

  • reproducible defects;
  • recurring user issues;
  • incident patterns;
  • important workarounds;
  • customer-impact evidence.

The support team provides customer context; engineering provides technical diagnosis.

[Internal Link: “What Does Good Post-Launch Application Support Look Like?”]

Product ownership still matters after launch

Maintenance teams need somebody who can make product decisions.

Suppose engineering identifies three pieces of work:

  • a recurring export failure affecting a major workflow;
  • a framework upgrade approaching end of support;
  • a requested reporting improvement.

Engineering can estimate effort and technical risk.

It cannot decide business priority alone.

A product owner or equivalent stakeholder should help determine:

  • which user outcomes matter most;
  • which customers are affected;
  • which work aligns with current business priorities;
  • which behavior is intentional;
  • which feature request should not be built.

This does not necessarily require a dedicated full-time product manager in a small maintenance engagement.

It requires access to somebody authorized to make product decisions.

Without that, developers are forced to make business choices implicitly.

UX expertise can be shared rather than permanent

Not every maintenance team needs a full-time designer.

But mature applications accumulate experience problems.

A form becomes awkward after several fields are added. Navigation grows. Two workflows use inconsistent patterns.

Engineering can identify some of this friction but should have access to UX expertise when meaningful interface changes are required.

The same applies to accessibility.

The best structure is often shared capability: designers and accessibility specialists join when the maintenance backlog contains work requiring those skills.

That keeps the core maintenance team lean without pretending every problem can be solved through engineering alone.

Database and data expertise depends on application complexity

Some applications can be maintained comfortably by backend engineers with good database knowledge.

Others cannot.

A high-volume transactional platform, analytics product or application with complex migrations may need deeper DBA or data-engineering capability.

The important responsibilities include:

  • query performance;
  • indexing;
  • schema change;
  • migration safety;
  • backup and restore;
  • data integrity;
  • retention.

The maintenance structure should reflect the application's actual risk.

Do not hire a specialist because a generic organizational chart says one belongs there.

Do not omit one because developers have managed so far.

The application should determine the skill requirement.

Separate core roles from shared specialists

One of the most practical team models is to divide maintenance capability into two groups.

Core maintenance team

People involved continuously:

  • maintenance or engineering lead;
  • application engineers;
  • QA/test responsibility;
  • product ownership;
  • support interface;
  • operational/platform capability.

Shared specialists

People brought in when relevant:

  • security;
  • database specialist;
  • UX/accessibility;
  • enterprise architecture;
  • network engineering;
  • compliance;
  • specialist cloud expertise.

Microsoft describes a similar arrangement between a workload team and centralized teams, where the workload team owns the application outcome while centralized groups provide specialist services, governance and capabilities that individual teams may not need to maintain themselves.

This structure avoids two expensive mistakes:

building a permanent specialist team far larger than the application requires, or maintaining such a narrow team that every unusual issue becomes a scramble to find outside help.

Cross-functional does not mean everyone should know everything

A good maintenance team needs broad understanding and deep expertise.

Those are different.

A backend engineer should understand enough of deployment and observability to investigate production behavior.

They do not need to become the organization's deepest Kubernetes specialist.

A DevOps engineer should understand how the application behaves.

They do not need to implement every business rule.

Microsoft's current Operational Excellence guidance recommends deliberately building cross-functional teams whose members retain specialization while developing enough general knowledge of other functions to support one another and understand the workload end to end.

This is often described informally as T-shaped capability: depth in one discipline with sufficient breadth to collaborate across others.

For maintenance work, that breadth reduces handoff cost.

Avoid single points of human failure

If only one engineer understands billing, that engineer has become part of the system architecture.

If only one person can deploy production, they are a deployment dependency.

If only one person can respond to database failures, every holiday and resignation becomes operational risk.

Critical responsibilities should therefore have:

  • a primary owner;
  • at least one backup;
  • documentation;
  • access configured in advance.

Cross-training is particularly important for:

  • deployment;
  • incident response;
  • databases;
  • key integrations;
  • authentication;
  • billing.

This does not require every engineer to become equally skilled.

It means the application should not become effectively unmaintainable because one person is unavailable.

[Internal Link: “Why Good Documentation Makes an App Cheaper to Maintain”]

Design an on-call model that people can sustain

Business-critical applications may require support outside normal working hours.

That does not automatically mean every maintenance team should run a 24/7 internal on-call rotation.

The appropriate model depends on:

  • service commitments;
  • application criticality;
  • customer geography;
  • incident frequency;
  • available staffing.

If on-call is required, it must be sustainable.

Google's SRE guidance is useful here because it treats on-call load as an engineering-capacity issue rather than unlimited human availability. Google describes balancing both the quantity and quality of on-call work and deliberately protecting SRE time for engineering improvements and automation rather than allowing operations to consume the entire team.
Google SRE: Being On-Call

Google's specific staffing numbers are based on its own operating model and should not be copied blindly. The broader lesson is more valuable:

if the same small group is continually interrupted by production problems, the team needs either more coverage or fewer recurring problems.

A maintenance structure that depends on heroics is not adequately staffed.

During major incidents, temporary roles matter more than normal titles

When a serious incident occurs, the team's ordinary organizational structure may not be the most effective way to work.

A senior backend engineer may be the technical expert, while another person is better suited to coordinating response.

Useful temporary incident roles include:

  • incident commander;
  • technical lead;
  • communications lead;
  • subject matter experts;
  • support/customer liaison;
  • scribe.

Atlassian's incident-management guidance recommends assigning explicit response roles before or during an incident so coordination, technical investigation and communication do not compete for the same person's attention.
Atlassian: Incident Response Roles and Responsibilities

This is an important distinction.

Your maintenance-team structure defines normal ownership.

Your incident structure defines how those people reorganize when the application is under pressure.

[Internal Link: “Application Incident Response: What Should Happen When Your App Goes Down?”]

Protect engineering time from maintenance toil

A maintenance team can become a ticket-processing machine.

Every day contains:

  • manual restarts;
  • repetitive data corrections;
  • deployment steps;
  • recurring alerts;
  • support escalations.

The team remains busy while the application barely becomes easier to maintain.

Google SRE uses the term toil for repetitive, manual, operational work that grows with the service and does not provide lasting improvement. Its operating model deliberately protects significant engineering capacity for projects that reduce operational burden through automation and system improvement.

An effective maintenance team therefore needs capacity for two kinds of work:

Operate the application today.

and

Make operating it tomorrow easier.

That might mean:

  • automating a repeated recovery procedure;
  • fixing a noisy alert;
  • improving deployment;
  • adding regression tests;
  • removing a recurring defect;
  • improving observability.

If every available hour is consumed by incoming tickets, the team's structure may be adequate for response but inadequate for maintenance.

Create one backlog across planned and discovered work

Different roles often create separate queues.

Support has tickets.

Engineering has bugs.

Security has vulnerabilities.

Infrastructure has upgrade work.

Product has features.

That makes trade-offs difficult.

The maintenance lead should have enough visibility across these streams to understand total workload, even when each system keeps its own operational records.

Microsoft's Operational Excellence guidance recommends using a common, prioritized backlog and transparent planning processes for workload improvements.

The objective is not necessarily one software tool.

It is one prioritization conversation.

Match team structure to application size and criticality

There is no universal maintenance-team org chart.

A useful way to think about structure is by increasing complexity.

Small application: one cross-functional maintenance unit

A smaller application might have:

  • one senior/full-stack engineer;
  • one additional engineer;
  • shared QA;
  • shared DevOps/cloud support;
  • product owner involvement;
  • support escalation path.

Several people wear multiple hats.

The main risks are skill gaps and excessive dependence on one engineer.

Growing application: dedicated maintenance pod

As usage and complexity increase, a dedicated pod may include:

  • maintenance/engineering lead;
  • several application engineers;
  • dedicated or embedded QA;
  • DevOps/SRE capability;
  • product ownership;
  • direct support relationship.

Security, UX and database expertise can still be shared.

This structure provides enough continuity to build deep knowledge of the application without creating every specialist role permanently.

Large or business-critical platform: domain ownership with platform support

Large systems often become too complex for one team to understand deeply.

Maintenance responsibility may therefore be divided by domain:

Customer domain team

Billing domain team

Reporting domain team

Integration domain team

        ↓

Shared platform / SRE / security capabilities

Each team owns a defined part of the application while shared teams provide infrastructure, security and operational capabilities.

DORA's research on loosely coupled teams supports organizational structures where teams can make and release changes within their area without constant dependency on other teams.

The key is that the boundaries in the team structure should correspond reasonably well to boundaries in the software.

Use a responsibility matrix for ambiguous areas

Maintenance problems often occur where everybody assumes somebody else owns the work.

A lightweight responsibility map can prevent that.

For example:

Responsibility

Primary

Backup / Support

Backlog prioritization

Maintenance lead + product

Engineering

Application defects

Application engineering

QA

Regression strategy

QA lead

Engineering

Production infrastructure

SRE / DevOps

App engineering

Security vulnerabilities

Engineering

Security team

Customer issues

Support

Maintenance lead

Database reliability

Backend/data owner

DBA/platform

Incident coordination

Trained incident lead

Engineering lead

You do not need a complex RACI chart for every task.

Use explicit responsibility where ambiguity creates delay.

Measure the team by application outcomes, not ticket throughput

Closing many maintenance tickets can look productive.

It may simply mean the backlog contains many small tickets.

Better questions include:

  • Are recurring defects decreasing?
  • Are production changes becoming safer?
  • Is incident recovery improving?
  • Are users repeatedly reporting the same issues?
  • Is technical knowledge spreading beyond individuals?
  • Is automation reducing manual operational work?
  • Can the team keep dependencies and platforms current without disruptive upgrade projects?

These measures reveal whether the team is improving the condition of the application rather than merely processing work.

That is also where Levelworks' App Health model becomes useful.

A maintenance team can periodically look across relevant health aspects and ask whether it has both technical coverage and organizational ownership.

If performance deteriorates, who owns investigation?

If observability is poor, who improves it?

If users repeatedly struggle, who converts that signal into action?

If nobody can answer, the gap is partly an organizational one.

A practical maintenance-team design checklist

Before finalizing the structure, confirm that you can answer these questions:

Area

What should be clear

Ownership

Who is accountable for overall application maintenance?

Engineering

Who can safely diagnose and change each major part of the app?

Testing

Who owns regression confidence?

Operations

Who owns deployments, monitoring and infrastructure?

Security

Who handles routine and escalated security work?

Support

How do real user issues reach engineering?

Product

Who decides business priority and intended behavior?

Specialists

Which skills are shared rather than permanent?

Coverage

Who backs up critical knowledge and operational responsibilities?

Incidents

Who coordinates, investigates and communicates?

On-call

Is after-hours coverage actually sustainable?

Improvement

Does the team have capacity to reduce recurring maintenance work?

The right answer will look different for every application.

That is the point.

The strongest maintenance teams are built around coverage, not headcount

It is easy to evaluate a maintenance team by counting people.

Four developers. One QA engineer. One DevOps engineer.

Those numbers reveal very little about whether the application is actually covered.

A six-person team can still have nobody who understands database recovery. A three-person team supporting a modest application may have excellent ownership, automation, testing and access to shared specialists when needed.

The stronger test is to look at the application itself and trace responsibility around it.

For every important part of keeping the software healthy, there should be somebody who owns the outcome, somebody who can step in when that person is unavailable, an understood path to specialist expertise, and enough engineering capacity to remove recurring problems rather than merely absorb them.

That is what turns a group of capable individuals into an effective maintenance team.

The roster matters. But what makes it work is that when the application needs defending, changing, recovering or improving, everyone already knows where they are supposed to be.

‍

Continue Reading