Como você lida com a compreensão da abstração no código?

15

Ao olhar para uma nova base de código, gosto de começar de uma abordagem de baixo para cima.
Onde compreendo um arquivo e depois passo para a próxima abstração.
Mas muitas vezes me pego esquecendo o que a abstração de nível inferior está fazendo.

Então, estarei nesse ponto em que me encontro em um ciclo quase infinito de voltar aos arquivos que eu já havia compreendido completamente e depois tentar reaprendê-los; enquanto tentava fazer malabarismos com várias outras abstrações que se conectam na minha cabeça.

Existe uma estratégia melhor para lidar com esta situação?

Devo apenas esquecer os detalhes de nível inferior e tomá-los como um dado? Mas, mesmo assim, muitas vezes é necessário um entendimento prévio da abstração de nível inferior para entender o que a abstração atual está fazendo.

John DeBord
fonte
1
Possível duplicata de Como você mergulha em grandes bases de código?
Gnat #
10
Resposta curta: você está começando do lado errado. Uma abordagem de cima para baixo é sempre mais eficiente, pois a cada nível que você desce, você sabe do que se trata, do que significa. Se você começar de baixo, não terá o contexto necessário. Isso dificulta a lembrança, porque você não pode relacionar o que vê a algo significativo. Olhe primeiro para o quadro geral e somente depois de entender isso, aumente o zoom nas partes que você precisa / deseja conhecer.
Martin Maat
Você não precisa se lembrar de tudo na sua cabeça. Você pode usar um pedaço de papel ou um iPad para desenhar diagramas simples para ajudar a lembrar associações e abstrações.
Sul4bh

Respostas:

31

Programar concretamente é o impulso de puxar detalhes em sua direção para que você possa prendê-los todos em um só lugar. Todos nós começamos assim e é difícil desistir.

Programar abstratamente é definitivamente "esquecer os detalhes de nível inferior". Às vezes até detalhes de alto nível. Você afasta os detalhes e deixa que outra coisa lide com eles. O mais sorrateiro é que você tem feito isso o tempo todo. Você realmente entende o que acontece entre tudo print "Hello world"e aparece na sua tela?

A principal coisa a exigir, enquanto você luta para deixar de lado esses detalhes, são bons nomes. Um bom nome garante que você não ficará surpreso ao olhar para dentro. É por isso que você não ficou surpreso ao printcolocar algo na tela e realmente não se importava. foo "Hello world"teria sido uma história diferente.

Além disso, os níveis de abstração devem ser consistentes. Se você está no nível de cálculo de pi, também não deve se preocupar em exibir pi. Esse detalhe vazou para uma abstração onde não pertence.

Detalhes inferiores, superiores ou laterais, que não são a única coisa em que estou pensando neste local, podem desaparecer completamente ou pelo menos se esconder atrás de um bom nome.

Então, se você está realmente lutando para saltar de um arquivo para outro, eu tenho chances de alguém te prender com nomes ruins ou abstrações vazadas.

Corrijo isso lendo com os dedos. Depois de fazer testes decentes em torno dessa bagunça, separo responsabilidades, dou nomes claros que evitam surpresas e mostro a outra pessoa para garantir que não estou vivendo em um mundo de fantasia.

Aparentemente, não estou sozinho quando se trata de trabalhar desta maneira:

Sempre que trabalho em códigos desconhecidos, começo a extrair métodos. Quando faço isso, procuro por pedaços de código que posso nomear - depois extraio. Mesmo que eu acabe delineando os métodos extraídos mais tarde, pelo menos tenho uma maneira de ocultar temporariamente os detalhes para que eu possa ver a estrutura geral.

Michael Feathers - Código Laranja

candied_orange
fonte
12

Na parte inferior, há algumas atualizações de como isso me ocorreu a cada trimestre do ano, acho que são valiosas.

Boa nomeação. Ou, se for o código de outra pessoa, tentar atribuir bons nomes / responsabilidades com base em até mesmo nomes ruins nas classes / funções desse sistema, para que faça sentido na minha cabeça. Depois disso, as implementações de baixo nível tornam-se muito mais fáceis de lembrar.

Isso é tudo o que eu tenho. Existem muitos puristas neste site que juram por Deus que padrões ou objetos de qualquer tipo, mas uma boa nomeação o levará longe. Eu me saí muito bem ao criar código minimamente documentado / bem nomeado / bem dissociado e ele nunca voltou a me incomodar, mesmo que meu código tenha sido usado em muitos lugares, por muitas pessoas, mas o uma coisa que fiz corretamente foi perder muito tempo com boa nomeação, bons comentários e esquemas que explicavam o fluxo do meu código. A implementação de baixo nível é necessária para entender se você deseja expandir meu código de maneira profunda. O código bem escrito pode ser expandido de maneiras razoáveis; portanto, não há problema em alguém ou você não entender / lembrar as implementações de baixo nível.

Se você estiver interessado em um pouco de controvérsia que as pessoas no meu campo original, assim como eu, sabem a verdade, mas, se você ouvir o que está escrito aqui, aprenderá a concordar e discordar desta resposta , leia adiante:


Mas há outra questão em mãos aqui - puristas. Você ouvirá respostas bem fundamentadas e ideologias razoáveis ​​e completamente lógicas; de fato, não há nada errado com elas. Mas você não precisa segui-los, de fato, eles podem estar jogando em sua desvantagem.

