Comment lire des milliers de lignes de code sans aucune documentation? [fermé]

12

Auparavant, je cherchais un bon contrôle TimeLine pour un projet WPF. J'ai trouvé une réponse dans Here qui m'oriente vers ce projet CodePlex .

Maintenant, je veux changer le code pour répondre à mes besoins culturels. Mais il y a des décalages!

Ma question est:

Comment interagissez-vous avec ces milliers de lignes de code?

ÉDITER:

Tout raccourci sera génial!

Jalal
la source
3
demander une augmentation. ça aide toujours. (ils peuvent en faire un facteur de motivation)
Nom d'affichage
2
frappez votre tête contre le bureau jusqu'à ce que tout devienne clair.
jellyfishtree
19
Comment manges tu un éléphant? ... Une bouchée à la fois.
Bill
1
@Jalal C'est ce qu'ils veulent que vous pensiez.
Mateen Ulhaq
2
@DisplayName, l'approche de la motivation de la carotte et du bâton s'est avérée être une mauvaise solution pour tout travail nécessitant des compétences cognitives rudimentaires. La science de la motivation est plus complexe que le système de récompense. Découvrez «Drive: La vérité surprenante sur ce qui nous motive» de Dan Pink, c'est une lecture étonnante. Ou regardez cette vidéo sur tube pour une version condensée. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Réponses:

37

Vous ajoutez des commentaires au code source lorsque vous l'avez suffisamment compris pour pouvoir le faire. Refactorisez vigoureusement ces commentaires à mesure que vous comprenez de plus en plus.

user1249
la source
3
+1 et une bonne façon est d'écrire la documentation en parcourant le code source. Et pourquoi renvoyer votre contribution aux coordinateurs op?
1
+1 De plus, si vous modifiez le code, assurez-vous de modifier également vos commentaires, afin que les générations futures ne soient pas confondues avec ce que vous avez fait. Dommage de faire tout ce doc et que les gens le détestent car c'est mal!
Michael K
1
Si le projet d'origine se trouve dans un système de contrôle de source distribué (comme git), il serait avantageux de le bifurquer, de valider vos modifications de manière incrémentielle et de le faire de sorte que vous puissiez éventuellement fusionner vos modifications ultérieurement vers l'original
8
  1. Parcourez le code
  2. Renommer au besoin
  3. Refactoriser au besoin
  4. Répétez jusqu'à ce que vous compreniez complètement

... et le code vous en remerciera. ;-)

John MacIntyre
la source
7
Changer des endroits aléatoires dans le code de production simplement parce que c'est plus facile n'est pas une très bonne idée. Seules les demandes de fonctionnalités doivent entraîner une modification du code, la refactorisation est une demande de fonctionnalités. Peu importe à quel point vous êtes bon, les sauts de code, les effets secondaires parfois stupides sont ce sur quoi les clients comptent. Refactorisez uniquement le code dont vous êtes très sûr. Et rappelez-vous, même les tests unitaires ne garantissent rien.
Coder
D'accord, mais une refactorisation juste pour essayer une conception peut vous aider à comprendre pourquoi le code est écrit tel qu'il est (ou confirmer que vous avez raison qu'il est mal fait / bizarrement). Vous n'êtes pas obligé de conserver ces modifications.
Ricky Clarkson
+1 Coder. Et cette réponse ne mentionne même pas actuellement les tests unitaires. Effrayant.
MarkJ
Désolé, cela ne signifiait pas une refonte majeure. Je parlais plus de refactorisation mineure, de trucs de type nettoyage. Donc, finalement, vous arrivez au point où le but du code est évident.
John MacIntyre
5

Prenez une seule action, déboguez (encore et encore) le code pour trouver comment cette action est accomplie. Notez la même chose dans un langage simple pour mieux comprendre!

Sri Kumar
la source
Normalement, je le fais aussi jusqu'à ce que je fasse face à un projet qui ne peut pas fonctionner en mode débogage! Il plante toujours au démarrage! :( Mais ça fonctionne bien en mode Release: S
Afriza N. Arief
@afriza WHAT THE FUCK. C'est un code très mauvais, vérifiez les erreurs qu'il vous donne.
Daniel S
@afriza, première chose à corriger!
4

Quelque chose que Joel Spolsky a écrit il y a longtemps quand sur son blog (je ne trouve pas l'article maintenant) m'a vraiment collé à ce sujet:

Il a dit que le code n'est pas un langage humain naturel, mais en tant que programmeurs, nous sommes facilement bercés en pensant qu'il l'est, et que nous devrions être capables de le lire tel quel. Par conséquent, beaucoup d'entre nous regardent le nouveau code et s'attendent à pouvoir simplement le "lire" et le comprendre immédiatement, comme s'il s'agissait d'un bloc de texte en anglais.

Je pense donc que la clé est d'être simplement lent, méthodique et scientifique. Et comme d'autres l'ont dit - commentez-le (et même refactorisez) au fur et à mesure. Ne tombez pas dans la mentalité de "je devrais simplement le regarder et comprendre immédiatement".

Oh, et oui, je tombe encore parfois dans ce piège moi-même. "Faites ce que je dis, pas ce que je fais", et tout ça. :)

Tables Bobby
la source
Le fait est que le texte anglais que vous pouvez "simplement lire" est généralement linéaire, la raison pour laquelle le code est souvent difficile à digérer au début est généralement parce qu'il est non linéaire et que l'astuce consiste simplement à le décomposer. La pléthore de différents idiomes d'implémentation que les développeurs utilisent n'aide généralement pas non plus, mais la première étape consiste généralement à exécuter le code via un débogueur et à utiliser des points d'arrêt pour voir ce qui est quoi. Essayer de le lire est un exercice assez inutile. Sérieusement, quand avez-vous lu le code que vous avez écrit pour la dernière fois? (du début à la fin c'est.)
ocodo
En fait, un code bien écrit est facile à lire, mais pas sous forme de texte. Vous n'avez qu'à parcourir pour voir les blocs de construction et comprendre la structure de base, pas besoin de tout lire. Les mauvaises approches de codage, comme l'ancien code de skool, ou l'abus de SOLID et de modèles peuvent cependant rendre cette tâche très difficile.
Coder
4

