1 pontos por GN⁺ 2024-12-25 | 1 comentários | Compartilhar no WhatsApp
  • O C++ mudou muito como linguagem e ecossistema desde o C++11 e se tornou uma linguagem que resgata a diversão de programar no processo de criar e experimentar diretamente
  • Houve uma época em que o C++ era lembrado por muitos desenvolvedores como uma linguagem cansativa por causa do excesso de metaprogramação com templates e de uma cultura centrada em padrões e na padronização
  • Mudanças como auto, nullptr, range-for, lambdas, <chrono>, smart pointers e <thread> alteraram bastante o estilo de código em C++
  • O C++ moderno oferece muitas opções, de sistema de arquivos, gerenciamento de pacotes, GUI/TUI, gráficos, matemática, IA e acesso a APIs de sistema operacional, o que facilita criar diretamente aquilo que você quer
  • Problemas como erros de compilador, ferramentas de build, conformidade com o padrão, complexidade histórica e RAII ainda existem, mas a possibilidade de criação supera esse desconforto

Por que C++ voltou a ser divertido

  • Ao criar um pequeno jogo roguelike, foi usado o algoritmo de Dijkstra na geração de mapas para implementar túneis que conectavam salas, e nesse processo o C++ não atrapalhou muito a experimentação
  • Também foi possível fazer um experimento desenhando a interface de usuário do FTXUI diretamente em uma janela de renderização do SFML, aprendendo nesse processo sobre o tratamento de Unicode em C++
  • Essas coisas não foram fáceis, mas eram realmente possíveis, e a sensação de “essa ideia realmente funcionou” é o que torna o C++ divertido
  • O motivo para começar a programar não era fazer bilionários ganharem ainda mais dinheiro, nem brigar com engines de renderização, nem satisfazer a cúpula de projetos open source, mas sim a alegria de implementar ideias

O cansaço da era da metaprogramação com templates

  • Do fim dos anos 1990 até o começo dos anos 2000, havia no C++ um clima forte de aplicar metaprogramação com templates a tudo, e esse período é tratado como um ponto de virada que tornou o C++ menos divertido
  • Havia discussões do tipo dizer que somar dois números com templates era mais rápido do que somá-los diretamente, mas houve casos em que a saída em assembly era idêntica
  • A percepção de que o comitê de padronização do C++ era pouco interessado em oferecer boa usabilidade aos programadores também ampliou as experiências negativas
  • O C++ daquela época ficou na memória como uma linguagem cheia de <> e sintaxe complexa, com pouco retorno prático
  • No começo, Java também parecia atraente por causa do coletor de lixo e da proposta amigável para desenvolvedores, mas depois acabou gerando um cansaço parecido com excesso de boilerplate e de design patterns

A sensação de linguagem que o C++11 mudou

  • Os recursos adicionados no C++11 são vistos como mudanças que alteraram profundamente a impressão sobre C++
  • Os principais recursos foram os seguintes
    • auto: palavra-chave de inferência automática de tipo que reduz a necessidade de repetir o mesmo nome de tipo várias vezes
    • nullptr: representação de ponteiro nulo que corrige problemas do NULL em C
    • range-for: laço que, junto com auto, simplifica a iteração sobre containers
    • lambda expressions: lambdas que podem mudar bastante o design e a usabilidade de APIs
    • <chrono>: biblioteca de tempo type-safe que permite expressões como 100ms
    • <regex>: funcionalidade de expressões regulares incluída na biblioteca padrão
    • unique_ptr, shared_ptr: smart pointers para lidar com ownership e contagem de referências
    • <thread>: recurso que incorporou multithreading ao ecossistema básico da linguagem
  • O C++11 mudou a filosofia e o estilo da linguagem sem abandonar a forma anterior, e por isso é percebido de maneira semelhante ao ES6 do JavaScript

As opções do ecossistema C++ moderno

  • O C++ atual já tem boa parte dos recursos esperados em outras linguagens
  • Exemplos de ferramentas e bibliotecas citados
  • A qualidade do ecossistema varia de item para item, mas no geral é avaliada como superior ao que foi experimentado em JavaScript e Python
  • Em especial, FTXUI e a STL são citadas como exemplos de bom design e boa usabilidade

