Melhores maneiras de ensinar um iniciante a programar? [fechadas]


324

Pergunta original

Atualmente, estou empenhado em ensinar meu irmão a programar. Ele é um novato total, mas muito inteligente. (E ele realmente quer aprender). Percebi que algumas de nossas sessões ficaram atoladas em pequenos detalhes, e não acho que tenha sido muito organizado. ( Mas as respostas para este post ajudaram muito. )

O que posso fazer melhor para ensiná-lo efetivamente? Existe uma ordem lógica que eu possa usar para executar conceito por conceito? Existem complexidades que devo evitar até mais tarde?

A linguagem com a qual estamos trabalhando é Python , mas conselhos em qualquer idioma são bem-vindos.


Como ajudar

Se você tem bons, adicione o seguinte na sua resposta:

  • Exercícios para iniciantes e idéias de projetos
  • Recursos para o ensino de iniciantes
  • Screencasts / posts em blogs / e-books gratuitos
  • Imprima livros que são bons para iniciantes

Descreva o recurso com um link para que eu possa dar uma olhada. Quero que todos saibam que definitivamente tenho usado algumas dessas idéias. Seus envios serão agregados nesta postagem.


Recursos on-line para o ensino de iniciantes:


Livros impressos recomendados para o ensino de iniciantes


Não entendo por que isso deve ser fechado. Pelo menos 295 usuários acharam esta pergunta (e as 92 respostas) úteis o suficiente para votá-la novamente, com 290 chegando ao ponto de considerá-la uma de suas favoritas. A pergunta resultou em uma agregação muito útil de recursos de ensino. Realmente não resultou em 'argumentos' ou 'debates', mas realmente muitos bons conselhos sobre como abordar um dos difíceis 'fatores humanos' na programação. Acho que fechar uma pergunta como essa é draconiano e prejudicial para a comunidade StackOverflow.
Justin Standard

@JustinStandard Você já pensou em converter suas edições em várias respostas para comentários? Por exemplo , aqui , aqui e aqui #
Jason Plank

Respostas:


118

Eu tive que trabalhar com vários programadores iniciantes (nunca escrevi uma linha de código) e farei um workshop depois da escola com alunos do ensino médio neste outono. Essa é a coisa mais próxima que tenho da documentação. Ainda é um trabalho em andamento, mas espero que ajude.

1) FizzBuzz. Comece com programas de linha de comando. Você pode escrever alguns jogos ou ferramentas divertidas muito rapidamente e aprender todos os recursos da linguagem rapidamente, sem precisar aprender as ferramentas da GUI primeiro. Esses aplicativos iniciais devem ser simples o suficiente para que você não precise usar nenhuma ferramenta de depuração real para fazê-los funcionar.

Se nada mais, coisas como o FizzBuzz, são bons projetos. Seus primeiros aplicativos não precisam lidar com bancos de dados, sistema de arquivos, configuração, etc. Esses são conceitos que confundem a maioria das pessoas e, quando você está apenas aprendendo a sintaxe e os recursos básicos da estrutura, realmente não precisa de mais complexidade.

Alguns projetos:

  • Olá Mundo!
  • Tome o ano do meu nascimento e calcule a minha idade (apenas (agora - então) sem correções mensais). (matemática simples, entrada, saída)
  • Peça uma direção (Cima, baixo, esquerda, direita) e depois conte ao usuário o seu destino (caia em um buraco, encontre um bolo, etc.). (Lógica booleana)
  • FizzBuzz, mas conte uma vez a cada segundo. (Loops, temporizadores e mais lógica)
  • Dependendo da idade deles, alguns realmente gostam de um aplicativo que chama os usuários de um insulto aleatório em algum intervalo. (Loops, matrizes, temporizadores e aleatório, se você fizer o intervalo aleatório)

2) Projeto simples Uma vez que eles tenham uma boa compreensão dos recursos da linguagem, você pode iniciar um projeto (jogos simples e divertidos funcionam bem.). Você deve tentar concluir o primeiro projeto dentro de 6 a 12 horas. Não gaste tempo para arquitetá-lo cedo. Deixe-os projetá-lo mesmo que seja péssimo. Se desmoronar, fale sobre o que aconteceu e por que falhou, escolha outro tópico e comece novamente.

