Des études sur la façon dont un programmeur peut comprendre le code dans des langages inconnus? [fermé]

15

Existe-t-il des études sérieuses sur la façon dont un programmeur expérimenté qui connaît le langage X peut comprendre le code écrit par un programmeur compétent utilisant le langage Y, pour une bonne gamme de langages largement utilisés comme X et Y?

Bien sûr, le monde réel n'est pas aussi simple qu'un programmeur ne connaît qu'une seule langue. Ce que nous aimerions savoir, c'est: si nous réalisons notre projet en C #, par exemple, et qu'un jour de vieux physiciens qui ne connaissent que Fortran et Algol l'examineront, dans quelle mesure cela aurait-il du sens pour eux? Les parties mathématiques de celui-ci pourraient bien leur être lues, s'ils ignorent ce que sont pour eux des signes de ponctuation aléatoires. Ou, un expert Python pourrait-il trouver des failles dans mon script Ruby intelligent?

Il pourrait y avoir des problèmes du niveau de la syntaxe superficielle au niveau des grands concepts tels que les objets, la métaprogrammation des modèles, les fonctions, etc. Je ne m'attends pas à ce qu'un seul programmeur comprenne pleinement tous les détails de la syntaxe du code dans une "langue étrangère" ou qu'il suive la religion d'un grand concept, mais je me demande dans quelle mesure ils obtiendraient le flux de contrôle principal, trouver l'endroit là où quelque chose est dessiné sur l'écran et ce qui détermine sa couleur ou sa taille, vérifiez qu'un robot programmé pour conduire une voiture éteindra le moteur quand il sera fait, ce genre de choses.

Une étude de bonne qualité comprendrait des recherches universitaires publiées, un rapport officiel d'un groupe industriel ou d'une grande société de logiciels, bien que je prenne des observations systématiques et impartiales de leaders expérimentés d'ateliers et de classes ou d'autres sources. Pas intéressé par les courts blogs, les exemples à cas unique ou les anecdotes. (Eh bien, peut-être quelques anecdotes si elles permettent une bonne lecture.)

