philippe kruchten | philippe kruchten's weblog - technical debt...•acquire and deploy in your...

28
Technical Debt: Myths & realities June 2020 Copyright © 2020 by Philippe Kruchten 1 Technical Debt: Myths and realities Philippe Kruchten 9 Jun 2020 Copyright © KESL 2020 1 1 Philippe Kruchten Professor Emeritus University of British Columbia Vancouver, BC Canada [email protected] Founder and president Kruchten Engineering Services Ltd Vancouver, BC Canada [email protected] @pbpk Copyright © KESL 2020 2 2

Upload: others

Post on 15-Mar-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 1

Technical Debt:Myths and realities

Philippe Kruchten

9 Jun 2020 Copyright © KESL 2020 1

1

Philippe Kruchten

Professor EmeritusUniversity of British ColumbiaVancouver, BC [email protected]

Founder and presidentKruchten Engineering Services LtdVancouver, BC [email protected] @pbpk

Copyright © KESL 2020 2

2

Page 2: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 2

Outline

• What is technical debt? • The technical debt landscape• Myths: Limits of the metaphor• Realities: Practical steps

9 Jun 2020 Copyright © KESL 2020 3

Slides will be at Philippe.Kruchten.com/Talks

3

Key takeaways

• All software systems accumulate technical debt, which is different than defects.

• How much technical debt you suffer from depends on the future evolution of the system, not just its past.

• While code-level debt is easier to identify and remediate, architectural debt has the highest cost of ownership.

• Being agile does not make you immune to technical debt.

9 Jun 2020 Copyright © KESL 2020 4

4

Page 3: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 3

Technical Debt

• Metaphor introduced by Ward Cunningham (1992) • Until 2010, often mentioned, rarely studied.• All experienced software developers “feel” it.• It drags long-lived projects and products down

9 Jun 2020 Copyright © KESL 2020 5

5

Origin of the metaphor• Ward Cunningham, at OOPSLA 1992

“Shipping first time code is like goinginto debt. A little debt speeds development so long as it is paid back promptly with a rewrite…The danger occurs when the debt is not repaid. Every minute spent on not-quite-right code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise.”

Cunningham, OOPSLA 19929 Jun 2020 Copyright © KESL 2020 6

6

Page 4: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 4

Technical Debt (S. McConnell)

• Implemented features (visible and invisible) = assets = non-debt

• Type 1: unintentional, non-strategic; poor design decisions, poor coding

• Type 2: intentional and strategic: optimize for the present, not for the future.– 2.A short-term: paid off quickly (refactorings, etc.)

• Large chunks: easy to track• Many small bits: cannot track

– 2.B long-termMcConnell 2007

9 Jun 2020 Copyright © KESL 2020 7

7

Technical Debt (S. McConnell)

• “A design or construction approach that is expedient in the short term but that creates a technical context in which the same work will cost more to do later than it would cost to do now.”

McConnell 2011

9 Jun 2020 Copyright © KESL 2020 8

8

Page 5: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 5

Technical Debt Definition 2016

In software-intensive systems, technical debt is the collection of design or implementation constructs that are expedient in the short term, but set up a technical context that can make future changes more costly or impossible. …. “Managing Technical Debt in Software

Engineering,” Dagstuhl Reports, Vol. 6, Issue 4. http://www.dagstuhl.de/16162.

9 Jun 2020 Copyright © KESL 2020 9

9

Technical Debt Definition

….

Technical debt presents an actual or contingent liability that impacts internal system qualities, primarily maintainability and evolvability.

9 Jun 2020 Copyright © KESL 2020 10

10

Page 6: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 6

Visible

New featuresTe

chno

logi

cal g

apArchitectural debt

Structural debt Code smells

DefectsLow internal quality

Additional functionality Low external quality

Mostly invisible

Test debtDocumentation debt

Evolution issues: evolvability Quality issues: maintainability

Visible

architecture code

Code complexity

Coding style violations

Zürich, May 2012

Technical debt landscape

9 Jun 2020 Copyright © KESL 2020 11

11

9 Jun 2020 Copyright © KESL 2020 12

12

Page 7: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 7

TD in your backlog: negative value, invisible

New featuresAdded functionality

Architectural,Structural features

Defects Technical Debt

Visible Invisible

PositiveValue

