Est-il efficace de réviser le code dans une langue que je ne connais pas?

108

Je suis un développeur expérimenté, mais je n'ai pas fait beaucoup de revues de code. On me demande de relire le code écrit en Python mais je ne le connais pas.

Est-il logique de réviser le code dans une langue que je ne connais pas?

Heather Smith
la source
62
Tangentiellement, envisagez d’utiliser CodeReview.SE et jetez un coup d’œil à la balise python. En ne regardant que la question, réfléchissez aux conseils que vous donneriez au code, puis vérifiez si cela est représenté dans les réponses.
14
Cela semble être un excellent moyen d'en apprendre davantage sur Python. Interrogez tout ce qui a l'air drôle - une partie sera que vous ne comprenez pas la langue, et d'autres seront des éléments légitimes de révision de code.
Dan Pichelman
9
@RobbieDee Absolument! Expliquer votre code à quelqu'un vaut souvent la peine, même s'il ne s'agit que d'un ours en peluche .
Kilian Foth
34
Vous dites qu'on vous demande de le faire. La personne qui vous demande pense que vous effectuez cette tâche ajoutera de la valeur à votre organisation. Si vous voulez savoir quelle est la nature de cette valeur, demandez à cette personne et non aux étrangers sur Internet! Nous ne savons pas ce qui se passe dans la tête de cette personne. Peut-être le code est-il d'une qualité telle que même les novices peuvent trouver des problèmes. Peut-être le code est-il d'une telle qualité que vous en apprendrez de bonnes habitudes. Qui peut dire? Quelqu'un pense que c'est une valeur; demander à cette personne quelle est la valeur.
Eric Lippert

Réponses:

120

Aucun sens? Oui. Même si vous ne connaissez rien à la sémantique d'un langage de programmation, vous pouvez toujours lire des caractères et constater des mises en forme incohérentes, des commentaires manquants, des identificateurs mal choisis, des duplications évidentes, etc.

Beaucoup de sens ou assez de sens pour rembourser le coût de votre temps ? Je ne suis pas sûr. Cela dépend de votre position, de l'importance des révisions de code dans le flux de travail de votre équipe et de plusieurs autres facteurs que nous ne pouvons pas quantifier suffisamment.

