É eficaz revisar o código no idioma que eu não conheço?

108

Sou um desenvolvedor experiente, mas não fiz muitas revisões de código. Estou sendo solicitado a revisar o código escrito em Python, mas não o conheço.

Faz algum sentido revisar o código em um idioma que eu não conheço?

Heather Smith
fonte
62
Tangencialmente, considere ir para CodeReview.SE e olhar para a tag python. Olhando apenas para a pergunta, considere os conselhos que você daria ao código e verifique se isso está representado nas respostas.
14
Parece uma excelente maneira de aprender mais sobre Python. Questione qualquer coisa que pareça engraçada - alguns deles não entenderão o idioma e outros serão itens legítimos de revisão de código.
Dan Pichelman
9
@RobbieDee Absolutely! Explicar seu código para alguém geralmente vale a pena, mesmo que seja apenas um ursinho de pelúcia .
precisa saber é o seguinte
34
Você diz que está sendo solicitado a fazê-lo. A pessoa que pede que você pense que está executando esta tarefa agregará valor à sua organização. Se você quer saber qual é a natureza desse valor, pergunte a essa pessoa , não a estranhos na internet! Não sabemos o que está acontecendo dentro da cabeça dessa pessoa. Talvez o código seja de qualidade tão baixa que até os novatos possam encontrar problemas. Talvez o código seja de qualidade tão alta que você aprenda bons hábitos com ele. Quem pode dizer? Alguém pensa que é de valor; pergunte a essa pessoa qual é o valor.
Eric Lippert

Respostas:

120

Algum sentido? Sim. Mesmo se você não souber nada sobre a semântica de uma linguagem de programação, ainda poderá ler caracteres e perceber formatação inconsistente, comentários ausentes, identificadores mal escolhidos, duplicação óbvia etc.

Muito sentido ou senso suficiente para pagar o custo do seu tempo ? Não tenho certeza. Isso depende da sua posição, da importância das revisões de código no fluxo de trabalho da sua equipe e de vários outros fatores que não podemos quantificar suficientemente bem.

Kilian Foth
fonte
50
Fazer algumas revisões de código é uma ótima maneira de conhecer um módulo, estrutura ou mesmo idioma, por isso pode valer a pena de qualquer maneira (e talvez você esteja sendo insinuado ...). No entanto, eu não aprovaria essa revisão, não sem que alguém familiarizado com o idioma e o código o analisasse.
Ordous
8
Além disso, se você tem um bom conhecimento de domínio e o código é razoavelmente bem nomeado / comentou você ainda pode manchar / incompreendido / funcionalidade ausente incorreta a um nível elevado (você pode não detectar erros devido a problemas de sintaxe embora)
Dan
4
Como alguém de fora, é mais provável que você encontre erros no poste, ou erros na aplicação da quantidade correta de sinais de igualdade e esse tipo de coisa.
precisa saber é o seguinte
2
As atribuições do @KlaymenDK em contextos booleanos são (pelo menos geralmente) erros de sintaxe no Python. Erros no Fencepost são menos prováveis, já que o Python bem escrito praticamente nunca trabalha diretamente com índices de matriz / lista. (Mesmo quando você o faz, geralmente é com enumerate.) Acho que seu comentário é um ótimo exemplo de por que tentar revisar um idioma com o qual você não está familiarizado deve ser, no máximo, educativo para si mesmo.
Jpmc26
1
@ Makg - eu diria que é para isso que serve o teste automatizado. Mesmo com o conhecimento especializado da linguagem, é difícil dizer se o código realmente atenderá às especificações de design apenas olhando-as / sem executá-las e observando o resultado (a menos que suas especificações de design sejam tão detalhadas que sejam essencialmente códigos em si) . Os aspectos enumerados pela resposta abrangem muitos (embora não todos) motivos válidos para fazer revisões de código. Uma revisão de código geralmente não inclui a execução do código que está sendo revisado.
Aroth
59

