Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Auf Deutsch lesen

Section 0.1 sur 0.8 · Débutant · 15 min de lecture

Programmes, code et exécution par l’ordinateur

Leçon vidéo

4 min · narré en anglais, avec sous-titres
Écouter seulement (audio)
Lire la transcription

Bienvenue dans Be Software Architecture Wise. Dans cette première leçon, nous partons du tout début : ce qu’est un logiciel, et ce qui se passe réellement quand un ordinateur exécute un programme. Vous n’avez besoin d’aucune formation technique. À la fin, vous connaîtrez la poignée d’idées sur lesquelles s’appuie chaque chapitre suivant.

Commençons par deux mots que vous entendrez sans cesse. Le matériel, c’est la machine physique : le processeur, la mémoire, le stockage et la carte réseau. Le logiciel, c’est l’ensemble des instructions et des données qui disent à ce matériel quoi faire. Une image utile est celle de la cuisine d’un restaurant. Le chef est le processeur, et le logiciel, ce sont les recettes que suit le chef.

Un programme est une liste d’instructions précises, et l’ordinateur les suit exactement, mot pour mot. Il ne devine jamais ce que vous vouliez dire. C’est pourquoi les erreurs dans les instructions se transforment en bugs. L’ordinateur ne fait pas exprès d’être difficile ; il fait précisément ce qu’on lui a dit. Les programmeurs écrivent ces instructions sous forme de code source, dans des langages comme Python, Java ou Go, que les humains peuvent lire et modifier.

Mais le processeur ne sait pas lire le Python ni le Java. Sa propre langue est le code machine : des instructions très simples, propres à un type de processeur. Le code source doit donc être traduit. Il existe deux voies principales. Dans la première, un compilateur traduit tout le programme en code machine avant sa sortie. Les langages comme C, Rust et Go fonctionnent ainsi. Dans la seconde, le code est compilé dans une forme intermédiaire appelée bytecode, et un programme appelé machine virtuelle l’exécute, en traduisant au passage les parties très sollicitées en code machine. Java, Python et C# fonctionnent ainsi.

Entre vos programmes et le matériel se trouve le système d’exploitation, comme Windows, macOS, Linux ou Android. Les applications, comme un navigateur web ou une app de livraison de repas, ne touchent pas directement au matériel. Elles demandent ce dont elles ont besoin au système d’exploitation, par ce qu’on appelle des appels système. Le système d’exploitation partage le processeur, la mémoire, les fichiers et le réseau entre tous les programmes en cours d’exécution, et il les empêche de se gêner mutuellement. Dans notre cuisine, c’est le responsable qui décide quelle recette retient l’attention du chef.

Quand un programme s’exécute, le système d’exploitation crée pour lui un processus, doté de sa propre mémoire privée. À l’intérieur d’un processus, il peut y avoir plusieurs threads, chacun accomplissant une part du travail en même temps. Les threads partagent la mémoire du processus. C’est utile, mais si deux threads modifient la même donnée au même moment, on obtient certains des bugs les plus difficiles à trouver. Et remarquez la différence entre la mémoire et le disque. La mémoire, ou RAM, est rapide, mais elle est effacée quand le programme s’arrête ou que la machine redémarre. Tout ce qui ne doit pas être perdu doit être enregistré sur un stockage durable, en général une base de données.

Assemblons tout cela avec un tout petit programme qui calcule le prix d’une commande. Quand vous le lancez, le système d’exploitation crée un processus et y démarre l’interpréteur Python. L’interpréteur lit le fichier et le transforme en bytecode. S’il y a une faute de frappe, comme une parenthèse manquante, elle est signalée à ce moment-là, avant toute exécution. Le programme vous demande combien d’articles vous voulez, puis attend. Pendant qu’il attend, il n’utilise aucun temps processeur. Vient ensuite le calcul : trois articles à douze livres cinquante font trente-sept livres cinquante, et en ajoutant vingt pour cent de TVA, on obtient quarante-cinq livres. Enfin, le résultat est affiché et le processus se termine. Sa mémoire est rendue, et comme rien n’a été enregistré sur disque, la réponse est perdue.

