É 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.
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.
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.
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.