9. 99
Possible Reasons
Development spends too much time in understanding existing
implementation
Class names are too generic and hence the responsibility of a class
gets wide and complex
Business rules are spread across multiple architectural layers
Too many if / else and switch / cases in classes
Direct usage of implementation classes in parent modules
11. 1111
“Technical Debt is a wonderful metaphor developed
by Ward Cunningham… In this metaphor, doing
things the quick and dirty way sets us up with a
technical debt, which is similar to a financial debt.
Like a financial debt, the technical debt incurs
interest payments, which come in the form of the
extra effort that we have to do in future
development because of the quick and dirty
design choice.
- Martin Fowler
13. 1313
“There are four primary symptoms that tell us that
our designs are rotting. They are not orthogonal,
but are related to each other in ways that will
become obvious. they are: rigidity, fragility,
immobility, and viscosity.
- Uncle Bob
17. 1717
SUCH AS
Forcing your team to continuously work long hours.
Burning out your best team members.
High churn rate of resources.
Create psychological divide between development, testing and
operations team.
Setting up your team member to just play safe.
Basically, unpleased work environment.
At the worst - completely scrapping the project.
http://blogs.msdn.com/b/karchworld_identity/archive/2011/04/01/lehman-s-laws-of-software-evolution-and-the-staged-model.aspxAccording to several sources, and perhaps counter to intuition, the maintenance of software comprises from 50% to 90% of the overall lifecycle costs (Pigoski, 1997; Lientz & Swanson, 1980)
Like a financial debt, the technical debt incurs interest payments, which come in the form of the extra effort that we have to do in future development because of the quick and dirty design choice. We can choose to continue paying the interest, or we can pay down the principal by refactoring the quick and dirty design into the better design. Although it costs to pay down the principal, we gain by reduced interest payments in the future.
5.3.1 – Hinder Maintenance5.3.2 – Prevent Extensibility5.3.3 – Inhibit Reusability5.3.4 – Restrict Testability5.3.5 – Hamper Integration5.3.6 – Limit UnderstandingThere are four primary symptoms that tell us that our designs are rotting. They are not orthogonal, but are related to each other in ways that will become obvious. they are: rigidity, fragility, immobility, and viscosity.
Big Ball of Mud (a.k.a. Shantytown, Spaghetti Code)Throwaway Code (a.k.a. Quick Hack, Kleenex Code, Disposable Code, Scripting, Killer Demo, Permanent Prototype, Boomtown)Piecemeal Growth (a.k.a. Urban Sprawl, Iterative-Incremental Development)Keep It Working (a.k.a. Vitality, Baby Steps, Daily Build, First Do No Harm)Shearing LayersSweeping It Under The Rug (a.k.a. Potemkin Village, Housecleaning, Pretty Face, Quarantine, Hiding it Under the Bed, Rehabilitation)Reconstruction (a.k.a. Total Rewrite, Demolition, Plan to Throw One Away, Start Over)
Like a financial debt, the technical debt incurs interest payments, which come in the form of the extra effort that we have to do in future development because of the quick and dirty design choice. We can choose to continue paying the interest, or we can pay down the principal by refactoring the quick and dirty design into the better design. Although it costs to pay down the principal, we gain by reduced interest payments in the future.
All told eight laws were formulated:(1974) Continuing Change — E-type systems must be continually adapted or they become progressively less satisfactory.[3](1974) Increasing Complexity — As an E-type system evolves its complexity increases unless work is done to maintain or reduce it.[3](1974) Self Regulation — E-type system evolution process is self-regulating with distribution of product and process measures close to normal.[3](1978) Conservation of Organisational Stability (invariant work rate) - The average effective global activity rate in an evolving E-type system is invariant over product lifetime.[3](1978) Conservation of Familiarity — As an E-type system evolves all associated with it, developers, sales personnel, users, for example, must maintain mastery of its content and behaviour to achieve satisfactory evolution. Excessive growth diminishes that mastery. Hence the average incremental growth remains invariant as the system evolves.[3](1991) Continuing Growth — The functional content of E-type systems must be continually increased to maintain user satisfaction over their lifetime.(1996) Declining Quality — The quality of E-type systems will appear to be declining unless they are rigorously maintained and adapted to operational environment changes.(1996) Feedback System (first stated 1974, formalised as law 1996) — E-type evolution processes constitute multi-level, multi-loop, multi-agent feedback systems and must be treated as such to achieve significant improvement over any reasonable base.
Modularity Patterns – Manages Structural ModularityGoF Patterns – Manages Logical ModularitySOLID helps us define the boundary for classes and packages