Kilian Foth
la source
50
Faire des revues de code est un excellent moyen de connaître un module, un framework ou même une langue. Cela vaut donc peut-être la peine de perdre du temps (et peut-être que vous en faites allusion ...). Cependant, je ne signerais pas un tel examen, non sans demander à une personne connaissant à la fois le langage et le code de le consulter.
Ordous
8
De plus, si vous avez une bonne connaissance du domaine et que le code est raisonnablement bien nommé / commenté, vous pouvez toujours repérer les fonctionnalités incorrectes / incompris / manquantes à un niveau élevé (vous ne pouvez toutefois pas détecter les erreurs en raison de problèmes de syntaxe)
Dan
4
En tant qu'étranger, vous aurez peut-être même plus tendance à repérer des erreurs de poteau de clôture, ou des erreurs d'application du montant correct de signes égaux, et ce genre de choses.
KlaymenDK
2
@KlaymenDK Les affectations dans des contextes booléens sont (du moins généralement) des erreurs de syntaxe en Python. Les erreurs Fencepost sont moins probables, car Python bien écrit n’a pratiquement jamais travaillé directement avec des index de tableaux / listes. (Même quand vous le faites, c'est généralement avec enumerate.) Je pense que votre commentaire est un excellent exemple de la raison pour laquelle essayer de réviser une langue que vous ne connaissez pas devrait tout au plus être éducatif pour vous-même.
Jpmc26
1
@Mawg - Je dirais que c'est à cela que servent les tests automatisés. Même avec une connaissance experte de la langue, il est difficile de dire si le code répondra réellement aux spécifications de conception en le regardant / sans l'exécuter et en observant le résultat (à moins que votre spécification de conception soit si détaillée qu'elle soit essentiellement détaillée). . Les aspects énumérés par la réponse couvrent de nombreuses raisons (mais pas toutes) valables pour effectuer des révisions de code. Une révision de code n'inclut généralement pas l'exécution du code en cours de révision.
aroth
59

En tant que contributeur régulier à Code Review Stack Exchange , je rencontre beaucoup de questions concernant des problèmes liés à une question de langage, par exemple:

  • Mise en forme, indentation
  • Portée
  • Boucles
  • Opérations de type

Et la liste continue. Cependant, même si je n'ai pas besoin de connaître la langue, je peux quand même examiner ces problèmes / points.

Certains de nos principaux utilisateurs ont les meilleures réponses dans des langues qu'ils n'utilisent pas activement ou ne connaissent pas. Même deux de mes dix principaux sont dans des langues que je ne connais pas et que je ne peux pas compiler / exécuter sur ma machine.

Je dirais même que ce serait la même chose que de réviser le pseudo-code de quelqu'un. Tant que vous pourrez observer et commenter des choses pertinentes par rapport à ce que vous comprenez, tout ira bien, et ce sera pertinent.

Penne
la source
2
J'ai même écrit une réponse à un programme PHP. Ce n’est pas la meilleure réponse, mais je maintiens toujours que la déclaration de boucle originale est laide.
Hosch250
4
J'ai appris le C # en le révisant, en l'écrivant et en faisant réviser ce que j'avais écrit.
RubberDuck
5
Si vous ne connaissez pas Python, il est peu probable que vous compreniez l'importance de l'indentation dans la langue ...
Floris
2
En ce qui concerne 2/10 de vos réponses principales étant dans des langues que vous ne connaissez pas. Qui peut dire que les électeurs savent quelque chose à leur sujet non plus?
Martin Smith
Bien que je ne connaisse pas les langues, je vérifie quand même mes déclarations et, si je me trompais ... Crois-moi, j'en aurais entendu parler
Quill
44

Conseil général

Voici la ligne de fond, à mon avis:

  • Si vous ne connaissez pas suffisamment la langue pour connaître les caractéristiques et les idiomes courants , vous ne contribuerez probablement pas beaucoup à la révision.
  • Si vous souhaitez apprendre les caractéristiques et les idiomes de la langue, vous pouvez participer à la révision. Votre objectif devrait être d'observer les idiomes et de poser des questions sur les modèles et l'organisation qui n'ont pas de sens pour vous. Cela peut aider à identifier les problèmes, mais uniquement dans le sens où vous pourriez forcer le développeur à défendre ce qu'il a fait. Posez vos questions de manière à laisser de la place à votre manque de connaissances. Notez que cela peut finir par constituer un coût net dans la révision elle-même, mais que ce coût représente un investissement dans vos connaissances.
  • Votre capacité à contribuer jusqu'à ce que vous vous soyez familiarisé avec les fonctionnalités, les idiomes et les normes de la langue sera limitée. Je ne m'attendrais pas à ce que cela change avant que vous n'ayez réellement écrit une quantité importante de code dans la langue.

Considérations spécifiques à Python et exemples

Pour la situation spécifique de ne pas connaître Python, je me méfierais particulièrement de cela. Python a beaucoup d'idiomes et de pratiques standard qui donnent au Python un aspect très différent de ce que vous pourriez attendre dans d'autres langages. (En effet, je pense que les choses soulignées par Python ont amélioré l' apparence de mon code dans d' autres langages, et non l'inverse.) Beyond PEP8 offre un bon exemple de la façon dont vous pourriez manquer complètement à l'état d'esprit que Python encourage.

Regardons un exemple simple. Prenez ce code:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

Voir le problème avec ce code? Si vous n'avez pas travaillé avec Python, probablement pas. Le problème est qu’il existe un style très préféré dans Python qui fait exactement la même chose:

with open('/home/me/something.txt') as f:
    content = f.read()

Ceci est un gestionnaire de contexte. Savez-vous ce qu'ils sont bons? Savez-vous quand il serait approprié d'en utiliser un? Savez-vous quand il serait approprié de créer le vôtre? Non? Dans ce cas, vous n'êtes probablement pas prêt à examiner Python.

Regardons un autre exemple.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

Voir le problème? Le problème est que cette méthode est totalement inutile . Vous devriez probablement simplement utiliser une compréhension en place, lorsque l'opération est aussi simple:

x = range(10)
y = [i + 50 for i in x]

Si vous ne l'avez pas vu, vous n'êtes pas familiarisé avec les fonctionnalités et les idiomes de Python.

jpmc26
la source
1
Dans votre dernier exemple, si je voyais le code final, j'aurais probablement une idée de ce qu'il pourrait faire (sans connaître Python) et je pourrais commencer à me demander si je peux faire quelque chose de similaire dans ma langue préférée, chose que je n'avais jamais envisagée auparavant.
gnasher729
1
@ gnasher729 "En effet, je pense que les choses sur lesquelles Python insiste ont permis à mon code de mieux paraître dans d'autres langues, et non l'inverse." =) La seule chose que je connaisse dans d’autres langues et qui serait même semblable à distance est LINQ de .NET et Stream s de Java 8 . Ruby a peut-être quelque chose et je suis sûr que les langages fonctionnels se rapprochent de quelque chose. Mon point avec l'exemple est que vous ne saurez peut-être même pas le faire si vous n'êtes pas familier avec Python, alors vous ne saurez même pas comment contester la "mauvaise" version.
jpmc26
@x = 1 .. 10; @y = map {$ _ + 50} @x;
pipe
2
La révision de code concerne davantage les erreurs de logique que la mise en œuvre de syntaxe obscure (pour des programmeurs extérieurs) dans un langage particulier. Il s'agit de trouver des bogues logiques, comme d'implémenter un algorithme de manière totalement incorrecte (comme d'utiliser une division quand il devrait être additionné). Le code ne sera donc pas à la hauteur des spécifications. Ce n'est pas important tant que la sortie résultante est correcte. À tout le moins, si vous êtes préoccupé par des optimisations particulières comme celle-ci, une révision du code d'équipe serait encore meilleure.
phyrfox
3
@phyrfox Ce n'est tout simplement pas vrai. Des erreurs de logique peuvent être détectées, mais la révision de code concerne également (ou principalement) les meilleures pratiques, la sécurité, les performances, la fiabilité, la lisibilité / la maintenabilité, etc. La définition de la révision de code par StackExchange est plutôt exacte , imo. En Python, les exemples que j'ai mentionnés ne sont pas de "petites optimisations". Un développeur Python qui n'utilise pas ces modèles est très inexpérimenté, arriéré ou incompétent. Ce sont des éléments de base de la langue.
Jpmc26
21

Ils vous ont peut-être demandé de réviser le code Python précisément parce que vous ne connaissez pas Python . Il existe une théorie de gestion selon laquelle il est utile d'avoir un "imbécile" dans une équipe. Je ne vous traite pas de mauvaise réputation :) L'idée est qu'une équipe puisse souffrir de penser en groupe et développer une vision en tunnel. Une façon de sortir de cette situation est d’inclure dans l’équipe une personne que les autres membres de l’équipe considéreraient comme un «imbécile», c’est-à-dire une personne qui ne connaît pas le sujet. Vous poserez des questions pour vous informer et les questions viendront d'un point de vue que les autres membres de l'équipe n'auraient probablement jamais envisagé.

Vous ne connaissez pas Python, donc ce qui peut sembler ordinaire aux codeurs Python peut sembler étrange pour vous. Vous pourriez suggérer une amélioration que l'équipe n'a jamais envisagée.

utilisateur2023861
la source
1
Ce devait être ma réponse. J'ajouterais simplement que, chaque jour, avec une routine Python donnée et un groupe donné de gourous Python ... ce code est GARBAGE.
Dwoz
Et souvent, le simple fait d'expliquer quelque chose à "un imbécile" provoquera le "Doh!" moment "expert" quand ils réalisent soudain que le code ne fait pas ce qu'il est censé faire, ou manque un cas clé. C'est aussi une manière décente de commencer la diffusion des connaissances.
TripeHound
21

La révision de code ne consiste pas à rechercher des variables avec une orthographe non valide et un formatage incorrect. Si vous utilisez la révision de code pour trouver de telles choses, arrêtez de perdre votre temps et utilisez un outil.

L'examen de code a pour but d'améliorer la conception et de détecter les erreurs courantes d'un programmeur débutant.

Comme je programme en C ++ et que je ne connais pas assez Python, je n’oserais pas passer en revue le code Python. Cependant, je pourrais aider avec une révision du code Java.

Vous n'avez pas indiqué dans quelle langue vous programmez, mais je ne vois pas ce que vous pourriez contribuer à une révision de code, si vous ne connaissez pas la langue dans laquelle il est programmé.

BЈовић
la source
23
Vraiment, vous avez un outil qui peut distinguer les variables mal nommées des bonnes? Je serais vraiment intéressé à en voir un.
Davor Ždralo
1
@ DavorŽdralo D'entrée de jeu, je sais que Java a Checkstyle. Des outils d’analyse statique plus formels sont communs à de nombreuses langues, et leur application impose une norme de codage, ce qui est généralement la moindre de leurs tâches.
Shaz
9
J'ai l'impression qu'il y a un peu de différence entre les définitions de Code Review ici, ça me rappelle un peu cette question sur CR Meta: Qu'est - ce qu'une revue de code? . Je ne voudrais pas exclure quelque chose de spécifique et dire "La révision du code ne concerne PAS XYZ". Il semble également que vous disiez que les programmeurs expérimentés n’ont pas besoin de réviser leur code, ce avec quoi je suis tout à fait en désaccord.
Simon Forsberg
3
@SimonForsberg Ce n'est pas ce que je dis. Même les programmeurs expérimentés peuvent apprendre quelque chose lors d’une bonne revue de code. Mais si les seuls commentaires sont "vous avez mal orthographié une variable ici", ils perdent leur temps.
Février
2
@ BЈовић Nope, ce n'est pas le pire que vous puissiez trouver, mais c'est assez proche de "la plus petite chose trouvée qui en vaille toujours la peine".
Vatine
11

Les révisions de code (en plus de rechercher des failles) constituent une bonne introduction d'un membre de l'équipe à d'autres pour l'ajout ou la modification de code. Si vous êtes un développeur expérimenté , vous devriez être capable de lire suffisamment pour comprendre la plupart du temps ce qui se passe.

Examinez la révision de code du point de vue du chef d’équipe: il y a une personne qui comprend ce que l’application doit faire (logique métier), une personne qui comprend le code (logique d’implémentation) et éventuellement plusieurs autres personnes. là-bas qui ont besoin d'avoir une idée de la façon dont tout cela va ensemble.

Adam Zuckerman
la source
7

Vous ne devriez certainement pas être le seul critique, mais il existe de nombreuses bonnes raisons pour que vous en fassiez partie . Ne pas connaître la langue n'est pas un obstacle pour beaucoup de questions qui nécessitent une réponse dans une révision de code. Par exemple, je suis l'un des 20 principaux répondants du tag C # sur ce site et je n'ai pas encore beaucoup compilé hello world en C #.

Une expertise que vous pouvez partager sans connaître la langue:

  • Connaissance du domaine.
  • Conception générale orientée objet.
  • Pratiques générales de programmation: nommer, clarifier, etc.

C'est aussi un bon moyen de se familiariser avec un nouveau produit. Je viens de rejoindre une nouvelle équipe, où je connais très bien les langues, mais je ne connais pas le domaine. Participer à des revues de code m'a permis de mieux connaître le domaine, même si je n'ai pas encore pu contribuer beaucoup dans ce sens.

Dans votre cas, ce sera un bon moyen d’apprendre les idiomes d’une nouvelle langue, au vu des commentaires laissés par les autres commentateurs. Ce sont des choses très difficiles à apprendre autrement, parce que votre interprète ne se soucie pas de savoir si votre code est pythonique ou non.

Karl Bielefeldt
la source
5

Cela pourrait être une situation gagnant-gagnant. J'irais même jusqu'à dire que vous pourriez être un critique particulièrement utile, car vous êtes une vierge Python qui n'a pas été souillée par la malédiction de la connaissance .

Pensez-y de cette façon: si le code est suffisamment clair pour que même une vierge Python puisse le comprendre, alors il doit s'agir d'un bon code. Les parties que vous avez du mal à comprendre pourraient être retouches ou mieux commentées.

De toute évidence, cela serait également bénéfique pour vous, car vous choisiriez une nouvelle langue au fur et à mesure. (Nous espérons que le code qui vous a été fourni est un bon exemple à suivre.) Cet arrangement devrait fonctionner particulièrement bien pour Python, un langage qui a la réputation d'être un "pseudocode exécutable". Si vous êtes un développeur expérimenté, vous ne devriez pas avoir beaucoup de difficulté à comprendre l'essentiel d'un programme Python.

La mise en garde serait que vous ne devriez pas s'attendre à repérer des bogues provenant de pièges spécifiques à une langue . Mais la recherche de bogues n’est pas le seul objectif des revues de code. Si rien d'autre, vous participeriez au transfert de connaissances simplement en sachant ce qui se passe dans le code de votre collègue.

200_success
la source
2

Une fois, on m'a demandé de vérifier un projet entrepris par un sous-traitant et qui semblait avoir de sérieux problèmes de performance. J'ai assez rapidement constaté que le facteur critique était un seul module Perl. Je n'avais jamais rencontré Perl auparavant et personne dans l'organisation ne le savait, alors j'ai commencé à essayer de le comprendre moi-même. Je n'ai jamais compris les détails, mais il était très clair que l'algorithme utilisé était quadratique en taille de données, ce qui était à l'origine de tous les problèmes. Alors oui, lire du code dans une langue que vous ne comprenez pas bien peut certainement être productif. Le bonus est que vous apprenez de nouveaux trucs à ce sujet.

Michael Kay
la source
1

Quelques observations:

1) Si vous êtes un développeur expérimenté, vous allez acquérir Python (ou au moins autant que vous devez savoir), simplement en travaillant avec. Ce sera un cas d’apprentissage par la pratique. Ce sera difficile au début, mais cela deviendra plus facile à mesure que vous maîtriserez la langue. Considérez cela comme une opportunité d'apprendre une autre langue (les gens apprennent souvent des langues "étrangères" par le biais de "l'immersion")

2) Il existe un certain nombre de personnes de valeur sur les sites de SE qui sont "non techniques", mais maîtrisent la grammaire, les communications et la logique. De telles personnes apportent un "regard neuf" sur les sujets et apportent un certain nombre de corrections "simples" qui ne manquent à personne, car elles sont trop "liées" dans le contenu. Vous êtes probablement consulté pour vos compétences non "techniques" (c'est-à-dire non Python) telles que la logique et la maîtrise de la programmation en général.

Et si vous n'avez pas fait beaucoup de révision de code, presque n'importe quelle expérience de révision de code vous aidera en tant que développeur. Cela semble être un bon compromis entre vos compétences et vos besoins et ceux de l'équipe.

Tom Au
la source
1
Je me demande si la révision du code constitue un "apprentissage par la pratique" de manière significative. Mon expérience de révision est peut-être différente de la vôtre, mais il y a très rarement une écriture de code significative ou substantielle, et presque jamais une exécution.
Nom d'écran ésotérique le
@EsotericScreenName - Je pense que cela dépend du nombre de retours que vous recevez de la part de quelqu'un qui a écrit ou connaît le code. Il est également plus probable que vous soyez dans un domaine dans lequel vous travaillez avec une autre langue, ce qui le rend plus fiable que l'exemple de code typique. La plupart des exemples de codage montrent simplement comment faire de petits bouts d'un virement de bord et sont rarement montrés dans le cadre d'un grand projet.
JeffO
0

Cela dépend de l'objectif de l'examen. c'est-à-dire ce que vous entendez par efficace .

Vous pourrez toujours détecter certains problèmes. Si vous êtes tout ce qu'ils ont à revoir avec et ils espèrent juste que vous jetez un coup d'oeil dessus ça aide et peut attraper quelque chose, alors bien sûr. De nombreux concepts de structure sont similaires entre les langues. L'une est en particulier de pouvoir revoir les commentaires. Il devrait être suffisamment commenté pour qu’un programmeur n’appartenant pas à cette langue particulière puisse néanmoins avoir une bonne idée de ce qui se passe. Sinon, vous pouvez leur dire où leurs commentaires font défaut. Si c'est aussi bien commenté ... alors vous devriez pouvoir revoir un peu leur structure en annotant ce qui se passe plutôt qu'en lisant le code de ce qui se passe.

Mais vous ne détecterez probablement pas beaucoup d'autres problèmes. Par conséquent, s’ils souhaitent que votre examen détermine de manière exhaustive si ce programme est bien conçu / viable, ils seront déçus.

Que ce résultat en vaille la peine ou non, cela dépend largement du projet.

Jimbo Jonny
la source