🧵 Torne a sua vida e a de todos os outros um pouco menos terrível, fazendo com que todos os seus programas imprimam seus arquivos internos como imagens; ✨ um fio ✨
Praticamente todos os programas que escrevo conseguem, de alguma forma, despejar seu estado interno. Se há algo que eu quero que vocês retenham desta discussão, é que vocês podem fazer isso em seus próprios programas. Não precisa ser complicado!
Não me refiro a isso. Você já viu esses diagramas no estilo de lista encadeada, com ponteiros como setas e um pequeno símbolo para NULL e assim por diante. Eles são ótimos quando se fala de uma implementação, mas raramente você precisará deles fora do contexto de estudo. Crédito: Moses Effiong Ekpenyong
Um agradecimento especial à turma de CISC 3130 do Brooklyn College pelo incrível diagrama de uma listlibguides.brooklyn.cuny.edu/cisc3130/linke…onte: https://t.co/VTw0qbKDXA
Subindo um nível de abstração, é útil mostrar o conteúdo de um TAD (Tipo Abstrato de Dados)? Provavelmente não. É melhor mostrar algo que faça mais sentido para o seu programa em seus próprios termos. Às vezes, isso significa mostrar o conteúdo de uma única estrutura de dados; outras vezes, a relação entre duas ou mais.
Eu trabalho bastante com compiladores, mas essa ideia também se aplica a outras áreas. O motivo pelo qual os compiladores têm fases é *porque* existem dados diferentes entre cada fase. Portanto, parece muito natural despejar esses dados. Faça isso simplesmente adicionando uma flag às suas ferramentas de linha de comando! É só isso que você precisa.
Esta é uma estrutura de uma fase inicial em um shell Unix. Meu programa aqui mostra a relação entre uma árvore sintática e uma tabela de símbolos hierárquica, preenchida simultaneamente durante a análise sintática. Espero que você consiga perceber a relação entre elas.
Veja, eu não mostro como eles são armazenados, apenas o que contêm. Isso é apenas o conteúdo, não se refere à implementação dessas estruturas de dados específicas. É o nível de abstração apropriado para depurar outras partes do programa.
Aqui está outra árvore de um programa diferente. Esta é uma representação intermediária (IR) de um compilador C e C++. A menos que você esteja depurando essa parte em si, os detalhes de implementação são apenas ruído.
Essas estruturas podem ficar enormes! Mas mesmo com o zoom afastado, visualizar o formato geral de algo pode ajudar na depuração. Quando você estiver familiarizado... Pela aparência das coisas, você consegue identificar padrões nas mudanças. Nossos cérebros são ótimos para isso!
Sobre a estruturação de programas: A estrutura dos dados deve estar correta. O código é secundário nesse processo. - O código é mais fácil de alterar. O design de dados tem uma maneira de se enraizar em todos os lugares. Por isso, é importante mantê-lo contido em fases (ou módulos, ou o que for).
Para serviços com estado, adicione uma forma de consultar o estado atual via IPC. Faça a renderização fora do seu programa!
Saída em formato gráfico (graphviz), JSON, TSV simples, ou qualquer outro formato que pareça mais adequado aos seus dados. Imprima em um formato *simples*, utilizando ferramentas externas para renderizá-lo.
Só porque você tem um programa, não significa que ele deva ser responsável por tudo isso. Divida as tarefas! Use linguagens diferentes. Eu uso awk. Você usa a linguagem que preferir.
JSON é uma ótima moeda comum entre equipes que usam linguagens diferentes. Se você trabalha em um projeto comercial, use-o como um elemento de integração e ganhe pontos como engenheiro principal que "colabora entre equipes".
Mantenha as cores adequadas para daltônicos e use apenas para fins informativos. Eu gosto da paleta dnature.com/articles/nmeth… https://t.co/XtUlGdalOb
O fluxo de trabalho é importante, tanto para a obtenção de dados quanto para a visualização. Não adianta ter que fazer um monte de coisas para ver o que você acabou de criar, pois isso interrompe o que você está tentando fazer. Na próxima vez, tentarei escrever um pouco sobre isso. Cuide-se e obrigado por ler.











