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.