Quero aprender C++, e agora?

Ao longo dos últimos 2 anos eu conquistei um conhecimento razoável de C++ e resolvi fazer esse post para ajudar outros desenvolvedores que tenham o mesmo objetivo. O objetivo dessa postagem não é ser um “livro” que o ensine a programar, mas, sim, atuar como um “mapa” que você vai usar para encontrar os principais “livros”. Ele está organizado em 3 partes, sendo elas “por que aprender C++?”, “entendendo a linguagem” e “o percurso”. Os 3 “capítulos” são independentes e você pode lê-los em qualquer ordem.

O número de referências que usei nesse post me faz pensar naquela frase, “…sobre os ombros de gigantes“.

Por que aprender C++?

Acho que motivação é um fator importante ao adquirir novos conhecimentos, e, assim, a primeira parte desse texto é sobre motivação. Destaquei em negrito as frases que espero que você tenha em mente após terminar o texto.

Um motivo para aprender C++ é a ortogonalidade. Se a linguagem fornece algum recurso para ser utilizado, muito provavelmente permitirá que você implemente esse mesmo recurso ou um parecido usando as facilidades que ela própria fornece. Aqui, um pequeno exemplo do que seria (e é) uma quebra de ortogonalidade.

C++ é extensivamente suportada e você vai encontrar bibliotecas para resolver seus problemas nas mais diversas áreas, seja desenvolvimento de jogos, processamento de imagens, visão computacional, inteligência artificial, robótica, processamento numérico, servidor web de alta performance ou outra. Existe até suporte para novos paradigmas de programação para C++.

C++ é flexível. Se você achava que C era flexível, porque pessoas conseguiam sobreusar suas funcionalidades para implementar tratamento de exceções usando try…catch, ficaria surpreso com os códigos que a comunidade faz com C++. Se você possui necessidades incomuns, vai ficar muito contente quando examinar o design da STL, biblioteca padrão de templates de C++.

Uma característica é que a linguagem é estaticamente tipada e grande parte dos erros são capturados em tempo de compilação. Não me entenda errado, pois linguagens dinamicamente tipadas são úteis. Se uma linguagem fortemente tipada é mais adequada ao seu projeto, use C++.

Projeto com múltiplas linguagens? C++ possui conectividade com a grande maioria das linguagens existentes, chegando ao ponto onde eu tenho a ousadia de afirmar que, se uma linguagem não possui alguma forma de conectividade com C++, ela não é relevante. E mesmo nos casos extremos, você ainda terá a possibilidade de usar RPC.

Você gosta de C? Você gosta de C pelo acesso a baixo nível ou pelo desempenho? Algumas pessoas confundem desempenho e código de baixo nível. Acontece que, quando você omite os detalhes de algum comportamento, a implementação fica livre para usar a decisão mais eficiente. Um exemplo disso é a palavra-chave register, que costumava significar “coloque essa variável em um registrador” e passou a significar “por favor, coloque essa variável no lugar de acesso mais rápido”.

Outro exemplo da afirmação anterior é o canvas, um conceito usado em interfaces gráficas para permitir operações de desenho arbitrárias. Existente de forma primitiva em bibliotecas como Allegro, SDL e GTK+, e usando uma abstração de alto nível em bibliotecas como Edje e Qt. Bem, no caso da abstração de alto nível, as implementações conseguem utilizar as melhores estruturas de dados com o objetivo de diminuir o poder computacional necessário para apresentar o resultado, permitindo que, com muito menos código, você possa usar efeitos avançados de forma mais eficiente.

Um último exemplo é o sort, que em C++ é mais rápido, mesmo quando as duas implementações usam o mesmo algoritmo de ordenação. Quer usar baixo-nível para não adicionar gargalo nenhum? É a mesma coisa!

Você gosta de C e quer usar orientação a objetos? É possível usar o paradigma de orientação a objetos em C e não há problemas nisso. Há problema, entretanto, em relação a quanto de orientação a objetos você precisa. Dependendo desse fator, caso escolha C, você acabará cometendo o mesmo ato infeliz que vários outros programadores de C comentem, chegando quase ao ponto de criar uma nova linguagem em cima de C e fazendo centenas de outros programadores desprezarem o seu projeto.

Alguns outros motivos para usar C++ incluem uma carreira profissional, poder modificar o que já existe, entender melhor a tecnologia e melhorar a comunicação com pessoas da área.

Entendendo a linguagem

