Mais um episódio caricato de quem anda no ensino. Esta aconteceu numa discussão final dos trabalhos práticos de uma disciplina.
Para melhor enquadrar o tema há que esclarecer o processo de avaliação nas disciplinas da secção de programação do DEETC do ISEL. De modo resumido a avaliação final tem 2 componentes: uma teórica e outra prática. O aluno terá que ter nota mínima de 9,5 nas 2 componentes para ser aprovado.
A nota da componente teórica é obtida num teste com duas datas possíveis. A prática inclui um ou vários projectos/exercícios e a sua nota é apurada após uma discussão final, que costuma ter uma duração entre 1 ou 3 horas, isto dependendo da disciplina e do professor. Esta discussão só se realiza para os alunos que tenham aproveitamento no teste.
Numa das disciplinas que leccionei neste semestre estabeleci que a componente prática seria constituída por 3 séries de exercícios e um projecto final. Este projecto teria maior peso que as 3 séries no cálculo da nota da componente prática.
Dos 20 grupos que passaram no teste, 4 não realizaram o projecto final o que condicionou fortemente a nota final. Por isso dei a opção a estes grupos de concluírem o projecto final no prazo de 1 semana, dando claro o devido desconto pelo atraso registado, mas não afectando tanto a nota final como seria, caso não tivessem entregue o projecto.
3 grupos aceitaram e 1 optou por não fazer esse projecto. É sobre este último que passo a relatar o episódio da discussão. Neste caso a discussão realizou-se com o único elemento que passou no teste com nota de 14,9.
Iniciada a discussão começo por confrontar o aluno que não tendo ele entregue o projecto, a sua nota na componente prática estaria muito comprometida, a não ser que a discussão superasse as expectativas. Até porque mesmo as 3 séries estavam bastante fracas e incompletas. A isto o aluno responde-me que até nem vinha muito bem preparado, porque não tinha tido tempo de rever a matéria/séries de exercícios. O meu espanto :o, mas já vou estando habituado a certas reacções dos alunos.
A minha resposta foi: “Bem isso quer dizer, que se calhar ainda vamos a ver se consegues passar nesta discussão.” Digo isto mais por contra resposta, do que propriamente estivesse eu a pensar que um aluno com 15 no teste fosse reprovar numa discussão.
Começo então a folhear a 1ª série e a comentar o facto de todas as respostas estarem muito incompletas. O aluno diz-me que da 3ª série responderam a tudo e então eu salto para lá.
À 1ª pergunta sobre o padrão Dispose estava escrito na 3ª série, passo a transcrever: “Uma vez que o objectivo é nós termos a possibilidade de decidir quando os recursos são libertados faz sentido um tipo implementar o padrão Dispose e redefinir (desactivar) o método finalize; pois o finalize é accionado num momento desconhecido, o que pode comprometer o sistema por acumular recursos inactivos em memória.”
Começa a discussão (e isto agora é só para quem conhece esta área):
Eu: “Então o que é quer dizer com ‘redefinir (desactivar) o método finalize’”?
Aluno: “Então…. hmmm… coloco o “booleano” a falso”
Eu: “Que booleano?”
Aluno: “Então …. há um booleano que passa a falso.”
Eu: “Mas qual booleano? Uma variável? Um campo? Detalhe lá isso…”
Aluno: “Sim isso.”
Eu: “Isso o quê?”
Aluno: não diz nada…
Eu: depois de muito insistir acabo eu por lhe dizer o que ele havia de responder.
Continuando no mesmo tema a ver se o aluno sabia alguma coisa disto.
Eu: “Mas sabe que tem uma outra forma de impedir a execução do Finalize?”
Aluno: Encolhe os ombros e “não estou a ver”.
Eu: “GC.SuppressFinalize(Object obj). Lembra-se de falarmos nisto?”
Aluno: “Tenho uma ideia…”
Eu: “E lembra-se de qual o efeito da execução deste método?”
Aluno: “Não estou bem a ver…”
Eu: “Então vamos por outro caminho. Como é que o ambiente virtual (AVE) trata as instâncias de tipos que redefinem o método Finalize?”
Aluno: “Executa o Finalize para limpá-los da memória.”
Eu: “Isso não é bem assim, mas também não era isso que estava a perguntar-lhe. O que eu queria dizer era: quando o ambiente virtual (AVE) cria uma instância de um tipo que tem o método Finalize redefinido, o que é que ele faz com essa instância?”
Aluno: “Cria um objecto.”
Eu: “Objecto ou instancia é o mesmo. O que é que o AVE faz com esse objecto se o seu tipo tiver o Finalize redefinido?”
Aluno: “Chama o Finalize para limpá-lo.”
Eu: “Eu estou a falar do momento em que é criada a instância, quando é feito new. Acha que faz sentido limpá-la nesse momento?”
Aluno: “Pois… não.”
Eu: “Então o que é que acontece para uma instância de um tipo que tem o Finalize redefinido?”
Aluno: “Não estou a ver.”
Eu: “A finalization list e a FReachable list, não lhe dizem nada?”
Aluno: Acena-me que não com a cabeça.
Começo a ficar preocupado. Mas como é que um aluno tira 15 no teste e não me sabe responder a estas questões tão simples. É verdade que não coloquei nenhuma questão deste tema no teste, mas coloquei outras bem mais difíceis. Que coincidência ir logo pegar no tema que o aluno não conhece. Bem, vamos mas é passar a outra série de exercícios.
Pego na 2ª série e numas das questões mais triviais: implementação da interface ICloneable. A questão dizia:
«
Indique o problema do código seguinte. Faça as correcções que julgar mais convenientes.
struct AValueT : ICloneable {
public AValueT Clone() {
return (AValueT) MemberwiseClone();
}
}
»
Na resposta à questão o aluno começava por definir a sua própria classe ICloneable, ao que eu pergunto:
“Porque é que definiram esta interface ICloneable?”
Aluno: “Então para corrigir o erro de compilação.”
Eu: “Mas não existe já uma interface ICloneable na Framework .net?”
Aluno: “Hmmmm … não sei… ele (compilador) não a encontrava.”
Eu: “Talvez porque faltava using System?”
Aluno: “Pois…”
Entretanto reparo que ainda assim a definição da interface ICloneable do aluno tinha um método clone com tipo de retorno void.
Eu: “Além disso. Ainda que não existisse essa interface na framework .net, tu defines um método clone com tipo de retorno void?”
Aluno: encolhe os ombros como sem perceber a questão…
Eu: “Então qual é o comportamento esperado do método clone?”
Aluno: “Criar uma cópia do objecto.”
Eu: “Então e achas normal esse método ter void como tipo de retorno?”
Aluno: encolhe os ombros …
Eu: “Isto não bate certo. Como é que tu tiveste 15 no teste? Eu vou mas é fazer-te novamente aqui o teste presencialmente. Como é que alguém que tem 15 não sabe estas questões. Isto são perguntas básicas.”
Ao mesmo tempo pensava: “Este gajo copiou no teste ou arranjou alguma marosca. É impossível ter tido 15.” Pego no envelope dos testes à procura do teste do aluno. Reparo que o aluno começa então a ficar preocupado.
Quando finalmente encontro o teste, olho para a soma dos parciais e leio 3,5. Três vírgula cinco. 3,5. A nota do aluno no teste tinha sido 3,5, que eu tinha-me enganado a copiar para a pauta Excel tendo escrito 13,5 e que com um factor extra deu 14,9.
Eu: “AAAAAAaaaaaaaaa bom. Isto assim já faz sentido. Afinal reprovaste no teste.”
Aluno: Olha para mim com um ar um tanto ou quanto alucinado como que sem perceber o que se estava a passar.
Eu: “Bem, a única diferença é que em vez de te reprovar aqui na discussão tu já estavas reprovado. Mesmo que eu assuma o erro e te dê o 15 no teste tu não tens positiva nesta discussão, pelo que ficavas na mesma reprovado.”
Enquanto esclarecemos o assunto e vou folheando o teste vejo que somando o total das questões respondidas pelo aluno, dava 10 valores.
Eu: “E tu não achaste estranho tendo só respondido a 10 valores teres 15?”
Aluno: “Como às vezes os professores dão uma compensação…”
Eu: “Bolas… e mesmo assim não estranhaste?”
Aluno: Encolhe os ombros…
Eu: “Lamento, mas realmente tu não sabes mesmo nada disto. Tinhas que estudar mesmo muito para conseguir recuperar tudo o que não sabes. Repara que eu nem se quer cheguei às questões difíceis!”
Aluno: “Pois… Bem, então vou tentar em época especial.”
Eu: “Sim se és trabalhador estudante penso que podes fazer época especial.”
Aluno: “Então até à próxima.”
Eu: “Adeus….”
Ainda bem que existem discussões. Não houvesse uma discussão e este aluno teria levado um brinde da Páscoa.