Bem, não posso concordar inteiramente, porque você precisa se preocupar com tudo isso. E, por falar nisso, uma das coisas que adoro em programação são as alternâncias entre diferentes níveis de abstração e tamanho, que saltam rapidamente de pensar em nanossegundos para pensar em meses e vice-versa.
No entanto, as coisas mais altas são mais importantes.
Se houver uma falha em algumas linhas de problemas que causam comportamento incorreto, provavelmente não é muito difícil de corrigir. Se está causando um desempenho abaixo do esperado, provavelmente nem importa.
Se houver uma falha na escolha da estrutura de dados em um subsistema, que causa comportamento incorreto, é um problema muito maior e mais difícil de corrigir. Se está causando um desempenho insatisfatório, pode ser bastante sério ou suportável, ainda muito menos bom do que uma abordagem rival.
Se houver uma falha no relacionamento entre as estruturas de dados mais importantes de um aplicativo, que causa um comportamento incorreto, tenho um grande design redesenhado à minha frente. Se está causando um desempenho inferior, pode ser tão ruim que quase seria melhor se estivesse se comportando errado.
E será isso que dificultará a localização desses problemas de nível inferior (a correção de erros de nível inferior é normalmente fácil, é difícil encontrá-los).
O material de baixo nível é importante, e sua importância remanescente é muitas vezes seriamente subestimada, mas fica pálida em comparação com o material grande.