Um passo importante para entender uma ferramenta é entender os princípios sob os quais ela foi construída. Ao concluir esse passo, você irá adquirir a capacidade de responder sobre as características da mesma e esse “capítulo” é dedicado a lhe ajudar a entender esses princípios. Destaquei em negrito as frases que espero que você tenha em mente após terminar o texto.

Primeiramente, a linguagem não é desenvolvida por uma empresa ou um pequeno grupo com o objetivo de resolver seus próprios problemas e ignorar as consequências de suas decisões em outras áreas. A linguagem é desenvolvida por pessoas preocupadas com flexibilidade, segurança, desempenho, facilidade de uso e qualquer característica que afete sua vida, seja no desenvolvimento de um jogo de última geração, um simulador de navio, um programa de controle de avião ou qualquer outra atividade. A especificação da linguagem é publicada pela ISO e sofre um processo rigoroso antes de ser publicada. Você não ficará preso as decisões arbitrárias de uma organização com a capacidade de estregar tudo optando por C++, pois há implementações de diversas origens que lhe permitirão programar nos mais diversos locais e você não precisará pagar patentes ou algo do tipo para materializar seus conhecimentos.

Em qualquer linguagem existe a possibilidade de reutilizar pedaços de código-fonte úteis que outros programadores criaram no seu projeto. A forma mais rudimentar de reaproveitamento seria copiar e colar o código sempre que ele precisar ser reutilizado. Entretanto, as linguagens de programação sérias permitem uma forma melhor de importar código-fonte. Um dos nomes que utilizamos para citar essa características é o nome biblioteca. Geralmente uma linguagem é composta por uma biblioteca padrão e a própria linguagem. Como podemos criar nossas próprias bibliotecas, nem todas as soluções algorítmicas desenvolvidas pela espécie humana precisam fazer parte da biblioteca padrão e isso é importante.

Antes de virar código-fonte, o algoritmo existe de forma abstrata, nas nossas mentes, e a linguagem de programação escolhida impõe limitações que precisamos superar com nossas criatividades para conseguirmos o resultado (software) desejado. Quanto mais paradigmas uma linguagem suportar, menos são as limitações. Uma frase que eu li em algum lugar era algo como “o programador comum sabe o que escrever, o bom programador sabe o que reescrever”. Em resumo, reaproveitar código é o que fazemos, mas a linguagem pode ajudar (ou prejudicar) bastante essa função.

C++ nasceu como uma linguagem que adicionava orientação a objetos na linguagem C e, de fato, a saída de seu compilador, era um código-fonte C, que depois era compilado para código de máquina. Com o passar do tempo mais abstrações foram adicionadas na linguagem, até chegar ao ponto em que ela ganhou tamanha importância que começou a ter influência no desenvolvimento da linguagem da qual ela nasceu, a linguagem C. Desse primeiro pedaço, podemos entender que uma das motivações da linguagem é poder de abstração.

Com mais poder de abstração, você consegue mais produtividade e menos erros. Entretanto, se a abstração errada for escolhida, você irá perder bastante flexibilidade (dentre outras implicações) e é muito importante encontrar a decisão certa. Esse é outro princípio sob o qual a linguagem é desenvolvida. A biblioteca padrão só deve conter abstrações “corretas” e isso pode significar uma biblioteca padrão minimalista. Veja o caso de Java, por exemplo, onde a documentação contém dezenas de classes obsoletas e várias classes que tentam resolver o mesmo problema. Ou veja também o caso de Python, que se tornou “outra linguagem” na versão 3, já que perdeu compatibilidade com vários códigos escritos para Python 2, e até hoje, bibliotecas muito populares como Django ainda não foram portadas para Python 3. No caso de C++, demorou 13 anos para vermos outra especificação/versão e quase nenhuma funcionalidade antiga foi eliminada/desencorajada (de cabeça lembro de auto_ptr e excpetion especification).

Objective-C também nasceu na época do C++, então qual a diferença entre eles? C++ é bem mais do que apenas “C com classes” e possui diversas outras características (meta-programação com templates, sobrecarga de operadores, …), além do suporte ao paradigma OO. Mas esse ainda não é o ponto. Um dos princípios que guiou e continua guiando o desenvolvimento da linguagem C++ é que você só paga pelo que você usa. Isso influencia bastante sobre a decisão de quais são os comportamentos padrões no caso de ambiguidades. O polimorfismo, por exemplo, que não é habilitado por padrão e deve ser habilitado explicitamente para cada função-membro que deve possuir o comportamento polimórfico e que na versão nova possui um meio de restringir o mesmo para permitir que o compilador faça otimizações em certas situações.

