Fondamentaux du génie logiciel

9.1 Fondamentaux du génie logiciel

Objectifs d'apprentissage

À la fin de cette section, vous serez en mesure de :

  • Décrire l'objectif du génie logiciel et son lien avec l'informatique
  • Reconnaître les différentes catégories de logiciels
  • Identifier les compétences requises pour un ingénieur logiciel

Cette section présente le génie logiciel ainsi que les défis liés à la création et à l'évolution des logiciels. Les diverses facettes fondamentales du génie logiciel sont présentées, y compris les compétences requises pour concevoir correctement des logiciels et le rôle qu'un ingénieur logiciel est censé jouer au sein d'une équipe logicielle.

L'objectif du génie logiciel

L'IEEE1 définit le génie logiciel comme l'application d'une approche systématique, disciplinée et quantifiable au développement, à l'exploitation et à la maintenance (maintenance) des logiciels ; c'est-à-dire l'application de l'ingénierie aux logiciels. Il est important de comprendre comment le génie logiciel s'inscrit dans le contexte plus large de l'informatique. Il est également important de comprendre le rôle d'un ingénieur logiciel et comment il s'intègre au sein d'une organisation.

La référence à « une approche systématique, disciplinée et quantifiable » ne signifie pas une approche bureaucratique et lourde en documents. Le génie logiciel s'appuie sur diverses méthodologies/processus, méthodes et outils qui peuvent être utilisés pour développer et maintenir professionnellement des logiciels de qualité tout en optimisant l'utilisation des ressources telles que le temps et le coût. Choisir les bons processus et méthodes pour un projet et utiliser des outils pour accélérer le développement continu d'une solution est un défi, surtout lorsque les exigences changent et que de nombreux développeurs de logiciels travaillent ensemble pour s'attaquer à un grand projet. Une partie du problème est que le génie logiciel en tant que processus ne peut pas (en général) être entièrement automatisé et il est donc difficile de maintenir toutes les activités alignées sur l'objectif final de livrer une solution à temps et dans les limites du budget.

La sélection et l'adaptation des processus et méthodes de génie logiciel, ainsi que l'utilisation des bons outils de la bonne manière pour atteindre cet objectif final, qui définit en substance la majeure partie du travail d'un ingénieur logiciel, sont abordées en détail dans ce chapitre.

Concepts en pratique

Les logiciels et notre quotidien

Le logiciel est partout, et la plupart d'entre nous interagissent quotidiennement avec un système logiciel. Pourtant, l'importance du logiciel devrait encore croître au cours des prochaines décennies. Bien que la plupart des revenus logiciels proviennent de logiciels génériques, des systèmes logiciels adaptés à des besoins spécifiques peuvent être trouvés partout, de nos voitures à nos montres intelligentes. Ainsi, un bon nombre d'entre nous peuvent s'attendre à être impliqués en tant que clients dans un processus de génie logiciel au cours de leur vie professionnelle. Les personnes familières avec les concepts du génie logiciel peuvent mieux superviser les projets sur lesquels elles travaillent en interagissant avec les clients afin que leurs besoins soient clairement spécifiés et en travaillant avec les développeurs pour fluidifier le processus de développement et garantir que le produit final répond aux attentes des clients.

Équipes de génie logiciel

Dans la plupart des organisations, le logiciel est développé par une équipe d'ingénieurs logiciels, ainsi que par d'autres personnes ayant des parcours et des compétences différents. Pour être efficace, l'équipe de projet doit être organisée de manière à maximiser l'utilisation des compétences et des capacités de chaque personne et à souligner l'importance du travail d'équipe pour aborder tous les aspects des projets. Cela est particulièrement vrai pour les projets complexes. Les chefs de projet efficaces se concentrent sur la résolution de problèmes et la qualité du produit final, et peuvent ainsi organiser les équipes logicielles de diverses manières. Les facteurs clés pris en compte lors de la sélection d'un modèle d'organisation d'équipe sont les suivants :

  • difficulté du problème à résoudre
  • degré de modularisation du problème
  • qualité, fiabilité et autres exigences non fonctionnelles requises du système à construire
  • date de livraison
  • limites budgétaires
  • durée de vie de l'équipe (c'est-à-dire la période globale pendant laquelle les membres de l'équipe travailleront ensemble)