Pourquoi est-ce important pour l’architecture logicielle ? Parce que chaque système que vous concevrez, aussi grand soit-il, est fait de programmes qui tournent sous forme de processus sur du matériel partagé. Les décisions sur ce qui vit en mémoire et ce qui doit être stocké durablement reviennent sans cesse, dans chaque chapitre. Et comme beaucoup de choses tournent en même temps et que les machines redémarrent, les architectes doivent prévoir la concurrence et les pannes dès le départ.

Voilà les fondations. La section complète contient l’exemple de code en entier, et en dit plus sur le système d’exploitation et les bugs. Ensuite, dans la section zéro point deux, nous verrons comment les programmes organisent les données. À très vite.

Ce qu’il faut savoir

Matériel et logiciel

Un ordinateur est une machine qui suit des instructions très rapidement. Les parties physiques que vous pourriez toucher forment le matériel ; les instructions qui disent à ces parties quoi faire forment le logiciel. Un ordinateur portable, un téléphone, le serveur qui fait tourner le site web de votre banque et la puce d’un thermostat connecté sont tous des ordinateurs construits à partir des quatre mêmes types de composants.

Le CPU (unité centrale de traitement, ou processeur) exécute les instructions. Un processeur moderne possède plusieurs cœurs, chacun capable de traiter son propre flux d’instructions, et chaque cœur exécute des milliards d’étapes simples par seconde. La RAM (mémoire vive, généralement appelée simplement mémoire) contient les instructions et les données sur lesquelles le CPU travaille en ce moment. Elle est rapide, mais volatile : coupez le courant et son contenu disparaît. Le stockage (un disque SSD ou un disque dur à plateaux) conserve les fichiers quand l’appareil est éteint, mais il est beaucoup plus lent d’accès. Une carte réseau (filaire ou Wi-Fi) envoie des données vers d’autres ordinateurs et en reçoit.

Pensez à la cuisine d’un restaurant. Le chef est le CPU : le seul qui cuisine vraiment. Le plan de travail est la RAM : tout ce que le chef utilise à cet instant y est disposé, à portée de main, mais il est débarrassé en fin de soirée. Le garde-manger et le congélateur sont le stockage : vastes, permanents et à quelques pas. Le passe-plat vers la salle est la carte réseau, par lequel les commandes arrivent et les plats repartent. Les recettes sont le logiciel.

Les quatre composants de tout ordinateur

ComposantCe qu’il faitAnalogie de la cuisineCe qui se passe s’il est le goulot d’étranglement
CPU (processeur)Exécute les instructions : calculs, comparaisons, déplacement de donnéesLe chefLe travail s’accumule ; les pages et les rapports deviennent lents alors qu’il reste de la mémoire libre
RAM (mémoire)Contient les programmes en cours d’exécution et les données qu’ils utilisentLe plan de travailLe système commence à déplacer des données vers le disque et ralentit fortement, ou des programmes sont arrêtés
Stockage (SSD ou disque)Conserve durablement les fichiers et les bases de donnéesLe garde-manger et le congélateurL’enregistrement et le chargement des données deviennent lents ; un disque plein peut arrêter une base de données
Carte réseauEnvoie des données vers d’autres machines et en reçoitLe passe-plat vers la salleLes requêtes attendent d’être envoyées ou reçues ; les utilisateurs constatent des délais

Ce qu’est un programme

Un programme est une liste d’instructions précises qu’un ordinateur suit pour accomplir une tâche : calculer une facture, afficher une page web, envoyer un paiement. Le mot qui compte est précises. Un cuisinier humain sait se débrouiller avec « saler à votre goût » ; un ordinateur, non. Il fait exactement ce qu’on lui dit, exactement dans l’ordre où on le lui dit, et rien de plus. Si une instruction demande de diviser par un nombre qui se révèle être zéro, l’ordinateur ne hausse pas les épaules pour continuer : le programme s’arrête sur une erreur, à moins que le programmeur n’ait écrit d’autres instructions indiquant quoi faire dans ce cas.

Au niveau le plus bas, le CPU répète un même cycle tant qu’il est allumé : aller chercher l’instruction suivante en mémoire, décoder ce qu’elle signifie, l’exécuter, puis passer à la suivante. Chaque instruction est minuscule : additionner deux nombres, comparer deux valeurs, copier une valeur d’un endroit de la mémoire à un autre, sauter à une autre instruction si une comparaison était vraie. Tout ce que fait un ordinateur, de la lecture d’un film à l’entraînement d’un modèle d’IA, est construit à partir de milliards de ces petites étapes.

