Technical Debt

An Interest-ing Topic

( ↑ This is a pun, not a promise that you won't fall asleep)

What's Going To Happen

  • What is Technical Debt?
  • What effects does it have?
  • How to recognize it
  • How to avoid it
  • When should you eliminate it?

What Is Technical Debt?

“work that needs to be done before a particular job can be considered complete or proper”
“a concept in programming that reflects the extra development work that arises when code that is easy to implement in the short run is used instead of applying the best overall solution”
“a debt that you incur everytime you avoid doing the right thing (like refactoring, removing duplication/redundancy) letting the code quality deteriorate over time”
“if you cut corners in the short-term, you’re basically borrowing against the future maintainability of the software and that at some point, not unlike a credit card”

What Is Technical Debt?

“Code design that negatively affects the amount of effort it would take to implement a new feature.”
Me - Just now

Explaining The Metaphor

The 'debt' metaphor is appropriate because technical debt behaves like monetary debt; the longer you leave technical debt around, the more engineering effort is needed to pay it back. Your original debt incurs interest and needs more money to pay the whole debt off.

A few appropriate lessons can be extended from the metaphor:

  • Paying off a debt earlier is cheaper
  • It's preferable to not be in debt
  • .... but sometimes it is a good business decision to incur debt for a specific purpose

What effects does it have?

  • Increases likelyhood of bugs being introduced
  • Slows down development
  • Encourages sloppyness
  • Demotivates developers
  • Makes it harder for new starters to understand the code, clean code is clear code
  • Can generate bad feeling between teams working on the same code-base

How to recognize it?

  • Coding a feature takes alot longer than expected
  • Intuitive 'feeling' or knowing that a feature could be coded a lot faster if the code was designed in a different way
  • People groan when they have to change a certain source file

How to recognize it?

    
    if (thing === "some string") {
    	...
    } else {
    	...
    }
    						
    expanding to
    
    if (thing === "some string") {
    	...
    } else if (thing === "some other string") {
    	...
    } else {
    	...
    }
    						

How to avoid it?

  • Look ahead
  • Code reviews
  • Pair programming
  • Care about it

When should you deal with it?

Try to avoid it in the first place! (some will creep in anyway)

  • "If we all checked-in our code a little cleaner than when we checked it out, the code simply could not rot" - Robert C. Martin (Clean Code)
  • Create separate Technical Debt tasks (JIRA has them in a separate category, like Story, Bug etc)

The Definition(s) of Done

What's Going To Happen

  • What is a Definition of Done?
  • Things that tend to be on one
  • How does it help?
  • How to make one
  • When to change it

What is a Definition of Done?

Firstly, you can have a Definition of Done for various levels:
  • Story
  • Sprint
  • Release to Staging
  • Release to Live

What is a Definition of Done?

A list of things which must be completed for a Story (Sprint, Release etc) to be considered absolutely finished.

Things that tend to be on one (for a Story)

  • Unit tested
  • Integration tested
  • System tested
  • Design approved
  • Code reviewed
  • Technical Debt free

Things that tend to be on one (for a Release)

  • Performance tested
  • Full security tested
  • Disaster recovery tested
  • Documentation written
  • User guide written

An example

  • Has the story been reviewed by another developer?
  • Have UI changes been reviewed by the designer?
  • Has story been reviewed by PO?
  • Can the story be demonstrated?
  • Have the security and privacy implications of the change been assessed and noted down in the security overview?
  • Have you considered the effect of any migrations you have written on pre-existing code using the data before the migration?
  • Has the story been tested by a QA Engineer?
  • Has all new text in the app been translated into all supported languages

How does it help?

  • Gives a defined, shared understanding of whether a story is done
  • Makes it clear what is left to do
  • Stops there being "hidden" work
  • A statement of intent for the team and what they value
  • Removes the need for "hardening" sprints
  • Shows you where speed ups can occur
  • Makes it clear what PO can and can't expect from a story

How to make one

Look online for examples to get you started or refer to the one shown earlier.
Involve the whole team.

How to make one

What about multiple teams?
Shared helps but need team to agree

When to change it

Should be kept up-to-date, retrospectives are a good place to get feedback on it.
But you do want it to settle
Misc
  • Definition of Ready

Takeaways

Technical Debt
  • Developers - Incurring debt can be a sensible business decision
  • Product Owners - Paying off your debt will allow you to get more features done, faster
Definition of Done
  • Important to note what is NOT in the Definiton of Done but has been thought of
  • Can really set the tone of what standards are expected in Engineering

Questions?

  • ?????
  • ?
  • ???