Vous avez une idée d’application géniale qui vous rendra riche, célèbre et peut-être même heureux. Vous avez appris à programmer dans les langages appropriés... Vous avez passé des mois à écrire des lignes et des lignes de code... De temps en temps des messages d’erreurs apparaissaient, mais pas de quoi vous déstabiliser.
Finalement, le moment de présenter votre projet au monde entier arrive. Des centaines de personnes sont venues vous écouter, parmi lesquelles de futurs investisseurs. Mais au moment de lancer votre programme : bug. Il a planté.
« Ô rage ! Ô désespoir ! », vous dites vous.
Le public s’impatiente, les investisseurs sont consternés. Et rien à faire, chaque tentative pour faire fonctionner votre programme ne fait qu’ajouter des bugs. Vous tapez frénétiquement au clavier pour les résoudre et... vous vous réveillez en sueur. Et oui, c’était juste un horrible cauchemar.
Bien que cette histoire soit stressante, elle n’en est pas moins réaliste. Tous les programmeurs, même les meilleurs du monde, rencontreront des bugs durant leur carrière. À cause des bugs, le programme fonctionne de manière anormale, ou alors il ne fonctionne pas du tout.
Les bugs font partie intégrante de la programmation, tout comme l’erreur fait partie de l’humain. D’ailleurs, c’est une bonne chose qu’il existe des bugs.
Attendez un peu. Les bugs m’ont fait faire des cauchemars et vous, vous dites que c’est une bonne chose ? Il va falloir de sacrés arguments pour me convaincre.
Je comprends votre surprise, mais la raison est simple. Les bugs permettent de découvrir des subtilités du langage, d’en apprendre plus sur l’algorithmique et de muscler vos compétences de résolutions de problèmes. Un bug est une invitation (un peu brusque je le reconnais) à entrer dans l’intimité du langage.
Un seul bug suffit pour que tout le programme plante. En revanche, tous les bugs ne sont pas les mêmes. Nous pouvons les ranger dans 3 catégories principales. Détaillons-les ensemble.
Catégorie de bug n°1 : Erreur de syntaxe
Tout comme une langue humaine, chaque langage de programmation possède une grammaire qui lui est propre. La grammaire peut inclure l’utilisation de symboles comme les deux points :
, ou le respect de la sensibilité à la casse lors de l’utilisation de certains mécanismes (fonctions, classes…).
Le non-respect de sa grammaire conduira à un bug appelé erreur de syntaxe (syntax error). Avec ce type d’erreur, votre programme ne se lancera pas du tout ! Voici un exemple :
def direBonjour(nombreDeFois, prenom)
for i in range(0, nombreDeFois)
print("Bonjour {}".format(prenom))
direBonjour(5, "Bob")
Le code ci-dessus décrit une fonction qui affiche plusieurs fois le message « Bonjour Bob ». Mais il y a plusieurs erreurs de syntaxe. Est-ce que vous les voyez ? 👀
En effet, la grammaire du langage Python demande d’ajouter le symbole :
après certains types d’instructions – en l'occurrence la création d’une fonction et l’utilisation d’une boucle for
– pour qu’il puisse savoir où cette instruction se termine.
Un autre aspect de la grammaire de Python est le respect de l’indentation qui est une source d’erreur classique. Il est en effet facile d’oublier le nombre d’espaces que nous avons utilisés.
Bon, ici c’était très facile. Modifiez le code en mettant :
à la fin des deux premières lignes et indentez la ligne de la boucle for
. Votre programme fonctionnera correctement. 😄
Catégorie de bug n°2 : Erreur d’exécution
Admettons maintenant que vous avez respecté à la lettre la grammaire du langage de programmation, mais qu’un bug apparaît au moment de l’exécution du programme. Vous êtes face à une erreur d'exécution (runtime error).
En effet, ce type d’erreur ne devient visible qu’après avoir lancé le programme. Regardons l’exemple ci-dessous :
print("C’est la " + int("10") + " ème fois que je dis ‘Bonjour’")
Le code ne comporte pas d’erreur de grammaire, mais au moment du lancement du programme il y en aura une belle. 💣
Où se trouve-t-elle ? 🧐
Eh oui, la concaténation à l’aide du symbole +
fonctionne uniquement quand on a une chaîne de caractère de part et d'autre. Ici, on a une chaîne de caractère d’un côté, C’est la
, et un nombre de l’autre, "10"
. Il suffit d’enlever le constructeur des entiers int()
devant la variable "10"
. En effet, le constructeur effectue un casting sur la variable pour la transformer en nombre entier. Et voilà, tout fonctionne !
Catégorie de bug n°3 : Erreur de logique
Programmer, c’est écrire des algorithmes. Un algorithme c’est une façon de découper un problème précis en étapes plus facilement atteignables. Par exemple, vous énoncez un algorithme quand vous expliquez à un ami le chemin à prendre pour vous retrouver dans un parc.
Les erreurs de logique apparaissent souvent lors de l’utilisation des opérateurs logiques et des opérateurs de comparaisons, par exemple au travers des instructions et (and
), ou (or
), inférieur à (<
), supérieur ou égal à (>=
)...
Supposons que vous souhaitez écrire une fonction direBonsoir()
en utilisant une boucle while
de cette façon :
def direBonsoir(nombreDeFois, prenom):
i = 0
while i < nombreDeFois:
print("Bonsoir {}".format(prenom))
i = i - 1
Où se situe l’erreur logique ? 🤔
Elle se trouve au niveau de la comparaison i > nombreDeFois
. En effet, i
sera toujours inférieur à nombreDeFois
puisqu'à chaque tour i
va prendre une nouvelle valeur qui est i - 1
. Donc, lors du premier tour i
vaudra 0, ensuite -1, -2, -3…
Autrement dit, notre boucle sera une boucle infinie. Pour résoudre ce bug, il faudrait remplacer le signe-
par +
pour qu’au bout du cinquième tour la condition i < nombreDeFois
soit fausse, et qu’ainsi la boucle s’arrête.
Exercez-vous
Maintenant que vous avez vu ces exemples, exercez-vous à trouver les types d’erreurs dans le code ci-dessous. Il s’agit d’une fonction qui permet d’afficher un certain nombre de fois le message « Bonjour Bob » si l'utilisateur a tapé « 1 » ou « Bonsoir Bob » s'il a tapé « 2 » :
direBonjourOuBonsoir(5, "Bob")
def direBonjourOuBonsoir(nombreDeFois; prenom):
choix = input("Tapez 1 pour dire Bonjour et 2 pour dire Bonsoir")
if choix === "1":
i = 0
while i > nombreDeFois:
print(f"Bonjour {prenom}")
i = i + 1
else if choix == str(2):
for i in range(0, nombreDeFois):
print(f"Bonsoir {prenom}")
else:
print('Je n'ai pas compris votre choix')
Ensuite vous pouvez essayer de le faire fonctionner, en enlevant les erreurs de syntaxe, d'exécution et de logique. Comparez ensuite votre code avec la correction dans notre repository Github.
En résumé
Un bug est une erreur qui perturbe le fonctionnement du programme ou l’empêche totalement de fonctionner.
Les bugs sont inévitables et même utiles pour mieux comprendre le langage de programmation et améliorer vos compétences en algorithmique.
Il existe 3 types de bugs principaux : erreur de syntaxe, erreur d'exécution, erreur de logique.
Nous venons de voir les trois types de bugs et pourquoi on ne devrait pas en avoir peur ! Lors du prochain chapitre, nous allons parler du pire ennemi du bug : le débugging. Quand vous êtes prêt, suivez-moi !