NegativeValue

9 Jun 2020 Copyright © KESL 2020 13

13

9 Jun 2020 Copyright © KESL 2020 14

14

Page 8: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 8

Code-level technical debt

• McConnell’s type 1 (and 2.a)• Code smells• Detected by static analysers• Self-admitted technical debt

9 Jun 2020 Copyright © KESL 2020 15

15

Causes

• Schedule pressure• More schedule pressure• Ignorance• Success• Environment evolution– Technical and business

• Sloppiness

9 Jun 2020 Copyright © KESL 2020 16

16

Page 9: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 9

Constant debt reduction

• Make technical debt a visible item on the backlog• Make it visible outside of the software dev. organization• Incorporate debt reduction as a regular activity• Use buffer in longer term planning for yet unidentified

technical debt

9 Jun 2020 Copyright © KESL 2020 17

17

9 Jun 2020 Copyright © KESL 2020 18

18

Page 10: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 10

Types of Architectural debt

• The Minimal Viable Product (MVP) that stuck• The Workaround that stayed• Re-inventing the wheel• Poor separation of concerns• Architectural lock-in• New context, old architecture

9 Jun 2020 Copyright © KESL 2020 19

R. Verdecchia 2020

19

Cause of architectural debt

• Time pressure• Lack of architectural knowledge• Lack of architectural documentation• Human factor: bias, ignorance, etc.

• The passing of time…

9 Jun 2020 Copyright © KESL 2020 20

R. Verdecchia 2020

20

Page 11: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 11

McConnell’s TD litmus test

• “If you are not incurring any interest, then it probably is not a debt.”

McConnell 2013

9 Jun 2020 Copyright © KESL 2020 21

21

Interests

• In presence of technical debt,cost of adding new features is higher;team velocity is lower.

• When repaying (= fixing, remediating), additional cost for retrofitting already implemented features

• Technical debt not repaid => lead to increased cost, forever• Cost of remediating increases over time

M. Fowler, 2009

9 Jun 2020 Copyright © KESL 2020 22

22

Page 12: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 12

Technical debt: Myths

• Ward Cunningham invented technical debt in 1992• Technical debt is just another fancy name for defects• Tools can identify technical debt incurred by a software

system.• We can measure technical debt incurred by a system.• Technical debt is very bad and should be avoided at all

cost.• Agile teams are immune to technical debt

9 Jun 2020 Copyright © KESL 2020 23

23

It’s a metaphor!

9 Jun 2020 Copyright © KESL 2020 24

24

Page 13: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 13

Metaphors

• Metaphors give meaning to form, help ground our conceptual systems.

• Cognitive transfer: source domain to target domain– the <target> is the

<source>

Lakoff and Johnson (1980) Metaphors we live by 25Copyright © KESL 20209 Jun 2020

25

Where the mortgage metaphor breaks…

• Technical debt depends on the future• Technical debt cannot be measured• You can walk away from technical debt• Technical debt should not be completely eliminated• Technical debt cannot be handled in isolation• Technical debt can be a wise investment

9 Jun 2020 Copyright © KESL 2020 26

26

Page 14: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 14

TD: Not a new concept

• Just a new term, exploiting a simple metaphor• Technical debt existed before 1992– Low internal quality

– Software evolution– Design erosion

9 Jun 2020 Copyright © KESL 2020 27

27

TD /= defects

• The software does work.• If it does not, call it a defect, and fix it (calling it

technical debt is just a cop out)• Technical debt does increase the likelihood of

introducing defects => risk !

• Sometimes, but rarely, the boundary is uncertain.

9 Jun 2020 Copyright © KESL 2020 28

28

Page 15: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 15

Contrast:Defect• Visible• External quality• Function of the past

only• Not a good investment• Multiple possible

causes• All systems

Technical debt• Invisible• Internal quality• Function of past and

future• Can be an investment• Mainly triggered by

schedule pressure• Large & long lived

system

9 Jun 2020 Copyright © KESL 2020 29

29

Bring me tools!

• Static analyzers will detect much of type 1 technical debt.

• More significant technical debt items (structure, architectural) cannot be detected by tools.

• Some team members know about them, though….• They may be mentioned in discussions, but not visible in

the code.

9 Jun 2020 Copyright © KESL 2020 30

30

