chouette! encore un bug!

104
Chouette! Encore un bug! Pascal Van Cauwenberghe

Upload: agilecoachnet

Post on 18-Dec-2014

647 views

Category:

Business


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Chouette! Encore un bug!

Chouette! Encore un bug!

Pascal Van Cauwenberghe

Page 2: Chouette! Encore un bug!

Bonjour

www.nayima.beblog.nayima.be

NAYIMAWe make play work

Consultant. Project Manager. Créateur de Jeux

Page 3: Chouette! Encore un bug!

CLAUSE DE NON-RESPONSABILITÉ

Page 4: Chouette! Encore un bug!

Clause de non-responsabilité (1)

• Cette présentation contient du code– Sans garantie que ça compile

• Cette présentation peut contenir 0, 1 ou plus insectes– A éviter pour les entomophobes

Page 5: Chouette! Encore un bug!

Clause de non-responsabilité (2)

• Basé sur des histoires vraies– Equipes différentes– Projets différents– Langages différents– Pays différents

• Chantier en cours– Notre code contient encore des bugs

Page 6: Chouette! Encore un bug!

Chouette! Encore un bug!

Comment passer toute la journée à corriger un tout petit bug

Page 7: Chouette! Encore un bug!

Maman, d’où viennent les bugs?

Il était une fois...

Page 8: Chouette! Encore un bug!

Le projet

L’application

Nous

Page 9: Chouette! Encore un bug!

Contexte

• Grande application web• Mission critical• Premier projet Agile de l’équipe• Nous devons modifier et étendre une petite

partie de l’application

Page 10: Chouette! Encore un bug!

Scene 1: un développeur trouve un bug

Page 11: Chouette! Encore un bug!
Page 12: Chouette! Encore un bug!

Que faites vous quand on vous dit “j’ai trouvé un bug...” ?

Page 13: Chouette! Encore un bug!

MERCI!

Page 14: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. ....

Page 15: Chouette! Encore un bug!

Scene 2:Qu’est-ce qu’on fait avec le bug?

Page 16: Chouette! Encore un bug!

CECI N’EST PAS UN BUG

Page 17: Chouette! Encore un bug!

CECI EST UNE OPPORTUNITE

Page 18: Chouette! Encore un bug!

ASTUCE

• On ne cherche pas à reprocher• On ne veut pas trouver le “coupable”• Il faut un environnement sans blâme

• Attention au langage:– “Exercice”, “Apprendre”, “Améliorer”– “Nous”, “Notre code”, “Notre problème”

• Approche “Solution Focus”

Page 19: Chouette! Encore un bug!

Scene 3:L’équipe fait une Root Cause Analysis

5 développeurs + architecte

Page 20: Chouette! Encore un bug!

“Le client a droit à un remboursement jusqu’au moment de la livraison”

Page 21: Chouette! Encore un bug!

