O Novo Curso de Introdução à Ciência da Computação

Quadro Atual

Os primeiros usos de computadores em áreas de engenharia eram voltados quase exclusivamente para solução numérica de modelos matemáticos. Para este objetivo, a escolha natural para uma linguagem de programação era (e talvez ainda seja) FORTRAN. Vem dessa época o formato das disciplinas de informática ainda adotado pela maioria dos cursos de engenharia no Brasil: uma disciplina sobre princípios de programação FORTRAN, seguida por uma disciplina de métodos numéricos. Esse modelo, iniciado no Brasil pela PUC há mais de trinta anos, tinha objetivos bastante claros: capacitar o engenheiro a desenvolver programas para solução de problemas numéricos simples, e entender os princípios de funcionamento de programas numéricos mais complexos.

É desnecessário comentar o quanto a computação e seu uso em áreas técnicas evoluíram nesses trinta anos. O computador permeia um número cada vez maior de atividades, e um engenheiro típico faz uso de computadores nos mais variados domínios de aplicação, como programas de CAD, planilhas, programas de simulação, etc. Mesmo na área de problemas numéricos, a diversidade e complexidade dos algoritmos e programas usados cresceu enormemente nesses trinta anos.

Dentro deste quadro, várias instituições, como a própria PUC, tentaram nos últimos anos uma modernização de suas disciplinas introdutórias de informática, através de uma mudança de linguagem, de FORTRAN para Pascal ou C. Embutida nessa mudança explícita de linguagem estava uma mudança implícita de objetivos, que infelizmente não foi bem compreendida. Como dito, o ensino antigo visava a construção de algoritmos numéricos simples; para isso, era suficiente um estilo de programação com fluxogramas. Por exemplo, o conceito de subrotinas, um dos conceitos mais importantes de programação, era tipicamente apresentado somente no final do curso, com pouca ênfase. Outros conceitos, como recursão e estruturas dinâmicas, não eram nem mencionados. Entretanto, fora de domínios muito específicos, como alguns algoritmos numéricos, esses conceitos se tornaram fundamentais. Na mudança para linguagens mais modernas, manteve-se o mesmo método de ensino. Assim, o aluno normal termina um curso introdutório de programação com um conhecimento superficial de uma linguagem específica, tipicamente C ou Pascal, mas com muito poucos fundamentos para a construção de programas.

Outros cursos tem optado, nas suas cadeiras de introdução de informática, pela apresentação de diferentes aplicativos que um profissional irá precisar na sua carreira, como editores de texto, planilhas, etc. Esse modelo apresenta várias falhas. Em primeiro lugar, esse conhecimento é altamente pontual e volátil, devido à diversidade de aplicativos e velocidade de mudança. Em segundo lugar, um aluno bem formado, com motivação, pode (e deve ser capaz de) aprender a usar tais aplicativos com um pouco de estudo individual. Além disso, existe uma informatização crescente dos diversos cursos e disciplinas da Universidade. Com isso, diferentes aplicativos passam a ser apresentados ao aluno não como uma matéria a parte, mas como parte integrante das disciplinas que os utilizam. Assim, por exemplo, utilitários como sistemas de CAD podem ser introduzidos em disciplinas de desenho técnico, planilhas em disciplinas de gerência/administração, etc.

Um Novo Enfoque

Computação não se restringe ao uso do computador e seus utilitários, mas envolve vários outros aspectos, em particular programação. O aprendizado de programação não objetiva apenas ensinar o aluno a escrever seus próprios programas em alguma linguagem específica. Programar é muito mais do que conhecer uma linguagem, é criar uma disciplina intelectual. O exercício da programação é uma excelente introdução ao raciocínio formal, na medida em que o aluno é obrigado a usar uma linguagem formal (linguagem de programação), e dispõe de um exigente sistema de verificação (o computador). Programar obriga o aluno a pensar de forma sistemática, e desenvolve conceitos básicos, em particular os de abstração, estruturação, e recursão/iteração. Além disso, programação oferece ao aluno uma forma de implementar e testar seu raciocínio, estabelecendo uma forte ligação entre teoria e prática.

Por isso, estamos adotando uma mudança fundamental de enfoque nas disciplinas básicas de informática, de um caráter utilitarista para um caráter formativo. Aspectos particulares de uma determinada linguagem, como sintaxe, são rapidamente esquecidos, mas podem ser rapidamente (re)aprendidos com uma consulta a um manual. Por outro lado, conceitos como recursão dificilmente são aprendidos sem uma formação adequada; mas uma vez aprendidos, dão ao aluno uma base que lhe será fundamental no aprendizado correto de qualquer linguagem ou aplicativo, além de dar ao aluno uma visão mais construtiva e sistemática, útil em diversas áreas tecnológicas.

