Tout est un logiciel Link to heading

Cet article suit mon précédent : Tout est un ordinateur, cependant, il n’est pas essentiel de l’avoir lu pour comprendre.

Dans cet article, je vais parler d’une réalisation surtout langagière : j’ai pris conscience qu’il y avait un bon nombre de mots qui désignent à peu près la même chose mais avec des nuances que je peinais à discerner.

  • Code
  • Algorithme
  • Programme
  • Script
  • Logiciel
  • Application
  • Software

Une des difficultés dans la compréhension de la technologie de l’information est le degré d’abstraction de ce dont on parle. Il y a plusieurs niveaux de description que l’on peut aborder et chacun a des propriétés intéressantes.

Dans ce billet de blog, j’aimerais faire comprendre plusieurs choses : premièrement la notion d’implémentation, passer d’une idée en théorie et l’implémenter en pratique. Ensuite j’aimerais vous faire sentir la notion d’imbrication, on utilise quelque chose qu’on a déjà fait et on l’imbrique dans quelque chose d’autre au lieu de tout refaire.

Analogie avec la cuisine Link to heading

Donc allons-y, un algorithme, c’est comme une recette de cuisine.

Quand je dis “recette de cuisine”, je pense surtout aux recettes de grands-mères, celles qui sont transmises de générations en générations, vous avez peut-être hérité d’une recette de gratin ou de tartiflette d’un de vos grands-parents ;)

La recette vous indique globalement comment réaliser le plat en question. Elle vous donne les ingrédients (patates, oignons, lardons etc.), les actions élémentaires (couper en dé, en lamelles, faire revenir) vous indique des actions à réaliser (placez le camembert sur les patates), des conditions à respecter (dès que les oignons sont bien dorés, sortez du four) etc.

Le but de la recette de cuisine c’est de donner l’idée de comment réaliser un plat ou un repas, à un niveau d’abstraction relativement élevé.

Implémentation Link to heading

Une fois qu’on a la recette, on peut l’implémenter chez nous : on essaie de la reproduire simplement. Mais quand la recette indique qu’il fallait “éplucher”, elle ne précise pas si c’est avec un couteau, avec un économe ou divers autres outils. Quand elle dit “faites revenir” elle ne précise pas forcément si c’est dans une poêle, dans une casserole ou dans un wok.

Il vous revient de faire ces choix-là, c’est à vous de choisir comment vous implémentez la recette dans votre cuisine ou dans celle de quelqu’un d’autre. Et on peut facilement imaginer que faire la même recette dans la cuisine d’un restaurant italien ne sera pas pareil que dans un restaurant vietnamien ou dans un restaurant libanais : les outils seront différents, et la manière de gérer le temps ou la cuisson ne sera peut-être pas la même.

Tout cela n’était pas spécifié dans la recette car la recette donne l’idée du plat de manière à ce qu’on puisse le reproduire à peu près partout, dans n’importe quelle cuisine.

On pourrait imaginer un cuisinier nigaud, incapable d’implémenter une recette. Parfaitement capable de suivre des instructions précises, mais pas du tout autonome et perdu dès que les instructions sont vagues ou ambiguës. Dans ce cas, il serait possible d’écrire une sorte de “recette très précise”, pré-implémentée pour une cuisine ou un environnement en particulier.


Le cuisinier nigaud est l’analogie d’un ordinateur, ou plutôt d’un processeur d’ordinateur. La “recette très précise” est l’analogie d’un code informatique, mais on y revient juste après !


Si la recette est trop imprécise ou qu’elle donne des instructions incohérentes (comme : “faites dorer les oignons puis épluchez-les”, “rajouter de la farine jusqu’à obtenir une pâte très liquide”, “mixer les 2 pommes de terre jusqu’à en obtenir 3”) le cuisinier serait contraint de s’arrêter.

Imbrication Link to heading

Maintenant, imaginez que vous écrivez un livre de recettes de cuisine. Sur les premières pages vous expliquez comment faire une super sauce tomate. Imaginez que dans les pages d’après vous vouliez donner la recette de la sauce bolognaise, qui est, en gros, de la sauce tomate avec de la viande hachée et quelques épices en plus (je suis nul en cuisine donc j’ai le droit de dire ça). Vous n’allez bien sûr pas réécrire la recette de la sauce tomate dans la recette de la sauce bolognaise, vous allez simplement donner la référence de la sauce tomate initiale, et compléter pour faire une bolognaise.

