As pedras no caminho de um iniciante - Conheça as maiores barreiras para aprender e trabalhar com C e C++

Oi pessoal,

Esse Blog ficou abandonado durante bastante tempo (de novo). Na época que comecei ele (2008), estava num período de transição de um emprego pro outro, então tinha um tempo livre de sobra.

Hoje tenho dois filhos e duas empresas, então praticamente todo o tempo que sobra eu gasto estudando ou trabalhando em projetos novos. Eu esperava arrumar um espaço na agenda para atualizar isso aqui dez vez em quando, mas nunca conseguia encaixar de forma regular.

Hoje consegui arrumar esse tempo - e acredito que dessa vez eu consigo manter as postagens regulares pelo menos uma vez a cada dois meses (acreditando que dá pra fazer com uma frequência maior).

Apesar de ter parado de escrever aqui, eu não parei de estudar C e C++ e hoje trabalho profissionalmente com essas linguagens (apesar de não me considerar ainda um grande especialista, acredito que já tenho algo pra compartilhar).

No início do Blog eu pensava que dava para entender o suficiente dessas linguagens em 6 meses, e compartilhar o que eu ia aprendendo enquanto aprendia. A ideia era até boa (e me fez iniciar esse Blog), mas eu passava mais tempo escrevendo aqui do que de fato estudando, até o dia que decidi apenas estudar (sem escrever aqui).

Após algum tempo de estudo e trabalho, chegou um momento que senti uma GRANDE diferença entre o material que havia disponível na Internet e o conhecimento de fato necessário para produzir alguma coisa útil em C ou C++. Então resolvi escrever sobre isso aqui, pra compartilhar as maiores barreiras de entrada para um iniciante trabalhar:

1) As limitações dos Tutoriais:

 - Os tutoriais ensinam o básico da linguagem, mas não ensinam a quantidade de maluquices que a gente encontra em códigos-fonte de verdade. A maior parte dessas maluquices não são responsabilidade do C ou do C++, mas sim de uma outra linguagem diretamente relacionada: a macro do pré-processador (ou diretivas de compilação). Falo um pouco delas mais abaixo.

- Nenhum tutorial, repito, NENHUM vai te ensinar a programar de verdade em C ou C++. Em outras linguagens existem tutoriais que te oferecem algum conhecimento útil, que você de fato usa no dia a dia. Em C e C++ não. Procure um bom livro. Segue dois links úteis: lista de Livros de C++ e lista de Livros de C (todos em inglês). Deve ter algum bom em português, mas eu não li (agradeceria se alguém compartilhar nos comentários).

IMPORTANTE: Além dos livros, é muito bom também estudar códigos-fonte de outros programas e tentar entender o que os caras fizeram. E, finalmente, precisa abrir seu editor e meter a mão no código. Errar. Errar de novo. Quebrar a cabeça. Acertar. Aprender. Daí partir pra outro tópico. Errar. Errar de novo........... (assim você vai estar aprendendo sempre).

2) Os diferentes tipos de Programa:

- A grande maioria dos tutoriais ensina a escrever partindo da função main. Ela é essencial se você estiver escrevendo um programa que vai rodar no terminal, que tenha início, meio e fim. Porém, se você está escrevendo uma biblioteca compartilhada, por exemplo, você só quer expor algumas funções públicas (API) para outros programadores usarem, ou para você mesmo usar em outros projetos, mas sua biblioteca provavelmente não terá um único ponto de início. Se você for escrever um game ou qualquer coisa que tenha interface com usuários, deverá escolher, aprender e usar bibliotecas externas. Até um iniciante "pegar" que existem diferentes tipos de programa e que cada um exige diferentes estruturas demora um pouco, a não ser que conheça pessoalmente alguém que já programe e esteja disposto a te ensinar.

3) A importância dos Headers:

- Falando em estrutura, há mais importância nos arquivos de Header do que se fala na maioria dos materiais que se encontra na Internet. Alguns nem citam a existência deles. Porém, são eles que definem toda a estrutura do seu programa, e um planejamento prévio deles ajuda bastante, como também a forma que você os organiza. Se você estiver escrevendo um programa do zero, é com eles que você deve se preocupar primeiro - e não com sua função main.

- Da mesma forma, se você estiver dando manutenção em programas de terceiros (o que provavelmente representará mais de 95% da sua vida profissional como programador), ou usando bibliotecas Open Source, são os Headers que você deve consultar para ver as definições malucas que o pessoal faz (o que nos leva ao próximo tópico).

4) O poder de fogo das Macros (e a fase de pré-compilação):