SE-Radio a interviewé Dave Thomas à ce sujet

Cet épisode de podcast contient de nombreux conseils et techniques pour entrer dans la «culture» du projet et comprendre comment vivaient les habitants d'origine.

Michael Easter
la source
La partie hilarante de l'expérience de Dave Thomas est que la documentation - au-delà d'une vue d'ensemble de haut niveau - est (presque) sans exception pire que pas de documentation du tout. (D'après mon expérience, c'est parce que la plupart de la documentation est un passe-partout donnant une compréhension au niveau de la surface du «quoi» ou du «comment», qui est ensuite invariablement laissé à jour, au point d'être trompeur.)
Michael Kropat
2

J'ai dû le faire récemment avec un projet de plus de 100 000 LOC. Ma première idée était qu'il est plus facile de voir des modèles à partir de graphiques de 100 ou même 1000 nœuds que de 100 000 lignes de texte.

J'ai donc passé 45 minutes et écrit un court programme Python (<100LOC) pour analyser ce dont j'avais besoin et dessiner les relations entre les objets. J'ai généré la source Graphviz , qui est un langage vraiment facile à générer. (Il n'y a rien de spécial à propos de Python ici: Ruby ou C # ou Common Lisp ou tout ce qui pourrait le faire aussi bien.)

Sur d'autres projets, j'ai vu des gens utiliser Graphviz pour les dépendances de modules, les graphes d'appels, l'historique des versions, toutes sortes de choses. Le plus grand méta-outil de visualisation de programmes jamais créé.

(Peut-être que c'est parce que j'ai pris des compilateurs , mais je trouve bizarre que lorsqu'un programmeur est confronté à un problème, la réponse semble toujours être "écrire un programme!", Sauf lorsque le problème implique le code source d'un programme.: - )

user18893
la source
1

Parcourez-le dans le débogueur pendant son exécution, c'est presque le seul moyen de comprendre une nouvelle base de code volumineuse.

