$30 off During Our Annual Pro Sale. View Details »

The Technical Debt Trap

The Technical Debt Trap

This is a version of the talk given at Dev Bootcamp in Chicago.

Technical Debt has become a catch-all phrase for any code that needs to be re-worked. Much like Refactoring has become a catch-all phrase for any activity that involves changing code. These fundamental misunderstandings and comfortable yet mis-applied metaphors have resulted in a plethora of poor decisions. What is technical debt? What is not technical debt? Why should we care? What is the cost of misunderstanding? What do we do about it? Doc discusses the origins of the metaphor, what it means today, and how we properly identify and manage technical debt.

Michael (Doc) Norton

October 20, 2015
Tweet

More Decks by Michael (Doc) Norton

Other Decks in Programming

Transcript

  1. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The
    technical Debt
    Trap

    View Slide

  2. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Doc Norton, CEO
    [email protected]
    @DocOnDev

    View Slide

  3. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    what is technical debt?

    View Slide

  4. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    OOPSLA ‘92
    Shipping first time code is like
    going into debt.

    View Slide

  5. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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.
    – Ward Cunningham
    OOPSLA ‘92

    View Slide

  6. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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.
    The danger occurs when the
    debt is not repaid. Every minute
    spent on not-quite-right code
    counts as interest on that debt. – Ward Cunningham
    OOPSLA ‘92

    View Slide

  7. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The danger occurs
    when the debt is not
    repaid. Every minute
    spent on not-quite-
    right code counts as
    interest on that debt. – Ward Cunningham
    OOPSLA ‘92

    View Slide

  8. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The danger occurs
    when the debt is not
    repaid. Every minute
    spent on not-quite-
    right code counts as
    interest on that debt. – Ward Cunningham
    OOPSLA ‘92

    View Slide

  9. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is

    View Slide

  10. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is
    good

    View Slide

  11. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is good

    View Slide

  12. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is
    good

    View Slide

  13. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is
    a strategic decision

    View Slide

  14. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical debt is
    a strategic decision
    • Allow for Rapid Delivery
    • To Elicit Quick Feedback
    • And Correct Design

    View Slide

  15. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt is
    an indication of learning

    View Slide

  16. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt is
    an indication of learning
    • Now know what you need
    • Implementation doesn’t match

    View Slide

  17. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt is a metaphor

    View Slide

  18. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    metaphors 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)

    View Slide

  19. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    metaphorphosis
    when metaphors go wrong
    Credit Card
    SHORT-TERM
    Long-Term
    Return on
    Investment
    OPERATIONAL
    HOME LOAN
    Loan Shark
    PRAGMATIC
    LEVERAGE
    Intentional
    AUTO LOAN
    FRAUDULENT
    VOLUNTARY
    PYRAMID SCHEME
    Prudent
    Student Loan
    HIGH INTEREST
    INADVERTENT
    RECKLESS DEBT IN
    THE THIRD
    QUADRANT

    View Slide

  20. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    metaphorphosis
    when metaphors go wrong
    “quick and dirty”
    - Martin Fowler
    “sloppy”
    - David Laribee
    “just hack it in”
    - Steve McConnell
    “CUT A LOT OF CORNERS”
    - James Shore

    View Slide

  21. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “We must ship now and
    deal with
    consequences”
    “Now we know how we
    should have done it”
    “What’s Layering?”

    View Slide

  22. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    Youtube ‘09
    [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.

    View Slide

  23. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    Youtube ‘09
    confused the
    debt metaphor
    with the idea that
    you could write
    code poorly

    View Slide

  24. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    Youtube ‘09
    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.

    View Slide

  25. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    Youtube ‘09
    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.

    View Slide

  26. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    twitter ‘09
    Dirty code is to
    technical debt as the
    pawn broker is to
    financial debt.

    View Slide

  27. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    – Ward Cunningham
    twitter ‘09
    Dirty code is to
    technical debt as the
    pawn broker is to
    financial debt.
    Don’t think you are
    ever going to get your
    code back.

    View Slide

  28. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt?
    Ask yourself…

    View Slide

  29. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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?

    View Slide

  30. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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?

    View Slide

  31. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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

    View Slide

  32. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    mess (noun)

    View Slide

  33. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    mess (noun)
    • Disorderly accumulation, heap, or jumble
    • A state of embarrassing confusion
    • An unpleasant or difficult situation

    View Slide

  34. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    cruft (noun)

    View Slide

  35. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    cruft (noun)
    • An unpleasant substance
    • The result of shoddy construction
    • Redundant, old or improperly written code

    View Slide

  36. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    But, It’s Just
    semantics

    View Slide

  37. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    It’s not Just
    semantics

    View Slide

  38. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    It’s not Just
    semantics
    Technical Debt is Good

    View Slide

  39. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    It’s not Just
    semantics
    Technical Debt is Good
    Quick and Dirty is Technical Debt

    View Slide

  40. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    It’s not Just
    semantics
    Quick and Dirty is Good

    View Slide

  41. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    It’s not Just
    semantics
    Quick and Dirty is Good

    View Slide

  42. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “We must ship now and
    deal with
    consequences”
    “Now we know how we
    should have done it”
    “What’s Layering?”

    View Slide

  43. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “Let’s deploy and
    gather more
    information”
    “Now we know how we
    should have done it”
    “What’s Layering?”

    View Slide

  44. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt in other fields

    View Slide

  45. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt in other fields

    View Slide

  46. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical Debt in other fields

    View Slide

  47. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Technical Debt in other fields

    View Slide

  48. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt in other fields

    View Slide

  49. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    RECKLESS AND DELIBERATE
    technical debt in other fields

    View Slide

  50. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    RECKLESS AND DELIBERATE
    RECKLESS AND DELIBERATE
    technical debt in other fields

    View Slide

  51. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    RECKLESS AND DELIBERATE
    RECKLESS AND DELIBERATE
    RECKLESS AND INADVERTENT
    technical debt in other fields

    View Slide

  52. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “Let’s deploy and
    gather more
    information”
    “Now we know how we
    should have done it”
    “What’s Layering?”

    View Slide

  53. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “Let’s deploy and
    gather more
    information”
    “Now we know how we
    should have done it”
    “What’s Layering?”
    IRRESPONSIBLE

    View Slide

  54. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “Let’s deploy and
    gather more
    information”
    “Now we know how we
    should have done it”
    “What’s Layering?”
    IRRESPONSIBLE
    INCOMPETENT

    View Slide

  55. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    technical debt quadrant
    Reckless
    Inadvertent
    Prudent
    Deliberate
    “We don’t have time
    for design”
    “Let’s deploy and
    gather more
    information”
    “Now we know how we
    should have done it”
    “What’s Layering?”
    IRRESPONSIBLE
    INCOMPETENT
    TECHNICAL
    DEBT

    View Slide

  56. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    cruft or debt?

    View Slide

  57. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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; }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    cruft or debt?

    View Slide

  58. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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; }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }

    View Slide

  59. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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; }
    }
    } } } } } } } } } } } } }

    View Slide

  60. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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; }
    } } } } } }

    View Slide

  61. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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; }
    }
    }
    }
    }

    View Slide

  62. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev

    View Slide

  63. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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?

    View Slide

  64. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    // 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)) { ... }

    View Slide

  65. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    if (customer.isFederallyRegulated()) { ... }

    View Slide

  66. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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?

    View Slide

  67. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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

    View Slide

  68. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    cruft is a bad decision

    View Slide

  69. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    cruft is a bad decision
    • You are a professional developer
    • You’re going to create unintentional cruft
    • You have to clean up the existing cruft

    View Slide

  70. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The Trap

    View Slide

  71. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The Trap
    • 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

    View Slide

  72. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    failing strategies

    View Slide

  73. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    failing strategies

    View Slide

  74. View Slide

  75. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    winning strategy
    Clean Constantly

    View Slide

  76. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    winning strategy
    Clean Constantly
    • Never make an intentional mess
    • Monitor your “Technical Debt”
    • Follow the Boy Scout Rule
    • Remember quality is your responsibility

    View Slide

  77. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    winning strategy
    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

    View Slide

  78. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Monitor your cruft

    View Slide

  79. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Monitor your cruft
    • Code Coverage
    • Code Complexity
    • Coupling
    • Maintainability
    • Monitor Trends, Not Points

    View Slide

  80. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    review
    Technical Debt
    Cruft

    View Slide

  81. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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

    View Slide

  82. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    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
    issio
    n
    to
    do
    yo
    ur
    jo
    b
    co
    rrectly

    View Slide

  83. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    comments
    or
    questions?
    Doc Norton, CEO
    [email protected]
    @DocOnDev

    View Slide

  84. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    Thank You!
    Doc Norton, CEO
    [email protected]
    @DocOnDev

    View Slide

  85. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    The
    technical Debt
    Trap

    View Slide

  86. #DevBootcamp / #TechnicalDebtTrap / @DocOnDev
    • OOPSLA 92 Paper - http://dl.acm.org/citation.cfm?
    id=157715, http://c2.com/doc/oopsla92.html
    • Ward Cunningham Technical Debt Video - http://
    www.youtube.com/watch?
    v=pqeJFYwnkjE&feature=player_embedded
    • Ward Cunningham Twitter - http://twitter.com/
    WardCunningham/status/3742903303
    • Technical Debt Quadrant - http://martinfowler.com/
    bliki/TechnicalDebtQuadrant.html
    • James Shore - http://jamesshore.com/Blog/
    CardMeeting/Voluntary-Technical-Debt.html
    • Martin Fowler - http://www.martinfowler.com/bliki/
    TechnicalDebt.html
    • David Larabee - http://msdn.microsoft.com/en-us/
    magazine/ee819135.aspx
    • Steve McConnell - http://blogs.construx.com/blogs/
    stevemcc/archive/2007/11/01/technical-debt-2.aspx
    • Jon Stewart - http://big.assets.huffingtonpost.com/
    JonConfused.gif
    • Cruft Example 1 - http://thedailywtf.com/Series/
    2010/3/CodeSOD.aspx
    • Debt Threshold - http://blog.castsoftware.com/wp-
    content/uploads/2011/04/Technical-Debt-Software-
    Quality1.jpg
    • Hardening Sprints - http://blog.castsoftware.com/wp-
    content/uploads/2011/04/Technical-Debt-Software-
    Quality1.jpg

    View Slide