Isso é tudo que vou citar nesse “capítulo”, mas vale ressaltar que a linguagem é uma evolução da linguagem C e grande parte do que vale para C, também vale para C++, como controle (acesso direto ao hardware), portabilidade e eficiência.

O percurso!

Esse é o “capítulo” que você usa para seguir até os locais que distribuem conhecimento em C++. E não esqueça de usar o seu conhecimento para o bem. Sempre que desanimar, veja uma foto minha e isso irá lhe inspirar.

Uma pequena lista de hábitos importantes que você deve desenvolver segue:

  • Você deve usar a linguagem. Use C++ em seus próximos projetos. Depois convoque seus amigos para ajudá-lo. Quem sabe não acaba criando um projeto de sucesso?
  • Ensine C++. Crie um blog, faça apresentações, responda perguntas ou faça um livro. Escolha o caminho que lhe agradar mais, pois essa tarefa irá exigir dedicação, mas, irá lhe fornecer, em troca, bastante conhecimento, caso se dedique da forma correta.
  • Siga outros programadores de C++. Provavelmente eles terão algo a lhe ensinar e você se sentirá mais motivado.
  • Perca o preconceito de aprender inglês. É importante eliminar essa barreira que lhe impede de entrar em contato com um número maior de pessoas interessantes.

E como dicas são indignas da filosofia Chuck Norris de vida nem todo mundo gosta de dicas, deixo a lista de dicas separadas da lista anterior:

  • Crie uma pasta para programas simples (converter temperatura, mostrar código ASCII de um caractere, somar vários números…) que você irá criar durante seu aprendizado
  • Aprenda a utilizar um depurador, pois essa ferramenta lhe auxiliará não somente na tarefa de encontrar erros, mas também a compreender melhor o comportamento do seu código-fonte
  • É importante que você não utilize uma IDE no começo, pois assim terá uma compreensão maior do que acontece quando você compila um projeto.
  • Use um VCS pelo menos para um de seus projetos, pois esse é o modo de trabalhar em grupo. Você pode usar o Google codeGitHub para hospedar seus projetos open source.
  • Documente pelo menos um de seus projetos, pois essa é uma experiência importante
  • Arquitete pelo menos um de seus projetos, pois essa é outra experiência importante
  • Crie testes para pelo menos um de seus projetos, pois essa é mais outra experiência importante
  • Não siga todas as dicas anteriores simultaneamente, pois isso lhe fará perder tempo
  • Use build systems multiplataformas em seus projetos que tem o objetivo de ser mais do que “apenas um projeto de aprendizado”
  • Em algum momento você vai precisar desenvolver códigos mais complexos e a biblioteca-padrão não mais irá lhe satisfazer. É para isso que bibliotecas como a boost e a Qt estão aí.

As minhas fontes de conhecimento de C++ estão organizadas em duas categorias principais. A categoria “morta”, que é composta por fontes que, caso você tenha memória boa o suficiente, só precisa consultar uma vez, e a categoria “viva”, composta por fontes que estão constantemente evoluindo. Considero importante manter um contanto com a comunidade e evoluir com ela e isso é para o que as fontes “vivas” existem.

A fonte morta

Livros são uma ótima forma de se aprender a programar, pois eles costumam agrupar os principais conhecimentos da linguagem, códigos de exemplo, exercícios, curiosidades interessantes e perguntas intrigantes. Entretanto, a linguagem que um autor utiliza para passar conhecimento pode ser boa para mim e ruim para você, então é importante que você não compre um livro antes de conhecê-lo. Antes da compra, use bibliotecas ou mesmo baixe alguns capítulos do mesmo. Quando chegar o momento em que um livro não mais lhe serve, abandone-o e tente outro.

Como C++ é um superconjunto da linguagem C, alguns livros sobre C também podem ser utilizados. O problema com essa abordagem é que eles podem lhe fazer perder tempo utilizando técnicas obsoletas e que em C++ há um jeito mais fácil de fazer que ainda fornece mais segurança e desempenho.