Meus amigos trabalharam com grandes sistemas e apenas riram de pessoas que se preocupam um pouco demais com convenções e padrões e, por boas razões, eu também o faria - posso encontrar o meu raciocínio sobre isso no meu principal campo de análise de dados, desde que eu não sou um desenvolvedor tão experiente: a maioria das coisas que você pensa importa, não importa e há uma forte correlação com seu ego nesse sentido.Muitas vezes, um indivíduo, devido ao seu ego, obtém o conhecimento de que ele provavelmente não entendeu devido a seus preconceitos que agora são reforçados pela autoridade que ele acha que disse apenas "a mesma coisa que eu". Esta é uma armadilha muito conhecida na qual você nunca deve cair. Isso não significa que ele não o esteja usando corretamente ou para o bem maior, mas muitas vezes o que essas pessoas farão é prometer que o que quer que estejam dizendo é o prêmio de ouro.

Então o que você pode fazer?

Explique seu código a um colega de trabalho e pergunte se ele faz sentido do ponto de vista de alto nível.

Isso é tudo que importa. É claro que qualquer pessoa que esteja lendo o código de outra pessoa sempre terá uma festa com a tecla Alt para ver a implementação de certas coisas, mas isso não importa, se quem estiver lendo o seu código tiver uma compreensão de alto nível do seu sistema e entender "por que as coisas acontecem" "(novamente, sem necessariamente saber, completamente" como eles acontecem "), então você é de ouro.

Não sou eu que digo em frente e escreva porcaria que não tem desempenho ou que não respeita nada, mas o que estou dizendo é:

1) Não há problema em esquecer. Com o tempo, você ficará melhor na leitura do código com o qual está trabalhando. Se o código que você está lendo exige que você conheça as implementações de baixo nível em um bom nível, ele está mal escrito e é reproduzido no que eu disse antes: um colega de trabalho entende você?

2) O mundo está cheio de muitas pessoas muito inteligentes que não são muito inteligentes. Eles também costumam ser muito emocionais e propensos a reforçar o viés de forças externas. Eles são muito bons no que fazem, mas o que eles, como atores da divulgação de informações esquecem, é: idéias / informações, mesmo que apoiadas pela "lógica", tenham o contexto de quem as envia, o que é crucial para entender se isso é ou não informações são úteis para você também. O que faz sentido para você pode fazer sentido para os outros e eles adorariam, mas as informações não devem ser tomadas como absolutas e uma, novamente, deve-se considerar, ou pelo menos tentar descobrir o contexto de onde veio e verificar as próprio contexto para ver se ele corresponde. É realmente o mesmo que bilionários nos dando esses "pedaços de conhecimento para avançar"

Resumindo: escreva um código compreensível e compreenda que ainda é discutível onde precisamos de tantos padrões / classes e refinarias como alguns dizem. Há pessoas muito inteligentes nos dois lados da discussão e isso deve apenas reforçar a ideia de fazer o que funcionar para sua equipe de uma maneira razoável - não fique preso em pequenos detalhes que não importam, você descobrirá mais tarde, lembre-se, você vive em um mundo extremamente competitivo, onde o tempo é a coisa mais importante:

Tempo no sucesso das startups.

Aloque tempo e recursos de maneira significativa e gananciosa.


Aqui está uma edição, seis meses depois:

Tem sido uma jornada insana. Eu nunca pensei que apenas a separação / boa nomeação e documentação possa basicamente permitir que você conecte e saia da sua base de código. Tive que reescrever um monte de código para atualizá-lo com as novas alterações e fiz uma boa parte dele em 2-3 dias. Posso dizer com segurança que não segui o SOLID em todos os lugares devido à falta de conhecimento, nem às melhores práticas, e posso dizer que eles estão em minha dívida técnica, mas não muito. Separar, nomear bem e documentar, permitirá que você altere o código em um momento em que você finalmente perceber o quão burro você era.

Não me entenda mal: se você escrever seu código firmemente acoplado, sofrerá muito, independentemente de odiar o SOLID, ou mesmo entendê-lo e aplicá-lo em um nível básico permite uma grande dissociação que, honestamente, é a única coisa com que o OOP realmente ajuda. OOP deveria ser também sobre a reutilização de código e enquanto isso acontece aqui e ali, você realmente não pode reutilizar muitos objetos criados, portanto, concentre-se em garantir que seu sistema esteja bem separado. Quando você atingir a maturidade e supor que o tio Bob venha e assuma a liderança em seu projeto, ele dirá "Ok, isso é estúpido, mas pelo menos tudo está separado, bem nomeado e documentado, pelo menos eu sei do que se trata. " (Eu espero). Para mim, funciona. Meu LOC muda constantemente, mas no momento da redação, são 110k linhas de código, 110k linhas de código que funcionam em harmonia para uma única pessoa.


Aqui está uma edição, 3 meses depois, em um código de 8 meses que estou refatorando:

Tudo faz sentido. Agora posso pegar o que escrevi na época, conceitualmente e refazer o código novamente, com novas idéias, porque entendo perfeitamente o que está acontecendo e por que ele funciona devido aos esquemas / boa nomeação e comentários. Eu escrevi um código há muito tempo atrás que não me importo em nomear bem e tal, e é difícil passar por isso. Agora estou pensando qual poderia ser o próximo passo para explicar meu código.

coolpasta
fonte
Boa nomeação. Ponto mais importante. Fácil de fazer para a maioria das pessoas e facilita muito as coisas.
gnasher729