L'architecture logicielle est l'ensemble des décisions importantes concernant l'organisation d'un système logiciel : la sélection des éléments structurels et de leurs interfaces, leur comportement tel que spécifié dans les collaborations entre ces éléments, et la composition de ces éléments en sous-systèmes de plus en plus grands. Mais avant de plonger dans les styles et les modèles, nous devons comprendre qui prend ces décisions et pourquoi différents contextes appellent différents rôles. Cette leçon couvre le travail de l'architecte, les compétences qu'il exige et la taxonomie des types d'architecture que vous rencontrerez dans l'industrie.
L’image populaire d’un architecte – quelqu’un qui transmet des schémas depuis une tour d’ivoire – est obsolète. Les architectes modernes opèrent dans quatre dimensions qui se chevauchent : le leadership technique, la conception de systèmes, la communication organisationnelle et l'apprentissage continu. Ils définissent les attributs de qualité (performances, évolutivité, sécurité, maintenabilité), traduisent les objectifs commerciaux en contraintes structurelles, encadrent les équipes de développement et s'approprient les décisions qui seraient autrement prises de manière incohérente entre les équipes.
L'architecture est l'un des rares rôles qui exige à la fois une profondeur et une ampleur extrêmes. Un ingénieur senior peut être de classe mondiale dans un domaine ; un architecte doit être compétent dans plusieurs domaines. La métaphore classique est celle de l'ensemble des compétences en forme de T : approfondies dans au moins un domaine technique, mais suffisamment larges pour converser de manière crédible avec d'autres. Mark Richards et Neal Ford ajoutent une deuxième dimension : l'anti-modèle de « l'homme des cavernes gelé » décrit des architectes qui ont cessé d'élargir leur champ d'action et appliquent désormais des solutions vieilles de dix ans aux problèmes modernes.
L’architecture n’est pas une seule discipline : c’est une famille de préoccupations qui se chevauchent à différentes échelles. Les deux types les plus souvent confondus dans l’industrie sont l’architecture de solution et l’architecture système (également appelée architecture logicielle). Comprendre la différence est essentiel car chacun opère dans un cadre différent, répond à des questions différentes et produit des artefacts différents.
Ces deux questions sont souvent confondues, mais elles répondent à des questions totalement différentes. L'architecture de solution pose la question : « Quels systèmes, services et fournisseurs combinons-nous pour résoudre ce problème commercial, et comment se connectent-ils ? » L'architecture du système demande : « Comment pouvons-nous structurer les composants internes de ce système spécifique pour répondre à ses exigences fonctionnelles et non fonctionnelles ? » Un architecte de solutions conçoit la carte ; un architecte système conçoit les pâtés de maisons.
Neal Ford, Rebecca Parsons et Patrick Kua ont introduit le concept d'« architecture évolutive » : une architecture qui guide le changement plutôt que d'y résister. Au cœur de cette démarche se trouve la fonction d’aptitude : une fonction objective qui mesure dans quelle mesure l’architecture actuelle répond à une caractéristique architecturale spécifique. Les fonctions de fitness peuvent être des tests automatisés (vérification des dépendances indésirables, vérification des SLO de temps de réponse), des processus manuels (audits de sécurité) ou des tableaux de bord de métriques. L’idée clé est que l’architecture n’est pas une conception ponctuelle : c’est une propriété continue du système qui doit être activement entretenue et mesurée.
La plupart des architectes sont issus du milieu du développement – et la transition est plus difficile qu’il n’y paraît. Les compétences qui ont fait de vous un excellent développeur (concentration technique approfondie, résolution de problèmes concrets, livraison de code fonctionnel) sont nécessaires mais insuffisantes pour l'architecture. La transition nécessite de développer de nouveaux muscles : la pensée systémique (comment cette décision affecte-t-elle les choses à dix pas ?), la gestion des parties prenantes (comment aligner les personnes avec des intérêts concurrents ?) et l'aisance face à l'ambiguïté (comment prendre une bonne décision quand je n'ai pas toutes les informations souhaitées ?).