Alguns materiais memoráveis com os quais tive contato (ou não):

  • cppreference.com: Durante seu aprendizado você vai precisar de uma referência a consultar. Essa é a melhor referência com a qual já tive contato.
  • Curso de Linguagem C: Eu aprendi a programar com essa apostila. Uma característica notável da mesma é que ela esconde poucos detalhes da linguagem, deixando menos dúvidas na sua mente.
  • Introdução à programação com a linguagem C: Ótimo livro que não estava disponível na época em que eu aprendi a programar. Escrito pelo meu professor de programação 1 na UFAL, acabei lendo depois.
  • C++ Black Book: Esse não é um livro tão bom, mas permitiu-me ter conhecimento que não consegui de outras formas, principalmente, porque ele tem o que falta em alguns livros, exemplos de código-fonte.
  • Accelerated C++: Practical Programming by Example: Um livro com uma abordagem de ensino “inovadora”, ensinando a usar facilidades de alto-nível antes de ensinar como elas funcionam.
  • Programming – Principles and Practice Using C++: Esse é um dos melhores livros ensinando programação dos quais eu tive acesso (obrigado ao professor Alcino da UFAL, por ter me emprestado ele por um tempo). Acabei encontrando esse livro num momento em que estava insatisfeito com a falta de exercícios propostos nos livros de programação.
  • The C++ Programming Language: Apesar de ser um livro que consegue reunir explicações para boa parte da linguagem, ele não possui uma ordem muito didática, tornando-se uma péssima escolha para uma primeira leitura.
  • C Completo e Total: Aborda um pouco de “magia negra” tópicos avançados  na linguagem, sendo uma boa escolha depois que você tiver dominado o básico da linguagem e estiver à procura de novos desafios.
  • https://en.wikipedia.org/wiki/C++11: Eu sei que nenhuma página da wikipedia está livre de futuras revisões, mas essa página, em especial, está bem estável e é uma ótima leitura para entender as mudanças do novo padrão de C++.
  • Modern C++ Design: Esse é um livro que eu ainda não tive a chance de ler, porém parece ser bem popular entre os magos desenvolvedores da boost e as palestras do Andrei Alexandrescu possuem informações interessantes.
  • Effective C++: Outro livro que ainda não tive a oportunidade de ler, mas também possui vários indícios que o faz parecer promissor.
  • Guia Foca GNU/Linux: Apesar de não ter relação direta com C++, foi com essa apostila que aprendi bastante sobre computadores e por isso recebe menção honrosa.

A fonte viva

É importante participar de uma comunidade durante o processo (eterno?) de aprendizado. Sem mais enrolação, segue uma lista:

  • Lista de C & C++ Brasil: Dentre as dezenas de listas de emails das quais faço parte, essa é uma das mais respeitosas. Vez ou outra você irá encontrar algo de interessante na lista, além de ter um lugar para discutir sobre C++.
  • reddit: Sempre disponibilizando um link a mais para me ajudar a ser um programador melhor.
  • The home of Standard C++ on the web: É o mais próximo que temos de “site oficial” da linguagem.
  • Channel 9: Um lugar onde você pode assistir vídeos de eventos de C++. Há material bastante interessante que você não deveria subestimar. Usuários do reddit costumam postar os links para novos vídeos que aparecem aqui.
  • cppreference.com: Esse é um link tão importante que merece menção dupla no mesmo post.
  • C++ Quiz: Um quiz de C++ onde você vê o código-fonte de um programa e tenta adivinhar a saída (ou se compila ou provoca UB).

E assim como eu recomendei que você seguisse outros programadores de C++, eu também o faço:

EDIT:

Em uma parte do texto eu comentei que C++ era ortogonal, mas depois de algum tempo pensando eu mudei de ideia em relação ao texto. Primeiro, há vários pontos de vista e um deles é que todas as linguagens são ortogonais, mas algumas são muito ortogonais e outras são pouco ortogonais, então informar que C++ é ortogonal é uma frase inútil que não vale nem os bytes que são usados para armazená-la. Segundo, eu realmente não me importo com isso, mas eu me importo com o fato de você, como projetista da linguagem, definir abstrações que usem conceitos úteis e me impeça, como usuário da linguagem, de criar abstrações que usem esses mesmos conceitos. Essa foi uma parte do texto que ninguém comentou, mas continua algo importante para mim.

EDIT2:

Esse foi o meu texto mais acessado, então fiz um tipo de continuação (iniciando uma série não planejada que espero ser melhor do que o lixo que foi S. Darko): Performance em C++.

Tags:

