Depois de assistir a palestra do Tenderlove no RubyConfBR (e ficar impressionado porque estava estudando EXATAMENTE os assuntos de Automatos há pouco tempo atrás), vi uns tweets sobre graduação. Na verdade, foi principalmente o tweet do @dannluciano que trouxe uma série de respostas de outros tweets que eu concordo até certo ponto, e discordo de muitos outros pontos.

Proponho uma pergunta: qual é a idéia da graduação, nos tempos como hoje? Explicando, em tempos de Wikipedia, de Google, aonde entra uma graduação? Acho que aqui, temos que separar duas coisas: Faculdade, Universidade, e Colegial Técnico.

Pra maior parte das pessoas (e infelizmente, para nosso país e o mercado de trabalho e governo dele), a graduação é um “upgrade” da formação média, e o “colegial técnico” fica meio perdido nesse meio do caminho… além disso, muitos professores (e infelizmente eu conheço isso, tendo trabalhado numa universidade federal) ainda acham, nos dias da Wikipedia, que são donos do conhecimento, e ninguém chega ao conhecimento sem o intermédio deles.

Os que me acompanham no Twitter devem ter visto que eu prestei o Poscomp. Num dos livros que peguei, havia a seguinte frase:

Função injetora é aquela que, para dois elementos distintos a, a’ ∈ A, f(a) ≠ f(a’)

Uhn… então, eu resolvi ir para a Wikipedia:

Uma função diz-se injectiva (ou injetora) se e somente se quaisquer que sejam x1 e x2 pertencentes ao domínio da função, se x1 é diferente de x2 implica que f(x1) é diferente de f(x2)

Há um “Link” para “domínio”, e há um gráfico mostrando graficamente essa explicação. Não precisa ser um gênio para entender que a explicação da Wikipedia está mais simples e melhor explicada e exemplificada. Ok. Mas, e isso é importante notar, eu não chegaria ao artigo da Wikipedia sem o livro, sem o poscomp, e não teria entendido a palestra do Tenderlove sem ter estudado para o Poscomp (ainda que eu tenha usado os livros como “grandes índices” e a Wikipedia como forma de aprender, propriamente dita).

Continuando: o que é a graduação? Antes disso, vamos pensar na etimologia: universidade, vem de “Universo”, ou seja, você tem um universo de informações à sua disposição. Universidade não deveria ser um “level-up” da faculdade, onde ela adquire determinado número de alunos e cursos e, de repente, é uma universidade. Algo que eu sempre digo, pintar uma casa abandonada de verde não vai melhorar a estrutura dela, ou a localização, ou a segurança-ela continua sendo uma casa abandonada, porém agora está pintada de verde…

Vamos pensar no seguinte assunto (coisas q eu não vi na minha “universidade”, mas enfim): Automatos, Linguagens, Linguagens Regulares, e até mesmo complexidade de algoritmos. Tenderlove falou sobre o assunto e mostrou como aplicar esses conceitos na hora de criar uma nova forma de identificar rotas no Rails 3.2. Interessante, porém mesmo quem já viu automatos, linguagens regulares, etc. nas faculdades provavelmente não sabia aonde aplicar esses conceitos. Mas estou saindo do assunto de novo, então voltando: todos esses conceitos são, sim, importantes de ver numa universidade, e até mesmo numa faculdade, porém (e esse porém é bem grande) na maioria das vezes um desenvolvedor de sistemas NÃO PRECISA saber estes conceitos, a não ser que você vá criar um framework super famoso usado por milhares ou até milhões de pessoas como o… Rails, por exemplo…

O problema, não é a graduação, mas a necessidade dela para conseguir empregos melhores (ou até para conseguir empregos, simplesmente), e o que se ensina nela sem aplicação. Conheço aos montes pessoas que sabem o que são linguagens regulares mas não conhecem expressões regulares, que sabem o que são AST, Bytecodes, Interpretadores, JIT, e acham que os programas feitos em Java não são interpretados, que Ruby 1.9.2 não tem bytecode (só pq não tem um arquivo, digamos, RBC contendo o bytecode) ou até mesmo que confundem “linguagens dinâmicas e estáticas” com “linguagens interpretadas e compiladas”, respectivamente.

Resultado final: 80% (sem exagero) dos programadores só precisam de um “colegial técnico”, ou nem isso. Para um programador acima da média, ele aprenderia MUITO mais rápido (e poderia ser um programador pleno ao invés de júnior ou estagiário) conceitos interessantes numa faculdade DESDE QUE a faculdade se importasse em ensinar coisas importantes, como SOLID, boas-práticas, TDD (no nosso cenário atual, só teste automatizado já estaria bom), programação funcional (de um jeito decente, não essas “brincadeiras acadêmicas de calcular fatorial recursivamente”), enfim, outros conceitos que se usam em 80% do mercado de trabalho. O colegial técnico, nessa história, serviria para o profissional saber programar, única e exclusivamente. Esses dois lugares PRECISAM ENTENDER que não são mais detentores exclusivos do conhecimento, então eles devem atuar como facilitadores no acesso à informação. A idéia aqui é: se eu posso procurar algo na Wikipedia, porque eu não o faria? Então, o colegial e a faculdade precisariam me apontar nessa direção, me ensinar o básico ou o intermediário, e não acharem que só porque há um professor formado me ensinando eu não vou ter conhecimentos fora o que me ensinam. Ao mesmo tempo, o trabalho dessas duas instituições seria também acabar com os vícios que muitos programadores tem (ok, isso é quase uma piada, já que na faculdade e no colegial técnico normalmente é o lugar aonde se adquirem mais vícios, mas isso teria que ser repensado também).

