Méthodes pour la correction de bugs
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.
Objectif
Connaître des méthodes pour la correction de bugs.
Mise en situation
Les bugs sont inévitables. Il arrive systématiquement un moment où on doit corriger ces bugs. Suivre une méthode rigoureuse de correction de bugs permet de gagner du temps et de s'assurer que la correction est efficace.
Méthode : Isoler et minimiser la partie du code contenant le problème
Pour mieux comprendre le problème, il est préférable de l'isoler en un exemple simple. Une fois cet exemple isolé, on peut le simplifier le plus possible pour trouver le problème correspondant, s'assurer de l'élément causant le dysfonctionnement et le corriger.
Exemple :
On dispose du code suivant avec deux fonctions :
function fahrenheitToCelsiusFormatting (temperatureF) {
// Conversion d'un valeur de degré Fahrenheit à degré Celsius
const temperatureC = (temperatureF - 32) * 5 / 9
}
function temperatureConversion (startTempF, nTemperatures, scale) {
console.log('Début de la conversion des températures ...')
let temperature = startTempF
let countTemperature = 0
while (countTemperature !== nTemperatures) {
fahrenheitToCelsiusFormatting(temperature)
nTemperatures = nTemperatures + 1
temperature = temperature + scale
}
}
const startTempF = -459
const nTemperatures = 10
const scale = 40
temperatureConversion(startTempF, nTemperatures, scale)
L'exécution de ce code ne se termine jamais.
On sent que le problème se situe au niveau de la boucle while
, qui ne s'arrête jamais, et produit une boucle infinie.
while (countTemperture !== nTemperatures) {
fahrenheitToCelsiusFormatting(temperature)
nTemperatures = nTemperatures + 1
temperature = temperature + scale
}
On peut isoler ces lignes avec le nécessaire pour reproduire le problème ainsi :
let startTempF = -459
let nTemperatures = 10
let scale = 40
function fahrenheitToCelsiusFormatting (temperatureF) {
// Conversion d'un valeur de degré Fahrenheit à degré Celsius
const temperatureC = (temperatureF - 32) * 5 / 9
}
let temperature = startTempF
let countTemperature = 0
while (countTemperature != nTemperatures) {
fahrenheitToCelsiusFormatting(temperature)
nTemperatures = nTemperatures + 1
temperature = temperature + scale
}
On obtient une donc un code bien plus court, produisant le même problème et qui peut être inspecté plus facilement.
Remarque :
Un tel exemple est appelé MWE, pour Minimal Working Example. Cette pratique permet d'isoler précisément le bug, et de s'assurer qu'il n'est pas produit par une instruction située à un autre endroit et n'est pas dépendante du contexte. Pour signaler un bug à d'autres développeurs, il est courant de construire un MWE, qui permet à chacun de reproduire le problème.
Méthode : Effectuer une recherche efficacement
On obtient généralement un message d'erreur en présence de bug de syntaxe. Une bonne pratique est d'approfondir la signification de l'erreur et de chercher une solution sur le Web, en se basant sur ce message. Afin de trouver de manière plus rapide ou exacte un résultat, on peut grâce à une certaine syntaxe sur certains navigateurs réaliser des requêtes plus fines.
Dans le cas de Duckduckgo par exemple, on peut saisir :
'chien chat'
, pour trouver des résultats avec cette chaîne de caractères exacte.chien -chat
, pour trouver des résultats qui font mention de« chien »
mais qui ne font pas mention de« chat »
.chien filetype:pdf
, pour trouver des documents pdf qui font mention de« chien »
.chien site:exemple.fr
, pour trouver des résultats qui font mention de« chien »
sur exemple.fr.
Plus de détails ici : https://help.duckduckgo.com/duckduckgo-help-pages/results/syntax/
Exemple :
Si on tombe en programmant avec JavaScript sur l'erreur suivante :
Uncaught TypeError: undefined is not a function
Une bonne requête ciblée, pour trouver des éléments de réponse, sera :
javascript site:stackoverflow.com 'Uncaught TypeError: undefined is not a function'
Qui nous permet d'accéder à des réponses sur StackOverflow, un site d'échanges sur la programmation en ligne.
Par exemple celle-ci qui indique qu'une fonction a sûrement mal été définie : https://stackoverflow.com/questions/13502733/uncaught-typeerror-undefined-is-not-a-function-beginner-backbone-js-applica
Méthode : Afficher les différentes valeurs des variables
Afficher les différentes valeurs des variables de l'exemple isolé permet de mieux les comprendre. Sous JavaScript, on peut réaliser cela avec console.log
.
Exemple :
Soit l'exemple d'une boucle infinie ci-après. On peut arriver à comprendre le problème en affichant la valeur de la variable countTemperature
.
let startTempF = -459
let nTemperatures = 10
let scale = 40
function fahrenheitToCelsiusFormatting (temperatureF) {
// Conversion d'un valeur de degré Fahrenheit à degré Celsius
const temperatureC = (temperatureF - 32) * 5 / 9
console.log(temperatureF, ' °F est équivalent à ', temperatureC, ' °C')
}
let temperature = startTempF
let countTemperature = 0
while (countTemperature !== nTemperatures){
console.log('countTemperature = ', countTemperature)
console.log('nTemperatures = ', nTemperatures)
fahrenheitToCelsiusFormatting(temperature)
nTemperatures = nTemperatures + 1
temperature = temperature + scale
}
Ici, on obtiendrait en sortie :
countTemperature = 0
nTemperatures = 10
-459 °F est équivalent à -272.77777777777777 °C
countTemperature = 0
nTemperatures = 11
-419 °F est équivalent à -250.55555555555554 °C
countTemperature = 0
nTemperatures = 12
-379 °F est équivalent à -228.33333333333334 °C
countTemperature = 0
nTemperatures = 13
-339 °F est équivalent à -206.11111111111111 °C
countTemperature = 0
nTemperatures = 14
-299 °F est équivalent à -183.88888888888889 °C
countTemperature = 0
nTemperatures = 15
-259 °F est équivalent à -161.66666666666666 °C
countTemperature = 0
nTemperatures = 16
-219 °F est équivalent à -139.44444444444446 °C
countTemperature = 0
nTemperatures = 17
-179 °F est équivalent à -117.22222222222223 °C
countTemperature = 0
nTemperatures = 18
-139 °F est équivalent à -95 °C
countTemperature = 0
nTemperatures = 19
-99 °F est équivalent à -72.77777777777777 °C
Ce qui nous montre que le comportement n'est pas le bon : nTemperatures
est incrémenté à la place de countTemperature
.
Méthode : Commenter temporairement les parties non essentielles
Afin de plus rapidement comprendre un bug, on peut commenter les parties de code non essentielles à la résolution du problème.
Cela a l'avantage de :
réduire le temps d'exécution pour avoir des itérations plus rapide lors du débogage,
avoir moins de sorties pour mieux se concentrer sur les affichages de débogage.
Exemple :
Si on reprend l'exemple précédent, on peut commenter fahrenheitToCelsiusFormatting
ici pour plus rapidement faire exécuter la boucle et se concentrer sur la sortie de l'affichage du débogage.
let startTempF = -459
let nTemperatures = 10
let scale = 40
function fahrenheitToCelsiusFormatting (temperatureF) {
// Conversion d'un valeur de degré Fahrenheit à degré Celsius
const temperatureC = (temperatureF - 32) * 5 / 9
console.log(temperatureF, ' °F est équivalent à ', temperatureC, ' °C')
}
let temperature = startTempF
let countTemperature = 0
while(countTemperature !== nTemperatures){
console.log('countTemperature = ', countTemperature)
console.log('nTemperatures = ', nTemperatures)
// fahrenheitToCelsiusFormatting(temperature)
nTemperatures = nTemperatures + 1
temperature = temperature + scale
}
Ici, on obtiendrait uniquement les valeurs des variables à déboguer.
countTemperature = 0
nTemperatures = 10
countTemperature = 0
nTemperatures = 11
countTemperature = 0
nTemperatures = 12
countTemperature = 0
nTemperatures = 13
countTemperature = 0
nTemperatures = 14
countTemperature = 0
nTemperatures = 15
countTemperature = 0
nTemperatures = 16
countTemperature = 0
nTemperatures = 17
countTemperature = 0
nTemperatures = 18
countTemperature = 0
nTemperatures = 19
countTemperature = 0
nTemperatures = 20
countTemperature = 0
nTemperatures = 21
countTemperature = 0
nTemperatures = 22
countTemperature = 0
nTemperatures = 23
countTemperature = 0
nTemperatures = 24
...
L'affichage est moins pollué, ce qui permet de comprendre plus facilement l'origine du problème.
Méthode : S'expliquer le problème.
Afin de mieux comprendre l'exemple défectueux, on peut essayer d'expliquer le problème. Cela facilite la compréhension de celui-ci et donc sa résolution. Écrire le problème que l'on rencontre peut aussi permettre de mieux le résoudre. Une telle technique peut s'opérer en en 5 étapes :
Écrire le nom du concept en haut d'une page blanche.
Lister le contexte du problème : les éléments connus, l'erreur rencontrée, les personnes ayant travaillé dernièrement sur le code.
Expliquer avec des phrases, comme si cela s'adressait à une autre personne, le problème et sa manifestation. Cela doit permettre de vous faire découvrir ce que vous ne savez pas sur le problème.
Explorer les zones d'ombres identifiées, poser des hypothèses et noter les différentes expériences que vous pouvez réaliser pour tester ces hypothèses.
Implémenter ces expériences et en fonction des résultats mettre à jour vos connaissances du problèmes en réitérant à partir de l'étape 3.
Complément : Méthode du canard en plastique (Rubber Duck Debugging)
En programmation, il existe une méthode similaire appelée « méthode du canard en plastique » : la méthode consiste à expliquer le problème à une personnage ou à une autre personne à haute voix. De manière similaire à la technique précédente, il est possible que la solution au problème vienne en explicitant celui-ci.

Attention : Réaliser une correction incrémentale de l'exemple simplifié
Lorsque l'on corrige le problème, il est préférable d'utiliser une approche incrémentale et de ne modifier qu'un petit nombre d'instructions pour s'assurer que la correction que l'on opère est la bonne.
À retenir
Les méthodes pour la correction de bugs tiennent essentiellement en trois points :
Une capacité à expliquer et donc comprendre le problème.
Une capacité à modifier et simplifier du code pour isoler le problème.
Une capacité à réaliser des recherches ciblées pour trouver de l'information.
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.