Como colaborador regular do Code Review Stack Exchange , encontro muitas perguntas que sofrem de problemas agnósticos de idioma, por exemplo:

  • Formatação, recuo
  • Escopo
  • rotações
  • Operações de tipo

E a lista continua. No entanto, embora não precise conhecer o idioma, ainda posso revisar esses problemas / pontos.

Alguns de nossos principais usuários têm as melhores respostas em idiomas que eles não usam ativamente ou não conhecem. Até dois dos meus dez melhores estão em idiomas que eu não conheço nem posso compilar / executar em minha máquina.

Eu diria que seria o mesmo que revisar o pseudo-código de alguém. Contanto que você possa observar e comentar coisas relevantes para as coisas que entende, você ficará bem e isso será relevante.

Quill
fonte
2
Eu até escrevi uma resposta para um programa PHP. Não é a melhor resposta, mas continuo afirmando que a declaração do loop original é feia.
precisa saber é o seguinte
4
Aprendi C # através de uma combinação de revisão, redação e revisão do que escrevi.
precisa saber é o seguinte
5
Se você não sabe Python, é improvável que você apreciar a importância de recuo na língua ...
Floris
2
Quanto a 2/10 das suas principais respostas estão em idiomas que você não conhece. Quem pode dizer que os eleitores também sabem alguma coisa sobre eles?
Martin Smith
Enquanto eu não sei as línguas, eu ainda fato-verificar as minhas declarações, e se eu errei ... Confie em mim, eu ouvi sobre isso
Quill
44

Conselho Geral

Aqui está a linha de fundo, na minha opinião:

  • Se você não conhece o idioma o suficiente para conhecer os recursos e expressões comuns , provavelmente não contribuirá muito para a revisão.
  • Se você quiser aprender os recursos e os idiomas do idioma, participe da revisão. Seu foco deve ser observar as expressões idiomáticas e fazer perguntas sobre padrões e organização que não fazem sentido para você. Isso pode ajudar a identificar áreas problemáticas, mas apenas no sentido em que você pode forçar o desenvolvedor a defender o que ele fez. Faça suas perguntas de maneira a deixar espaço para sua lacuna no conhecimento. Observe que isso pode acabar sendo um custo líquido na própria revisão, mas esse custo é um investimento em seu conhecimento.
  • Sua capacidade de contribuir até que você se familiarize com os recursos, idiomas e padrões do idioma será limitada. Eu não esperaria que isso mudasse até que você realmente escrevesse uma quantidade significativa de código no idioma.

Considerações e exemplos específicos do Python

Para a situação específica de não conhecer Python, eu ficaria especialmente cauteloso com isso. O Python possui muitas expressões idiomáticas e práticas padrão que acabam fazendo com que o bom Python pareça muito diferente do que você pode esperar em outras linguagens. (De fato, acho que as coisas que o Python enfatiza fizeram meu código parecer melhor em outras linguagens, e não o contrário.) Além do PEP8, há um bom exemplo de como você pode perder completamente a mentalidade que o Python incentiva.

Vejamos um exemplo simples. Pegue este código:

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

Veja o problema com este código? Se você não trabalhou com Python, provavelmente não. O problema é que existe um estilo muito preferido no Python que faz exatamente a mesma coisa:

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

Este é um gerenciador de contexto. Você sabe para que servem? Você sabe quando seria apropriado usar um? Você sabe quando seria apropriado criar o seu próprio? Não? Então você provavelmente não está pronto para revisar o Python.

Vejamos outro exemplo.

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)

Vê o problema? O problema é que esse método é completamente desnecessário . Você provavelmente deve usar apenas uma compreensão, quando a operação for simples:

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

Se você não viu isso, não está familiarizado com os recursos e os idiomas do Python.

