quarta-feira, 28 de outubro de 2009

Do desencontro entre universidade e indústria - parte 2 - o mundo real

Continuando o post de ontem, hoje vou falar sobre outra queixa frequente da indústria de software sobre o ensino de computação nas universidades: o fato dos alunos não adquirirem habilidades que são importantes no "mundo real." Veja as queixas do Joel:
Where are students supposed to learn about version control, bug tracking, working on teams, scheduling, estimating, debugging, usability testing, and documentation? Where do they learn to write a program longer than 20 lines?
Dá pra resumir em uma frase: "os alunos não aprendem a desenvolver sistemas de médio/grande porte."

É claro que não. Só há uma forma de aprender a se trabalhar em uma equipe que faz um sistema de grande porte - trabalhando. Trabalhando durante meses e meses a fio. Se envolvendo com requisitos, projeto, repositórios de controle de versões, rastreamento de bugs, deadlines, milestones e tudo mais. Um professor pode até falar a respeito dessas coisas para introduzir o vocabulário, mas não haverá fixação sem a prática.

E por que não fazer isso na sala de aula? Por que não dedicar o último semestre de um curso de quatro anos inteiramente a um grande projeto realizado por todos os alunos em uma grande equipe? Os professores seriam os clientes e gerentes. Creio que com uns oito professores trabalhando juntos, conseguiríamos tocar uma equipe de 40 desenvolvedores inexperientes. Por que não fazer isso? Não parece uma boa idéia?

Primeiro problema: avaliação individual.

O objetivo de uma universidade não é só ensinar. É também entregar atestados chamados "diplomas" que atestam a quem interessar possa que o indivíduo que o carrega tem certas competências. É por isso que até hoje fazemos provas escritas quando todo mundo está careca de saber que essa é uma das piores formas de se avaliar competências - ainda não encontramos forma melhor que funcione quando temos mais de 5 alunos por professor.

Mesmo que cada um dos oito professores use o tempo que lhes sobra depois de gerenciar a equipe (se é que vai sobrar algum) para avaliar os alunos em algum quesito como qualidade do código, uso do repositório, produtividade, adesão à especificação, etc., etc., continua dificílimo avaliar cada aluno individualmente. As tarefas que cada um fará nunca serão homogêneas ou equivalentes, mas os alunos tem de ser avaliados segundo os mesmos critérios.


Segundo problema: qual projeto?

Coloque-se por um instante no lugar de um dos professores que está planejando esse lindo curso de um semestre. Antes do semestre começar, você e seus colegas tem de resolver as seguintes questões:
  1. Especificar detalhadamente um sistema que possa ser desenvolvido por 40 pessoas trabalhando 20 horas por semana durante 4 meses. Não erre suas estimativas nem pra mais, pois os alunos não podem ficar ociosos no final do semestre, nem pra menos, pois os alunos devem ser capazes de concluir o projeto para ficarem motivados.
  2. Preparar um laboratório com o ambiente de desenvolvimento, instalando e configurando todas ferramentas de controle de versões, acompanhamento de bugs, IDEs de desenvolvimento e tudo mais.
  3. Elaborar cronogramas detalhados com entregas bem definidas distribuidas por todo o semestre.
  4. Definir os critérios de avaliação e dividir as tarefas de gerência entre os professores participantes.
Lembre-se que no semestre seguinte você terá de fazer tudo de novo, pois não quer que os alunos copiem o trabalho dos alunos dos semestres anteriores.


Terceiro problema: caos

Um projeto de 40 pessoas é caótico, não adianta querer que seja diferente. É preciso lidar com problemas pessoais, atrasos de umas equipes que prejudicam outras, problemas no ambiente de desenvolvimento, conflitos interpessoais e dezenas de outras coisas que acontecem no mundo real. Só que um curso universitário precisa de ordem e previsibilidade, caso contrário nada funciona.

Imagine os professores se reunindo para avaliar os alunos ao final do projeto:

Prof. Feliz: "Ufa! Não saiu nada como planejamos mas foi ótimo porque os alunos entenderam como funciona o mundo real. Mas que nota vamos dar pro Zé? Ele não fez nada."
Prof. Chato: "Ele não fez nada porque o João atrasou a entrega e ele teve de esperar. Não podemos penalizá-lo por isso."
Prof. Feliz: "Então que nota vamos dar pro João por ter atrasado?"
Prof. Chato: "Tem de ser altíssima apesar do atraso, só não atrasou mais porque o João carregou a equipe dele nas costas depois que a Vó da Elaine ficou doente. Ele é o melhor de todos."
Prof. Feliz: "Mas ninguém gosta dele! Ele quer fazer tudo e tolhe os colegas. Temos de levar isso em conta."

