SlideShare a Scribd company logo
The Technical Debt Trap
Michael J Norton
@DocOnDev
LeanDog LLC*

*The views expressed are not necessarily the views of LeanDog LLC
 (but they could be)
Rant.begin
What is Technical Debt?
What is Technical Debt?
Ward Cunningham




           oopsla’92
What is Technical Debt?
Ward Cunningham
Shipping first time code is
like going into debt.




                   oopsla’92
What is Technical Debt?
Ward Cunningham
Shipping first time code is
like going into debt.
 A little debt speeds
development so long
as it is paid back
promptly with a
rewrite.
                   oopsla’92
What is Technical Debt?
Ward Cunningham
The danger occurs
when the debt is not
repaid.

Every minute spent on not-
quite-right code counts as
interest on that debt.

                   oopsla’92
What is Technical Debt?
Ward Cunningham
The danger occurs
when the debt is not
repaid.

Every minute spent on not-
quite-right code counts as
interest on that debt.

                   oopsla’92
Technical Debt is a Good Idea
Technical Debt is a Good Idea



 WTF?
Technical Debt is a Good Idea
Strategic Design Decision
Technical Debt is a Good Idea
Strategic Design Decision
Allow for Rapid Delivery
To Elicit Quick Feedback
And Correct Design
Technical Debt is a Metaphor
Here Be Danger
Metaphors Rock
 We reason by analogy

Can’t keep running
   at this pace

       Building on a weak foundation
                         Puts pressure on
 It’s raining men          our design
Metaphors Rock
 We reason by analogy

Can’t keep running
   at this pace

       Building on a weak foundation
                         Puts pressure on
 It’s raining men          our design
      (hallelujah)
Metaphorphosis
When Metaphors go wrong




    Prudent
Metaphorphosis
 When Metaphors go wrong

     Return on Investment
Short-Term Fraudulent       Credit Card
          Inadvertent RecklessScheme
                         Pyramid    Debt
   Auto Loan
High Interest in the Third Quadrant
                      Home Loan Voluntary
  Intentional Loan Shark Long-Term
        Prudent Student Loan
Pragmatic Leverage             Operational
Metaphorphosis
Metaphorphosis
 When Metaphors go wrong
“cut a lot of corners”
      James Shore
    http://jamesshore.com/Blog/CardMeeting/Voluntary-Technical-Debt.html




       “quick and dirty”
                                                                     Martin Fowler
      “sloppy”
                                                                      http://www.martinfowler.com/bliki/TechnicalDebt.html




      David Laribee                                                                                                           “just hack it in”
   http://msdn.microsoft.com/en-us/magazine/ee819135.aspx
                                                                                                                             Steve McConnell
                                                                                                                        http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx
Technical Debt Quadrant




      http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
That’s not what I said
Ward Cunningham

[Many] have explained the debt metaphor
and confused it with the idea that
you could write code poorly with
the intention of doing a good job later.
http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded   youtube.com 2009
That’s not what I said
Ward Cunningham

[Many] have explained the debt metaphor
and confused it with the idea that
you could write code poorly with
the intention of doing a good job later.
http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded   youtube.com 2009
That’s not what I said
Ward Cunningham

... confused it with
the idea that you
could write code
poorly ...            youtube.com 2009
Clean Code is Required
Ward Cunningham

The ability to pay back debt [...]
depends upon you writing code that
is clean enough to be able to refactor
as you come to understand your
problem.                     youtube.com 2009
Clean Code is Required
Ward Cunningham

The ability to pay back debt [...]
depends upon you writing code that
is clean enough to be able to
refactor as you come to
understand your problem.  youtube.com 2009
Dirty Code is a Bad Idea
Ward Cunningham
Dirty code is to technical debt as the
pawn broker is to financial debt.

Don't think you are ever going to get
your code back.
http://twitter.com/WardCunningham/status/3742903303   twitter 2009
Is it Technical Debt?
Ask yourself...
Is the code clean?
Is the code tested?
Is there a learning objective?
Is there a plan for payback?
Is the business truly informed?
Is it Technical Debt?
If you said no to even one
Is the code clean?
Is the code tested?
Is there a learning objective?
Is there a plan for payback?
Is the business truly informed?
       Then you don’t have Technical Debt
You have a mess
Mess (noun)
1. Disorderly accumulation, heap, or jumble
2. A state of embarrassing confusion
3. An unpleasant or difficult situation
You have cruft
Cruft (noun)
1. An unpleasant substance
2. The result of shoddy construction
3. Redundant, old or improperly written code
Chill. It’s just semantics, man.
Chill. It’s just semantics, man.
JUST Semantics?

Technical Debt is Good
Chill. It’s just semantics, man.
JUST Semantics?

            Technical Debt is Good
Chill. It’s just semantics, man.
JUST Semantics?

Quick and Dirty is Technical Debt is Good
Chill. It’s just semantics, man.
JUST Semantics?

Quick and Dirty is Good
Chill. It’s just semantics, man.
JUST Semantics?

Quick and Dirty is Good
Technical Debt Quadrant
Technical Debt Quadrant
             “Let’s deploy and
                gather more
               information.”
“Technical Debt”
     in Other Industries
Construction




      http://www.constructionmanagementschools.net/wp-content/uploads/2010/04/construction-mistakes-18.jpg
“Technical Debt”
     in Other Industries
Construction




  Reckless and Deliberate


      http://www.constructionmanagementschools.net/wp-content/uploads/2010/04/construction-mistakes-18.jpg
“Technical Debt”
     in Other Industries
Automotive




             http://blog.ivman.com/wp-content/HomeRepair.jpg
“Technical Debt”
     in Other Industries
