1. Livres & vidéos
  2. L’informatique
  3. La programmation
Extrait - L’informatique Des transistors aux microservices
Extraits du livre
L’informatique Des transistors aux microservices
2 avis
Revenir à la page d'achat du livre

La programmation

Introduction

Les langages de programmation sont les outils qui permettent aux programmeurs de contrôler les ordinateurs. Ils traduisent des concepts abstraits, parfois de haut niveau, mais le plus souvent des instructions élémentaires en commandes compréhensibles par les ordinateurs. Depuis les premiers langages basés sur des opérations simples au plus proche du matériel, jusqu’aux langages modernes orientés objets ou fonctionnels, leur évolution reflète les progrès technologiques et les besoins croissants en matière de complexité, de performance et d’abstraction. Ce chapitre explore l’évolution des langages de programmation avec le développement de l’informatique et pourquoi certains d’entre eux sont devenus des piliers dans l’histoire du logiciel.

L’assembleur et le langage machine

Le langage machine est la forme la plus basique d’instructions qu’un processeur peut exécuter. Ces instructions élémentaires sont codées en binaire (0 et 1) et souvent représentées en hexadécimal. Le langage machine est le langage naturel ou natif du microprocesseur.

1. Le langage natif du microprocesseur

Lorsqu’un programme est compilé à partir d’un langage de plus haut niveau, comme le C ou le Rust, le travail du compilateur consiste précisément à convertir le code source dans le langage évolué en langage machine pour que l’ordinateur puisse l’interpréter.

Chaque type de processeur, en fonction de son architecture (comme x86, ARM, etc.), comprend et exécute un ensemble spécifique d’instructions binaires appelé jeu d’instructions (instruction set). Ce dernier inclut des opérations comme le chargement de données en mémoire, la gestion des registres, les calculs arithmétiques, etc.

