Como revisar o código que você não entende?

25

Foi-me dado o papel de melhorar o desenvolvimento em nossa empresa. A primeira coisa que eu queria começar foram as revisões de código, pois isso nunca foi feito aqui antes.

Existem 3 programadores em nossa empresa. Sou programador da Web, minhas linguagens conhecidas são principalmente PHP, ActionScript e JavaScript. Os outros 2 desenvolvedores escrevem aplicativos internos no VB.net

Estamos fazendo revisões de código há algumas semanas. Acho difícil entender o código VB. Então, quando eles dizem o que está fazendo, na maioria das vezes eu só preciso acreditar na palavra deles.

Se eu vir algo que parece errado, explico minha opinião e como abordaria isso em um dos idiomas que conheço.

Às vezes, minhas sugestões são bem-vindas, mas muitas vezes me dizem coisas como "essa é a melhor maneira de fazer isso neste idioma" ou "que não se aplica a esse idioma" ou coisas semelhantes dessa natureza.

Isso pode ser verdade, mas sem conhecer o idioma, não sei como confirmar ou refutar essas reivindicações.

Eu sei que uma solução possível seria aprender vb para que eu possa fazer melhores revisões de código. Eu realmente não tenho interesse em aprender vb (especialmente porque tenho uma lista de outras tecnologias que estou tentando aprender para meus próprios projetos) e gostaria de manter isso como último recurso, mas é uma opção.

Outra idéia que me veio é que ambos têm interesse em C # e eu também. É relativo a eles porque é .net e relativo a mim porque é mais parecido com os idiomas que conheço. No entanto, é novo para todos nós. Pensei nos benefícios de todos nós colaborarmos em um projeto C # .net para animais de estimação e revisar o código um do outro.

Eu acho que também há a possibilidade de contratar um consultor para entrar e nos dar algumas revisões de código.

O que você recomendaria que eu fiz nesta situação.

JD Isaacks
fonte
6
você acha difícil entender o código VB? você tem certeza? deixe-me perguntar novamente, você tem certeza! :)
Darknight
4
Você não tem interesse em aprender VB? Então você provavelmente deve recusar a tarefa de executar revisões de código do código VB!
JacquesB

Respostas:

22

Seus desejos pessoais de aprender outras coisas devem ficar em segundo plano para aprender o que você realmente precisa agora para o seu trabalho. Aprenda VB.net. Você pode codificar efetivamente o código de revisão que não entende quando conhece o idioma em que está fazendo, fazendo muitas perguntas (geralmente é um sinal de que o código não está bem escrito se você conhece o idioma e não consegue descobrir o que está fazendo e porque). Mas, não entendendo o código, o melhor que você pode fazer é que eles o expliquem e espero que eles vejam algum erro no processo de explicação. Não que eu não tenha encontrado bugs no meu próprio código em uma revisão fazendo exatamente isso, mas não é a maneira mais eficaz de revisar o código. A revisão de código agora faz parte do seu trabalho, lide com ele e aprenda o que você precisa aprender para fazer isso de maneira eficaz.

Enquanto você estiver aprendendo, quando eles disserem que não é dessa maneira que fazemos neste idioma, faça com que eles mostrem uma fonte que diz que é uma boa técnica para usar. Cabe a eles justificar a você em uma revisão de código e não o contrário. Você também ficará melhor no idioma assim que começar a ver esses links.

HLGEM
fonte
5
+1 Para aprender o que você precisa aprender e não o que deseja aprender. De preferência, aprenda os dois - aprender idiomas é algo rápido.
Orbling 5/01/11
1
+1: Com relação a "fazê-los mostrar a você", a maneira mais gentil é perguntar se eles têm alguns livros ou mais onde esses princípios são explicados, para que você possa aprender também. É o mesmo, apenas menos agressivo. E as pessoas não gostam de ser atacadas.
Joris Meys
@Joris Meys, sim, você pode e deve fazê-lo educadamente, mas eles precisam ser pressionados para responder antes que você possa certificar que o código passa se eles voltarem a usar "porque eu disse".
HLGEM
1
@ Jeff O: Não considero a educação sempre um privilégio. Em um ambiente de trabalho, também é uma ferramenta importante para obter o que você deseja. Ou para passar uma mensagem de uma maneira difícil de combater. Ninguém pode chamar-lhe nomes para ser educado ...
Joris Meys
1
@ Jeff O, ser educado não significa ser um capacho. Significa perguntar de maneira profissional em tom neutro. Você pode insistir em uma resposta sem ser rude. A grosseria nunca é apropriada no local de trabalho. Você sempre terá que trabalhar com pessoas de quem não gosta ou que o deixam com raiva, mas nunca é apropriado se comportar mal com elas. Quando você o faz, a pessoa principal que você está machucando é você mesma, porque os outros perderão o respeito por você.
HLGEM
13