Lors de la création d'une solution logicielle, les membres de l'équipe d'ingénieurs logiciels peuvent assumer divers rôles, tels que :

  • chef de projet (project manager), qui est responsable de s'assurer que le projet est achevé à temps et dans les limites du budget
  • architecte de portefeuille d'entreprise ou de solution (enterprise or solution portfolio architect), qui prend des décisions de conception de haut niveau sur les blocs de construction de modélisation ou de conception de solution de haut niveau et leurs interconnexions pour répondre au mieux aux exigences fonctionnelles ainsi qu'aux exigences non fonctionnelles telles que la performance et l'utilisabilité
  • concepteur d'expérience utilisateur (UX) (user experience (UX) designer), qui planifie la manière dont les utilisateurs interagiront avec le système logiciel ; cela implique des tâches telles que la conception de l'interface utilisateur (UI), la création de maquettes fonctionnelles et de prototypes, et la réalisation de tests utilisateurs pour s'assurer que le logiciel est convivial et répond aux besoins des utilisateurs
  • développeur de logiciels (software developer), qui analyse les exigences, affine la conception, écrit et teste le code, et collabore avec l'équipe des opérations pour déployer le logiciel dans les environnements de test et de production
  • testeur d'assurance qualité (quality assurance tester), qui recherche les bogues (bug) et valide que le système répond aux exigences

Il est courant qu'un membre de l'équipe assume plusieurs rôles (par exemple, un architecte de solution peut également être un développeur de logiciels), et certains rôles peuvent être occupés par plusieurs membres de l'équipe (par exemple, il y a généralement plusieurs développeurs de logiciels sur un projet). De plus, un ingénieur logiciel peut travailler directement avec d'autres personnes, notamment :

  • propriétaires de produit (product owners), qui sont généralement les parrains du projet et fournissent les exigences et les orientations générales sur ce qui est attendu de la solution
  • experts du domaine (ED) (subject matter experts (SMEs)), qui sont des spécialistes dans des domaines tels que les affaires, la technologie, les produits ou d'autres sujets selon les besoins
  • administrateurs de bases de données (database administrators), qui se concentrent sur des domaines tels que le stockage, l'organisation et l'accès aux données associés à une solution logicielle
  • spécialistes des opérations (operations specialists), qui sont des professionnels de l'IT et/ou du DevOps axés sur les opérations matérielles et logicielles informatiques

Étant donné que les projets peuvent impliquer un grand nombre de personnes travaillant dans de nombreux rôles différents, la communication et l'interaction entre les membres de l'équipe sont essentielles à la réussite d'un projet. Pour que l'équipe fonctionne sans heurts, les projets sont idéalement structurés de manière à inclure les éléments suivants :

  • des délais qui accordent suffisamment de temps aux membres de l'équipe pour accomplir pleinement leurs tâches et garantir des résultats conformes aux exigences
  • des normes sur la manière dont les décisions commerciales et technologiques sont prises pour éviter les désaccords liés aux affaires ou à la technologie
  • des processus et des procédures qui facilitent la coordination des activités des membres de l'équipe
  • des définitions claires du rôle et de l'autorité de chaque membre de l'équipe afin que chacun sache qui est responsable de chaque tâche et à qui les questions doivent être adressées

Gestion des coûts