O presente curso, ICC, tem como objetivo principal ensinar o aluno os conceitos de abstração, estruturação, e recursão, e capacitá-lo a usar esses conceitos na construção de pequenos programas. A ênfase em conceitos não implica em um curso menos prático, muito pelo contrário. Conceitos como abstração só são aprendidos através da experiência. Além disso, a importância do aspecto formal e matemático da programação é bastante diluida quando não existe uma experiência real de programação, em uma linguagem real. Por isso, estamos adotando a linguagem Scheme/Lisp no curso, e um uso intensivo de aulas de laboratório. Nessas aulas de laboratório os alunos desenvolvem mini-projetos dirigidos, sob supervisão do professor. É importante frisar que as aulas de laboratório não são um complemento das aulas em quadro-negro, mas uma parte central da disciplina, muitas vezes abordando tópicos não discutidos anteriormente.

Que Linguagem Utilizar?

Dificilmente um engenheiro se restringe a uma única linguagem na sua interação com o computador. Cada aplicativo apresenta uma linguagem própria, cujo domínio é fundamental para seu uso mais avançado (linguagem de fórmulas em planilhas, linguagem de macros em editores de texto, etc). Além disso, a rápida evolução das linguagens de programação pode tornar obsoleta uma linguagem aprendida em cursos introdutórios antes da formatura do aluno. Por tudo isso, a escolha de uma linguagem introdutória deve levar em conta muito mais o quanto ela facilita o aprendizado e a aplicação de conceitos e estruturas básicas de programação do que o seu uso no mercado.

Por isso, estamos adotando Lisp/Scheme neste curso (Lisp designa uma familia de linguagens, por não ter sofrido padronização. Scheme é um dialeto específico de Lisp). Scheme é uma linguagem baseada em poucos conceitos importantes, que enfatiza economia e simplicidade. Sua sintaxe é trivial, e o núcleo da linguagem é facilmente aprendido pelos alunos em menos de um mês. Com isso, o curso pode rapidamente passar para aspectos essenciais, ao invés de se perder em detalhes e idiossincrasias da linguagem. Com um mesmo tempo de aprendizado, um aluno usando Scheme constrói programas bem mais complexos que usando Pascal ou C.

Outra vantagem de Scheme é seu caráter interativo. Ao contrário de linguagens como FORTRAN, Pascal ou C, em que o usuário primeiro escreve um programa, depois o compila e finalmente o executa, o ambiente de Scheme permite um constante diálogo entre o programador e o computador. Com isso, o aluno tem condições de "colocar a mão na massa" desde a primeira aula.

É importante também frisar que o uso de Scheme em ICC não é nenhuma idéia isolada; mais de 90 universidades no mundo inteiro usam Scheme em seus cursos introdutórios, incluindo instituições como MIT, Cornell, Princeton, UCB, UCLA e Yale.

Objeções Usuais

Muitas pessoas, ao se depararem com essa proposta, levantam diversas objeções a esse tipo de curso. Aqui abordamos as objeções mais usuais.

Uma primeira objeção refere-se à Iniciação Científica. Muitos trabalhos de IC atualmente envolvem programação em linguagens convencionais, e vários professores argumentam que, sem aprender isso em ICC, esses alunos não poderiam fazer IC durante boa parte do Ciclo Básico. Mas é importante lembrarmos que não estamos formando um Engenheiro para ele fazer IC no segundo semestre; isso é enfatizar o aspecto de ``adestramento'' em detrimento da formação. Além disso, a grande maioria dos alunos atualmente não está apta a programar após o curso de ICC. Quando postos para desenvolver projetos sem uma orientação adequada em programação, acabam por adquirir uma formação altamente fragmentada, e em geral não conseguem estruturar esse conhecimento, mesmo posteriormente. Infelizmente, é bastante comum encontrarmos alunos de Engenharia com anos de experiência de programação, mas incapazes de estruturar um programa de forma adequada.

Outra objeção comum é que Lisp é uma linguagem que ninguém usa (esse fato na realidade é falso. Grande parte da comunidade de Inteligência Artificial, por exemplo, programa em Lisp). Mas, como já discutido anteriormente, é impossível ensinar ao aluno todas as linguagens que ele irá usar. Pegando só a Iniciação Científica como exemplo, nos diversos grupos do CTC temos trabalhos sendo feitos em C, C++, Pascal, Fortran, Visual-Basic, Delphi, Java, etc. Novas linguagens ainda irão surgir antes da formatura do aluno. Não custa repetir que, mais importante que ensinar ao aluno uma linguagem específica, é capacitá-lo a aprender novas linguagens.