Automotive




  Reckless and Deliberate


             http://blog.ivman.com/wp-content/HomeRepair.jpg
“Technical Debt”
     in Other Industries
Medical




          http://www.scientificamerican.com/media/inline/blog/Image/MedicalError.jpg
“Technical Debt”
     in Other Industries
Medical




 Reckless and Inadvertent


          http://www.scientificamerican.com/media/inline/blog/Image/MedicalError.jpg
Technical Debt Quadrant
             “Let’s deploy and
                gather more
               information.”
Technical Debt Quadrant
             ible   “Let’s deploy and
          ns           gather more
        o
      sp
                      information.”

 Ir re
Technical Debt Quadrant
               ible   “Let’s deploy and
           n s           gather more
         o
      sp
                        information.”

 Ir re


                n t
            e te
      m p
 In co
Technical Debt Quadrant
                 le             ic al
             s ib     “Let’s deploy and
                              n
                            h t
         o n             gather more
                       ec eb
      sp
                        information.”
                      T
 Ir re                      D


                n t
            e te
      m p
 In co
Cruft or Debt?
DataSet aDs, qDs;
aDs = _dbConnector.UpdateAgentList();
qDs = _dbConnector.GetQueueList();
foreach (DataTable aTable in aDs.Tables) {
  foreach (DataRow aRow in aTable.Rows) {
    foreach (DataColumn aColumn in aTable.Columns) {
      DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId
      foreach (DataTable asTable in asDs.Tables) {
        foreach (DataRow asRow in asTable.Rows) {
          foreach (DataColumn asColumn in asTable.Columns) {
            foreach (DataTable qTable in qDs.Tables) {
               foreach (DataRow qRow in qTable.Rows) {
                 foreach (DataColumn qColumn in qTable.Columns) {
                   DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString());
                   foreach (DataTable sqTable in sqDs.Tables) {
                     foreach (DataRow sqRow in sqTable.Rows) {
                       foreach (DataColumn sqColumn in sqTable.Columns) {
                         foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) {
                           if (skill == asRow[asColumn].ToString()) {
                             try {
                               _dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(),
                                 qRow[qColumn].ToString(),
                                 skill);
                             }
                             catch { continue; }
}}}}}}}}}}}}}}


                                   http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
Cruft or Debt?


DataSet aDs, qDs;
aDs = _dbConnector.UpdateAgentList();




                                   http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
Cruft or Debt?

if ((customer.state == “AL” && customer.type ==
CustomerType.GENERAL_AGENT && customer.revenue > 100000)
   || (customer.type == CustomerType.RETRO_AGENT &&
      (customer.state == “WI” || customer.state == “IL”))
   || (customer.type == CustomerType.FED_MANAGEMENT &&
      customer.revenue > 150000)) { ... }
Cruft or Debt?


if (customer.isFederallyRegulated()) { ... }
Cruft or Debt?

double getSpeed() {
    switch (_type) {
      case EUROPEAN:
        return getBaseSpeed();
      case AFRICAN:
        return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;
      case NORWEGIAN_BLUE:
        return (_isNailed) ? 0 : getBaseSpeed(_voltage);
    }
    throw new RuntimeException ("Should be unreachable");
  }




                    http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
Cruft or Debt?
class Swallow ...
   double getSpeed() { return getBaseSpeed(); }
end class

class EuropeanSwallow ...
end class

class AfricanSwallow ...
   double getSpeed() { return super.getSpeed - coconutLoad(); }
   double coconutLoad() { return getLoadFactor() * _numberOfCoconuts; }
end class

class NorwegianSwallow ...
   double getSpeed() { return (_isNailed) ? 0:getBaseSpeed(_voltage); }
end class
Messy Code is a Bad Decision
Every Time
Messy Code is a Bad Decision
Every Time
 You are a professional developer
             (Professionals behave ethically)
Messy Code is a Bad Decision
Every Time
 You are a professional developer
               (Professionals behave ethically)

 You are going to create unintentional cruft
             (You can’t help it. It’s unintentional.)
Messy Code is a Bad Decision
Every Time
 You are a professional developer
               (Professionals behave ethically)

 You are going to create unintentional cruft
             (You can’t help it. It’s unintentional.)

 You have to clean up the existing cruft
             (Intent doesn’t alter Responsibility)
Grammy Doesn’t Love Me!
Setting Expectations
The Trap
Mess begets mess
The Trap
Mess begets mess
 Precedent for Speed over Quality
 Expectation of increased velocity
 Mess slows you down
 Must generate more mess to keep up
The Trap
Mess begets mess
 Precedent for Speed over Quality
 Expectation of increased velocity
 Mess slows you down
 Must generate more mess to keep up
 Ask permission to do your job correctly
Avoid The Trap
Incremental Fixes Fail




      http://www.jacoozi.com/blog/wp-content/uploads/2007/01/refactoring_coc_big.jpg
Avoid The Trap
Clean Constantly
Avoid The Trap
Clean Constantly
 Never make an intentional mess
 Monitor your “Technical Debt”
 Follow the Boy Scout Rule
 Quality is your responsibility
Avoid The Trap
Clean Constantly
 Never make an intentional mess
 Monitor your “Technical Debt”
 Follow the Boy Scout Rule
 Quality is your responsibility
 NEVER ask permission to do your job correctly
Monitoring “Technical Debt”
A few key metrics
Monitoring “Technical Debt”
A few key metrics
 Code Coverage
 Cyclomatic Complexity
 Coupling
 Maintainability
Monitoring Cruft/Debt
Code Coverage
Monitoring Cruft/Debt
Code Coverage
 Code exercised by automated tests
 Monitor test types separately
 Don’t set a coverage target
 100% Coverage is a smell
