Download - Managing Technical Debt

Transcript
Page 1: Managing Technical Debt

Managing Technical DebtPierre G. Boutquin

Page 2: Managing Technical Debt

Welcome!

Welcome to the Toronto ALM User Group“TALMUG”

Page 3: Managing Technical Debt

Thank You, Sponsors!

Page 4: Managing Technical Debt

Choosing or Not Choosing Technical Debt

Agenda or Summary LayoutA second line of text could go here

Agenda; TALMUG; Me

Debt Characteristics

Discovering and Preventing Technical Debt

Discussion

Intro

Part I

Part II

Part III

End

???

Page 5: Managing Technical Debt

Work ExperienceAbout Me

Page 6: Managing Technical Debt

Programming ExperienceAbout Me

Page 7: Managing Technical Debt

AuthorAbout Me

Page 8: Managing Technical Debt

About today’s talk…Under Promising…

Page 9: Managing Technical Debt

History of a Metaphor

Ward Cunningham

1992

Page 10: Managing Technical Debt

Part I: Debt Characteristics

Page 11: Managing Technical Debt

Deliberate vs. Inadvertent Prudent vs. Reckless

Debt: Good or Bad?Depends…

http://martinfowler.com/bliki/TechnicalDebtQuadrant.html

Page 12: Managing Technical Debt

Faster Short Term Benefit Extra Cost

Why Debt?Trade-Off…

Page 13: Managing Technical Debt

Extra Cost (Interest) As Long as Debt (Principal) NOT Paid Off

Debt DrawbackPrincipal/Interest

Page 14: Managing Technical Debt

Perpetual Debt Growing Interest

Unmanaged DebtAka My Credit Card

Page 15: Managing Technical Debt

Deliberate Trade-Off: Maybe Prudent

Inadvertent Debt: Likely Reckless

Incurring DebtReckless vs. Prudent

Page 16: Managing Technical Debt

Benefits Outweigh Extra Costs Affordable Repayment Plan

Deliberate DebtWhen Prudent?

Page 17: Managing Technical Debt

Deliberate Decision Positive Cost/Benefit Planned, Affordable Repayment Prudent Total Debt

Acceptable Debt4 Criteria:

Page 18: Managing Technical Debt

Inadvertent Decision Negative or Small Cost/Benefit Repayment Not Planned/Too High Reckless Total Debt

Unwise Debt4 Tell-Tale Signs

Page 19: Managing Technical Debt

Total Level of Deliberateness Size of Cost/Benefit Affordability of Repayment Total Debt Load

PART I - ConclusionDebt Criteria:

Page 20: Managing Technical Debt

Part II: Deliberate Technical DebtChoosing or Not Choosing Debt…

Page 21: Managing Technical Debt

Good: Deliver Early/On Time Bad: Detestable Code Ugly: The Spike

Deliberate Technical DebtWhy???

Page 22: Managing Technical Debt

Maybe: Date Driven Development Yes: Feature Driven Development

Deliberate Technical DebtAvoidable?

Page 23: Managing Technical Debt

Shipping Date is Fixed Features Are Negotiable Often Less Desirable

Deliberate Technical DebtDate-Driven Project

Page 24: Managing Technical Debt

Features Are Fixed Shipping Date Is Negotiable Often More Desirable

Deliberate Technical DebtFeature-Driven Project

Page 25: Managing Technical Debt

Release Planning Tool Combines Well With Prioritization

The MVP Concept“Minimal Viable Product”

Page 26: Managing Technical Debt

PrioritizationSometimes…

Page 27: Managing Technical Debt

Agile/Scrum: Backlog Traditional: Prioritization Needs Forethought

PrioritizationKey: By Business Value

Page 28: Managing Technical Debt

MUST: Part of MVP SHOULD: High-Priority COULD: Nice to Have WOULD: Maybe Later

MoSCoW Prioritization

Page 29: Managing Technical Debt

Part III: Minimizing Inadvertent Debt

Discovering and Preventing Debt…

Page 30: Managing Technical Debt

Process Tools

Minimizing: How?2 Angles:

Page 31: Managing Technical Debt

Process: SDLC process: Engineering Practices

Test First Development

