Tutoria de alunos que estão enfrentando dificuldades com o básico em C ++ [fechado]

26

Estou ensinando alguns alunos que estão tendo problemas significativos para aprender o básico de sua primeira linguagem de programação: C ++. Conheci muitos alunos excelentes e brilhantes que falharam ou abandonaram seu primeiro curso de CS. Todo mundo que eu estou ensinando faz um relato semelhante de sua experiência em sala de aula: o instrutor se move muito rápido, nada nas aulas faz sentido, et al. Antes dessa aula de ciências da computação, a maioria desses estudantes em dificuldades não havia manifestado interesse em computadores como algo além de processadores de texto, navegadores da web ou alguma outra forma de entretenimento. O computador é uma caixa preta que funciona, então por que mexer com isso?

Meu melhor palpite é que eles estão tendo problemas para conectar as abstrações da ciência da computação a conceitos familiares. Ou seja, esses alunos podem saber aprender matemática, biologia ou física, mas essas técnicas não estão funcionando quando se trata de programação.

Alguém tem alguma sugestão ou conselho? Os alunos que estou ajudando não merecem reprovação nesta aula. É claro que o instrutor não está levando em consideração o estilo de aprendizagem desses alunos. Ou seja, o instrutor não está reprovando nos alunos.

AdmCrunch
fonte
2
Comentaristas: se você tiver uma resposta, deixe como resposta: não deixe como comentário. Se sua resposta já foi adicionada, vote nela. Se você quiser discutir o tópico desta pergunta com outras pessoas, use o chat .
1
Não? Da minha experiência, há número suficiente de pessoas que programa e should ...

Respostas:

42