Monitoring Cruft/Debt
Code Coverage
 Code exercised by automated tests
 Monitor test types separately
 Don’t set a coverage target
 100% Coverage is a smell
 Monitor trends, not points
Monitoring Cruft/Debt
Cyclomatic Complexity
Monitoring Cruft/Debt
Cyclomatic Complexity
 Number of logical branches in code
 Direct relationship with bugs
 Typically high in concentrated areas
 Reduce Conditionals
Monitoring Cruft/Debt
Cyclomatic Complexity
 Number of logical branches in code
 Direct relationship with bugs
 Typically high in concentrated areas
 Reduce Conditionals
 Monitor trends, not points
Monitoring Cruft/Debt
Coupling
Monitoring Cruft/Debt
Coupling
 Interconnectedness of systems
 High Coupling = Difficult to Change
 Afferent (Toward) and Efferent (Away)
 Dependency Injection
Monitoring Cruft/Debt
Coupling
 Interconnectedness of systems
 High Coupling = Difficult to Change
 Afferent (Toward) and Efferent (Away)
 Dependency Injection
 Monitor trends, not points
Debt/Cruft Cards
Tie it to Business Value
Debt/Cruft Cards
Tie it to Business Value
 Velocity
 Scalability
 Availability
Debt/Cruft Cards
Tie it to Business Value
 Velocity
 Scalability
 Availability
 Maintainability
Review
Technical Debt




Cruft
Review
Technical Debt
 Is a strategic design decision
 Requires the business to be informed
 Requires a pay-back plan - (Clean Code)
Cruft
Review
Technical Debt
 Is a strategic design decision
 Requires the business to be informed
 Requires a pay-back plan - (Clean Code)
Cruft
 Happens
 Needs to be monitored and cleaned
 Is (probably) NOT Technical Debt
Rant.end
Thank You!
The Technical Debt Trap
Michael J Norton
@DocOnDev
LeanDog LLC*
doc@leandog.com

*The views expressed are not necessarily the views of LeanDog LLC
 (but they could be)

More Related Content

What's hot

Technical Debt - PHPBenelux
Technical Debt - PHPBeneluxTechnical Debt - PHPBenelux
Technical Debt - PHPBenelux
enaramore
 
Towards a Technical Debt Management Framework based on Cost-Benefit Analysis
Towards a Technical Debt Management Framework based on Cost-Benefit AnalysisTowards a Technical Debt Management Framework based on Cost-Benefit Analysis
Towards a Technical Debt Management Framework based on Cost-Benefit Analysis
M Firdaus Harun
 
Identifying and Managing Technical Debt
Identifying and Managing Technical DebtIdentifying and Managing Technical Debt
Identifying and Managing Technical Debt
zazworka
 
Technical Debt
Technical DebtTechnical Debt
Technical Debt
Gary Short
 
Technical Debt: Sources and Impacts
Technical Debt: Sources and ImpactsTechnical Debt: Sources and Impacts
Technical Debt: Sources and Impacts
Agile Velocity
 
Managing technical debt notes
Managing technical debt notesManaging technical debt notes
Managing technical debt notes
Fadi Stephan
 
Working with Technical Debt
Working with Technical DebtWorking with Technical Debt
Working with Technical Debt
Steve Green
 
Get Smart About Technical Debt
Get Smart About Technical DebtGet Smart About Technical Debt
Get Smart About Technical Debt
CAST
 
Technical Debt and Requirements
Technical Debt and RequirementsTechnical Debt and Requirements
Technical Debt and Requirements
Neil Ernst
 
Technical debt
Technical debtTechnical debt
Technical debt
Mark Russell
 
Technical Debt - osbridge
Technical Debt - osbridgeTechnical Debt - osbridge
Technical Debt - osbridge
enaramore
 
Infographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt ManagementInfographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt Management
Tushar Sharma
 
Why care about technical debt?
Why care about technical debt?Why care about technical debt?
Why care about technical debt?
Tushar Sharma
 
Managing Technical Debt
Managing Technical DebtManaging Technical Debt
Managing Technical Debt
Andre Perkins
 
Acme or omega - decision dilema case study
Acme or omega - decision dilema case studyAcme or omega - decision dilema case study
Acme or omega - decision dilema case study
Akhilesh Krishnan
 
Software estimating
Software estimatingSoftware estimating
Software estimating
Adam Cole
 
Myths
MythsMyths
Technical Debt - Why should you care? (Agiles Buenos Aires 2011)
Technical Debt - Why should you care?  (Agiles Buenos Aires 2011)Technical Debt - Why should you care?  (Agiles Buenos Aires 2011)
Technical Debt - Why should you care? (Agiles Buenos Aires 2011)
CI&T
 
Project Sail Eng245 2017
Project Sail Eng245 2017Project Sail Eng245 2017
Project Sail Eng245 2017
Stanford University
 
10 Career Crushers That Threaten Every Business Analyst
10 Career Crushers That Threaten Every Business Analyst10 Career Crushers That Threaten Every Business Analyst
10 Career Crushers That Threaten Every Business Analyst
IIBA UK Chapter
 

What's hot (20)

Technical Debt - PHPBenelux
Technical Debt - PHPBeneluxTechnical Debt - PHPBenelux
Technical Debt - PHPBenelux
 
Towards a Technical Debt Management Framework based on Cost-Benefit Analysis
Towards a Technical Debt Management Framework based on Cost-Benefit AnalysisTowards a Technical Debt Management Framework based on Cost-Benefit Analysis
Towards a Technical Debt Management Framework based on Cost-Benefit Analysis
 
Identifying and Managing Technical Debt
Identifying and Managing Technical DebtIdentifying and Managing Technical Debt
Identifying and Managing Technical Debt
 
