SlideShare a Scribd company logo
1 of 60
Download to read offline
The

Technical Debt Trap
Doc Norton
doc@groupon.com
@DocOnDev
Doc Norton!
Global Director of Engineering Culture!
doc@groupon.com | @DocOnDev
Husband Father
Grandfather!
What is Technical Debt?
Shipping first time code is like going into debt.
OOPSLA ‘92
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
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
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
Ward Cunningham
Technical Debt is Good
WTF?
Technical Debt is Good
Technical Debt is Good
Strategic Design Decision
❖ Allow for Rapid Delivery!
❖ To Elicit Quick Feedback!
❖ And Correct Design
Technical Debt is Good
Indication of Learning
❖ Now know what you need!
❖ Implementation doesn’t match!
Technical Debt is a Metaphor
Here Be Danger
Metaphor’s Rock
We Reason by Analogy
Building on
a weak
foundation
Puts pressure on
our design
Can’t keep running
at this pace
It’s raining men
(hallelujah)
Metaphorphosis
When Metaphors Go Wrong
SHORT-TERM
Long-Term
INADVERTENT RECKLESS
DEBT IN THE THIRD
QUADRANTPrudent
Intentional
Credit Card
FRAUDULENT
AUTO LOAN
Student Loan
HOME LOAN
Loan Shark
Return on Investment
PYRAMID SCHEME
VOLUNTARY
PRAGMATIC LEVERAGE
HIGH INTEREST
OPERATIONAL
Metaphorphosis
When Metaphors Go Wrong
“QUICK AND DIRTY”
MARTIN FOWLER
HTTP://WWW.MARTINFOWLER.COM/BLIKI/TECHNICALDEBT.HTML
“SLOPPY”
DAVID LARIBEE
HTTP://MSDN.MICROSOFT.COM/EN-US/MAGAZINE/EE819135.ASPX
“JUST HACK IT IN”
STEVE MCCONNELL
HTTP://BLOGS.CONSTRUX.COM/BLOGS/STEVEMCC/ARCHIVE/2007/11/01/TECHNICAL-DEBT-2.ASPX
“CUT A LOT OF CORNERS”
JAMES SHORE
HTTP://JAMESSHORE.COM/BLOG/CARDMEETING/VOLUNTARY-TECHNICAL-DEBT.HTML
The Technical Debt Quadrant
http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
[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.
YouTube ‘09
Ummm… No.
http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
confused the debt
metaphor with the
idea that you could
write code poorly
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 ‘09
Clean Code is
Required
http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
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 ‘09
Clean Code is
Required
http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
Twitter ‘09
Dirty Code is a Bad
Idea
Dirty code is to technical debt as the pawn
broker is to financial debt.!
http://twitter.com/WardCunningham/status/3742903303
Don’t think you are ever going to get your
code back.
Is it Technical Debt?
Ask yourself…
❖ Is the code clean?!
❖ Is the code tested?!
❖ Is there a learning objective or event?!
❖ Is there a plan for payback?!
❖ Is the business truly informed?
Is it Technical Debt?
If you say no to even one…
❖ Is the code clean?!
❖ Is the code tested?!
❖ Is there a learning objective or event?!
❖ Is there a plan for payback?!
❖ Is the business truly informed?
... then you don’t have Technical Debt
You have a mess
Mess (noun)
❖ Disorderly accumulation, heap, or jumble!
❖ A state of embarrassing confusion!
❖ An unpleasant or difficult situation
You have cruft
Cruft (noun)
❖ An unpleasant substance!
❖ The result of shoddy construction!
❖ Redundant, old or improperly written code
Chill. It’s just semantics, man.
Just Semantics?
Technical Debt is Good
Chill. It’s just semantics, man.
Just Semantics?
Technical Debt is GoodQuick and Dirty is Technical DebtQuick and Dirty is Good
Chill. It’s just semantics, man.
Just Semantics?
Quick and Dirty is GoodQuick and Dirty is Good
The Technical Debt Quadrant
http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
The Technical Debt Quadrant
http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
“Let’s deploy and
gather more
information.”
Technical Debt in Other Fields
Technical Debt in Other Fields
Technical Debt in Other Fields
Technical Debt in Other Fields
RECKLESS AND DELIBERATE
RECKLESS AND DELIBERATE
RECKLESS AND INADVERTENT
The Technical Debt Quadrant
http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
IRRESPONSIBLE
INCOMPETENT
“Let’s deploy and
gather more
information.”
TECHNICAL
DEBT
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();!
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, asDs, sqDs;!
aDs = _dbConnector.UpdateAgentList();!
qDs = _dbConnector.GetQueueList();!
!
foreach (DataRow aRow in aDS.Tables[0].Rows) {!
String agentID = aRow[“AgentId”].ToString();!
asDs = _dbConnector.GetAgentSkills(agentID);!
foreach (DataRow asRow in asDs.Tables[0].Rows) {!
String agentSkill = asRow[“Skill”].ToString();!
foreach (DataRow qRow in qDs.Tables[0].Rows) {!
queueName = qRow[“QueueName”].ToString();!
sqDs = _dbConnector.GetSkillsForQueue(queueName);!
foreach (DataRow sqRow in sqDs.Tables[0].Rows) {!
foreach (string skill in sqRow[“Skills”].ToString().Split(paramDelimStr)) {!
if (skill == agentSkill) {!
try { _dbConnector.SetAgentQueueSkill(agentID, queueName, skill); }!
catch { continue; }!
}!
}!
}!
}!
}!
}
http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
Cruft or Debt?
AgentList agents = new AgentList(_dbConnector.UpdateAgentList());!
QueueList queues = new QueueList(_dbConnector.GetQueueList());!
!
foreach (Agent agent in agents) {!
foreach (Skill agentSkill in agent.skills) {!
foreach (Queue queue in queues) {!
foreach (Skill queueSkill in queue.skills.Where(x => x == agentSkill)) {!
try {_dbConnector.SetAgentQueueSkill(agent.agentID, queue.name, agentSkill); }!
catch { continue; }!
}!
}!
}!
}
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 is Federally Regulated!
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
Cruft is a bad decision
Every Time
❖ You are a professional developer!
❖ You’re going to create unintentional cruft!
❖ You have to clean up the existing cruft
The Trap
Cruft begets Cruft
❖ Precedent for speed over quality!
❖ Expectation of increased velocity!
❖ Cruft slows you down!
❖ Must write more cruft to keep up!
❖ Ask permission to do your job correctly
Avoid The Trap
Thresholds set false expectations
http://blog.castsoftware.com/wp-content/uploads/2011/04/Technical-Debt-Software-Quality1.jpg
Avoid The Trap
Incremental fixes fail
http://www.jacoozi.com/blog/wp-content/uploads/2007/01/refactoring_coc_big.jpg
http://www.jacoozi.com/blog/wp-content/uploads/2007/01/refactoring_coc_big.jpg
Avoid The Trap
Clean Constantly
❖ Never make an intentional mess!
❖ Monitor your “Technical Debt”!
❖ Follow the Boy Scout Rule!
❖ Remember quality is your responsibility!
❖ NEVER ask permission to do your job correctly
Monitoring Cruft/Debt
A few key metrics
❖ Code Coverage!
❖ Code Complexity!
❖ Coupling!
❖ Maintainability
Monitoring Cruft/Debt
Code Coverage
❖ Code exercised by automated tests!
❖ Monitor types of tests separately!
❖ Don’t set a coverage target!
❖ 100% coverage is a smell!
❖ Monitor Trends, Not Points
Monitoring Cruft/Debt
Complexity
❖ Count of logical branches in code!
❖ Direct relationship with bugs!
❖ Typically high in concentrated areas!
❖ Reduce conditionals!
❖ Monitor Trends, Not Points
Monitoring Cruft/Debt
Coupling
❖ Interconnectedness of systems!
❖ Highly coupled is difficult to change!
❖ Afferent (toward) and Efferent (away)!
❖ Dependency Injection!
❖ Monitor Trends, Not Points
Monitoring Cruft/Debt
Make stories for cruft
❖ Velocity!
❖ Scalability!
❖ Availability!
❖ Maintainability
Review
Technical Debt
❖ A strategic design decision!
❖ Requires business to be informed!
❖ Includes a pay-back plan
Cruft
❖ Happens!
❖ Needs to be monitored and cleaned!
❖ Is NOT Technical Debt
Review
Technical Debt
❖ A strategic design decision!
❖ Requires business to be informed!
❖ Includes a pay-back plan
Cruft
❖ Happens!
❖ Needs to be monitored and cleaned!
❖ Is NOT Technical Debt
NEVER
ask
perm
ission
to do your job
correctly
The

Technical Debt Trap
Doc Norton!
doc@groupon.com!
@DocOnDev
Comments / Questions?
The

Technical Debt Trap
Doc Norton!
doc@groupon.com!
@DocOnDev
Thank You!

More Related Content

What's hot

What's hot (7)

Software and all that comes with it
Software and all that comes with itSoftware and all that comes with it
Software and all that comes with it
 
E245 syllabus rev15
E245 syllabus rev15E245 syllabus rev15
E245 syllabus rev15
 
the best code, is code never written
the best code, is code never writtenthe best code, is code never written
the best code, is code never written
 
Optimized for what
Optimized for whatOptimized for what
Optimized for what
 
Product Management - pitfalls of Data Driven Development
Product Management - pitfalls of Data Driven DevelopmentProduct Management - pitfalls of Data Driven Development
Product Management - pitfalls of Data Driven Development
 
Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014
 
D3 Design By Games Agile India Pune 2005
D3 Design By Games   Agile India   Pune 2005D3 Design By Games   Agile India   Pune 2005
D3 Design By Games Agile India Pune 2005
 

Viewers also liked

Viewers also liked (14)

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
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation Mindset
 
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
 
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
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision Making
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to Cynefin
 
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 That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference Keynote
 
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
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for Teams
 
To Estimate or Not to Estimate, Is that the Question? LeanAgileUS 2017
To Estimate or Not to Estimate, Is that the Question? LeanAgileUS 2017To Estimate or Not to Estimate, Is that the Question? LeanAgileUS 2017
To Estimate or Not to Estimate, Is that the Question? LeanAgileUS 2017
 

Similar to The Technical Debt Trap - NDC Oslo 2014

CiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForceCiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForce
Ciklum Ukraine
 
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
HostedbyConfluent
 
Patterns and Practices for Event Design With Adam Bellemare | Current 2022
Patterns and Practices for Event Design With Adam Bellemare | Current 2022Patterns and Practices for Event Design With Adam Bellemare | Current 2022
Patterns and Practices for Event Design With Adam Bellemare | Current 2022
HostedbyConfluent
 
Data Mining Open Ap Is
Data Mining Open Ap IsData Mining Open Ap Is
Data Mining Open Ap Is
oscon2007
 
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
SONU61709
 

Similar to The Technical Debt Trap - NDC Oslo 2014 (20)

Agile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt TrapAgile and Beyond :: The Technical Debt Trap
Agile and Beyond :: The Technical Debt Trap
 
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
 
CiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForceCiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForce
 
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave ClubJoining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
Joining the Club: Using Spark to Accelerate Big Data at Dollar Shave Club
 
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
You Put *What* in Your Stream?! Patterns and Practices for Event Design with ...
 
Engineering Highly Maintainable Code: Maintain or Innovate
Engineering Highly Maintainable Code: Maintain or InnovateEngineering Highly Maintainable Code: Maintain or Innovate
Engineering Highly Maintainable Code: Maintain or Innovate
 
Presenting Expression Blend 3 (2 Fev 2010)
Presenting Expression Blend 3 (2 Fev 2010)Presenting Expression Blend 3 (2 Fev 2010)
Presenting Expression Blend 3 (2 Fev 2010)
 
JavaScript UI Architecture: Be all that you can be
JavaScript UI Architecture: Be all that you can beJavaScript UI Architecture: Be all that you can be
JavaScript UI Architecture: Be all that you can be
 
How to write maintainable software
How to write maintainable softwareHow to write maintainable software
How to write maintainable software
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile World
 
Patterns and Practices for Event Design With Adam Bellemare | Current 2022
Patterns and Practices for Event Design With Adam Bellemare | Current 2022Patterns and Practices for Event Design With Adam Bellemare | Current 2022
Patterns and Practices for Event Design With Adam Bellemare | Current 2022
 
Cash Flow Forecaster presentation
Cash Flow Forecaster presentationCash Flow Forecaster presentation
Cash Flow Forecaster presentation
 
DBA vs Deadlock: How to Out-Index a Deadly Blocking Scenario
DBA vs Deadlock: How to Out-Index a Deadly Blocking ScenarioDBA vs Deadlock: How to Out-Index a Deadly Blocking Scenario
DBA vs Deadlock: How to Out-Index a Deadly Blocking Scenario
 
PHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the testsPHPUnit Episode iv.iii: Return of the tests
PHPUnit Episode iv.iii: Return of the tests
 
PHPUG Presentation
PHPUG PresentationPHPUG Presentation
PHPUG Presentation
 
Data Mining Open Ap Is
Data Mining Open Ap IsData Mining Open Ap Is
Data Mining Open Ap Is
 
Taming technical debt
Taming technical debt Taming technical debt
Taming technical debt
 
Dart - en ny platform til webudvikling af Rico Wind, Google
Dart - en ny platform til webudvikling af Rico Wind, GoogleDart - en ny platform til webudvikling af Rico Wind, Google
Dart - en ny platform til webudvikling af Rico Wind, Google
 
Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018Introducing domain driven design - dogfood con 2018
Introducing domain driven design - dogfood con 2018
 
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
1. Minimum 150 Word Respond. Topic Imagines in Webpage and Aligni.docx
 

More from 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
 
Do I have a role?
Do I have a role?Do I have a role?
Do I have a role?
Doc Norton
 

More from Doc Norton (14)

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was Wrong
 
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
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
 
Do I have a role?
Do I have a role?Do I have a role?
Do I have a role?
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the Goal
 
CodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoaCodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoa
 
Oredev :: The Technical Debt Trap
Oredev :: The Technical Debt TrapOredev :: The Technical Debt Trap
Oredev :: The Technical Debt Trap
 
Oredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development CareerOredev :: Take Control of Your Development Career
Oredev :: Take Control of Your Development Career
 
Introduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog EditionIntroduction To Functional Programming with Scheme - LeanDog Edition
Introduction To Functional Programming with Scheme - LeanDog Edition
 

Recently uploaded

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
Health
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 

Recently uploaded (20)

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
+971565801893>>SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHAB...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...How to Choose the Right Laravel Development Partner in New York City_compress...
How to Choose the Right Laravel Development Partner in New York City_compress...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 

The Technical Debt Trap - NDC Oslo 2014

  • 1. The
 Technical Debt Trap Doc Norton doc@groupon.com @DocOnDev
  • 2. Doc Norton! Global Director of Engineering Culture! doc@groupon.com | @DocOnDev Husband Father
  • 5. Shipping first time code is like going into debt. OOPSLA ‘92 Ward Cunningham
  • 6. 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 Ward Cunningham
  • 7. 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 Ward Cunningham
  • 8. 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 Ward Cunningham
  • 11. Technical Debt is Good Strategic Design Decision ❖ Allow for Rapid Delivery! ❖ To Elicit Quick Feedback! ❖ And Correct Design
  • 12. Technical Debt is Good Indication of Learning ❖ Now know what you need! ❖ Implementation doesn’t match!
  • 13. Technical Debt is a Metaphor Here Be Danger
  • 14. Metaphor’s Rock We Reason by Analogy Building on a weak foundation Puts pressure on our design Can’t keep running at this pace It’s raining men (hallelujah)
  • 15. Metaphorphosis When Metaphors Go Wrong SHORT-TERM Long-Term INADVERTENT RECKLESS DEBT IN THE THIRD QUADRANTPrudent Intentional Credit Card FRAUDULENT AUTO LOAN Student Loan HOME LOAN Loan Shark Return on Investment PYRAMID SCHEME VOLUNTARY PRAGMATIC LEVERAGE HIGH INTEREST OPERATIONAL
  • 16. Metaphorphosis When Metaphors Go Wrong “QUICK AND DIRTY” MARTIN FOWLER HTTP://WWW.MARTINFOWLER.COM/BLIKI/TECHNICALDEBT.HTML “SLOPPY” DAVID LARIBEE HTTP://MSDN.MICROSOFT.COM/EN-US/MAGAZINE/EE819135.ASPX “JUST HACK IT IN” STEVE MCCONNELL HTTP://BLOGS.CONSTRUX.COM/BLOGS/STEVEMCC/ARCHIVE/2007/11/01/TECHNICAL-DEBT-2.ASPX “CUT A LOT OF CORNERS” JAMES SHORE HTTP://JAMESSHORE.COM/BLOG/CARDMEETING/VOLUNTARY-TECHNICAL-DEBT.HTML
  • 17. The Technical Debt Quadrant http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
  • 18. [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. YouTube ‘09 Ummm… No. http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
  • 19. confused the debt metaphor with the idea that you could write code poorly
  • 20. 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 ‘09 Clean Code is Required http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
  • 21. 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 ‘09 Clean Code is Required http://www.youtube.com/watch?v=pqeJFYwnkjE&feature=player_embedded
  • 22. Twitter ‘09 Dirty Code is a Bad Idea Dirty code is to technical debt as the pawn broker is to financial debt.! http://twitter.com/WardCunningham/status/3742903303 Don’t think you are ever going to get your code back.
  • 23. Is it Technical Debt? Ask yourself… ❖ Is the code clean?! ❖ Is the code tested?! ❖ Is there a learning objective or event?! ❖ Is there a plan for payback?! ❖ Is the business truly informed?
  • 24. Is it Technical Debt? If you say no to even one… ❖ Is the code clean?! ❖ Is the code tested?! ❖ Is there a learning objective or event?! ❖ Is there a plan for payback?! ❖ Is the business truly informed? ... then you don’t have Technical Debt
  • 25. You have a mess Mess (noun) ❖ Disorderly accumulation, heap, or jumble! ❖ A state of embarrassing confusion! ❖ An unpleasant or difficult situation
  • 26. You have cruft Cruft (noun) ❖ An unpleasant substance! ❖ The result of shoddy construction! ❖ Redundant, old or improperly written code
  • 27. Chill. It’s just semantics, man. Just Semantics? Technical Debt is Good
  • 28. Chill. It’s just semantics, man. Just Semantics? Technical Debt is GoodQuick and Dirty is Technical DebtQuick and Dirty is Good
  • 29. Chill. It’s just semantics, man. Just Semantics? Quick and Dirty is GoodQuick and Dirty is Good
  • 30. The Technical Debt Quadrant http://martinfowler.com/bliki/TechnicalDebtQuadrant.html
  • 31. The Technical Debt Quadrant http://martinfowler.com/bliki/TechnicalDebtQuadrant.html “Let’s deploy and gather more information.”
  • 32. Technical Debt in Other Fields
  • 33. Technical Debt in Other Fields
  • 34. Technical Debt in Other Fields
  • 35. Technical Debt in Other Fields RECKLESS AND DELIBERATE RECKLESS AND DELIBERATE RECKLESS AND INADVERTENT
  • 36. The Technical Debt Quadrant http://martinfowler.com/bliki/TechnicalDebtQuadrant.html IRRESPONSIBLE INCOMPETENT “Let’s deploy and gather more information.” TECHNICAL DEBT
  • 37. 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
  • 38. 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
  • 39. Cruft or Debt? DataSet aDs, qDs, asDs, sqDs;! aDs = _dbConnector.UpdateAgentList();! qDs = _dbConnector.GetQueueList();! ! foreach (DataRow aRow in aDS.Tables[0].Rows) {! String agentID = aRow[“AgentId”].ToString();! asDs = _dbConnector.GetAgentSkills(agentID);! foreach (DataRow asRow in asDs.Tables[0].Rows) {! String agentSkill = asRow[“Skill”].ToString();! foreach (DataRow qRow in qDs.Tables[0].Rows) {! queueName = qRow[“QueueName”].ToString();! sqDs = _dbConnector.GetSkillsForQueue(queueName);! foreach (DataRow sqRow in sqDs.Tables[0].Rows) {! foreach (string skill in sqRow[“Skills”].ToString().Split(paramDelimStr)) {! if (skill == agentSkill) {! try { _dbConnector.SetAgentQueueSkill(agentID, queueName, skill); }! catch { continue; }! }! }! }! }! }! } http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
  • 40. Cruft or Debt? AgentList agents = new AgentList(_dbConnector.UpdateAgentList());! QueueList queues = new QueueList(_dbConnector.GetQueueList());! ! foreach (Agent agent in agents) {! foreach (Skill agentSkill in agent.skills) {! foreach (Queue queue in queues) {! foreach (Skill queueSkill in queue.skills.Where(x => x == agentSkill)) {! try {_dbConnector.SetAgentQueueSkill(agent.agentID, queue.name, agentSkill); }! catch { continue; }! }! }! }! } http://thedailywtf.com/Series/2010/3/CodeSOD.aspx
  • 41. 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)) { ... }
  • 42. Cruft or Debt? // If customer is Federally Regulated! 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)) { ... }
  • 43. Cruft or Debt? if (customer.isFederallyRegulated()) { ... }
  • 44. 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
  • 45. 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
  • 46. Cruft is a bad decision Every Time ❖ You are a professional developer! ❖ You’re going to create unintentional cruft! ❖ You have to clean up the existing cruft
  • 47. The Trap Cruft begets Cruft ❖ Precedent for speed over quality! ❖ Expectation of increased velocity! ❖ Cruft slows you down! ❖ Must write more cruft to keep up! ❖ Ask permission to do your job correctly
  • 48. Avoid The Trap Thresholds set false expectations http://blog.castsoftware.com/wp-content/uploads/2011/04/Technical-Debt-Software-Quality1.jpg
  • 49. Avoid The Trap Incremental fixes fail http://www.jacoozi.com/blog/wp-content/uploads/2007/01/refactoring_coc_big.jpg
  • 51. Avoid The Trap Clean Constantly ❖ Never make an intentional mess! ❖ Monitor your “Technical Debt”! ❖ Follow the Boy Scout Rule! ❖ Remember quality is your responsibility! ❖ NEVER ask permission to do your job correctly
  • 52. Monitoring Cruft/Debt A few key metrics ❖ Code Coverage! ❖ Code Complexity! ❖ Coupling! ❖ Maintainability
  • 53. Monitoring Cruft/Debt Code Coverage ❖ Code exercised by automated tests! ❖ Monitor types of tests separately! ❖ Don’t set a coverage target! ❖ 100% coverage is a smell! ❖ Monitor Trends, Not Points
  • 54. Monitoring Cruft/Debt Complexity ❖ Count of logical branches in code! ❖ Direct relationship with bugs! ❖ Typically high in concentrated areas! ❖ Reduce conditionals! ❖ Monitor Trends, Not Points
  • 55. Monitoring Cruft/Debt Coupling ❖ Interconnectedness of systems! ❖ Highly coupled is difficult to change! ❖ Afferent (toward) and Efferent (away)! ❖ Dependency Injection! ❖ Monitor Trends, Not Points
  • 56. Monitoring Cruft/Debt Make stories for cruft ❖ Velocity! ❖ Scalability! ❖ Availability! ❖ Maintainability
  • 57. Review Technical Debt ❖ A strategic design decision! ❖ Requires business to be informed! ❖ Includes a pay-back plan Cruft ❖ Happens! ❖ Needs to be monitored and cleaned! ❖ Is NOT Technical Debt
  • 58. Review Technical Debt ❖ A strategic design decision! ❖ Requires business to be informed! ❖ Includes a pay-back plan Cruft ❖ Happens! ❖ Needs to be monitored and cleaned! ❖ Is NOT Technical Debt NEVER ask perm ission to do your job correctly
  • 59. The
 Technical Debt Trap Doc Norton! doc@groupon.com! @DocOnDev Comments / Questions?
  • 60. The
 Technical Debt Trap Doc Norton! doc@groupon.com! @DocOnDev Thank You!