Como ler milhares de linhas de código sem nenhuma documentação? [fechadas]

12

Anteriormente, eu estava procurando por um bom controle TimeLine para um projeto WPF. Encontrei uma resposta aqui que me direciona para esse projeto CodePlex .

Agora, quero alterar o código para alimentar minhas necessidades de cultura. Mas existem algumas incompatibilidades!

Minha pergunta é:

Como você interage com milhares de linhas de código?

EDITAR:

Qualquer atalho será ótimo!

Jalal
fonte
3
peça por um aumento. sempre ajuda. (eles podem criar um motivador com isso) #
25410 Exibir nome
2
bata a cabeça contra a mesa até que tudo fique claro.
jellyfishtree
19
Como você come um elefante? ... Uma mordida de cada vez.
Bill
1
@Jalal É isso que eles querem que você pense.
Mateen Ulhaq 31/03
2
O @DisplayName, a abordagem da cenoura e da vara da motivação demonstrou ser uma solução ruim para qualquer trabalho que exija habilidade cognitiva rudimentar. A ciência da motivação é mais complexa que o sistema de recompensa. Confira 'Drive: A surpreendente verdade sobre o que nos motiva', de Dan Pink, é uma leitura impressionante. Ou confira este vídeo do you tube para uma versão condensada. youtube.com/watch?v=u6XAPnuFjJc
Ryan Taylor

Respostas:

37

Você adiciona comentários ao código-fonte quando o entende o suficiente para poder fazer isso. Refatorar esses comentários vigorosamente à medida que você entende cada vez mais.

user1249
fonte
3
+1 e uma boa maneira é realmente escrever a documentação enquanto você navega no código-fonte. E por que enviar sua contribuição de volta aos coordenadores de operações?
1
+1 Além disso, se você modificar o código, certifique-se de alterar seus comentários também, para que as gerações futuras não se confundam com o que você fez. É uma pena fazer todo esse documento e fazer com que as pessoas odeiem, porque está errado!
Michael K
1
Se o projeto original estiver em um sistema de controle de origem distribuído (como o git), seria benéfico forçá-lo, confirme suas alterações de forma incremental e faça-o de maneira que você possa opcionalmente mesclar suas alterações posteriormente ao original
8
  1. Percorrer o código
  2. Renomeie conforme necessário
  3. Refatorar conforme necessário
  4. Repita até você entender completamente

... e o código agradecerá por isso. ;-)

John MacIntyre
fonte
7
Alterar lugares aleatórios no código de produção apenas porque é mais fácil, não é uma ideia muito boa. Somente solicitações de recursos devem causar modificação de código; refatorar é uma solicitação de recurso. Não importa o quão bom você seja, quebras de código, efeitos colaterais às vezes estúpidos é o que os clientes contam. Refatorar apenas o código do qual você tem certeza. E lembre-se, mesmo os testes de unidade não garantem nada.
Coder
Concordo, mas a refatoração apenas para experimentar um design pode ajudar a entender por que o código está escrito da maneira que está (ou confirmar que você está certo de que ele foi mal / estranhamente). Você não precisa manter essas mudanças.
Ricky Clarkson
+1 codificador. E essa resposta atualmente nem menciona testes de unidade. Assustador.
MarkJ
Desculpe, não significou grande refatoração. Estava falando mais sobre refatoração menor, coisas do tipo limpeza. Então, eventualmente, você chega ao ponto em que o objetivo do código é óbvio.
precisa
5

Tome uma ação única, depure (de novo e de novo) o código para descobrir como essa ação é realizada. Anote o mesmo em linguagem simples para entender melhor!