- As Macros do pré-processador desempenham um papel mais fundamental nos programas de verdade do que se dá a entender nos materiais de estudo disponíveis na Internet. Elas transformam o C e o C++ em linguagens mais poderosas do que já são. O mérito do poder do C e C++ está mais nas macros do que nas linguagens em si. Para vocês terem uma idéia, a primeira implementação do C++ (algumas décadas atrás, quando não havia compilador dedicado a ele) foi TODA feita em macros de C. Tem um artigo muito interessante de 1995 (depois eu acho o link) sobre como implementar o paradigma de orientação a objetos em C (puro), só usando macros.

- Diferente do que se pratica em outras linguagens de mais alto nível, o C e o C++ praticamente não existem isoladamente da linguagem do pré-processador. Coisas simples como um #include e #define, por exemplo, (ou qualquer coisa que comece com #) não são nativas do C puro, elas são instruções que o compilador executa antes de compilar, transformando a própria estrutura do código-fonte, para então compilar o código-fonte em C/C++ propriamente dito.

- Esse poder de mudar a própria estrutura da linguagem, criando novos tipos de variáveis e funções, ou atalhos para comandos mais longos (exemplo: uint8 em vez de unsigned int), confunde um iniciante que vai direto na função main para tentar entender o que outros programadores fizeram. O primeiro pensamento do cara é "mas eu não lembro desse comando em nenhum livro ou tutorial". Na prática, como já disse, antes da função main o compilador vai executar as Macros, que geralmente estão definidas nos Headers.

5) Melhores práticas e Coding Styles

- Existe pouco material sobre Melhores Práticas e coding styles. Em códigos de produção você encontra muita coisa cabeluda (e em livros também), então é bom estudar um pouco sobre esse assunto para formar a sua opinião pessoal e separar o joio do trigo. Para quem está acostumado com a beleza de uma linguagem como Python ou Ruby, um código fonte em C parece coisa de maluco. Existem raras excessões para códigos bem escritos e elegantes em C. O código do nginx é um bom exemplo.

- Também existe pouca coisa sobre como organizar os arquivos, como planejar a estrutura do seu programa, etc. Essas são coisas que só se aprende mesmo na prática. Boa parte dos programas (principalmente em C) simplesmente deixa tudo numa pasta só (convencionalmente /src). Dependendo da complexidade, seu software vai acabar se dividindo em mais pastas. Porém, não existe uma maneira nativa para você fazer isso. A diretiva #include não pertence (diretamente) ao C ou C++, e sim à linguagem do pré-processador que falamos antes. Para dividir seu programa em pastas, você precisa avisar seu compilador antes em quais pastas ele deve procurar por arquivos para que a diretiva #include funcione. Algumas IDEs facilitam muito esse trabalho. Ferramentas como o Premake e o Cmake também ajudam bastante (escreverei sobre o Premake num futuro próximo).

6) A diferença entre arquiteturas:

- A diferença das arquiteturas (Unix, Linux, Windows, Mac, Android, iOS) deve ser considerada na hora de planejar e escrever seu programa, biblioteca ou plugin. A maioria dos materiais que você encontra de C e C++ é específica de uma única plataforma. Não vou entrar em detalhes sobre isso agora, mas acredito que isso será tema de um outro post.


Bom, acredito que a lista seja um pouco mais longa do que isso. Essas foram as principais barreiras que consegui lembrar pela minha própria experiência. Esse post não tem o objetivo de detalhar o passo a passo de como superar essas dificuldades. Porém, ao listá-las e dar "nomes aos bois", acredito estar ajudando alguém que já esteja estudando há algum tempo e que ainda não enxergou o problema maior de fora. A ideia é fornecer pistas para que você continue procurando e então consiga resolver esses problemas com uma visão mais macro.

Espero ter ajudado!

Comentários

Anônimo disse…
Olá Rafael,
Eu programo em C há muito tempo! E como você bem disse no seu post, os iniciantes não têm ideia do que verdadeiramente é programar em C/C++ até começarem realmente a por a mão na massa. Concordo com você sobre os tutoriais que mais confundem do que ensinam.
Parabéns pela iniciativa e continue postando sobre a sua experiência!
Unknown disse…
ola,boa noite(aqui é noite),eu gostaria de saber se consigo aprender programação do zero absoluto. OBS não sei nem o que é um algoritmo.
e gostaria de aprender sem um professor.
Anônimo disse…
Amigo, comprei um livro no inicio do ano que está me ajudando muito a aprender se chama princípios e praticas de programação com c++ (Autor Bjarne strongstrup), aconselho começar com ele e fazer os exercícios você vai aprender rapidamente, nao fique lendo apenas tuturiais na web deixe isso para depois pegue um livro.

Postagens mais visitadas deste blog

Quarto, quinto... décimo sexto.

Desvendando o SDL (Simple Directmedia Layer)

Renascendo - ou Os Desafios de aprender C e C++