As semi-scientific software professionals, we like the idea of measuring our work. In some cases, our bosses like the idea much more than we do. Yet, meaningful software development metrics are notoriously challenging to define, and many people have given up trying because metrics often incentivize pathological behaviors. Since you get what you measure, most metrics lead development teams to optimize numeric proxies for success rather than the goals these proxies were intended to represent. Mindful of the pitfalls of quantifying knowledge work, Stephen Frein examines some typical software development metrics and why measuring them tends to be harmful. Then he recommends alternate metrics—such as “truck number”—that give software development teams a chance to engage in meaningful measurement with a lower risk of harmful side effects. If you want or need to measure your team’s success without ruining it, join Stephen for helpful advice.
2. Stephen Frein
Comcast
Stephen Frein is a software development manager at Comcast, where his team creates tools
for process automation and quality assurance. As an adjunct professor at Drexel University, he
delivers soporific lectures on database development and IT management. Stephen has been
leading development teams for fifteen years, and occasionally does it well, mostly by dint of
accidents he cannot reliably replicate. He has presented at previous conferences by sneaking
into unused rooms and deceiving the unsuspecting. Stephen enjoys polluting the hive mind
via frein.com and writing vapid, self-deprecating bios.
7. You can't do that.
Quit it.
Stop it.
-- Joel Spolsky
We have no way of reasonably
W h
f
bl
measuring productivity.
-- Martin Fowler
You get what you measure.
Is that h t
I th t what you want?
t?
8. LOC
Lines of Code
More is Better!
public Cost calculateShipmentCost(Order someOrder) {
Cost shipCost = new Cost(0);
if (someOrder.getTotalCost() < 25) { shipCost.setCost(10); }
else { shipCost.setCost(5); }
return shipCost;
9 LOC
}
public Cost calculateTotalCost(Order someOrder) {
return someOrder.getTotalCost().add(
calculateShipmentCost(someOrder).getCost() );
}
public Cost calculateReturnRefund(Order someOrder) {
// only half of shipping costs get refunded
return someOrder.getTotalCost().add(
calculateShipmentCost(someOrder).getCost()/2) );
}
9. public Cost calculateTotalCost(Order someOrder) {
Cost shipCost = new Cost(0);
if (someOrder.getTotalCost() < 25) { shipCost.setCost(10); }
else { shipCost.setCost(5.00); }
return someOrder.getTotalCost().add(
shipCost.getCost()
shipCost getCost() );
}
public Cost calculateReturnRefund(Order someOrder) {
Cost shipCost = new Cost(0);
if (someOrder.getTotalCost() < 25) { shipCost.setCost(10); }
else { shipCost.setCost(5.00); }
p
(
)
// only half of shipping costs get refunded
return someOrder.getTotalCost().add(
shipCost.getCost()/2 );
}
10 LOC
Trade-offs
Maintainability
“Productivity”
Productivity