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

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 itAlberto Brandolini
 
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 writtenDaniel Davis
 
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 DevelopmentBartek Gatz
 
Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Escaping Test Hell - ACCU 2014
Escaping Test Hell - ACCU 2014Wojciech Seliga
 
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 2005Henry Jacob
 

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

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
 
Experimentation Mindset
Experimentation MindsetExperimentation Mindset
Experimentation MindsetDoc 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
 
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
 
Codemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingCodemash pre-compiler - Collaborative Decision Making
Codemash pre-compiler - Collaborative Decision MakingDoc Norton
 
A Practical Guide to Cynefin
A Practical Guide to CynefinA Practical Guide to Cynefin
A Practical Guide to CynefinDoc 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
 
Doc That Conference Keynote
Doc That Conference KeynoteDoc That Conference Keynote
Doc That Conference KeynoteDoc 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
 
Creative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsCreative Collaboration: Tools for Teams
Creative Collaboration: Tools for TeamsDoc Norton
 
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 2017Matthew Philip
 

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

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 TrapDoc Norton
 
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
 
CiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForceCiklumJavaSat_15112011:Alex Kruk VMForce
CiklumJavaSat_15112011:Alex Kruk VMForceCiklum Ukraine
 
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 ClubData Con LA
 
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
 
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 InnovateSteve Andrews
 
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)Ricardo Castelhano
 
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 beKyle Simpson
 
Architecture in an Agile World
Architecture in an Agile WorldArchitecture in an Agile World
Architecture in an Agile WorldDon McGreal
 
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 2022HostedbyConfluent
 
Cash Flow Forecaster presentation
Cash Flow Forecaster presentationCash Flow Forecaster presentation
Cash Flow Forecaster presentationCashforce
 
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 ScenarioQuest
 
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 testsMichelangelo van Dam
 
Data Mining Open Ap Is
Data Mining Open Ap IsData Mining Open Ap Is
Data Mining Open Ap Isoscon2007
 
Taming technical debt
Taming technical debt Taming technical debt
Taming technical debt Panji Gautama
 
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 2018Steven Smith
 
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.docxSONU61709
 

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

Tuckman Was Wrong
Tuckman Was WrongTuckman Was Wrong
Tuckman Was WrongDoc 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
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the GoalDoc Norton
 
Do I have a role?
Do I have a role?Do I have a role?
Do I have a role?Doc Norton
 
Velocity is not the Goal
Velocity is not the GoalVelocity is not the Goal
Velocity is not the GoalDoc Norton
 
CodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoaCodeStock :: Introduction To MacRuby and HotCocoa
CodeStock :: Introduction To MacRuby and HotCocoaDoc Norton
 
Oredev :: The Technical Debt Trap
Oredev :: The Technical Debt TrapOredev :: The Technical Debt Trap
Oredev :: The Technical Debt TrapDoc Norton
 
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 CareerDoc Norton
 
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 EditionDoc 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

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfDrew Moseley
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 

Recently uploaded (20)

Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdf
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 

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!