Interpretando o código fonte de outras pessoas [fechado]

9

Nota: Estou ciente desta pergunta. Essa pergunta é um pouco mais específica e aprofundada, no entanto, focando na leitura do código real, em vez de depurá-lo ou perguntar ao autor.

Como aluno de uma aula de ciências da computação de nível introdutório, meus amigos ocasionalmente me pedem para ajudá-los em suas tarefas. Programar é algo de que tenho muito orgulho, por isso estou sempre feliz em agradecer. No entanto, normalmente tenho dificuldade em interpretar o código fonte.

Às vezes, isso se deve a um estilo estranho ou inconsistente, às vezes, devido a requisitos de design estranhos especificados na tarefa, e às vezes, apenas devido à minha estupidez. De qualquer forma, acabo parecendo um idiota olhando para a tela por vários minutos dizendo "Uh ..."

Eu costumo verificar os erros comuns primeiro - ponto e vírgula ou parênteses ausentes, usando vírgulas em vez de operadores extratores, etc.

O problema surge quando isso falha. Geralmente, não consigo avançar com um depurador porque é um erro de sintaxe, e muitas vezes não posso perguntar ao autor porque ele / ela não entende as decisões de design.

Como você normalmente lê o código fonte de outras pessoas? Você lê o código de cima para baixo ou segue cada função como é chamada? Como você sabe quando dizer "Está na hora de refatorar?"

Maxpm
fonte
11
Eu diria: não perca seu tempo com programadores ruins, mesmo enquanto estiver na faculdade ... a menos que você os cobrar por isso. O truque para o sucesso é: pegue os dólares deles enquanto os faz parecer estúpidos.
Job
2
@Job: Bem, todos nós escrevemos códigos ruins quando estávamos começando. Se vale a pena gastar tempo depende se eles querem trabalhar por conta própria e melhorar.
@Job Estou no ensino médio e quero tratar meus amigos adequadamente. Embora eu possa ver a lógica por trás de tratá-lo como uma competição, estou tentando ser uma pessoa melhor.
Maxpm
5
E dessa forma, você realmente elimina a concorrência enquanto é legal com eles. Se você resolver tudo por eles, aprenderá muito e eles ficarão desamparados. (No flipside, eles vão obter um diploma, o que combinado com a falta de meios de conhecimento que provavelmente vai entrar em gestão de imediato :).)
biziclop

Respostas:

22

Primeira dica: use um IDE (ou um editor muito bom :)) para detectar erros de sintaxe, parênteses incorretos e outros erros triviais.

Segunda etapa: Formate automaticamente todo o código em um formato com o qual você se sinta confortável. Você acha que isso não importa muito, mas, surpreendentemente, importa.

Não tenha medo de renomear variáveis ​​locais se elas forem mal nomeadas. (Se você tiver acesso ao sistema completo, poderá renomear qualquer coisa e deverá.)

Adicione comentários a si mesmo quando descobrir o que uma determinada função / método está fazendo.

Seja paciente. Não é fácil entender o código alienígena, mas sempre há um momento de avanço em que a maioria das peças do quebra-cabeça se encaixa de repente. Até esse ponto, tudo é trabalho duro e trabalho árduo, receio. A boa notícia é que, com a prática, esse momento eureka chegará mais cedo.

Biziclop
fonte
Como posso reformatar / renomear enquanto ainda respeito o autor original? Devo deixar comentários dizendo coisas assim // Renamed to ABC for XYZ?
Maxpm
3
@ Maxpm A resposta direta é que você não precisa respeitar o autor original. Código não é uma obra de arte e, se não está funcionando, definitivamente não está. Mas você pode inserir comentários como esse, para que seja mais fácil explicar ao autor original o que você mudou e por quê. O porquê é muito importante, sempre que possível, documenta por que você está fazendo as coisas. É o tipo de comentário mais útil.
precisa saber é o seguinte
6
@ Maxpm - você copia o arquivo de código. Faça o que você quiser e, em seguida, volte e ajude-os a resolver o problema no sistema. Bem, é assim que eu faria.
Erin
@ Maxpm Faça uma cópia do código e execute-o através do astyle ( astyle.sourceforge.net ) primeiro. As pessoas que aprendem a programar raramente têm estilos de codificação consistentes. Ver o código formatado corretamente ajuda muito ao "visualizá-lo" visualmente.
Vitor Py
11
@ Maxpm, copiar e trabalhar no seu sistema é o melhor, mas mesmo que você precise fazer isso na frente deles (como se eles pedissem para você vir e ajudá-lo), se você precisar renomear uma variável, diga a eles que você não escreva, então não saiba o que está fazendo tudo, então você precisa renomear para descobrir.
Dominique McDonnell
20

