Why the obvious metrics backfire
Lines of code, commit counts, tickets closed and hours online are easy to count, which is exactly why they get used. The trouble is that each one rewards a behavior you do not want. Count lines and you get verbose code. Count commits and you get tiny commits. Count closed tickets and hard problems get split into many small ones, or avoided entirely.
This is Goodhart's law in practice: once a measure becomes a target, it stops being a good measure. Engineers are very good at optimizing systems, and a metric attached to their performance review is a system.
Activity percentages have the same problem. Keyboard and mouse counts tell you someone was at the computer. They do not tell you whether that person was designing a data model, reading a spec, or pairing on a bug with the screen shared. Some of the most valuable engineering work, such as thinking through a design or reviewing someone else's change, produces very little input.
Measure the system, not the person
The measures that hold up are about how work moves through the team as a whole. The four DORA metrics are a widely used starting point:
- Deployment frequency: how often you ship to production.
- Lead time for changes: how long a change takes from commit to running in production.
- Change failure rate: how often a deployment causes a problem that needs fixing.
- Time to restore service: how long it takes to recover when something breaks.
Alongside those, watch the places where work waits: pull requests waiting for review, tickets blocked on another team, and the number of things each person has in progress at once. Waiting time is usually where delivery slows down, and it is rarely one person's fault.
Use time data to ask questions, not to deliver verdicts
Tracked time is still useful when it is treated as a map of where effort went rather than a score. At the team level it can answer questions that are otherwise guesswork:
- How much of the week went to planned work versus interruptions and support?
- Which projects are consuming more time than their estimates suggested?
- Are meetings leaving anyone long enough blocks of time to focus?
- Is someone spreading themselves across too many tasks at once?
Each of those is a conversation starter. If a project is running over, the useful response is to find out why: unclear requirements, a hidden dependency, or an estimate that was optimistic. If one person's time is scattered across five tasks, the fix is usually prioritization, not effort.
What time data should not do is rank individuals against each other. Two engineers with the same hours can have delivered very different value, and the one with fewer tracked hours may have spent the rest of the day unblocking others.
Pair the numbers with context only people can give
Numbers tell you that something changed. People tell you why. The cheapest way to collect that context is a short written update each working day: what I did, what I am doing next, and what is in my way.
Read side by side with the tracked day, an update turns a confusing number into an obvious story. A day with low activity and an update that says "spent the afternoon reading the payments API docs before the integration" needs no follow-up. A blocker that has appeared in three updates in a row needs one today. Our guide to async daily standups covers how to run updates so they stay useful.
Make it transparent, or it will feel like surveillance
Whether measurement feels supportive or invasive depends less on what you collect than on how openly you do it. A few rules go a long way:
- Publish exactly what is collected, when, and who can see it. No surprises.
- Give every engineer the same view of their own data that their lead has.
- Never capture keystroke contents or read files. Counting input events is not the same as logging what someone typed.
- Treat automated flags as prompts for a human to look, not as conclusions.
- Agree up front what the data will not be used for, such as stack-ranking, and stick to it.
A weekly routine for engineering leads
Measurement only helps if someone looks at it on a schedule and acts. This routine takes about half an hour a week:
- Monday: scan last week's delivery measures (lead time, review wait, work in progress) for anything that moved sharply.
- Daily, five minutes: read the team's updates and note any blocker that is more than a day old.
- Midweek: compare time spent per project with the plan, and raise any gap with the project owner.
- Friday: pick one bottleneck to remove next week, and tell the team which one.
- In one-to-ones: bring the data as a shared reference, and let the engineer explain it first.
What to avoid
- Leaderboards of hours, commits or activity levels.
- Setting targets on a metric the team cannot see or influence.
- Reacting to a single low-activity day without reading the context.
- Measuring everything because it is available. Pick the few numbers you will act on.
How Colabio supports this approach
Colabio was built around the idea of context over counts. The desktop app for macOS, Windows and Linux tracks time against tasks, with activity levels and screenshots per tracked slot. Editors, terminals, docs and Git hosts are classified as work, and it never records keystrokes as text or reads file contents.
Each member's written daily update sits next to their tracked day, and engineers see their own time, screenshots and activity, not just their manager. Leads get a team view with per-project time and a coverage view of who has posted updates. See how that looks for engineering teams and for individual developers.