Le logiciel est le terme le plus large : les programmes ainsi que les données, la configuration et la documentation dont ils ont besoin. Une application (ou app) est un logiciel qui fait quelque chose d’utile pour une personne, comme une application bancaire. Le logiciel système, comme le système d’exploitation décrit plus bas, existe surtout pour faire fonctionner d’autres logiciels.

Les couches : les applications, le système d’exploitation et le matériel

Les applications demandent des services au système d’exploitation, qui contrôle le matériel : CPU, RAM, stockage et carte réseauNavigateurApp de livraisonTableurappels systèmeSystème (OS)planifie le CPU, partage mémoire, fichiers, réseauMatérielCPUexécute le codeRAMrapide, éphémèreStockagelent, permanentCarte réseauenvoie et reçoitpilotes
Les applications ne pilotent jamais directement le matériel : elles le demandent au système d’exploitation, qui le partage équitablement et en toute sécurité entre elles.

Le code source et les langages de programmation

Les CPU ne comprennent que le code machine : des instructions codées sous forme de nombres, propres à une famille de processeurs. Les puces Intel et AMD de la plupart des ordinateurs portables et des serveurs utilisent une famille (x86-64) ; les puces des téléphones, des Mac récents et de nombreux serveurs cloud en utilisent une autre (Arm). Le code machine qui tourne sur l’une ne tourne pas sur l’autre. Écrire du code machine à la main est lent, source d’erreurs et ne se fait presque plus aujourd’hui.

À la place, on écrit du code source dans un langage de programmation : une notation définie avec précision, qui se lit en partie comme de l’anglais et en partie comme des mathématiques. Python, JavaScript, Java, C#, Go, Rust et C en sont des exemples très répandus. On les appelle des langages de haut niveau parce qu’ils permettent à un programmeur de dire « additionne les prix de ce panier » en une ou deux lignes au lieu de dizaines d’instructions machine, et parce qu’ils cachent les détails du CPU utilisé. Le code source est du texte brut, enregistré dans des fichiers, et c’est ce que les programmeurs lisent, écrivent, relisent et conservent dans un système de gestion de versions (un système qui garde l’historique de chaque modification, expliqué dans la dernière section de ce chapitre).

Les langages diffèrent par ce qu’ils rendent facile. Python est apprécié pour sa lisibilité et domine la science des données et l’IA ; JavaScript est le langage qu’exécute tout navigateur web ; Java et C# sont courants dans les grands systèmes de gestion ; Go est populaire pour les services réseau ; C et Rust sont utilisés là où chaque microseconde et chaque octet comptent, comme dans les systèmes d’exploitation et les bases de données. Aucun langage n’est le meilleur en tout, et en choisir un est à la fois une décision technique et une question de compétences disponibles dans l’équipe.

Du code source à un programme en cours d’exécution : compilateurs, interpréteurs et machines virtuelles

Le code source doit être transformé en quelque chose que le CPU peut exécuter. Il existe trois grandes approches, et les langages réels les combinent souvent.

Un compilateur est un programme qui traduit l’ensemble du code source d’un programme sous une autre forme avant son exécution. Des langages comme C, C++, Rust et Go sont généralement compilés à l’avance en code machine pour un CPU et un système d’exploitation donnés. Le résultat est un fichier exécutable qui démarre vite et s’exécute rapidement, mais il faut compiler une version distincte pour chaque type de machine que vous voulez prendre en charge, et le compilateur rejette le programme s’il y trouve certains types d’erreurs.

Un interpréteur est un programme qui lit le code source (ou quelque chose de très proche) et exécute ses instructions au fur et à mesure, une étape à la fois. L’interprétation permet d’essayer facilement des choses et d’exécuter le même programme sur toute machine dotée de l’interpréteur, au prix de la vitesse.

De nombreux langages populaires se situent entre les deux. Le code source Java est compilé par un outil appelé javac en bytecode : des instructions compactes destinées à un ordinateur imaginaire et idéalisé plutôt qu’à un vrai CPU. La machine virtuelle Java (JVM) exécute ensuite ce bytecode sur la machine réelle où elle est installée, ce qui permet à un même programme Java de tourner sans modification sous Windows, macOS et Linux. La JVM repère les parties du programme qui s’exécutent le plus souvent et les compile en code machine pendant l’exécution, une technique appelée compilation juste-à-temps (JIT). C# sur .NET fonctionne de façon similaire. L’implémentation standard de Python, CPython, compile elle aussi vos fichiers .py en bytecode (en mettant en cache le bytecode des modules importés dans des fichiers .pyc), puis exécute ce bytecode dans sa propre boucle d’interprétation.