Na verdade, eu discordo de tudo isso. Com JS / PHP / ActiopnScript, você tem uma compreensão fundamental do que uma linguagem de programação possui e como ela funciona. De fato, eu argumentaria que existem muitas semelhanças entre VB e JS. No entanto, esse não é o meu ponto. Mesmo se você é muito competente com o idioma, é fácil ignorar algo ao tentar seguir os processos de pensamento de outra pessoa. Portanto, o que a revisão deve fazer é fornecer uma oportunidade para o programador explicar o que ele fez e por que.

Certa vez, um amigo descreveu isso como "A Teoria do Zelador": explicando os detalhes a alguém, qualquer um, até o zelador, o programador expõe para si próprio quaisquer pontos fracos do código, o que é, obviamente, o objetivo final da revisão. processo. Requer, no entanto, que o código seja explicado minuciosamente e abertamente (as revisões não funcionam quando os desenvolvedores estão na defensiva).

fishywiki
fonte
4
+1 Para a Teoria do Zelador - o que eu costumo chamar de "caixa de ressonância", qualquer pessoa que possa ouvir e fazer perguntas é boa, mesmo que apenas permaneça ali, isso ajuda.
Orbling 5/01/11
1
A chave é manter todos conversando e trabalhando juntos. Não coloque sua equipe na defensiva - nada prejudicará a produtividade mais rapidamente do que todos que trabalham para si.
precisa saber é o seguinte
7

A versão curta

  1. Lembre-se de que as revisões de código são uma chance para o revisor e o revisor aprenderem.
  2. Feedback de frase como uma pergunta.
  3. Não deixe que a falta de conhecimento o impeça de fornecer feedback (desde que você esteja fazendo o nº 2).
  4. Evite "revisões de preferências" ou, pelo menos, tente deixar claro que são suas próprias preferências pessoais e que não precisam necessariamente concordar.
  5. Tente enviar patches em vez de ser um "revisor de códigos de poltrona".

A versão mais longa

Antes de tudo, lembre-se de que a revisão de código não é apenas uma oportunidade para o revisor aprender. Também é uma oportunidade para o revisor aprender também. De fato, ouvi falar de várias organizações que fazem com que novos programadores comecem a fazer revisões de código para que possam ter uma ideia do código.

Com isso em mente, há um conselho de revisão de código que sempre achei útil em geral, mas é especialmente pertinente em sua posição. Expresse seus comentários na forma de uma pergunta e não como uma declaração. Em outras palavras, em vez de dizer "Este código é péssimo!", Você pode dizer "Por que você escreveu o código dessa maneira em vez de fazer ..." Isso torna o processo de revisão de código mais agradável e permite que você aprenda também.

Outro conselho que tenho para você é não deixar que sua falta de conhecimento o faça recuar. Se você vir algo que considera errado e receber uma resposta ondulatória do revisor, não recue (pelo menos não por falta de conhecimento). Lembre-se de que o que torna um bom código em um idioma raramente é diferente do que torna um bom código em outro idioma. Sim, certos idiomas têm idiomas diferentes para ajudá-lo a escrever um bom código. Mas é importante perceber que esses idiomas são ferramentas e não fins em si mesmos.

Em seguida, tente evitar fazer "revisões de preferências". Isso é algo que eu (e muitos outros) temos que fazer um esforço muito consciente. Em outras palavras, tente evitar fazer revisões semelhantes às de "Você fez x , mas eu prefiro y ". Agora, não há nada de errado em declarar preferências, mas você deve identificá-las claramente como tais e anotar que a outra parte é livre para discordar. Isso é importante, porque a maioria das coisas diferentes de idioma para idioma se enquadra nessa categoria.

Por fim, vocês usam um sistema de controle de versão distribuído? Uma coisa que pode ajudar é se, em vez de apenas observar o que há de errado com o código, você pode reescrever o código como o teria escrito, testá-lo e depois enviar um patch para ele. Isso ajuda a mostrar que você está realmente interessado em melhorar o código deles e não apenas em ser um "revisor de códigos de poltrona" e oferece a chance de aprender melhor o idioma. Além disso, geralmente é mais fácil discordar de "Eu acho que você deve fazer isso" do que "Aqui está como eu teria feito isso, e aqui está um patch, se você concordar". Suponho que você não precise necessariamente de um DVCS para isso, mas certamente ajuda.

Jason Baker
fonte
Sobre as "preferências": imagine que eu escrevi o código, você o revisou e tive que alterá-lo por causa de suas preferências. Agora você faz uma pequena alteração, eu reviso e faço você mudar tudo de volta por causa das minhas preferências. Deveria ser óbvio que isso é um absurdo extremo.
precisa saber é o seguinte
7

