one in six of the projects we studied was a black swan, with a cost overrun of 200%, on average, and a schedule overrun of almost 70%. • Wildly complex systems are difficult to build and update. • In the past we have tried to manage complexity by doing a lot of Big Design Up Front and other forms of change control. • Today we have tools to address the root causes and build better, more manageable software. • It is fiscally responsible to do so.
of these specifications - but nothing in the above list insures well crafted code or any notion of maintainability. Cost of Delivery •Features •Delivery Dates •Performance •Usability •Availability •Capacity •Security •Cost •Branding, Design & Appearance
to requirements, unstated requirements can be lost. If code quality is not a requirement then developers may... • Get it working now and polish it later (later equals never) • Resort to comfortable but non-standard patterns • Choose to forego some (or all?) unit tests There is a financial incentive to meet, not exceed requirements. Requirements seldom reflect cost of ownership (hold that thought).
code when each routine you read turns out to be pretty much what you expected. You can call it beautiful code when the code also makes it look like the language was made for the problem.” -Ward Cunningham, as quoted in Clean Code, Prentice Hall, 2008
that enables programmers, coders, bug-fixers, and people coming to the code later in its life to understand its construction and intentions and to change it comfortably and confidently.” -Richard Gabriel, Patterns of Software, Oxford University Press, 1996
And this is what we want in software — that developers feel at home, can place their hands on any item without having to think deeply about where it is.” -Richard Gabriel, Patterns of Software, Oxford University Press, 1996
over Configuration (CoC) • Don't Repeat Yourself (DRY) • Fluent Interface • Gang of Four's (GoF) Design Patterns • Loose Coupling and High Cohesion • Release Early, Release Often (RERO) • The S.O.L.I.D. Principles • Test-Driven Design (TDD) • You Ain't Gonna Need It (YAGNI) What is Craftsmanship? An approach to development that exhibits certain values. These values can lead to principles and practices.
Software works, or it doesn't • Journeyman - Software judged by how clean it is • Master - Software development becomes a series of calculated trade-offs When the design works and is habitable, it is easier to live with the outcomes of your decisions.
way that is “clean” and easy to understand, productivity drops over time. Declining productivity curve means that the cost per feature grows, sometimes dramatically over time. This headwind of cost strangles a mature product trying to compete in a dynamic environment when changes needed by the business become crushingly expensive.
by any means necessary - compromises are made, knowledge is siloed and productivity declines further . Eventually the codebase will be so tangled that it seems easier to rewrite the whole thing from scratch. Re-development begins without the discipline required to insure that the code is “clean” and easy to understand. Repeat.
Craft that is arguably needed in the IT community. • Clarifies expectations and helps with the mutual selection process of hiring. • Creates a dialog which many were previously struggling to have. • Provides a nucleus for a community of professionals which may lead to common language and convergence.
how to encourage best practices Top Down Dictates There are over 17,000 “Java” jobs on Dice.com • 1469 mention “Design Patterns” • 928 mention “Continuous” • 155 mention “Refactoring” • 86 mention “Craft” or “Crafted”
a craft, and blacksmithing: • Technical knowledge required, but not sufficient • Need practice and skill with specialized tools • An eye for aesthetics It takes a blacksmith to train a blacksmith.
right metrics • Hire craftsmen who are skilled mentors • Hire motivated apprentices and interns • Set an example: Right Thing – Right Way • Provide an environment that values craft