jpmc26
fonte
1
No seu último exemplo, se eu visse o código final, provavelmente teria alguma idéia do que ele poderia fazer (sem conhecer o Python) e poderia começar a me perguntar se posso fazer algo semelhante na minha linguagem favorita, que nunca considerei antes.
precisa saber é o seguinte
1
@ gnasher729 "De fato, acho que as coisas que o Python enfatiza fizeram meu código parecer melhor em outras linguagens, e não o contrário." =) A única coisa que conheço em outras linguagens que seria remotamente semelhante é o LINQ do .NET e o Stream s do Java 8 . Ruby pode ter algo, e tenho certeza que linguagens funcionais se aproximam de algo. Meu argumento com o exemplo é que você talvez nem saiba fazer isso se não estiver familiarizado com o Python, portanto, nem saberia desafiar a versão "ruim".
Jpmc26
@x = 1 .. 10; @y = mapa {$ _ + 50} @x;
pipe
2
A revisão de código é mais sobre erros de lógica do que implementar algumas sintaxes obscuras (para programadores externos) em um idioma específico. Trata-se de encontrar bugs lógicos, como implementar um algoritmo completamente incorretamente (como usar divisão quando deveria ser adição). Portanto, o código não estará exatamente dentro das especificações. Isso não é importante desde que a saída resultante esteja correta. No mínimo, se você estiver preocupado com otimizações específicas como essa, uma revisão do código da equipe seria ainda melhor.
Phyrfox
3
@phyrfox Isso simplesmente não é verdade. Erros de lógica podem ser encontrados, mas a revisão de código também é (ou principalmente) sobre as melhores práticas, segurança, desempenho, confiabilidade, legibilidade / manutenção, etc. Antes de algo ser revisado, ele realmente deveria ter sido testado. A definição de revisão de código do StackExchange é bastante clara. No Python, os exemplos que mencionei não são "pequenas otimizações". Um desenvolvedor Python que não usa esses padrões é muito inexperiente, atrasado ou incompetente. Estes são elementos básicos da linguagem.
precisa saber é
21

Eles podem ter solicitado que você reveja o código Python precisamente porque você não conhece o Python . Há uma teoria de gerenciamento de que é útil ter um "tolo" em uma equipe. Não estou lhe chamando um nome ruim :) A idéia é que uma equipe possa sofrer com o pensamento do grupo e desenvolver a visão do túnel. Uma maneira de romper isso é incluir alguém na equipe que os outros membros da equipe considerariam um "tolo", ou seja, alguém que não conhece o assunto. Você fará perguntas para se informar, e as perguntas virão de um ponto de vista que os outros membros da equipe provavelmente nunca consideraram.

Você não conhece o Python; portanto, o que pode parecer comum para os codificadores do Python pode parecer estranho para você. Você pode sugerir uma melhoria que a equipe nunca considerou.

user2023861
fonte
1
Esta seria a minha resposta. Eu apenas acrescentaria que, em qualquer dia com qualquer rotina Python e em qualquer grupo de gurus Python ... esse código é GARBAGE.
Dwoz
E, muitas vezes, o mero ato de explicar algo a um "tolo" provocará o "Doh!" momento de um "especialista" quando, de repente, eles percebem que o código não está fazendo o que deveria, ou perdem algum argumento importante. É também uma maneira decente de iniciar a disseminação do conhecimento.
TripeHound 18/01/16
21

A revisão de código não se refere à pesquisa de variáveis ​​com ortografia inválida e formatação incorreta. Se você usar a revisão de código para encontrar essas coisas, pare de desperdiçar seu tempo e use uma ferramenta.

A revisão de código visa melhorar o design e detectar erros comuns de programadores iniciantes.

Como eu programa em C ++ , e não conheço Python o suficiente, não ousaria revisar o código Python. No entanto, eu poderia ajudar com uma revisão de código Java.

Você não disse em qual idioma programa, mas não vejo o que poderia contribuir em uma revisão de código, se você não souber o idioma em que está programado.