Você perdeu o foco no problema e encontrou uma solução ruim. Você recebeu a tarefa de melhorar o desenvolvimento e sua solução é colocar uma pessoa encarregada da revisão do código (você mesmo) que não entende o idioma. Quem está revisando seu código? Por que eles não podem se rever até você aprender o idioma?

Tem que haver alguma outra área problemática que poderia ter selecionado para obter uma melhoria mais imediata. Dessa forma, eles apenas sopram fumaça para você e nada melhora.

Direcionar o novo desenvolvimento para um idioma que nenhum de vocês entenda (C #) levará muito tempo para valer a pena, especialmente se todos trouxerem seus maus hábitos.

Foco no design (Isso já foi mencionado.). Se eles estiverem com dificuldades para manter o código atual, consulte algumas ferramentas de refatoração para o VB. Muitas das práticas básicas são as mesmas.

JeffO
fonte
5

Você pode ' revisar ' coisas que realmente não conhece, mas não pode revisá- las adequadamente . Sou altamente competente em C, conheço C ++ muito bem, mas não sonharia em revisar algo em C #.

Eu não acho que você precise ir até um consultor, pois algumas empresas se especializam em executar seu código em uma tonelada de testes e dizer o que pode estar errado com ele.

Ainda assim, caberia ao desenvolvedor individual que conhece o idioma interpretar o resultado. Por exemplo, se um revisor de código me desafiava por não usar o valor de retorno printf(), eu os olhava estranhamente e questionava sua sobriedade, e perguntava "Ok, ótimo, o que posso fazer quando nada puder ser impresso no console que seja útil?"

O que você pode querer considerar é conversar com seus chefes sobre a criação de departamentos e líderes de equipe, para que você possa ser eficaz em seu domínio, enquanto outra pessoa é eficaz em seu domínio.

Ainda assim, acho que você poderá usar terceiros para auditoria. A maioria dos programadores que se preocupam com isso prestará atenção a preocupações legítimas , mesmo que descartem a metade como falsas (como eu faria no meu printf()exemplo).

Tim Post
fonte
4

Fornecer orientação sobre algo que você não entende é semelhante ao cego que lidera o cego, pois sabe bem.

Uma abordagem seria fazer uso de ferramentas de fiapos, como FxCop e StyleCop, que abordarão a análise estática da frente da base de código. Isso forneceria um ponto de partida para debater os relatórios gerados a partir das ferramentas.

Outra abordagem seria transformar as revisões de código em revisões de design. As revisões de design com mais frequência não revelam problemas muito antes do código ser escrito. Se um programador tem um design, ele pode trabalhar com ele, em geral, é muito mais eficiente em sua abordagem e os bugs diminuem por causa disso. Quando um design não existe, ele se torna adhoc na abordagem e o código sofre com o aumento da contagem de erros. Capture os problemas na revisão de design antes que eles apareçam na revisão de código, garantindo que cada um de vocês tenha um design concreto para implementar; A UML é sua amiga aqui e ferramentas como umlet são rápidas e rápidas de usar.

Aaron McIver
fonte
4

A má notícia é que, para participar efetivamente das revisões de código, você precisará aprender o VB. Também será útil usar o VB em algum tipo de projeto (não necessariamente para produção).

A boa notícia é que, depois de fazer isso, parte do que você aprendeu ainda será útil quando você passar para o C #.

Larry Coleman
fonte
9
Ler VB não é o mesmo que Saber VB. Eu li o VB bem o suficiente para reescrever o código VB antigo em Java. Eu não (e não posso) escrever VB. Eu acho que há um meio termo de aprender VB suficiente .
S.Lott
1
@ S.Lott - bem articulado e bastante aplicável a quaisquer dois idiomas aleatórios.
Tim Post
2
@ S. Lott: Se você pode ler VB bem o suficiente para reescrevê-lo em Java, então você não sabe VB, e pode escrevê-lo. Você pode ter que procurar as coisas à medida que avança, mas isso duraria apenas algumas semanas.
Larry Coleman
@ Larry Coleman: Acho que você conhece bem o VB. Eu não pude escrever. Sério. Sou um programador Python / Java e as limitações e estranhezas do VB me confundem. Muito. Eu não estaria apenas procurando sintaxe. Eu seria muito incapaz de escrever programas adequados, porque simplesmente não penso assim.
S.Lott 5/01
@ S.Lott: Conheço VB muito bem, apesar dos meus melhores esforços para esquecer. Se a estranheza / limitações do VB são confusas para você, isso também não causaria problemas ao transferir código para outro idioma?
Larry Coleman
3

O pensamento que você deve manter o tempo todo ao fazer a revisão por pares é:

"EU SOU O PRÓXIMO A MANTER ESTE CÓDIGO!"

Você deve entendê-lo bem o suficiente para poder fazer isso como parte de sua preparação para a revisão, e seu trabalho é conscientizar o programador original de quaisquer deficiências que o tornem mais complicado do que o necessário para entender o código bem o suficiente para mantê-lo .

Se você não pode programar no VB, não pode manter o código e não está qualificado para ser o revisor de pares.


fonte
1

Você não deve revisar o código que não entende, o que apenas irritará os desenvolvedores que precisam explicar tudo o que eles fizeram.

O que você pode fazer, escolher / definir diretrizes de codificação e comparar o código com essas diretrizes. Quando algo não está em conformidade com as diretrizes, você pode pedir explicações ao desenvolvedor.

Eu começaria escolhendo as diretrizes existentes (não conheço nenhum padrão de codificação do VB.net, mas o google me deu:

Use stylecop como ferramentas para VB .net

Analise as fontes com o NDepend (ele possui regras sobre complexidade ciclomática, comprimentos, profundidades, etc.)

Quando você faz isso, pode dizer que o código está em conformidade com os padrões escolhidos, não diz nada sobre a funcionalidade estar correta ou sobre o código usando os princípios de OOP adequados. Mas pelo menos é alguma coisa.

KeesDijk
fonte
1

Uma boa revisão de código é sobre coisas que exigem que você entenda o idioma - uso apropriado da linguagem, APIs e bibliotecas, estilo, nomes de variáveis ​​etc. - e sobre o quão bem o código resolve o problema - bons comentários, arquitetura adequada, design relevante padrões, considera todos os casos de erro etc. Quando você começa a fazer revisões de código, tende a se concentrar nas primeiras. Eles são mais fáceis de ver e mais fáceis de escolher. (por exemplo, não gosto dos nomes de suas variáveis. Você deve usar nomes de estilo XXXX.)

A revisão de código se torna mais valiosa quando há mais foco em como o código resolve problemas. Como você não pode fornecer tanto valor na primeira área agora, concentre-se em fazer perguntas e oferecer conselhos sobre a solução para o problema, não sobre como ele é feito.

Claro que há sobreposição entre os dois. Saber que o VB.NET permitiria fornecer conselhos sobre por que um determinado padrão de design não é uma boa escolha em uma situação específica, por exemplo.

Acima de tudo, seja humilde nesta fase. Processo de mudança é difícil. Mesmo se você fosse um guru do VB.NET, a mudança provavelmente não seria fácil. As pessoas que não usaram a revisão de código não gostam disso inicialmente. Fazer com que outras pessoas analisem seu código é uma experiência difícil. Leva tempo para ver o valor e a paciência ao redor. É um ótimo processo quando você recebe buy-in, mas isso leva tempo.

Wayne Johnston
fonte
0

Você poderia mudar o foco para se concentrar mais nos testes, em vez de olhar diretamente para o código? Não estou dizendo para abandonar as revisões de código, mas, inicialmente, pode fazer mais sentido fazer com que os aplicativos internos tenham testes suficientes que podem ajudar a decodificar parte do que está acontecendo. A idéia aqui é que os testes também podem ajudar você a se familiarizar um pouco com algumas das funcionalidades. Eu apenas vejo isso como uma rota diferente a seguir. A idéia aqui é que as revisões retornem mais tarde e possam ser feitas em algumas partes, pois pode valer a pena ter uma visão geral / sessão inicial e, em seguida, um pouco de pausa. Essa pausa ocorre até o dia seguinte ou dois, para que haja tempo suficiente para qualquer pessoa que queira dormir uma noite pensando no código ou algo semelhante antes de voltar com perguntas e ter uma discussão.

Obviamente, se você já tem testes, isso não é tão significativo, infelizmente. O outro pensamento é dar um exemplo de onde eles estão reivindicando que no VB.Net isso é feito de uma maneira específica, pois isso pode ajudar a tornar essa questão mais clara de uma maneira que eu poderia imaginar, variando de pequenos padrões de código a parte do o coração de como o VB.Net foi construído em certo sentido.

JB King
fonte
0

Mesmo que você aprenda o básico do VB, executar uma revisão de código sem conhecer todos os recursos do idioma não permitirá detectar o uso de recursos inseguros no idioma.

Suponha que você não sabia que a função input () no Python 2 realmente avaliou a entrada antes de retorná-la, para facilitar a análise de tipos de entrada que não sejam de seqüência de caracteres. Em seguida, o código ficaria vulnerável à execução arbitrária de códigos, permitindo que o usuário insira algo como __import__('os').execl('/bin/sh', '/bin/sh')em um sistema Linux para transformar o processo Python em um shell. Em vez disso, raw_input () deve ser usado para obter os dados de entrada não processados.

Tentar executar uma revisão de código sem estar ciente de todos os recursos do idioma não só poderia impedir que você percebesse uma maneira melhor de executar um determinado procedimento no idioma; isso também pode levar a falhas de segurança prejudiciais.

Arcano
fonte