5 Developer productivity metrics you should measure

September 26, 2024

5 Developer productivity metrics you should measure

Ready to start?

As software development becomes increasingly complex, developers are expected to take on more responsibility along the path to production. Most developers don’t have the working experience necessary to interact with cloud platforms like Kubernetes or Terraform, even though they must regularly use them to deploy to production. This cognitive load affects their ability to maintain productivity and velocity.

As a result, developers often spend more time pushing features to production than coding. They lose time to things like writing unfamiliar code for Terraform modules, which can not only delay production but introduce security risks and other vulnerabilities that will either degrade the production environment or require repeated effort to resolve them (or both).

To address pain points like these and drive continuous improvement, engineering managers need to find ways to understand their teams’ performance and areas for improvement. But where should managers start?

We’ll discuss five developer productivity metrics in this post and how they contribute to overall business success. 

What are developer productivity metrics?

Developer productivity metrics are a subset of engineering metrics designed to help managers keep better track of work and provide developers with a clear picture of success. They encompass people metrics, process metrics, project metrics, and code metrics.

When enabled effectively, developer productivity metrics help you understand the speed, quality, and frequency of developers’ work across the software development lifecycle. There are five primary developer productivity metrics:

  1. Lead time to change — how long it takes to push a working piece of code to production
  2. Deployment frequency — how often deployments occur
  3. Change failure rate — how frequently deployments fail
  4. Mean time to recovery (MTTR) — how quickly your teams can resolve issues and return to normal production after incidents
  5. Overall cycle time — how long a feature is in production, from coding to deployment

You may notice that these are similar to DORA metrics — and while that is true, these metrics can be applied more generally than just to DevOps and provide deeper insight into where and how your developers lose productivity. 

In addition to productivity, these metrics help you identify better ways of working and implement best practices in the form of working agreements, which make life easier for developers and managers alike by increasing transparency. 

Why measure developer productivity?

Measuring developer productivity is important because it can:

  • Help reduce costs
  • Provide insight into areas for improvement
  • Surface previously unreported or unknown slowdowns that were considered normal
  • Highlight where and how R&D teams have added value to the company, with specifics

Before DevOps and DORA metrics, it was difficult to measure developer productivity because it was difficult to understand the relationship between developers’ input and output. Work such as building new features and releasing them to production was not easily measured or tracked using a time metric (i.e., hours worked) because a feature that took a day to produce is not necessarily worse or less important than a feature that took a month to produce. 

Similarly, lengthy development times did not necessarily mean that a process was overly complex or that a developer ran into too many problems to reach deployment on time — the problems were more complex, and often related to the quality of code deployed earlier on in the development process.

On another note, it’s important to measure developer productivity in relation to developer experience. Developer productivity and experience are not the same thing, though they are typically tightly coupled. 

Consider the above example again: if a feature took six hours to reach deployment, measuring both developer experience metrics and developer productivity metrics will help you determine whether:

  1. The developer had a poor experience — they couldn’t find what they were looking for or were unable to access a tool they needed, or 
  2. The developer was not as productive as they could have been — their pull request languished in the review stage for four of the six hours of lead time

How to measure developer productivity

If you aren’t currently measuring developer productivity, start by surveying your developers about their experience working in your specific software development environment. Build a thorough survey that asks your developers about:

  • Pain points — where do things become difficult?
  • Blockers — how and when are developers prevented from or unable to continue doing work?
  • Workloads —  is part of your team suffering from a case of Ticket Ops?
  • Cognitive load — similar to the above, is part of your team slogging through work others can support?
  • Clarity and quality — does your team understand what “good” code looks like? 

Understanding your developers' pain points in terms of what, where, when, why, and how is a great place to begin making improvements. Knowing what needs to be done helps you plan with your teams to fix workflows and establish better practices. 

If you don’t have anything in place, other resources, such as industry baselines, also exist to help you:

  • Gauge your current software development quality and velocity
  • Establish improvement benchmarks
  • Measure and track developer productivity
  • Set standards for development

You should still use these as a supplement to your developer survey results, as those will be most applicable to your team.

Improving developer productivity with an open internal developer portal

