LongCut logo

[LINGUAGEM C] Aula 3: Aprendendo a programar

By debxp (Blau Araujo)

Summary

Topics Covered

  • Lógica de programação é um mito vendável
  • Linguagens são ferramentas, não o destino
  • Programar é construir processos, não buscar resultados
  • Assuma que só você pode resolver o problema
  • Só se aprende programando — e errando

Full Transcript

E aí, tudo tranquilo? Aqui é o Blau e esta é a aula três do nosso curso completo de programação na linguagem C, onde pelos nossos planos eu deveria

falar das ferramentas que nós vamos utilizar ao longo do curso e que talvez você quisesse instalar no seu sistema.

Mas eu mudei de ideia. Você ainda pode encontrar informações sobre essas ferramentas nas anotações da aula três, no finalzinho dessas anotações, lá no

nosso repositório, que é esse link aqui no vídeo e na descrição do vídeo. Mas o

papo que nós vamos levar aqui hoje não se encontra tão facilmente por aí.

Então, segura um pouco, fica até o final, porque a gente tem muito que conversar. Antes da aula, eu vim lá do

conversar. Antes da aula, eu vim lá do passado para pedir a sua atenção para dar um recado muito importante. A

elaboração e produção das aulas desse curso, que serão no total 80 aulas, me dá um trabalho enorme. E eu só estou

podendo fazer isso porque eu confiei totalmente o financiamento desse trabalho à comunidade. E por isso mesmo,

eu peço que você considere dar uma olhadinha na descrição do vídeo e escolher uma das várias formas de apoio que estão ali. É somente com o apoio da

comunidade que eu posso fazer esse trabalho e eu conto mais uma vez com você. Recado dado. Muito obrigado pela

você. Recado dado. Muito obrigado pela sua atenção e bora pra aula.

Essa exponencial inversa é a causa de uma das minhas maiores preocupações desde quando eu comecei a conduzir experiências de aprendizado de

programação ou cursos de programação, se você preferir. Ela mostra muito

você preferir. Ela mostra muito claramente a queda do interesse pela continuação das aulas, seja nos cursos em vídeos gravados, transmitidos ao vivo

ou até nos cursos pagos, que também são ao vivo por videoconferência. A

quantidade de aulas no gráfico mostra cursos de 5 semanas, coisa de 15 aulas, mas o resultado é o mesmo, seja qual for a duração. No gráfico, dá para ver

a duração. No gráfico, dá para ver direitinho qual é a evasão esperada em relação a qualquer uma dessas quantidades de aulas. E o mais

interessante é que o assunto do curso também não faz diferença. Pode ser curso de shell script, programação em baixo

nível, programação em C, AWK, enfim, tanto faz. E eu aposto que isso acontece

tanto faz. E eu aposto que isso acontece com qualquer curso de programação em vídeo ou presencial, seja de quem for, e

com raríssimas exceções. Essa minha

certeza não tem nada a ver com falta de modéstia. Eu tenho muita consciência das

modéstia. Eu tenho muita consciência das minhas limitações como professor, das limitações do ensino à distância e da

natureza de plataformas como o YouTube, onde por princípio tudo é entretenimento. Mas nem por isso eu

entretenimento. Mas nem por isso eu deixei de tentar outras abordagens e de investigar as possíveis causas. O fato é

que depois de 7 anos nessa atividade, para mim ficou muito claro que tirando a minha parcela de culpa e as particularidades da plataforma, o grosso

do problema estava em como as pessoas costumam encarar, o que significa aprender e especificamente no nosso

caso, o que significa aprender a programar. E isso é sintetizado muito

programar. E isso é sintetizado muito bem numa frase que eu ouço bastante, que é aquela que diz que programar é difícil.

Eu diria diferente. Eu diria que programar

diria diferente. Eu diria que programar não é fácil, assim como aprender não é fácil, programar não é fácil e a vida

também não facilita muito pra maioria de nós. Programar envolve lidar com

nós. Programar envolve lidar com diversas abstrações ao mesmo tempo.