grrussel
la source
2
Ce n'est pas une option pratique lorsque vous avez des milliers de lignes de code (en particulier lorsque nous parlons de dizaines ou de centaines de KLOC), et / ou si une partie de ce code est dans des modèles. Pour saisir une nouvelle base de code (et peu documentée), il faut également engager l'entreprise et essayer de comprendre le contexte dans lequel le code est censé s'exécuter. Si vous pouvez parcourir le code avec un débogueur et le comprendre, cette base de code n'était pas si grande au départ (ce qui rend l'utilisation d'un débogueur plutôt inutile dans la plupart des cas.)
luis.espinal
Malheur si la base de code est trop grande pour déboguer dans un débogueur. Voir le code réagir à une entrée et une sortie connues aide à transformer la connaissance de «quoi» en «comment». La question «pourquoi» n'est jamais une réponse à laquelle un débogueur seul peut être répondu, mais il peut y avoir des commentaires source en ligne que vous pouvez voir dans l'EDI pendant que vous déboguez.
grrussel
@grrussel Je dois être en désaccord parce que ce n'est pas ce que je fais ... Je ne sais pas si je suis représentatif ou non! Je peux en quelque sorte voir utiliser le point d'arrêt impair (mais toujours pas explicitement) et j'utilise des fonctionnalités IDE pour me permettre de relier une pièce à une autre.
Murph
1