Page 16: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 16

Measuring TD

• To measure is to assign a numerical value to an attribute of a thing

• Cost (Technical debt item) = ?

• Naively, the effort to bring the system to a state where the technical debt is not there anymore.

9 Jun 2020 Copyright © KESL 2020 31

31

• But is this what you really want?

9 Jun 2020 Copyright © KESL 2020 32

32

Page 17: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 17

Potential vs. actual debt

• Potential debt– Looking at what you’ve done so far– Type 1: OK to detect with tools • see I. Gat & co. approach

– Type 2: structural, architectural, or technological gap: Much harder to detect and evaluate

• Actual debt–When you know the way forward

K.Schmid 20139 Jun 2020 Copyright © KESL 2020 33

33

Past? or future? Or both?

• Technical debt is not a mere function of the past (what you have done so far to reach the current state)

• It is also a function of what you want to do in the future

• So the cost cannot be assessed solely based on the current state.

9 Jun 2020 Copyright © KESL 2020 34

34

Page 18: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 18

A Better Metaphor ?

• Unhedged Call Option – Chris Matt (2010), and Steve Freeman (2014)

9 Jun 2020 Copyright © KESL 2020 35

https://www.infoq.com/news/2014/12/call-options-bad-code/

35

Let’s try yet another metaphor

• Tech debt is Not necessarily a bad thing….• Technical debt as an investment

9 Jun 2020 Copyright © KESL 2020 36

36

Page 19: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 19

TD and Real Options

P1: S0

Market loves it+ $4M

Market hates it+ $1M

S1

NPV (P1) = -2M + 0.5x4M + 0.5x1M = 0.5M

-2M

p=0.5

p=0.5

Source: K. Sullivan, 2010at TD Workshop SEI 6/2-3

9 Jun 2020 Copyright © KESL 2020 37

37

TD and Real Options (2)

P2: S0

Market loves it

Market hates it+ $1M

Sd

NPV (P2) = -1M + 0.5x3M + 0.5x1M = 1M

-1M

Source: K. Sullivan, 2010

p=0.5

p=0.5

-1MS1 +4M

Taking Technical Debt has increased system value.

9 Jun 2020 Copyright © KESL 2020 38

38

Page 20: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 20

TD and Real Options (3)

P2: S0

Market loves it

Market hates it+ $1M

Sd

NPV (P3) = -1M + 0.67 x 2.5M + 0.33 x 1M = 1M

-1M

p=0.33

p=0.67

-1.5MS1 +4M

More realistically:Debt + interestHigh chances of success

Take Debt

Repay debt

9 Jun 2020 Copyright © KESL 2020 39

39

TD and Real Options (3)

P2: S0

Market loves it

Market hates it+ $1M

Sd

NPV (P3) = -1M + 0.67 x 2.5M + 0.33 x 1M = 1M

-1M

p=0.33

p=0.67

-1.5MS1 +4M

More realistically:Debt + interestHigh chances of success

Higher chance of success

Repay debt + 50% interest

9 Jun 2020 Copyright © KESL 2020 40

40

Page 21: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 21

TD and Real Options (4)

S0

Favourable

Unfavourable

Sd

p=?

p=?

S1 S2

S2d

…..

…..

Not debt really, but options with different values… Do we want to invest in architecture, in test, etc…

Refactor

Add feature

Add feature

?

Source: K. Sullivan, 20109 Jun 2020 Copyright © KESL 2020 41

41

We are agile, so we’re immune!

In some cases we are agile and therefore we run faster into technical debt

9 Jun 2020 Copyright © KESL 2020 42

42

Page 22: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 22

Agile mottos

• “Defer decision to the last responsible moment”• “YAGNI” = You Ain’t Gonna Need It– But when you do, much later, it is technical debt– Technical debt often is the accumulation of too many YAGNI

decisions• “We’ll refactor this later”• “Deliver value, early”• Tension between Big Upfront Design and Emergence• You’re still agile because you aren’t slowed down by

Tech Debt, yet.9 Jun 2020 Copyright © KESL 2020 43

43

Practical steps

From tactical (and simple) to more strategic (and sophisticated)

9 Jun 2020 Copyright © KESL 2020 44

44

Page 23: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 23

• Tactical– Short-term actions – limited scope– Actual means: use tools, add process steps, make an