É aqui que você começa a apresentar os recursos de depuração de suas ferramentas. Mesmo que você possa ver o problema lendo o código, ensine-os a usar as ferramentas e depois mostre a eles como você pode vê-lo. Isso serve ao duplo objetivo de ensinar as ferramentas de depuração e como identificar erros sem ferramentas.

Uma vez, ou se, o projeto ficar funcional, você poderá usá-lo para introduzir ferramentas de refatoração. É bom que você possa expandir o projeto com alguns recursos simples para os quais você nunca planejou. Isso geralmente significa refatoração e depuração significativa, já que poucas pessoas escrevem código pela metade pela primeira vez.

Alguns projetos:

  • Jogo da Forca
  • Experimentando robótica ( Vex e Mindstorms são opções)

3) Projeto Real Inicie um projeto real que pode levar algum tempo. Use o controle de origem adequado e faça questão de ter um cronograma. Execute este projeto como um projeto real, se nada mais, é uma boa experiência ter que lidar com as ferramentas.

Obviamente, você precisa ajustar isso para cada pessoa. A coisa mais importante que encontrei é fazer com que até os primeiros aplicativos simples se apliquem ao que a pessoa está interessada.

Alguns projetos:

  • Tetris
  • Mecanismo de blog baseado em arquivo de texto
  • Trabalho de robótica mais avançado

Este é um ótimo guia. Pessoalmente, não consigo codificar meu caminho para fora de um saco de papel (eu gostaria de ver alguém fazer isso na vida real, na verdade), então isso parece um bom guia para me ensinar também.
keyofnight 8/03/10

Esta é uma resposta muito boa. Minha única objeção é que Tetris não é uma boa escolha para um primeiro ou segundo jogo. Nesse nível, a detecção de colisão pode ser um problema difícil - é ótimo se eles puderem resolvê-lo.
phkahler

@phkahler Entendo o seu ponto de vista, mas acredito que o Tetris é interessante porque há tantas implementações OSS / demo que você pode analisar antes e depois de escrever seu código.
Eric Haskins 29/07

30

Você pode tentar usar Alice . É um programa 3D projetado para uso em aulas de programação introdutórias.

Os dois maiores obstáculos para novos programadores são frequentemente:

  • erros de sintaxe
  • motivação (escrever algo significativo e divertido em vez de artificial)

Alice usa uma interface de arrastar e soltar para construir programas, evitando a possibilidade de erros de sintaxe. Alice permite que você construa mundos 3D e tenha seus personagens e animação 3D (simples) de controle de código, o que geralmente é muito mais interessante do que implementar listas vinculadas.

Programadores experientes podem considerar Alice um brinquedo e zombar de arrastar e soltar linhas de código, mas a pesquisa mostra que essa abordagem funciona.

Disclaimer: Eu trabalhei em Alice.


Eu o conheci na última palestra de Randy Pausch. O raciocínio por trás desse projeto me surpreendeu.
Jesvin Jose

28

Eu recomendo o Logo (também conhecido como tartaruga) para obter os conceitos básicos. Ele fornece uma boa caixa de areia com feedback gráfico imediato e você pode demonstrar loops, variáveis, funções, condicionais, etc. Esta página fornece um excelente tutorial.

Após o Logo, vá para Python ou Ruby. Eu recomendo o Python, pois é baseado no ABC, que foi inventado com o objetivo de ensinar programação.

Ao ensinar programação, devo secundar a sugestão de EHaskins de projetos simples e depois projetos complexos. A melhor maneira de aprender é começar com um resultado definido e um marco mensurável. Mantém as lições focadas, permite que o aluno desenvolva habilidades e depois desenvolva essas habilidades, e dá ao aluno algo para mostrar aos amigos. Não subestime o poder de ter algo a mostrar para o trabalho de alguém.

Teoricamente, você pode ficar com o Python, pois o Python pode fazer quase tudo. É um bom veículo para ensinar programação orientada a objetos e (a maioria) algoritmos. Você pode executar o Python no modo interativo como uma linha de comando para ter uma ideia de como ele funciona ou executar scripts inteiros de uma só vez. Você pode executar seus scripts interpretados rapidamente ou compilá-los em binários. Existem milhares de módulos para estender a funcionalidade. Você pode criar uma calculadora gráfica como a que acompanha o Windows ou criar um cliente de IRC ou qualquer outra coisa.