Le jeu d’instruction caractérise l’ensemble des valeurs binaires (présentées usuellement en hexadécimal) acceptées et interprétables par le microprocesseur. On distingue différentes notions liées au jeu d’instructions :

  • Les opcodes (operation code) sont la partie d’une instruction machine ou assembleur qui spécifie l’opération à effectuer, comme mov - code b9 sur x86 - pour un déplacement de données ou add - code 83 sur x86 - pour une addition. Chaque opcode correspond à une instruction binaire spécifique que le processeur peut comprendre :

  • Les modificateurs (ou modR/M bytes) définissent les opérandes sur lesquels l’opcode va agir, comme des registres ou des adresses mémoire. Ils précisent comment l’opération doit être effectuée (par exemple, entre deux registres ou entre un registre et une valeur immédiate).

  • Les immédiats : des valeurs littérales ou constantes intégrées à l’instruction (par exemple, une constante à ajouter ou déplacer comme la valeur 5 dans add eax, 5 en assembleur).

  • Les préfixes modifient le comportement de certaines instructions (ex. : pour...

Les langages procéduraux

Les langages procéduraux forment une famille de langages de programmation qui organisent le code autour de structures de contrôle et de procédures, aussi appelées « fonctions » ou « sous-programmes », qui exécutent une série d’instructions pour accomplir une tâche spécifique. Ces langages mettent l’accent sur une séquence d’actions à effectuer, organisées en blocs logiques pour garantir la clarté et la modularité du code. Les premiers langages procéduraux populaires furent Fortran, COBOL puis C et partagent plusieurs principes et structures de contrôle fondamentaux qui permettent de gérer le flux d’exécution dans un programme.

1. Avantages des langages procéduraux

Les principaux avantages des langages procéduraux sont les suivants :

  • Modularité : les programmes sont divisés en sous-programmes ou fonctions, qui exécutent chacun une tâche spécifique. Cela favorise la réutilisation du code et le débogage.

  • Structures de contrôle : des constructions de haut niveau sont disponibles pour effectuer simplement des itérations ou des branchements conditionnels.

  • Définition de variables globales et locales : il est possible de définir des variables pour stocker des données plutôt que d’utiliser directement la mémoire. Ces variables peuvent avoir différentes visibilités, être globales (visibles dans tout le programme) ou locales (privée à une fonction).

2. Structures de contrôle

Les structures de contrôle en programmation procédurale permettent de gérer la façon dont un programme s’exécute. Les principales structures de contrôle incluent les structures conditionnelles, les boucles et les sauts. Voyons chacune de ces structures, illustrées par pseudo-code.

a. Structures conditionnelles : if, else if, else

Les structures conditionnelles permettent de vérifier des conditions et d’exécuter du code conditionnellement selon...

Le Fortran et le COBOL

Le Fortran et le COBOL sont tous les deux des langages de programmation procéduraux et parmi les premiers langages de haut niveau qui furent inventés.

1. Le langage Fortran

Fortran (FORmula TRANslation) est l’un des premiers langages de programmation de haut niveau, conçu spécifiquement pour les calculs scientifiques et d’ingénierie. Développé par une équipe d’IBM dirigée par John Backus dans les années 1950, Fortran a été publié pour la première fois en 1957. Il a été initialement conçu pour fonctionner sur l’ordinateur IBM 704, une machine qui a introduit des instructions arithmétiques avancées, adaptées aux calculs scientifiques intensifs.

Fortran a été conçu pour offrir une alternative plus simple et plus efficace à la programmation en assembleur, qui était alors la norme. Il permettait d’écrire des programmes plus courts et de les rendre plus lisibles tout en conservant une bonne performance. Il se distingue par sa simplicité syntaxique et son efficacité dans le calcul numérique. Les premières versions du langage ont des structures de contrôle telles que les boucles (DO), les conditions (IF), les variables et les fonctions mathématiques. Ces fonctionnalités ont permis aux scientifiques de traduire des problèmes mathématiques complexes en programmes informatiques.

Fortran a rapidement été adapté sur toute une série d’ordinateurs IBM, comme les IBM 7090 et 7094, qui étaient utilisés pour des calculs complexes, notamment dans les domaines scientifique, aérospatial et militaire. Il s’est ensuite étendu à d’autres ordinateurs, devenant un standard pour les calculs scientifiques sur les machines de Control Data Corporation (CDC), Honeywell, et plus tard sur les superordinateurs Cray.

L’efficacité en matière de calculs mathématiques lourds a fait de lui le langage de choix pour les simulations scientifiques, la modélisation climatique, la physique des particules et encore bien d’autres domaines techniques.

Malgré l’avènement de nombreux autres langages, Fortran, s’il n’est plus nécessairement prédominant...

Le langage C

Nous avons introduit l’histoire du langage C par la perspective de son développement, principalement pour le système Unix, à la section L’ère d’Unix du chapitre Les systèmes d’exploitation. Le langage C (1970) a évolué à partir du langage B, lui-même dérivé de BCPL. L’une des premières machines à utiliser C fut le PDP-11, un mini-ordinateur populaire de Digital Equipment Corporation (DEC).

À l’origine, Unix était écrit en assembleur, ce qui limitait sa portabilité. Le langage C a permis de réécrire Unix de manière plus portable tout en restant suffisamment proche du matériel pour garantir des performances élevées. Sa simplicité syntaxique et son efficacité ont rapidement fait de C un langage incontournable, à la fois pour le développement d’Unix et d’autres systèmes d’exploitation, logiciels et programmes d’infrastructure.

Le langage C est un langage de bas niveau qui fournit un contrôle direct sur la mémoire grâce à l’utilisation de pointeurs permettant de réaliser une gestion largement manuelle de la mémoire et de disposer d’une grande flexibilité pour manipuler des structures de données complexes. C est connu pour sa portabilité. On le qualifie ainsi souvent « bas niveau portable », car il permet d’écrire du code très proche du matériel tout en restant portable. Il est relativement facile de l’adapter à différentes architectures matérielles, ce qui a contribué à sa popularité dans l’univers de la programmation système.

Notons que les termes « bas niveau » et « haut niveau » sont relatifs et contextuels. Comparativement à l’assembleur, tout langage est considéré de haut niveau. Cependant, en comparant par exemple Fortran à C, le premier est un langage historiquement plus abstrait, conçu pour l’expressivité mathématique, les calculs scientifiques et l’optimisation automatique par le compilateur. Il est donc de plus haut niveau dans sa philosophie d’origine.

Un pointeur est une variable en programmation...

La programmation orientée objet

La programmation orientée objet (POO) est un paradigme de programmation structuré autour du concept d’objets, qui sont des instances de classes. Chaque objet encapsule des données (appelées attributs ou membres) et des comportements (des méthodes), déclarés, respectivement implémentés, au sein de leur classe et permettant une modélisation plus proche des entités du monde réel. Les principes fondamentaux de la POO sont les suivants :

  • Encapsulation : regroupe données et méthodes dans des objets pour cacher les détails internes.

  • Héritage : permet à une classe d’hériter des caractéristiques d’une autre. On appelle alors cette nouvelle classe une sous-classe de la première.

  • Polymorphisme : offre une interface unique pour des actions différentes (méthodes surchargées).

  • Abstraction : simplifie la complexité en cachant les détails non essentiels.

La POO a émergé dans les années 1960 avec le langage Simula, considéré comme le premier langage à avoir introduit la notion d’objets. Ce concept a pris de l’importance avec Smalltalk dans les années 1970, qui a défini de nombreux aspects de la POO encore utilisés aujourd’hui. Ce n’est toutefois qu’avec l’arrivée de C++ dans les années 1980 que la POO a connu une adoption plus large dans le développement de logiciels commerciaux. Puis, des langages comme Java et Python ont rendu cette approche omniprésente.

Les avantages de la POO sont les suivants :

  • Réutilisabilité : grâce à l’héritage, les comportements communs des classes peuvent naturellement et facilement être réutilisés, réduisant ainsi la duplication de code.

  • Modularité : la POO facilite la maintenance et l’évolution des programmes grâce à la séparation des objets.

  • Flexibilité : le polymorphisme permet une grande flexibilité dans la manière dont les objets interagissent.

1. Un programme exemple en orienté objet

Pour illustrer les langages orientés objets, introduisons un nouvel exemple de programme que nous appellerons notre « exemple...

La conception orientée objet

La conception orientée objet (object oriented design) est une approche de conception logicielle qui organise le code en « objets », chacun représentant une entité ou un concept du monde réel, avec ses données (ou attributs) et ses comportements (ou méthodes). Popularisé dans les années 1990, ce paradigme permet de structurer les programmes de manière modulaire et réutilisable, en tirant parti de concepts clés comme l’encapsulation (cacher les détails internes d’un objet), l’héritage (partager des comportements entre objets liés) et le polymorphisme (adapter les comportements en fonction du contexte). Évoquons ci-dessous quelques courants en « conception orientée objet ».

1. Le modèle d’objets métier (BOM)

Le Modèle d’Objet Métier - ou Business Object Model, BOM - est une représentation des objets métier dans un système d’information, utilisée pour modéliser les concepts métier de l’entreprise sous forme d’entités, d’attributs et de relations. Cette approche a émergé dans les années 1990 pour traduire les processus métier en structures logicielles, facilitant ainsi la communication entre les équipes techniques et non techniques, mais aussi la capacité de déterminer l’adéquation du logiciel aux règles et concepts métier. La conception du BOM repose souvent sur des outils comme UML pour créer des diagrammes de classes et de relations et aligner les visions des architectes et des experts fonctionnels au préalable à l’implémentation.

La mise en place d’un BOM vise à améliorer l’agilité et la compréhension des systèmes complexes. Il est largement utilisé dans les systèmes ERP, CRM ou d’autres logiciels d’entreprise pour structurer les entités métier.

L’approche du BOM met l’accent sur la réutilisation, la modularité et la maintenabilité du code, tout en offrant une meilleure visibilité sur la façon dont les objets interagissent dans l’écosystème d’une entreprise. De plus, il soutient...

Les langages compilés et les langages interprétés

Les langages compilés et langages interprétés représentent deux approches fondamentalement différentes pour exécuter du code, se distinguant par la façon dont les programmes sont exécutés.

1. Les langages compilés

Un langage compilé, comme C ou C++, est traduit en « langage machine » par un compilateur avant d’être exécuté. Ce code binaire est directement exécutable par le microprocesseur, ce qui en fait un programme rapide et optimisé pour des performances maximales. Cette étape de compilation peut prendre du temps; mais une fois compilé, le programme est en général techniquement très efficace. Par exemple, un programme C qui doit calculer des millions de résultats sera plus performant qu’un programme interprété en Python effectuant exactement les mêmes opérations.

2. La compilation

La compilation est le processus par lequel un programme écrit dans un langage de haut niveau est traduit en un code exécutable par la machine. Ce processus est essentiel car les ordinateurs ne comprennent que le langage machine, composé de suites d’instructions binaires spécifiques à l’architecture du processeur.

Le compilateur nécessite plusieurs étapes pour convertir le code source en langage machine, parmi lesquelles :

  • Analyse lexicale : cette étape divise le code source en unités lexicales (ou tokens) telles que les mots-clés, les opérateurs, et les identificateurs.

  • Analyse syntaxique : le compilateur vérifie que les unités lexicales suivent la grammaire du langage de programmation en construisant un arbre syntaxique (ou arbre abstrait).

  • Analyse sémantique : cette étape vérifie que le code source respecte les règles...

La programmation fonctionnelle

La programmation fonctionnelle est un paradigme de programmation qui se concentre sur l’évaluation de fonctions (mathématiques, opérationnelle, etc.) pures et immuables. Contrairement à la programmation impérative, où l’on modifie l’état du programme via des variables et des boucles, la programmation fonctionnelle s’articule autour de fonctions qui, soumises aux mêmes entrées, produisent toujours les mêmes sorties sans modifier l’état global (les variables) du programme (immuabilité).

Ce paradigme repose sur des concepts clés tels que l’immuabilité, mais aussi l’absence d’effets de bord (puisque les fonctions ne modifient pas l’état externe ou global), les fonctions d’ordre supérieur et les lambdas (fonctions anonymes). Ces principes permettent d’écrire du code plus prévisible et facile à tester, car les interactions sont plus limitées et contrôlées.

Une « fonction d’ordre supérieur » manipule des fonctions comme des objets à part entière, soit en les acceptant comme arguments, soit en les retournant comme résultats. Cela permet d’encapsuler des comportements, d’améliorer la réutilisabilité du code et de faciliter des paradigmes comme la composition de fonctions. Une fonction générique peut, par exemple, être personnalisée pour implémenter un comportement particulier et cette version particulière peut ensuite être utilisée.

Un immuable est un objet qui ne peut pas être modifié après avoir été créé. Autrement dit, toute opération qui semble changer cet objet produit en réalité « une nouvelle version » de l’objet (réellement un nouvel objet), laissant l’original...

Le ramasse-miettes

L’allocation dynamique de mémoire est une composante essentielle de nombreux langages de programmation modernes. Elle permet aux programmes de réserver explicitement de la mémoire à la demande, pour leurs besoins en comportement dynamique, puis de la libérer, explicitement à nouveau, lorsque cette mémoire n’est plus nécessaire. Cependant, cette flexibilité introduit une série de défis pour les développeurs, et sans une gestion extrêmement rigoureuse, elle peut conduire à des problèmes critiques, en particulier dans les environnements où les ressources mémoire sont limitées. Le fonctionnement de l’allocation dynamique de mémoire est présenté dans le chapitre Fonctionnement d’un ordinateur, à la section L’allocation dynamique de mémoire.

1. Les défis de l’allocation dynamique de mémoire

Les principaux problèmes rencontrés avec l’allocation dynamique de mémoire sont les suivants :

  • Fuites de mémoire : une fuite de mémoire (memory leak) survient lorsqu’un programme ne libère pas de la mémoire qui n’est plus nécessaire. Au fil du temps, la mémoire utilisée par le programme peut s’accumuler sans être récupérée, ce qui réduit la quantité de mémoire disponible pour d’autres applications ou processus. Dans des systèmes où la mémoire est limitée et si les processus concernés ne sont pas régulièrement détruits et recréés, cela va provoquer une panne inéluctable.

  • Fragmentation de la mémoire : l’allocation dynamique de mémoire se fait généralement en bloc de tailles variables, ce qui, au fil du temps, peut fragmenter la mémoire. Des espaces de mémoire libre de petite taille se forment entre les blocs occupés, et bien que l’ensemble de ces espaces puisse être important, il devient difficile d’allouer de grands blocs continus de mémoire. Cela limite la capacité du programme à demander de grandes zones de mémoire malgré une mémoire totale suffisante, et mène finalement à une panne du processus....

L’écosystème Java

L’écosystème Java est l’un des plus vastes et influents dans le paysage informatique moderne. Créé en 1995 par James Gosling et son équipe chez Sun Microsystems, Java est devenu un langage central dans le développement d’applications d’entreprise, de logiciels mobiles, et même d’outils cloud. Java se distingue par son modèle de machine virtuelle (JVM), qui permet l’exécution du même code sur différentes plateformes avec son paradigme « écrire une fois, exécuter partout ».

L’écosystème Java bénéficie d’innombrables frameworks et bibliothèques robustes couvrant presque tous les besoins imaginables et qui facilitent le développement rapide et modulaire de logiciels. Parmi les frameworks les plus populaires se trouve Spring, qui est largement utilisé pour les applications d’entreprise, ainsi que des outils comme Hibernate utilisé pour mapper les bases de données relationnelles vers des objets, ou encore Maven ou Gradle pour la gestion des dépendances et la construction (build) de projets. Cet écosystème s’étend également aux solutions mobiles grâce à Android, qui repose largement sur Java, mais aussi et surtout aux systèmes distribués avec des plateformes comme Apache Kafka et Hadoop, elles aussi largement basées sur Java.

1. Le langage Java

Le langage Java est reconnu pour sa portabilité, sa stabilité, et sa robustesse. Il se distingue par son approche orientée objet très moderne, intégrant périodiquement, à chaque nouvelle version, les structurations et paradigmes les plus récents.

Le développement de java ciblait initialement les systèmes embarqués et les applications réseau, mais il s’est rapidement imposé comme un langage de référence dans le développement d’applications d’entreprise. Il a été largement adopté par la plupart des secteurs industriels, comme les secteurs bancaires et financiers, même gouvernementaux pour sa capacité à gérer des systèmes complexes, distribués, et transactionnels. Au fil du temps, Java a évolué...

La famille de technologies XML

La famille de technologies XML, dont l’émergence a posé les fondations de toute une école de structuration rigoureuse des données, a été le moteur de l’évolution d’Internet et de nombreuses technologies informatiques que nous utilisons aujourd’hui. Cependant, si le concept de DOM (voir ci-dessous) de la famille XML reste toujours énormément d’actualité dans les technologies web, le format XML lui-même a vu son intérêt diminuer au fil des années avec l’apparition de formats de données structurées beaucoup moins verbeux et plus légers, comme JSON, YAML, etc. Le XML reste toutefois d’actualité dans toute une gamme d’usages, comme la structuration de texte, la génération de documents, etc. Il demeure donc pertinent de s’y intéresser à plus d’un titre.

1. Introduction à XML

XML (eXtensible Markup Language) est un langage de balisage conçu pour stocker et transporter des données de manière structurée, indépendamment des plateformes et applications. Publié par le W3C (World Wide Web Consortium) en 1998, il se positionne comme un successeur simplifié de SGML (Standard Generalized Markup Language) pour la gestion de documents structurés. Issu des besoins de l’édition électronique dans les années 1980, SGML était un langage de balisage extrêmement puissant mais complexe et difficile à implémenter, ce qui a progressivement conduit à son déclin au profit de XML.

Le XML est :

  • extensible, il permet de définir des balises propres au cas d’usage ;

  • lisible par l’homme et la machine ;

  • indépendant du format et des plateformes. Les données XML peuvent être interprétées dans divers environnements.

Voyons un exemple de document XML simple :

<livres> 
   <livre> 
       <titre>Introduction à XML</titre> 
       <auteur>Jean Dupont</auteur> 
       <année>2024</année> 
   </livre> 
   <livre> 
       <titre> ...

L’écosystème JavaScript

L’écosystème JavaScript est l’un des plus dynamiques et influents dans le développement web moderne. JavaScript est devenu un langage prépondérant pour la création d’applications aussi bien côté client, au sein des navigateurs web, que côté serveur, grâce à des environnements d’exécution comme Node.js.

L’écosystème JavaScript est soutenu par un grand nombre de frameworks et de bibliothèques. Parmi les plus populaires, on trouve React, Angular et Vue.js pour le développement d’interfaces utilisateur riches côté client, ainsi que Express.js pour le développement d’applications web côté serveur. Grâce à sa popularité croissante et à sa grande communauté de développeurs, JavaScript a également trouvé sa place dans des applications mobiles avec React Native et des environnements d’exécution multiplateformes comme Electron, qui permet de créer des applications de bureau.

1. JavaScript

JavaScript est un langage de programmation créé en 1995 par Brendan Eich pour rendre les pages web interactives. Initialement conçu comme un simple outil pour les scripts côté client au sein des navigateurs, il est devenu l’un des langages les plus importants de l’informatique moderne. JavaScript fonctionne de manière interprétée, ce qui signifie qu’il est exécuté directement par le navigateur (ou un environnement côté serveur) sans compilation préalable. Sa spécificité principale réside dans sa nature multiparadigme, permettant d’écrire du code dans un style orienté objet, impératif, ou fonctionnel.

Un des avantages de JavaScript est sa portabilité. Présent nativement dans tous les navigateurs, il est devenu un standard du Web. Son introduction du côté...

Python et la data science

Python est un langage de programmation généraliste et interprété, conçu en 1991 par Guido van Rossum pour être à la fois simple et puissant. Sa syntaxe claire, qui ressemble au langage naturel, en fait l’un des langages les plus faciles à apprendre et à utiliser pour les débutants. Python est cependant également un langage extrêmement polyvalent, capable de prendre en charge plusieurs paradigmes de programmation comme la programmation impérative, orientée objet et fonctionnelle.

L’essor de Python en tant que langage de prédilection pour les data scientists est dû à plusieurs facteurs. La data science est une discipline qui consiste à extraire des connaissances et des insights à partir de données brutes en utilisant diverses techniques, notamment l’analyse statistique, la visualisation des données, et l’apprentissage machine (machine learning). Les data scientists travaillent avec de grands ensembles de données pour résoudre des problèmes complexes dans des domaines comme la finance, le marketing, les soins de santé et la technologie. Python s’est imposé comme un choix idéal pour cette discipline en raison de ses nombreux bibliothèques et frameworks spécifiques à l’analyse des données et à l’apprentissage...

Les techniques de programmation avancées

Les techniques de programmation avancées englobent des approches spécifiques pour optimiser les performances, la fiabilité et la précision dans des environnements exigeants. Les paradigmes de programmation parallèle, distribuée ou encore temps réel répondent à des besoins distincts - de l’accélération des calculs massifs jusqu’à la coordination de systèmes multiples et la gestion de contraintes temporelles strictes. Ensemble, ces techniques permettent de concevoir des systèmes modernes capables de gérer des charges de travail complexes avec des contraintes précises.

1. La programmation concurrente ou parallèle

Le calcul parallèle consiste à diviser une tâche en sous-tâches exécutées simultanément sur plusieurs processeurs ou machines pour accélérer le traitement global et traiter des problèmes complexes efficacement. Il repose sur plusieurs paradigmes tels que le parallélisme de données (exécution de la même opération sur de nombreuses données) et le parallélisme de tâches (division en tâches indépendantes).

Les modèles de programmation comprennent la « mémoire partagée » (les threads partagent la même mémoire, nécessitant...

Les langages récents

Les langages de programmation récents comme Rust, Go, Kotlin et Swift ont émergé pour répondre à des besoins spécifiques en matière de performance, de sécurité, et de simplicité.

Rust, développé par Mozilla, se distingue par sa gestion fine et précise de la mémoire et la prévention des erreurs courantes comme les fuites et les corruptions de pointeurs. Son approche de sécurisation de la mémoire sans ramasse-miettes et son système de propriété en font un choix idéal pour les systèmes critiques et embarqués.

Go (Golang), conçu chez Google, se concentre sur la simplicité, la concurrence et l’efficacité. Il est largement utilisé dans les applications réseau, le cloud computing, et les architectures distribuées. Go est apprécié pour sa capacité à gérer facilement des centaines de milliers de connexions simultanées grâce à son système de goroutines, qui facilite la création de programmes concurrents.

Kotlin, introduit par JetBrains, est un langage multiparadigme qui a été conçu pour être entièrement interopérable avec Java. Il est devenu aujourd’hui le langage officiel pour le développement d’applications Android, apportant...

Des langages spécifiques

En sus des langages de programmation généraux couverts jusqu’ici, il existe certains langages spécifiques conçus pour répondre à des besoins particuliers dans des contextes spécialisés. Contrairement aux langages de programmation généraux comme Python ou Java, ces langages ciblent des domaines d’application spécifiques.

SQL est un langage utilisé pour s’interfacer avec les bases de données relationnelles (SGBDR). Il permet de manipuler les données (sélectionner, insérer, modifier, supprimer) et de gérer les structures de base comme les tables. Il est essentiel dans le traitement des données à grande échelle. Nous avons déjà évoqué SQL dans le chapitre précédent, à la section Du mainframe aux applications web.

R est spécialisé dans l’analyse statistique et la manipulation de données complexes, très prisé par les statisticiens et data scientists pour son efficacité dans la modélisation statistique et la visualisation des données.

Les Shell scripts permettent d’automatiser des tâches sur les systèmes Unix/Linux. Ils enchaînent des commandes pour faciliter la gestion des fichiers, la configuration de systèmes ou le déploiement d’applications...

Les méthodologies de développement logiciel

Les méthodologies de développement logiciel ont profondément évolué depuis l’époque du classique « The Mythical Man-Month » de Fred Brooks, publié en 1975, qui mettait en lumière les défis et les illusions qui couraient à l’époque concernant les grands projets logiciels. À partir de ces constats initiaux, de nouvelles approches ont progressivement émergé, menant à l’explosion des méthodes agiles dans les années 2000, méthodes qui privilégient la flexibilité, l’adaptabilité et la collaboration en réponse aux besoins changeants et aux rythmes accélérés des projets modernes.

1. L’aube d’une évolution

Nous avons évoqué le développement d’OS/360 par IBM dans le chapitre Des usages militaires à l’ère digitale, à la section Les mainframes, et particulièrement le fait que ce développement, le plus ambitieux jamais intenté à l’époque, a été jalonné de difficultés. Nous sommes ensuite sommairement revenus sur OS/360 dans le chapitre Les systèmes d’exploitation, à la section Les premiers systèmes d’exploitation, et mentionné les nombreuses innovations portées par les ambitions d’IBM pour ce système. Il est temps de revenir une dernière fois sur le développement d’OS/360 et de Fred P. Brooks pour évoquer cette fois-ci son ouvrage « The Mythical Man Month » (1975) qui est à l’origine d’une profonde transformation des méthodologies de développement logiciel.

Fred Brooks a posé dans cet ouvrage des observations qui ont profondément influencé le développement des méthodologies logicielles modernes. Brooks, qui a dirigé le développement du système OS/360 d’IBM, y expose l’idée que « ajouter plus de programmeurs à un projet en retard ne fait qu’augmenter les retards », en raison de la complexité croissante des communications et des interactions (les « sachants » se retrouvant à...