Envolve construir o modelo mental do sistema computacional e da sua organização na cabeça. envolve

desenvolver a habilidade de pensar criticamente ou, como muitos dizem hoje em dia, pensar computacionalmente.

Enfim, são diversas habilidades a serem trabalhadas e todas elas têm que ser trabalhadas na prática. Tudo isso leva

muito tempo e requer muita dedicação. Em

contrapartida, qual é a sua motivação para aprender a programar? O vídeo do curso passou na sua timeline, você resolveu clicar para assistir por curiosidade, você está querendo se

preparar para concorrer a uma das poucas vagas disponíveis no mercado de trabalho enquanto elas ainda existem? Ou você só

gosta do assunto, quer aprender a criar programas para seu uso pessoal, para personalizar o seu sistema, enfim, qual

é a sua motivação? A sua motivação é suficiente para você empreender todo o esforço

necessário, todo custo envolvido no aprendizado da programação.

Essa é a pergunta. Programar é uma atividade humana criada por humanos para ser praticada por seres humanos.

Aprender a programar não requer nenhuma habilidade especial, além de uma boa interpretação de texto e uma capacidade

bem desenvolvida de se expressar objetivamente por escrito. Todo o resto se desenvolve com tempo, paciência e

prática. Você não precisa ter um talento

prática. Você não precisa ter um talento especial para aprender a programar. O

talento que existe, sim, existem pessoas talentosas, mas esses talentos só vão afetar o tempo em que o aprendizado vai

começar a surtir efeito. Para uns será quase que de imediato, para outros levará um tempo maior, mas o aprendizado vai acontecer de um jeito de outro e é

capaz que lá na frente você e essa pessoa talentosa possam conversar de igual para igual. O importante é que

tomada a decisão de aprender a programar, não desista, persista a menos que você esteja enfrentando condições

adversas. contornáveis. Não há motivo

adversas. contornáveis. Não há motivo para você desistir só porque encontrou uma dificuldade. Converse com outras

uma dificuldade. Converse com outras pessoas que estão aprendendo assim como você ou converse com alguém que está te ajudando a aprender a programar.

Recupere as forças, descanse. E eu não tô falando isso porque quero, porque quero que você siga a carreira da programação, que você seja uma pessoa

programadora, que continue estudando e praticando a área. Não é isso. Eu só

quero que você avalie se você não está desistindo quase que por um comportamento que você reforça sempre que encontra alguma dificuldade. Mas

isso quem sabe é você. E eu não tenho nada com isso. Eu só estou dando esse toque porque no papel de quem tá conduzindo o aprendizado, eu tenho que

apontar algumas armadilhas que nós mesmos criamos às vezes. Porque o fato é que programar também não é para todo mundo, assim como não é para todo mundo

ser professor, médico, advogado, enfermeiro, arquiteto, enfim, cada um sabe os seus gostos, sabe aquilo que motiva e o que desmotiva. E pra mim o

que importa é que se você chegou aqui é porque você tem algum interesse. Se você

tem interesse, por que não insistir um pouco mais? Por que não aplicar as

pouco mais? Por que não aplicar as nossas recomendações, as recomendações feitas para que você aprenda a aprender

e aprenda a programar? E é isso que nós vamos ver a partir de agora.

Eu acho que é legal a gente começar esse processo eh desmistificando certas ideias que as pessoas colocam na cabeça

que acabam se tornando obstáculos. E

entre tantos mitos, tem um que é muito recorrente, é aquela história de que médico e louco todo mundo tem um pouco.

E na hora de diagnosticar a própria dificuldade em aprender a programar, muita gente solta essa pérola. Ah, eu

entendo isso, aquilo. E o que me falta é só lógica de programação. O que é lógica

de programação? Isso não existe. Existe

de programação? Isso não existe. Existe

lógica, existe programação. E às vezes na escrita de um programa nós usamos alguns conceitos de lógica, mas o que o

pessoal chama popularmente de lógica de programação nada mais é do que a descrição do fluxo de execução de