O XKCD descreve o poder do Python um pouco melhor: "Você está voando! Como?"  "Pitão!"

Você pode mudar para C # ou Java depois disso, embora eles não ofereçam muito o que o Python ainda não possui. A vantagem disso é que eles usam sintaxe no estilo C, que muitos idiomas (ouso dizer mais?) Usam. Você ainda não precisa se preocupar com o gerenciamento de memória, mas pode se acostumar a ter um pouco mais de liberdade e menos manipulação do intérprete de idiomas. O Python impõe espaço em branco e recuo, o que é bom na maioria das vezes, mas nem sempre. C # e Java permitem que você gerencie seu próprio espaço em branco enquanto permanece com o tipo forte.

A partir daí, o padrão é C ou C ++. A liberdade nessas línguas é quase existencial. Agora você está encarregado de seu próprio gerenciamento de memória. Não há coleta de lixo para ajudá-lo. É aqui que você ensina os algoritmos realmente avançados (como mergesort e quicksort). É aqui que você aprende por que "falha de segmentação" é uma palavra de maldição. É aqui que você baixa o código-fonte do kernel do Linux e olha para o Abyss. Comece escrevendo um buffer circular e uma pilha para manipulação de strings. Depois, suba.


Na verdade, você não gerencia totalmente a memória em C. Você pode obter malloc, etc. e gerencia-lo gratuitamente para você. Você apenas precisa informar ao sistema quando deseja mais memória e quando terminar a memória que está usando.
compman


12

Pacote Python VPython - Programação 3D para Mortal Comum ( tutorial em vídeo ).

Exemplo de código:

from visual import *

floor = box (pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)
ball = sphere (pos=(0,4,0), radius=1, color=color.red)
ball.velocity = vector(0,-1,0)
dt = 0.01

while 1:
    rate (100)
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < ball.radius:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

Bola quicando VPython http://vpython.org/bounce.gif


Bom apenas depois de aprenderem os conceitos básicos. Criar visuais é uma ótima maneira de motivar as pessoas a aprenderem programação.
phkahler

12

Comece com os gráficos Turtle em Python.

Eu usaria os gráficos de tartaruga que são padrão no Python. É visual, simples e você pode usar esse ambiente para introduzir muitos conceitos de programação, como iteração e chamadas de procedimento, antes de ficar muito longe da sintaxe. Considere a seguinte sessão interativa em python:

>>> from turtle import *
>>> setup()
>>> title("turtle test")
>>> clear()
>>>
>>> #DRAW A SQUARE
>>> down()        #pen down
>>> forward(50)   #move forward 50 units
>>> right(90)     #turn right 90 degrees
>>> forward(50)
>>> right(90)
>>> forward(50)
>>> right(90)
>>> forward(50)
>>>
>>> #INTRODUCE ITERATION TO SIMPLIFY SQUARE CODE
>>> clear()
>>> for i in range(4):
        forward(50)
        right(90)
>>>
>>> #INTRODUCE PROCEDURES   
>>> def square(length):
        down()
        for i in range(4):
            forward(length)
            right(90)
>>>
>>> #HAVE STUDENTS PREDICT WHAT THIS WILL DRAW
>>> for i in range(50):
        up()
        left(90)
        forward(25)
        square(i)
>>>
>>> #NOW HAVE THE STUDENTS WRITE CODE TO DRAW
>>> #A SQUARE 'TUNNEL' (I.E. CONCENTRIC SQUARES
>>> #GETTING SMALLER AND SMALLER).
>>>
>>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING
>>> #EACH SUCCESSIVE SQUARE TILTED

Ao tentar realizar as duas últimas tarefas, elas terão muitas tentativas fracassadas, mas as falhas serão visualmente interessantes e aprenderão rapidamente enquanto tentam descobrir por que não desenhou o que esperavam.



11