BЈовић
fonte
23
Realmente, você tem uma ferramenta que pode distinguir variáveis ​​mal nomeadas das boas? Eu estaria realmente interessado em ver um.
Davor Ždralo
1
@ DavorŽdralo Fora do bastão, eu sei que Java tem o Checkstyle. Ferramentas de análise estática mais formais são comuns para muitos idiomas, e tê-los a impor um padrão de codificação é normalmente o menor de seus deveres.
Shaz
9
Tenho a sensação de que há um pouco de diferença entre as definições de Revisão de Código aqui, meio que me lembra essa pergunta no CR Meta: O que é uma Revisão de Código? . Eu não excluiria algo específico e diria "A revisão de código NÃO é sobre XYZ". Também parece que você está dizendo que programadores experientes não precisam que seu código seja revisado, algo que eu discordo muito.
Simon Forsberg
3
@SimonForsberg Não é isso que estou dizendo. Mesmo programadores seniores podem aprender algo em uma boa revisão de código. Mas se os únicos comentários são "você digitou incorretamente uma variável aqui" - tipos de comentários, eles estão desperdiçando seu tempo.
BЈовић
2
@ BЈовић Não, não é o pior que você pode encontrar, mas é bem próximo da "menor coisa encontrada que ainda vale a pena".
Vatine 14/01
11

Revisões de código (além de realmente procurar falhas) são uma boa introdução de um membro da equipe para outros no código que está sendo adicionado ou alterado. Se você é um desenvolvedor experiente , deve poder ler o suficiente para entender principalmente o que está acontecendo.

Observe uma revisão de código do ponto de vista de um líder de equipe: existe alguém que entende o que o aplicativo deve fazer (lógica de negócios), existe alguém que entende que o código está fazendo (lógica de implementação) e, possivelmente, várias outras pessoas lá quem precisa ter uma idéia de como tudo isso se encaixa.

Adam Zuckerman
fonte
7

Você definitivamente não deve ser o único revisor, mas há muitas boas razões para você ser um dos revisores. Não conhecer o idioma não é um obstáculo para muitas perguntas que precisam ser respondidas em uma revisão de código. Como exemplo, sou um dos 20 principais respondedores da tag C # deste site e não compilei o hello world em C #.

Alguns conhecimentos que você pode compartilhar sem conhecer o idioma:

  • Conhecimento de domínio.
  • Design geral orientado a objetos.
  • Práticas gerais de programação: nomeação, clareza e assim por diante.

Também é uma boa maneira de acelerar o processo de um novo produto. Acabei de ingressar em uma nova equipe, onde conheço bem os idiomas, mas não conheço o domínio. Participar de análises de código me ajudou a aprender melhor o lado do domínio, mesmo que eu ainda não tenha conseguido contribuir muito nesse sentido.

No seu caso, será uma boa maneira de aprender os idiomas de um novo idioma, conforme você vê os comentários de outros revisores. Esses são os tipos de coisas que são muito difíceis de aprender de outra maneira, porque seu intérprete não se importa se seu código é python ou não.

Karl Bielefeldt
fonte
5

Essa pode ser uma situação em que todos saem ganhando. Eu diria até que você poderia ser um revisor especialmente valioso, porque você é uma virgem Python que não foi contaminada pela Maldição do Conhecimento .

Pense desta maneira: se o código é claro o suficiente para que até uma virgem Python possa entendê-lo, então deve ser um bom código. As partes que você tem problemas para entender podem ser candidatas a retrabalho ou comentar melhor.

Obviamente, também seria benéfico para você, porque você escolheria um novo idioma à medida que avança. (Felizmente, o código que você recebe é um bom exemplo para aprender.) Esse arranjo deve funcionar particularmente bem para o Python, uma linguagem que tem a reputação de ser "pseudocódigo executável". Se você é um desenvolvedor experiente, não deve ter muita dificuldade para entender a essência de um programa Python.