A ampla possibilidade de implementação que cria a “diversão”

  • O C++ é divertido não apenas porque ganhou recursos modernos, mas por causa da capacidade de implementação de praticamente qualquer coisa
  • Aplicativos desktop podem ser feitos com fenster, SFML e Qt, ou lidando diretamente com APIs do sistema operacional
  • Em áudio, há desde opções rápidas como SFML até ferramentas comerciais como Wwise
  • Em gráficos 3D, existem várias opções como OpenGL, Vulkan, Direct3D e Ogre3D
  • Na área de matemática, há bibliotecas como BLAS, Eigen e GMTL
  • Mesmo quando não existe a biblioteca necessária, ainda dá para construir acessando diretamente a ABI de C ou C++ e as APIs do sistema operacional, e esse processo de fazer na mão é parte da diversão

A liberdade criativa de uma linguagem fora da moda

  • O C++ tem linguagem e ecossistema de alta qualidade, mas não é a linguagem da moda no momento, então recebe menos atenção do tipo de gente que estraga linguagens
  • A comunidade de C++ é retratada como tendo um clima que não interfere muito no que você quer construir
    • Dá para tentar livremente projetos como biblioteca de matrizes, biblioteca de GUI, engine de jogos ou jogos estranhos
  • Trabalho criativo precisa tanto da etapa de colocar ideias para fora primeiro quanto da etapa posterior de criticá-las friamente e elevar a qualidade
  • Em outras linguagens, organizações, lideranças e pressão da comunidade são vistas como fatores que atrapalham a experimentação no meio do processo criativo
  • As amplas possibilidades do C++ e uma cultura relativamente menos voltada a envergonhar os outros podem produzir uma experiência criativa

Os pontos fortes do cppreference.com

  • O cppreference.com é avaliado como uma das melhores documentações de linguagem de programação já usadas
  • Entre os pontos fortes estão
    • Todas as palavras-chave e bibliotecas estão organizadas como documentação de referência
    • A maioria dos itens traz exemplos que realmente funcionam
    • É indicado em qual versão do padrão C++ cada recurso foi introduzido
    • Há links para os documentos do padrão e materiais de referência relacionados
    • Existe uma caixa de busca baseada em DuckDuckGo, o que facilita encontrar algo mesmo com ortografia errada ou sem saber o termo exato
    • Conceitos importantes como Copy elision também são explicados com exemplos
  • O ponto fraco é não haver instruções de como instalar compiladores em várias plataformas
  • Como não há tantos compiladores e plataformas de C++, ainda existe espaço para adicionar um guia de introdução

Os problemas do C++ que ainda permanecem

  • Isso não significa que o C++ seja uma linguagem perfeita; como outras, ele ainda tem muitos incômodos
  • No Windows, configurar compiladores e ferramentas de desenvolvimento fora do caminho de instalação da Microsoft é difícil, e por isso foi criado um script de instalação em PowerShell
  • Os principais incômodos atuais são os seguintes
    • Mais de 95% das mensagens de erro do compilador são avaliadas como estando entre as piores do setor
    • Ferramentas de build são difíceis de usar, e até o Meson apresentou o problema de ignorar instruções de pacotes instalados e usar bibliotecas de sistema quebradas
    • Falta incentivo para fazer fabricantes de compiladores seguirem o padrão
    • O C++ é extremamente complexo por causa de sua história, e convivem ao mesmo tempo o estilo antigo baseado em alocação no heap e raw pointers, o estilo de metaprogramação com templates, o estilo mais voltado à stack após o C++11 e um estilo ainda mais novo centrado em struct
    • O RAII muitas vezes atrapalha em situações reais de configuração, e seria necessário algum ponto intermediário entre construtores de inicialização mais ao estilo de outras linguagens e o RAII atual
  • Mesmo com esses problemas, os incômodos do C++ não chegam a estragar a diversão, e o C++ já não corresponde mais à imagem antiga de uma linguagem centrada em colchetes angulares e ponteiros
  • O código de layout de GUI do FTXUI é citado como um exemplo de sintaxe tão moderna que, se você não soubesse que é C++, poderia achar que era outra linguagem