Une partie importante du rôle d'un ingénieur logiciel est de gérer le triangle de la gestion de projet : délais, qualité et coût. L'objectif est de livrer les projets le plus rapidement possible avec la plus haute qualité et le coût le plus bas. Cela nécessite une bonne communication, une planification et une concentration, ainsi que la fixation d'attentes réalistes. De plus, comme le coût de maintenance d'une solution logicielle au fil du temps peut être significatif, diverses stratégies de gestion des coûts doivent être utilisées pour gérer efficacement les coûts. Ces stratégies incluent l'utilisation de techniques d'estimation, l'allocation des ressources et des outils de suivi des coûts. Les techniques d'estimation aident à créer des estimations précises de la portée et de l'effort du projet, ainsi que des coûts, ce qui facilite la budgétisation et l'allocation des ressources. L'allocation des ressources implique d'affecter les bonnes personnes (c'est-à-dire celles qui possèdent les compétences nécessaires) pour accomplir chaque tâche, ce qui contribue à optimiser l'efficacité et les coûts. Les outils de suivi des coûts aident à suivre les coûts du projet et à identifier les domaines d'économies potentielles.

L'évolution continue de la technologie informatique, telle que le Web, le mobile et l'informatique en nuage, a eu un impact significatif sur la manière dont le génie logiciel moderne est pratiqué. Néanmoins, il est encore courant de rencontrer des difficultés lors de la conception et du développement de logiciels de haute qualité, livrés à temps et dans les limites du budget. Les principales raisons en sont les suivantes :

  • Les systèmes logiciels sont les types de systèmes les plus complexes que les humains créent.
  • Le rythme de changement de la technologie informatique et logicielle est élevé. Les techniques de programmation et les processus connexes qui fonctionnent bien lorsqu'ils sont utilisés individuellement ou au sein d'une petite équipe échouent lorsqu'ils sont appliqués au sein d'une grande équipe développant un système complexe de grande envergure.
  • Il n'y a pas suffisamment d'ingénieurs logiciels qualifiés, et les systèmes logiciels sont donc conçus et développés par des personnes ayant des antécédents ou une expérience insuffisants.

Génie logiciel et informatique

Où se situe le génie logiciel au sein de l'informatique ? Le génie logiciel et l'informatique traitent tous deux de la création de logiciels, et bien qu'il semble y avoir un chevauchement entre ces deux disciplines, le génie logiciel a tendance à se concentrer sur les applications logicielles, plus spécifiquement sur la conception et le développement de solutions logicielles. Cela fait du génie logiciel une branche ou un sous-domaine de l'informatique.

L'informatique se concentre sur l'étude des algorithmes et leur réalisation en termes d'ordinateurs, de systèmes informatiques et de processus de calcul connexes. Elle se concentre fortement sur les principes théoriques et mathématiques impliqués dans la création d'algorithmes et de structures de données. Bien que l'informatique inclue le génie logiciel, elle couvre également une variété d'autres disciplines. En comparaison, le génie logiciel se concentre spécifiquement sur l'application des principes d'ingénierie pour comprendre, concevoir, construire et déployer des logiciels de production. Il commence par l'élicitation et l'analyse des exigences et aboutit à la fourniture d'une solution logicielle pratique qui répond à ces exigences. L'informatique va au-delà de la simple création de solutions logicielles et inclut la conception logicielle (software design) et le développement. Bien que les ingénieurs logiciels doivent avoir une solide connaissance de l'informatique fondamentale (par exemple, les bases des algorithmes et des structures de données), ils ne sont pas censés présenter le même niveau de connaissances théoriques qu'un informaticien. Par exemple, alors qu'un informaticien devrait être capable d'établir la complexité temporelle asymptotique des algorithmes qu'il choisit, un ingénieur logiciel n'en aurait pas besoin.

Le génie logiciel s'écarte de l'orientation générale de l'informatique et est complémentaire des manières suivantes :

  • Le génie logiciel a tendance à se concentrer sur l'application de la technologie pour créer des solutions, tandis que l'informatique a tendance à se concentrer beaucoup plus sur la compréhension de la technologie elle-même.
  • Le génie logiciel a tendance à se concentrer sur les logiciels. L'informatique peut se concentrer sur les logiciels, le matériel et l'interaction entre les deux.
  • Un ingénieur logiciel a tendance à se concentrer sur le développement de solutions qui répondent aux exigences d'une organisation ou d'un projet. Un informaticien a tendance à se concentrer sur les processus de calcul sous-jacents requis pour créer des solutions de la manière la plus optimale ou la plus efficace.

L'essence de la pratique du génie logiciel est basée sur les travaux de nombreux chercheurs tels que le mathématicien George Pólya. L'heuristique de Pólya pour la résolution généralisée de problèmes comprend les étapes suivantes :

  1. Comprendre le problème.
  2. Élaborer un plan.
  3. Exécuter le plan.
  4. Revoir et examiner la solution.

La nature et l'impact des logiciels

Le logiciel est devenu une partie essentielle de nos vies. Il a révolutionné la façon dont nous communiquons, travaillons, apprenons et nous divertissons. Des smartphones dans nos poches aux systèmes complexes qui alimentent les hôpitaux et les réseaux de transport, le logiciel est partout.

Étant donné que l'objectif du génie logiciel est de construire des logiciels, il est important de comprendre ce qu'est un logiciel. Un logiciel (software) est composé d'instructions qui peuvent être exécutées et inclut généralement une documentation qui décrit le fonctionnement et l'utilisation du logiciel. Ces instructions indiquent aux ordinateurs ce qu'ils doivent faire. Elles fonctionnent comme une recette qui dit à un chef comment préparer un repas. Le logiciel est conçu pour atteindre un objectif ou un but spécifique. Un logiciel de traitement de texte a pour objectif ou but d'aider les gens à créer des documents. Un jeu a pour objectif ou but de fournir du divertissement. Le logiciel intégré à une automobile a de nombreux objectifs, notamment aider un conducteur à conduire la voiture, aider le propriétaire à entretenir la voiture et aider un conducteur et/ou des passagers à éviter de se perdre.

Le logiciel est généralement créé sur la base d'un ensemble d'exigences, et bien que le logiciel ne s'use pas, ces exigences changent souvent avec le temps. Le logiciel doit donc être mis à jour fréquemment pour répondre à ces changements. De plus, le logiciel peut contenir des défauts (c'est-à-dire des bogues (bug)), qui sont censés être corrigés dans un délai raisonnable après leur signalement.