A ressalva seria que você não deveria encontrar bugs decorrentes de truques específicos do idioma . Mas a descoberta de bugs não é o único objetivo das revisões de código. Se nada mais, você estaria participando da transferência de conhecimento simplesmente por estar ciente de que tipo de coisa acontece no código do seu colega.

200_success
fonte
2

Uma vez me pediram para auditar um projeto que estava sendo realizado por um subcontratado e parecia ter sérios problemas de desempenho. Eu rapidamente estabeleci que o fator crítico era um único módulo Perl. Eu nunca havia encontrado Perl antes e não tínhamos ninguém na organização que soubesse disso, então comecei a tentar entender isso sozinho. Nunca cheguei a entender os detalhes, mas ficou muito claro que o algoritmo que ele estava usando era quadrático em tamanho de dados e essa era a causa de todo o problema. Então, sim, ler código em um idioma que você não entende completamente pode definitivamente ser produtivo. O bônus é que você aprende novos truques enquanto faz isso.

Michael Kay
fonte
1

Algumas observações:

1) Se você é um desenvolvedor experiente, escolhe o Python (ou pelo menos o quanto precisa saber), apenas trabalhando com ele. Será um caso de "aprender fazendo". No começo, será difícil, mas ficará mais fácil à medida que você escolhe o idioma. Pense nisso como uma oportunidade de aprender outro idioma (as pessoas geralmente aprendem idiomas "estrangeiros" por meio de "imersão").

2) Existem várias pessoas valiosas nos sites de SE que são "não técnicas", mas que possuem conhecimentos gramaticais, comunicacionais e lógicos. Essas pessoas trazem um "novo olhar" para os assuntos e fazem uma série de correções "desnecessárias" que outras pessoas perdem, porque estão muito "amarradas" no material. Você está sendo consultado, presumivelmente, por suas habilidades não "técnicas" (por exemplo, não Python), como lógica e conhecimento geral de programação.

E se você não fez muita revisão de código, quase qualquer experiência em revisão de código o ajudará como desenvolvedor. Parece uma boa combinação entre suas habilidades e necessidades e as da equipe.

Tom Au
fonte
1
Eu questiono se a revisão do código constitui "aprender fazendo" em um grau significativo. Talvez minha experiência de revisão seja diferente da sua, mas raramente há uma escrita significativa ou substancial do código e quase nunca é executada.
Nome de tela esotérico
@EsotericScreenName - Eu acho que depende de quanto feedback você recebe de alguém que escreveu ou conhece o código. Também é mais provável que esteja em uma área de domínio em que você esteja trabalhando com outro idioma, tornando-o mais relevante do que o exemplo de código típico. A maioria dos exemplos de codificação mostra apenas como fazer pequenos trechos de uma aderência e raramente são mostrados como parte de um grande projeto.
JeffO 13/01
0

Isso depende de qual é o objetivo da revisão; ou seja, o que você quer dizer com eficaz .

Você provavelmente ainda poderá detectar alguns problemas. Se você é tudo o que eles precisam analisar e esperam que você dê uma olhada, ajude alguns e, possivelmente, pegue alguma coisa, então com certeza. Muitos conceitos de estrutura são semelhantes entre as linguagens. Um especialmente é poder revisar os comentários. Deve-se comentar bem o suficiente para que um programador que não seja dessa linguagem em particular ainda possa ter uma boa noção do que está acontecendo. Se não ... então você pode dizer a eles onde seus comentários estão faltando. Se for tão bem comentado ... você poderá revisar um pouco de sua estrutura apenas através das anotações do que está acontecendo, em vez de realmente ler o código do que está acontecendo.

Mas você provavelmente não detectará muitos outros problemas. Portanto, se eles pretenderem que sua análise seja uma determinação exaustiva de se esse é um programa bem-feito / viável, eles ficarão desapontados.

Se esse resultado vale ou não o tempo de execução, depende muito do projeto.

Jimbo Jonny
fonte