Qual é a diferença no conhecimento de uma linguagem (digamos javascript) entre um programador de formação que não seja de computação e um engenheiro / cientista de ciência da computação e como isso ajuda?

Os engenheiros de computação têm um profundo conhecimento da arquitetura, compiladores, design do sistema operacional e como o software eventualmente se traduz em hardware. Eles seriam muito melhores em aplicativos do tipo robótica, aplicativos que requerem interface de hardware e aplicativos executados em processadores menores.

E também fazemos coisas como liberar toda a memória alocada ..

Bem, no que me diz respeito, a diferença importante é que um especialista treinado em CS sabe como as coisas funcionam em alguns níveis; Como resultado, é mais fácil para eles resolver tarefas consideradas "complicadas". Um bom exemplo foi um amigo meu, olhando para um dos Java Puzzlers: ele não sabia muito sobre Java, mas resolveu o quebra-cabeça instantaneamente, porque, cito: "Você não seria capaz de escrever um compilador que faça isso". de outra forma."

Como desvantagem, porém, é mais difícil para eles manterem o foco: onde um novato vê um caminho claro, um graduado em CS vê um monte de problemas esperando para acontecer. Veja, por exemplo, esta adorável resposta no StackOverflow:

Página em stackoverflow.com

Para fazer uma analogia, pode-se saber o suficiente para escrever em inglês para fazer uma lista de compras perfeitamente, sem entender como escrever um trabalho de pesquisa ou um livro. Há mais na construção de software e sistemas do que entender a sintaxe de uma linguagem. Para ser um engenheiro profissional sério, você precisa saber muito mais do que isso. Você precisa entender como o idioma funciona e se esse é o correto para esse trabalho. Você precisa saber como sua velocidade será afetada por outras coisas acontecendo na máquina. Você precisa entender como a rede funciona, como os sistemas de controle de versão funcionam, como o sistema deve ser construído, liberado e gerenciado e milhares de outras coisas que um iniciante não entenderá.

Dito isto, aprender tudo isso não é algo que de alguma forma só pode ser aprendido em uma sala de aula de ciências da computação em uma universidade. Alguns dos melhores engenheiros de software que eu conheço não têm formação alguma.

Um programador iniciante aprenderia JavaScript em um mês e tentaria realizar todas as tarefas com esse idioma. Um cientista da computação poderia pegar as partes relevantes em um dia e mudar instantaneamente se um idioma diferente fosse melhor para o trabalho.

Os cientistas da computação nem sempre sabem muito sobre idiomas específicos, mas podem codificar em praticamente qualquer idioma, se necessário. Existem muitas linguagens de programação (como JavaScript) que eu poderia usar com facilidade para resolver problemas, mas teria que pesquisar no google como carregar um arquivo da memória ou encontrar o comprimento de uma string.