On m'a demandé d'évaluer ce qui semble être une base de code héritée substantielle, en tant que précurseur d'un contrat de maintenance de cette base de code.
Ce n'est pas la première fois que je suis dans cette situation. Dans le cas présent, le code est destiné à un site de jeu multijoueur à profil assez élevé et assez chargé, prenant en charge au moins plusieurs milliers de joueurs en ligne à la fois. Comme beaucoup de ces sites sont, celui-ci est un mélange de technologies frontales et principales.
La structure du site, vue de l'intérieur, est un gâchis. Il y a des dossiers suffixés "_OLD" et "_DELETE" qui se trouvent partout. La plupart des dossiers semblent inutiles ou portent des noms très cryptés. Il pourrait y avoir un certain nombre d'anciens scripts inutilisés qui traînent même dans des dossiers d'apparence légitime. Non seulement cela, mais il y a sans aucun doute de nombreuses sections de code disparues, même dans des scripts par ailleurs opérationnels (une préoccupation beaucoup moins urgente).
Il s'agit d'un transfert des mainteneurs en place, aux développeurs / mainteneurs originaux du site. Comme il est compréhensible de manière typique dans ce genre de scénarios, le titulaire ne veut rien avoir à faire avec le transfert autre que ce qui est contractuellement et légalement exigé d'eux pour le repousser au responsable nouvellement élu. Il est donc tout simplement hors de question d'extraire des informations sur la structure du site existant.
La seule approche qui vient à l'esprit pour entrer dans la base de code est de commencer à la racine du site et de parcourir lentement mais sûrement les scripts liés ... et il y en a probablement des centaines en cours d'utilisation, et des centaines d'autres qui ne le sont pas. Étant donné qu'une partie substantielle du site est en Flash, cela est encore moins simple car, en particulier dans les anciennes applications Flash, les liens vers d'autres scripts peuvent être intégrés dans des fichiers binaires (.FLA) plutôt que dans des fichiers texte (.AS / ActionScript).
Je me demande donc si quelqu'un a de meilleures suggestions sur la façon d'aborder l'évaluation de la base de code dans son ensemble pour la maintenabilité. Ce serait merveilleux s'il y avait un moyen de regarder un graphique de la fréquence d'accès aux fichiers sur le système d'exploitation du serveur Web (auquel j'ai accès), car cela pourrait donner un aperçu des fichiers les plus critiques, même s'il ne le ferait pas être en mesure d'éliminer les fichiers qui ne sont jamais utilisés (car certains fichiers ne peuvent être utilisés qu'une seule fois par an).
la source
Réponses:
Étant donné que ce qu'on vous demande de faire est de fournir une entrée pour que votre client écrive une proposition appropriée à l' autre client (code propriétaire du cauchemar) pour tout travail sur ce code, je vais un membre et dire que vous n'allez pas faire de test approfondi ou de refactorisation ou quoi que ce soit dans ce sens à ce stade. Vous avez probablement très peu de temps pour obtenir une estimation approximative. Ma réponse est basée sur mon expérience dans la même situation, et donc si mon interprétation est incorrecte, ignorez tout ce qui suit.
Même dans un site compliqué, ce que j'ai décrit ci-dessus est quelque chose que vous pourriez faire en une journée ou une journée et demie. Étant donné que la réponse que vous allez donner à votre client est quelque chose comme "cela va être une douleur énorme dans le cul, et voici quelques raisons pour lesquelles vous allez simplement mettre du rouge à lèvres sur un porc, vous devez donc enchérir en conséquence "ou" toute personne raisonnable ferait une offre non pas pour maintenir mais pour recommencer, vous devriez donc enchérir en conséquence "ou même" ce n'est pas si mal, mais ce sera un flux de travail cohérent sur une période donnée, alors enchérissez en conséquence " , le fait est qu'ils vont faire l'offre et que vous n'avez donc pas besoin d'être aussi précis que si vous étiez embauché directement pour effectuer un audit complet du contenu et de l'architecture.
la source
Je recommande fortement de refactoriser le code source existant (par opposition à une réécriture) en utilisant les modèles trouvés dans le livre " Working Effectively With Legacy Code ".
Le livre détaille plusieurs mécanismes pour couvrir efficacement le code hérité dans les tests unitaires, afin que vous puissiez ensuite commencer à refactoriser le code en toute sécurité. Le livre est divisé en plusieurs parties, l'une décrivant la philosophie derrière l'approche, puis plusieurs chapitres qui résolvent des problèmes particuliers, tels que "Il faut une éternité pour faire un changement", "Je n'ai pas beaucoup de temps et j'ai besoin de le changer" et "Je ne peux pas intégrer cette classe à un harnais de test". Chacun de ces chapitres présente des techniques détaillées et éprouvées qui vous aident à apprendre comment appliquer les meilleures pratiques de test à des problèmes réels.
La lecture du livre m'a donné un sentiment très réel que "nous ne sommes pas seuls" ... beaucoup d'entre nous, ou peut-être tous, travaillons avec des bases de code complexes qui sont devenues difficiles à gérer. Les techniques énumérées dans le livre m'ont donné beaucoup d'espoir et j'ai personnellement pu les appliquer presque immédiatement.
Le billet de blog de Joel Spolsky fait un excellent travail pour expliquer pourquoi il est préférable de conserver une base de code existante et fonctionnelle plutôt que de partir de zéro. J'ai choisi une citation de l'article qui le résume, mais c'est une lecture fantastique.
la source
Dans une base de code Java typique, j'envisagerai d'utiliser des outils tels que PMD, FindBugs ou Sonar, puis j'essaierai de comprendre les rapports d'outils (code mort, code non documenté, code dupliqué, etc.)
Sur la base des rapports, je vais essayer de trouver les différentes couches de l'application / du site (couche métier, DB, SQL, etc.)
Si les couches sont couplées (html dans le servlet, sql dans le code java), je commencerai par découpler chacune de ces étapes doit être considérée comme isolée et vous pouvez vous engager à la fin de chacune (en démarrant une branche puis en faisant fusion) .
la source
D'après votre description, il semble que ce code ait atteint l'état impossible à maintenir, ce qui signifie que la meilleure approche est probablement une réécriture complète. Les développeurs auraient des chèques de paie beaucoup plus petits s'il y avait des outils de qualité qui fonctionnaient pour maintenir une base de code en désordre maintenable. Il est possible de parcourir et de nettoyer l'ancien code inutile des dossiers, mais c'est une tâche manuelle et vous n'obtiendrez probablement pas tout de toute façon sans un temps déraisonnable. Je suis juste en train de deviner ici, mais je parie que le code de travail lui-même est tout autant un gâchis que la structure du fichier, ce qui signifie que même lorsque vous parvenez à couper la base de code en code actif, cela restera un cauchemar. pour mettre à jour ou réparer quoi que ce soit.
Je voudrais souligner que l'effort requis pour obtenir le code existant dans un état maintenable serait égal ou supérieur à l'effort de recommencer sur une réécriture. une partie du maintien de quoi que ce soit consiste à savoir quand «le prendre derrière le hangar et le tirer».
la source
Un robot d'indexation Web peut vous aider à déterminer quelles URL sont accessibles. Surtout s'il est assez intelligent pour extraire des liens de Flash ou JavaScript. Une fois que vous avez une liste de pages Web, parcourez-les et répertoriez les fichiers auxquels elles se réfèrent. Tout ce qui reste après ce processus doit être considéré comme du code mort.
la source
Remarque: J'ai mis un accent sur l'utilisation de la base de données, pendant que vous posiez des questions sur l'utilisation du code lui-même. La réponse s'applique toujours aux deux cas sur tous les points que j'ai mentionnés.
Vous avez déjà répondu en partie à votre propre question dans le dernier paragraphe: voir à quoi on accède pendant que l'application est en cours d'exécution.
Vous pouvez souhaiter profiler la base de données et demander au profileur d'enregistrer toutes les requêtes pendant une journée. Il vous donnera un aperçu des objets de base de données les plus utilisés, mais ne dira pas lesquels ne sont jamais utilisés. En outre, vous devez toujours être prudent avec les résultats: par exemple, une table peut être utilisée exclusivement via des procédures stockées, mais lorsque vous examinerez les requêtes du profileur, il semblerait que la table ne soit pas utilisée du tout.
L'examen du code source, la recherche de requêtes est plus utile, et après avoir collecté toutes les requêtes, vous pouvez avoir une bonne compréhension de l'utilisation de la base de données, non pas en termes de fréquence (c'est là qu'un profileur est pratique), mais en termes d'utilisation / non tables utilisées. Malheureusement, pour une base de code mal écrite / non maintenue pendant des années, elle peut être extrêmement difficile et sujette aux erreurs , surtout si les requêtes sont construites dynamiquement (imaginez une méthode qui, dans a
select
, utilise un paramètre comme nom de la table; comment pouvez-vous savoir éventuellement quelles sont les valeurs possibles du paramètre en regardant simplement le code source?).L'analyse statique et certains compilateurs peuvent également révéler du code mort, mais ne vous donnent toujours pas la réponse que vous souhaitez.
L'analyse des données elles-mêmes ou des métadonnées de la base de données peut révéler des informations intéressantes. Par exemple, il serait facile d'affirmer que la table
LogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)
n'est pas utilisé plus longtemps si elle contient 10 000 enregistrements par jour pour les années 2006 à 2009, et aucun enregistrement de Septembre, 18 e , 2009. La même chose est pas vrai pour un table qui contient les données en retrait pour être principalement en lecture seule.Ces quatre points ensemble vous donneront la liste des tableaux utilisés. Les autres sont utilisés ou non. Vous pouvez faire des affirmations et les tester, mais sans une bonne couverture des tests unitaires, ce ne serait pas facile. Tout moyen "facile" échouerait également. Par exemple, si vous avez une
products_delme_not_used
table, vous pouvez affirmer que la table n'est pas utilisée du tout et rechercher "products_delme_not_used" dans votre code. C'est optimiste: il n'est pas rare de trouver le candidat DailyWTF comme celui-ci dans une ancienne base de code:Pouvez-vous comprendre que ce code utilise réellement une
products_delme_not_used
table?Si j'étais toi, je:
Lorsque vous aurez terminé les deux dernières étapes, vous aurez probablement une meilleure compréhension de l'utilisation de la base de données, ce qui aidera à déterminer les noms des tables qui ne sont plus utilisées et peut les supprimer plus ou moins en toute sécurité.
la source
Il me semble que vous devez obtenir suffisamment d'informations pour créer un devis, je vais donc me concentrer sur cet effort.
J'essaierais de déterminer le nombre de cas d'utilisation impliqués dans ce site. Cela vous donne généralement une idée de la taille et de la complexité du site et du temps qu'il faudra pour recréer ou maintenir le site / l'application.
Oui, il est vrai que parfois le code n'est plus utilisé et cela rendra l'application un peu plus grande qu'elle ne l'est vraiment, mais je ne pense pas que cela affectera les nombres de plus de 20% au maximum , donc je ne m'inquiéterais pas pour cette partie.
La lecture du code source, des pages Web et des tables de base de données devrait vous aider à le découvrir.
Vous pouvez également envisager de limiter le nombre d'heures par mois que vous consacrerez à ce projet pour les frais prédéterminés pour vous protéger.
En ce qui concerne la découverte de ce qui est utilisé et non utilisé, il n'y a vraiment pas de moyen facile. Les outils d'analyse de code peuvent aider, mais comme vous faites face à un problème aussi mitigé, je ne pense pas qu'il existe un seul outil qui puisse vous aider. Pour chaque domaine spécifique, vous pouvez probablement trouver un outil d'analyse de code qui peut vous aider.
la source