Au fil des ans, les chercheurs et les praticiens du génie logiciel se sont accordés sur la définition d'un modèle de processus de génie logiciel générique, ou cadre de processus, qui peut être utilisé comme modèle pour caractériser les activités génériques réalisées par tous les modèles de processus de génie logiciel utilisés pour soutenir le cycle de vie du développement logiciel (SDLC) (software development life cycle (SDLC)). Le SDLC est un ensemble structuré d'activités de cadre requises pour développer une solution logicielle basée sur un ensemble d'exigences. Un cadre de processus englobe généralement quatre activités de cadre (ou génériques) : l'initialisation, l'élaboration, la construction et le déploiement (deployment). Ces activités sont également connues sous le nom de phases.

Vous en apprendrez davantage sur chacune de ces phases plus tard dans le chapitre. En attendant, il convient de noter que la phase de déploiement couvre l'intégration et les tests d'acceptation (acceptance testing) utilisateur, l'installation et les activités de maintenance/support. Cela signifie que la maintenance fait partie intégrante du processus de génie logiciel. En fait, le coût de la maintenance logicielle/du déploiement continu dépasse souvent aujourd'hui le coût de la construction logicielle, surtout si le logiciel reste utilisé pendant longtemps.

Catégories de logiciels

Il existe trois grandes catégories de logiciels. Le logiciel qui vous permet de contrôler le matériel et fournit un environnement dans lequel d'autres logiciels peuvent s'exécuter est appelé logiciel système (system software). Un exemple est un système d'exploitation (operating system), tel que Microsoft Windows, Android et MacOS, qui fonctionne sur un ordinateur portable ou un téléphone mobile et contrôle et fournit généralement l'accès aux fonctionnalités de base de l'ordinateur. Ce logiciel système comprend également le logiciel pilote, qui est le code utilisé par les périphériques matériels pour interagir avec le système d'exploitation.

Le logiciel qui vous permet d'accomplir des tâches courantes, telles que la création d'un document texte, le dessin d'une image ou la lecture de musique, est appelé logiciel d'application (application software). Les exemples incluent Microsoft Word et Paint, MacOS Pages et iOS Files. Le logiciel d'application peut inclure des catégories spécialisées de logiciels tels que les logiciels scientifiques (ou d'ingénierie), qui sont des logiciels qui vous aident à résoudre des problèmes mathématiques, scientifiques et d'ingénierie, comme la recherche des racines d'une équation. Il peut également inclure des services logiciels, qui sont des programmes logiciels qui fournissent des réponses ou des actions spécifiques basées sur une requête, comme le renvoi de cotations boursières, l'obtention des conditions météorologiques ou la recherche des emplois disponibles.

Le logiciel intégré au matériel et pouvant inclure des fonctionnalités de logiciel d'application et de logiciel système est appelé logiciel embarqué (embedded software). Les exemples incluent le logiciel d'une montre intelligente, d'un système de contrôle automobile ou d'un four à micro-ondes. L'interaction avec le logiciel embarqué est généralement limitée, et les utilisateurs ignorent souvent qu'ils interagissent avec un logiciel. Avec la popularité croissante de l'internet des objets (IoT), le développement de logiciels embarqués est en augmentation.

Les ingénieurs logiciels doivent souvent faire face à des logiciels hérités (legacy software) qui ont été écrits par le passé, s'appuient sur des technologies obsolètes et sont toujours utilisés aujourd'hui. Ce logiciel présente des défis particuliers à ceux qui le maintiennent, surtout lorsqu'ils doivent l'adapter à un nouvel environnement informatique ou à une nouvelle technologie et lorsqu'ils doivent étendre ses fonctionnalités afin qu'il soit interopérable avec de nouveaux systèmes logiciels. Le besoin de maintenance logicielle des logiciels hérités découle des changements rapides qui ont eu lieu dans le matériel. Par exemple, un smartphone courant contient un processeur plus puissant et plus de mémoire que les ordinateurs utilisés il y a seulement vingt ans. Les changements matériels s'accompagnent de changements dans les technologies logicielles, et ceux-ci sont rapidement adoptés par les utilisateurs qui sont alors réticents à utiliser les logiciels hérités dans leur forme originale. Par exemple, l'interface utilisateur graphique d'un système logiciel développé il y a vingt ans semble maintenant obsolète et conduit à une expérience utilisateur désagréable.

