Na minha opinião, o que as pessoas consideram coloquialmente como "linguagens de programação" são na verdade três coisas distintas:
- Tipo e sintaxe do idioma
- IDE de linguagem
- Bibliotecas disponíveis para um idioma
Por exemplo, quando alguém menciona C # em uma discussão, você pode pensar que está falando sobre sintaxe de linguagem (1), mas é 95% certo de que a discussão envolverá a estrutura .Net (3). Se você não está projetando um novo idioma, é difícil e geralmente inútil isolar (1) e ignorar (2) e (3). Isso ocorre porque o IDE e a biblioteca padrão são "fatores de conforto", coisas que afetam diretamente a experiência do uso de uma determinada ferramenta.
Nos últimos anos, eu também participei do Google Code Jam. Na primeira vez, optei pelo C ++ porque ele possui um bom suporte para a leitura da entrada. Por exemplo, a leitura de três números inteiros de uma entrada padrão em C ++ se parece com isso:
int n, h, w;
cin >> n >> h >> w;
Enquanto em C #, o mesmo ficaria assim:
int n, h, w;
string[] tokens = Console.ReadLine().Split(' ');
n = int.Parse(tokens[0]);
h = int.Parse(tokens[1]);
w = int.Parse(tokens[2]);
Isso representa muito mais sobrecarga mental para uma funcionalidade simples. As coisas ficam ainda mais complicadas em C # com entrada de várias linhas. Talvez eu simplesmente não tenha descoberto uma maneira melhor naquela época. De qualquer forma, não consegui passar na primeira rodada porque tinha um bug que não consegui corrigir antes do final da rodada. Ironicamente, o método de leitura de entrada ofuscou o bug. O problema era simples, a entrada continha um número muito grande para um número inteiro de 32 bits. Em C # int.Parse(string)
lançaria uma exceção, mas em C ++ o fluxo de entrada de arquivo definiria um certo sinalizador de erro e falharia silenciosamente, tornando o desenvolvedor desavisado inconsciente de um problema.
Ambos os exemplos demonstram como a biblioteca foi usada e não a sintaxe da linguagem. Primeiro demonstra a verbosidade e o outro demonstra a confiabilidade. Muitas bibliotecas são portadas para vários idiomas e alguns idiomas podem usar bibliotecas que não foram criadas especificamente para eles (consulte a resposta da @ vartec sobre o Python com bibliotecas C).
Para finalizar, saber o algoritmo certo ajuda. Nas competições de codificação, é crucial, especialmente quando recursos como tempo de execução e memória são propositadamente limitados. No desenvolvimento de aplicativos, é bem-vindo, mas geralmente não é crucial. A manutenção é mais importante lá. Isso pode ser alcançado aplicando padrões de design corretos, com boa arquitetura, código legível e documentação relevante, e todos esses métodos dependem muito das bibliotecas internas e de terceiros. Portanto, acho mais importante saber que tipo de rodas já foram inventadas e como elas se encaixam, e como fazer as minhas.