13 Respostas para “Quero aprender C++, e agora?”

  1. Paulo diz :

    Camarada, quero lhe dar os parabéns!! Foi a abordagem mais simples, direta e sem “mistificação” sobre o C++ que já li na Internet. Estou estimulado à aprender essa linguagem. Na verdade, estava na dúvida entre C++ e Java. Pelo visto a primeira será mais útil pra mim. Muito obrigado e boa sorte!!

  2. Demétrios Reis diz :

    Vini Parabéns ótimo texto!
    gostei muito e quero ser seu discípulo, abraços!

    Dema

    • Vinipsmaker diz :

      Melhor ser discípulo dos meus professores. Ou discípulo dos professores de meus professores.

      Quanto mais perto da fonte, menos manipulação e distorção do conhecimento.
      =P

  3. Felipe Ferreira diz :

    Cara, seu site está bem guardado aqui no meu pen drive (o link do site)… Fez ótimas referências e me ajudou muito a finalmente conseguir absorver os conceitos (acredita que eu passei pelas 2 bíblias de C C++ e NUNCA consegui absorver os conceitos?? :)…)…. a referencia que vc fez ao livro que vc usou para assimilar os conceitos foi uma MÃE para mim .>:D… Obrigado por compartilhar.

    • Vinipsmaker diz :

      É, os livros de C/C++, muitas vezes são bastante abstratos para não guiar/viciar os alunos com afirmações que podem ficar obsoletas na próxima versão do compilador, incluindo o código gerado em Asembly e as expectativas que podemos ter de certas funcionalidades (ou ainda, como elas se traduziriam em C). Há também os livros que não têm exemplos o suficiente. Eu sei bem o que é isso pelo que você passou.

      Bom que consegui ajudar.
      =P

  4. Tiago Custódio diz :

    Excelente texto! Tá de parabéns!

    • Vinipsmaker diz :

      Valeu.

      Estou preparando um texto sobre otimização em C++, quem sabe você não vá gostar desse também. Mas aviso logo que vai demorar um tempinho até ele ficar pronto.

  5. Alan Patriota diz :

    Show de bola.
    Raramente, bem raramente mesmo comento alguma coisa na internet,
    mas esse texto valeu o comentário.
    Congratulations.

  6. Elias Medeiros diz :

    Execente texto sobre o C++.

  7. Felipe diz :

    opa!
    muito bom o que disse a respeito do livro básico do Bjarne. Na verdade esse livro é apto a formar aprendizes em grandes programadores e não simples programadores.
    É bem raro alguém ter coragem de iniciar por ele, mas devido a ter tido contato em 2012 com Pascal e C( ambas usadas no ensino tecnico) de maneira básica (estudei até laços condicionais e iteradores) , ainda assim foi um “desafio” pra mim encarar o “Princípios e Praticas..” so Bjarne.
    Realmente um livro pra quem quer sonhar alto e ter inspiração em aprender C++.
    Mas, veja que nunca passou pela minha cabeça ignorar nada do que já “sabia” e prosseguir para capítulos mais “relevantes”, fazer isso seria estúpido.
    Recomendo o ” Princípios e Praticas de Programação Com C++ ” do Bjarne Stroustrup para autodidatas- É o mais inspirador!
    Vou postar a resolução dos exercícios dele no fb, na pagina de minha autoria “Cpp Moderno” dêem um giro por lá de vez em quando.
    Planejou publicar um exercício resolvido a cada dia.
    obrigado! elogios: belo texto inspirador e a frase “..ombro de gigantes” só quem sabe, sabe!! vlw.

  8. Andre Rocha diz :

    A princípio muito obrigado por compartilhar seu tempo e conhecimento.

    Eu, como iniciante da Linguagem C, com alguns dias apenas, porem, com um proposito firme de aprender C/C++ e Linux, para todo o sempre [:)], nao tinha encontrado um post “simples” e claro sobre:

    [1] o processo de aprendizagem;
    [2] como e o por quê das bibliotecas;
    [3] como iniciar;
    [4] em que aplicar;
    [5] como aumentar sua experiencia de linguagem e aprofundamento;
    [6] referencias de livros, sites e outras comunidades;
    [7] o que mais considero importante neste post, a sinceridade e gratidão aos que lhe ajudaram e ajudam.

    Obrigado novamente por compartilhar sua experiência e dispor do seu tempo para ajudar pessoas como eu.

    Desde já agradeço.

    p.s.: permita-me a observação: seu site/blog está muito bom, limpo (sem promoçoes e propagandas) e perfeito. Creio que voce seguiu o principio básico GNU/LINUX: KISS e a Navalha de Ockham “Parcimônia e Simplicidade.”

Comentários (with MarkDown support)