programas, que a grosso modo é o conceito de algoritmo. É claro que essa expressão foi tão popularizada que você

vai encontrar cursos oferecendo lógica de programação, mas isso é uma flexibilização grosseira para vender curso. Não existe

lógica de programação e pensar dessa forma pode ser muito prejudicial pro seu aprendizado. E eu vou demonstrar um

aprendizado. E eu vou demonstrar um desses casos em que você fica travado justamente porque você está aprendendo a

tal lógica de programação. Bom, uma

pessoa programadora é uma pessoa especializada em solucionar problemas.

Aí eu vou e dou para você um problema.

Escreva um programa que imprima no terminal a mensagem salve simpatia. Aí

você que encontrou um vídeo qualquer aí na internet sobre lógica de programação, parte quase que de imediato para construir um fluxograma

na esperança de ali encontrar uma pista daquilo que você deve escrever no seu programa. Pois bem, eu vou pedir que

programa. Pois bem, eu vou pedir que você pause o vídeo um pouquinho, pense e escreva um fluxograma para esse programa. Quando você encontrar uma

programa. Quando você encontrar uma resposta ou desistir de encontrar uma resposta, pode dar o play novamente, porque eu vou mostrar qual é o

fluxograma desse programa. E aqui está ele. Nós temos um bloco de início, um

ele. Nós temos um bloco de início, um bloco de exibição com a mensagem salvo e simpatia e um bloco de fim. Nenhum

desses três blocos envolve lógica para começar. O que está descrito ali é o

começar. O que está descrito ali é o fluxo de execução de um programa. Pode

haver, pode, pode haver estruturas de decisão. E estruturas de decisão nós

decisão. E estruturas de decisão nós temos lógica. Nós podemos ter predicados

temos lógica. Nós podemos ter predicados que são funções que retornam verdadeiro ou falso. Então, tem lógica em

ou falso. Então, tem lógica em programas, tem, mas não tem a lógica de programação. Algoritmo tem. E isso daqui

programação. Algoritmo tem. E isso daqui é um algoritmo. Agora, com base nisso, escreva o programa. É aí que a porca

torce o rabo. Porque é verdade. E esse é um dos princípios fundamentais da prática, do exercício que você vai ter

que fazer daqui pra frente para aprender a programar. Você tem que pensar em

a programar. Você tem que pensar em procedimentos em vez de pensar em objetivos. Essa é uma das essências da

objetivos. Essa é uma das essências da prática da programação, mas existem outras abordagens para isso e que envolvem inclusive a criação de

fluxogramas e a aplicação dos conceitos de algoritmos, mas não como um ponto de partida e não como um conceito que é

colocado como uma condição para você conseguir aprender ou não a programar.

Às vezes as coisas são muito mais simples que parecem e às vezes coisas simples podem esconder complexidades

importantes de serem enfrentadas e não escondidas. Mas isso a gente vai ver

escondidas. Mas isso a gente vai ver mais para frente.

Outro mito importante que a gente precisa esclarecer é essa associação equivocada entre aprender uma linguagem

e aprender a programar. Aprender a

programar não é aprender linguagens. E

isso pode parecer meio irônico, já que a gente tá aqui num curso de programação na linguagem C, mas isso tem a ver com a

forma que eu pessoalmente considero mais eficaz para você praticar a programação, que é utilizando uma linguagem do mundo

real. As linguagens são importantes

real. As linguagens são importantes porque são elas que definem os elementos formais, a sintaxe que nós poderíamos

utilizar. para expressar ideias. E é

utilizar. para expressar ideias. E é

assim que as linguagens devem ser vistas, como ferramentas para expressar ideias. E é por isso que durante o

ideias. E é por isso que durante o aprendizado da programação, aprender uma linguagem precisa necessariamente ser

encarada como uma oportunidade para praticar o que realmente importa conhecer e desenvolver, como é o caso da compreensão do ambiente de execução de

programas, o pensamento crítico, o raciocínio lógico, a habilidade de abstrair os estilos de programação,