Sentiram? São nuances demais para se transformar em uma nota objetiva entre 0 e 100.

Até daria pra se fazer algo desse tipo em uma universidade, não é impossível. Só que nenhuma universidade que eu conheço tem os recursos necessários para se implementar um projeto desses com sucesso, e nenhum professor recebe o suficiente pra passar pela dor de cabeça que isso vai dar.

Tem ainda outro argumento que eu não usei mas que foi usado em um painel de discussões que assisti a muuuitos anos atrás, em que meu prof. José Nagib respondeu da seguinte forma a um comentário de um representante da indústria, semelhante ao comentário do Joel:
"Nós não sabemos ensinar isso que vocês querem. Vocês é quem tem de ensinar."
Acho que é um bom jeito de encerrar o tópico de hoje.

Amanhã falarei sobre a capacitação dos professores.

5 comentários:

  1. (Continuando meu comentário do post anterior) ... existem empresas diferentes para perfis diferentes. "Fábricas de Software" normalmente contratam programadores que "sabem as tecnologias" que eles precisam no momento. A seleção natural faz o restante do trabalho, ou seja, o cara que melhor aprende novas tecnologias com mais facilidade "vai ficando"; e isso acontece com mais frequência com o cara que tem BASE, i.e. o cara que "aprendeu OO" e não "a programar baseado em ferramentas".

    Empresas como a Google (e muitas outras, sejam grandes ou pequenas), já na entrevista de emprego dizem o tipo de gente com quem quer trabalhar: gente que além da técnica tem a BASE e se possível, as idéias... Perguntas sobre estruturas de dados e análise de algoritmos são recorrentes.

    Já com relação ao COMO... particularmente vejo o mundo do Open Source como uma rica fonte de possibilidades. Estou começando a bolar formas de fazer com que meus alunos, a partir da metade do curso de SI, não programem mais brinquedinhos para jogar fora depois, mas sim, que se engajem em um projeto de código aberto, escolham um caso de uso e o desenvolva. O professor no caso, vai ter o trabalho de pesquisar por alguns projetos mais receptivos, com um funcionamento mais "engenhoso" (que usa engenharia de software =D ), etc. Desta forma, o próprio projeto pode ser reutilizado. Ganha a comunidade, ganha o aluno por poder colocar no currículo, ganha o mercado por ter profissionais com experiências mais reais.

    Pra fechar meu comentário (quase post - desculpem) gostaria de lembrar que este período onde o aluno desenvolve conhecimentos mais práticos já existe no final do curso, e chama-se estágio supervisionado. Falta talvez um pouco mais de cultura (e empenho) para a realização de estágios mais realistas... E como coordenador de curso, sei bem o que é um aluno chegar querendo fazer gambiarras/jeitinhos na hora do estágio, e como é difícil muitas vezes mostrar a ele a importância de fazer a coisa o mais certo possível!

    ResponderExcluir
  2. Difícil é, mas tem gente fazendo e em ambiente globalmente distribuído:

    http://se.inf.ethz.ch/teaching/2008-H/dose

    Esse curso é, inclusive, aberto para qualquer universidade que tenha interesse em partcipar.

    ResponderExcluir
  3. @Nigini, interessante sua idéia de montar trabalhos baseados em projetos open source. Se você implementar, me conte como foi a experiência.

    ResponderExcluir
  4. @Lile, não conhecia esse curso do Bertrand Meyer, parece muito interessante. Vou ler com mais cuidado depois.

    ResponderExcluir
  5. "Preparar um laboratório com o ambiente de desenvolvimento..."

    hoje existem softwares livres que facilitam bastante isso... sites como sourceforge.net ou google code também ajudam... não vejo isso como problema. o problema é fazer a primeira vez, depois fica fácil.

    Colaboração em projetos de software livre seria bastante viável pra esse "estágio" dos alunos. O google summer of code é basicamente isso.

    Um problema seria o tempo gasto por cada aluno pra se ambientar no código do software, porém de repente desenvolver um plugin inovador pra algum software seria viável.

    Acho que, se o aluno necessita do estágio pra se formar, ele vai ter obrigação de se comprometer. Se ele discumpre o primeiro prazo, outro assume a tarefa e bota pra frente... Pior do que estão atualmente os cursos, é difícil de ficar...

    ResponderExcluir