A introdução dos padrões C++11 e C++CX provocou nova onda de interesse na linguagem C++. Com isso, diversos desenvolvedores, especialmente os desenvolvedores Windows, passaram a se questionar se deveriam deixar de lado o C# e o Java para voltar ao C++.
Não é o que John Sonmez aconselha. Em seu artigo "Por que C++ não está 'de volta' " (do original Why C++ Is Not 'Back'), Sonmez defende que existem somente três motivos para se usar C++:
- Quando é absolutamente necessário extrair o máximo possível de desempenho de seu software, sendo preferível fazer isso com uma linguagem OO;
- Quando o objetivo é escrever código que faz interface direta com hardware; por exemplo, um driver de dispositivo;
- Quando o controle sobre memória e temporização é essencial, sendo necessário comportamento determinístico no sistema e possibilidade de gerenciar a memória manualmente (por exemplo, um sistema operacional embarcado, controlando em tempo real o movimento de uma máquina).
Um dos motivos pelo qual John Sonmez se posiciona contra o aprendizado de C++ é a grande complexidade da linguagem. Embora o padrão C++11 tenha tornado o desenvolvimento mais fácil, o programador ainda precisa aprender velhos conceitos para escrever código em C++. "Códigos C++ escritos 20 anos atrás se parecerão com uma linguagem completamente diferente do C++ atual." Para reforçar seu argumento, Sonmez apresenta 36 questões que fez aos candidatos a uma vaga de desenvolvedor C++. Alguns exemplos:
- Quantas maneiras existem de inicializar um tipo de dados primitivo em C++ e quais são elas?
- O que é um "copy constructor" e quando é utilizado, especialmente em comparação com o operador de igualdade?
- Quando se deve e quando não se deve retornar um valor por referência em C++?
- Por que nunca se deve lançar uma exceção em um método destrutor?
Outro argumento desfavorável apresentado é que "as linguagens de programação precisam se tornar cada vez mais simples e aumentar o nível de abstração, e não o contrário." Sonmez completa:
Sempre haverá ocasiões em que um código de baixo nível será necessário, mas a maior parte do código escrito hoje é em nível muito mais alto.... Abandonei o barco do C++ há vários anos, no momento que deixei de poder argumentar que poderia desenvolver aplicações mais rápidas em C++ que em C#. Tentei por muito tempo acreditar que todo o investimento feito no C++ não estava perdido, mas no fim acabei descobrindo que o C# havia simplificado as coisas de tal forma que o poder adicional do C++ não valia toda a responsabilidade adicional que esta última linguagem exige.
John Sonmez conclui dizendo que aprender C++ ainda é útil para entender como os computadores funcionam de maneira geral. No entanto, alerta: "não acho que o C++ retorne com força tão cedo, e isso é ótimo". Em um comentário ao artigo, "Alo" acrescenta:
Além de ter começado minha carreira com C++, passei os primeiros quatro anos trabalhando exclusivamente com a linguagem. Foi uma experiência extremamente valiosa, porque, depois que se aprende C++ em um nível adequado, é possível aprender qualquer outra linguagem muito mais rápido, além de se ter um entendimento mais profundo de como um software funciona em baixo nível. E esse é um conhecimento muito mais difícil de adquirir quando se inicia a carreira com linguagens de alto nível; justamente por esse motivo, nunca aprovei a ideia de os programadores serem iniciados com Java.
Richard Dunks contra-argumenta:
Penso que C++ não seja indicado para uso no primeiro semestre em introdução à programação, nem para ensinar estruturas de dados, porque se gasta tanto tempo na implementação, que os alunos terminam perdendo de vista a estrutura que estão tentando reproduzir. Gosto de ter proficiência em C++, mas acredito que não vale o esforço de tornar C++uma linguagem genérica utilizável para fins educacionais.
Sobre reusabilidade, Stephen Cleary comenta:
Sou um especialista em C++ que se tornou desenvolvedor C# pouco anos atrás, devido às pressões do mercado de trabalho. Sou certamente mais produtivo com C#, mas é impossível obter o mesmo nível de reusabilidade de código possível usando templates do C++.
O exemplo clássico é a tríade contêineres, iteradores e algoritmos. Em C++, é possível criar um algoritmo que funciona em qualquer contêiner e que se ajusta automaticamente em tempo de compilação para tirar vantagem do acesso aleatório, se necessário. Tente fazer isso em C#. E aqui não estou falando do "novo C++"; já em 1998 o C++ permitia melhor reutilização de código do que o C# permite hoje.
A respeito de desempenho, Herb Sutter aconselha:
Em qualquer linguagem, se o desempenho for prioridade, muitas vezes será necessário fazer uso de arrays. Algumas linguagens facilitam bastante esse uso ao proporcionar maior flexibilidade em layouts e arrays. Já outras linguagens/ambientes dificultam esse uso, e isso leva o desenvolvedor a "desistir de" ou a "trabalhar contra" a tendência natural da linguagem, optando por estruturas de dados baseadas em nós para localizar ponteiros.
Além de vários outros comentários postados nos blogs de Herb Sutter e John Sonmez, há muitas discussões interessantes nos subgrupos "Programming" e "Coding" do Reddit a respeito dessa discussão.