La recette de la sauce tomate est donc “imbriquée” dans celle de la bolognaise, on peut y “faire appel”. De la même manière, on pourrait imaginer une pizza avec de la bolognaise dessus (je vous fais sourire avec mes recettes grotesques ?), et on ne va pas réécrire la recette de la sauce bolognaise ni de la sauce tomate, on en donne simplement les références. On a donc une recette de pizza bolognaise qui fait appel à la recette de la sauce bolognaise qui fait elle-même appel à la recette de la sauce tomate. L’imbrication est potentiellement infinie !

Retour à l’informatique Link to heading

On retrouve les concepts d’implémentation et d’imbrication dans le monde de l’informatique, et c’est justement ça qui est clé pour différencier les termes cités ci-dessus.

Un algorithme, c’est comme une recette de cuisine, c’est l’idée abstraite d’une suite d’opérations qu’on peut réaliser pour obtenir un certain résultat.

Un programme ou un script, c’est l’implémentation d’un algorithme dans un environnement particulier, on passe d’une idée abstraite à une exécution concrète.

Un ordinateur applique bêtement ce qu’on lui dit sous forme de code de la même manière qu’un cuisinier nigaud appliquerait bêtement la “recette très précise” adaptée à un environnement particulier. En fait, si vous avez bien compris mon article sur les ordinateurs, vous comprendrez sûrement que quand je dis “ordinateur”, je veux surtout dire “processeur” (ou CPU), car c’est ce composant électronique qui fait des opérations.

Un logiciel, une application ou le software, c’est aussi initialement une idée abstraite d’une suite d’opérations, mais qui a généralement pour but d’être utilisée directement par un utilisateur et qui va donc nécessiter d’être très complète.

Par exemple, il va falloir que l’application soit disponible et fonctionne sur ordinateur comme sur téléphone, il faut prévoir toutes les tailles d’écran, il faut programmer l’affichage pour qu’il soit fluide et facilement compréhensible, et bien sûr il faut anticiper tous les bugs et les corriger !

Pour s’y repérer dans un tel chantier, la notion d’imbrication est absolument essentielle, on code les fonctionnalités basiques puis on construit, par-dessus, des fonctionnalités plus intéressantes mais donc plus complexes.

L’algorithme des réseaux sociaux Link to heading

Je rajoute un petit paragraphe à propos de l’utilisation du mot “algorithme” dans le contexte des réseaux sociaux :

Merci Nitter de m’éviter de naviguer sur X ;)

Merci Nitter de m’éviter de naviguer sur X ;)

Dans la bouche de ces politiciens, ce terme se réfère surtout à la manière dont les réseaux sociaux recommandent des contenus à ses utilisateurs. Dans la réalité, Instagram, TikTok, Twitch etc. ont développé un ensemble de programmes complexe, (un logiciel quoi) qui implique bien souvent de l’IA (vaste sujet ça aussi, j’en parlerai sûrement à l’avenir) prenant en entrée le comportement d’un utilisateur (les likes, les posts mais surtout le temps passé sur chaque contenu) et qui donne, en sortie, une proposition de contenu à montrer à cet utilisateur.

Ces “algorithmes” sont effectivement implémentés dans la réalité donc on devrait plutôt parler de “programmes” ou de “logiciels” d’après nos définitions. Cependant, chaque plateforme à son propre logiciel particulier codé à sa manière, bien que l’objectif et le résultat soient les mêmes : recommander du contenu aux utilisateurs en fonction de leur comportement.

Ces politiques ne parlaient sûrement pas d’un logiciel de recommandation d’une plateforme en particulier, ils dénonçaient globalement tous les logiciels de toutes les plateformes. Ils dénonçaient l’idée abstraite d’un logiciel qui recommande du contenu en fonction du comportement. Or, comme on l’a dit plus haut, on appelle l’idée abstraite d’un programme un algorithme justement.

On a maintenant défini tous les termes compliqués, vous pouvez vous arrêter là si vous voulez rester sur la théorie ! Seulement je sais que moi à l’époque, j’aurais bien aimé avoir des exemples concrets.

À quoi ressemble ce “code” ? Comment faire de l’imbrication et de l’implémentation concrètement ?

Si vous aussi vous êtes curieux de savoir, suivez-moi dans cette partie suivante ;)

Exemples concrets avec Python Link to heading

À la différence des recettes de cuisine qui s’écrivent en langage normal (qu’on appelle en informatique le langage naturel), les ordinateurs ne supportent pas sa nuance et son ambiguïté. La seule manière dont on peut transmettre des instructions à un ordinateur est dans un langage très formel et restreint qu’on appelle un langage de programmation. On désigne une “phrase” dans ce langage-là du “code”.

