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?"
fonte
Respostas:
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.
fonte
// Renamed to ABC for XYZ
?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 ...;)
fonte
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.
fonte
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
printf
todo o código também é altamente eficaz. Por exemplo, se houver umfor
loop, adicione uma instrução de impressão para o contador de loop. No caso defor
loops aninhados , você pode achar que a variável errada está sendo incrementada.A vantagem de usar
printf
s é 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
n
faz?" 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.
fonte
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.
fonte
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.
fonte
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.
fonte
#define CUBE(x) x * x * x
a insegurança de tipo?CUBE(3)
, está tudo bem. Chame-o comCUBE(x + 1)
e você obtém ox + 1 * x + 1 * x + 1
que em C é avaliadox + (1 * x) + (1 * x) + 1
. Isso avalia3x + 1
qual não é x <sup> 3 </sup>! Você o corrige declarando#define CUBE(x) (x) * (x) * (x)
.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.
fonte