O Que É Programar: Instruções, Máquinas e Linguagens

O Que É Programar: Instruções, Máquinas e Linguagens

A aula que assenta a fundação de tudo: o que significa, de fato, programar. Por que a máquina obedece sem pensar, por que programar é decompor um problema em passos sem ambiguidade, e como a linguagem de programação faz a ponte entre a intenção humana e a execução binária.
Linguagem C#

• • 10 min de leitura

Se você nunca escreveu uma linha de código, esta é a aula mais importante de todas — não porque ensine algo difícil, mas porque constrói a fundação sobre a qual tudo o mais se apoiará. Antes de instalar qualquer coisa ou digitar qualquer comando, você precisa entender, com clareza e sem pressa, o que de fato é programar. Muitos cursos pulam essa reflexão, ansiosos por chegar ao código, e o resultado é um aluno que digita instruções sem compreender o que está acontecendo por baixo. Não faremos isso. Nesta aula, não há código para escrever; há uma ideia para assentar. E a ideia é esta: programar é a arte de dar instruções precisas a uma máquina que não pensa, numa linguagem que ela — com ajuda — consiga entender.

A máquina que só obedece

Comecemos pelo protagonista da história: o computador. É fácil, no mundo de hoje, atribuir inteligência a essas máquinas — elas respondem perguntas, reconhecem rostos, recomendam filmes. Mas por baixo de toda essa aparente esperteza há uma verdade humilde e libertadora: o computador não pensa, não decide nada por conta própria, e não faz absolutamente nada que não lhe tenha sido mandado fazer. Ele é, no fundo, uma máquina extraordinariamente rápida e obediente, capaz de executar instruções simples — somar dois números, comparar dois valores, guardar um dado numa gaveta — bilhões de vezes por segundo, sem jamais se cansar, se distrair ou improvisar.

Essa obediência cega é, ao mesmo tempo, o poder e a exigência da programação. O poder: se você souber decompor um problema numa sequência de instruções suficientemente simples, o computador as executará com velocidade e precisão sobre-humanas. A exigência: ele fará exatamente o que você mandar, nem mais, nem menos — inclusive quando o que você mandou não é o que você queria. Um computador nunca "entende o que você quis dizer"; ele executa o que você disse. Guarde esta frase, porque ela explicará, ao longo de todo o curso, por que seus programas às vezes farão coisas surpreendentes: não porque a máquina errou, mas porque a instrução que você deu, tomada ao pé da letra, levava àquele resultado.

Programar é decompor e instruir

Se o computador só executa instruções simples, então programar é, essencialmente, duas coisas. Primeiro, decompor um problema grande e vago numa sequência de passos pequenos e precisos — tão pequenos que cada um caiba dentro do que a máquina sabe fazer. Segundo, escrever esses passos numa forma que possa, eventualmente, ser executada. Um programa, portanto, é nada mais que uma receita: uma sequência ordenada de instruções que, seguidas na ordem certa, produzem um resultado desejado.

A analogia da receita culinária é imperfeita, mas útil para começar. Quando uma receita diz "bata as claras em neve", ela conta com um cozinheiro que sabe o que são claras, o que é "em neve", e quando parar de bater — ela conta com julgamento humano. Uma instrução de computador não pode contar com nada disso. Seria como escrever uma receita para alguém que nunca cozinhou, não sabe o que é um ovo, e seguirá cada palavra ao pé da letra sem nunca perguntar "você quis dizer...?". Você teria de dizer: pegue o ovo; segure-o sobre a tigela; bata-o contra a borda com força moderada; separe as duas metades da casca; deixe o conteúdo cair na tigela. A precisão exigida na programação é dessa ordem — e aprender a pensar nesse nível de detalhe é a verdadeira habilidade que você desenvolverá, muito mais do que decorar comandos.

O abismo entre humano e máquina, e a ponte da linguagem