If you’re looking for a quick fix — don’t skip the survey. Instead, take your results and use them to establish working agreements that give your developers a clear productivity goal to work towards.

If your survey results say developers are tired of waiting multiple days for a PR review, consider setting a working agreement that PRs must be reviewed within one day of submission. This can then be measured and tracked as a way of understanding productivity. 

Where can this be tracked, you ask? In an open internal developer portal! A portal unifies your software development platform into a single UI, which then enables self-service actions for developers to complete common actions and provides methods for setting and communicating baselines, tracking work, and establishing team-wide initiatives. 

Platform engineering has also emerged as a discipline focused on prioritizing developer productivity. Platform engineers build and orchestrate the development platform, which consists of all the different software needed to deploy to production. There are many platform engineering and software engineering intelligence tools available to help measure a variety of developer and engineering metrics.

But the best part about platform engineers — who are responsible for building, maintaining, and iterating on the portal — is that they can create new workflows in the portal UI, and abstract away all of the complexity that comes with deployment, cloud technologies, and AppSec. 

Using a portal, platform engineers are empowered to design workflows, self-service actions, and scorecards specifically for your team, using the results from your developer survey to build solutions that are as unique as your tech stack.

Ultimately, the most important first step is to understand the problem you and your teams are facing. Every situation and software development lifecycle is unique, and comes with its own individual challenges — so, from the jump, you are the best person to solve them!

If you take your survey results seriously and engage your platform engineers like product managers whose focus is on improving the experience of their developers, you should see an improvement in every developer productivity metric. 

Curious about Port’s open internal developer portal? Imagine your future using our open demo. Happy building!

{{cta_1}}

Check out Port's pre-populated demo and see what it's all about.

Check live demo

No email required

{{cta_2}}

Contact sales for a technical product walkthrough

Let’s start
{{cta_3}}

Open a free Port account. No credit card required

Let’s start
{{cta_4}}

Watch Port live coding videos - setting up an internal developer portal & platform

Let’s start
{{cta_5}}

Check out Port's pre-populated demo and see what it's all about.

(no email required)

Let’s start
{{cta_6}}

Contact sales for a technical product walkthrough

Let’s start
{{cta_7}}

Open a free Port account. No credit card required

Let’s start
{{cta_8}}

Watch Port live coding videos - setting up an internal developer portal & platform

Let’s start
{{cta-demo}}
{{reading-box-backstage-vs-port}}

Example JSON block

{
  "foo": "bar"
}

Order Domain

{
  "properties": {},
  "relations": {},
  "title": "Orders",
  "identifier": "Orders"
}

Cart System

{
  "properties": {},
  "relations": {
    "domain": "Orders"
  },
  "identifier": "Cart",
  "title": "Cart"
}

Products System

{
  "properties": {},
  "relations": {
    "domain": "Orders"
  },
  "identifier": "Products",
  "title": "Products"
}

Cart Resource

{
  "properties": {
    "type": "postgress"
  },
  "relations": {},
  "icon": "GPU",
  "title": "Cart SQL database",
  "identifier": "cart-sql-sb"
}

Cart API

{
 "identifier": "CartAPI",
 "title": "Cart API",
 "blueprint": "API",
 "properties": {
   "type": "Open API"
 },
 "relations": {
   "provider": "CartService"
 },
 "icon": "Link"
}

Core Kafka Library

{
  "properties": {
    "type": "library"
  },
  "relations": {
    "system": "Cart"
  },
  "title": "Core Kafka Library",
  "identifier": "CoreKafkaLibrary"
}

Core Payment Library

{
  "properties": {
    "type": "library"
  },
  "relations": {
    "system": "Cart"
  },
  "title": "Core Payment Library",
  "identifier": "CorePaymentLibrary"
}

Cart Service JSON

{
 "identifier": "CartService",
 "title": "Cart Service",
 "blueprint": "Component",
 "properties": {
   "type": "service"
 },
 "relations": {
   "system": "Cart",
   "resources": [
     "cart-sql-sb"
   ],
   "consumesApi": [],
   "components": [
     "CorePaymentLibrary",
     "CoreKafkaLibrary"
   ]
 },
 "icon": "Cloud"
}

