Finalmente, um comentário que vale a pena responder. Concordo contigo nos 90%, e nos outros 10%, acho que a diferença é só semântica. Sim, qualquer um que escreve código é, tecnicamente, um programador. Mas a questão aqui não é colocar um rótulo, e sim diferenciar quem entende o que está fazendo de quem só junta pedaços de código sem saber como funcionam.
Sobre o uso de libs, perfeito: justificar antes de adicionar dependências deveria ser regra em todo time sério. Tem muito dev que acha que produtividade é só colar pacotes prontos e sair rodando, mas esquece que cada dependência é um potencial problema de segurança, um ponto de falha e uma dor de cabeça futura. A gente já tem um software inteiro rodando no npm com 500MB de dependências só pra mostrar um "Hello, World!" — precisa de mais prova?
Agora, sobre gráficos: faz sentido abrir exceção. Frameworks de visualização são um caso clássico onde vale mais a pena usar algo pronto do que tentar reimplementar um D3.js do zero. Mas o ponto é exatamente esse: saber onde a abstração faz sentido e onde ela só complica. Quem entende como funciona por baixo sempre vai fazer escolhas melhores do que quem só instala o pacote da moda sem pensar.
Resumindo: se todo mundo tivesse esse critério antes de encher o projeto de dependências, metade dos bugs e exploits de hoje nem existiriam.