O principal é que a pessoa em questão precise ter algum problema que deseja resolver. Se você não possui um programa que deseja escrever (e algo sensato e bem definido, não "Quero escrever o próximo Quake!"), Não pode aprender a programar, porque não tem nada para motivá-lo. . Quero dizer, você pode ler um livro e ter uma compreensão aproximada da sintaxe e da semântica de uma linguagem, mas até que você tenha um programa que deseja escrever, nunca entenderá a provocação.

Se esse ímpeto existe, tudo o resto são apenas pequenos detalhes.


A melhor maneira de aprender qualquer assunto técnico, eu acho, é aprendendo a resolver pequenos problemas incrementais.
cbednarski




5

Este é um livro fantástico que meus irmãos mais novos costumavam aprender:

http://pine.fm/LearnToProgram/

Obviamente, o mais importante é iniciar um programa real e útil de algum tipo IMEDIATAMENTE depois de terminar o livro.


4

Se ele estiver interessado, os pequenos detalhes não são as partes boas? Usando python, você já cortou a GUI para que a confusão acabe. Por que não escolher um projeto, um jogo ou algo assim e implementá-lo. O clássico jogo de adivinhação de números oi-lo pode ser simplesmente implementado a partir da linha de comando em 20 a 30 linhas de código (dependendo do idioma, é claro) e fornece variáveis, condições, loops e informações do usuário.



4

Eu apenas deixei ele escrever toneladas de código. Deixe que ele dirija tudo o que vocês fazem e esteja disponível para responder a perguntas.

Acredite ou não, depois de alguns meses escrevendo toneladas de códigos ruins, ele começará a entender e começar a escrever programas melhores. Nesse ponto, você pode ficar atolado em detalhes (memória, etc.) e também falar sobre princípios gerais de design.

Ouvi dizer que o que separa os grandes artistas dos medíocres é que toda vez que eles praticam, eles melhoram alguma coisa, por menor que seja. Deixe seu irmão praticar, e ele melhorará toda vez que se sentar ao teclado.

Editar: [Justin Standard]

Esteban, isso me lembra de uma recente pós horror codificação , e eu não acho que você está certo. Mas acho que ainda vale a pena encontrar métodos para orientar sua prática. Sem dúvida, quero que ele escreva tanto código quanto ele sabe fazer. Essa é uma razão pela qual estou pedindo exemplos de projetos.


Sim, eu sei qual post você está falando sobre Justin. A leitura me lembrou como a maioria das coisas que aprendi vieram de tentar e aprender com meus próprios erros. Eu realmente não posso enfatizar bastante a importância de aprender fazendo!
Esteban Araya

2

Primeiro de tudo, comece como todo mundo: com um programa Hello World . É simples e oferece uma sensação básica do layout de um programa. Tente e lembre-se de quando você estava programando pela primeira vez e como alguns dos conceitos eram difíceis - comece simples.

Após o Hello World, passe à criação de algumas variáveis ​​básicas, aritméticas, e depois na lógica booleana e nas instruções if / else. Se você tem um de seus livros antigos de programação, confira alguns dos primeiros exemplos e peça que ele os analise. Apenas não tente introduzir muita coisa de uma só vez, ou será esmagador e confuso.


2

Algo que você deve estar atento ao ensinar seu irmão a programar é que ele não confie demais em você. Muitas vezes, quando me vejo ajudando os outros, eles começam a pensar em mim como um livro de respostas para todas as perguntas e, em vez de tentar encontrar uma resposta, simplesmente me perguntam. Muitas vezes, o melhor professor é a experimentação e toda vez que seu irmão faz uma pergunta como "O que acontecerá se eu adicionar 2 a uma string?" você deve dizer a ele para experimentar e ver por si mesmo. Também notei que, quando não consigo transmitir um conceito a alguém, ajuda ver um código de exemplo em que podemos examinar cada segmento individualmente e explicá-lo peça por peça. Como observação, as pessoas novas em programação geralmente têm problemas com a idéia de programação orientada a objetos,


2

Eu costumava ensinar programação e seu irmão tem uma vantagem principal sobre a maioria dos meus alunos que ele quer aprender :)

