[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 video analysis...