Il y a également eu des changements spectaculaires dans la technologie des processeurs. Il y a vingt ans, la plupart des processeurs se composaient d'un seul cœur, alors qu'il est maintenant courant qu'un processeur ait plusieurs cœurs et coprocesseurs. Cela nécessite des changements dans la façon dont le logiciel est programmé, car un logiciel capable d'utiliser plusieurs cœurs de processeur a un avantage concurrentiel par rapport à un logiciel qui n'utilise qu'un seul cœur. Pour prendre en charge ces nouvelles capacités, les principaux langages de programmation ont évolué vers le support du multithreading, ce qui rend la maintenance d'une base de code héritée encore plus difficile.

Concepts en pratique

Le monde en constante évolution des plateformes logicielles

Imaginez la vie d'un ingénieur logiciel développant des programmes dans les années 1980, ce qui nécessitait de taper des programmes sur un terminal et d'imprimer des cartes perforées qui étaient introduites dans un ordinateur central ! Le monde du développement logiciel est en constante évolution, et les plateformes sur lesquelles les logiciels s'exécutent changent également rapidement. Les ingénieurs logiciels doivent se tenir au courant des plateformes actuelles et aussi être conscients de ce qui va arriver.

Un voyage dans le temps

Pouvez-vous imaginer utiliser un ordinateur sans souris ou sans interface graphique ? Jetons un coup d'œil à la façon dont les plateformes logicielles ont évolué au fil du temps :

  • Les débuts (années 1980) : Les ordinateurs centraux et les mini-ordinateurs étaient gigantesques, occupant même des pièces entières, et les logiciels étaient souvent exécutés à partir de la ligne de commande.
  • L'essor du bureau (années 1990) : Bienvenue à l'ère de Windows et Mac ! Les interfaces graphiques ont rendu les ordinateurs plus conviviaux, et les systèmes client-serveur ont permis aux applications de s'exécuter sur plusieurs machines.
  • Le Web prend le dessus (années 2000) : L'Internet a explosé, et Java et C# sont devenus des langages populaires pour la création d'applications web.
  • La folie du mobile (années 2010) : Les smartphones comme l'iPhone ont changé la donne. Le développement logiciel s'est concentré sur les applications mobiles qui tiraient parti de la connectivité constante.

L'avenir est inconnu mais passionnant

La réalité augmentée et virtuelle (RA/RV), l'apprentissage automatique (ML), l'intelligence artificielle (IA), l'internet des objets (IoT) et la chaîne de blocs sont quelques-unes des technologies émergentes qui façonnent l'avenir des plateformes logicielles du métavers. Qui sait quelles nouvelles plateformes passionnantes nous attendent ? Les ingénieurs logiciels curieux et adaptables seront les mieux placés pour prospérer dans ce paysage en constante évolution.

Exigences logicielles

Le logiciel est développé sur la base d'exigences, qui sont classées comme fonctionnelles et non fonctionnelles, comme le montre la Figure 9.2. Les exigences fonctionnelles énoncent ce que le logiciel doit faire en termes de fonctionnalités tangibles, telles que la fonctionnalité de connexion ou d'enregistrement qui permet aux utilisateurs d'accéder à un logiciel donné, comme leur compte Facebook. Les exigences non fonctionnelles sont des qualités mesurables d'un logiciel, telles que l'utilisabilité, la performance et d'autres aspects de qualité.

Diagramme hiérarchique des exigences logicielles fonctionnelles et non fonctionnelles.
Figure 9.2 Les différents types d'exigences logicielles peuvent être organisés en hiérarchies comme exigences fonctionnelles et non fonctionnelles, basées sur des aspects liés à ce que le logiciel fait ainsi qu'aux qualités du logiciel. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