Se você decidir ir com C, um amigo tem um site com o tipo de programa que os de gerações mais antigas lembram como digitação básica. Os mais complexos usam ncurses, o que meio que nega seu uso como um auxílio didático, mas algumas são pequenas coisas e você pode aprender muito sem ser ensinado.

Pessoalmente, acho que Python e Ruby seriam ótimas primeiras linguagens.

EDIT: lista de tarefas de programação iniciantes apareceu durante a noite pode ser exatamente o que você está procurando.


2

Realmente depende do estilo de aprendizado de seu irmão. Muitas pessoas aprendem mais rápido, sujando as mãos e se metendo nisso, cristalizando os conceitos e o cenário geral à medida que progridem e constroem seus conhecimentos.

Eu, prefiro começar com o quadro geral e me aprofundar no âmago da questão. A primeira coisa que eu queria saber era como tudo se encaixa, então todo aquele livro de ideias orientado a objetos, depois sobre classes e instâncias e assim por diante. Eu gosto de conhecer os conceitos subjacentes e um pouco de teoria antes de aprender a sintaxe. Eu tive uma vantagem, porque escrevi alguns jogos no BASIC há 20 anos, mas nada desde então.

Talvez seja útil ocultar um processo de produção, começando com uma declaração de missão geral, depois um plano e / ou fluxograma, e depois elaborando algum pseudo-código (inclinado para a sintaxe que você usará finalmente) antes de realmente escrever o código.

A regra de ouro aqui é discutir o estilo de inclinação de seus alunos.


2

Se seu irmão tiver acesso ao iTunes, ele poderá fazer o download de palestras em vídeo de um curso introdutório de ciência da computação ministrado por Richard Buckland na Universidade de New South Wales. Ele é um instrutor envolvente e aborda os fundamentos da computação e da linguagem C. Se nada mais, diga ao seu irmão para reproduzir os vídeos em segundo plano e alguns conceitos podem penetrar na osmose. :)

COMP1917 Higher Computing - 2008 Sessão 1 http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

Se o link não funcionar, aqui está um caminho:

Página Inicial -> iTunes U -> Engenharia -> COMP1917 Higher Computing - 2008 Sessão 1


2

há um wikibook que é muito bom para aprender python .

Não sei como são os wikibooks para outros idiomas, mas eu pessoalmente aprendi python com o wikibook, como era em fevereiro de 2007

ps - se você não estiver familiarizado com os wikibooks , é basicamente a versão da wikipedia da criação de livros. é meio difícil de descrever, mas se você conferir alguns dos livros, verá como ele funciona



2

Eu acho que Python é uma ótima idéia. Eu daria a ele algumas tarefas básicas para fazer por conta própria e diria a ele que qualquer beco sem saída que ele atingir provavelmente pode ser resolvido com uma visita ao google. Para mim, pelo menos, resolver um problema por conta própria sempre o fazia ficar melhor do que alguém me dizendo a solução.

Alguns projetos possíveis (em nenhuma ordem específica):

  • Simulador de troca de moedas. Deixe o usuário inserir um número desejado de tentativas para o lançamento da moeda. Execute-o e exiba os resultados junto com a porcentagem de cara ou coroa.

  • Faça um conversor de temperatura com um menu que leve a entrada do usuário para escolher que tipo de conversão o usuário deseja fazer. Depois de escolher a conversão e fazê-lo, ele deve retornar ao menu principal.

    Aqui está um exemplo de um conversor estendido com a mesma idéia: http://pastebin.org/6541

  • Faça um programa que use uma entrada numérica e exiba a nota da letra para a qual traduziria. Ele acabará avaliando a entrada em relação às declarações if e elif para descobrir onde ela se encaixa.

  • Faça um teste simples que passe por várias opções múltiplas ou preencha as perguntas em branco. No final, ele exibirá como o usuário fez. Ele pode escolher qualquer pergunta que quiser.

  • Pegue uma entrada de um número (presumivelmente grande) de centavos e converta-o em denominações maiores. Por exemplo, 149 centavos = 1 dólar, 1 quarto, 2 centavos e 4 centavos.

  • Crie um gerenciador de lista simples. Poder adicionar / excluir listas e adicionar / excluir entradas nessas listas. Aqui está um exemplo de gerente de lista de natal: http://pastebin.org/6543

  • Crie um programa que criará e testará se os números inseridos formam um quadrado mágico (com uma matriz 2D). Aqui está um exemplo de código, mas ele deve realmente imprimir o quadrado em cada etapa, a fim de mostrar onde o usuário está em termos de ampliação do quadrado: http://pastebin.org/6544