padrões de projetos, arquiteturas de software, isso entre tantas outras habilidades e fundamentos que toda pessoa programadora deve dominar. Também

é por isso que nós devemos escolher com muito cuidado a linguagem que a gente vai utilizar para começar a aprender. Em

programação não existe uma coisa que existe na música, que são os instrumentos de entrada, instrumentos para iniciantes. E em programação não

para iniciantes. E em programação não existem linguagens de entrada. O que

existe são linguagens que têm aplicações no mundo real e as linguagens que não têm aplicação no mundo real. O que eu

sugiro é que a escolha seja feita de acordo com o que você pretende fazer com a sua habilidade de programar, mas sempre preferindo essas linguagens que

eu chamo de linguagens do mundo real. E

a principal razão é muito simples.

Poucas coisas superam a satisfação de ver que algo que a gente fez funciona e tem algum uso prático. Isso funciona

como reforço positivo e é essencial para qualquer processo de aprendizado. A

única restrição que eu faria na escolha da linguagem diz respeito a prioridades.

No começo, a gente deve evitar linguagens que se expressem por nós, porque esse tipo de linguagem esconde da

gente justamente o que a gente precisa aprender. Por exemplo, linguagens

aprender. Por exemplo, linguagens abstratas demais, como Python, Rubby e JavaScript.

Abstração significa esconder complexidade. E no caso dessas

complexidade. E no caso dessas linguagens, a gente perde a oportunidade de pensar em termos de memória, modelo de máquina e coisas do tipo. Também

devem ser evitadas aquelas linguagens que são fortemente mediadas por frameworks ou os próprios frameworks,

linguagens como Java e C#ARP, por exemplo, são muito utilizadas para fazer ligações entre bibliotecas que no fim das contas fazem todo o trabalho, fazem

tudo aquilo que a gente deveria estar aprendendo a fazer. E também é importante evitar linguagens com excesso de camadas automáticas. As linguagens

que resolvem muitos problemas que são reais, mas nós nem sabemos que eles existem e nem compreenderíamos porque eles são problemas num primeiro momento.

É o caso de linguagens como rust e go.

Essas são as linguagens que a gente deve evitar. Tá proibido? Não, não é

evitar. Tá proibido? Não, não é proibido. É apenas uma recomendação para

proibido. É apenas uma recomendação para que você garanta a sua exposição a tudo aquilo que você precisa vivenciar no seu

processo de aprendizado. As linguagens

que eu recomendo são três. A minha

primeira sugestão, e você vai encontrar muita coisa sobre essa linguagem aqui no canal, é você utilizar uma linguagem de

shell script. linguagens do Shell Unix,

shell script. linguagens do Shell Unix, como por exemplo, a linguagem que eu mais recomendo é o BH. Além de estar

disponível por padrão em todo o sistema Gul Linux, o B é uma linguagem de alto nível, de propósito específico, aquelas

linguagens de quarta geração que eu falei na aula um, e está fortemente associada ao próprio ambiente de

execução de sistemas. Unix e parecidos com Unix. Então, em vez de utilizar uma

com Unix. Então, em vez de utilizar uma pseudolinguagem, você pode utilizar o beste. A outra linguagem que eu

beste. A outra linguagem que eu recomendo é essa que nós vamos estudar aqui no curso, a linguagem C. Porque a

linguagem C, sem ser uma linguagem de baixo nível, como é o caso do assembly, ou seja, existem ali algumas abstrações,

ela não esconde os aspectos fundamentais da computação. Muito pelo contrário,

da computação. Muito pelo contrário, você vai ter que lidar o tempo todo com aspectos de representação de dados, tipagem, gerenciamento manual de

memória, organização de programas e unidades de compilação. Então, ela é excelente para o nosso aprendizado. Por

último, a terceira linguagem que eu recomendo que você aprenda, e também tem muita coisa aqui no canal sobre ela, é a linguagem assembly, especialmente o