DarenW
la source
1
Je ne sais pas s'il y a des études, mais d'après mon expérience personnelle, je dis oui, j'ai réussi à comprendre un programme sans connaître la langue.
superM
2
Cela dépendrait d'une paire de langages: choisissez C # contre Java - et vous obtiendrez une familiarité presque instantanée; choisissez Algol vs C - et vous vous familiariserez avec une feuille de triche d'une seule page. Bonne chance pour choisir C vs Prolog ou Whitespace vs Ada - ça va être frustrant. Soit dit en passant, le langage n'est pas la seule chose qui joue dans la compréhension d'un programme: un expert C spécialisé dans les conceptions intégrées essayant de comprendre le code MFC écrit en C est un spectacle plutôt désolant (c'est une expérience de première main).
dasblinkenlight
Est-il facile pour quelqu'un qui comprend l'algèbre de choisir la trigonométrie par rapport à quelqu'un qui comprend le calcul? Cela dépend de la langue et du paradigme. Détecter et isoler les différences entre les langues est déjà assez difficile, d'autant plus que les langues évoluent constamment. Je doute sérieusement que quiconque puisse évaluer la compréhension avec une précision raisonnable.
Evan Plaice

Réponses:

9

Cela dépend évidemment du degré de relation entre les langues. Par exemple, si vous avez une expérience en C ou C ++ et que vous avez fait de la programmation en C # ou Java, il devrait être facile pour vous de lire et de comprendre l'autre de ces deux langages (Java ou C #). Si vous connaissez bien Lisp, Scheme ne devrait pas être un gros problème. J'ai une fois débogué un programme PHP sans avoir aucune connaissance de PHP, juste avec mes connaissances en C, C ++ et Perl. Je suis à peu près sûr que lorsque ce programme aurait été écrit en Haskell ou Smalltalk, cela aurait été extrêmement difficile, presque impossible pour moi.

En fait, je ne pense pas qu'une recherche universitaire sur ce sujet aurait un sens (du moins pas sérieuse). Il n'y a rien de tel qu'un "programmeur expérimenté standard qui connaît le langage X", donc toute étude manquerait des données de base assurées. Les gens ont des connaissances différentes, et même s'ils ont traversé les mêmes écoles, ils ont des talents et des motivations différents.

mais en se demandant dans quelle mesure ils obtiendraient le flux de contrôle principal, trouver l'endroit où quelque chose est dessiné à l'écran

Cela peut être difficile même lorsque vous êtes très familier avec le langage, soit parce que la qualité du code est si faible, soit le cadre utilisé est si complexe, soit la base de code est très grande.

Doc Brown
la source
6

Je ne suis pas sûr de la référence d'une étude menée par un universitaire, mais une dénomination bien explicite des méthodes, des classes et des fonctions dans les langages C # / C ++ / Java / Python ou etc. devrait faciliter la compréhension de la base de code ainsi que du flux de processus métier.

La convention de dénomination au sein du projet et généralement dans le développement de logiciels est un aspect très important. Cependant, laits importancepertinence de la création de logiciels de qualité est souvent négligée ou ignorée tous ensemble.

Les directives de dénomination utilisées dans .NET Framework et les conventions générales de dénomination utilisées dans .NET sont également de bonnes références à consulter.

Yusubov
la source
Une bonne conception de l'API et des conventions de dénomination sont utiles, mais même les conventions de dénomination basées sur la langue sont souvent «exprimées» d'une manière qui ne s'applique qu'à cette langue. A côté de C # / Java (qui sont presque identiques), la plupart des langages fonctionnent sur des principes différents qui ont des workflows et des implémentations uniques spécifiques à ce langage. Par exemple, dans les langues qui ne suivent pas le modèle de structure de base méga-monolithique, vous trouverez généralement un énorme écosystème de packages qui se lient à l'aide d'un gestionnaire de packages commun.
Evan Plaice
3

Cela dépend énormément du programmeur individuel et de la manière dont il intériorise les langues. Je n'ai absolument aucun mal à travailler dans une dizaine de langues, alors que j'ai un ami qui ne connaît que le C ++. Il n'est pas pire en programmation que moi, il vient d'apprendre une manière différente.

Personnellement, je trouve une question connexe plus intéressante: quand il y a un bug dans le code (c'est-à-dire que le programmeur X a pensé qu'il a écrit someFunction(x, y)mais il a vraiment écrit autre chose), à ​​quel point est-il difficile pour le deuxième développeur d'identifier le bug. Un bon programmeur X rendrait extrêmement évident ce qu'il voulait que l'ordinateur fasse, et ce serait facile à lire. Cependant, s'il a fait une erreur, cela peut être un gros problème. Des choses comme le bogue C ++ suivant:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

Peut être notoirement difficile à détecter à moins que vous ne connaissiez la langue.

Cort Ammon - Rétablir Monica
la source
1

Cela dépend non seulement du programmeur comme d'autres l'ont dit, mais aussi des similitudes entre les langages, à la fois dans la syntaxe, la philosophie et l'implémentation.

De nombreux langages différents utilisent une syntaxe dérivée C, et donc suivre le flux de contrôle sera plus facile si vous êtes familier avec ce type de syntaxe. Il en va de même pour les langages fortement typés et faiblement typés, les langages avec prise en charge de fonctions d'ordre supérieur, le niveau d'abstraction et les philosophies programmatiques. Cela dépend non seulement de votre capacité à lire la syntaxe, mais également de vous familiariser avec les concepts et les philosophies des langages.

Si vous avez appris le C par exemple, je pense qu'il serait raisonnable de s'attendre à ce que vous puissiez dériver le flux de contrôle à partir de C #, Java ou C ++, etc. Il serait un peu plus difficile de déchiffrer VB en raison de la différence de syntaxe, ou JavaScript à cause des fermetures, de la frappe faible et des fonctions d'ordre supérieur (je sais que vous pouvez le faire en C mais c'est un peu bancal). Cependant, je ne m'attendrais pas à ce que vous puissiez déboguer l'assemblage Lisp, F #, R ou, Dieu nous en préserve, car ceux-ci utilisent un paradigme de programmation complètement différent.

TL; DR Il est non seulement important de pouvoir reconnaître la syntaxe, la plupart du temps vous pouvez déchiffrer une déclaration ou un appel de méthode, mais être capable de comprendre la raison pour laquelle un programme est écrit d'une certaine manière est le nœud de la compréhension et de la lecture du code .

Nimnam1
la source