Il existe plusieurs langages de programmation dans lesquels on écrit des programmes ou des scripts. Voici un programme dans le langage Python, qui est un des plus populaires, voyez-donc si vous arrivez à comprendre ce qu’il se passe :

x = 1
y = 2
somme = x + y
print(somme)

À priori le programme ci-dessus devrait être plutôt bien compréhensible. Il s’agit d’un programme dans lequel on déclare deux variables : x et y, on déclare une troisième variable somme à laquelle on assigne la valeur x + y. Enfin, on affiche sur l’écran la valeur de somme, qui, vous vous en doutez, sera 3.

Vous pouvez vous-même vérifier ce résultat de deux manières :

  1. Installer le langage de programmation Python sur votre ordinateur, utiliser un éditeur de texte (comme Bloc-Note sur Windows) copier-coller le programme ci-dessus et enregistrer le fichier avec une extension .py comme programme.py, double-cliquer dessus et constater le résultat.
  2. Naviguer sur ce site, copier-coller le code d’un côté, l’exécuter et constater le résultat de l’autre côté, comme montré ci-dessous :

Vous pouvez donc essayer avec différentes valeurs pour x et y et constater les résultats.

On va voir maintenant une fonctionnalité de Python qui permet de faire ça d’une manière un peu plus pratique :

def addition(x, y):
	somme = x + y
	return somme

print(addition(1, 2))
print(addition(0, 3))
print(addition(14, 24))

Explications :

  • def indique à l’ordinateur qu’il s’apprête à définir un programme qui prend quelque chose en entrée et qui sort quelque chose en sortie.
  • addition est le nom de ce programme.
  • (x, y) Cela indique à l’ordinateur qu’il doit s’attendre à recevoir 2 nombres en entrée.
  • somme = x + y assez explicitement, cette ligne indique à l’ordinateur qu’il doit assigner à une nouvelle variable somme la valeur résultante de l’opération x + y.
  • return somme cette ligne indique à l’ordinateur qu’il doit renvoyer à l’utilisateur la variable somme et arrêter l’exécution du programme qu’on a défini. Si par mégarde, le codeur a ajouté des lignes de code après celle-ci, il verra bien vite qu’elles ne sont donc pas exécutées.
  • addition(1, 2) exécute le programme pour une valeur de x de 1 et une valeur de y de 2 et renvoie le résultat.
  • print(addition(1, 2)) affiche le résultat du programme précédent.

Voyons voir celui-là :

def qui_est_plus_grand(x, y):
	if x > y :
		return x
	else :
		return y
		
print(qui_est_plus_grand(1, 2))
print(qui_est_plus_grand(7, 5))
print(qui_est_plus_grand(26, 13))

Notez les indentations après les caractères :. J’espère que vous n’êtes pas perdus !

Explications :

  • def qui_est_plus_grand(x, y): on va définir un programme avec le nom qui_est_plus_grand qui prend 2 variables en entrée.
  • if x > y: “if” veut dire “si” en anglais, cette ligne correspond à une condition dont l’ordinateur va vérifier si elle est satisfaite ou pas. Si oui, il fait ce qui est indenté par la suite.
  • return x est l’action que l’ordinateur réalise si effectivement x est supérieur à y. Il renvoie x à l’utilisateur.
  • else: sert à spécifier ce que l’ordinateur doit faire dans le cas ou x n’est pas supérieur à y et que donc la ligne return x n’est pas exécutée.
  • return y est ce qui est exécuté quand la condition du if, à savoir que x > y, n’est pas vérifiée.

Python nous permet également d’introduire des listes sous la forme suivante : [1, 2, 3, 4, 5]. Le programme suivant montre une manière dont on peut les manipuler :

def plus_grand_de_la_liste(liste):
	max = 0
	for nombre in liste :
		if nombre > max :
			max = nombre
	return max

print(plus_grand_de_la_liste([1, 2, 3, 4, 5]))
print(plus_grand_de_la_liste([1, 20, 35, 4, 15]))
print(plus_grand_de_la_liste([321, 38, 390, 67, 512]))

Croyez-le ou non, ce programme prend une liste de nombre en entrée et renvoie le nombre le plus grand de la liste.

Explications du programme ci-dessus :

  • Le mot-clé def qui indique qu’on définit un programme.
  • plus_grand_de_la_liste est le titre (plutôt explicite) de l’algorithme.
  • liste est ce que le programme prend en entrée.
  • max = 0 on assigne à la variable max la valeur de 0.
  • for nombre in liste: pour chaque élément de la liste, on va faire l’action décrite dans tout ce qui est indenté par rapport à cette ligne. On appelle ça une boucle for.
  • if nombre > max : on regarde si l’élément de la liste est supérieur à la variable max. Si oui, on fait l’action définie ensuite, si non, on ne fait rien. On appelle ça une action conditionnelle.
  • return max on note que cette ligne là n’est pas indentée par rapport aux trois lignes du dessus, c’est donc qu’elle ne rentre pas dans cette boucle. Elle renvoie la variable max.