Comprenez qu'il n'y a vraiment aucun raccourci pour grogner en plénitude. (Et si vous avez du mal avec cette phrase, votre éducation a été TRÈS négligée. C'est de "Stranger In a Strange Land", de Robert A. Heinlein.)

Lisez-le, une page à la fois, une routine à la fois. Ajoutez des commentaires. Dessinez des images des principales structures de données. Reconnaître les algorithmes. Tirez parti de vos connaissances antérieures.

Résistez à la tentation de lancer le débogueur. La fenêtre du débogueur est trop petite: vous voyez une ligne à la fois, mais vous ne voyez vraiment pas où vous avez été ni où vous allez.

John R. Strohm
la source
Le débogueur explique certaines conventions, les conventions du rédacteur de code d'origine sur ce qui est attendu à l'intérieur des variables (par exemple, s'attendent-elles à un chemin complet ou un nom de fichier ou un chemin relatif?) Et bien d'autres choses, donc c'est toujours important à mon avis
Afriza N. Arief
2
-1 pour penser que vous êtes cool parce que vous utilisez le mot "grok"
Carson63000
1

Quoi que vous fassiez, écrivez autant que vous le pouvez au fur et à mesure afin que personne ne se retrouve jamais dans la même position que vous.

Jon Hopkins
la source
1

vous devez utiliser des indices. obtenez un indice de ce que vous devez rechercher et utilisez largement la fonctionnalité de recherche de votre environnement ou IDE qui peut vous amener à la section souhaitée du code que vous devez modifier.

lire 14 mille lignes de code java n'a aucun sens. La fonctionnalité de recherche est votre bouée de sauvetage

user18883
la source
0

Différentes personnes ont des styles d'apprentissage différents, donc YMMV. La première chose que je fais dans cette situation est de lire l'intégralité de la base de code au moins une fois. Cela me donne une idée générale de tout. Ensuite, je choisis une section à examiner plus en détail. Les structures de données seraient un bon point de départ. Une fois que j'ai une idée générale de ce qui se passe, je fais de même avec une autre partie du code qui interagit avec la première. Après suffisamment d'itérations, j'ai une bonne idée du fonctionnement du code.

Larry Coleman
la source
0

La meilleure façon, comme pour toute programmation, pas seulement de gros morceaux de code non commenté, est de le décomposer en morceaux. C'est à la fois quelque chose que vous devez faire dans votre tête ainsi que visuellement dans le code. Cela peut signifier ajouter de gros commentaires en gras ou plusieurs sauts de ligne. Cela aide tout en le faisant défiler pour voir les pièces. Essayez de trouver les morceaux logiques de code.

Bien sûr, lorsque vous comprenez des éléments, commentez-les pour ce que vous savez à ce moment-là, en ajoutant éventuellement des notes sur quelque chose que vous ne comprenez pas.

Je recommanderais également de ne pas essayer de comprendre la pièce entière dès le début. Essayez plutôt de comprendre les éléments que vous devez connaître dès maintenant et de travailler sur le reste plus tard.

Darryl Hein
la source
0

Je commencerais par utiliser l' éditeur Leo en mode @shadow avec une utilisation active des nœuds clonés . Cela permet d'ajouter des notes et des commentaires pour chaque section de code à l'étude sans changer le code , et les annotations seront toujours en contexte, à côté du code dont il s'agit. Voici un exemple de flux de travail des documents:

Par exemple, lorsque je corrige un bogue dans Leo, je crée un nœud ordinaire pour représenter le bogue. Ce nœud de bogue est ma vue de toutes les données du code source de Leo qui se rapportent au bogue. Lorsque je découvre le code lié au bogue, je clone leurs nœuds et les déplace sous le nœud de bogue. J'ajouterai également des nœuds ordinaires en tant qu'enfants du nœud de bogue. Ces nœuds contiennent le rapport de bogue d'origine, des descriptions de la façon dont j'ai corrigé le bogue, des données de test ou toute autre note que je pourrais vouloir conserver.

Une fois que j'ai créé le nœud de bogue, je me concentre uniquement sur ce nœud et ses enfants. Je peux examiner le nœud de bogue et ses enfants sans avoir à sauter le contour. Tout ce dont j'ai besoin est au même endroit. Lorsque je parviens à corriger le bogue, je peux le faire en changeant les clones. Encore une fois, je n'ai pas à sauter le contour. Peu importe la taille ou la complexité de l'ensemble du plan: je ne traite que du nœud de bogue et de ses enfants. Cette focalisation extrêmement étroite facilite la correction des bogues.

Matt Wilkie
la source
0

Dessinez des diagrammes de la source: les relations de données, les relations fonctionnelles, les relations d'objet. Déterminez l'agrégation, le flux de données et le flux de code. Les images sont bien meilleures que les commentaires pour cela et peuvent être séparées du code.

Bruce Alderson
la source
0

Avant de refactoriser quoi que ce soit, écrivez des tests. Beaucoup de tests. Des tests très spécifiques à de petits blocs de code qui sont au moins appelables, car cela dépendra de la façon dont votre désordre hérité est écrit.

L'avantage d'écrire des tests pour commencer est que vous devez avoir une certaine compréhension du code avant de pouvoir le tester, donc chaque test que vous écrivez sera, espérons-le, un peu de connaissances acquises. Vous pouvez également commenter les tests avec vos hypothèses à côté des assertions.

En le testant d'abord, vous ne courez pas le risque de modifier quelque chose dans le code qui a des effets d'entraînement que vous ne pouvez pas connaître. Vous aurez également un filet de sécurité lorsque vous viendrez refactoriser le code.

chooban
la source
0

J'utilise des outils comme doxygen, pour générer un diagramme de classe global, qui ajoute ma compréhension de ce que fait chacune des classes.

Ensuite, je récupère un bogue facile dans la file d'attente des bogues (avant que mon responsable ne m'en attribue un dur: P), puis j'exécute cette fonctionnalité dans le débogueur et j'essaie de générer un flux de données approximatif ou un modèle de flux de code.

Par exemple, la fonctionnalité d'exportation dans certains logiciels: j'essaie donc de comprendre comment les données source sont lues, d'où dans le code (interface de base) puis-je évaluer que les données sont lues correctement en utilisant ma classe et les diagrammes de flux de code, dont les classes sont responsables quel type d'exportations, etc. Je pense que la moitié de la compréhension est faite, une fois que vous avez les diagrammes de classes et les organigrammes.

Priyank Bolia
la source
0

Abordez un défaut trivial, par exemple une NullPointerException. Évitez tout ce qui concerne la concurrence au début, tout ce qui, de par sa nature, impliquera de comprendre une grande partie du code à la fois.

Une fois que vous aurez corrigé quelques bugs, vous aurez probablement une assez bonne idée. Fonctionne pour moi, en tout cas.

Ricky Clarkson
la source
-2

Fondamentalement, l'action d'écrire un code propre doit commencer dès la conception. Si nous codons en langage OOP, proposez un UML, partagez-le avec vos pairs et soyez convaincu que le design n'est pas ambigu. Dans tous les cas, nous, les développeurs, devons être convaincus que la conception résout le problème et non les ambiguïtés.

En ce qui concerne le codage, nous devons nous assurer que le design est converti en code, c'est-à-dire une entité en classe ou structure, une opération en fonction, etc.

Et j'ai parcouru un livre blanc http://queue.acm.org/detail.cfm?id=2063168 qui parle du style de codage ou de la façon dont nous pouvons utiliser l'espace, l'indentation, la variation de police comme la plupart des IDE que nous pouvons utiliser pour écrire BEAUCOUP Un code plus propre où nous, les humains, pouvons comprendre autant que les machines. Il insiste davantage sur l'écriture de code sans commentaire afin que notre code apparaisse comme paragraphes lui-même.

Vasanth
la source