Eu também sugeriria fazer algumas coisas com o xTurtle ou outro módulo gráfico para misturar as coisas e impedir que ele ficasse entediante. Obviamente, isso é muito prática de programação e não o script para o qual muitas pessoas realmente usariam python, mas os exemplos que eu dei são basicamente tirados diretamente de quando eu estava aprendendo via python e funcionou muito bem para mim. Boa sorte!


2

Apenas faça com que seja divertido!

Surpreendentemente Scala pode ser o mais fácil se você tentar o Kojo


2

Se seu irmão gosta de quebra-cabeças, eu recomendaria o Python Challenge . Eu não o usaria como uma ferramenta formal de ensino em um tutorial individual, mas é algo que ele pode fazer quando você não está junto para se desafiar e se divertir.



2

Depois de ler alguns e-books gratuitos, descobri que o melhor livro para aprender a programar foi o Head First Programming publicado pela O'Reily Press. Ele usa Python como a linguagem e oferece programas para você trabalhar desde o início. Eles são todos mais interessantes que o 'Hello World'. Vale a pena o dinheiro que gastei nele e, como está fora há um tempo, você poderá encontrar uma cópia mais barata usada no Ebay ou na Amazon.


1

Se você deseja ensinar o básico de programação, sem ser específico ao idioma, existe um aplicativo chamado Scratch que foi criado no MIT. Ele foi projetado para ajudar as pessoas a desenvolver habilidades de programação. À medida que os usuários criam projetos do Scratch, eles aprendem a criar condições, loops etc. Também há uma comunidade de projetos do zero, de forma que os projetos podem ser baixados - dessa forma, você pode explorar os programas de outras pessoas e ver como eles foram criados.


1

Eu acho que uma vez que ele tenha o básico (variáveis, loops, etc), você deve tentar ajudá-lo a encontrar algo específico em que ele esteja interessado e ajudá-lo a aprender as necessidades para que isso aconteça. Sei que sou muito mais inclinado e motivado a fazer algo, se for do meu interesse. Além disso, certifique-se de deixá-lo enfrentar alguns dos problemas mais difíceis, nada é mais satisfatório do que o momento em que você descobre isso sozinho.


1

Fui ensinado aprendendo a resolver problemas de uma maneira independente da linguagem, usando fluxogramas e PDL (Program Design Language). Depois de algumas semanas, aprendi a converter o PDL que havia escrito em um idioma. Fico feliz por ter aprendido dessa maneira porque passei a maior parte dos meus anos programando, resolvendo problemas sem estar vinculado a uma linguagem. O idioma que eu uso sempre foi um detalhe de implementação e não faz parte do design.

Ter que resolver o problema dividindo-o em etapas básicas é uma habilidade essencial. Eu acho que é uma das coisas que separa aqueles que podem programar daqueles que não podem.

Quanto a como você lida com a ordem dos conceitos de uma linguagem, acredito que a maneira mais fácil é decidir que é ter um projeto em mente e lidar com os conceitos conforme necessário. Isso permite que você os aplique conforme necessário em algo que você está interessado em fazer. Ao aprender um idioma, é bom ter em mente vários projetos simples e alguns com complexidade progressiva. Decidir sobre isso ajudará você a mapear os conceitos necessários e sua ordem.


1

Eu recomendaria também assistir a alguns screencasts - eles geralmente são criados no contexto de uma tecnologia específica e não de uma linguagem, embora se houver código Python exibido, isso funcionará :). O ponto é - eles são criados por alguns bons programadores e observam como um bom programa é bom. Você e seu irmão também podem fazer uma programação de pares, que pode ser uma ideia ainda melhor. Só não esqueça de explicar POR QUE você faz algo dessa maneira e não dessa maneira. Eu acho que a melhor maneira de aprender programação é com bons exemplos e tentar nem mesmo ver os ruins.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.