Executando verificação de segurança...
3

Muito bom! Grafos é uma daquelas coisas que se vc só estudar a parte teórica, vai achar que não serve pra nada, mas vai se surpreender ao ver a quantidade de aplicações práticas.

Já contei aqui um caso em que precisei de grafos:

Tinha um arquivo gigante de dependências, em um formato arbitrário e não padronizado (foi bem antes de inventarem o package.json). E dava problema porque alguém colocou dependências circulares nele. Então eu joguei o arquivo em um grafo, e procurei por ciclos (que também é um algoritmo conhecido de grafos). Claro que usei uma lib pronta, mas se eu não soubesse nem o que são grafos (e se não percebesse que aquele problema no fundo tinha tudo a ver com grafos), não saberia nem por onde começar.

A última frase, aliás, resume bem o que penso sobre toda a parte teórica da computação (que vários "cursos" costumam ignorar e muita gente acha que é inútil): na maioria dos casos vc não vai usar diretamente, mas o ganho indireto no longo prazo é enorme (embora difícil de perceber, por isso há tanta resistência em aprender essa teoria toda). Se eu nem soubesse que grafos existem, iria demorar muito mais pra resolver o problema (capaz até de acabar reinventando a roda e implementando um grafo na mão sem saber).

E isso vale para um monte de problemas de programação que a gente encontra no dia-a-dia. Praticamente tudo já foi resolvido por alguma teoria matemática e possui implementações prontas. Vc só precisa saber que aquilo existe e reconhecer que se encaixa no seu problema. Pra quem acha que matemática é inútil, fica a dica: ela te ajuda a não perder tempo tentando reinventar a roda. Mas como é um ganho indireto e geralmente difícil de perceber, muita gente acha que é inútil, "nunca usei", etc. Vc usa sim, mesmo que ache que não.


Sobre o Git, um site muito bom para entender sobre o DAG é esse. E novamente, é mais um caso em que o uso é indireto: vc não implementa o grafo diretamente, mas se beneficia do conhecimento.

Foi só depois de saber que um repositório do Git é um grafo que eu passei a entender melhor o que cada comando faz. Pois no fundo todos os comandos consultam, percorrem e/ou manipulam o grafo. git log percorre os nós de commit a partir de um inicial, git merge encontra o ancestral comum entre dois ou mais nós (um algoritmo clássico de grafos) e a partir deste verifica as diferenças e mescla-as. E assim por diante. Aliás, o artigo já citado explica em detalhes como o git rebase muda a estrutura do grafo (o que me fez perder o medo de usá-lo, pois agora consigo visualizar exatamente o que está acontecendo).


Enfim, esse é um dos principais ganhos de se saber matemática: a capacidade de criar abstrações e modelos mentais, que podemos transpor para o mundo real, e a partir daí entender como as coisas funcionam (e usá-las melhor), e materializar na forma de código. Pena que a forma como ensinam matemática na escola ignora tudo isso e se foca apenas em decorar fórmulas. Não me admira que a maioria não entenda e ache que é inútil.

Felizmente temos este espaço pra tentar quebrar esse estigma e mostrar que é útil sim.

Carregando publicação patrocinada...
1

Nos outros posts dessa minissérie, acho que o meu melhor aprofundamento foi no post da verificação formal.

Imagina formular um automato finito base que consegue "percorrer todos os casos de uso de um algoritmo" é um nível de sofisticação que nunca ouvi falar antes.

Automato esse, que de certa forma também é uma representação em grafo.

Felizmente temos este espaço pra tentar quebrar esse estigma e mostrar que é útil sim.

É além de útil, a matemática é essencial em qualquer área, mesmo as de humanas.