Posso dizer que acho que você está adotando a abordagem errada com isso. Se as pessoas estão pedindo ajuda para o código, acho que você tem a responsabilidade de se virar e dizer a elas para orientá-lo no código. Você pode corrigir os erros deles, e eles podem aprender algo (de maneira mecânica); se conseguirem detectar seus próprios erros (com a sua ajuda), provavelmente aprenderão mais. Além disso, você ganhará uma experiência mais ampla com a maneira como as pessoas abordam a codificação (o que, por sua vez, permitirá que você leia / compreenda mais códigos) - um ciclo virtuoso ...;)

Nim
fonte
2
por que o voto negativo? isso parece ser uma boa ideia.
Matt Ellen
Concordo. Parece muito estranho.
Michael K
@ Matt ad Michael, drive-by-downvoters, não há muito que você pode fazer eu acho ...
Nim
É uma boa idéia, mas na vida real é mais provável que você receba um código "que era do apoio que foi demitido por assistir pornografia no trabalho escrito há oito anos" e depois, o que, não há ninguém para quem correr. Além disso, qual é o valor real de uma explicação dada por alguém que provavelmente luta com o básico?
precisa saber é
Esta é uma boa resposta. Eles devem ter alguma idéia do que pensam que seu código deve fazer ou pelo menos querer que ele faça.
21411 JeffO
3

Acredito que essa capacidade seja uma mistura de experiência e apenas tenha talento para isso. Tivemos funcionários que poderiam resolver mais ou menos qualquer coisa se lhes pedíssemos para fazer algo do zero, ao mesmo tempo em que eram completamente incapazes de encontrar erros óbvios em partes de código que não escreviam. E, simultaneamente, tivemos funcionários em quem não confiaríamos em nada além do design básico, mas que poderiam mergulhar em outros códigos e rastrear problemas em pouco tempo.

Dito isto, a maneira de abordar isso é alterar o código. Reformate para o que você está acostumado, altere os nomes das variáveis ​​para algo que faça sentido para você, adicione comentários se o código não estiver claro. Se ele pediu ajuda, você deve seguir em frente e mudar as coisas até encontrar o problema. Depois, deixe que seu amigo corrija o código original ou use o seu.

Erik
fonte
+1 - Desenvolver código e rastrear bugs escritos por outras pessoas são 2 habilidades muito diferentes. Os empregadores não apreciam o que têm quando encontram alguém que pode fazer as duas coisas muito bem.
Dunk
2

Primeiro, se houver erros de sintaxe, basta ler os erros do compilador cuidadosamente. Geralmente, uma linha é destacada como um erro, mas na verdade era a linha anterior que possui o erro.

Esteja ciente de que, para um aluno de introdução, pode haver alguns artefatos de edição que impedirão a compilação do programa que não pode ser visualizada. Por exemplo, vi uma vez um aluno (não um dos meus) que usava a barra de espaço em vez de retornar: seu código parecia normal em um editor que envolvia 80 colunas (o aluno era muito paciente), e o código até funcionou até ele adicionar um //comentário no estilo " ", que comentou todo o restante do programa. Da mesma forma, se você copiar amostras de código de um site, muitas vezes também haverá caracteres não imprimíveis (dependendo de como o site formatou o código). Em caso de dúvida, digite novamente uma linha sem copiar e colar. [É meio incrível, mas eu já vi isso acontecer muito mais recentemente.]

Para erros desagradáveis ​​do compilador, talvez você precise aumentar o programa, criando um novo arquivo e digitando todo o código à medida que avança. Certifique-se de compilar após cada etapa principal antes de passar para a próxima.

OK, e se não houver erros de sintaxe? Então é hora de percorrer o código! Você pode usar um depurador para isso, mas fazer chamadas para printftodo o código também é altamente eficaz. Por exemplo, se houver um forloop, adicione uma instrução de impressão para o contador de loop. No caso de forloops aninhados , você pode achar que a variável errada está sendo incrementada.

