Ensinei programação introdutória no nível da faculdade. Foi um curso de pão com manteiga, todo o corpo docente fez, e acho que fizemos muito bem. Seguimos um texto comum e tínhamos exames comuns, mas cada um de nós tinha nosso próprio método de sala de aula que funcionava. Faz muito tempo desde então, mas ocasionalmente eu dou aulas de programação para crianças, e todo o cenário é o mesmo.
O jeito que faço é começar de baixo, o mais concreto possível. O que os alunos sabem é uma estrutura. Eles já têm muitos conceitos. Estou construindo outros conceitos sobre eles e estou eliminando conceitos que eles podem formar que são contraproducentes. Ao mesmo tempo, eu os faço aprender fazendo .
Eu construí um pequeno computador com um chip Intel 8008, alguns EPROM e alguns circuitos. Eu o havia programado para tocar um dueto quando o chip de E / S foi conectado a alguns alto-falantes. Eu explicaria como o pequeno programa funcionava, com um loop interno para contar um contador. Isso funcionaria como um atraso. Depois, alternava o bit de saída e o fazia novamente. Faria isso por um tempo e depois mudaria para outro atraso, dando outro tom e assim por diante. O chip de memória tinha um temporizador pequeno e, se eu colocasse um fio de capacitor em uma das entradas do timer, o programa seria executado muito lentamente . A turma podia ouvir os palestrantes clicando, clicando, clicando ... Eu queria que a turma entendesse que o computador estava fazendo coisas muito simples, um passo de cada vez. Então eu desengatava o fio do capacitor e a "música" surgia. (aplausos)
Então eu construí um simulador para um computador decimal muito simples, com 1000 locais de memória, cada um contendo um número decimal assinado de 4 dígitos. Tinha opcodes muito simples como "adicionar ao acumulador", "pular se negativo" e assim por diante. Eu gostaria que eles escrevessem pequenos programas nessa "linguagem de máquina", como adicionar dois números ou adicionar uma lista de números. Depois, eles podiam vê-lo funcionar dando um passo ou mantendo pressionada a tecla Enter para vê-lo correr "rápido".
O objetivo disso foi estabelecer o conceito de que os computadores podem executar apenas um número muito pequeno de operações básicas diferentes, e elas são executadas uma por vez. Isso é para contrariar a impressão que eles têm de que os computadores são complicados e de que fazem tudo ao mesmo tempo, e lê sua mente por uma pechincha.
A partir daí, passamos a programar em uma linguagem "real" (BASIC :), começando com programas muito simples, mas interessantes, trabalhando através de condicionais, loops, matrizes, arquivos, mesclagens etc. O objetivo era criar um conjunto de habilidades suficiente para que eles pudessem assumir um projeto de sua própria escolha, porque essa é a única coisa que torna a programação interessante - o uso no qual você pode colocá-la. Eu jogava algumas idéias para projetos, e então elas aceitavam a partir daí. Eu pedia idéias escritas e, em seguida, relatórios de progresso, para impedir que adiassem para o último minuto e depois entrassem em pânico. Eu acho que os projetos foram a melhor parte, porque eles estavam aprendendo por conta própria.
Essa base inicial em uma compreensão muito concreta do que os computadores fazem tornou muito mais fácil ensinar conceitos mais tarde, que de outra forma seriam verdadeiros obstáculos, como matrizes ou (em um curso posterior) indicadores. Temos a tendência de glorificar o conceito de "abstração" como algo maravilhoso, mas ele precisa ser construído sobre uma base concreta, não no ar.