Deux voies du code source jusqu’au CPU

Deux voies du code source à un programme qui s’exécute : compiler directement en code machine, ou compiler en bytecode qu’exécute une machine virtuelleVoie 1 : compilé à l’avance (C, C++, Rust, Go)Code source.c .rs .goCompilateuravant livraisonCode machinepar type de CPUCPUl’exécute tel quelVoie 2 : bytecode et machine virtuelle (Java, Python, C#)Code source.java .pyCompilateurjavac, CPythonBytecode.class .pycMachinevirtuelleCPUinterprète le bytecode ; compile en JITles parties fréquentes en code machine
La compilation à l’avance produit du code machine pour un seul type de CPU ; la compilation en bytecode permet à un même fichier de tourner partout où une machine virtuelle adaptée est installée.

Comparaison des approches

ApprocheLangages typiquesPoints fortsCoûts
Compilation à l’avance en code machineC, C++, Rust, GoDémarrage et exécution rapides ; un seul fichier autonome à déployerConstruire une version distincte par CPU et par système d’exploitation ; cycle modifier-essayer plus lent
Bytecode plus une machine virtuelle avec JITJava, Kotlin, C#Une seule build tourne sur de nombreuses plateformes ; le JIT peut rendre très rapides les services qui tournent longtempsLe runtime doit être installé ; démarrage plus lent et mémoire supplémentaire le temps que le JIT monte en régime
Bytecode plus un interpréteurPython (CPython), RubyRapide à écrire et à essayer ; très portableEn général plus lent pour les calculs lourds ; les parties critiques pour la vitesse sont souvent écrites en C et appelées depuis Python
Compilé en JIT dans le navigateur ou sur le serveurJavaScript (V8 dans Chrome et Node.js)Tourne partout où tourne un navigateur ; assez rapide pour la plupart des usages webLes performances peuvent être moins prévisibles que celles du code compilé

Le rôle du système d’exploitation

Quand vous allumez un ordinateur, le premier programme important à démarrer est le système d’exploitation (OS) : Windows, macOS, Linux, Android ou iOS. La plupart des serveurs d’internet tournent sous Linux. Le système d’exploitation a quatre grandes missions.

Premièrement, il partage le CPU. Un ordinateur portable peut avoir quelques dizaines de programmes en cours d’exécution mais seulement une poignée de cœurs : l’OS fait donc passer chaque cœur d’un programme à l’autre de nombreuses fois par seconde, assez vite pour qu’ils semblent tous tourner en même temps. Deuxièmement, il gère la mémoire, en donnant à chaque programme sa propre zone et en empêchant un programme de lire ou d’écraser celle d’un autre. Troisièmement, il fournit les fichiers et les périphériques : les programmes demandent à l’OS d’ouvrir un fichier, de dessiner à l’écran ou d’envoyer des données sur le réseau, et l’OS, au moyen de petits programmes appelés pilotes, s’occupe du matériel particulier. Quatrièmement, il fait respecter la sécurité : les utilisateurs, les autorisations et la règle selon laquelle une app ne peut pas lire vos photos sans votre accord.

Les programmes font ces demandes au moyen d’appels système, un ensemble fixe de services proposés par l’OS. C’est le premier exemple, dans ce cours, d’une idée architecturale importante : une couche qui cache des détails compliqués derrière un ensemble stable de demandes. La personne qui écrit une app de livraison de repas n’a pas besoin de savoir de quelle marque est la puce réseau du téléphone.

Processus, threads, mémoire et disque

Un fichier de programme posé sur le disque n’est qu’un ensemble d’instructions stockées. Quand vous le lancez, l’OS crée un processus : une instance en cours d’exécution du programme, avec sa propre mémoire privée, sa propre identité et sa propre part de temps CPU. Ouvrez deux fenêtres de navigateur et vous aurez peut-être plusieurs processus ; démarrez un serveur web et il pourra tourner sous la forme d’un seul processus ou de plusieurs.

À l’intérieur d’un processus, il peut y avoir plusieurs threads. Un thread est une séquence d’instructions en cours d’exécution. Un processus à plusieurs threads peut faire plusieurs choses à la fois, par exemple traiter en même temps les requêtes de deux clients, et tous ses threads partagent la mémoire du processus. Ce partage est pratique mais risqué : si deux threads modifient la même donnée au même moment sans coordination, le résultat peut être faux d’une manière qui n’apparaît qu’occasionnellement. Ces bugs de concurrence comptent parmi les plus difficiles à trouver, ce qui explique en partie pourquoi beaucoup de systèmes préfèrent des processus séparés, ou des conceptions où chaque requête est traitée indépendamment.

La différence entre la mémoire et le disque explique une grande partie de la conception logicielle. Les données en RAM sont rapides d’accès, environ un dixième de microseconde, mais elles disparaissent quand le processus se termine, plante ou que la machine redémarre. Les données sur disque survivent, mais y accéder prend bien plus longtemps : des dizaines de microsecondes ou plus sur un SSD, et plusieurs millisecondes sur un disque à plateaux. Toute information qui ne doit pas être perdue, comme une commande ou un paiement, doit donc être écrite sur un stockage durable, généralement au moyen d’une base de données, avant que le système ne dise au client « c’est fait ».

Un processus, ses threads, sa mémoire et le disque

Un processus à deux threads partageant un bloc de mémoire, qui écrit sur disque les données à garder, à côté d’un autre processus à mémoire propreProcessus : l’app de commandesThread 1sert le client AThread 2sert le client BMémoire (RAM) de ce processuscommune aux threads ; perdue au redémarrageDisque (SSD)fichiers et BDsurvivent au rebootsauveAutre processussa propre mémoire
Les threads d’un même processus partagent sa mémoire ; des processus séparés, non ; seul ce qui est enregistré sur disque survit à un redémarrage.
PRICE_PER_ITEM = 12.50   # pounds
VAT_RATE = 0.20          # 20 per cent

def total_with_vat(quantity):
    subtotal = quantity * PRICE_PER_ITEM
    return subtotal * (1 + VAT_RATE)

quantity = int(input("How many items? "))
print("Total to pay:", round(total_with_vat(quantity), 2))
Un tout petit programme Python : calculer le prix d’une commande TVA comprise

Exemple commenté

Exemple commenté : ce qui se passe quand le programme s’exécute

Supposons que le code ci-dessus soit enregistré sous le nom order.py et que vous tapiez python order.py, puis que vous saisissiez 3.

1. DémarrageLe système d’exploitation crée un nouveau processus, lui attribue de la mémoire et lance à l’intérieur l’interpréteur Python (lui-même un programme compilé).
2. CompilationCPython lit order.py sur le disque, vérifie que c’est du Python valide et le compile en bytecode. Une parenthèse ou un deux-points manquant serait signalé ici comme une erreur de syntaxe, avant toute exécution.
3. DéfinitionL’interpréteur exécute le bytecode depuis le début. Il stocke 12,5 et 0,2 en mémoire sous les noms PRICE_PER_ITEM et VAT_RATE, et enregistre la fonction total_with_vat sans encore l’exécuter.
4. Saisieinput() demande à l’OS de lire le clavier. Le processus attend, sans utiliser de CPU, jusqu’à ce que vous tapiez 3 et appuyiez sur Entrée. int() transforme le texte « 3 » en nombre 3.
5. CalculLa fonction s’exécute : 3 fois 12,5 font 37,5, puis 37,5 fois 1,2 font 45,0. Chaque étape représente une poignée d’instructions de bytecode, dont chacune devient de nombreuses instructions machine sur le CPU.
6. Affichageprint() demande à l’OS d’afficher Total to pay: 45.0 à l’écran.
7. FinLe programme atteint sa dernière ligne, le processus se termine et l’OS récupère sa mémoire. Rien n’a été enregistré sur disque : le résultat est donc perdu, sauf si vous l’avez recopié.

Même ce programme de neuf lignes dépend du système d’exploitation pour la mémoire, le clavier et l’écran, et d’un environnement d’exécution du langage pour le traduire à l’intention du CPU.

Si vous tapiez trois au lieu de 3, int() échouerait avec une erreur d’exécution et le programme s’arrêterait : le code ne disait jamais quoi faire d’une saisie incorrecte.

Le programme garde l’argent dans un nombre à virgule flottante pour rester court. Les vrais systèmes financiers stockent des pence entiers ou utilisent un type décimal, pour des raisons qu’explique la section suivante.

Les bugs : quand les instructions sont fausses

Un bug est une erreur dans un logiciel qui le fait se comporter autrement que prévu. Comme les ordinateurs suivent les instructions à la lettre, presque tout bug est un écart entre ce que le programmeur voulait dire et ce qu’il a réellement écrit, ou une situation à laquelle personne n’avait pensé.

Il est utile d’en distinguer trois sortes. Une erreur de syntaxe enfreint la grammaire du langage (une parenthèse manquante) : le compilateur ou l’interpréteur refuse alors purement et simplement d’exécuter le programme ; ces erreurs sont repérées immédiatement. Une erreur d’exécution survient pendant que le programme tourne, par exemple une division par zéro ou la lecture d’un fichier qui n’existe pas ; le programme s’arrête généralement avec un message d’erreur. Une erreur de logique est la plus dangereuse : le programme tourne sans problème et donne la mauvaise réponse, par exemple en facturant la TVA deux fois. Rien ne plante, si bien que seuls les tests, une relecture attentive ou un client mécontent la révéleront.

Les équipes professionnelles s’attendent aux bugs et mettent en place des défenses : tests automatisés, revue de code, mises en production progressives et supervision qui remarque quand les taux d’erreur augmentent. Beaucoup de ces défenses sont architecturales, et on les retrouve tout au long de ce cours.

Pourquoi c’est important pour l’architecture

L’architecture porte sur les grandes décisions coûteuses à changer, et plusieurs d’entre elles reposent sur les idées de cette section. Le choix du langage et de l’environnement d’exécution influe sur le temps de démarrage, la consommation de mémoire, les bibliothèques utilisables et les profils que vous pouvez recruter. La séparation entre mémoire et disque détermine ce qui doit être stocké durablement, et comment un système se rétablit après un plantage. Les processus et les threads sont les unités qui s’exécutent, tombent en panne et passent à l’échelle : un chapitre ultérieur se demande si un système doit être un seul processus ou plusieurs processus qui coopèrent. Enfin, la conception en couches du système d’exploitation, qui cache le matériel derrière un ensemble stable de demandes, est la première illustration d’un principe que vous retrouverez sous le nom de masquage de l’information.

La section suivante s’intéresse à ce sur quoi travaillent réellement les programmes : les données, ainsi que les structures et les algorithmes qui rendent ce travail rapide ou lent.

Vérifiez votre compréhension

Pourquoi les données d’un programme disparaissent-elles quand il plante, à moins d’avoir été enregistrées ?

Pendant l’exécution d’un programme, ses données vivent en RAM, qui appartient au processus et est effacée quand le processus se termine ou que la machine redémarre. Seules les données écrites sur un stockage comme un disque ou une base de données survivent.

Quelle est la différence entre un compilateur et un interpréteur ?

Un compilateur traduit tout le programme sous une autre forme (code machine ou bytecode) avant son exécution ; un interpréteur exécute les instructions au fur et à mesure qu’il les lit. Beaucoup de langages, comme Java et Python, compilent d’abord en bytecode, puis exécutent ce bytecode dans une machine virtuelle.

Pourquoi un programme Java construit sur un portable Windows peut-il généralement tourner sans modification sur un serveur Linux ?

Java est compilé en bytecode, et non en code machine pour un seul CPU. Toute machine sur laquelle une machine virtuelle Java est installée peut exécuter ce bytecode.

Pourquoi les programmes demandent-ils au système d’exploitation de lire un fichier ou d’envoyer des données, au lieu de piloter eux-mêmes le disque ou la carte réseau ?

Le système d’exploitation partage le matériel en toute sécurité entre les programmes, fait respecter les autorisations et cache les détails de chaque périphérique derrière des appels système, de sorte que les applications n’ont pas besoin de savoir sur quel matériel elles tournent.

Suivant · 0.2Données et algorithmesComment les ordinateurs représentent les nombres et le texte, les structures de données courantes (listes, dictionnaires, files, arbres, graphes), ce qu’est un algorithme et comment la notation grand O explique pourquoi certains systèmes ralentissent quand le volume de données augmente.Continuer →

Sources et lectures complémentaires

Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.

Demander : « Si Python est plus lent que C, pourquoi tant d’entreprises construisent-elles leurs systèmes backend en Python ? »