assembly na para a plataforma Linux e arquitetura X8664.

O assembly é uma linguagem simbólica que representa quase diretamente as instruções da arquitetura do hardware.

Então você vai ter contato com o funcionamento da própria CPU, os registradores, que são as memórias internas de CPU, a pilha de execução na

memória principal, o fluxo de controle e o acesso à memória. Tudo isso tem que ser escrito passo a passo. Então, é uma linguagem excelente para complementar o

seu aprendizado. Eu ficaria com esse

seu aprendizado. Eu ficaria com esse tripé beh, linguagem C e assemble. De

qualquer forma, a escolha é sempre sua.

Só toma cuidado para não acabar se tornando um especialista numa linguagem.

Esse não é o alvo do seu aprendizado. Em

vez disso, a gente deve buscar a especialização na solução de problemas, porque é isso que define o que uma pessoa programadora faz.

A primeira coisa que a gente tem que deixar muito clara é que solução é diferente de resultado. Solucionar

problemas não é obter resultados.

Resultados nós teremos sempre e inevitavelmente resultados são circunstâncias do problema. O que

interessa pra gente é a solução. E

solucionar significa encontrar os processos que levam aos resultados. Essa

é uma virada de chave importante que você tem que fazer desde já no seu aprendizado da programação. Você não tem

compromisso com resultados. você tem

compromisso com os processos que levam aos resultados. E é isso que a gente

aos resultados. E é isso que a gente chama de solucionar um problema.

Inclusive, a gente tem que começar a ver os enunciados dos problemas como uma outra forma de expressar a solução.

Veja, se o meu problema for, faça um sanduíche de geleia. Esse enunciado é uma abstração de todos os processos que

levarão ao sanduíche de geleia, que é o resultado. Tudo o que acontece no meio é

resultado. Tudo o que acontece no meio é apenas uma tradução desse enunciado sob a forma de processos. E é importante a

gente entender também que os processos são as etapas da solução que vão produzir ou alterar estados no ambiente de execução do programa. Ou seja, o

valor de uma variável que será alterado, um buffer que vai receber a digitação interativa do usuário ou ainda o retorno

de alguma função que vai abstrair outros processos. e especificamente em

processos. e especificamente em programação procedural. Esses estados,

programação procedural. Esses estados, cada um deles pode ser considerado um resultado que lá no final vai levar ao

resultado esperado pelo enunciado do problema. Recapitulando que a gente viu

problema. Recapitulando que a gente viu até aqui, soluções são processos que levam ao resultado. O que a gente tem que trabalhar é na construção desses

processos. Resultados são estados,

processos. Resultados são estados, estados intermediários e o estado final após a execução do programa. Sendo

assim, a gente também pode dizer que programar é construir os caminhos entre diversos estados até um estado final, um

resultado final. Da mesma forma, a gente

resultado final. Da mesma forma, a gente também pode dizer que um conjunto de processos é um método. Então, a solução

também pode ser considerada um método. E

aí a gente chega num ponto fundamental do aprendizado da programação, que é programar requer responsabilidade

e método. que você não coloca na cabeça

e método. que você não coloca na cabeça que você é a única pessoa no universo com a responsabilidade de solucionar um

determinado problema, você não vai sair no lugar, você vai ficar travado, vai entrar num estado que eu chamo nas salas de aula de inércia passiva. Você não vai

inclusive ser capaz de utilizar os métodos para encontrar soluções. Eu sei

que você é uma pessoa responsável e provavelmente tem um bom senso de dever, mas não é dessa responsabilidade que eu tô falando. Eu tô falando de uma

tô falando. Eu tô falando de uma responsabilidade que você deve assumir internamente para conseguir superar essa

inércia. Então faça de conta. Você é a

inércia. Então faça de conta. Você é a única pessoa do universo. Não existe

mais ninguém capaz de solucionar o problema. Qual é o resultado disso? você

problema. Qual é o resultado disso? você

não sabe por onde começar, você vai dar o seu jeito. Você vai pesquisar na internet, você vai perguntar em grupos de ajuda, você vai ver o código de outras pessoas, enfim, você vai se