1 comentários

 
GN⁺ 2024-12-25
Opiniões do Hacker News
  • Chego perto de ser um hater de C++, mas é porque detesto ter que lidar com C++ em código de trabalho que precisa ser confiável, junto com colegas em quem é impossível confiar totalmente
    Em projetos pessoais, foi um dos ambientes de programação mais satisfatórios que já experimentei, e é realmente empolgante poder controlar a execução em um nível muito fino
    Saí do C++ há cerca de 10 anos e não pretendo voltar, mas nos meus projetos atuais a confiabilidade de longo prazo é o mais importante, então Rust + CI/CD se encaixa perfeitamente
    Ainda assim, sinto falta daquela emoção de projetar e implementar um programa para que ele execute exatamente da forma que eu pretendia, e de isso acontecer graças à minha especialização e percepção
    Se eu gostaria que as pessoas com quem trabalho fossem movidas por esse tipo de motivação? De jeito nenhum, mas pessoalmente é uma diversão inesquecível
    O sistema de build e o gerenciamento de pacotes são um pesadelo, o pré-processador parece uma piada sádica, a sintaxe é horrível, e há tanto entulho em tempo de execução que é preciso anos de experiência para não atirar no próprio pé com uma metralhadora
    Mas, em certo sentido, esse sofrimento aumenta a alegria de finalmente soltar um executável embrulhado em inteligência e lágrimas de sangue

    • É uma das descrições de C++ com que mais me identifico
      Usei C/C++ profissionalmente por alguns anos e não quero voltar
      Passei tempo demais depurando código dos outros, lidando com problemas de integração ambíguos e operando um espaguete de sistemas de build
    • O trabalho também deveria ser tão divertido quanto projetos pessoais
      Parece que a indústria de tecnologia perdeu essa ideia nos últimos 10 anos, e culpo as grandes empresas de tecnologia que colocam as melhores pessoas em prisões adultas com comida boa e cadeiras macias
      Startups também ficaram menos divertidas, e o setor de VC, ao incentivar uma janela estreita de pensamento, gerou startups clone e modismos demais, todas fazendo a mesma coisa
      O motivo de eu usar C++ em todo projeto novo é a confiança de que, quando eu precisar construir algo por conta própria, eu consigo
      Frameworks muitas vezes não se comportam do jeito que eu quero, especialmente quando lidam com o núcleo do projeto, então não tenho vontade de continuar usando
      Se dá para construir você mesmo, construa; se não, use um framework
      Se você consegue construir por conta própria, C++ é uma ótima ferramenta que pode fazer qualquer coisa e não atrapalha nos aspectos importantes
      Linguagens como Rust podem reclamar que estou fazendo algo perigoso, mas em C++ posso expressar diretamente o modelo que está na minha cabeça
      Às vezes penso em ponteiros, e ponteiros são uma ferramenta realmente boa
      Vamos recuperar a diversão, não só na vida pessoal, mas também no trabalho
  • Este texto parece um tanto confuso
    Ele toca em muitos pontos, mas é difícil extrair por que isso leva à conclusão de que C++ é mais ou menos divertido
    Também é confuso chamar C++ moderno de qualidade extremamente alta e, ao mesmo tempo, falar de problemas legados amplos e ferramentas terríveis
    Dizer que unique_ptr é ótimo mas que RAII é realmente detestável, ou afirmar que metaprogramação estava em toda parte antes e agora não está mais, também soa estranho
    Basta olhar para concepts para ver que não é bem assim, e a afirmação de que C++ tem as melhores bibliotecas gráficas, ou que instalar Python é mais difícil do que C++, parece mais uma obsessão do autor sem muita relação com o argumento
    No fim, o autor parece achar C++ divertido por uma combinação complexa de fatores pessoais, e isso por si só é perfeitamente aceitável
    Por causa do desempenho e do caráter técnico, também já tive meus momentos mais divertidos programando em C++, mas no desenvolvimento de software real C++ é ruim por inúmeros motivos que conhecemos
    C++ é uma linguagem profundamente contraditória, ferida por décadas de legado e política, e ignorar a realidade do C++ é o maior erro nas discussões sobre C++
    Minha atitude em relação a C++ hoje é mais próxima de cansaço, e não quero mais continuar saltando os obstáculos que C++ vem colocando há tantos anos
    Não há necessidade de continuar batendo em um cavalo morto há tempo demais; dá para simplesmente deixar C++ ser C++

    • Acho que essa frase resume bem o ponto central do texto
      Para mim, mais do que confuso, o texto parece ser de alguém que está se divertindo e tentando compartilhar essa alegria o máximo possível
      Não é bem um ensaio argumentativo propriamente dito nem um texto tentando convencer ativamente; é mais algo como “se isso ressoa com você sem eu precisar convencer, talvez você também ache divertido”
      Se você está cansado depois de apanhar da realidade no trabalho comercial, é totalmente compreensível que isso pareça não fazer sentido
      Eu, por acaso, estou me divertindo muito usando JavaScript ultimamente, e se eu escrevesse um texto parecido, acho que ele seria lido de forma igualmente ruim por alguém esgotado por 10 anos de JavaScript comercial
      Mesmo assim, é bom ver que o autor está se divertindo e decidiu compartilhar essa diversão
  • Passei 3 dias fazendo linkagem estática de uma dependência de terceiros em um projeto C++ para funcionar em Linux/Windows/macOS
    O pacote não estava no conan/vcpkg; havia apenas um repositório no GitHub com uma combinação estranha de Makefile/cmake
    Estou longe de ser especialista em cmake/cpp, mas na maioria das linguagens modernas isso não é um problema, com coisas como pip install, cargo add, npm install, go get
    Mesmo que você leia um livro de ponta a ponta sobre os detalhes da semântica de C++, trabalhar em um projeto real continua sendo doloroso

    • A cadeia de ferramentas de dependências e build do JavaScript é tão obscura quanto os Makefiles mais bagunçados
      É surpreendente que, no fim, tenhamos chegado a algo como autotools versão JavaScript
    • Fico curioso sobre o que, especificamente, foi difícil
      Fazer build estático de código de outra pessoa, ou adaptá-lo para compilar em outras plataformas, às vezes é complicado, mas a linkagem em si normalmente se resume a diretório de includes, caminho das bibliotecas e especificação das bibliotecas
    • Olhando pelo outro lado, fico me perguntando o que seria melhor se você quisesse usar essa dependência de terceiros em outra linguagem “moderna”
      Se ninguém fez o empacotamento para vcpkg/conan, é bem provável que também não esteja no pip/cargo/npm
      Se foi difícil em C++, em outra linguagem poderia ser muito mais difícil
      Dito isso, isso também deixa claro que partes históricas do C++, especialmente a história de build, estão em um estado muito ruim
      Se estiver no vcpkg, a dificuldade de instalação fica exatamente igual à dos outros ecossistemas
  • Periodicamente tento trabalhar em C++ em vez de C, e é sempre um padrão parecido
    Aprendo alguma técnica nova de C++, escrevo código achando que algo vai melhorar, tomo erros do compilador e passo o resto do dia aprendendo por que não posso fazer o que quero
    Normalmente fico preso ao C++14, e alguns problemas foram corrigidos em versões posteriores, mas ainda assim
    Eu queria muito gostar de C++; em teoria ele oferece um C mais poderoso que aumentaria a produtividade, mas no fim a carga cognitiva é grande demais e normalmente acabo usando “C com classes” e sigo em frente

    • Há uma fase em que aprender é divertido, e parece que o autor original ainda está nela
      Usei muito C++ em tempo real em 2003 e detestei, mas no ano passado escrevi a maior parte do código em C++ e finalmente passei a gostar
      Lambdas e auto foram o ponto de virada que me fez deixar de odiar C++
      Também usei um pouco de templates, mas principalmente para evitar um monte de ramificações para cada variação da mesma função
      Lambdas me permitiram escrever código do jeito que aprendi primeiro com professores de linguagens da família Lisp, naquele clima de SICP
      Com unique_ptr, alocação também deixou de me incomodar
    • Já vi muito código ruim feito por gente que acabou de aprender algum recurso e quer usá-lo
      Não faça isso; primeiro pense em como o código será usado e, então, se algum recurso resolver o problema, use-o
      É problema → solução, não o contrário
      Por exemplo, templates em C++ em geral são horríveis, mas duck typing em tempo de compilação ou adicionar padding automaticamente com base em sizeof() às vezes é muito útil
    • Minha experiência com C++ foi exatamente assim também
      No começo eu era programador C# e estava aprendendo C por causa de um projeto embarcado, e o fluxo foi exatamente o mesmo
      C++ tem muitos recursos legais que parecem poderosos quando se encaixam exatamente na aplicação
      Mas toda vez que eu tentava um recurso novo, aquilo que eu queria fazer era sempre um caso-limite que não funcionava naquela situação; depois de horas ou dias tentando, eu desistia e simplesmente escrevia em C
    • C++, como a maioria das tecnologias, funciona melhor quando você investe esforço para aprendê-lo direito
      Claro que há linguagens que fogem dessa tendência, como Python ou Ruby
    • ChatGPT e Copilot ajudam muito nessas partes
      Normalmente copio o texto do erro e peço para decifrarem
  • C++ é realmente divertido, e acho que as reclamações das pessoas dependem muito do contexto
    Muitos desenvolvedores C++ odeiam a linguagem, mas às vezes esse ódio está direcionado ao alvo errado
    Na prática, muitas vezes estão lidando com produtos legados feitos por pessoas que não sabiam usar software tão bem
    Passei por algo parecido em Rust: fui colocado em um projeto Rust já existente na empresa, com uma base de código antiga cheia de convenções conflitantes
    Havia tipos de tratamento de erro que não compunham bem entre si, abstrações de classe ruins, blocos unsafe desnecessários etc., e foi o projeto mais penoso em que já trabalhei
    É fácil culpar Rust, mas na verdade era apenas desenvolvimento de software ruim
    C++ de fato tem defeitos, mas boa parte da dor que as pessoas sentem vem de lidar com código ruim que seria uma bagunça em qualquer linguagem

    • Em quase todas as outras linguagens, exceto C, você não convida corrupção arbitrária de memória toda vez que escreve v[x]=y
      O std::optional de C++ vira comportamento indefinido se você chamar *v quando v estiver vazio
      O ponto central de optional é armazenar um valor que pode estar ausente; é difícil entender por que colocar comportamento indefinido na operação mais comum quando o optional está vazio
      Como alguém que já usou bastante C++, o problema é que todos os programadores do projeto precisam ser 100% perfeitos durante 100% do tempo
      Dá para rodar verificadores de memória e o modo de depuração da STL, mas, se você não roda isso também em release, precisa esperar que sua suíte de testes cubra todas as coisas estranhas que um usuário tolo ou mal-intencionado pode fazer
      Numa era em que software se tornou tão importante, e Rust parece chegar perto do desempenho de C++, fica a dúvida se vale a pena usar uma linguagem em que muitos recursos básicos são muito difíceis de usar com segurança
      E ainda está piorando: chamar um std::function vazio disparava um assert, mas o novo std::copyable_function transformou isso em comportamento indefinido
    • Tenho dificuldade em concordar com isso
      O sistema de tipos é irritante, e nem por isso você obtém segurança de memória de verdade
      A most vexing parse é realmente irritante, e esquisitices herdadas de C, como decaimento de ponteiros, continuam lá
      Em cima disso, colocam novas soluções como std::array, mas não conseguem remover o jeito antigo
      A dependência contínua do pré-processador para imitar um sistema real de importação de módulos também é um problema, e por causa disso surgem contornos como a organização de código de classes ou o idioma pimpl
      No fundo, os defeitos são tão grandes e numerosos que ficou difícil encontrar beleza ali
    • É verdade, mas quanto mais complexa é a linguagem, muito mais fácil é criar uma bagunça incompreensível
      Por outro lado, um projeto em uma linguagem blub simples costuma ser relativamente fácil de decifrar, independentemente do estado da base de código
    • Embora antigo, vale consultar o C++ FQA, que é bem engraçado: https://yosefk.com/c++fqa/
  • É bom saber que alguém encontra prazer em C++, mas, pessoalmente, depois de mais de 20 anos lidando com isso, para mim já deu de C++
    É simplesmente uma bagunça
    Se eu realmente precisar de controle de baixo nível, prefiro lidar com C, apesar dos defeitos; caso contrário, Rust, Python etc. me deixam muito mais feliz

    • Concordo
      Ainda assim, C++ vai continuar por aí
      Há código demais escrito nessa linguagem, é sem dúvida uma habilidade boa de ter, e existem empregos muito bem pagos nessa área
      Para mim, a linguagem atrapalha demais e parece excessivamente complexa
      Conheço o discurso de que “C++ moderno” é excelente, que não é preciso aprender as versões antigas e que a cada nova versão tudo fica mais simples
      O problema é que as bases de código que você acaba assumindo na prática não são C++ moderno
      Elas usam todos os recursos já lançados até hoje, são difíceis e cheias de armadilhas
      Quem passou anos usando C++ apenas em seus próprios projetos talvez consiga desenvolver certa especialização e ficar imune à complexidade, mas ela não é realmente uma boa linguagem
    • Uma das coisas que, com o tempo, tornou C++ mais suportável foi que ficou mais fácil substituir naturalmente a maior parte por implementações que se comportam do jeito que você espera e cujo comportamento é suficientemente definido
      Coisas como trocar os tipos de dados principais, a biblioteca padrão etc.
      Especialmente depois do C++20, a base para essas substituições parece bastante nativa e expressiva
      Boa parte dos novos projetos em C++ que vejo segue fortemente essa direção
      A facilidade de criar uma linguagem específica de domínio em nível de sistema para uma aplicação é um ponto forte do C++
    • Em um projeto derivado de Ultima que eu estava fazendo com C++/SDL2, usei só alguns recursos de C++
      Infelizmente não cheguei a terminá-lo, mas do que lembro eram coisas como classes, std::function, std::unordered_map, std::string e std::unique_ptr
      É difícil imaginar ler código de outra pessoa se não for em um estilo parecido
      Como não uso programas grandes profissionalmente, o mais difícil foi ir além de padrões de programação como o padrão Visitor
      Eu gostaria que C++ tivesse parado no C++11
      O comitê agora parece querer colocar tudo dentro da linguagem, e C++ parece uma linguagem gigantesca que dá suporte a todos os estilos de programação de nicho
    • C++ é uma bagunça completa
      Mas é uma bagunça divertida, e eu gosto de escrever em C++
      Às vezes isso importa
      Minha relação com Rust é muito mais fria
      Respeito Rust e, especialmente em contextos como trabalho, em que é difícil defender o uso de C++, uso Rust quando acho que é a escolha certa, e considero importante o que Rust faz
      Mas, mesmo já tendo feito um bom número de projetos em Rust, ainda acho tedioso escrever nessa linguagem
      Em aspectos essenciais ela é melhor, mas, pelo menos para mim, é menos prazerosa
    • Rust também não é uma linguagem que tenta oferecer o mesmo controle e baixo nível que C?
      Ao quebrar o selo do unsafe, dá para fazer cast explícito de inteiros para ponteiros e, por exemplo, controlar hardware com E/S mapeada em memória, não dá?
  • Este texto é uma longa digressão de escopo amplo, e só as letras “C++” já irritam as pessoas a ponto de muita coisa poder ser ignorada
    Às vezes eu também faço isso
    Para as reclamações, é só pular para a parte “It's Not All Puppies and Butterflies”
    O autor ficou muito impressionado com C++11, e, depois de quase 20 anos ignorando C++ de propósito, eu me senti de forma parecida
    Gostei de ele apresentar pacotes e bibliotecas para brincar, mas ainda assim colocar bibliotecas de terceiros nos meus projetos costuma ser doloroso
    Headers de arquivo único me vêm à cabeça
    FTXUI é interessante
    E, de verdade, cppreference.com é fantástico
    A documentação do Python também é bem boa, mas nunca vi uma documentação tão boa quanto cppreference.com

    • cppreference.com é excelente justamente como o nome sugere: uma documentação de referência
      A documentação do Python fica espalhada em vários lugares, é incompleta em diversos pontos e também carece de um estilo editorial consistente
      Mas, pelo critério do framework Diataxis, ela cobre muito bem não só documentação de referência, mas também vários outros tipos de documentação
      As pessoas que escrevem essa documentação consideram explicitamente esse framework ao buscar formas de melhorá-la
      Ainda assim, é um trabalho open source baseado em voluntários, que se move de maneira muito parecida com o desenvolvimento de código
    • Depois de aprender C++ na escola e na universidade, fui direto para Python/JavaScript no trabalho, e este texto preencheu muita coisa sobre C++ que eu não sabia
      Há algum tempo eu queria chegar “mais perto do sistema”, e aprender Rust por fora também não foi fácil
      Ao ler este texto, fiquei com esperança de que talvez seja possível se eu reaprender C++
      Olá, CMake… não, talvez eu deva dizer Meson
  • Concordo que C++ é excelente se uma equipe talentosa souber usar bem C++ moderno e estiver começando um projeto novo
    É uma linguagem divertida e poderosa, tem bom desempenho e, embora seja complexa, a depuração e a otimização são relativamente intuitivas
    Tive a oportunidade de trabalhar em uma base de código de cerca de 5 anos, escrita segundo os padrões pós-C++11, e ela foi muito agradável por vários dos motivos citados no texto
    Por outro lado, se for uma base de código antiga que evoluiu por 20 ou 30 anos, ou uma base que não foi mantida por pessoas competentes, a experiência será completamente diferente

    • Comecei minha vida de desenvolvedor com PHP, criando temas personalizados de WordPress com plugins para tipos de dados especiais, e aprendi trabalhando
      Aos 21 anos, a empresa se ofereceu para pagar minha faculdade, então voltei para um curso de ciência da computação e mais tarde mudei para computação
      No primeiro dia da aula de “introdução à programação”, no momento em que mexi com C++, me apaixonei
      Em comparação com o PHP 7 que eu usava na época, o sistema de tipos, a depuração e o ecossistema eram excelentes
      Com a permissão do meu gerente, criei APIs baseadas em C++ para partes dos aplicativos de intranet existentes, para que o PHP as chamasse via WebSocket, e pude aproveitar o sistema de tipos e o desempenho
      Esses sistemas ainda são usados diariamente em toda a empresa, e a manutenção nunca foi um problema
      Mesmo rodando em um ambiente bastante peculiar chamado IBM Pase for i
      Hoje, depois de ter usado Rust e Axum, eu preferiria muito mais o ecossistema Rust para criar APIs desse tipo, mas C++ também merece reconhecimento
      Especialmente para quem vem de linguagens web como JavaScript sem TypeScript ou PHP, é uma linguagem realmente excelente
    • Sob a condição de uma base de código antiga que evoluiu por 20 ou 30 anos, ou que não foi mantida por pessoas competentes, não consigo pensar em outra linguagem que não seria horrível
      Na verdade, eu provavelmente preferiria C++ a várias possibilidades que consigo imaginar, como C, Java ou Fortran
      A exceção talvez fosse C#, mas não sei se ela é antiga o bastante para se enquadrar nessa condição
  • Ao contrário do que se diz sobre C++ ter ganhado expressões regulares embutidas e elas serem muito boas, é difícil dizer que std::regex seja bom
    O desempenho é ruim e o suporte a Unicode também é insuficiente, então, em geral, é melhor evitar

    • O linter que usamos na nossa empresa também força a não usar std::regex
    • Fico curioso se há algum problema na especificação que cause queda de desempenho
  • Aprendi C++ e até me diverti com ele, mas nunca me aprofundei
    Sempre gostei mais de C, e há muitas bases de código de primeira linha que dá para ler para aprender C melhor, como o motor de jogo Dune original ou utilitários Unix
    Recentemente mexi um pouco com Rust e não vejo muito motivo forte para usar C++
    A combinação de um sistema de tipos poderoso inspirado em programação funcional com desempenho parece difícil de superar, e soa como uma linguagem quase perfeita
    Ainda assim, certamente há motivos legados para ter de usar C++
    Talvez coisas como motores de jogos, programação embarcada ou outros tipos de acoplamento legado

    • No trabalho, alterno entre C++ e Rust e, sinceramente, no C++20/23 moderno muitos pontos dolorosos estão sendo corrigidos praticamente copiando Rust
      Se for uma base de código C++ nova, dá para deixá-la bem limpa
      Mas, a esta altura, não entendo bem por que criar software novo em C++
      Há muitos incômodos em C++
      O gerenciamento de bibliotecas/pacotes não é padronizado, headers são duplicação de código, e a biblioteca padrão varia conforme a implementação e é quase ilegível
      O padrão tem comportamentos estranhos, as pessoas se apoiam em comportamento indefinido sem saber, há problemas de uso antes da alocação, e vazamentos de memória surgem de forma sutil por problemas de ownership e contagem de referências incorreta
      É preciso tornar tudo const em vez de deixar como padrão, para garantir noexcept é preciso verificar as exceções de tudo que é chamado, e erros em operações da biblioteca padrão são difíceis de ler
      Código fortemente orientado a objetos é, na prática, dívida técnica
      O LSP de C++ não funciona de forma estrutural, verificando a árvore de sintaxe abstrata para encontrar definições como em Rust, então a navegação e a compreensão da base de código são lentas
      Rust dá suporte explícito de primeira classe a nostd, mas em C++ desligar a biblioteca padrão exige flags específicas por compilador, e é difícil confirmar se foi feito corretamente
      Por isso, o argumento de usar C++ por causa de embarcados me convence pouco
      Rust também tem motores de jogo como bevy, embora ainda sejam novos, e, se quiser, dá até para acoplar Rust ao scripting do Godot
      Áudio de baixo nível também é igualmente fácil em Rust, e é possível lidar com multiplataforma em um único crate
      No geral, acho que o ponto central é código legado e a hesitação diante de mudanças
    • O legado é imenso em várias dimensões, não só nos apps escritos em C++
      Inclui número de usuários, conhecimento e materiais publicados e disponíveis, livros, cursos, blogs, textos, vídeos, bibliotecas de software, além da alta compatibilidade com C, outra linguagem gigantesca
      Para quem está nessa área há mais de alguns anos, isso é quase senso comum da indústria de software
      Eu nunca usei muito C++, então é difícil até me chamar de iniciante de verdade, mas no passado comprei e li livros clássicos de C++ do criador da linguagem, Bjarne Stroustrup, de Scott Meyers etc., e cheguei a entendê-los em alguma medida
      Já C eu usei bastante em produção por anos, inclusive em produtos comerciais bem-sucedidos
      https://www.stroustrup.com/applications.html
      https://www.stroustrup.com
      https://en.m.wikipedia.org/wiki/Bjarne_Stroustrup
      https://en.m.wikipedia.org/wiki/Scott_Meyers
    • C++ faz sentido quando se precisa de baixa latência, mas não se liga tanto para correção
      Por isso acho que o desenvolvimento de jogos será o que permanecerá mais tempo em C++
      Mesmo que, para 0,001% dos usuários, o jogo morra com uma falha de segmentação, a reação é meio “e daí?”
    • Trading de altíssima frequência também é uma possibilidade