Hoje em dia, a programação tornou-se uma habilidade cada vez mais essencial: como designer, entender um pouco de programação pode ajudá-lo a compreender melhor o seu trabalho; como empreendedor, a figura de fundador técnico torna muitas tarefas mais fáceis. E, como iniciante, ao enfrentar a vasta quantidade de informações disponíveis, talvez nem saiba por onde começar; após passar por materiais básicos e fáceis, a aprendizagem torna-se mais difícil, e a curva de aprendizagem íngreme faz você recuar; você sabe como imprimir alguns textos na página, mas não sabe quando deve iniciar um projeto realmente útil; você não tem clareza sobre o que ainda não sabe, e nem consegue decidir qual será o próximo passo de aprendizagem.
Este artigo não só oferece algumas orientações direcionais, como também apresenta uma introdução de base central à programação. Claro, uma rota passo a passo não é realista, e cada pessoa possui suas próprias características, portanto, esta orientação de introdução à programação serve mais para estimular o seu pensamento, ajudando-o a formar uma rota de aprendizagem que seja adequada a você.
Mas atenção: este artigo é dirigido àqueles que realmente desejam aprender a programar — aqueles que estão determinados a fazer algo de verdade, que não vão desistir até criar alguma coisa concreta; não é para quem apenas acha que “programar é divertido”. Na minha opinião, esse tipo de pessoa nunca entrará na porta da programação, muito menos criará algo decente.
Embora o tom do artigo seja de “opiniões fortes, convicções fracas” (Strong Opinions, Weakly Held), o leitor deve sempre questionar a precisão do que escrevemos, como faria com tudo ao seu redor. Se tiver dúvidas, sinta-se à vontade para discutir abertamente.
Ajuste de mentalidade
Definição de objetivos
Antes de começar a aprender programação, pense nos seus objetivos. Quando você tem um objetivo final claro, o caminho fica mais nítido. Então, o que você quer criar? Um site? Um jogo? Um app para iOS ou Android? Ou talvez você queira automatizar tarefas chatas para ter mais tempo para apreciar a vista lá fora? Talvez seu objetivo seja apenas aumentar sua competitividade no mercado de trabalho. Todos esses são objetivos válidos, que impulsionam seu aprendizado de programação. Sem motivação, é difícil avançar na longa e às vezes monótona jornada de aprendizagem.
Este vídeo pode te inspirar: “Coisas que a maioria das escolas não ensina”
Não se apresse
Programar mal é fácil. Até mesmo os “Dummies” podem aprender em 21 dias. Programar bem exige reflexão, mas qualquer um pode fazer isso e todos podem experimentar a satisfação extrema que vem com ela. 糟糕的编程很容易。即使是傻⽠也能在21天内学会它。好的编程需要思考,但每个⼈都能做到,每个⼈都能体验到它带来的极度满⾜感。
Seja na livraria física ou online, há muitas obras de “Aprenda X em 21 dias”, prometendo que em pouco tempo você dominará a tecnologia. Matthias Felleisen, em seu livro How to Design Programs, aponta claramente essa tendência de “soluções rápidas” e faz uma crítica irônica a ela.
A “atalho” ou a “bala de prata” simplesmente não existe. Como dizem os sábios, dominar algo leva 10 anos ou 10.000 horas — é o famoso “dez anos de afiamento de uma espada”. Portanto, não se apresse; o esforço vale a pena.
Cultive o interesse
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
⼤多数优秀的程序员做编程不是因为他们期望得到报酬或得到公众的崇拜,⽽是因为编程很有趣。
– Linus Torvalds
Apaixone-se por programar, pois o próprio ato de programar é uma fonte inesgotável de motivação. Mantenha esse sentimento de entusiasmo para que possa dedicá-lo às suas 10.000 horas de prática. Programar é divertido — é a alegria da exploração. É a alegria da criação. Ver seu trabalho na tela, fazer as pessoas admirarem seu código, que seus vizinhos usem seu produto, ou que a mídia discuta sua criação, tudo isso é muito divertido. Programar deve ser extremamente prazeroso; se não for, identifique o que torna a programação entediante e resolva isso.
Comece a aprender
História que desperta atenção
Quando entrei no ensino médio, comecei a aprender programação. Infelizmente, li vários livros considerados lixo na época, como 21 Days to Master C++. Apesar de conseguir fazer pequenos programas, quando o software apresentava falhas, eu não sabia por quê; problemas maiores eram difíceis de resolver, e muitas vezes tinha que aceitar limitações das bibliotecas existentes. Apesar de codificar todos os dias, percebia que minha habilidade de programar evoluía lentamente, com uma compreensão muito limitada de conceitos como “iterar” e “recursão”. Basicamente, usava o computador como uma calculadora.
Depois de entrar na faculdade, estudei física. No começo, memorizava fórmulas físicas sem entender de onde vinham, suas conexões ou seu significado. Aprendia a resolver problemas físicos comuns, mas não compreendia o porquê por trás do “como”.
Quando tentei criar jogos de computador baseados em física, encontrei dificuldades semelhantes: não sabia como resolver novos problemas, o medo de enfrentá-los aumentava, e comecei a evitar entender de verdade, apenas copiando e colando códigos do Google. Felizmente, uma aula na faculdade mudou completamente minha abordagem de aprendizagem. Foi a primeira vez que senti que tinha “abrido meus olhos”. Percebi que tinha uma compreensão muito limitada de disciplinas essenciais, incluindo física e ciência da computação.
Sobre essa aula: acabávamos de estudar eletricidade e relatividade, e o professor escreveu esses tópicos no quadro, conectando-os com uma linha. “Suponha que temos um elétron se movendo ao longo de um fio a uma velocidade relativística…”, inicialmente, ele apenas escreveu fórmulas familiares de eletricidade e relatividade, mas após algumas derivações algébricas, a fórmula do campo magnético apareceu de forma mágica. Embora eu já conhecesse essa fórmula há anos, na época não percebia as conexões subjacentes entre esses fenômenos. A diferença entre magnetismo e eletricidade é apenas uma questão de “ângulo de observação”. De repente, percebi que não deveria mais focar apenas em “como fazer” (How), mas também em “por que” (why). Comecei a revisitar os fundamentos, estudando o que deveria ter aprendido desde o início. Esse processo de volta às raízes foi doloroso, mas espero que sirva de alerta: nunca cometa esse erro.
Reflexões após o alerta
Esta imagem é retirada do livro Gödel, Escher, Bach de Douglas Hofstadter. Cada letra nesta imagem é composta por letras menores. No nível mais alto, vemos “MU”, onde M é formado por três HOLISM (holismo), e U por uma REDUCTIONISM (redução). Cada letra contém a outra, e vice-versa. No nível mais baixo, a menor letra é composta por “MU” repetido.
Cada nível de abstração contém informações. Se você apenas observa de forma ingênua, usando o holismo no nível mais alto ou a redução no mais baixo, obterá apenas “MU” (que em alguns dialetos significa “nada”). A questão é: como obter o máximo de informações de cada nível? Ou, em outras palavras, como aprender o vasto conhecimento de áreas complexas como a programação?
Um problema comum na educação e na aprendizagem é que os iniciantes muitas vezes focam demais na visão holística, negligenciando os fundamentos. Por exemplo, eles querem construir um robô, mas não compreendem os modelos físicos por trás, o que limita sua capacidade de construir e diagnosticar problemas no futuro.
Se os iniciantes apenas interagirem com “motores e componentes” pré-construídos (sem entender os princípios de sua construção), suas habilidades de construir esses componentes no futuro serão severamente limitadas, dificultando o diagnóstico de problemas.
O segundo erro é menos óbvio: a abordagem ingênua de holismo às vezes parece eficaz, mas tem uma armadilha oculta. Quando você avança na aprendizagem, tentar voltar e “reforçar os fundamentos” será muito mais difícil psicologicamente. Você precisará abandonar conceitos equivocados e avançar com paciência, o que é mais difícil do que aprender os fundamentos inicialmente.
Por outro lado, não se deve exagerar na redução, caindo na armadilha de tentar fazer tudo com teoria pura desde o começo. Isso pode levar à teoria vazia e ao tédio, além de perder a motivação. Essa situação é comum em estudantes de ciência da computação.
Para entender melhor, podemos comparar aprender programação a aprender culinária: você compra livros de receitas para fazer boas refeições. Se seu objetivo é apenas cozinhar para a família, essa estratégia funciona bem; seguir as receitas à risca pode produzir pratos decentes. Mas, se deseja impressionar amigos com pratos incríveis ou se tornar um grande chef, precisa entender as ideias por trás das receitas, compreender a teoria, e não apenas praticar de forma mecânica. Se você passar dias apenas lendo livros teóricos sem praticar, acabará sendo um cozinheiro ruim ou, pior, nunca se tornará um chef, pois a monotonia fará você desistir.
Resumindo, programação é a ponte entre teoria e prática, uma área onde ciência da computação e aplicações se encontram. A abordagem correta de aprendizagem deve combinar exploração autodirigida e prática de projetos, adquirindo intuição e motivação; e, ao mesmo tempo, fundamentar-se na base sólida, consolidando o entendimento do pensamento computacional.
Como iniciante, deve priorizar a exploração prática, usando a teoria como suporte.
Fundamentos de Design de Programas
“Qual linguagem de programação devo aprender?” Essa é uma das primeiras perguntas de iniciantes, mas é uma questão equivocada. O mais importante é: “Quais elementos constituem a base do aprendizado de programação?”
No topo da pirâmide do conhecimento de programação, há três componentes essenciais:
Pensamento algorítmico: por exemplo, como encontrar o maior número em um conjunto? Primeiro, você precisa de uma variável maxSoFar, e depois, para cada número…
Sintaxe: como expressar esses algoritmos em uma linguagem de programação para que o computador os compreenda.
Fundamentos do sistema: por que o thread nunca termina ao executar while(1)? Por que a função int *foo() { int x = 0; return &x; } é inválida?
Para iniciantes na fase de introdução, escolher C como primeira linguagem pode ser difícil e entediante, pois eles precisam aprender esses três componentes ao mesmo tempo, gastando muito tempo antes de fazer qualquer coisa prática.
Por isso, para minimizar o esforço em aprender sintaxe e fundamentos do sistema, recomenda-se usar Python como primeira linguagem. Apesar de ser amigável para iniciantes, isso não significa que seja apenas um “brinquedo”; em grandes projetos, sua força e flexibilidade também aparecem. Após se familiarizar com Python, aprender C é uma boa escolha: ajuda a pensar de forma mais próxima do hardware e, posteriormente, a entender alguns princípios do sistema operacional.
A seguir, uma orientação de introdução que ajudará a construir uma estrutura geral na sua mente, facilitando a exploração de cima para baixo. Os materiais listados não têm uma ordem rígida; escolha um e, se ficar preso, considere outro.
MIT 6.00.1x (Introdução à Ciência da Computação e Programação em Python). Apesar de a linguagem de ensino ser Python, como uma excelente introdução, ela enfatiza conceitos e paradigmas essenciais da ciência da computação, não apenas ensinar uma linguagem específica. Para quem não é de ciência da computação, essa disciplina amplia horizontes; conteúdo: conceitos de computação, programação em Python, estruturas de dados simples, algoritmos, testes e depuração.
Harvard CS50x (Ciência da Computação, Harvard). Também uma disciplina introdutória, complementando a do MIT. As linguagens envolvidas incluem C, PHP, JavaScript + SQL, HTML + CSS. O conteúdo é abrangente e profundo, permitindo conhecer as últimas inovações tecnológicas, o que pode estimular bastante o interesse pela área. Tarefa adicional: leitura de Coding.
Após essa fase de introdução, você terá uma base de código e uma compreensão geral de programação. Nesse momento, talvez queira aprender uma tecnologia específica, como desenvolvimento web, Android ou iOS. Pode tentar criar algo simples, dando-se feedback positivo, alimentando sua motivação. Mas lembre-se de não se aprofundar demais agora; essas tecnologias têm muitos detalhes, que podem ser estudados no futuro. Da mesma forma, evite focar em frameworks ou linguagens específicas neste momento; o momento é de aprender os fundamentos da ciência da computação. Não tente atalhos ou aprender diretamente o que deseja agora, pois isso provavelmente levará ao fracasso.
Então, o que fazer na fase de introdução? Reflita sobre seus próprios programas: por que você os projetou assim? Como escrever melhores programas? Tente entender a essência da programação: usar o computador para resolver problemas.
Suposições:
X = tempo dedicado à reflexão e solução de problemas
Y = tempo dedicado à implementação do código
Capacidade de programação = F(X, Y) (X>Y)
Para melhorar essa capacidade, é preciso otimizar X, Y e a função F(X, Y). Poucas obras abordam esses três aspectos simultaneamente, mas uma que consegue é Structure and Interpretation of Computer Programs (SICP). Ela mostra como abstrair e decompor problemas, permitindo lidar com questões mais complexas — um avanço enorme na capacidade de programação, mudando fundamentalmente sua forma de pensar e resolver problemas com código. Além disso, a linguagem de ensino do SICP é Scheme, que introduz conceitos de programação funcional. Sua sintaxe é bastante simples, permitindo aprender rapidamente e dedicar mais tempo às ideias de programação e resolução de problemas complexos.
Peter Norvig escreveu uma resenha excelente do SICP, incluindo a seguinte analogia:
“Se o SICP fosse sobre automóveis, seria para quem quer entender como os carros funcionam, como são construídos, e como projetar veículos eficientes, seguros e confiáveis para o século XXI. Quem odeia o SICP são aqueles que só querem aprender a dirigir na estrada, como todo mundo.”
Se você se encaixa na primeira categoria, ler o SICP será um passo crucial entre a introdução e a fase de aprofundamento.
Embora seja um livro de “entrada”, o SICP apresenta certa dificuldade para iniciantes. Aqui estão alguns recursos úteis:
Udacity CS212 - Design of Computer Program: ministrado por Peter Norvig, do Google, usando Python, com algum nível de dificuldade.
How to Design Programs, Second Edition: mais acessível que o SICP, com explicações passo a passo, ideal para quem acha o SICP difícil.
Vídeos de aulas do SICP na UC Berkeley e gravações de seus autores treinando funcionários da Hewlett-Packard (em chinês).
Composing Programs: uma introdução à programação que herda conceitos do SICP, usando Python.
Coleção de exercícios do SICP: tente resolver ao máximo os exercícios do livro.
Após essa etapa, você começará a construir um modelo de design de programas, sua mente não será mais uma confusão, e perceberá que memorizar bibliotecas e sintaxe não ensina a resolver problemas de programação. Você entenderá melhor o que aprender a seguir, e isso ficará claro na sua mente. Então, é hora de colocar em prática projetos, que reforçarão sua motivação. Para iniciantes, participar de projetos open source ainda é prematuro; comece com projetos simples, como montar um site e mantê-lo, ou criar um pequeno jogo e expandi-lo. Se suas ideias não estiverem claras, recomendo acompanhar o 炼⽠研究所 ou escolher projetos na Mega Project List que você goste.
Se achar que o SICP é muito difícil, não force; pule essa etapa e siga a rota convencional: comece a ler The Elements of Computing Systems, que ensina a construir um computador desde portas NAND até seu funcionamento completo. Essa obra será fundamental na sua fase de introdução, e seu objetivo será completar todos os projetos do livro (incluindo um compilador e um sistema operacional simples).
Para dominar completamente o livro e consolidar sua base, além de avançar na sua formação, você deve fazer tarefas adicionais (atenção: a seguir, os itens não têm uma ordem rígida):
Fundamentos de Sistemas de Computação
Após adquirir uma base sólida em design de programas, aprofunde seu entendimento de ciência da computação com este livro: Computer Systems: A Programmer’s Perspective, 3/E (Sistemas de Computação: Uma Perspectiva do Programador). A tradução do título não é muito adequada; na verdade, é uma introdução aos sistemas de computador da CMU. O foco é observar os sistemas de um ponto de vista de programador, explicando detalhadamente como os programas são executados no hardware.
Se o livro parecer maçante, pode complementar com o MOOC The Hardware/Software Interface na Coursera, que é uma versão condensada do CSAPP, incluindo os experimentos mais clássicos. Além disso, revise a linguagem C com The C Programming Language.
Ao concluir esse livro, você terá uma base sólida de sistemas, podendo avançar para estudar sistemas operacionais, compiladores e redes de computadores. Ao explorar tópicos mais avançados, consulte os capítulos relevantes e implemente exemplos em código, o que aprofundará sua compreensão teórica e prática, permitindo entender o fluxo de dados na rede, na memória, nos caches e na CPU.
Fundamentos de Estruturas de Dados e Algoritmos
Hoje, muitos pensam que programar (especialmente para web) é apenas usar código de terceiros, e que expressar suas ideias de forma clara é mais importante do que dominar matemática e algoritmos avançados. Afinal, funções de ordenação, busca binária, já estão embutidas? No trabalho, nunca usaremos tudo isso, então por que aprender algoritmos? Essa mentalidade utilitarista é equivocada. Sem uma base teórica sólida, você inevitavelmente enfrentará obstáculos.
Dados e algoritmos são complementares. Na fase inicial, você deve entender: qual algoritmo e estrutura de dados usar para resolver um problema mais rapidamente? Isso exige familiaridade com estruturas e algoritmos comuns. Você não precisa necessariamente codificar tudo; escrever na mão é mais rápido. Para entender uma estrutura ou algoritmo que não conhece, pesquise seu propósito e cenário de uso.
Recursos recomendados:
Introduction to Algorithms: alguns dizem que não é uma leitura de entrada, mas na verdade é uma referência padrão. Pode pular exercícios e provas na primeira leitura, ou consultar Data Structures and Algorithm Analysis se ficar inseguro.
Algorithms: Design and Analysis [Parte 1 e 2]: curso de Stanford, linguagem não limitada, cobre o básico de algoritmos. Se o inglês for um problema, o Introduction to Algorithms do MIT é uma alternativa.
Para a fase inicial, pratique resolver problemas pequenos com algoritmos comuns, usando livros como Programming Pearls e The Practice of Programming.
Outros fundamentos
Alguns pontos frequentemente negligenciados na introdução à programação:
Aprenda a fazer perguntas: ao encontrar problemas, use bem os motores de busca. Quando não conseguir, pergunte no Stack Overflow ou Zhihu, após ler este artigo: “Como fazer perguntas eficazes para resolver problemas”.
Não seja um “lobo solitário”: troque ideias com outros. Tente montar um site simples, registrar suas ideias em um blog, assinar blogs de programação como Joel on Software, Peter Norvig, Coding Horror.
Aprimore seu inglês: é sua principal ferramenta para acessar recursos de alta qualidade. Na fase inicial, traduções são aceitáveis, mas, com o tempo, o domínio do inglês será fundamental.
Resumo
Não tenha medo do conteúdo acima. Entrar na programação não é uma tarefa de algumas semanas. Você enfrentará muitos obstáculos; ao ficar preso, tente a técnica de Feynman: divida o problema em partes menores, aprenda cada uma, e explique claramente para alguém para verificar sua compreensão. Se ainda assim não conseguir resolver, não force; muitas vezes, ao revisitar o problema depois, tudo ficará mais claro.
Além disso, não limite-se aos materiais mencionados aqui. Existem livros que valem a pena reler na fase de entrada e na de aprimoramento. Entre eles, destaque para os dois livros mais recomendados na lista de leitura obrigatória de programadores no Stack Overflow:
Code Complete: para programadores experientes ou iniciantes, ajuda a preencher lacunas de conhecimento. Para iniciantes, vale a pena conferir capítulos sobre variáveis, testes e personalidade.
The Pragmatic Programmer: considerado por alguns como o “manual do código”, aborda desde princípios como DRY e KISS até aspectos de atitude profissional.
Seu autor, Dave, inicia assim seu trecho:
“You’re a Pragmatic Programmer. You aren’t wedded to any particular technology, but you have a broad enough background in the science, and your experience with practical projects allows you to choose good solutions in particular situations. Theory and practice combine to make you strong. You adjust your approach to suit the current circumstances and environment. And you do this continuously as the work progresses. Pragmatic Programmers get the job done, and do it well.”
Essa filosofia sempre me influenciou positivamente, e por isso, neste guia, também tento seguir esse pensamento, incentivando você a se tornar um verdadeiro Programador Pragmatic.
Epílogo
Se você conseguir completar todas as tarefas acima, parabéns! Você realmente alcançou a entrada na programação. Isso significa que, ao aprofundar seus estudos, não terá medo de aprender novas linguagens, de lidar com APIs complexas, ou de estudar tecnologias específicas — até achará tudo mais fácil. Claro, ainda precisará praticar bastante, pois dores, cansaço e dificuldades continuarão, mas a mudança de mentalidade será enorme, e sua autoconfiança também. Os professores, colegas e até a comunidade online perceberão essa transformação. Embora tenha apenas entrado na programação, você já se tornou um “high-level” no mundo do espírito do programador. Não, errei: nem mesmo os “high-level” têm força de espírito; eles também duvidam de si mesmos, achando que sem dinheiro nada são. Mas, de qualquer forma, se seguir esta orientação, lendo bastante, você sentirá a sensação de “alcançar o topo do mundo”.
()(
Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
Guia de Introdução à Programação - Plataforma de Troca de Criptomoedas Digitais
Guia de Introdução à Programação
Prefácio
Hoje em dia, a programação tornou-se uma habilidade cada vez mais essencial: como designer, entender um pouco de programação pode ajudá-lo a compreender melhor o seu trabalho; como empreendedor, a figura de fundador técnico torna muitas tarefas mais fáceis. E, como iniciante, ao enfrentar a vasta quantidade de informações disponíveis, talvez nem saiba por onde começar; após passar por materiais básicos e fáceis, a aprendizagem torna-se mais difícil, e a curva de aprendizagem íngreme faz você recuar; você sabe como imprimir alguns textos na página, mas não sabe quando deve iniciar um projeto realmente útil; você não tem clareza sobre o que ainda não sabe, e nem consegue decidir qual será o próximo passo de aprendizagem.
Este artigo não só oferece algumas orientações direcionais, como também apresenta uma introdução de base central à programação. Claro, uma rota passo a passo não é realista, e cada pessoa possui suas próprias características, portanto, esta orientação de introdução à programação serve mais para estimular o seu pensamento, ajudando-o a formar uma rota de aprendizagem que seja adequada a você.
Mas atenção: este artigo é dirigido àqueles que realmente desejam aprender a programar — aqueles que estão determinados a fazer algo de verdade, que não vão desistir até criar alguma coisa concreta; não é para quem apenas acha que “programar é divertido”. Na minha opinião, esse tipo de pessoa nunca entrará na porta da programação, muito menos criará algo decente.
Embora o tom do artigo seja de “opiniões fortes, convicções fracas” (Strong Opinions, Weakly Held), o leitor deve sempre questionar a precisão do que escrevemos, como faria com tudo ao seu redor. Se tiver dúvidas, sinta-se à vontade para discutir abertamente.
Ajuste de mentalidade
Definição de objetivos
Antes de começar a aprender programação, pense nos seus objetivos. Quando você tem um objetivo final claro, o caminho fica mais nítido. Então, o que você quer criar? Um site? Um jogo? Um app para iOS ou Android? Ou talvez você queira automatizar tarefas chatas para ter mais tempo para apreciar a vista lá fora? Talvez seu objetivo seja apenas aumentar sua competitividade no mercado de trabalho. Todos esses são objetivos válidos, que impulsionam seu aprendizado de programação. Sem motivação, é difícil avançar na longa e às vezes monótona jornada de aprendizagem.
Este vídeo pode te inspirar: “Coisas que a maioria das escolas não ensina”
Não se apresse
Programar mal é fácil. Até mesmo os “Dummies” podem aprender em 21 dias. Programar bem exige reflexão, mas qualquer um pode fazer isso e todos podem experimentar a satisfação extrema que vem com ela. 糟糕的编程很容易。即使是傻⽠也能在21天内学会它。好的编程需要思考,但每个⼈都能做到,每个⼈都能体验到它带来的极度满⾜感。
Seja na livraria física ou online, há muitas obras de “Aprenda X em 21 dias”, prometendo que em pouco tempo você dominará a tecnologia. Matthias Felleisen, em seu livro How to Design Programs, aponta claramente essa tendência de “soluções rápidas” e faz uma crítica irônica a ela.
A “atalho” ou a “bala de prata” simplesmente não existe. Como dizem os sábios, dominar algo leva 10 anos ou 10.000 horas — é o famoso “dez anos de afiamento de uma espada”. Portanto, não se apresse; o esforço vale a pena.
Cultive o interesse
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.
⼤多数优秀的程序员做编程不是因为他们期望得到报酬或得到公众的崇拜,⽽是因为编程很有趣。
– Linus Torvalds
Apaixone-se por programar, pois o próprio ato de programar é uma fonte inesgotável de motivação. Mantenha esse sentimento de entusiasmo para que possa dedicá-lo às suas 10.000 horas de prática. Programar é divertido — é a alegria da exploração. É a alegria da criação. Ver seu trabalho na tela, fazer as pessoas admirarem seu código, que seus vizinhos usem seu produto, ou que a mídia discuta sua criação, tudo isso é muito divertido. Programar deve ser extremamente prazeroso; se não for, identifique o que torna a programação entediante e resolva isso.
Comece a aprender
História que desperta atenção
Quando entrei no ensino médio, comecei a aprender programação. Infelizmente, li vários livros considerados lixo na época, como 21 Days to Master C++. Apesar de conseguir fazer pequenos programas, quando o software apresentava falhas, eu não sabia por quê; problemas maiores eram difíceis de resolver, e muitas vezes tinha que aceitar limitações das bibliotecas existentes. Apesar de codificar todos os dias, percebia que minha habilidade de programar evoluía lentamente, com uma compreensão muito limitada de conceitos como “iterar” e “recursão”. Basicamente, usava o computador como uma calculadora.
Depois de entrar na faculdade, estudei física. No começo, memorizava fórmulas físicas sem entender de onde vinham, suas conexões ou seu significado. Aprendia a resolver problemas físicos comuns, mas não compreendia o porquê por trás do “como”.
Quando tentei criar jogos de computador baseados em física, encontrei dificuldades semelhantes: não sabia como resolver novos problemas, o medo de enfrentá-los aumentava, e comecei a evitar entender de verdade, apenas copiando e colando códigos do Google. Felizmente, uma aula na faculdade mudou completamente minha abordagem de aprendizagem. Foi a primeira vez que senti que tinha “abrido meus olhos”. Percebi que tinha uma compreensão muito limitada de disciplinas essenciais, incluindo física e ciência da computação.
Sobre essa aula: acabávamos de estudar eletricidade e relatividade, e o professor escreveu esses tópicos no quadro, conectando-os com uma linha. “Suponha que temos um elétron se movendo ao longo de um fio a uma velocidade relativística…”, inicialmente, ele apenas escreveu fórmulas familiares de eletricidade e relatividade, mas após algumas derivações algébricas, a fórmula do campo magnético apareceu de forma mágica. Embora eu já conhecesse essa fórmula há anos, na época não percebia as conexões subjacentes entre esses fenômenos. A diferença entre magnetismo e eletricidade é apenas uma questão de “ângulo de observação”. De repente, percebi que não deveria mais focar apenas em “como fazer” (How), mas também em “por que” (why). Comecei a revisitar os fundamentos, estudando o que deveria ter aprendido desde o início. Esse processo de volta às raízes foi doloroso, mas espero que sirva de alerta: nunca cometa esse erro.
Reflexões após o alerta
Esta imagem é retirada do livro Gödel, Escher, Bach de Douglas Hofstadter. Cada letra nesta imagem é composta por letras menores. No nível mais alto, vemos “MU”, onde M é formado por três HOLISM (holismo), e U por uma REDUCTIONISM (redução). Cada letra contém a outra, e vice-versa. No nível mais baixo, a menor letra é composta por “MU” repetido.
Cada nível de abstração contém informações. Se você apenas observa de forma ingênua, usando o holismo no nível mais alto ou a redução no mais baixo, obterá apenas “MU” (que em alguns dialetos significa “nada”). A questão é: como obter o máximo de informações de cada nível? Ou, em outras palavras, como aprender o vasto conhecimento de áreas complexas como a programação?
Um problema comum na educação e na aprendizagem é que os iniciantes muitas vezes focam demais na visão holística, negligenciando os fundamentos. Por exemplo, eles querem construir um robô, mas não compreendem os modelos físicos por trás, o que limita sua capacidade de construir e diagnosticar problemas no futuro.
Por outro lado, não se deve exagerar na redução, caindo na armadilha de tentar fazer tudo com teoria pura desde o começo. Isso pode levar à teoria vazia e ao tédio, além de perder a motivação. Essa situação é comum em estudantes de ciência da computação.
Para entender melhor, podemos comparar aprender programação a aprender culinária: você compra livros de receitas para fazer boas refeições. Se seu objetivo é apenas cozinhar para a família, essa estratégia funciona bem; seguir as receitas à risca pode produzir pratos decentes. Mas, se deseja impressionar amigos com pratos incríveis ou se tornar um grande chef, precisa entender as ideias por trás das receitas, compreender a teoria, e não apenas praticar de forma mecânica. Se você passar dias apenas lendo livros teóricos sem praticar, acabará sendo um cozinheiro ruim ou, pior, nunca se tornará um chef, pois a monotonia fará você desistir.
Resumindo, programação é a ponte entre teoria e prática, uma área onde ciência da computação e aplicações se encontram. A abordagem correta de aprendizagem deve combinar exploração autodirigida e prática de projetos, adquirindo intuição e motivação; e, ao mesmo tempo, fundamentar-se na base sólida, consolidando o entendimento do pensamento computacional.
Como iniciante, deve priorizar a exploração prática, usando a teoria como suporte.
Fundamentos de Design de Programas
“Qual linguagem de programação devo aprender?” Essa é uma das primeiras perguntas de iniciantes, mas é uma questão equivocada. O mais importante é: “Quais elementos constituem a base do aprendizado de programação?”
No topo da pirâmide do conhecimento de programação, há três componentes essenciais:
int *foo() { int x = 0; return &x; }é inválida?Para iniciantes na fase de introdução, escolher C como primeira linguagem pode ser difícil e entediante, pois eles precisam aprender esses três componentes ao mesmo tempo, gastando muito tempo antes de fazer qualquer coisa prática.
Por isso, para minimizar o esforço em aprender sintaxe e fundamentos do sistema, recomenda-se usar Python como primeira linguagem. Apesar de ser amigável para iniciantes, isso não significa que seja apenas um “brinquedo”; em grandes projetos, sua força e flexibilidade também aparecem. Após se familiarizar com Python, aprender C é uma boa escolha: ajuda a pensar de forma mais próxima do hardware e, posteriormente, a entender alguns princípios do sistema operacional.
A seguir, uma orientação de introdução que ajudará a construir uma estrutura geral na sua mente, facilitando a exploração de cima para baixo. Os materiais listados não têm uma ordem rígida; escolha um e, se ficar preso, considere outro.
MIT 6.00.1x (Introdução à Ciência da Computação e Programação em Python). Apesar de a linguagem de ensino ser Python, como uma excelente introdução, ela enfatiza conceitos e paradigmas essenciais da ciência da computação, não apenas ensinar uma linguagem específica. Para quem não é de ciência da computação, essa disciplina amplia horizontes; conteúdo: conceitos de computação, programação em Python, estruturas de dados simples, algoritmos, testes e depuração.
Harvard CS50x (Ciência da Computação, Harvard). Também uma disciplina introdutória, complementando a do MIT. As linguagens envolvidas incluem C, PHP, JavaScript + SQL, HTML + CSS. O conteúdo é abrangente e profundo, permitindo conhecer as últimas inovações tecnológicas, o que pode estimular bastante o interesse pela área. Tarefa adicional: leitura de Coding.
Após essa fase de introdução, você terá uma base de código e uma compreensão geral de programação. Nesse momento, talvez queira aprender uma tecnologia específica, como desenvolvimento web, Android ou iOS. Pode tentar criar algo simples, dando-se feedback positivo, alimentando sua motivação. Mas lembre-se de não se aprofundar demais agora; essas tecnologias têm muitos detalhes, que podem ser estudados no futuro. Da mesma forma, evite focar em frameworks ou linguagens específicas neste momento; o momento é de aprender os fundamentos da ciência da computação. Não tente atalhos ou aprender diretamente o que deseja agora, pois isso provavelmente levará ao fracasso.
Então, o que fazer na fase de introdução? Reflita sobre seus próprios programas: por que você os projetou assim? Como escrever melhores programas? Tente entender a essência da programação: usar o computador para resolver problemas.
Suposições:
X = tempo dedicado à reflexão e solução de problemas
Y = tempo dedicado à implementação do código
Capacidade de programação = F(X, Y) (X>Y)
Para melhorar essa capacidade, é preciso otimizar X, Y e a função F(X, Y). Poucas obras abordam esses três aspectos simultaneamente, mas uma que consegue é Structure and Interpretation of Computer Programs (SICP). Ela mostra como abstrair e decompor problemas, permitindo lidar com questões mais complexas — um avanço enorme na capacidade de programação, mudando fundamentalmente sua forma de pensar e resolver problemas com código. Além disso, a linguagem de ensino do SICP é Scheme, que introduz conceitos de programação funcional. Sua sintaxe é bastante simples, permitindo aprender rapidamente e dedicar mais tempo às ideias de programação e resolução de problemas complexos.
Peter Norvig escreveu uma resenha excelente do SICP, incluindo a seguinte analogia:
“Se o SICP fosse sobre automóveis, seria para quem quer entender como os carros funcionam, como são construídos, e como projetar veículos eficientes, seguros e confiáveis para o século XXI. Quem odeia o SICP são aqueles que só querem aprender a dirigir na estrada, como todo mundo.”
Se você se encaixa na primeira categoria, ler o SICP será um passo crucial entre a introdução e a fase de aprofundamento.
Embora seja um livro de “entrada”, o SICP apresenta certa dificuldade para iniciantes. Aqui estão alguns recursos úteis:
Após essa etapa, você começará a construir um modelo de design de programas, sua mente não será mais uma confusão, e perceberá que memorizar bibliotecas e sintaxe não ensina a resolver problemas de programação. Você entenderá melhor o que aprender a seguir, e isso ficará claro na sua mente. Então, é hora de colocar em prática projetos, que reforçarão sua motivação. Para iniciantes, participar de projetos open source ainda é prematuro; comece com projetos simples, como montar um site e mantê-lo, ou criar um pequeno jogo e expandi-lo. Se suas ideias não estiverem claras, recomendo acompanhar o 炼⽠研究所 ou escolher projetos na Mega Project List que você goste.
Se achar que o SICP é muito difícil, não force; pule essa etapa e siga a rota convencional: comece a ler The Elements of Computing Systems, que ensina a construir um computador desde portas NAND até seu funcionamento completo. Essa obra será fundamental na sua fase de introdução, e seu objetivo será completar todos os projetos do livro (incluindo um compilador e um sistema operacional simples).
Para dominar completamente o livro e consolidar sua base, além de avançar na sua formação, você deve fazer tarefas adicionais (atenção: a seguir, os itens não têm uma ordem rígida):
Fundamentos de Sistemas de Computação
Após adquirir uma base sólida em design de programas, aprofunde seu entendimento de ciência da computação com este livro: Computer Systems: A Programmer’s Perspective, 3/E (Sistemas de Computação: Uma Perspectiva do Programador). A tradução do título não é muito adequada; na verdade, é uma introdução aos sistemas de computador da CMU. O foco é observar os sistemas de um ponto de vista de programador, explicando detalhadamente como os programas são executados no hardware.
Se o livro parecer maçante, pode complementar com o MOOC The Hardware/Software Interface na Coursera, que é uma versão condensada do CSAPP, incluindo os experimentos mais clássicos. Além disso, revise a linguagem C com The C Programming Language.
Ao concluir esse livro, você terá uma base sólida de sistemas, podendo avançar para estudar sistemas operacionais, compiladores e redes de computadores. Ao explorar tópicos mais avançados, consulte os capítulos relevantes e implemente exemplos em código, o que aprofundará sua compreensão teórica e prática, permitindo entender o fluxo de dados na rede, na memória, nos caches e na CPU.
Fundamentos de Estruturas de Dados e Algoritmos
Hoje, muitos pensam que programar (especialmente para web) é apenas usar código de terceiros, e que expressar suas ideias de forma clara é mais importante do que dominar matemática e algoritmos avançados. Afinal, funções de ordenação, busca binária, já estão embutidas? No trabalho, nunca usaremos tudo isso, então por que aprender algoritmos? Essa mentalidade utilitarista é equivocada. Sem uma base teórica sólida, você inevitavelmente enfrentará obstáculos.
Dados e algoritmos são complementares. Na fase inicial, você deve entender: qual algoritmo e estrutura de dados usar para resolver um problema mais rapidamente? Isso exige familiaridade com estruturas e algoritmos comuns. Você não precisa necessariamente codificar tudo; escrever na mão é mais rápido. Para entender uma estrutura ou algoritmo que não conhece, pesquise seu propósito e cenário de uso.
Recursos recomendados:
Outros fundamentos
Alguns pontos frequentemente negligenciados na introdução à programação:
Resumo
Não tenha medo do conteúdo acima. Entrar na programação não é uma tarefa de algumas semanas. Você enfrentará muitos obstáculos; ao ficar preso, tente a técnica de Feynman: divida o problema em partes menores, aprenda cada uma, e explique claramente para alguém para verificar sua compreensão. Se ainda assim não conseguir resolver, não force; muitas vezes, ao revisitar o problema depois, tudo ficará mais claro.
Além disso, não limite-se aos materiais mencionados aqui. Existem livros que valem a pena reler na fase de entrada e na de aprimoramento. Entre eles, destaque para os dois livros mais recomendados na lista de leitura obrigatória de programadores no Stack Overflow:
Code Complete: para programadores experientes ou iniciantes, ajuda a preencher lacunas de conhecimento. Para iniciantes, vale a pena conferir capítulos sobre variáveis, testes e personalidade.
The Pragmatic Programmer: considerado por alguns como o “manual do código”, aborda desde princípios como DRY e KISS até aspectos de atitude profissional.
Seu autor, Dave, inicia assim seu trecho:
“You’re a Pragmatic Programmer. You aren’t wedded to any particular technology, but you have a broad enough background in the science, and your experience with practical projects allows you to choose good solutions in particular situations. Theory and practice combine to make you strong. You adjust your approach to suit the current circumstances and environment. And you do this continuously as the work progresses. Pragmatic Programmers get the job done, and do it well.”
Essa filosofia sempre me influenciou positivamente, e por isso, neste guia, também tento seguir esse pensamento, incentivando você a se tornar um verdadeiro Programador Pragmatic.
Epílogo
Se você conseguir completar todas as tarefas acima, parabéns! Você realmente alcançou a entrada na programação. Isso significa que, ao aprofundar seus estudos, não terá medo de aprender novas linguagens, de lidar com APIs complexas, ou de estudar tecnologias específicas — até achará tudo mais fácil. Claro, ainda precisará praticar bastante, pois dores, cansaço e dificuldades continuarão, mas a mudança de mentalidade será enorme, e sua autoconfiança também. Os professores, colegas e até a comunidade online perceberão essa transformação. Embora tenha apenas entrado na programação, você já se tornou um “high-level” no mundo do espírito do programador. Não, errei: nem mesmo os “high-level” têm força de espírito; eles também duvidam de si mesmos, achando que sem dinheiro nada são. Mas, de qualquer forma, se seguir esta orientação, lendo bastante, você sentirá a sensação de “alcançar o topo do mundo”.
()(