Eu me formei na universidade há cerca de cinco meses e tenho trabalhado em uma startup local nos últimos quatro meses. Enquanto estava na universidade, estudei Haskell, F # etc sozinho. Fomos ensinados Java na universidade, mas eu fui exposto à programação funcional muito em breve e passamos muito mais tempo com ele do que com programação imperativa. Como resultado, meu cérebro está preparado para um pensamento funcional. A empresa na qual ingressou usa Python, e o código é altamente imperativo. Estou com dificuldades para ler o código imperativo. Não consigo acompanhar as mutações. Quando um aninhamento for-if-else-for -... tem mais de quatro níveis de profundidade, perco completamente a noção do que está acontecendo no código. Para adicionar, Python é uma linguagem dinâmica, portanto, não há tipos no código. Isto' Faz semanas que eu tenho tentado entender uma parte da nossa base de código (que é supostamente 'moderadamente complexa'), mas eu não fiz nenhum progresso apreciável até agora. Por favor, me ofereça algumas técnicas práticas sobre como devo entender esse código. Desde já, obrigado!
Edit:
Talvez eu deva mencionar também que não existem muitos comentários no código, e os nomes também não são muito intuitivos.
fonte
Respostas:
Compreender o código legado é difícil. Não tem quase nada a ver com funcional versus processual.
Crie um mapa de algum tipo. Um diagrama de componentes dos pacotes e módulos do Python. Para cada módulo, você precisará criar diagramas de classes.
Use o intérprete Python. Você deve poder importar módulos, criar objetos e exercitá-los interativamente. É por isso que o Python é popular. Você pode imprimir
type(x)
para ver que tipo de variável ( x ) realmente é.Em caso de dúvida, leia o código do teste de unidade. Se não houver código de teste de unidade, você terá problemas grandes e iminentes, além de aprender uma nova base de código.
Anote as coisas. Comece com documentos paralelos. Então, quando você achar que sabe o que está acontecendo, adicione comentários de sequência de caracteres às funções, métodos e classes. Adicione-os cedo e frequentemente.
Use o Sphinx com 'autodoc' para coletar o que você está aprendendo.
A parte mais importante é essa. É difícil manter as coisas na sua cabeça. É mais fácil manter as coisas nos arquivos de documentação.
fonte
Espere ... alguém perde completamente o controle do código com níveis tão profundos de aninhamento. Ou como Linus Torvalds coloca:
Se você precisar de mais de três níveis de indentação, você está ferrado de qualquer maneira e deve corrigir seu programa.
Isso não soa como se sua empresa estivesse seguindo as práticas recomendadas comuns.
Se eu fosse você, tentaria entender a base de código por disciplina e força. Apenas entre nela, de novo e de novo e de novo. Provavelmente é como qualquer coisa. No momento, você sente que está embaixo da água e não consegue respirar, mas continua examinando a base de código e logo vai nadar até a superfície.
Receio que sua pergunta não tenha os detalhes técnicos para oferecer um bom conselho sobre como entender a base de código, mas nunca é errado analisá-la com colegas experientes em algumas sessões. Deixe-os explicar a arquitetura geral e como os diferentes componentes interagem entre si, juntamente com as decisões de implementação que eles tomaram.
É difícil dar conselhos gerais para a transição de linguagens funcionais para linguagens imperativas / OO. Claro, eu poderia mencionar algumas frases floridas como "Você precisa pensar em estados e comportamentos de objetos", mas isso não ajudará muito, acho que isso é algo que você precisa experimentar.
fonte
Se (grande se pelas práticas inadequadas que você descreve) houver testes de unidade, você poderá ver como o código é testado. Isso pode oferecer uma boa idéia do que o código faz.
Caso contrário, eu sugeriria a leitura de código python mais genérico para se acostumar com a maneira como ele é escrito.
fonte
Você pode tentar traduzir alguns fragmentos do Python para pseudo-Haskell ou o que quiser. Isso pode lhe dar uma idéia do que construções imperativas mapeiam livremente em quais construções funcionais. À medida que você ganha mais experiência, as construções imperativas começam a parecer mais nativas.
Passei da programação OCaml e Haskell para a programação Java e Python, e minha experiência é que a programação imperativa não é um salto tão grande quanto a digitação dinâmica, que até hoje parece estranha.
fonte
Sugiro que você coloque pontos de interrupção e comece a usar o comando Avançar (como se estivesse depurando), isso ajudará você a entender o fluxo (provavelmente em ramificações, existem caminhos com maior probabilidade de serem seguidos, naqueles que você deve se concentrar para obter a ideia geral do código).
(Eu tive bons resultados com o Eclipse, juntamente com o PyDev como plugin do Eclipse)
fonte