Technical Debt
Technical DebtTechnical Debt
Technical Debt
 
Technical Debt: Sources and Impacts
Technical Debt: Sources and ImpactsTechnical Debt: Sources and Impacts
Technical Debt: Sources and Impacts
 
Managing technical debt notes
Managing technical debt notesManaging technical debt notes
Managing technical debt notes
 
Working with Technical Debt
Working with Technical DebtWorking with Technical Debt
Working with Technical Debt
 
Get Smart About Technical Debt
Get Smart About Technical DebtGet Smart About Technical Debt
Get Smart About Technical Debt
 
Technical Debt and Requirements
Technical Debt and RequirementsTechnical Debt and Requirements
Technical Debt and Requirements
 
Technical debt
Technical debtTechnical debt
Technical debt
 
Technical Debt - osbridge
Technical Debt - osbridgeTechnical Debt - osbridge
Technical Debt - osbridge
 
Infographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt ManagementInfographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt Management
 
Why care about technical debt?
Why care about technical debt?Why care about technical debt?
Why care about technical debt?
 
Managing Technical Debt
Managing Technical DebtManaging Technical Debt
Managing Technical Debt
 
Acme or omega - decision dilema case study
Acme or omega - decision dilema case studyAcme or omega - decision dilema case study
Acme or omega - decision dilema case study
 
Software estimating
Software estimatingSoftware estimating
Software estimating
 
Myths
MythsMyths
Myths
 
Technical Debt - Why should you care? (Agiles Buenos Aires 2011)
Technical Debt - Why should you care?  (Agiles Buenos Aires 2011)Technical Debt - Why should you care?  (Agiles Buenos Aires 2011)
Technical Debt - Why should you care? (Agiles Buenos Aires 2011)
 
Project Sail Eng245 2017
Project Sail Eng245 2017Project Sail Eng245 2017
Project Sail Eng245 2017
 
10 Career Crushers That Threaten Every Business Analyst
10 Career Crushers That Threaten Every Business Analyst10 Career Crushers That Threaten Every Business Analyst
10 Career Crushers That Threaten Every Business Analyst
 

Similar to Agile and Beyond :: The Technical Debt Trap

The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014
Doc Norton
 
The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013
Doc Norton
 
The Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" NortonThe Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" Norton
LeanDog
 
Startupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of frictionStartupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of friction
Startupfest
 
Data Leakage Prevention - K. K. Mookhey
Data Leakage Prevention - K. K. MookheyData Leakage Prevention - K. K. Mookhey
Data Leakage Prevention - K. K. Mookhey
Network Intelligence India
 
The Technical Debt Trap
The Technical Debt TrapThe Technical Debt Trap
The Technical Debt Trap
Doc Norton
 
PHPUG Presentation
PHPUG PresentationPHPUG Presentation
PHPUG Presentation
Damon Cortesi
 
Arrows
ArrowsArrows
Arrows
Mianlside
 
QCT fantastici e dove trovarli - Crafted Software
QCT fantastici e dove trovarli - Crafted SoftwareQCT fantastici e dove trovarli - Crafted Software
QCT fantastici e dove trovarli - Crafted Software
Thomas Rossetto
 
The Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always WantedThe Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always Wanted
Thoughtworks
 
How to deal with tech debt: Lessons learned from the best engineering teams
How to deal with tech debt: Lessons learned from the best engineering teamsHow to deal with tech debt: Lessons learned from the best engineering teams
How to deal with tech debt: Lessons learned from the best engineering teams
Alexandre Omeyer
 
A question of craftsmanship
A question of craftsmanshipA question of craftsmanship
A question of craftsmanship
AgileOnTheBeach
 
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
Marco Cedaro
 
Seaside - Why should you care? (OSDC.fr 2010)
Seaside - Why should you care? (OSDC.fr 2010)Seaside - Why should you care? (OSDC.fr 2010)
Seaside - Why should you care? (OSDC.fr 2010)
jfitzell
 
Crypto-Currency - Strategic Review v3
Crypto-Currency  - Strategic Review  v3Crypto-Currency  - Strategic Review  v3
Crypto-Currency - Strategic Review v3
Bryan Starbuck
 
Velocity NY 2016 - Devops: Who Does What?
Velocity NY 2016 - Devops: Who Does What?Velocity NY 2016 - Devops: Who Does What?
Velocity NY 2016 - Devops: Who Does What?
cornelia davis
 
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
CA Technologies
 
Teaching Elephants to Dance, Burr Sutter
Teaching Elephants to Dance, Burr SutterTeaching Elephants to Dance, Burr Sutter
Teaching Elephants to Dance, Burr Sutter
Judy Breedlove
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile World
Don McGreal
 
⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?
François-Guillaume Ribreau
 

Similar to Agile and Beyond :: The Technical Debt Trap (20)

The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014The Technical Debt Trap - NDC Oslo 2014
The Technical Debt Trap - NDC Oslo 2014
 
The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013
 
The Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" NortonThe Technical Debt Trap - Michael "Doc" Norton
The Technical Debt Trap - Michael "Doc" Norton
 
Startupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of frictionStartupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of friction
 
Data Leakage Prevention - K. K. Mookhey
Data Leakage Prevention - K. K. MookheyData Leakage Prevention - K. K. Mookhey
Data Leakage Prevention - K. K. Mookhey
 
The Technical Debt Trap
The Technical Debt TrapThe Technical Debt Trap
The Technical Debt Trap
 
PHPUG Presentation
PHPUG PresentationPHPUG Presentation
PHPUG Presentation
 
Arrows
ArrowsArrows
Arrows
 