Exemple d’imbrication Link to heading

Si vous avez bien compris le programme ci-dessus, vous allez alors comprendre pourquoi on pourrait facilement imbriquer la fonction qui_est_plus_grand dans plus_grand_de_la_liste :

def plus_grand_de_la_liste(liste):
	max = 0
	for nombre in liste :
		max = qui_est_plus_grand(max, nombre)
	return max

En effet, comparer deux nombres et trouver le plus grand, on l’a déjà fait dans une fonction, donc pourquoi se fatiguer ? imbriquons ! L’informatique est une discipline de fainéants si vous ne l’aviez pas compris, on passe son temps à demander à des ordinateurs de travailler à notre place !

Exemple d’implémentation Link to heading

On a utilisé le Python plus haut, mais il existe de nombreux autres langages de programmation. Reprenons notre programme plus_grand_de_la_liste dans d’autres langages pour voir à quoi ça ressemble, je vais utiliser codeconvert.ai pour ça.

Le voici en JavaScript, un langage surtout utile pour coder des sites web :

function plusGrandDeLaListe(liste) {
    let max = liste[0];
    for (const nombre of liste) {
        if (nombre > max) {
            max = nombre;
        }
    }
    return max;
}

Voilà qui change un peu, on voit qu’il y a beaucoup plus de parenthèses, il y a des termes comme let ou const qui ont été rajoutés aussi, mais on reconnaît les for les if etc.

Le voici en Bash, un langage très utilisé pour parler à des ordinateurs Linux :

#!/bin/bash
plus_grand_de_la_liste() {
    local liste=("$@")
    local max=${liste[0]}
    for nombre in "${liste[@]}"; do
        if (( nombre > max )); then
            max=$nombre
        fi
    done
    echo $max
}

On note une petite ligne en plus au début, on voit aussi que les entrées du programme sont données différemment, on voit aussi qu’il faut des mots-clés if et fi pour indiquer ce qui est compris dans l’action conditionnelle, de même il faut do et done pour indiquer ce qu’il se passe dans la boucle for.

Maintenant, on voit bien que les programmes ci-dessus, dans tous ces langages de programmations sont différents, mais ils ont tous quelque chose en commun : ils réalisent le même algorithme. Cet algorithme, c’est l’idée plus abstraite d’une suite d’opérations qui permettrait de prendre une liste de nombres et d’en trouver le nombre le plus grand.

Avec nos quelques exemples, on a quand même quelques notions de comment parler à un ordinateur. À l’instar des recettes de grands-mères, on pourrait expliciter cet algorithme pour ensuite l’implémenter avec Python, JavaScript ou Bash.

Généralement, on fait ça dans un langage qu’on appelle le pseudo-code, et voici à quoi ressemblerait le pseudo-code du programme plus_grand_de_la_liste :

ALGORITHME plus_grand_de_la_liste :
PREND EN ENTRÉE : une liste de nombre
RETOURNE EN SORTIE : un nombre
	ASSIGNER le 1er élément de la liste à la variable max
	POUR CHAQUE élément de la liste:
		SI élement est supérieur à max:
			ASSIGNER élément à max
		FIN SI
	FIN POUR
	RETOURNER max

Résumé Link to heading

Donc pour résumer, on part d’un algorithme, qu’on imagine et qu’on définit, potentiellement en pseudo-code, puis on l’implémente avec du code dans un langage de programmation pour obtenir un programme ou un script. Pour faire une montée en complexité efficace et obtenir un logiciel ou une application (software en anglais) il est très utile d’utiliser de l’imbrication en réutilisant des programmes à l’intérieur d’autres programmes pour éviter d’avoir à les re-coder et pour corriger les erreurs et les bugs plus facilement.

Conclusion Link to heading

Je me suis beaucoup creusé la tête sur comment présenter ces concepts-là de la manière la plus claire et pédagogique possible, et j’ai fait plusieurs aller-retour avec certains de mes proches pour peaufiner le texte, trouver les points difficiles à comprendre, trouver des exemples parlants et stimulants, et donner une cohérence à l’ensemble de l’article. J’espère que j’ai (ou plutôt qu’on) a bien réussi et que vous aurez appris ou clarifié des choses !

À bientôt pour le prochain billet, où on va parler de transfert de données ;)