SlideShare ist ein Scribd-Unternehmen logo
1 von 85
Downloaden Sie, um offline zu lesen
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)

Weitere ähnliche Inhalte

Was ist angesagt?

Technical Debt - PHPBenelux
Technical Debt - PHPBeneluxTechnical Debt - PHPBenelux
Technical Debt - PHPBeneluxenaramore
 
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 AnalysisM Firdaus Harun
 
Identifying and Managing Technical Debt
Identifying and Managing Technical DebtIdentifying and Managing Technical Debt
Identifying and Managing Technical Debtzazworka
 
Technical Debt
Technical DebtTechnical Debt
Technical DebtGary Short
 
Technical Debt: Sources and Impacts
Technical Debt: Sources and ImpactsTechnical Debt: Sources and Impacts
Technical Debt: Sources and ImpactsAgile Velocity
 
Managing technical debt notes
Managing technical debt notesManaging technical debt notes
Managing technical debt notesFadi Stephan
 
Working with Technical Debt
Working with Technical DebtWorking with Technical Debt
Working with Technical DebtSteve Green
 
Get Smart About Technical Debt
Get Smart About Technical DebtGet Smart About Technical Debt
Get Smart About Technical DebtCAST
 
Technical Debt and Requirements
Technical Debt and RequirementsTechnical Debt and Requirements
Technical Debt and RequirementsNeil Ernst
 
Technical Debt - osbridge
Technical Debt - osbridgeTechnical Debt - osbridge
Technical Debt - osbridgeenaramore
 
Infographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt ManagementInfographic - Pragmatic Technical Debt Management
Infographic - Pragmatic Technical Debt ManagementTushar 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 DebtAndre 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 studyAkhilesh Krishnan
 
Software estimating
Software estimatingSoftware estimating
Software estimatingAdam Cole
 
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
 
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 AnalystIIBA UK Chapter
 

Was ist angesagt? (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
 

Ähnlich wie 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 2014Doc Norton
 
The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013The Technical Debt Trap - AgileIndy 2013
The Technical Debt Trap - AgileIndy 2013Doc 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" NortonLeanDog
 
Startupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of frictionStartupfest 2012 - Coefficients of friction
Startupfest 2012 - Coefficients of frictionStartupfest
 
The Technical Debt Trap
The Technical Debt TrapThe Technical Debt Trap
The Technical Debt TrapDoc Norton
 
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 SoftwareThomas Rossetto
 
The Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always WantedThe Enterprise Architecture You Always Wanted
The Enterprise Architecture You Always WantedThoughtworks
 
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 teamsAlexandre Omeyer
 
A question of craftsmanship
A question of craftsmanshipA question of craftsmanship
A question of craftsmanshipAgileOnTheBeach
 
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 v3Bryan 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 SutterJudy Breedlove
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile WorldDon 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
 

Ähnlich wie 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 ?
 

Mehr von Doc Norton

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was WrongDoc Norton
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to CynefinDoc 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 2016Doc Norton
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingDoc Norton
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation MindsetDoc 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 AgileDoc 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 CultureDoc Norton
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsDoc Norton
 
Experimentation mindset
Experimentation mindsetExperimentation mindset
Experimentation mindsetDoc 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 2014Doc Norton
 
Let's Start An Epidemic
Let's Start An EpidemicLet's Start An Epidemic
Let's Start An EpidemicDoc Norton
 
Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Teamwork Ain't Easy - RailsConf 2014
Teamwork Ain't Easy - RailsConf 2014Doc 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 2014Doc Norton
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference KeynoteDoc 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 versionDoc 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 2013Doc 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-usaDoc Norton
 
Teamwork Ain't Easy
Teamwork Ain't EasyTeamwork Ain't Easy
Teamwork Ain't EasyDoc Norton
 
Velocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCVelocity is NOT the Goal - PNSQC
Velocity is NOT the Goal - PNSQCDoc Norton
 
Growing into Excellence - PNSQC
Growing into Excellence - PNSQCGrowing into Excellence - PNSQC
Growing into Excellence - PNSQCDoc Norton
 

Mehr von 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
 

Kürzlich hochgeladen

ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"DianaGray10
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8DianaGray10
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
Valere | Digital Solutions & AI Transformation Portfolio | 2024
Valere | Digital Solutions & AI Transformation Portfolio | 2024Valere | Digital Solutions & AI Transformation Portfolio | 2024
Valere | Digital Solutions & AI Transformation Portfolio | 2024Alexander Turgeon
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsSafe Software
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...Aggregage
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
The Kubernetes Gateway API and its role in Cloud Native API Management
The Kubernetes Gateway API and its role in Cloud Native API ManagementThe Kubernetes Gateway API and its role in Cloud Native API Management
The Kubernetes Gateway API and its role in Cloud Native API ManagementNuwan Dias
 
UiPath Studio Web workshop series - Day 5
UiPath Studio Web workshop series - Day 5UiPath Studio Web workshop series - Day 5
UiPath Studio Web workshop series - Day 5DianaGray10
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...Daniel Zivkovic
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
99.99% of Your Traces Are (Probably) Trash (SRECon NA 2024).pdf
99.99% of Your Traces  Are (Probably) Trash (SRECon NA 2024).pdf99.99% of Your Traces  Are (Probably) Trash (SRECon NA 2024).pdf
99.99% of Your Traces Are (Probably) Trash (SRECon NA 2024).pdfPaige Cruz
 

Kürzlich hochgeladen (20)

ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
UiPath Clipboard AI: "A TIME Magazine Best Invention of 2023 Unveiled"
 
UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8UiPath Studio Web workshop series - Day 8
UiPath Studio Web workshop series - Day 8
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
Valere | Digital Solutions & AI Transformation Portfolio | 2024
Valere | Digital Solutions & AI Transformation Portfolio | 2024Valere | Digital Solutions & AI Transformation Portfolio | 2024
Valere | Digital Solutions & AI Transformation Portfolio | 2024
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration WorkflowsIgniting Next Level Productivity with AI-Infused Data Integration Workflows
Igniting Next Level Productivity with AI-Infused Data Integration Workflows
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
The Data Metaverse: Unpacking the Roles, Use Cases, and Tech Trends in Data a...
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
The Kubernetes Gateway API and its role in Cloud Native API Management
The Kubernetes Gateway API and its role in Cloud Native API ManagementThe Kubernetes Gateway API and its role in Cloud Native API Management
The Kubernetes Gateway API and its role in Cloud Native API Management
 
UiPath Studio Web workshop series - Day 5
UiPath Studio Web workshop series - Day 5UiPath Studio Web workshop series - Day 5
UiPath Studio Web workshop series - Day 5
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...
All in AI: LLM Landscape & RAG in 2024 with Mark Ryan (Google) & Jerry Liu (L...
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
99.99% of Your Traces Are (Probably) Trash (SRECon NA 2024).pdf
99.99% of Your Traces  Are (Probably) Trash (SRECon NA 2024).pdf99.99% of Your Traces  Are (Probably) Trash (SRECon NA 2024).pdf
99.99% of Your Traces Are (Probably) Trash (SRECon NA 2024).pdf
 

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)

Hinweis der Redaktion

  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