Apenas como curiosidade, eu já precisei usar grafos - um assunto que eu vi na faculdade e nunca imaginei que fosse usar - pra resolver um problema real.
Tinha um arquivo gigante de configuração, que listava trocentas dependências (A depende de B, que depende de C, etc) e dava erro porque tinha uma dependência circular (A depende de B, que depende de C, etc… que depende de A). Sem mais detalhes, mas era um formato arcaico de uma versão antiga de um software, para o qual não tinham ferramentas automatizadas para detectar esse tipo de problema (como hoje tem para o Maven ou para o Node, por exemplo).
Então o que eu fiz foi ler esse arquivo e gerar um grafo das dependências, e usar um algoritmo de detecção de ciclos para saber onde estava o problema.
Claro que não fiz tudo do zero, busquei por uma biblioteca de grafos já pronta e fiz copy-paste pesquisei sobre detalhes do algoritmo, que eu não lembrava direito. Ou seja, eu não lembrava todos os detalhes de cabeça, mas como eu já tinha visto o assunto na faculdade (eu lembrava o que era, pra que servia, etc), eu pelo menos sabia o que pesquisar (grafos, ciclos, etc) e tinha um ponto de partida. Se eu nem soubesse que isso existia, eu não conseguiria sequer começar (e provavelmente teria que verificar o arquivo gigante na mão, demorando muito mais).
Obviamente grafos são usados em muitas outras coisas na vida real, mas não quer dizer que você só vai usar se trabalhar diretamente com essas coisas. Tem problemas mais “mundanos” para os quais eles podem ser uma boa solução (como esse que eu mencionei acima). Talvez tivesse outra solução sem grafos? Talvez sim, mas o fato é que saber que isso existe aumentou meu leque de opções. E mesmo que você não vá mexer diretamente com grafos, pode estar usando indiretamente sem saber.
Um repositório do Git, por exemplo, é implementando como um grande grafo. Mesmo que você não vá mexer no código fonte do Git, saber pelo menos o que é um grafo me ajudou a entender melhor como usá-lo. Aliás, depois que descobri que no fundo um repositório do Git é um grafo, vários comandos (como o rebase
) passaram a fazer muito mais sentido pra mim. E o entendimento da ferramenta como um todo também melhorou bastante (aliás, se quer saber mais, leia o artigo em questão, é esclarecedor).
E claro, não é só de grafos que estamos falando, tem uma série de assuntos importantes, mas que infelizmente muitos tacham de “teoria chata/inútil”. Por exemplo, complexidade de algoritmos e estruturas de dados. É algo tão fundamental para programação, mas que muita gente nem se liga. E aí você vê gente usando a mesma estrutura (lista/array ou map/dicionário) pra tudo, mesmo quando não é a melhor opção. E fazem algoritmos quadráticos quando poderiam ser lineares, mas quase nunca percebem porque para poucos dados, tudo é rápido (mas na hora de rodar pra valer com muitos dados, fica lento e não sabem o motivo).
E claro que você pode estudar tudo isso por conta própria, sem faculdade. Mas é muito raro os iniciantes (e até mesmo alguns veteranos) sequer descobrirem que esses assuntos existem, já que os cursos online (e “videozinhos” internet afora) não costumam focar nisso.