immediate plan

• Strategic– Long-term plan – wider scope– Process, management, education– Drive some of the tactical actions above

9 Jun 2020 Copyright © KESL 2020 45

45

Practical steps (1) - Awareness

• Organize a lunch-and-learn with your team to introduce the concept of technical debt. Illustrate it with examples from your own projects, if possible.

• Create a category “TechDebt” in your issue tracking system, distinct from defects or from new features. Point at the specific artifacts involved.

• Standardize on one single form of “Fix me” or “Fix me later” comment in the source code to mark places that should be revised and improved later. They will be easier to spot with a tool.

9 Jun 2020 Copyright © KESL 2020 46

46

Page 24: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 24

Practical steps (2) - Identification

• Acquire and deploy in your development environment a static code analyzer to detect code-level “code smells”. (Do not panic in front of the large number of positive warnings).

• After some “triage” feed them in the issue tracking system, in the tech debt category

• At each development cycle (iteration), reduce some of the technical debt by explicitly bringing some tech debt items into your iteration or sprint backlog.

9 Jun 2020 Copyright © KESL 2020 47

47

Practical steps (3) - Evaluation

• For identified tech debt items, give not only estimates of the cost to “reimburse” them or refactor them (in staff effort), but also estimate of the cost to not reimburse them: how much it drags the progress now. At least describe qualitatively the impact on productivity or quality. This can be assisted by tools from your development environment, to look at code churn, and effort spent.

• Prioritize technical debt items to fix or refactor, by doing them first in the parts of your code that are the most actively modified, leaving aside or for later the parts that are never touched.

9 Jun 2020 Copyright © KESL 2020 48

48

Page 25: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 25

Practical Steps (4) Architectural debt

• Refine in your issue tracker the TechDebt category into 2 subcategories: simple, localized, code-level debt, and wide ranging, structural or architectural debt.

• Acquire and deploy a tool that will give you hints about structural issues in your code: dependency analysis

9 Jun 2020 Copyright © KESL 2020 49

49

Practical Steps (5) Architectural debt

• Organize small 1-hour brainstorming sessions around the question: “What design decision did we make in the past that we regret now because it is costing us much?” or “If we had to do it again, what should have we done?” – This is not a blame game, or a whining session; just identify

high level structural issues, the key design decisions from the past that have turned to technical debt today.

9 Jun 2020 Copyright © KESL 2020 50

50

Page 26: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 26

Practical steps (6) – Process improvements

• For your major kinds of technical debt, identify the root cause –schedule pressure, process or lack of process, people availability or turn over, knowledge or lack of knowledge, tool or lack of tool, change of strategy or objectives– and plan specific actions to address these root causes, or mitigate their effect.

• Develop an approach for systematic regression testing, so that fixing technical debt items does not run you in the risk of breaking the code. – Counter the “It is not really broken, so I won’t fix it.”

• If you are actively managing risks, consider bringing some major tech debt items in your list of risks.

9 Jun 2020 Copyright © KESL 2020 51

51

So Technical debt…

• … it’s messy

• Cannot isolate or tokenize– Lots of dependencies

• Cannot assess easily– Cost and value dependent on future evolution

• Polymorphic– Good & bad, costly and beneficial, harmful and innocuous

9 Jun 2020 Copyright © KESL 2020 52

52

Page 27: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 27

Key takeaways

• All software systems accumulate technical debt, which is different than defects.

• How much technical debt you suffer from depends on the future evolution of the system, not just its past.

• While code-level debt is easier to identify and remediate, architectural debt has the highest cost of ownership.

• Being agile does not make you immune to technical debt.

9 Jun 2020 Copyright © KESL 2020 53

53

Reading on Technical debt

9 Jun 2020 Copyright © KESL 2020 54

June 2019Addison-WesleyProfessionalBoston272 p.978-0135645932

Also e-book EPUB, MOBI, and PDFfromInformit.com

54

Page 28: Philippe Kruchten | Philippe Kruchten's Weblog - Technical Debt...•Acquire and deploy in your development environment a

Technical Debt: Myths & realities June 2020

Copyright © 2020 by Philippe Kruchten 28

9 Jun 2020 Copyright © KESL 2020 55

Slides will be at Philippe.Kruchten.com/Talks

55