A universidade fica como o lugar aonde se ensinaria, verdadeiramente, conceitos que fariam o profissional conhecer estruturas de dados complexas (eu não estou falando de pilhas e filas, isso os profissionais realmente empenhados aprendem sozinhos porque são estruturas simples) e saber como aplicá-las na solução de problemas e ainda digo mais: quanto MAIS comum for o problema que for possível ser resolvido com uma estrutura dessas, melhor. Se eu sei resolver um problema simples com automatos, é MUITO mais fácil eu aprender aonde aplicar em problemas complexos. Ao mesmo tempo, precisamos acabar com as “Javaschools”. Precisamos, nessas universidades, parar de pensar em resolver todo e qualquer problema com apenas Java ou C++. Automatos, Árvores B, não são fáceis de implementar. Pseudocódigo não significa NADA, porque não roda. Podemos escrever o código em Ruby, ou Python, ou outra linguagem SIMPLES, porque o intuito do trabalho é ensinar a ESTRUTURA DE DADOS e APLICÁ-LA na resolução de um problema (se possível, mostrando quão melhor é o desempenho dessas estruturas ao invés de usar os algoritmos comuns), e não ficar brigando pra fazer a implementação de algo que o aluno já sabe, conceitualmente, porque a linguagem escolhida não é declarativa o suficiente.

Mas, como isso infelizmente é ilusório demais, prefiro continuar brigando e batendo cabeça ao afirmar que uma graduação, da forma como é feita hoje, não é necessária para um bom profissional. Se existissem livros mostrando aplicações de estruturas de dados, eu até afirmaria que ler esses diversos livros é importante. Porém, da forma como se ensina hoje ciência da computação, não vejo nem a presença nem a ausência da graduação como qualquer fator se o profissional é bom ou não.


2 Comments

Kássio Borges de Melo · 2011-11-05 at 13:52

Só para complementar.. para quem não assistiu a palestra e ficou meio perdido, taí o link do fenômeno do Tanderlove.. http://goo.gl/dP89I

dannluciano · 2011-11-05 at 23:56

Mauricio concordo e muito com você. So que quando mais discuto isso, mas percebo que o problema não é a Universidades ou a Graduação em si. Por exemplo você deve ter tido o azar de não ter cursado um bom curso e muita gente também tem o mesmo problema.
Mas no meu caso é um pouco diferente. Apesar da minha faculdade ser particular, eu acredito que fiz um curso muito superior do que muitos que existem no Brasil e no mundo. Por exemplo quando paguei compiladores, tive que implementar uma linguagem de verdade que era uma hibridização entre procedural e funcional. Eu ficava louco tentando entender para que servia um tal de “let” e hoje em dia quando programo algo em emacs-lisp percebo o quanto esta disciplina me enriqueceu de conhecimento, o quanto fez com que eu entendesse as coisas o debaixo dos panos.
Outro exemplo a minha profa(preferida) de Programação I, II, Estrutura de Dados, Pesquisa e Ordenação, e Banco de Dados, simplesmente me ensinou a criar estruturas de dados que simplesmente são idênticas as utilizadas hoje no redis. Não sei se ela, conhecia o projeto ou se o próprio redis existia na época (2006-2007), mas hoje vejo muita gente de boca aberta com o que o redis faz, pensando que é magica pois poucos entendem o que ele faz, e para mim ele simplesmente é um exemplo do quanto, complexidade de algoritmos estruturas de dados, e teoria da computação são essenciais na vida de qualquer programador, mesmo que você nunca vá criar algo “grande”. Essa mesma professora foi uma das que mais me incentivou a estudar Ruby e aprender como OO era de verdade.

A minha formação não foi perfeita, tive péssimos professores, já menti muito para justificar trabalhos incompletos, xinguei muito professores. Mas para mim, cada centavo do meu curso me ajudou e me ajudam ate hoje. Não que eu não poderia ter aprendido sozinho, mas a equipe, professores, coordenação, etc, me mostraram o caminho que eu deveria seguir. Acredito que se não fossem pro eles eu talvez nunca teria nem esbarrado nestes assuntos.

Na minha opinião o papel de um professor não é “Ensinar” e sim facilitar o “Aprendizado” de seus alunos.

Então acredito que o problema das graduação sejam na qualidade de instituições e professores. E mesmo assim não acho elas desnecessárias.

Perceba que desde o rails1 que o sistema de rotas já poderia ter sido implementado da forma apresentada pelo @tenderlove. Mas simplesmente por falta de conhecimento/prioridade do time, isso passou despercebido e somente na nova versão será “melhorado”. Eu mesmo nunca tinha pensando nisto, para mim o sistema de rota estava bom e estável.

Leave a Reply

Your email address will not be published. Required fields are marked *