Aqui surge um problema. Nós, humanos, pensamos em ideias amplas e ambíguas ("faça uma lista das minhas tarefas e mostre as mais urgentes"). O computador, no seu nível mais fundo, só entende sinais elétricos, representados como sequências de zeros e uns — a chamada linguagem de máquina. Escrever um programa diretamente em zeros e uns é possível, mas seria tão penoso e propenso a erros que praticamente ninguém o faz. Há um abismo entre como pensamos e como a máquina "entende".

A ponte sobre esse abismo é a linguagem de programação. Uma linguagem de programação é um idioma intermediário: estruturado e preciso o bastante para não ser ambíguo à máquina, mas legível e expressivo o bastante para um humano escrever e entender. Você escreve suas instruções nessa linguagem — que se parece, de longe, com uma mistura de inglês com matemática — e um programa especial se encarrega de traduzir o que você escreveu para a linguagem de máquina que o computador executa. Existem muitas linguagens de programação, cada uma com suas virtudes e seu campo de aplicação; a que aprenderemos neste curso chama-se C# (lê-se "cê sharp", ou "sí charp", à inglesa).

Por que C#

Toda escolha de linguagem para começar tem defensores e críticos, e serei honesto quanto à nossa. O C# é uma linguagem madura, versátil e muito usada no mercado, criada pela Microsoft e hoje aberta e disponível em qualquer sistema operacional. Ela é ao mesmo tempo rigorosa — o que a torna uma excelente professora de bons hábitos, pois te obriga a ser preciso e te avisa cedo quando algo está errado — e produtiva, permitindo construir desde pequenos programas de terminal até sites, aplicativos de celular, sistemas empresariais e jogos. Essa amplitude é uma vantagem pedagógica: o que você aprender aqui não ficará restrito a exercícios acadêmicos; abrirá portas reais. Ao longo do curso, começaremos com programas simples que rodam numa janela de texto e, ao final, chegaremos a bancos de dados, sites e até jogos — tudo com a mesma linguagem.

Não afirmo que o C# seja "a melhor" linguagem — essa é uma pergunta sem resposta única, pois depende do que se quer fazer. Afirmo que é uma escolha excelente para aprender a programar corretamente e para construir coisas reais, e que os conceitos fundamentais que você dominará aqui — o que é uma variável, um laço, uma função, um objeto — são universais: uma vez entendidos em C#, transferem-se, com pequenas adaptações de sotaque, para praticamente qualquer outra linguagem que você venha a aprender depois. Você não está aprendendo apenas C#; está aprendendo a programar, e usando o C# como seu primeiro idioma.

Nenhuma linha de código foi escrita aqui, e ainda assim o mais importante já está no lugar. Você sabe agora que a máquina não pensa, não infere e não perdoa imprecisão: ela obedece, literalmente, à instrução que recebe. Sabe que programar é decompor um problema em passos tão pequenos que não reste ambiguidade em nenhum deles. E sabe que a linguagem de programação existe para ser a ponte entre o modo humano de descrever intenções e o modo binário como a máquina opera.

Essa fundação parece modesta, mas é ela que separa quem digita comandos de quem compreende o que está acontecendo. Guarde a ideia central: a precisão não é uma exigência burocrática da linguagem, é a condição para que uma máquina sem juízo próprio faça exatamente o que você quis.

Fontes e leituras recomendadas

Exercícios

Exercício 1

Com suas palavras, explique por que se diz que "o computador faz exatamente o que você manda, e não o que você quer". Dê um exemplo do cotidiano (fora da programação) em que seguir uma instrução ao pé da letra produziria um resultado diferente da intenção.

Ver resposta

✓ Resposta: A frase significa que o computador não interpreta intenções nem corrige o que você disse com base no que você provavelmente queria — ele executa literalmente a instrução recebida. Um exemplo do cotidiano: se você pede a alguém extremamente literal para "colocar tudo o que está na mesa no lixo", e sobre a mesa está também sua carteira, essa pessoa jogará a carteira fora, porque cumpriu a instrução ao pé da letra, ainda que não fosse sua intenção. O computador age assim o tempo todo.

