# The Software Craftsman

I really loved this [great book](https://www.amazon.fr/Software-Craftsman-Professionalism-Pragmatism-Pride/dp/0134052501) from [Sandro Mancuso](https://twitter.com/sandromancuso).&#x20;

![](https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MAffO8xa1ZWmgZvfeK2%2F-MBsPCaANtOAsjncEMj3%2F-MBsQXGluWgVZqlLyj8s%2Fimage.png?alt=media\&token=faaa2bf2-8dc7-4e6f-b013-76c9222b6918)

## Infography

I love this book so much that I have created an infography :&#x20;

![The Software Craftsman Infographic](https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2FWhJJjccoxe3gwVvULqLq%2FThe-Software-Craftsman.webp?alt=media\&token=9b87accb-55f6-4d86-8501-25a194e4d058)

{% file src="<https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MAffO8xa1ZWmgZvfeK2%2Fuploads%2F63yFNA9kkJSBLcgusctM%2FThe%20Software%20Craftsman.pdf?alt=media&token=bbfab9ed-b07c-410b-896b-99dc4a8430d7>" %}

![The Software Craftsman infography](https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MAffO8xa1ZWmgZvfeK2%2F-MBsT6gun_BODhCpqhEU%2F-MBsTRhut0a1SNAbYctp%2Fimage.png?alt=media\&token=4db44dbf-02a9-4b9f-9a9e-a914cb13e2c3)

## Book notes

### Introduction&#x20;

* Good senior developer in the 90's : No one else can understand his code&#x20;
* Working code&#x20;
  * The minimum for a professional&#x20;
  * How it is done is as important as getting it done&#x20;
* Is
  * A mindset&#x20;
    * For developers
    * For companies&#x20;
  * Adoption of (XP)&#x20;
    * Practices&#x20;
    * Disciplines&#x20;
  * Not a methodology

### Ideology

#### A new reality

What modern developers do :

* Coding (But not only)
* Speak to customers&#x20;
* Automate tests/deployment&#x20;
* Make technical choices&#x20;
* Work in distributed teams&#x20;
* Help clients to define and prioritize requirements&#x20;
* Present products to potential clients/partners&#x20;
* Help with pre-sales activities&#x20;
* Estimate time & costs&#x20;
* Interview new team members&#x20;
* Design and evolve software architecture&#x20;
* Understand business goals&#x20;
* Make decisions based on trade-offs&#x20;
* Keep an eye on new technologies/methodologies&#x20;
* ...

{% hint style="info" %}
With agile methodologies, mentality is evolving. More collaboration and dev are now more proud to be dev
{% endhint %}

#### Agile&#x20;

* 2 types of disciplines
  * Process oriented (Value)
    * Plan&#x20;
    * Measure velocity&#x20;
    * Roles people should play&#x20;
    * Meetings&#x20;
    * ...&#x20;
  * Technical Oriented&#x20;
    * TDD&#x20;
    * Continuous integration&#x20;
    * ...&#x20;

{% hint style="success" %}
***Agility is about building the right thing, Craftsmanship is about building the thing right***&#x20;
{% endhint %}

* "Craftsmanship over crap", Robert C. Martin (2008)&#x20;
* Team = responsible of the realization (all aspects)&#x20;
* **Being good at writing code is the minimum skill expected from software professionals"**

#### Why do agile transformations fail ?&#x20;

* In software project&#x20;
  * Most important deliverable = software itself&#x20;
* Change their process through coaching&#x20;
* **Nothing to help writing better software**&#x20;
* Agile coaches&#x20;
  * Mainly focused on process&#x20;
  * Not focused on technical excellence

#### Abstract

* To remain competitive companies need to deliver
  * Software faster&#x20;
  * With better quality&#x20;
* Agile vs software craftsmanship&#x20;
  * Agile&#x20;
    * Adopting Scrum&#x20;
    * Daily stand-up&#x20;
    * Manage backlog&#x20;
    * Manage W\.I.P&#x20;
  * Agility does not&#x20;
    * Improve magically the quality of the software&#x20;
    * Make developers better&#x20;
* Complements each other / need to be focused on both&#x20;
  * Improve the process&#x20;
  * Improve technical excellence

### The Manifesto for Software Craftsmanship (2008)

#### 4 values

`Not only working software, but also well-crafted software`

* Think about a software&#x20;
  * Without&#x20;
    * Tests&#x20;
    * Team to explain code&#x20;
  * You have to maintain and develop on it&#x20;
  * It is a working software...&#x20;
* Reasons of failures&#x20;
  * Bad business strategy&#x20;
  * Bad project management&#x20;
  * Big Time To Market Organization do not pay attention to code quality&#x20;
* Well-crafted&#x20;
  * Automated tests&#x20;
  * TDD
  * Business language in code&#x20;
  * Simple design&#x20;
* Quality of the code&#x20;
  * Only visible by dev&#x20;
  * No time allowed to refactor&#x20;

{% hint style="danger" %}
Quality of the code may not guarantee the success of a project But can be the main cause of failure.
{% endhint %}

`Not only responding to change, but also steadily adding value`

* Not just
  * Adding new features&#x20;
  * Fixing bugs&#x20;
* BUT also&#x20;
  * Improve constantly structure of the code
  * Keep it clean&#x20;
  * Testable
  * Extendable
  * Change must be fast enough&#x20;
* High Quality Software

`Not only individuals and interactions, but also a community of professionals`

* Sharing&#x20;
  * Knowledge&#x20;
  * Ideas
  * Successes and failures&#x20;
  * Humility
    * Learning from each others&#x20;
* Mentoring
  * Prepare the next generation&#x20;
* Craftsmen want to work with
  * Passionates&#x20;
  * Inspiring professionals

\
`Not only customer collaboration, but also productive partnerships`

* Productive partnerships
  * Not only do what you are told to do
    * Not factory workers&#x20;
  * Passionate & talented people want&#x20;
    * Success
    * Successful projects&#x20;
  * We must help our clients
* Some clients are not ready&#x20;
  * Software development = industrial process&#x20;
  * Developer have to follow orders&#x20;
  * Recrute cheaper devs&#x20;
  * Will not listen devs Tech leads = outdated people&#x20;
  * Very difficult environment for craftsman

#### Software Craftsman

* Believes that&#x20;
  * Software is a craft&#x20;
  * Writing good software requires&#x20;
    * Skill&#x20;
    * Careful attention&#x20;
* Practices his craft&#x20;
  * To become more skillful&#x20;
  * To produce better software&#x20;
* A professional&#x20;
  * Work is consistently of high quality

#### Goal of the manifesto

{% hint style="info" %}
***Reduce the gap between Agile methodologies Technical world***
{% endhint %}

### Definition

* Is NOT
  * Beautiful code&#x20;
  * Test Driven Development&#x20;
  * Self selected group of people&#x20;
  * Specific technologies/methodologies&#x20;
  * Certifications&#x20;
  * Religion
* Mindset&#x20;
  * Consider software dev as a craft&#x20;
  * A long journey to mastery&#x20;
  * Choose to be responsible for their own careers&#x20;
  * Constant learning&#x20;
    * Tools&#x20;
    * Techniques&#x20;
  * ***Key words***&#x20;
    * Responsibility
    * Professionalism
    * Pragmatism
    * Pride&#x20;
  * Learning from others&#x20;
  * Share knowledge
  * Caring about what they do&#x20;
  * Help customers

#### Attitude

* Constantly finding ways to become better professional&#x20;
* Continuous learning
* ***"Who owns your career ?"***&#x20;
  * What if our company&#x20;
    * Does not buy any books&#x20;
    * Never sent us to any training course or conferences&#x20;
    * Does that mean the company is bad ?&#x20;
  * Ourselves
    * We are professionals
    * We own our careers&#x20;
    * We must keep us up to date&#x20;
      * Books&#x20;
        * Tech specific&#x20;
        * Conceptual&#x20;
        * Behavorial&#x20;
        * Revolutionary
      * Blogs&#x20;
      * Tech websites&#x20;
      * Social medias
* `Practice, practice, practice`
  * **The more we practice, the more comfortable** **we become**&#x20;
  * Katas&#x20;
    * Simple coding exercices&#x20;
    * To practice&#x20;
      * Techniques/approaches&#x20;
      * Languages&#x20;
      * Technologies&#x20;
  * Pet projects&#x20;
    * Real projects&#x20;
      * Without pressure&#x20;
      * You choose technologies & methodologies&#x20;
  * Open source&#x20;
    * Contributes to projects&#x20;
  * Pair program&#x20;
    * Enhances team spirit&#x20;
    * Social activity&#x20;
    * Knowledge sharing&#x20;
    * Open minds&#x20;
      * Learn&#x20;
      * Share
      * Or both&#x20;
  * Discovery&#x20;
    * Second level of ignorance&#x20;
    * I don't know what I don't know&#x20;
    * Accept the fact that we have a lot to learn&#x20;
      * Sign of maturity&#x20;
      * A first step to mastery
  * Share

{% hint style="info" %}
*"I*'***m the smartest man in Athens because I know that I know nothing"** - Socrates*
{% endhint %}

#### Abstract

* Essential to a successful career&#x20;
  * Determination&#x20;
  * Passion
* The day we stop learning & practicing&#x20;
  * The day we start losing control of our own careers&#x20;
* Focus&#x20;
  * Becoming better professionals&#x20;
  * Not on "how do I get my promotion/bonus"&#x20;

{% hint style="info" %}
Peter's principle : "***Only incompetent people are scared to lose their job***"
{% endhint %}

### Technical Practices

* `For building the right thing` :
  * Feedback loops&#x20;
  * Visualizing WIP&#x20;
  * Backlogs&#x20;
  * Stand ups&#x20;
  * User Stories&#x20;
  * Acceptance criteria&#x20;
  * Definitions : Ready / Done
* `For building the thing right ?`

![](https://1936518372-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MAffO8xa1ZWmgZvfeK2%2F-MBsYWduKEPpsN190lHS%2F-MBsZ6HbYdYpxP-eolrI%2Fimage.png?alt=media\&token=52ecd2fd-fe83-4793-8437-9a5a03525f55)

* How do I sell tech practices ?&#x20;
  * Focus on the benefits&#x20;
  * Better understanding of requirements&#x20;
  * Knowledge sharing&#x20;
  * Reduction of bugs&#x20;
  * Quick & automated releases
* Be pragmatic&#x20;
  * Always a better way&#x20;
  * Decide your practices&#x20;
    * To answer a need&#x20;
    * Not because someone says to&#x20;
  * Compare values between practices