Sri Kumar
fonte
Normalmente faço isso também até enfrentar um projeto que não pode ser executado no modo de depuração! Ele sempre falha durante a inicialização! :( Mas ele funciona muito bem no modo de edição: S
Afriza N. Arief
@afriza QUE CARALHO. Esse é um código muito ruim, verifique quais erros ele gera.
Daniel S
@friza, primeira coisa a consertar!
4

Algo que Joel Spolsky escreveu há muito tempo quando em seu blog (não consegue encontrar o artigo agora) realmente ficou comigo em relação a isso:

Ele disse que o código não é uma linguagem humana natural, mas, como programadores, somos facilmente levados a pensar que é e que devemos ser capazes de lê-lo como tal. Conseqüentemente, muitos de nós analisamos o novo código e esperamos poder "lê-lo" e entendê-lo imediatamente, como se fosse um bloco de texto em inglês.

Então, acho que a chave é basicamente ser lenta, metódica e científica. E como outros já disseram - comente (e até refatorar) à medida que avança. Não caia na mentalidade de "Eu deveria apenas olhar e entender imediatamente".

Ah, e sim, eu ainda caio nessa armadilha às vezes. "Faça como eu digo, não como eu faço", e tudo isso. :)

Bobby Tables
fonte
O fato é que o texto em inglês que você pode "apenas ler" geralmente é linear, a razão pela qual o código geralmente é difícil de digerir no início é geralmente porque não é linear e o truque é apenas quebrá-lo. A infinidade de expressões diferentes de implementação usadas pelos desenvolvedores também não ajuda, mas o primeiro estágio geralmente é executar o código por meio de um depurador e usar pontos de interrupção para ver o que é o quê. Tentar apenas ler é um exercício inútil. Sério, quando você leu pela última vez o código que escreveu? (começar a acabar com o que é.)
ocodo
Na verdade, código bem escrito é fácil de ler, mas não como texto. Você apenas digitaliza para ver os blocos de construção e entender a estrutura principal, sem precisar ler tudo. Abordagens de codificação incorretas, como código antigo do skool ou abuso de SOLID e padrões, podem tornar essa tarefa muito difícil.
13/12
4

A SE-Radio entrevistou Dave Thomas sobre esse mesmo assunto

Este episódio de podcast tem muitas dicas e técnicas para entrar na 'cultura' do projeto e entender como os habitantes originais viviam.

Michael Easter
fonte
A parte hilária da experiência de Dave Thomas é que a documentação - além de uma visão geral de alto nível - é (quase) sem exceção pior do que nenhuma documentação. (Na minha experiência, é porque a maioria da documentação é padronizada, fornecendo uma compreensão no nível da superfície do "o quê" ou "como", que, invariavelmente, é deixado desatualizado, a ponto de ser enganoso.)
Michael Kropat,
2

Eu tive que fazer isso recentemente com um projeto de mais de 100.000 LOC. Minha primeira ideia foi que é mais fácil ver padrões de gráficos de 100 ou até 1000 nós do que de 100.000 linhas de texto.