Exercício 2

Escolha uma tarefa simples do dia a dia (fazer um sanduíche, escovar os dentes, atravessar a rua) e escreva-a como uma sequência de instruções tão detalhadas quanto você conseguir, imaginando que quem vai executá-las não tem nenhum julgamento próprio. Depois, releia e encontre pelo menos um passo que ainda dependia de "bom senso" não explicitado.

Ver resposta

✓ Resposta: (Resposta pessoal; um bom exemplo para "fazer um sanduíche" seria: pegue duas fatias de pão; pegue a manteiga; passe a manteiga numa face de cada fatia; e assim por diante.) O valor do exercício está no segundo passo: quase inevitavelmente sobrará um passo que dependia de bom senso — por exemplo, "passe a manteiga" pressupõe saber quanta manteiga, com o quê passá-la, e em que face. Perceber esses "buracos de bom senso" é justamente perceber onde a máquina precisaria de instruções ainda mais detalhadas.

Exercício 3

Explique, com suas palavras, o que é uma linguagem de programação e qual problema ela resolve. Por que não escrevemos programas diretamente na linguagem de máquina (zeros e uns)?

Ver resposta

✓ Resposta: Uma linguagem de programação é um idioma intermediário, estruturado e preciso, no qual escrevemos instruções que depois são traduzidas para a linguagem de máquina que o computador executa. Ela resolve o problema do abismo entre como humanos pensam (em ideias amplas) e o que a máquina entende (sinais elétricos, zeros e uns). Não escrevemos diretamente em zeros e uns porque isso seria extraordinariamente penoso, lento e propenso a erros — a linguagem de programação nos permite expressar as instruções de forma legível e gerenciável, deixando a tradução para as ferramentas.

Exercício 4

A aula afirma que programar é, essencialmente, "decompor e instruir". Reflita sobre qual das duas partes você acha que será mais difícil de aprender e por quê. (Não há resposta certa; é um exercício de reflexão sobre o que o espera.)

Ver resposta

✓ Resposta: (Resposta pessoal e reflexiva.) Uma reflexão comum e válida é que decompor costuma ser o mais difícil no longo prazo: aprender os comandos de uma linguagem (a parte de "instruir") é uma questione de estudo e prática, mas treinar a mente para quebrar um problema vago em passos precisos e completos é uma habilidade que se desenvolve devagar, com muitos exercícios. Qualquer resposta bem justificada é adequada; o objetivo é você entrar no curso ciente de que a maior parte do desafio é de raciocínio, não de memorização.

Exercício 5

Sem pesquisar exaustivamente, cite dois tipos diferentes de coisas que se pode construir programando (por exemplo, um tipo mencionado na aula e outro que você conheça do seu cotidiano) e explique, em uma frase cada, por que ambos são, no fundo, "sequências de instruções para uma máquina".

Ver resposta

✓ Resposta: (Resposta pessoal.) Por exemplo: um jogo (mencionado na aula) e um aplicativo de banco no celular. Ambos são, no fundo, sequências de instruções para uma máquina porque cada ação que eles realizam — mover um personagem na tela, verificar um saldo, mostrar um botão — é o resultado de instruções precisas que alguém escreveu e que o computador executa passo a passo, por mais sofisticado que o resultado final pareça.

Comentários

Mais em Linguagem C#

Depuração: Encontrando e Corrigindo Erros
Depuração: Encontrando e Corrigindo Erros

A aula que ensina a lidar com o erro como parte do trabalho: os três tipos de…

Genéricos: Escreva uma Vez, Use com Qualquer Tipo
Genéricos: Escreva uma Vez, Use com Qualquer Tipo

Como escrever uma estrutura ou algoritmo uma única vez e usá-lo com qualquer…

Do PostgreSQL ao MySQL: a Mesma Aplicação, Outro Banco
Do PostgreSQL ao MySQL: a Mesma Aplicação, Outro Banco

A mesma aplicação migrada do PostgreSQL para o MySQL trocando apenas o…