Software Craftsmanship

ou comment bien développer ?

Quentin LAFFONT

Développeur Full Stack JS

 

https://qlaffont.com

           

            @qlaffont

Pourquoi ?

L'objectif du Software Craftmanship est de répondre aux problèmes récurrent des projets informatiques que ce soit en interne ou avec des équipes externalisées.

 

"Ce mouvement prône le côté artisanal du développement logiciel, autrement dit, d'après le manifeste de l'artisanat du logiciel, il ne suffit pas qu'un logiciel soit fonctionnel, mais il faut qu'il soit bien conçu !"

 

Exemple problèmes : Manque de Documentation, bugs, complexité de développement, etc.

C'est quoi ?

  • Manifest
  • Hard Skills
  • Soft Skills
  • Excellence
  • Principes
  • Agilité
  • Devops
  • Methodologie

Manifest

- Individu over process -> Les personnes avant tout !

- Working software -> Logiciel fonctionnel

- Product collaboration -> Travail en étroite collaboration avec les parties prenantes

- Adapt to change -> Délivrer de la valeur constante

 = AGILE

Hard Skills

Les compétences techniques

 

Connaissance des frameworks, libs, etc.

Soft Skills

- Intelligence sociale (peering)

- partage

- communication

- etc.

Excellence

- Focus sur la qualité UX/UI
- Focus sur le clean code

- Focus sur le produit

- Focus sur le pixel perfect

Principes

- Design Pattern (Singleton, Interface, etc.)

- Principes de développement SOLID

- KISS

- YAGNI

- Etc.

DevOps

Voir au delà du développement 

  • CI/CD
  • Docker
  • Terraform
  • etc.

Methodologie

  • DDD -> Domain Driven Design
  • TDD -> Test Driven Development
  • BDD -> Behavior Driven Design

Comment on applique ça au quotidien ?

1 - Mise en place de convention

Ecriture d'un Readme.MD ou d'un wiki contenant :


Code :

  • Naming des vars/functions
  • Syntax (CamelCase, etc.)

 

Architecture du projet :

  • Naming
  • Structure

 

1.bis - Mise en place de linter

Coding Convention :

 

- Eslint (Code Style Convention)

 

- Stylelint (CSS Style Convention)

 

- Prettier (Code Convention - format)

1.bis - Mise en place de linter

- Naming des commits (commitlint)

1.bis - Mise en place de linter

- Generation Changelog automatique (conventional-changelog-cli)

2. Mise en place d'une politique de tests

Unit Tests

Ecriture de tests qui vont tester une et une seule fonction / bout de code.

Integration Tests

Tests testant l'intégration du composant avec d'autres composants.

E2E Tests

Tests testant de bout en bout

Autres types de tests

- Tests de performance (stress tests, test de charge)

- Tests d'acceptance

- Tests de non régression

- Tests de vulnérabilité
- Tests de sécurité des containers Docker (snyk.io)

- etc.

Catégorie de tests

- White Box : Test en disposant de la totalité des informations 


- Grey Box : Test en disposant d’un nombre limité d’informations


- Black Box : Test sans avoir la moindre information




Recommandation : Black Box

Black Box Testing

Fonction 

  • Test tous les params (Type, valeur, format)
  • Test le résultat (Type, valeur, format)

 

Composant Front (via data-testid)

  • Props
  • Content
  • Events

Black Box Testing

Sélecteur à utiliser :

  • input
  • .checkbox
  • [data-testid='input_checkbox"]

 

2 bis - Quel technologie ?

Des outils nous permettent de développer ces tests


- UNITS : Jest / Mocha + Chai

- INT : Jest + Enzyme ou React-Testing-Library / Karma

- E2E : Jest + Puppeteer / Cypress



Recommandation : Utiliser Jest car il peut être utilisé dans n'importe quel type de test

Recommandation Bis: AAA (Arrange Act Assert
) + 3 layer system of description


2.ter - Pour qui ?

Pour des développeurs, nous pouvons rester sur de l'écriture de tests classique.

Cependant, si les POs doivent pouvoir lire les tests, une syntaxe a été créé

 

 

GHERKIN

 

Gherkin

2.final - Utilisation de pratique de TDD

TDD (Test Driven Development)

3. Documentation

- Rest-API -> Ecriture d'un Swagger


- WebComponent -> Ecriture de Storybook

 

- Ecriture de diagramme d'activité, ou de diagramme représentant des parcours utilisateurs.


- Commentaire conventionné (JSDOC)

Swagger

Storybook

Diagramme de flux (Code2flow)

JSDOC

4. Principes de dévelopement

- YAGNI (you ain't gonna need it) -> Code ce que tu as besoin actuellement

 

- KISS (Keep it simple, stupid) -> Fonction simple, 1 objectif

 

- DRY (Don't repeat, yourself) -> Eviter la redondance de code

 

- ACID (atomicité, cohérence, isolation et durabilité)

 

- etc.

LES PLUS CONNUS

SOLID

STUPID

Singleton

Tight Coupling

Untestability

Premature Optimizations

Indescriptive Naming

Duplication

5. DevOps

Mise en place de CI/CD/CD

Continuous Integration (CI)

Tests Units / Tests Int /  Code Scan / Sec Scan / Quality Gate

Continuous Delivery (CD)

Package / Tests E2E / Génération de la Doc

Continuous Deploy (CD)

 

CALMS

6. Collaboration Dev <-> Produit

Agile Scrum

 - PO -> Créé des US

 - Dev -> Traduit les US en code

 - Testeur / PO -> traduit en tests Gherkin

 

Mise en place de feature toggling (le produit active ou pas les fonctionnalités sur la plateforme à la volée). Ex: Unleash

 

Qualification des US par les Devs (Evaluation technique avant réalisation / Refinement)

7. Veille technologique

Mise en place de veille technologique

 - Daily 2.0

 - RSS / Twitter / Medium

 - Feedly

 - Sites internet spécialisés (hacker news, korben, codrops, etc.)

Et plein d'autres choses !

Méthodologie SCRUM, Méthode DDD, Méthode BDD, Méthodologie KANBAN, Différentes architectures (Multi Layers, Event Driven, SOA, DDA, COA, Microservice, etc.), 

"Become a developer, not just a programmer"

Software Craftsmanship ou comment bien développer ?

By Quentin LAFFONT

Software Craftsmanship ou comment bien développer ?

  • 1,222