Existem algumas coisas que praticamente todo iniciante luta. Os alunos precisam saber ler código antes de aprenderem a escrever código.

  • A natureza seqüencial das linguagens imperativas. As pessoas têm dificuldade para entender que as funções são executadas em sequência, um item de cada vez, como uma receita. Uma maneira de superar isso é mostrar algum código funcionando através de um depurador.
  • O operador de atribuição ( =) nos idiomas do estilo C é extremamente enganador. Você precisa explicar com muito cuidado que a = 5significa "atribuir 5 à variável a, não " a é igual a 5 ".
  • Para iniciantes, é seguro descrever funções como blocos estruturados de código para os quais outras funções podem acessar. Além disso, os iniciantes têm problemas para entender que, em C ++, os argumentos da função são identificados por ordem, não por nome.
  • A maioria das linguagens de programação imperativas possui alguns componentes declarativos e alguns procedurais, e o C ++ não é exceção. Certifique-se de que o aluno entenda que algumas partes do código descrevem a estrutura do programa e outras partes (funções) descrevem o que o programa deve fazer.
  • Percorrer um programa com o depurador é uma ferramenta de ensino extremamente importante e muitas vezes negligenciada .
  • Expressões têm tipos . 3+3é um número inteiro, 3.5 + 3é um duplo "3" + "3"(em C #) é uma sequência de caracteres, x == 5 * 3 + 25é um booleano (ou número inteiro em C ++). Gaste muito tempo para garantir que o aluno esteja completamente confortável com essa noção.
  • Escopo variável é algo que os iniciantes ficam confusos o tempo todo. Explique ao aluno como o escopo funciona e verifique se ele sabe que um xdefinido em um escopo é diferente de um xdefinido em outro escopo.
  • Cada variável é referenciada pelo menos três vezes em sua vida útil: declaração, atribuição (geralmente feita na mesma linha que declaração), consumo. Se alguma delas estiver faltando, haverá um erro conceitual em algum lugar. Pelo mesmo motivo, se você estiver analisando um programa de trabalho, sempre poderá procurar essas três coisas no código para descobrir o objetivo de uma variável.
  • foros loops não devem ser ensinados até que sejam whilefornecidos exemplos adequados de iteração usando loops. A sintaxe abreviada é confusa e deixa os alunos se perguntando por que não podem simplesmente usar whileloops. Ter uma folha de dicas que descreve um forloop em termos de um whileloop pode ser útil.
  • Matrizes e ponteiros são fáceis de ensinar, mas um pesadelo para aprender. Em outras palavras, até ouvir um clique, a prática é importante.
  • A idéia de que código é texto e que um programa compilado é de fato um arquivo é ilusória para alguns iniciantes. Certifique-se de mostrar a eles os arquivos .cpp, .he binários no shell.

Os componentes OOP do C ++ são completamente diferentes, e eu espero que o instrutor não chegue lá - porque o OOP é melhor ensinado usando linguagens que foram projetadas desde o início para serem OOP. Na minha experiência, ensinar OOP através de C ++ nunca foi bem.

Rei Miyasaka
fonte
2
"As pessoas têm dificuldade para entender que as funções são executadas em sequência"? Eu acho que é exatamente isso que praticamente ninguém tem problemas (exceto, talvez, pessoas que já aprenderam alguma linguagem funcional antes de iniciar o procedimento). Mas eu concordo com tudo o que você diz.
precisa saber é o seguinte
3
+1 para avançar com o depurador, para que eles tenham uma idéia da diferença entre o próprio programa e a execução.
precisa saber é o seguinte
4
@leftaroundabout Você ficaria surpreso. A matemática é principalmente declarativa; portanto, linguagens imperativas podem prejudicar quem aprendeu álgebra.
Rei Miyasaka
2
Essa resposta parece ser apenas um "conceito de referência". Os conceitos são, sem dúvida, corretos e certamente importantes, mas ensinar dessa maneira é um pouco como tentar ensinar alguém a dirigir dirigindo as regras da estrada.
precisa saber é o seguinte
@ Stargazer712 Todo mundo aprende as regras da estrada antes de poderem fazer o teste. Eu poderia apresentar idéias macias de traços largos como "praticar é a chave" ou "ser criativo" ou "pensar logicamente", mas essas coisas são presumivelmente bastante óbvias para qualquer instrutor, assim como para a maioria dos alunos. Também se poderia ensinar coisas abstratas, como matemática discreta ou teoria da linguagem, como precursor da programação, mas isso só se torna importante quando a mecânica é tão complexa que os problemas não podem ser resolvidos apenas pela intuição. Cedo ou tarde, as pessoas precisam parar de ser zen e começar a ensinar conteúdo .
Rei Miyasaka
19

Você já ensinou programação antes?

Ensinei programação para alunos de graduação e pós-graduação por quatro anos. No primeiro semestre, minha experiência foi como a sua, até eu aprender algumas coisas.

O que me parecia vacuamente simples não era nada simples para os iniciantes.

Independentemente da linguagem, você precisa implementar uma estrutura mental - coisas tão óbvias que você nem percebe que as conhece, como:

  • Os computadores fazem apenas uma coisa de cada vez. (Qualquer um que disser ter paralelismo e canalização, vá embora. Volte quando os alunos souberem alguma coisa.) Os computadores podem fazer apenas um pequeno número de coisas diferentes e não podem começar a dar um passo até que o anterior termine. Só estou dizendo isso, porque os computadores parecem fazer tantas coisas, e instantaneamente, que, para um iniciante, parece que eles fazem tudo de uma vez e também leem sua mente.

  • Variáveis ​​são importantes. É essencial entender que o nome de uma variável e seu conteúdo em tempo de execução são duas coisas totalmente diferentes. Iniciantes lutam com isso. Se eu disser "Escreva um programa para inserir seu nome e depois diga Olá para você", eles precisam descobrir que precisam de uma variável para manter seu nome e precisam criar um nome para a variável, e são tentados dar o nome a si mesmos e se perguntar o que "entrada" significa.

  • Há uma enorme diferença entre o horário em que você escreve / edita o programa e o horário em que ele é executado. Durante seus primeiros exercícios, eles precisam ser lembrados disso com bastante frequência.

O idioma que usei era o BASIC, porque é muito simples para iniciantes. Não é difícil mudar para outras linguagens depois que elas desenvolvem um conjunto de habilidades básicas de programação.

Muitas vezes escrevíamos um programa no quadro e depois "reproduzíamos o computador". Ou seja, coloque um X próximo à instrução atual, faça-o manualmente e mova o X para a próxima instrução. Variáveis ​​eram retângulos no quadro, onde escreveríamos o conteúdo atual. Quando uma tarefa acontecia, nós a apagávamos e colocávamos o novo valor.

Um truque que desenvolvi foi um computador decimal simulado, com 1000 locais de memória, cada um capaz de conter um número de 4 dígitos. Havia um pequeno conjunto de "códigos de operação", como carregar o acumulador, adicionar, armazenar, pular etc. Eu gostaria que eles escrevessem pequenos programas nessa "linguagem de máquina" e depois a executassem em uma única etapa para vê-la funcionando. Posteriormente, conceitos como variáveis, salto etc. são muito mais fáceis de explicar.

Espero que ajude.

Mike Dunlavey
fonte
Eu gosto da ideia simulada de computador. Você tem uma linguagem formal para isso ou apenas discute as idéias em pseudocódigo / inglês comum?
Rei Miyasaka
@Rei: eu escrevi (no BASIC) um simulador chamado Simple. Era tudo interface de teclado. O usuário pode inserir valores na "memória"; então eles poderiam dar um passo à frente e examinar o acumulador e a memória em cada ponto, se quisessem. Eu acho que isso foi realmente importante porque os levou a fazê- lo, não apenas falando sobre isso.
precisa saber é o seguinte
Ah! OK. Obrigado, eu deveria tentar algo assim.
Rei Miyasaka
Esta deve ser a resposta número 1 na minha opinião.
riwalk
12

Na minha opinião, C ++ é um exagero como primeira língua.

Se eu fosse você, e tivesse tempo suficiente em mãos, apresentaria conceitos de programação e CS usando Python (ou similar).

Quando os conceitos são claros, ou seja, quando eles se sentem confortáveis ​​com estruturas básicas de dados, indireção, algoritmos básicos, etc., eu lentamente introduzo o C ++ e eles rapidamente conseguem se relacionar com o que já teriam aprendido.

yati sagade
fonte
2
Eu concordo, mas os profissionais geralmente não têm o direito de escolher qual idioma ensinar, muito menos ATs.
Rei Miyasaka
4
Eu discordo de Python. Eu participei da minha primeira aula de CS 101 em C ++ e depois mudei para uma escola que ensinava CS 101 em Python. Os alunos de Python ficaram MUITO confusos, mesmo no básico, quando todos nós tivemos a mesma aula do CS 201 ... Mas todos os alunos de C ++ se destacaram.
OghmaOsiris 18/09/11
@OghmaOsiris, sinceramente, não sei o suficiente sobre Python, mas pode ser o que você testemunhou poderia simplesmente ter sido a manifestação de um viés de auto-seleção. Afinal, o C ++ é assustador para alguns estudantes (especialmente para os alunos mais inexperientes em programação).
Stephan Branczyk
@ Oghma Qual foi a classe 201? Se for algo de baixo nível, provavelmente deve ser seu próprio ramo com C como pré-requisito.
Rei Miyasaka
1
@OghmaOsiris: Hmmm, eu tenho que discordar, não discordo, compartilhar uma experiência diferente na minha mudança universal para python, pois a primeira linguagem provou ser muito útil até onde eu sei (a primeira era Java sem C ++). Eu não acho que as experiências individuais contam como resultado de uma ser melhor que a outra, que é uma guerra interminável de chamas. Eu poderia argumentar que embora Python pode ser uma ótima linguagem de programação para começar com porque ele não fica em seu caminho, ele realmente faz isso melhor que a maioria das linguagens de programação, que recebe muitos estudantes ....
Trufa
4

Aqui está o que eu aconselharia:

  1. Dê a eles todos os detalhes necessários para descobrir
  2. Incentive-os a tentar entender os detalhes
  3. Certifique-se de que eles tenham os detalhes armazenados em formato compacto sempre que precisarem

Basicamente, eu aconselho você a criar um único papel A4, com todos os detalhes necessários. Algum tipo de manual de referência que possui todos os detalhes. Alguns livros também podem ajudar, por exemplo, o livro "A linguagem de programação C" ajudou tremendamente porque tinha todos os detalhes necessários disponíveis em formato compacto. A compactação de informações é parte necessária na criação do papel a4, que contém todos os detalhes.

tp1
fonte
3

A programação é substancialmente diferente dos outros domínios comuns que um aluno encontra. Muitos estudantes antes da faculdade conseguiram meramente prestar atenção nas aulas e talvez fazer algumas tarefas de casa com problemas fáceis e as respostas na parte de trás do livro. É mais sobre memorizar processos e criá-los. É também a primeira vez que muitos alunos recebem a resposta errada repetidamente (erros de sintaxe, erros de lógica, falhas de seg, etc.). Isso pode drenar a motivação do aluno ao trabalhar em programas.

Para realmente saber o que está acontecendo com a programação, eles precisam praticar MUITO. Uma técnica frequentemente negligenciada é fazê-los escrever o código psuedo em qualquer que seja a sua língua nativa. Peça-lhes para continuar expandindo isso até que tenham uma solução bastante detalhada para o problema. Então é uma questão de traduzir isso em código real.

Peter Smith
fonte
3

Quando eu estava na faculdade, eu era tutor do curso de programação, entre outros. O problema que você está descrevendo não é incomum. Dependendo da sua função específica, você pode ter diferentes abordagens que deseja adotar.

Primeiro, se esse é um problema generalizado que afeta partes significativas dos alunos da turma, se você tiver acesso a isso, eu abordaria o professor que ministra o curso com um feedback específico sobre quais conceitos os alunos não estão conseguindo entender, para que ele ou ela pode incorporar uma revisão adicional desse material à medida que ele aparecer novamente no prazo ou melhorar o currículo para termos futuros.

Se você ensina uma seção de discussão para o curso, além do tempo de laboratório, seria um momento maravilhoso para expor as coisas que eram confusas na palestra e ajudar a torná-las mais concretas e garantir que todos os fundamentos fossem entendidos.

Se o único momento em que você trabalha com esses alunos é durante o seu tempo no laboratório de tutoria, você ainda pode usá-lo para ensinar aos alunos, um a um, ou alguns de cada vez, os blocos de construção conceituais que eles precisam para entender e complete a lição de casa.

Eles podem se sentir tão perdidos na sala de aula que nem sabem onde parar e fazer perguntas. Se for esse o caso, volte ao básico com eles. Onde eles estavam no curso quando entenderam o que estava acontecendo pela última vez? Se eles não tiverem certeza ou "nunca" entenderem, talvez seja necessário voltar ao início para explicar o olá mundo, ensinando-lhes coisas como o que é uma variável, como o computador pega sua lista de "instruções" e tenta faça-os em ordem, mas o computador não é tão "inteligente" quanto nós, então você precisa ser muito literal e dizer as coisas exatamente certas para o computador entender etc.

Na verdade, esse é um ponto de luta e frustração que eu já vi com bastante frequência nos cursos de programação que não são importantes. Os alunos escrevem algum código. Parece "quase" certo, mas eles vão compilá-lo e isso gera um erro, um erro muito enigmático. E eles não têm idéia do que há de errado nisso. E observe o código por horas. Então, finalmente, descobri que era algo que parece trivial, como um ponto-e-vírgula ausente ou uma chave no lugar errado. Então eles compilam novamente, e ainda há um erro, é outra coisa. Eles soletraram um nome de variável de maneira diferente na segunda vez em que o usaram. E assim por diante. Então eles pedem ajuda a um amigo, tutor ou alguém, e eles podem responder de cabeça para baixo "ah, basta adicionar isso lá e então ele funcionará". Portanto, a experiência deles é que a programação é um pouco "misteriosa"

Essa é uma área como tutor, onde você tem muito espaço para ajudar. Dependendo do nível de frustração deles, talvez eu tenha abordagens diferentes para ajudá-los a descobrir por que o código não está funcionando. Se eles estão conseguindo, eu posso dar dicas e tentar ajudá-los a descobrir por conta própria. Mas se eles estão prontos para desistir de frustrados, geralmente darei a eles algumas respostas gratuitas e, em seguida, tentarei fazer pelo menos perguntas como "você entende por que essa mudança corrigiu seu programa?" ? "

Para alguns alunos, especialmente os que não são cursistas, eles podem não ter a atenção metódica aos detalhes necessários para ser um bom programador ou aproveitar a programação. Você pode segurá-los por meio de estratégias para ajudá-los a prestar atenção aos detalhes e ser metódico o suficiente para resolver os problemas, mesmo que seja um desafio para eles.

Porém, os analistas mantêm o recuo do código "apropriadamente" - com frequência, os programadores iniciantes criam problemas com aninhamento e escopo porque possuem chaves não correspondentes ou similares porque não prestam atenção ao que está aninhado sob o quê. Dê a eles uma lista de verificação de "coisas para verificar quando o programa não será compilado", como recuar todo o código corretamente e garantir que as chaves coincidam, verifique se todas as linhas terminam em ponto e vírgula, especialmente em torno do número da linha onde o primeiro erro é exibido para cima etc.

Ensine-os a compilar cedo e com freqüência. Escreva o código mínimo do esqueleto (digamos, olá mundo), compile / teste. Adicione algumas linhas, compile novamente. É muito mais fácil encontrar erros se você estiver olhando apenas para um pequeno balde de alterações e não um grande balde.

Ajude-os a aprender como dividir um problema em pequenos problemas solucionáveis. É a mesma coisa que fazemos como programadores profissionais, resolvendo problemas muito mais difíceis que não sabemos como resolver. Você continua quebrando-o em pedaços até chegar a algo que você sabe resolver ou pode fazer alguma pesquisa para aprender a resolver. "Que etapas você precisaria tomar para chegar a uma solução funcional?" Bem, primeiro você precisa de um código de esqueleto (olá mundo). voce sabe como fazer isso? Sim, ótimo, então quando terminarmos de falar, você pode começar fazendo isso! Então ele precisa ler um arquivo como entrada. Você se lembrou de ler sobre isso no capítulo 4? Na verdade não? Por que você não vai dar uma olhada nisso depois de dar um olá ao mundo, e ver o quão perto você pode chegar para fazer isso funcionar e depois me ligar de volta e eu? Vou ajudá-lo um pouco mais quando você ficar preso nisso. Nas primeiras vezes, talvez seja necessário fazer uma lista numerada para eles das etapas necessárias para resolver o problema, para que eles possam aprender com o exemplo como decompor o problema.

Se eles estão recebendo parte do material, mas não todo o material em sala de aula, incentive-os a fazer perguntas na sala de aula, porque nove em cada dez não são o único aluno que não entende e o professor provavelmente apenas encobriu algo importante.

Se eles passam "horas" encarando um bug, mas não o descobrindo, isso é uma perda de tempo, eles não estão aprendendo muito com isso. Freqüentemente, os bugs são problemas de insight, e é uma questão de encontrar o insight certo para resolvê-lo, e eles podem não ter um talento especial para esses tipos de problemas. Sugira outras abordagens gerais a serem adotadas quando ficarem presas: peça ajuda a outro amigo da turma (conheça alguns colegas de classe, se necessário), inicie a lição de casa com antecedência, para que eles tenham tempo para parar e depois entre o laboratório do tutor e faça perguntas durante o horário de funcionamento ou vá para o horário comercial do professor. Se eles estão acostumados a fazer cramming, o que funciona bem para assuntos de memorização, eles atingem uma parede de frustração quando é confrontado com a programação que trata mais de solução de problemas do que de memorização. Mostre a eles como procurar exemplos de sintaxe em seus livros, fluxo de pilha, etc. Incentive-os a postar uma pergunta em um fórum de perguntas de classe particular, se houver.

Ensine-os a restringir onde o código para de funcionar. Comente as coisas até voltar a algo que é executado e, em seguida, adicione-as lentamente até obter o segfault novamente.

Muitas dessas idéias podem ser transformadas em folhetos, se surgirem muito. Estratégias é geralmente a parte em que os professores ignoram - eles estão gastando seu tempo com a sintaxe, a semântica de como escrever loops, matrizes, E / S, etc. Mas não há tempo suficiente gasto "no que faço quando tento executar meu código e simplesmente não compila ou trava em mim? "

Quando se trata de coisas conceituais, especialmente fundamentos, como "o que é uma variável" ou "o que é um loop?" não entender que os impedirá de acompanhar o resto do curso. Em um curso baseado em palestras, o professor pode não ter tempo para responder a todas as perguntas ou ajudar a lâmpada a se acender para cada aluno. E é por isso que os tutores são tão importantes para aprender programação. Eles podem precisar de instruções individualizadas com analogias adicionais para tornar concreto um tópico específico.

Como você está ensinando em C ++, eu imagino que as aulas surjam como um tópico abstrato que alguns alunos lutam para "obter". Freqüentemente, a abstração das aulas é ensinada com exemplos correspondentes a algum objeto aleatório do mundo real, como uma "máquina ATM", e analogias são feitas ao objeto do mundo real. Você pode ter variáveis ​​para controlar quanto dinheiro está dentro, você tem métodos, que são como regras que informam à máquina ATM como responder a condições específicas, etc. Às vezes, uma analogia é a que "adere" a uma pessoa em particular , e outros alunos compreendem um diferente.

Sempre que possível, faça desenhos para eles. Como um diagrama de seqüência do que acontece ao longo do tempo, para ajudá-los a entender o que o código que eles estão escrevendo faz. O usuário clica neste botão. Em seguida, o programa deve responder executando x, ye z. Desenhe uma matriz como um monte de caixas postais nos correios que podem conter apenas um número e ponteiros como setas apontando para o "endereço" na frente da caixa. Etc.

Jessica Brown
fonte
2

De todas as opções maravilhosas para linguagens de programação disponíveis, esta faculdade usa C ++ como sua aula de introdução à computação em computação para estudantes que não são de computação em nuvem? Nas mãos de um instrutor talentoso, pode ser remotamente concebível - mas por que torná-lo tão difícil?

Quando aprendi "Pascal" na aula de introdução ao ensino médio da faculdade, passamos as primeiras 3 semanas trabalhando com " Karel, o robô ". Este era um ambiente de programação semelhante ao logotipo de sandbox muito simples, onde todos os conceitos básicos (incluindo recursão) foram explorados minuciosamente antes de fazê-lo em Pascal. Em "Karel the robot", você controla um robô no espaço 2D usando um pequeno conjunto de comandos simples. Isso fornece aos alunos uma base concreta útil que eles podem usar para o que acontecerá a seguir.

Talvez agora haja linguagens de programação instrucional mais modernas que preenchem o papel de "Karel the Robot"? Provavelmente tarde demais para seus alunos agora, no entanto.

Angelo
fonte
Tivemos um programa semelhante chamado Alice.
OghmaOsiris
Esta é Alice: " en.wikipedia.org/wiki/Alice_(software) "
OghmaOsiris
@OghmaOsiris O link Alice está quebrado. A fim "foi adicionado ao URL.
Zoot
Sim, sem ele o final ')' foi cortado.
OghmaOsiris
2

Além do que foi dito, presumo que, como iniciantes, eles só precisam arranhar a superfície; portanto, adapte seu currículo adequadamente para evitar coisas complexas.

0 - dê a eles um problema simples (por exemplo, avalie uma expressão).

1 - dê a eles tempo para descobrir.

2-dê a resposta para eles.

3-passe pela resposta linha por linha

4-peça que eles comparem sua resposta com a atenção deles

5-peça para que tirem a lição deste problema

6-adicione mais uma etapa ao mesmo problema, digamos uma condição que exija uma instrução SE

7-Repita a tarefa acima em vários problemas. Até então, eles teriam entendido o básico do idioma e como usar o ambiente. O estaria pronto para o que vem a seguir.

Além disso,

-tem um problema simples de bônus para que eles tentem em casa a cada 2 aulas mais ou menos

- envolva-se com cada aluno para ver qual é o ponto que o impede de ir mais longe

-fornecer material de referência fácil, esquecer tópicos complexos e livros complexos

- obtenha feedback com frequência e use-o

-peça para que se preparem para o próximo tópico antes de virem para a aula

NoChance
fonte
2

O que me ajudou quando passei pelo CS 101 foi aprender a lógica antes mesmo de olhar para o código. Passamos por tabelas de verdade e cálculo preposicional apenas para começarmos a pensar "isso é verdadeiro ou falso" e não "isso é igual a isso ou aquilo".

Isso foi quando tudo clicou em mim. Depois que descobri que a programação basicamente manipula valores verdadeiros / falsos em seu núcleo, tudo se torna relativamente simples.

E isso fez com que não importasse qual idioma eu estava usando, a lógica é a mesma em todos os lugares. A sintaxe pode ser confusa, mas posso dizer coisas como "Ok, no Obj CI envia mensagens para classes como esta e no C ++ foram enviadas dessa maneira. Mas o algoritmo não mudou nada". etc.

OghmaOsiris
fonte
2

Há um artigo da ACM ou da IEEE em algum lugar que detalha por que os iniciantes (mesmo os graduados em CS que começam no campo) precisam ficar atrás de um programador sênior e observá-los codificar um problema.

Profissionais costumam fazer pares para problemas difíceis. Com frequência, os alunos são instruídos a não fazer isso. Vantagens do emparelhamento (revezando-se no teclado): 1. O aluno é informado imediatamente do que está fazendo de errado. Feedback instantâneo. 2. Quando o aluno observa o professor, ele aprende coisas que o professor nunca pensou em apontar.

Em vez de permitir que um aluno desenvolva más práticas, ele é cortado pela raiz. (Eu passaria o número 1 com o número 2 aqui e deixaria o aluno assistir o instrutor / TA PRIMEIRO )

Ensinar CS com um conjunto estático de slides do powerpoint não é bom para o processo temporal de escrever um programa. (É verdade que existem truques que você pode fazer com o aumento das funções linha por linha, mas geralmente são estranhos.)

Os alunos precisam saber por onde começar a escrever e onde parar e compilar. Nossos cérebros são principalmente conectados para ler da esquerda para a direita, de cima para baixo, mas um programa é como um todo, escolha seu próprio livro de aventuras amontoado em uma única página!

Muitas vezes, um iniciante copia um programa inteiro e depois compila. Mesmo um profissional pode fazer uma primeira tentativa dessa maneira, antes de perceber que deveria ter deixado todas as funções vazias e compilado o programa, e adicionado iterativamente a um esqueleto funcional.

Além disso, está relacionada a idéia ridícula de que o ensino superior deve ser ensinado sem computador e apenas lápis e papel. Eu me pergunto quantos profissionais de programação empregados realmente pensam que esse é o melhor caminho, ou se é exatamente o que os instrutores de CS fazem porque eles mesmos não gostam de trabalhar com computadores? Qualquer tentativa de remover um computador da imagem é má. Fazer isso torna a programação menos divertida e menos interativa do que deveria ser. Já passamos dos dias em que inserimos dados em um cartão perfurado e aguardamos pacientemente. Os desenvolvedores profissionais de hoje são fãs de gratificação instantânea. Felizmente, a maioria dos estudantes também.

Obviamente, o desenho de desenhos bonitos com lápis e papel antes e durante o processo de desenvolvimento é uma ferramenta poderosa para programadores profissionais e iniciantes. Assim como o tempo "mãos no teclado" também deve ser gasto emparelhamento! Talvez aqui faça sentido deixar o aluno tentar a primeira rodada antes de assistir o professor, embora mesmo com isso provavelmente valha a pena ver o verdadeiro processo de pensamento do professor.

Por fim, as teclas de atalho e os truques de edição que o desenvolvedor profissional emprega não são "ruído" para o aprendizado do aluno. Mais importante, eles envolvem e interessam ao aluno. Segundo, eles aumentam a conscientização para as necessidades comuns de desenvolvimento. Além disso, as mais básicas dessas práticas geralmente são fáceis de executar, mas inicialmente não óbvias. Um jovem estudante de carpintaria pode aprender facilmente como remover uma unha com a garra de um martelo, mas na maioria dos casos é preciso primeiro saber que é para isso que serve a garra. Algumas coisas extremamente fáceis de fazer simplesmente não são triviais para aprender sem serem ensinadas. Até desenvolvedores profissionais esquecem esses "truques" o tempo todo e se beneficiam de ferramentas de refatoração, como o re-afiador, para remover códigos redundantes ou não alcançados, etc.

David
fonte
1
Aliás, se alguém pudesse me indicar o título desse artigo, eu apreciaria!
David
2

A programação de computadores é geralmente um dos primeiros cursos em que a habilidade cognitiva de síntese é necessária para obter uma nota de aprovação. É muito difícil transmitir essa habilidade a outra pessoa. Você pode explicar todos os componentes que eles têm disponíveis e como eles funcionam. Você pode dar vários exemplos de como outras pessoas usaram a síntese para combinar esses componentes em um todo mais útil, mas há muito que você pode fazer sem algo "clicar" na mente do aluno.

Na minha experiência, é a habilidade de síntese que muitas vezes ilude as pessoas que não "entendem" a programação. Eles têm um entendimento perfeito das partes, como variáveis, funções e loops, mas fazem perguntas como: "Entendo por que funciona, mas como você sabia que precisava colocar um loop lá?" Você simplesmente tem que praticar até conseguir.

Karl Bielefeldt
fonte
2

Para citar Aaron Hillegass, lembre-os de que eles não são estúpidos, é apenas difícil. É difícil programar a programação, é uma maneira totalmente diferente de pensar e, embora possam estar lutando com o básico, provavelmente estão bastante conscientes de que estão e isso as deixará bastante desanimadas.

Eu digo isso como alguém que falhou no seu primeiro ano no curso de CS, já havia programado muito antes e aprendido todos os conceitos (VB, sim, baby), mas o C ++ simplesmente não clicou em mim. Acabei voltando ao básico e trabalhando nele a partir de então, cliquei, mas se alguém dissesse "Você não é um idiota, isso é apenas difícil", teria tornado minha vida mais fácil.

Nicholas Smith
fonte
0

Você disse que "esse aluno pode saber aprender matemática, biologia ou física, mas essas técnicas não estão funcionando quando se trata de programação".

Há uma razão para isso: a programação requer algo que outras disciplinas não exigem necessariamente: criatividade e ... fantasia . A capacidade de "imaginar as coisas no trabalho". Pessoalmente, descobri que esse requisito está mais presente (é claro, com todas as devidas exceções) das pessoas provenientes da escola técnica (eletrônica e eletromecânica em particular: eles precisam "imaginar fluxos elétricos e como se controlam", pois não podem vê-los!) do que na "ciência pura" (onde tudo parece virar matemática).

Para esses últimos casos, a "cognição visual" deve ser ajudada. É importante não apenas focar a noção e o texto (o tipo -> compilar -> observar os erros não funcionará se você não conseguir "ler" os erros), mas também fornecer uma maneira de visualizar as coisas, em tempo de design ( simulando o que se passa na máquina: prepare-se com um quadro branco e um conjunto de post-it colorido) e no tempo de execução.

Para que esta última parte seja bem-sucedida, é necessário fornecer a noção essencial de sistemas operacionais e "como os programas são executados em uma máquina" (e o que essa máquina é de fato). E um IDE não intimidador deve ser fornecido. Eu normalmente sou um "bloco de código personalizado" com muitas coisas removidas para "não distrair". A noção de projeto feito de fontes para gerar objetos a serem vinculados à biblioteca deve ser dada ANTES de começar a falar sobre uma linguagem.

O mundo olá tradicional em C ++ requer um ponto de entrada e um dispositivo de saída. O aluno já deve estar familiarizado com isso. O sucesso desse tipo de curso depende dos primeiros dias. Você precisa estimular uma visualização do que acontece dentro de um computador para permitir que eles entendam o que é programação.
O resto é sintaxe (ciência) e abstração (fantasia)

Emilio Garavaglia
fonte