virar. E essa também é uma forte

virar. E essa também é uma forte característica daquelas pessoas que a gente chama de autodidatas, né?

Autodidata é aquela pessoa que aprende a se virar.

Por último, a gente precisa estabelecer um conjunto de práticas e hábitos, porque só se aprende a programar programando. Você não vai aprender a

programando. Você não vai aprender a andar de bicicleta assistindo a tutoriais no YouTube ou lendo livros.

Você tem que pedalar, cair, levantar, tentar novamente até pegar o jeito. E a

programação é igualzinho. Não tem nada de diferente desse exemplo. Você só

consegue aprender a programar programando, tendo, é claro, tudo que nós conversamos aqui na aula em mente.

Escrever programas é encontrar soluções.

Então, é desta forma que você pratica a escrita de programas. E eu vou mostrar como se faz isso na próxima aula. Outra

coisa que ajuda demais é você estudar o código das outras pessoas. Programar não

é só você escrever programas, você também precisa aprender a ler e interpretar o código de outras pessoas.

E melhor ainda, tendo entendido as intenções de outra pessoa programadora, tente encontrar soluções do seu próprio jeito. Refaça esses programas do seu

jeito. Refaça esses programas do seu jeito e depois exponha o seu código a críticas. Coloque num repositório, num

críticas. Coloque num repositório, num GitHub, no Codeberg, no Gitab. Tanto

faz. O importante é você ter um local para você armazenar o seu código, mostrar para outras pessoas que estão aprendendo, mas também mostrar para

pessoas mais experientes para que os seus erros sejam expostos e você possa receber críticas. Você tem que superar

receber críticas. Você tem que superar também a vergonha de errar. Talvez esse

o medo de errar seja o maior obstáculo a qualquer tipo de aprendizado. E na

programação, isso é até mais importante, porque você só tem um momento em que você pode errar. Você não vai poder errar depois que pegar um projeto para

fazer profissionalmente ou pegar uma vaga de emprego. O único momento em que você pode errar é agora enquanto você está aprendendo. Então erre bastante,

está aprendendo. Então erre bastante, aproveite, erre enquanto você pode para que quando chegar o momento de aplicar tudo que você aprendeu, você possa

entregar aquilo que se espera de uma pessoa que programa. E eu vou dar uma outra dica que pode acelerar demais o processo de aprendizado, que é você se

envolver com projetos de software livre.

Você pode começar o seu envolvimento lendo o código de algum projeto livre que seja do seu interesse, acompanhando

as discussões nas issues desses projetos ou nas mailing lists desses projetos, o que inclusive vai ajudar numa outra

habilidade que precisa ser desenvolvida, que é a capacidade de ler em inglês.

Isso é fundamental na nossa área, porque toda a documentação é em inglês, todas as conversas e discussões nesses projetos são em inglês. É muito difícil

achar alguma coisa em português. Então,

aproveite, porque participar de projetos de software livre vai te ajudar de várias formas. Agora, o que não pode

várias formas. Agora, o que não pode faltar, principalmente no começo, é o hábito de você anotar as suas descobertas. É você anotar, coloca isso

descobertas. É você anotar, coloca isso num blog, inclusive para poder ajudar outras pessoas ou para você mesmo, como se fosse um diário, para você mesmo

acompanhar o seu progresso. E talvez até isso funcione com o seu livro das sombras e que você participando de grupos de ajuda, de fóruns, etc., você

possa compartilhar suas anotações para ajudar outras pessoas também que estão aprendendo igual a você. Então, essas

dicas têm que virar uma rotina na sua vida a partir de agora. E é assim que eu espero que você também conduza o seu próprio aprendizado. Muito bem, na

próprio aprendizado. Muito bem, na próxima aula nós vamos colocar tudo isso em prática. E a você que assistiu até o

em prática. E a você que assistiu até o final, meu muito obrigado e até lá.

Loading...

Loading video analysis...