A vantagem de usar printfs é a capacidade de "compactar" ao longo do tempo / espaço o que você está vendo no momento. Ao avançar com um depurador, você também vê muitos estados irrelevantes e pode ser mais entediante. Além disso, sem ver um histórico do que foi impresso no console, você pode perder alguns padrões. O ponto aqui é que o depurador e o printfs são técnicas complementares, e nem sempre é melhor que o outro.

Por fim, basta perguntar ao seu amigo o que está acontecendo! Em vez de olhar para ele e dizer "uh", pergunte a eles o que estão fazendo: "agora o que nfaz?" Ao iniciar o diálogo, eles podem acabar respondendo sua própria pergunta ou, você pode perceber que a forma como eles conceituaram o programa tinha uma falha, o que pode levar você a uma solução.

Como comentado em outros lugares, tudo isso melhora com a experiência. Mesmo que eu esteja programando há 20 anos, foi nos últimos 5 anos que trabalhei com os alunos que me tornei melhor em ajudá-los com seus erros.

Macneil
fonte
1

Detesto dizer isso, mas não há bala de prata aqui.

Francamente, se eu fosse clarividente o suficiente para entender o que os outros queriam dizer quando escreveram o que fizeram mesmo em 10% dos casos, sem dúvida, eu já teria milhões de milhões.

Em uma nota mais prática, o uso de um IDE inteligente é a etapa 1.

A etapa 2 seria executar doxygen ou algo semelhante para descobrir a hierarquia do código-fonte.

A etapa 3 é descobrir funções ou objetos âncora, coisas que processam sua linha de comando ou arquivo e, em seguida, executam a lógica.

Paralelamente à Etapa 3, acompanhe as globais se você as estiver usando. Pergunte também aos seus parceiros se eles estão usando algum algoritmo específico conhecido - ler o algoritmo (se houver algum) antes de examinar o código é sempre benéfico.

Fanatic23
fonte
1

Em uma palavra: experiência, quanto mais você ganha experiência, mais aprende sobre as melhores práticas e pode julgar / entender o código de outras pessoas. Não vem automaticamente, pelo contrário, geralmente vem apenas de cometer o mesmo erro!

Dito isso, é essencial que os programadores aprendam a comentar seu código corretamente, porque quando você olha para o código, muitas vezes é apenas o resultado de um processo importante de pensamento que geralmente é muito difícil de extrapolar do código. Alguns comentários, um arquivo de texto com idéias de design podem fazer a diferença entre entender o código e entendê-lo completamente.

AndersK
fonte
1

Muitas vezes me perguntavam o mesmo no laboratório da escola. Normalmente, a pergunta começou com "Como corrigir esse erro do compilador?" então eu fiquei muito bom em detectar oscilações else, pontos e vírgulas ausentes e coisas assim. (As macros também são divertidas de depurar - #define CUBE(x) x * x * xé um erro que todos estamos destinados a cometer.) Uma vantagem que tive foi o fato de ter passado pelas mesmas aulas com os mesmos professores, por isso já estava familiarizado com os requisitos.

O processo que eu achei que funcionou melhor é manter um diálogo em execução. Você não deseja escrever o programa para eles, pois eles precisam aprender. Isso significa que você precisa estar no mesmo computador que eles. No laboratório, eu chegava ao computador deles. Eu tentaria levá-los a detectar o erro, começando com a mensagem do compilador. (Estávamos usando C.) Comece com o número da linha e aponte onde a mensagem e o erro correspondem. Se houver mais de um dos mesmos erros, eu perguntaria a eles o que era semelhante sobre os dois erros.

A idéia é ajudar a orientar o outro aluno. Reescrever o código para eles não os ajudará a aprender.

Michael K
fonte
o que há de errado com #define CUBE(x) x * x * xa insegurança de tipo?
Job
Quando chamado como CUBE(3), está tudo bem. Chame-o com CUBE(x + 1)e você obtém o x + 1 * x + 1 * x + 1que em C é avaliado x + (1 * x) + (1 * x) + 1. Isso avalia 3x + 1qual não é x <sup> 3 </sup>! Você o corrige declarando #define CUBE(x) (x) * (x) * (x).
Michael K
0

Erros de sintaxe são muito mais fáceis de encontrar do que erros de lógica. Se a maioria dos problemas deles for de sintaxe, encontre um IDE, copie e cole o código nele e corrija os erros. Erros de lógica são muito mais difíceis. Não sei por que você diz que não pode pedir que expliquem o código deles. Eu encontrei muitos erros lógicos ao explicar o código para outra pessoa.

SnoopDougieDoug
fonte