Por isso, passei 45 minutos e escrevi um pequeno programa Python (<100LOC) para analisar o que eu precisava dele e desenhar os relacionamentos dos objetos. Eu criei a fonte Graphviz , que é uma linguagem muito fácil de gerar. (Não há nada de especial em Python aqui: Ruby ou C # ou Common Lisp ou qualquer outra coisa que possa fazer isso da mesma forma.)

Em outros projetos, vi pessoas usarem o Graphviz para dependências de módulos, gráficos de chamada, histórico de versões, todo tipo de coisa. A melhor meta-ferramenta de visualização de programas de todos os tempos.

(Talvez seja porque eu peguei compiladores , mas acho estranho que, quando um programador se depara com um problema, a resposta parece sempre ser "escrever um programa!", Exceto quando o problema envolve o código fonte de um programa. )

user18893
fonte
1

Passe por ele no depurador enquanto ele é executado, é quase a única maneira de entender uma nova base de código grande.

Grrussel
fonte
2
Essa não é uma opção prática quando você tem milhares de linhas de código (especialmente quando falamos de dezenas ou centenas de KLOCs) e / ou se parte desse código está em modelos. Para se familiarizar com uma nova base de código (e mal documentada), é preciso também envolver os negócios e tentar entender o contexto em que o código deve ser executado. Se você pode percorrer o código com um depurador e entendê-lo, essa base de código não era tão grande para começar (tornando o uso de um depurador bastante desnecessário na maioria dos casos.)
luis.espinal
Ai se a base de código for muito grande para depurar em um depurador. Ver o código reagir a uma entrada e saída conhecidas ajuda a transformar o conhecimento de "o que" para "como". A pergunta "por que" nunca é uma que possa ser respondida apenas com um depurador, mas pode haver comentários de fonte embutidos que você pode ver no IDE enquanto depura.
7119 grrussel
@ Grrussel Eu tenho que discordar porque não é o que eu faço ... Eu não tenho idéia se sou representativo ou não! Eu posso ver como usar o ponto de interrupção estranho (mas ainda não explicitamente explicando) e eu uso os recursos do IDE para me permitir relacionar uma parte à outra.
Murph
1

Entenda que realmente não existem atalhos para o preenchimento total. (E se você tiver problemas com essa frase, sua educação foi MUITO negligenciada. É de "Stranger In a Strange Land", de Robert A. Heinlein.)

Leia, uma página de cada vez, uma rotina de cada vez. Adicione comentários. Faça desenhos das principais estruturas de dados. Reconhecer algoritmos. Recorra a conhecimentos anteriores.

Resista à tentação de pôr em marcha o depurador. A janela de exibição do depurador é muito pequena: você vê uma linha de cada vez, mas realmente não vê onde esteve ou para onde está indo.

John R. Strohm
fonte
O depurador explica algumas convenções das convenções do gravador de código original sobre o que é esperado dentro das variáveis ​​(por exemplo, eles esperam Caminho completo ou nome do arquivo ou caminho relativo?) E muitas outras coisas, por isso ainda é importante na minha opinião
Afriza N. Arief
2
-1 por pensar que você é legal porque você usa a palavra "grok"
Carson63000
1

O que quer que você escreva o máximo que puder, para que ninguém acabe na mesma posição que você.

Jon Hopkins
fonte
1

você precisa usar pistas. obtenha uma pista do que você deve procurar e use extensivamente a funcionalidade de pesquisa do seu ambiente ou IDE que pode levá-lo à seção desejada do código em que você precisa fazer alterações.

ler 14 mil linhas de código java não faz nenhum sentido. A funcionalidade de pesquisa é o seu salva-vidas

user18883
fonte
0

Pessoas diferentes têm estilos de aprendizado diferentes, então YMMV. A primeira coisa que faço nessa situação é ler toda a base de código pelo menos uma vez. Isso me dá uma idéia geral de onde está tudo. Depois, escolho uma seção para examinar com mais detalhes. As estruturas de dados seriam um bom lugar para começar. Depois de ter uma idéia geral do que está acontecendo, faço o mesmo com outra parte do código que interage com o primeiro. Após iterações suficientes, tenho uma boa noção de como o código funciona.

Larry Coleman
fonte
0

A melhor maneira, como em toda a programação, não apenas em grandes pedaços de código não comentado, é dividi-lo em pedaços. Isso é algo que você deve fazer na sua cabeça e também visualmente no código. Isso pode significar adicionar grandes comentários em negrito ou várias quebras de linha. Isso ajuda ao rolar para ver as peças. Tente encontrar os pedaços lógicos de código.

É claro que, ao entender os bits, comente-os pelo que sabe naquele momento, possivelmente colocando notas sobre algo que não entende.

Eu também recomendaria não tentar entender a peça inteira desde o início. Em vez disso, tente entender as peças que você precisa conhecer agora e trabalhe no resto mais tarde.

Darryl Hein
fonte
0

Eu começaria usando o Leo Editor no modo @shadow com o uso ativo de nós clonados . Isso permite adicionar notas e comentários para cada seção do código em estudo sem alterar o código , e as anotações sempre estarão em contexto, ao lado do código do qual está falando. Aqui está um exemplo de fluxo de trabalho dos documentos:

Por exemplo, quando eu corrigo um erro no Leo, crio um nó comum para representar o erro. Este nó do bug é minha visão de todos os dados no código-fonte do Leo relacionados ao bug. À medida que descubro o código relacionado ao bug, clono os nós e os movo para o nó do bug. Também adicionarei nós comuns como filhos do nó do bug. Esses nós contêm o relatório de bug original, descrições de como corrigi o bug, dados de teste ou quaisquer outras notas que eu queira manter.

Depois de criar o nó do bug, concentro-me apenas nesse nó e em seus filhos. Eu posso examinar o nó do bug e seus filhos sem ter que pular o contorno. Tudo que eu preciso está em um só lugar. Quando eu resolvo o problema, posso fazer isso alterando os clones. Novamente, não tenho que pular o contorno. Não importa quão grande ou complexa seja toda a estrutura de tópicos: estou lidando apenas com o nó do bug e seus filhos. Esse foco extremamente estreito facilita muito a correção de bugs.

Matt Wilson
fonte
0

Desenhe diagramas da fonte: os relacionamentos de dados, os funcionais, os objetos. Determine a agregação, o fluxo de dados e o código. As imagens são muito melhores que os comentários para isso e podem ser mantidas separadas do código.

Bruce Alderson
fonte
0

Antes de refatorar qualquer coisa, escreva testes. Muitos testes. Testes muito específicos para pequenos blocos de código que são pelo menos chamados, pois dependerão de como sua bagunça herdada for gravada.

A vantagem de escrever testes para começar é que você precisa ter algum tipo de entendimento do código antes de poder testá-lo; portanto, todo teste que você escrever terá um pouco de conhecimento adquirido. Você também pode comentar fortemente os testes com suas suposições ao lado das afirmações.

Ao fazer o teste primeiro, você não corre o risco de alterar algo no código que possui efeitos indiretos que você não conhece. Você também terá uma rede de segurança ao refatorar o código.

chooban
fonte
0

Uso ferramentas como doxygen, para gerar um diagrama geral de classes, que adiciona minha compreensão do que cada uma das classes faz.

Então pego alguns erros fáceis na fila de erros (antes que meu gerente me atribua: P), depois corro essa funcionalidade no depurador e tento gerar um modelo aproximado de fluxo de dados ou de código.

Por exemplo, funcionalidade de exportação em alguns softwares: por isso, tento entender como os dados de origem são lidos, de onde no código (interface base) posso avaliar se os dados são lidos corretamente usando meus diagramas de fluxo de classe e código, pelos quais as classes são responsáveis que tipo de exportação, etc. Acho que metade do entendimento está concluído, depois de ter os diagramas de classes e fluxogramas.

Priyank Bolia
fonte
0

Aborde um defeito trivial, por exemplo, uma NullPointerException. Evite qualquer coisa relacionada à concorrência no início, qualquer coisa que por sua natureza envolva a compreensão de grande parte do código de uma só vez.

Depois de corrigir alguns bugs, você provavelmente terá uma boa ideia. Funciona para mim, de qualquer forma.

Ricky Clarkson
fonte
-2

Basicamente, a ação para escrever um código limpo deve começar desde o design. Se estivermos codificando na linguagem OOP, forneça uma UML, compartilhe com os colegas e fique convencido de que o design não é ambíguo. De qualquer forma, os desenvolvedores devem estar convencidos de que o design resolve o problema e não ambíguos.

Quando se trata de codificação, precisamos garantir que o design seja convertido em código, ou seja, uma entidade para uma classe ou estrutura, uma operação para funcionar etc.

E eu passei por um artigo técnico http://queue.acm.org/detail.cfm?id=2063168 que fala sobre estilo de codificação ou como podemos usar espaço, recuo, variação de fonte, como a maioria dos IDEs que podemos usar para escrever MUITO Código mais limpo, onde nós humanos podemos entender tanto quanto as máquinas. Ele enfatiza mais a criação de código livre de comentários, para que nosso código apareça como parágrafos.

Vasanth
fonte