Qui voit le problème?boolean refundAllowed(Product product) { Datetime now = Datetime.now;

Datetime final = Datetime.parse("yyyy-MM-dd“, product.deliveryAt());

return now <= final ;}

Page 22: Chouette! Encore un bug!

MERCI!

Page 23: Chouette! Encore un bug!

On teste l’application

• Livraison le 26/05/2012 à 16:00• Il est maintenant 25/05/2012 12:00

• 25/05/2012 12:00 <= 26/05/2012 00:00 ?

Page 24: Chouette! Encore un bug!

On teste l’application

• Livraison le 26/05/2012 à 16:00• Il est maintenant 25/05/2012 12:00

• 25/05/2012 12:00 <= 26/05/2012 00:00 ?

Remboursement: OUI

Page 25: Chouette! Encore un bug!

On teste l’application

• Livraison le 25/05/2012 à 16:00• Il est maintenant 25/05/2012 12:00

• 25/05/2012 12:00 <= 25/05/2012 00:00 ?

Page 26: Chouette! Encore un bug!

On teste l’application

• Livraison le 25/05/2012 à 16:00• Il est maintenant 25/05/2012 12:00

• 25/05/2012 12:00 <= 25/05/2012 00:00 ?

Remboursement: NON

Page 27: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. ...

Page 28: Chouette! Encore un bug!

Qu’est-ce qu’on fait maintenant?Est-ce qu’on corrige le bug?

C’est tellement facile!

Page 29: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. ...

Page 30: Chouette! Encore un bug!

Un nouveau testvoid testRefundGivenWhenDeliveryLaterToday() {Datetime now = DateTime.now ;String endofDay = now.strftime(“yyyy-MM-dd") + " 23:59" ;Product product = ...product.deliveryAt(endOfDay) ;BusinessRule businessRule = ...bool refund = businessRule.refundAllowed(product);assertTrue(refund,“Remboursement jusqu'au moment de

la livraison, aussi si c'est le même jour") ;}

Page 31: Chouette! Encore un bug!

Un nouveau testvoid testRefundGivenWhenDeliveryLaterToday() {Datetime now = DateTime.now ;String endofDay = now.strftime("YYYY-MM-DD") + " 23:59" ;Product product = ...product.deliveryAt(endOfDay) ;BusinessRule businessRule = ...bool refund = businessRule.refundAllowed(product);assertTrue(refund,“Remboursement jusqu'au moment de

la livraison, aussi si c'est le même jour") ;}

Page 32: Chouette! Encore un bug!

Est-ce qu’on peut corriger le bug maintenant?

Page 33: Chouette! Encore un bug!

On corrige le bugboolean refundAllowed(Product product) { Datetime now = Datetime.now;

Datetime final = Datetime.parse("yyyy-MM-dd

HH:MM”, product.deliveryAt());

return now <= final ;}

Page 34: Chouette! Encore un bug!

Un nouveau testvoid testRefundGivenWhenDeliveryLaterToday() {Datetime now = DateTime.now ;String endofDay = now.strftime("YYYY-MM-DD") + " 23:59" ;Product product = ...product.deliveryAt(endOfDay) ;BusinessRule businessRule = ...bool refund = businessRule.refundAllowed(product);assertTrue(refund,“Remboursement jusqu'au moment de

la livraison, aussi si c'est le même jour") ;}

Page 35: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT

Page 36: Chouette! Encore un bug!

Reactions de l’équipe (1)

• “Ce truc agile prendra beaucoup de temps si on va faire ça pour tous les bugs!”

• “Oui mais, on a plus de confiance qu'on a bien corrigé le bug en qu'on n'a pas cassé autre chose”

• “On a vraiment suivi notre principe ‘qualité sans compromis’: on a amélioré le code, même si le bug n'est pas dans notre code et avant que le client réclame”

Page 37: Chouette! Encore un bug!

Reactions de l’équipe (2)

• “On devrait contacter l'équipe responsable pour leur dire qu'on a corrigé le bug.”

• “Il y a peut-être déjà des réclamations des clients. Il faudrait aussi informer le service support client”

Page 38: Chouette! Encore un bug!

ASTUCE

• Maintenez une liste de choses à faire après la Root Cause Analysis (RCA)

• “On devrait...” => “On va...”

Page 39: Chouette! Encore un bug!

ON VA...

• Contacter l’équipe dev responsable• Informer le service support client

Page 40: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTIONS ISSUES DU RCA

Page 41: Chouette! Encore un bug!

“Travail bien fait!”

“Retournons au boulot!”

Page 42: Chouette! Encore un bug!

LA FIN

Et ils vécurent heureux à tout jamais

Page 43: Chouette! Encore un bug!
Page 44: Chouette! Encore un bug!

Ce n’est pas encore

fini !

Page 45: Chouette! Encore un bug!

Scene 4:Après la correction

Le testeur rejoint les développeurs et l’architecte

Page 46: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTION ISSUES DU RCA8. AMELIORER LES TESTS

Page 47: Chouette! Encore un bug!

Comment améliorer nos tests?

On aurait du trouver ce bug plus tôt

Page 48: Chouette! Encore un bug!

Comment améliorer nos tests?

On aurait du va trouver ce genre de bug plus tôt

Page 49: Chouette! Encore un bug!

Contexte (2)

• Presque 80% de code coverage par les tests automatiques sur toute l’application

• Ce module a une couverture de tests de 100%• Mais contient quand même un bug• Pourquoi?• Regardons les tests...

Page 50: Chouette! Encore un bug!

Qui voit le problème?

void testRefundGiven() { Product product = ... product.deliveryAt(“2050-12-31 19:00”) ; BusinessRule businessRule = ... bool allowed = businessRule.refundAllowed(product)

}

Page 51: Chouette! Encore un bug!

MERCI!

Page 52: Chouette! Encore un bug!

Comment améliorer les tests?

• Il n’y a pas d’ ASSERT !– Facile d’atteindre 100% de couverture

• Pourquoi 2050?– Qu’est-ce qui se passe le 1 janvier 2051?

• Il faut au moins 4 tests– Livraison avant aujourd’hui– Livraison aujourd’hui avant maintenant– Livraison aujourd’hui après maintenant– Livraison après aujourd’hui

Page 53: Chouette! Encore un bug!

Pourquoi?

• Les développeurs ne savent pas comment bien tester du code qui contient des dates– “2050” apparait souvent dans les tests

• Très peu de développeurs avec experience en unit testing

• Pas de formation ou coaching sur les aspects techniques Agile

Page 54: Chouette! Encore un bug!

ON VA...

• Contacter l’équipe dev responsable• Informer le service support client• Ajouter des tests pour les dates, qui peuvent

servir comme exemple• Montrer les exemples aux autres équipes

Page 55: Chouette! Encore un bug!

Reactions de l’équipe (3)

• Développeurs: « on a encore beaucoup à apprendre sur le unit testing »

• Architecte: « j'ai toujours eu des doutes au sujet de l'efficacité des tests automatiques. Maintenant je comprends mieux pourquoi. »

• Testeur: « Si vous voulez, je peux vous aider à définir les tests. »

Page 56: Chouette! Encore un bug!

Creusons encore un peu... Pourquoi des tests sans ASSERT?

• Peu d’experience en testing• But: “augmenter la couverture par les tests

automatiques” au lieu de “augmenter la qualité”

• Pression pour livrer des fonctionnalités• Développement TEST LAST au lieu de TEST FIRST• Pas de formation ou coaching sur les aspects

techniques Agile

Page 57: Chouette! Encore un bug!

ON VA...

• Contacter l’équipe dev responsable• Informer le service support client• Ajouter des tests pour les dates, qui peuvent

servir comme exemple• Montrer les exemples aux autres équipes• Appliquer le TDD en binôme avec le coach• Ajouter « manque de coaching technique » à

la liste des risques du coach meeting

Page 58: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTION ISSUES DU RCA8. AMELIORER LES TESTS9. AMELIORER LA FACON D’ECRIRE LES TESTS

Page 59: Chouette! Encore un bug!
Page 60: Chouette! Encore un bug!

LA FINEt ils vécurent

heureux à tout jamais

“On a encore beaucoup à apprendre”

Page 61: Chouette! Encore un bug!
Page 62: Chouette! Encore un bug!

Ce n’est pas encore

fini !

Page 63: Chouette! Encore un bug!

Scene 5:Après les tests

Un bug ne vient jamais tout seul

Page 64: Chouette! Encore un bug!

Est-ce que ce bug est unique?

Page 65: Chouette! Encore un bug!

On cherche dans le code...

• On trouve 10 instances où on parse cette date– 5 fois avec HH:MM– 5 fois sans HH:MM

• Chacun analyse un cas• Resultat: encore deux bugs

Page 66: Chouette! Encore un bug!

Qu’est-ce que vous dites?

Page 67: Chouette! Encore un bug!

MERCI!

Page 68: Chouette! Encore un bug!

Encore une fois

Page 69: Chouette! Encore un bug!

MERCI!

Page 70: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTION ISSUES DU RCA8. AMELIORER LES TESTS9. AMELIORER LA FACON D’ECRIRE LES TESTS10. DES PROBLEMES SIMILAIRES? GOTO 2

Page 71: Chouette! Encore un bug!
Page 72: Chouette! Encore un bug!

Reactions de l’équipe (4)

• “Qualité sans compromis”. C’est facile à dire mais très dur à implementer

• “Ecrire les tests et corriger les problèmes devient de plus en plus de la routine. Ca va de plus en plus vite!”

Page 73: Chouette! Encore un bug!

ENFIN, LA FIN?

Page 74: Chouette! Encore un bug!

Ce n’est pas encore

fini !

Page 75: Chouette! Encore un bug!

Est-ce que vous voyez encore un problème?

Page 76: Chouette! Encore un bug!

Creusons encore un peu... Pourquoi est-ce qu’on s’est trompé?

• On ne se rend pas compte qu’il y a une date + temps

• On a 10x le même code• => 10 opportunités de se tromper

• Eliminons la duplication

Page 77: Chouette! Encore un bug!

Améliorer Product

class Product {... // A enlever quand obsolète String deliveryAt() ; // Nouveau. Refactoring graduel des clients

DateTime deliveryAtDateTime() ;...}

Page 78: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTION ISSUES DU RCA8. AMELIORER LES TESTS9. AMELIORER LA FACON D’ECRIRE LES TESTS10. RECHERCHER DES PROBLEMES SIMILAIRES. GOTO 211. RENDRE IMPOSSIBLE DE REFAIRE LA MEME ERREUR

Page 79: Chouette! Encore un bug!

ASTUCE

• Si vous pensez qu’il faut écrire du commentaire pour votre code, repensez votre code

Page 80: Chouette! Encore un bug!

Avec commentaire

class A { void methodeA() ; // Il faut d’abord appeler methode A void methodeB() ; void methodeC() ;}...a.methodeB() ; // ERREURa.methodeA() ; // ERREUR!!

Page 81: Chouette! Encore un bug!

Sans commentaire

class A { B methodeA() ;}

class B { void methodeB() ; void methodeC() ;}

a.methodeA().methodeB() ;

Page 82: Chouette! Encore un bug!

Maman, d’où viennent les strings?

Creusons encore un peu...

Page 83: Chouette! Encore un bug!

Le projet

L’application

Systeme A

Systeme B

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

Page 84: Chouette! Encore un bug!
Page 85: Chouette! Encore un bug!

Le projet (vision)

L’application

Systeme A

Systeme B

ABCDEFGHIJKLMNO

ABCDEFGHIJKLMNO

Page 86: Chouette! Encore un bug!
Page 87: Chouette! Encore un bug!

ON VA...

• Contacter l’équipe dev responsable• Informer le service support client• Ajouter des tests pour les dates, qui peuvent servir

comme exemple• Montrer les exemples aux autres équipes• Appliquer le TDD en binôme avec le coach• Ajouter « manque de coaching technique » à la liste

des risques du coach meeting• Encapsuler toutes les données qui viennent de

l’exterieur

Page 88: Chouette! Encore un bug!

GRAND REFACTORING

Page 89: Chouette! Encore un bug!
Page 90: Chouette! Encore un bug!

Proposition A3

Page 91: Chouette! Encore un bug!

Proposition A3Description du problème

AVANT APRES

Etapes:1. .jdlkjds2. Kmlkdmlkd3. Dkqjdlkjds4. Sqkjlkdlksqmk5. BIERE !

Visualisation

Page 92: Chouette! Encore un bug!

ASTUCE

• L’A3 est visible pendant toute la période de refactoring

• Affichez l’A3 là où on ne peut pas le louper

• Limitez le nombre d’A3 qu’on peut afficher

Page 93: Chouette! Encore un bug!

Scene 6:Acte final

Page 94: Chouette! Encore un bug!

Résultats

1. On a travaillé tout l’après-midi avec une équipe de 7 personnes + un consultant pour corriger un bug de 6 caractères. Est-ce raisonnable?

2. On a trouvé beaucoup moins de bugs en test que dans des projets “normaux”. Est-ce qu’il y a un lien?

3. Ceci a soulagé le travail de l’équipe test, goulot d’étranglement du projet. Est-ce qu’il faut économiser sur l’effort d’une équipe non-goulot?

4. Le projet a été livré en 5 mois au lieu des 8 estimés. Est-ce que la qualité coute cher?

Page 95: Chouette! Encore un bug!

En résumé

Page 96: Chouette! Encore un bug!

Algoritme du code parfait

1. TROUVER UN BUG2. DIRE “MERCI!”3. REPRODUIRE LE PROBLEME4. AJOUTER (AU MOINS) UN TEST QUI ECHOUE5. CORRIGER LE PROBLEME6. TOUS LES TESTS REUSSISSENT7. EXECUTER LES ACTION ISSUES DU RCA8. AMELIORER LES TESTS9. AMELIORER LA FACON D’ECRIRE LES TESTS10. RECHERCHER DES PROBLEMES SIMILAIRES. GOTO 211. RENDRE IMPOSSIBLE DE REFAIRE LA MEME ERREUR

Page 97: Chouette! Encore un bug!

Mais surtout

Page 98: Chouette! Encore un bug!

MERCI!

Page 99: Chouette! Encore un bug!

Le challenge

• J’applique ceci avec mes équipes• On est loin du code parfait...• Je mesure les effets pendant un an• Je présente les résultats à la Conférence 2013• Si vous appliquez ces techniques• Contactez-moi• On présente nos résultats ensemble

Page 100: Chouette! Encore un bug!

CECI EST UNE OPPORTUNITE

Page 101: Chouette! Encore un bug!

LA FIN

Et ils vécurent heureux à tout jamais

Page 102: Chouette! Encore un bug!

7/7 SESSION FEEDBACK

Page 103: Chouette! Encore un bug!

MERCI

His Blog: blog.nayima.be

NAYIMAWe make play work

Consultant. Project Manager. Créateur de Jeux

Page 104: Chouette! Encore un bug!