Comme indiqué précédemment, une exigence fonctionnelle (functional requirement) se rapporte aux services que le système fournit aux utilisateurs. Elle reflète l'attente de l'utilisateur concernant les caractéristiques inhérentes du logiciel (c'est-à-dire les fonctions qu'il doit exécuter). Les exigences fonctionnelles peuvent inclure les phénomènes généralement observés ou réalisés lors de l'utilisation d'une solution logicielle, tels que les informations saisies ou générées par le logiciel, les règles d'authentification pour l'utilisation du logiciel, ou la présence d'une alerte sonore (comme un bip) lorsqu'une action est sélectionnée. Une exigence non fonctionnelle (nonfunctional requirement) décrit une qualité ou une caractéristique souhaitée (c'est-à-dire une contrainte) et couvre des aspects du logiciel tels que la flexibilité, la maintenabilité, la performance, la portabilité, la fiabilité, l'extensibilité, la sécurité, et plus encore. Par exemple, une exigence non fonctionnelle pourrait spécifier que les réponses du logiciel doivent se produire dans un délai précis, ou qu'un système logiciel doit être capable de gérer un certain nombre de transactions à un moment donné. Un autre exemple de contrainte qu'une exigence non fonctionnelle peut exprimer est la nécessité d'utiliser un langage de programmation spécifique ou de suivre une norme particulière.

Les caractéristiques non fonctionnelles sont parfois catégorisées en termes de qualités statiques ou dynamiques. Une qualité statique (static quality) est une caractéristique non fonctionnelle qui est immuable et peut donc être associée, par exemple, au code source et à la documentation connexe, ou à des exigences légales ou spécifiques à l'environnement du projet. Une qualité dynamique (dynamic quality) est une caractéristique non fonctionnelle qui se rapporte au comportement qualitatif du logiciel lorsqu'il est utilisé, ce qui signifie qu'elle dépend également du matériel sur lequel le système s'exécute. Les deux types de qualités sont des caractéristiques mesurables plutôt que des fonctions présentes ou absentes. Des exemples de qualités statiques incluent :

  • maintenabilité (maintainability), qui est une mesure de la quantité de travail requise pour corriger les bogues, améliorer les performances et maintenir le système en fonctionnement
  • extensibilité (extensibility), qui est une mesure de la quantité de travail et du coût d'ajout de nouvelles fonctionnalités à un logiciel
  • flexibilité (flexibility), qui est une mesure de la difficulté de mettre à jour le système pour répondre aux exigences changeantes
  • portabilité (portability), qui est une mesure de la quantité de travail et du coût de la migration des solutions logicielles
  • utilisabilité (usability), qui est une mesure de l'intuitivité de l'interface utilisateur

Des exemples de qualités dynamiques sont :

  • performance (performance), qui est une mesure de la rapidité avec laquelle le système répond aux requêtes qu'il reçoit
  • débit (throughput), qui est une mesure de la quantité d'entrée que le système peut traiter dans un laps de temps donné
  • disponibilité (availability), qui est une mesure de la fréquence à laquelle le système sera prêt et actif pour les utilisateurs
  • extensibilité (scalability), qui est la mesure du travail et du coût pour augmenter le débit d'un système
  • sécurité (security), qui est une mesure de la confiance que les données sont protégées contre la divulgation non autorisée et que les systèmes sont protégés contre l'accès non autorisé

L'importance relative des caractéristiques précédentes dépend des exigences de la solution et de l'environnement dans lequel elles doivent être utilisées. Par exemple, dans une application bancaire en ligne, la disponibilité et l'utilisabilité sont généralement des caractéristiques clés annoncées aux clients. La sécurité serait également importante, car la solution logicielle devrait se conformer aux exigences réglementaires. Dans un système de courtage, la performance serait une exigence importante parce que le système logiciel devra afficher les prix et traiter les ordres des utilisateurs en temps réel.

Réfléchissez-y

Responsabilité professionnelle en génie logiciel

Compte tenu de la responsabilité professionnelle des ingénieurs logiciels travaillant sur divers projets à travers le monde, qu'est-ce qui est juste ou faux, selon vous, concernant les questions suivantes dans un contexte de génie logiciel : développer des systèmes pour l'armée (par exemple, créer un drone militaire autonome) ; ajouter une porte dérobée à un système existant (par exemple, fournir aux autorités un moyen de déverrouiller un téléphone mobile verrouillé) ; ou modéliser les besoins en médicaments des patients (par exemple, prescrire des analgésiques à chaque patient hospitalisé en fonction des données historiques).

Dans chacun de ces cas, le développement du système pourrait apporter de réels avantages. Par exemple, un drone autonome permet à l'armée d'agir sans mettre la vie de ses soldats en danger, et une porte dérobée garantit que les forces de l'ordre peuvent accéder aux informations dont elles pourraient avoir besoin pour résoudre un crime. Mais il y a aussi des inconvénients à chacun de ces systèmes. La porte dérobée met en péril la confidentialité de chacun, car n'importe qui pourrait l'utiliser pour accéder à des données privées sur un téléphone, et se fier aux données de médicaments passées risque d'institutionnaliser les biais existants concernant qui a besoin de plus (ou moins) d'analgésiques. Il est important pour les ingénieurs logiciels de considérer tous les impacts qu'un système aura et de déterminer si ces impacts sont acceptables ou non.

Compétences de l'ingénieur logiciel

Comme mentionné précédemment, un ingénieur logiciel est impliqué dans la création de logiciels. Les ingénieurs logiciels travaillent avec d'autres et font partie d'une équipe. Ils doivent être capables de comprendre et d'agir sur un large éventail d'exigences. Pour accomplir ce qui est requis, un ingénieur logiciel performant doit posséder de solides compétences en analyse et en résolution de problèmes, doit bien communiquer avec ses pairs, doit être un joueur d'équipe, doit assumer la responsabilité de ses engagements, doit faire preuve d'attention aux détails et doit être pragmatique lorsqu'il adapte les pratiques de génie logiciel en fonction des circonstances. De plus, les ingénieurs logiciels doivent être flexibles en ce qui concerne l'adoption de nouvelles technologies. Par conséquent, en termes de compétences techniques, les ingénieurs logiciels doivent avoir une base solide dans les domaines suivants :

  • Résolution de problèmes et algorithmes : Les ingénieurs logiciels sont comme des détectives qui résolvent des énigmes. Ils utilisent des algorithmes, qui sont des instructions étape par étape, pour résoudre efficacement les problèmes. Comprendre les différents algorithmes leur permet de choisir la meilleure approche pour une tâche spécifique. Il existe de nombreux algorithmes qui peuvent être considérés comme essentiels, et il peut être difficile de tous les apprendre. Comprendre l'importance des algorithmes et être prêt à apprendre de nouvelles choses est une compétence requise pour les ingénieurs logiciels.
  • Structures de données : Imaginez une boîte à outils bien organisée où chaque outil a sa place désignée. Les structures de données sont comme ces boîtes à outils, mais pour les données ! Connaître différentes structures de données (telles que les tableaux, les listes, les arbres, les piles et les files d'attente) et être capable d'évaluer leurs avantages et leurs inconvénients aide les ingénieurs logiciels à organiser efficacement les informations pour leurs programmes. La connaissance des structures de données fondamentales est essentielle car sans structures de données efficaces, vous ne pouvez pas écrire de code efficace.
  • Langages de programmation : Il existe de nombreux langages de programmation et chacun d'entre eux a des forces et des faiblesses. Les ingénieurs logiciels devraient être familiers avec au moins quelques langages fondamentaux, tels que Java, Python ou C++. Plus important encore, ils devraient être adaptables et désireux d'apprendre de nouveaux langages si nécessaire.
  • Processus de génie logiciel : Le logiciel est généralement développé en équipe et suit un processus. Ce processus décrit comment organiser efficacement une équipe de développeurs ainsi que comment aborder la création du logiciel. Il existe de nombreuses approches du développement logiciel en équipe et les processus de génie logiciel peuvent être continus ou discrets. Les processus discrets, tels que ceux préconisés par le développement agile2, encouragent la flexibilité quant aux activités requises et à leur degré au sein d'un projet donné. Habituellement, toutes les activités seront menées lors de l'utilisation de processus continus. Un ingénieur logiciel devrait être familier avec les avantages et les inconvénients des divers processus de génie logiciel pour pouvoir appliquer le meilleur à ses propres projets de développement logiciel. Plus loin dans ce chapitre, les processus traditionnels et agiles du cycle de vie du développement logiciel (SDLC), ainsi que divers modèles et cadriciels connexes, sont abordés plus en détail.
  • Tests : Le but des tests est de s'assurer qu'un système logiciel est exempt de défauts et qu'il répond aux exigences fonctionnelles et non fonctionnelles. Il est important de réaliser que les tests sont une activité continue qui se déroule tout au long du processus de génie logiciel. Par exemple, les ingénieurs logiciels peuvent effectuer des tests unitaires (unit testing) de la fonctionnalité de paiement d'un site web dans le cadre de leurs activités de construction logicielle pour s'assurer que le logiciel calcule correctement le total de la commande d'un client. Ils peuvent également être impliqués dans les tests d'intégration à mesure que les composants développés par d'autres membres de l'équipe sont intégrés.
  • Outils : Il existe de nombreux outils qui peuvent être utilisés dans le développement logiciel, et ces outils vont au-delà de la simple création de code logiciel. Ils peuvent, par exemple, faciliter la communication au sein de l'équipe, aider à soutenir les tâches d'ingénierie et maintenir un historique des versions du code source. Chaque ingénieur logiciel devrait être familier avec les principaux outils et leurs principes sous-jacents afin de pouvoir les utiliser efficacement.
  • Technologie informatique : Les ingénieurs logiciels ont besoin d'une compréhension au moins de haut niveau de la technologie informatique qui pourrait être applicable aux solutions logicielles qu'ils pourraient être amenés à créer ou à utiliser. Cela inclut des domaines tels que les systèmes d'exploitation, les services infonuagiques, la sécurité, le réseautage, les communications, la technologie des bases de données et l'UI/UX. Les ingénieurs logiciels pourraient également être appelés à travailler avec des technologies informatiques telles que l'apprentissage automatique (ML) et ses applications à l'intelligence artificielle (IA), l'informatique décisionnelle (BI) (business intelligence (BI)), et la multitude d'applications en constante évolution des technologies informatiques disponibles aujourd'hui. Un ingénieur logiciel performant est conscient de la technologie informatique actuelle et comprend comment en tirer parti.
  • Compétences non techniques : Un ingénieur logiciel doit posséder les compétences non techniques requises pour assumer son rôle, telles que la résolution de problèmes, la communication et la gestion du temps, comme le montre la Figure 9.3. Les compétences non techniques ont tendance à être plus innées, mais sont souvent tout aussi essentielles que les compétences énumérées précédemment. Par exemple, un ingénieur logiciel pourrait être chargé de développer une solution logicielle en douze mois qui suit et affiche des informations de conduite pertinentes sur un affichage tête haute présenté sur le pare-brise d'un nouveau modèle d'automobile. Pour livrer cette solution à temps, l'ingénieur logiciel devrait gérer un calendrier. Dans le cadre d'un projet d'équipe, il devrait également comprendre comment communiquer et interagir efficacement avec les autres membres de l'équipe de projet. De plus, il devrait résoudre les exigences pour dériver une solution en utilisant des algorithmes (algorithm) et des motifs (pattern) appropriés. La résolution de problèmes comprend la compréhension de comment et quand faire appel à des experts du domaine ou à des ressources non-ingénieurs logiciels sur un projet. Être capable d'appliquer ces compétences non techniques peut être tout aussi essentiel au succès d'un ingénieur logiciel que l'application des bons processus, méthodes, outils et structures de données/algorithmes.
Graphique des compétences non techniques requises en génie logiciel : Compétences en résolution de problèmes, Gestion du temps, Capacité à effectuer plusieurs tâches, Capacité à travailler en équipe, Compétences en communication, Aptitude.
Figure 9.3 Voici quelques-unes des compétences non techniques requises par les ingénieurs logiciels. (source : Copyright Rice University, OpenStax, sous licence CC BY 4.0)

La technologie dans la vie quotidienne

Langages de programmation : la boîte à outils de l'ingénieur logiciel

Imaginez une boîte à outils avec des outils spécialisés – un marteau pour la menuiserie, ou un pinceau pour l'art. Les ingénieurs logiciels utilisent également divers outils, et certains de leurs outils sont des langages de programmation ! Tout comme le bon outil rend un travail plus accessible, le langage de programmation correct aide les ingénieurs à construire différentes applications logicielles.

Pouvez-vous deviner le langage ?

Identifiez les langages de programmation couramment utilisés pour construire les types d'applications suivants :

  • Application mobile (comme Instagram)
  • Site web (comme Wikipédia)
  • Jeu vidéo

Les réponses possibles incluent JavaScript, Python, C++, Java.

Pourquoi tant de langages ?

Chaque langage de programmation a ses forces. Certains langages sont excellents pour construire la fonctionnalité de base d'une application (comme C++ ou Java), tandis que d'autres sont mieux adaptés pour ajouter de l'interactivité (comme JavaScript). Comprendre les différents langages permet aux ingénieurs logiciels de choisir le bon outil pour le travail.

Combien de langages un ingénieur logiciel devrait-il connaître ?

Il n'y a pas de bonne ou de mauvaise réponse à cette question. Il est possible, bien que peu courant, d'être employé comme ingénieur logiciel en ne connaissant qu'un seul langage de programmation. Généralement, cependant, les ingénieurs logiciels performants comprennent les différentes catégories de langages de programmation ainsi que la structure et les caractéristiques de conception communes de chacun.

Il est souvent recommandé à un ingénieur logiciel d'apprendre un langage de programmation principal qui peut être utilisé pour la programmation de niveau système, tel que C, C# ou C++. De plus, dans le monde d'aujourd'hui, un ingénieur logiciel devrait comprendre la programmation orientée objet, qui se fait dans des langages comme Python, C++ et Java. Étant donné que le développement web fait souvent partie des solutions, connaître un langage de script, tel que JavaScript, Python, PHP, Perl ou Ruby, est également bénéfique. Enfin, la compréhension des langages de balisage tels que HTML et XML est également importante.

Bien sûr, les meilleurs langages à connaître dépendent des projets sur lesquels on travaille. Si un ingénieur logiciel crée des solutions embarquées, le langage de programmation sera probablement très différent de celui utilisé s'il développe des solutions de jeu haut de gamme ou des solutions web. Le Chapitre 7 Langages de programmation de haut niveau approfondit les langages de programmation.