Minimizing: How?Process vs. process

Page 32: Managing Technical Debt

Communications Technical Excellence

Minimizing: Type of Tools2 Objectives:

Page 33: Managing Technical Debt

Standup Meeting Shared SME Design Reviews Code Reviews

Minimizing: Communication ToolsTools We Use:

Page 34: Managing Technical Debt

Unit Tests Code Contracts Static Code Analysis

Adherence to Coding Standard Good Coding Practices

Code Metrics

Minimizing: Technical ToolsTools We Use:

Page 35: Managing Technical Debt

Tool: Unit TestsRecommended Book: “The Art of Unit Testing”

http://www.manning.com/osherove2/

Page 36: Managing Technical Debt

A Unit Test is an automated piece of code that invokes the unit of work being tested and then checks some assumptions about a single end result of that unit.

A unit test is almost always written using a unit-testing framework. It can be written easily and runs quickly.

Tool: Unit TestsRoy Osherove’s Definition:

Page 37: Managing Technical Debt

A Unit Test is trustworthy, readable and maintainable. It is consistent in its results as long as the production code has not changed.

Tool: Unit TestsRoy Osherove’s Definition (cont’d):

Page 38: Managing Technical Debt

• /// <summary>• /// This test demonstrates that constructor of • /// the <see cref="VenomSender" /> class is creating a topic session• /// when it is being given valid configuration.• /// </summary>• [TestMethod]• public void Constructor_ValidTibcoConfig_ReturnsNonNullTopicSession()• {• // ARRANGE• var tibcoConfig = TestUtils.CreateValidTibcoConfig();

• // ACT• var venomSender = new VenomSender(tibcoConfig);

• // ASSERT• Assert.IsNotNull(venomSender.TopicSession);• }

Unit Test Tips: Naming Convention[UnitOfWork]_[Condition]_[ExpectedResult]

Page 39: Managing Technical Debt

• /// <summary>• /// This test demonstrates that constructor of • /// the <see cref="VenomSender" /> class is creating a topic session• /// when it is being given valid configuration.• /// </summary>• [TestMethod]• public void Constructor_ValidTibcoConfig_ReturnsNonNullTopicSession()• {• // ARRANGE• var tibcoConfig = TestUtils.CreateValidTibcoConfig();

• // ACT• var venomSender = new VenomSender(tibcoConfig);

• // ASSERT• Assert.IsNotNull(venomSender.TopicSession);• }

Unit Test Tips: Design PatternDesign Pattern: AAA

Page 40: Managing Technical Debt

Use Happy Path Factory Helper Then, Create Single Sad Path Test Both Exception Type & Message

Unit Test Tips: Sad PathsMaintainability Tip:

Page 41: Managing Technical Debt

• /// <summary>• /// This test demonstrates that constructor of • /// the <see cref="VenomSender" /> class is throwing an exception• /// when it is being passed a null SslCertStoreName.• /// </summary>• [TestMethod]• public void Constructor_nullSslCertStoreName_ThrowsException()• {• // ARRANGE• var tibcoConfig = TestUtils.CreateValidTibcoConfig();• tibcoConfig.SslCertStoreName = null;

• // ACT• var venomSender = new VenomSender(tibcoConfig);

• // ASSERT• // etc,• }

Unit Test Tips: Sad PathDesign Pattern:

Page 42: Managing Technical Debt

Method-Level Measure Calculated from Control Flow Graph Smaller Values Better <= 25 Acceptable

Code MetricsCyclomatic Complexity

Page 43: Managing Technical Debt

Synthesis of Three Metrics Cyclomatic Complexity Lines of Code Computational Complexity

Icons Color-Coded GREEN (>20) YELLOW (10-20) RED (<10)

Not Expressed in Units!

Code MetricsMaintainability Index

Page 44: Managing Technical Debt

New to Me No Best Practices To Share Yet…

Code ContractsNow Part of .NET!

Page 45: Managing Technical Debt

Partially Matter of Opinion Let Tool Decide

StyleCop ReSharper

Coding StandardThe Final Word…

Page 46: Managing Technical Debt

Managing Technical Debt

Page 47: Managing Technical Debt

Questions?