QCT fantastici e dove trovarli - Crafted Software
QCT fantastici e dove trovarli - Crafted SoftwareQCT fantastici e dove trovarli - Crafted Software
QCT fantastici e dove trovarli - Crafted Software
 
The Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always WantedThe Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always Wanted
 
How to deal with tech debt: Lessons learned from the best engineering teams
How to deal with tech debt: Lessons learned from the best engineering teamsHow to deal with tech debt: Lessons learned from the best engineering teams
How to deal with tech debt: Lessons learned from the best engineering teams
 
A question of craftsmanship
A question of craftsmanshipA question of craftsmanship
A question of craftsmanship
 
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
JsDay - It's not you, It's me (or how to avoid being coupled with a Javascrip...
 
Seaside - Why should you care? (OSDC.fr 2010)
Seaside - Why should you care? (OSDC.fr 2010)Seaside - Why should you care? (OSDC.fr 2010)
Seaside - Why should you care? (OSDC.fr 2010)
 
Crypto-Currency - Strategic Review v3
Crypto-Currency  - Strategic Review  v3Crypto-Currency  - Strategic Review  v3
Crypto-Currency - Strategic Review v3
 
Velocity NY 2016 - Devops: Who Does What?
Velocity NY 2016 - Devops: Who Does What?Velocity NY 2016 - Devops: Who Does What?
Velocity NY 2016 - Devops: Who Does What?
 
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
Case Study: VF Corporation Takes a Practical Approach to Improving its MOJO w...
 
Teaching Elephants to Dance, Burr Sutter
Teaching Elephants to Dance, Burr SutterTeaching Elephants to Dance, Burr Sutter
Teaching Elephants to Dance, Burr Sutter
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile World
 
⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?⛳️ Votre API passe-t-elle le contrôle technique ?
⛳️ Votre API passe-t-elle le contrôle technique ?
 

More from Doc Norton

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was Wrong
Doc Norton
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to Cynefin
Doc Norton
 
Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016
Doc Norton
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision Making
Doc Norton
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation Mindset
Doc Norton
 
Switching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to AgileSwitching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to Agile
Doc Norton
 
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps CultureAutonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Doc Norton
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for Teams
Doc Norton
 
Experimentation mindset
Experimentation mindsetExperimentation mindset
Experimentation mindset
Doc Norton
 
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Doc Norton
 
Let's Start An Epidemic
Let's Start An EpidemicLet's Start An Epidemic
Let's Start An Epidemic
Doc Norton
 
Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014
Doc Norton
 
Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014
Doc Norton
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference Keynote
Doc Norton
 
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 versionAgile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Doc Norton
 
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Doc Norton
 
Velocity is not the goal code palo-usa
Velocity is not the goal   code palo-usaVelocity is not the goal   code palo-usa
Velocity is not the goal code palo-usa
Doc Norton
 
Teamwork Ain't Easy
Teamwork Ain't EasyTeamwork Ain't Easy
Teamwork Ain't Easy
Doc Norton
 
Velocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCVelocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQC
Doc Norton
 
Growing into Excellence - PNSQC
Growing into Excellence - PNSQCGrowing into Excellence - PNSQC
Growing into Excellence - PNSQC
Doc Norton
 

More from Doc Norton (20)

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was Wrong
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to Cynefin
 
Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016Building Blocks of a Knowledge Work Culture - NDC London 2016
Building Blocks of a Knowledge Work Culture - NDC London 2016
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision Making
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation Mindset
 
Switching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to AgileSwitching horses midstream - From Waterfall to Agile
Switching horses midstream - From Waterfall to Agile
 
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps CultureAutonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
Autonomy, Connection, and Excellence; The Building Blocks of a DevOps Culture
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for Teams
 
Experimentation mindset
Experimentation mindsetExperimentation mindset
Experimentation mindset
 
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
Agile Metrics : Velocity is NOT the Goal - NDC Oslo 2014
 
Let's Start An Epidemic
Let's Start An EpidemicLet's Start An Epidemic
Let's Start An Epidemic
 
Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014
 
Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014Creating a Global Engineering Culture - Agile india 2014
Creating a Global Engineering Culture - Agile india 2014
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference Keynote
 
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 versionAgile Metrics: Velocity is NOT the Goal - Agile 2013 version
Agile Metrics: Velocity is NOT the Goal - Agile 2013 version
 
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
Agile Metrics; Velocity is NOT the Goal - ScrumGathering 2013
 
Velocity is not the goal code palo-usa
Velocity is not the goal   code palo-usaVelocity is not the goal   code palo-usa
Velocity is not the goal code palo-usa
 
Teamwork Ain't Easy
Teamwork Ain't EasyTeamwork Ain't Easy
Teamwork Ain't Easy
 
Velocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCVelocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQC
 
Growing into Excellence - PNSQC
Growing into Excellence - PNSQCGrowing into Excellence - PNSQC
Growing into Excellence - PNSQC
 

Recently uploaded

Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Malak Abu Hammad
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
panagenda
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
Tomaz Bratanic
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Infrastructure Challenges in Scaling RAG with Custom AI models
Infrastructure Challenges in Scaling RAG with Custom AI modelsInfrastructure Challenges in Scaling RAG with Custom AI models
Infrastructure Challenges in Scaling RAG with Custom AI models
Zilliz
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
kumardaparthi1024
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial IntelligenceAI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
IndexBug
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Serial Arm Control in Real Time Presentation
Serial Arm Control in Real Time PresentationSerial Arm Control in Real Time Presentation
Serial Arm Control in Real Time Presentation
tolgahangng
 

Recently uploaded (20)

Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
HCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAUHCL Notes and Domino License Cost Reduction in the World of DLAU
HCL Notes and Domino License Cost Reduction in the World of DLAU
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
GraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracyGraphRAG for Life Science to increase LLM accuracy
GraphRAG for Life Science to increase LLM accuracy
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Infrastructure Challenges in Scaling RAG with Custom AI models
Infrastructure Challenges in Scaling RAG with Custom AI modelsInfrastructure Challenges in Scaling RAG with Custom AI models
Infrastructure Challenges in Scaling RAG with Custom AI models
 
GenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizationsGenAI Pilot Implementation in the organizations
GenAI Pilot Implementation in the organizations
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial IntelligenceAI 101: An Introduction to the Basics and Impact of Artificial Intelligence
AI 101: An Introduction to the Basics and Impact of Artificial Intelligence
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Serial Arm Control in Real Time Presentation
Serial Arm Control in Real Time PresentationSerial Arm Control in Real Time Presentation
Serial Arm Control in Real Time Presentation
 

Agile and Beyond :: The Technical Debt Trap

  • 1. The Technical Debt Trap Michael J Norton @DocOnDev LeanDog LLC* *The views expressed are not necessarily the views of LeanDog LLC (but they could be)
  • 4. What is Technical Debt? Ward Cunningham oopsla’92
  • 5. What is Technical Debt? Ward Cunningham Shipping first time code is like going into debt. oopsla’92
  • 6. What is Technical Debt? Ward Cunningham Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. oopsla’92
  • 7. What is Technical Debt? Ward Cunningham The danger occurs when the debt is not repaid. Every minute spent on not- quite-right code counts as interest on that debt. oopsla’92
  • 8. What is Technical Debt? Ward Cunningham The danger occurs when the debt is not repaid. Every minute spent on not- quite-right code counts as interest on that debt. oopsla’92
  • 9. Technical Debt is a Good Idea
  • 10. Technical Debt is a Good Idea WTF?
  • 11. Technical Debt is a Good Idea Strategic Design Decision
  • 12. Technical Debt is a Good Idea Strategic Design Decision Allow for Rapid Delivery To Elicit Quick Feedback And Correct Design
  • 13. Technical Debt is a Metaphor Here Be Danger
  • 14. Metaphors Rock We reason by analogy Can’t keep running at this pace Building on a weak foundation Puts pressure on It’s raining men our design
  • 15. Metaphors Rock We reason by analogy Can’t keep running at this pace Building on a weak foundation Puts pressure on It’s raining men our design (hallelujah)
  • 17. Metaphorphosis When Metaphors go wrong Return on Investment Short-Term Fraudulent Credit Card Inadvertent RecklessScheme Pyramid Debt Auto Loan High Interest in the Third Quadrant Home Loan Voluntary Intentional Loan Shark Long-Term Prudent Student Loan Pragmatic Leverage Operational
  • 19. Metaphorphosis When Metaphors go wrong “cut a lot of corners” James Shore http://jamesshore.com/Blog/CardMeeting/Voluntary-Technical-Debt.html “quick and dirty” Martin Fowler “sloppy” http://www.martinfowler.com/bliki/TechnicalDebt.html David Laribee “just hack it in” http://msdn.microsoft.com/en-us/magazine/ee819135.aspx Steve McConnell http://blogs.construx.com/blogs/stevemcc/archive/2007/11/01/technical-debt-2.aspx
  • 20. Technical Debt Quadrant http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
  • 21. That’s not what I said Ward Cunningham [Many] have explained the debt metaphor and confused it with the idea that you could write code poorly with the intention of doing a good job later. http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded youtube.com 2009
  • 22. That’s not what I said Ward Cunningham [Many] have explained the debt metaphor and confused it with the idea that you could write code poorly with the intention of doing a good job later. http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded youtube.com 2009
  • 23. That’s not what I said Ward Cunningham ... confused it with the idea that you could write code poorly ... youtube.com 2009
  • 24. Clean Code is Required Ward Cunningham The ability to pay back debt [...] depends upon you writing code that is clean enough to be able to refactor as you come to understand your problem. youtube.com 2009
  • 25. Clean Code is Required Ward Cunningham The ability to pay back debt [...] depends upon you writing code that is clean enough to be able to refactor as you come to understand your problem. youtube.com 2009
  • 26. Dirty Code is a Bad Idea Ward Cunningham Dirty code is to technical debt as the pawn broker is to financial debt. Don't think you are ever going to get your code back. http://twitter.com/WardCunningham/status/3742903303 twitter 2009
  • 27. Is it Technical Debt? Ask yourself... Is the code clean? Is the code tested? Is there a learning objective? Is there a plan for payback? Is the business truly informed?
  • 28. Is it Technical Debt? If you said no to even one Is the code clean? Is the code tested? Is there a learning objective? Is there a plan for payback? Is the business truly informed? Then you don’t have Technical Debt
  • 29. You have a mess Mess (noun) 1. Disorderly accumulation, heap, or jumble 2. A state of embarrassing confusion 3. An unpleasant or difficult situation
  • 30. You have cruft Cruft (noun) 1. An unpleasant substance 2. The result of shoddy construction 3. Redundant, old or improperly written code
  • 31. Chill. It’s just semantics, man.
  • 32. Chill. It’s just semantics, man. JUST Semantics? Technical Debt is Good
  • 33. Chill. It’s just semantics, man. JUST Semantics? Technical Debt is Good
  • 34. Chill. It’s just semantics, man. JUST Semantics? Quick and Dirty is Technical Debt is Good
  • 35. Chill. It’s just semantics, man. JUST Semantics? Quick and Dirty is Good
  • 36. Chill. It’s just semantics, man. JUST Semantics? Quick and Dirty is Good
  • 38. Technical Debt Quadrant “Let’s deploy and gather more information.”
  • 39. “Technical Debt” in Other Industries Construction http://www.constructionmanagementschools.net/wp-content/uploads/2010/04/construction-mistakes-18.jpg
  • 40. “Technical Debt” in Other Industries Construction Reckless and Deliberate http://www.constructionmanagementschools.net/wp-content/uploads/2010/04/construction-mistakes-18.jpg
  • 41. “Technical Debt” in Other Industries Automotive http://blog.ivman.com/wp-content/HomeRepair.jpg
  • 42. “Technical Debt” in Other Industries Automotive Reckless and Deliberate http://blog.ivman.com/wp-content/HomeRepair.jpg
  • 43. “Technical Debt” in Other Industries Medical http://www.scientificamerican.com/media/inline/blog/Image/MedicalError.jpg
  • 44. “Technical Debt” in Other Industries Medical Reckless and Inadvertent http://www.scientificamerican.com/media/inline/blog/Image/MedicalError.jpg
  • 45. Technical Debt Quadrant “Let’s deploy and gather more information.”
  • 46. Technical Debt Quadrant ible “Let’s deploy and ns gather more o sp information.” Ir re
  • 47. Technical Debt Quadrant ible “Let’s deploy and n s gather more o sp information.” Ir re n t e te m p In co
  • 48. Technical Debt Quadrant le ic al s ib “Let’s deploy and n h t o n gather more ec eb sp information.” T Ir re D n t e te m p In co
  • 49. Cruft or Debt? DataSet aDs, qDs; aDs = _dbConnector.UpdateAgentList(); qDs = _dbConnector.GetQueueList(); foreach (DataTable aTable in aDs.Tables) { foreach (DataRow aRow in aTable.Rows) { foreach (DataColumn aColumn in aTable.Columns) { DataSet asDs = _dbConnector.GetAgentSkills(aRow[aColumn].ToString());//AgentId foreach (DataTable asTable in asDs.Tables) { foreach (DataRow asRow in asTable.Rows) { foreach (DataColumn asColumn in asTable.Columns) { foreach (DataTable qTable in qDs.Tables) { foreach (DataRow qRow in qTable.Rows) { foreach (DataColumn qColumn in qTable.Columns) { DataSet sqDs = _dbConnector.GetSkillsForQueue(qRow[qColumn].ToString()); foreach (DataTable sqTable in sqDs.Tables) { foreach (DataRow sqRow in sqTable.Rows) { foreach (DataColumn sqColumn in sqTable.Columns) { foreach (string skill in sqRow[sqColumn].ToString().Split(paramDelimStr)) { if (skill == asRow[asColumn].ToString()) { try { _dbConnector.SetAgentQueueSkill(aRow[aColumn].ToString(), qRow[qColumn].ToString(), skill); } catch { continue; } }}}}}}}}}}}}}} http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
  • 50. Cruft or Debt? DataSet aDs, qDs; aDs = _dbConnector.UpdateAgentList(); http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
  • 51. Cruft or Debt? if ((customer.state == “AL” && customer.type == CustomerType.GENERAL_AGENT && customer.revenue > 100000) || (customer.type == CustomerType.RETRO_AGENT && (customer.state == “WI” || customer.state == “IL”)) || (customer.type == CustomerType.FED_MANAGEMENT && customer.revenue > 150000)) { ... }
  • 52. Cruft or Debt? if (customer.isFederallyRegulated()) { ... }
  • 53. Cruft or Debt? double getSpeed() { switch (_type) { case EUROPEAN: return getBaseSpeed(); case AFRICAN: return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts; case NORWEGIAN_BLUE: return (_isNailed) ? 0 : getBaseSpeed(_voltage); } throw new RuntimeException ("Should be unreachable"); } http://www.refactoring.com/catalog/replaceConditionalWithPolymorphism.html
  • 54. Cruft or Debt? class Swallow ... double getSpeed() { return getBaseSpeed(); } end class class EuropeanSwallow ... end class class AfricanSwallow ... double getSpeed() { return super.getSpeed - coconutLoad(); } double coconutLoad() { return getLoadFactor() * _numberOfCoconuts; } end class class NorwegianSwallow ... double getSpeed() { return (_isNailed) ? 0:getBaseSpeed(_voltage); } end class
  • 55. Messy Code is a Bad Decision Every Time
  • 56. Messy Code is a Bad Decision Every Time You are a professional developer (Professionals behave ethically)
  • 57. Messy Code is a Bad Decision Every Time You are a professional developer (Professionals behave ethically) You are going to create unintentional cruft (You can’t help it. It’s unintentional.)
  • 58. Messy Code is a Bad Decision Every Time You are a professional developer (Professionals behave ethically) You are going to create unintentional cruft (You can’t help it. It’s unintentional.) You have to clean up the existing cruft (Intent doesn’t alter Responsibility)
  • 59. Grammy Doesn’t Love Me! Setting Expectations
  • 61. The Trap Mess begets mess Precedent for Speed over Quality Expectation of increased velocity Mess slows you down Must generate more mess to keep up
  • 62. The Trap Mess begets mess Precedent for Speed over Quality Expectation of increased velocity Mess slows you down Must generate more mess to keep up Ask permission to do your job correctly
  • 63. Avoid The Trap Incremental Fixes Fail http://www.jacoozi.com/blog/wp-content/uploads/2007/01/refactoring_coc_big.jpg
  • 64. Avoid The Trap Clean Constantly
  • 65. Avoid The Trap Clean Constantly Never make an intentional mess Monitor your “Technical Debt” Follow the Boy Scout Rule Quality is your responsibility
  • 66. Avoid The Trap Clean Constantly Never make an intentional mess Monitor your “Technical Debt” Follow the Boy Scout Rule Quality is your responsibility NEVER ask permission to do your job correctly
  • 68. Monitoring “Technical Debt” A few key metrics Code Coverage Cyclomatic Complexity Coupling Maintainability
  • 70. Monitoring Cruft/Debt Code Coverage Code exercised by automated tests Monitor test types separately Don’t set a coverage target 100% Coverage is a smell
  • 71. Monitoring Cruft/Debt Code Coverage Code exercised by automated tests Monitor test types separately Don’t set a coverage target 100% Coverage is a smell Monitor trends, not points
  • 73. Monitoring Cruft/Debt Cyclomatic Complexity Number of logical branches in code Direct relationship with bugs Typically high in concentrated areas Reduce Conditionals
  • 74. Monitoring Cruft/Debt Cyclomatic Complexity Number of logical branches in code Direct relationship with bugs Typically high in concentrated areas Reduce Conditionals Monitor trends, not points
  • 76. Monitoring Cruft/Debt Coupling Interconnectedness of systems High Coupling = Difficult to Change Afferent (Toward) and Efferent (Away) Dependency Injection
  • 77. Monitoring Cruft/Debt Coupling Interconnectedness of systems High Coupling = Difficult to Change Afferent (Toward) and Efferent (Away) Dependency Injection Monitor trends, not points
  • 78. Debt/Cruft Cards Tie it to Business Value
  • 79. Debt/Cruft Cards Tie it to Business Value Velocity Scalability Availability
  • 80. Debt/Cruft Cards Tie it to Business Value Velocity Scalability Availability Maintainability
  • 82. Review Technical Debt Is a strategic design decision Requires the business to be informed Requires a pay-back plan - (Clean Code) Cruft
  • 83. Review Technical Debt Is a strategic design decision Requires the business to be informed Requires a pay-back plan - (Clean Code) Cruft Happens Needs to be monitored and cleaned Is (probably) NOT Technical Debt
  • 85. Thank You! The Technical Debt Trap Michael J Norton @DocOnDev LeanDog LLC* doc@leandog.com *The views expressed are not necessarily the views of LeanDog LLC (but they could be)

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. Design decisions that allow for more rapid delivery / illicit quick feedback / gather data necessary to correct design\n
  11. - Sales site for complex product. Create product configuration views.\n- Plan to sell several different products. Starting with just one. Don’t extract interface yet.\n\n\n
  12. - Sales site for complex product. Create product configuration views.\n- Plan to sell several different products. Starting with just one. Don’t extract interface yet.\n\n\n
  13. - Sales site for complex product. Create product configuration views.\n- Plan to sell several different products. Starting with just one. Don’t extract interface yet.\n\n\n
  14. \n
  15. \n\n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. This is not a loan from a loan shark\n\nHow do we end up in massive high-interest debt unwittingly?\nrobbery or larceny or fraud\n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. "We incurred structural debt in order to meet your deadline. We should discuss that debt and set a plan for paying it back later."\n
  68. "We incurred mechanical debt to stay in budget. We should get metrics around that and make sure we pay the debt down in the future."\n
  69. "We incurred health debt during the surgery. You see, it is like we paid for the surgery with a credit card instead of a home equity loan..."\n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  80. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  81. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  82. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  83. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  84. Not acceptable to violate accounting practices, violate safety laws, or risk patient’s health\n\n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. Ruby - churn => volume of changes\ngit - gitswarm => visual history of changes\nJava - Cobertura or Sonar\n
  93. Ruby - churn => volume of changes\ngit - gitswarm => visual history of changes\nJava - Cobertura or Sonar\n
  94. Ruby - churn => volume of changes\ngit - gitswarm => visual history of changes\nJava - Cobertura or Sonar\n
  95. Ruby - churn => volume of changes\ngit - gitswarm => visual history of changes\nJava - Cobertura or Sonar\n
  96. Ruby - churn => volume of changes\ngit - gitswarm => visual history of changes\nJava - Cobertura or Sonar\n
  97. \n
  98. \n
  99. \n
  100. \n
  101. \n
  102. \n
  103. \n
  104. Java - Cobertura, Clover, EMMA\n.NET - NCover\nRuby - rcov / metric_fu\n
  105. Java - Cobertura, Clover, EMMA\n.NET - NCover\nRuby - rcov / metric_fu\n
  106. Java - Cobertura, Clover, EMMA\n.NET - NCover\nRuby - rcov / metric_fu\n
  107. Java - Cobertura, Clover, EMMA\n.NET - NCover\nRuby - rcov / metric_fu\n
  108. Java - Cobertura, Clover, EMMA\n.NET - NCover\nRuby - rcov / metric_fu\n
  109. Ruby - Saikuro / metric_fu\nJava - Cobertura, PMD, CheckStyle\n.NET - NDepend\n\n
  110. Ruby - Saikuro / metric_fu\nJava - Cobertura, PMD, CheckStyle\n.NET - NDepend\n\n
  111. Ruby - Saikuro / metric_fu\nJava - Cobertura, PMD, CheckStyle\n.NET - NDepend\n\n
  112. Ruby - Saikuro / metric_fu\nJava - Cobertura, PMD, CheckStyle\n.NET - NDepend\n\n
  113. Ruby - Saikuro / metric_fu\nJava - Cobertura, PMD, CheckStyle\n.NET - NDepend\n\n
  114. NDepend\nJDepend\n\n
  115. NDepend\nJDepend\n\n
  116. NDepend\nJDepend\n\n
  117. NDepend\nJDepend\n\n
  118. NDepend\nJDepend\n\n
  119. \n
  120. \n
  121. \n
  122. \n
  123. \n
  124. \n
  125. \n
  126. \n
  127. \n
  128. \n
  129. \n
  130. \n
  131. \n
  132. \n