Le grand projet que je travaille depuis quelques années est une application de contrôle (et de tout) d'un appareil avancé, cœur de son firmware.
L'appareil est assez avancé, avec des fonctionnalités plus différentes que je pouvais dire de la mémoire et 98% d'entre eux sont traités par celui-ci énorme exécutable. D'une part, le programme est assez maintenu, bien modulable à l'intérieur, correctement documenté, il existe une séparation raisonnable des fonctionnalités par des annuaires et des fichiers, etc.
Mais à la fin, il est totalement regroupé dans une application qui fait tout de la communication de base de données distante, la manipulation tactile, la gestion d'une douzaine de divers protocoles de communication, des mesures, plusieurs algorithmes de contrôle, capture vidéo, temps de lever du soleil et date de Pâques (sérieux et ils sont Nécessaire à des fins très sérieuses!) ... En général, des choses qui sont très finement liées, souvent liées uniquement à travers certaines données qui s'imposent entre des modules lointains.
Il pourrait être fait sous la forme de plusieurs exécutables distincts communiquant les uns avec les autres, disons, sur des prises, avec un objectif plus spécifique, peut-être chargé/déchargé au besoin, etc. Pas de raison spécifique pour laquelle il est fait de cette façon.
D'une part, cela fonctionne et ça marche d'accord. Le projet est plus simple, sans entretenir la construction de plusieurs binaires. La structure interne est également plus facile, lorsque vous pouvez simplement appeler une méthode ou lire une variable au lieu de parler de sockets ou de mémoire partagée.
Mais d'autre part, la taille, l'ampleur de cette chose me glisse, on a l'impression de piloter Titanic. On m'a toujours appris à modulariser et frapper tout en un seul fichier gargantuan se sent faux. Un problème que je connais est une forte crash d'un module (même insignifiant) qui se bloque tout - mais la qualité du code assure cela ne se produit pas vraiment dans les versions de libération. Sinon, la programmation de séparation interne et de défense garantit que cela fonctionnera toujours correctement, même si la moitié des modules internes échouent normalement pour une raison quelconque.
Quels autres dangers ai-je parti? Pourquoi cela me floue-t-il? Est-ce juste une peur irrationnelle d'inconnu? Fait de graves projets de grande taille comme une pratique acceptée? Soit calme mes peurs ou me donner une bonne raison de refactoriser la version 2.0 dans plusieurs binaires plus petits.
L'appareil est assez avancé, avec des fonctionnalités plus différentes que je pouvais dire de la mémoire et 98% d'entre eux sont traités par celui-ci énorme exécutable. D'une part, le programme est assez maintenu, bien modulable à l'intérieur, correctement documenté, il existe une séparation raisonnable des fonctionnalités par des annuaires et des fichiers, etc.
Vous l'avez dit vous-même - c'est assez maintenu, bien modulable ...
À mon avis, et la plupart de la direction conviendront avec moi sur celui-ci, des changements ne devraient jamais être faits pour des changements. Il n'y a rien de mal à ce programme (votre description) à partir de celui-ci, il ne suit pas les dernières tendances de programmation (qui sont mentionnées dans d'autres réponses).
Oui, c'est un programme plus vaste ... beaucoup avant d'avoir été aussi. Il est également bien documenté, vous devez donc tout ce que vous avez à faire est d'étudier son organisation interne et vous verrez la logique. Je doute que tous ceux qui ont devant vous qui écrivaient, c'était incompétent. Alors, explorez-le un peu, apprenez-le ... Après cela, maintenez-la comme il est jusqu'à une raison solide de la réécriture de la réécriture. Votre manager vous sera reconnaissant d'avoir un bon ratio coût/effet.
Quels autres dangers ai-je parti? Pourquoi cela me floue-t-il? Est-ce juste une peur irrationnelle d'inconnu? Fait de graves projets de grande taille comme une pratique acceptée? Soit calme mes peurs ou me donner une bonne raison de refactoriser la version 2.0 dans plusieurs binaires plus petits.
Il vous ramène parce que c'est grand - mais encore une fois, personne ne s'attend à ce que vous appreniez tout cela par cœur dans une semaine. Alors, travaillez, pièce par pièce, peu à peu, jusqu'à ce que vous obteniez la suspension. En fin de compte, vous apprendrez qu'il est probablement bien organisé tel quel et comment elle est organisée.
Étiez-vous de réécrire, vous pourriez accomplir la même chose, mais en même temps la ruine pour tous ceux qui étaient habitués à l'organisation précédente du code. De cette façon, seuls vous devez "adapter".
Je me sentirais mieux si vous disiez que vous aviez tout emballé dans des tests unitaires. Si vous ne le faites pas, vous devriez construire une suite de test avant même de penser à la recherche de l'application.
Avoir une suite de test améliorera votre compréhension de la demande et vous dira quand une modification de l'application enfreint quelque chose.
Idéalement, la réponse est oui. Avoir de multiples binaires a le potentiel de le rendre plus stable ....
... Cependant, vous avez également mentionné que le code dans la base de code monolithique est bien écrit et modularisé, ce qui signifie que vous ne faites pas face à un immense gâchis tangle, juste une base de code énorme ...
Dans l'ensemble, je dirais que le dicton applicable est: "Ne laissez pas le parfait être l'ennemi du bien." Pendant que j'estime que vous avez raison de dire que la base de code monolithique est mauvaise, je pense aussi que cela ne vaut pas l'effort de s'en soucier.
Il serait raisonnable d'aller de l'avant en mettant de nouveaux morceaux de code dans leurs propres fichiers binaires, mais que le retour et le refactoring ne valent probablement pas votre peine.