Algoritmos deviam ser ensinados breadth-first, e não depth-first!
Note que não me refiro ao aprendizado de programação, mas ao estudo sistemático de algoritmos (envolvendo projeto e análise).
Depth-first é demasiado frustrante, especialmente para quem já trabalha na indústria e sabe que existem muitas outras coisas tão ou mais importantes quanto performance (legibilidade, usabilidade, simplicidade, extensibilidade, e lá vai...). Embora eu consiga visualizar a utilidade de poder provar a complexidade assintótica e a otimização de uma determinada solução na teoria, não percebo as vantagens de aprender a fazê-lo para cada tipo de algoritmo na prática.
Seria muito melhor uma abordagem breadth-first, em que você ficasse sabendo das técnicas existentes de projeto de algoritmos, um apanhado das soluções existentes para os problemas clássicos envolvendo as estruturas de dados clássicas e as construções mais elaboradas em cima delas, e ir tentando resolver problemas parecidos com os que já foram vistos. Dessa forma, o estudante desenvolveria a habilidade de identificar e classificar os problemas que aparecessem, e poderia estudá-lo a fundo (aí sim, in depth) quando fosse necessário.
Mais importante do que compreender todos os detalhes duma instância específica de um problema e saber articular essa compreensão, é conhecer as técnicas utilizadas para obter a solução dessa classe de problemas e saber como identificá-los.
Alguém conserte isso, por favor!