Products Service JSON

{
  "identifier": "ProductsService",
  "title": "Products Service",
  "blueprint": "Component",
  "properties": {
    "type": "service"
  },
  "relations": {
    "system": "Products",
    "consumesApi": [
      "CartAPI"
    ],
    "components": []
  }
}

Component Blueprint

{
 "identifier": "Component",
 "title": "Component",
 "icon": "Cloud",
 "schema": {
   "properties": {
     "type": {
       "enum": [
         "service",
         "library"
       ],
       "icon": "Docs",
       "type": "string",
       "enumColors": {
         "service": "blue",
         "library": "green"
       }
     }
   },
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "system": {
     "target": "System",
     "required": false,
     "many": false
   },
   "resources": {
     "target": "Resource",
     "required": false,
     "many": true
   },
   "consumesApi": {
     "target": "API",
     "required": false,
     "many": true
   },
   "components": {
     "target": "Component",
     "required": false,
     "many": true
   },
   "providesApi": {
     "target": "API",
     "required": false,
     "many": false
   }
 }
}

Resource Blueprint

{
 “identifier”: “Resource”,
 “title”: “Resource”,
 “icon”: “DevopsTool”,
 “schema”: {
   “properties”: {
     “type”: {
       “enum”: [
         “postgress”,
         “kafka-topic”,
         “rabbit-queue”,
         “s3-bucket”
       ],
       “icon”: “Docs”,
       “type”: “string”
     }
   },
   “required”: []
 },
 “mirrorProperties”: {},
 “formulaProperties”: {},
 “calculationProperties”: {},
 “relations”: {}
}

API Blueprint

{
 "identifier": "API",
 "title": "API",
 "icon": "Link",
 "schema": {
   "properties": {
     "type": {
       "type": "string",
       "enum": [
         "Open API",
         "grpc"
       ]
     }
   },
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "provider": {
     "target": "Component",
     "required": true,
     "many": false
   }
 }
}

Domain Blueprint

{
 "identifier": "Domain",
 "title": "Domain",
 "icon": "Server",
 "schema": {
   "properties": {},
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {}
}

System Blueprint

{
 "identifier": "System",
 "title": "System",
 "icon": "DevopsTool",
 "schema": {
   "properties": {},
   "required": []
 },
 "mirrorProperties": {},
 "formulaProperties": {},
 "calculationProperties": {},
 "relations": {
   "domain": {
     "target": "Domain",
     "required": true,
     "many": false
   }
 }
}
{{tabel-1}}

Microservices SDLC

  • Scaffold a new microservice

  • Deploy (canary or blue-green)

  • Feature flagging

  • Revert

  • Lock deployments

  • Add Secret

  • Force merge pull request (skip tests on crises)

  • Add environment variable to service

  • Add IaC to the service

  • Upgrade package version

Development environments

  • Spin up a developer environment for 5 days

  • ETL mock data to environment

  • Invite developer to the environment

  • Extend TTL by 3 days

Cloud resources

  • Provision a cloud resource

  • Modify a cloud resource

  • Get permissions to access cloud resource

SRE actions

  • Update pod count

  • Update auto-scaling group

  • Execute incident response runbook automation

Data Engineering

  • Add / Remove / Update Column to table

  • Run Airflow DAG

  • Duplicate table

Backoffice

  • Change customer configuration

  • Update customer software version

  • Upgrade - Downgrade plan tier

  • Create - Delete customer

Machine learning actions

  • Train model

  • Pre-process dataset

  • Deploy

  • A/B testing traffic route

  • Revert

  • Spin up remote Jupyter notebook

{{tabel-2}}

Engineering tools

  • Observability

  • Tasks management

  • CI/CD

  • On-Call management

  • Troubleshooting tools

  • DevSecOps

  • Runbooks

Infrastructure

  • Cloud Resources

  • K8S

  • Containers & Serverless

  • IaC

  • Databases

  • Environments

  • Regions

Software and more

  • Microservices

  • Docker Images

  • Docs

  • APIs

  • 3rd parties

  • Runbooks

  • Cron jobs

Starting with Port is simple, fast and free.

Let’s start