domingo, 1 de julho de 2012
Sobre a crueldade de ensinar realmente a ciência da computação
Sobre a crueldade de ensinar realmente a ciência da computação
Edsger Wybe Dijkstra
Tradução: Professor João Carlos de A. R. de Oliveira – DCC/UFJF
A segunda parte dessa palestra persegue algumas das consequências científicas e educacionais da suposição de que os computadores representam uma novidade radical. Para dar a essa suposição um conteúdo claro, nós devemos ser muito mais precisos em relação ao que queremos dizer, nesse contexto, com o adjetivo "radical". Faremos isso na primeira parte dessa palestra, onde também forneceremos a evidência para suportar a nossa suposição.
O modo usual no qual hoje planejamos o amanhã é no vocabulário de ontem. Assim fazemos porque tentamos usar os conceitos que nos são familiares e que adquiriram seus significados em nossa experiência passada. Obviamente, as palavras e os conceitos não se ajustam perfeitamente porque nosso futuro difere do nosso passado, mas então nós esticamos um pouco. Os lingüistas estão bastante familiarizados com o fenômeno de que o significado das palavras evolui no tempo, mas também sabem que isso é um processo lento e gradual.
É o modo mais comum de tentar enfrentar a novidade: por meio de metáforas e analogias, tentamos ligar o novo ao velho, a novidade ao familiar. Sob mudanças suficientemente lentas e graduais, isso funciona razoavelmente bem; no caso de uma descontinuidade repentina, contudo, o método se quebra: embora possamos glorificá-la com o nome "senso comum", nossa experiência passada não é mais relevante, as analogias se tornam pobres e as metáforas enganam mais que iluminam. Esta é a situação característica da novidade "radical".
Enfrentar a novidade radical requer um método ortogonal. É preciso considerar o passado, as experiências coletadas e os hábitos formados como um infeliz acidente da história, e abordar a novidade radical com a mente em branco, conscientemente se recusando a tentar ligá-la ao que já é familiar, uma vez que o familiar é irremediavelmente inadequado. É preciso inicialmente, com uma espécie de personalidade dividida, se inteirar da novidade radical como um tópico dissociado. Inteirar-se de uma novidade radical é como criar e aprender uma língua estrangeira que não pode ser traduzida para a língua natal. (Quem já aprendeu mecânica quântica sabe o que estou dizendo.) É desnecessário afirmar que o ajuste às novidades radicais não é atividade popular, porque ele requer trabalho árduo. Pela mesma razão, as próprias novidades radicais não são bem-vindas.
Nesse momento você deve estar se perguntando porque eu dediquei tanta atenção e gastei tanta eloqüência à simples e óbvia noção da novidade radical. Minha justificativa é muito simples: as novidades radicais são tão perturbadoras, que elas tendem a ser suprimidas ou ignoradas, a ponto de mesmo a possibilidade de sua existência em geral ser mais freqüentemente negada que admitida.
Quanto à evidência histórica, devo ser breve. Carl Friedrich Gauss, o Príncipe da Matemática, mas também um tanto covarde, certamente conhecia o destino de Galileu - e provavelmente poderia ter previsto a calúnia contra Einstein - quando decidiu suprimir a descoberta da geometria não-Euclidiana, deixando assim para Bolyai e Lobatchewsky receberem o bombardeio. Provavelmente é iluminador voltar um pouco mais até a Idade Média. Uma de suas características era que o "raciocínio por analogias" era peremptório; outra característica era a quase total estagnação intelectual, e agora vemos porque as duas andam juntas. Uma razão para mencionar isso é assinalar que ao se desenvolver uma audição apurada para as analogias descabidas é possível detectar muito pensamento medieval atualmente.
O outro ponto que não me canso de frisar é que a fração da população para a qual a mudança gradual parece ser o único paradigma da história é muito grande, provavelmente muito maior do que você possa esperar. De fato, quando comecei a observar isso, seu número se mostrou muito maior do que eu imaginava.
Por exemplo, a vasta maioria da comunidade matemática nunca questionou a sua suposição tácita de que praticar matemática continuará sendo o mesmo tipo de atividade mental que sempre foi: novos tópicos aparecem, florescem e se vão como no passado, mas, sendo o cérebro humano o que é, nossos modos de ensinar, aprender e entender matemática, de resolver problemas e de descobrir novas áreas da matemática continuarão praticamente os mesmos. Herbert Robbins declara francamente porque ele descarta a possibilidade de um salto quântico na habilidade matemática:
"Ninguém consegue correr 100 metros em cinco segundos, não importando o quanto foi investido em treinamento e maquinário. O mesmo pode ser dito sobre o uso do cérebro. O cérebro humano hoje não é diferente do que foi a cinco mil anos atrás. E quando ele se dedica à matemática, você deve compreender que aí a mente humana está no limite máximo de sua capacidade." Meu comentário na margem foi: "então, reduza o uso do cérebro e calcule !". Usando a analogia de Robbins, pode-se constatar que, para ir de A até B rapidamente, hoje existem alternativas que são ordens de magnitude mais efetivas. Robbins com certeza se nega a reconhecer qualquer alternativa ao uso tradicional do cérebro com a expressão "praticar matemática", assim exorciza o perigo da novidade radical com o simples dispositivo de ajustar suas definições às suas necessidades: simplesmente, por definição, a matemática continuará sendo o que sempre foi. Demais para os matemáticos.
Deixe-me dar apenas mais um exemplo do descrédito generalizado a respeito da existência das novidades radicais e, por isso, a necessidade de aprender como enfrentá-las. É a prática educacional predominante, onde a mudança gradual, quase imperceptível, parece ser o único paradigma. Quantos textos educativos não são recomendados por seus apelos à intuição dos estudantes ! Tenta-se constantemente apresentar tudo que poderia ser novidade excitante como algo tão familiar quanto possível. Conscientemente, tenta-se ligar o material novo ao suposto mundo familiar do estudante. Isso já começa no ensino da aritmética. Ao invés de se ensinar que 2 + 3 = 5, o repugnante operador aritmético "mais" é cuidadosamente disfarçado, sendo chamado "e", são dados aos garotos primeiramente um monte de exemplos familiares, com objetos claramente visíveis, tais como pêras e maçãs que são dentro em contraste aos objetos igualmente enumeráveis tais como porcentagens e elétrons, que são fora. A mesma tradição deplorável se reflete no nível universitário em diferentes cursos introdutórios de cálculo, para o futuro físico, arquiteto ou administrador, cada qual adornado com exemplos de seus respectivos campos. O dogma educacional parece ser que tudo vai bem desde que o estudante não perceba que está aprendendo alguma coisa realmente nova; com freqüência, a impressão do estudante é de fato correta. Considero a falha de uma prática educacional na preparação da futura geração para o fenômeno das novidades radicais um sério defeito. (Quando o Rei Fernando visitou a universidade conservadora de Cervera, o reitor assegurou orgulhosamente ao monarca: "Longe de nós, Senhor, a perigosa novidade do pensar". Os problemas da Espanha, no século seguinte, justificam a minha caracterização do defeito como "sério".) Demais para a adoção na educação do paradigma da mudança gradual.
O conceito das novidades radicais é relevante atualmente porque, embora estejamos mal preparados para enfrentá-las, a ciência e a tecnologia têm se mostrado especialistas em nos infligi-las. Exemplos mais antigos são a teoria da relatividade e a mecânica quântica; exemplos tecnológicos mais recentes são a bomba atômica e a pílula. Durante décadas os dois primeiros deram origem a uma torrente de panfletos religiosos, filosóficos ou quase-científicos. Podemos observar diariamente a maneira profundamente inadequada de se abordar as últimas duas, seja por líderes governamentais ou religiosos, seja pelo público em geral. Demais para os danos causados à paz de nossas mentes pelas novidades radicais.
Eu levantei tudo isso porque acredito que os computadores automáticos representam uma novidade radical e que somente identificando-os como tal, podemos constatar a tolice, a falsa noção e a mitologia que os cerca. Uma inspeção cuidadosa revelará que a situação é até pior, os computadores automáticos incorporam não apenas uma novidade radical, mas duas delas.
A primeira novidade radical é uma conseqüência direta da potência dos equipamentos computacionais atuais. Nós todos sabemos como enfrentar algo grande e complexo: dividir e reinar, isto é: nós vemos o todo como uma composição de partes e lidamos com cada parte separadamente. E se a parte é muito grande, nós repetimos o procedimento. A cidade é composta de quarteirões, que são estruturados em ruas, que contém prédios, que são feitos de paredes e pisos, estes de tijolos, etc., chegando eventualmente até as partículas elementares. E nós temos nossos especialistas ao longo do percurso, desde o planejador urbano, passando pelo arquiteto até o físico de estado sólido e além. Uma vez que, em certo sentido o "todo" é maior que as suas partes, a profundidade da decomposição hierárquica é algo como o logaritmo da razão dos "tamanhos" do todo e da menor parte. De um bit para algumas centenas de megabytes, de um microssegundo para meia hora de computação, tudo isso nos mostra a fantástica razão de dez elevado a nove ! O programador fica em destaque, pois é a única disciplina e profissão na qual essas razões gigantescas que confundem totalmente a nossa imaginação, têm de ser vencidas com uma única tecnologia. Ele deve estar habilitado a pensar em termos de hierarquias conceituais muito mais profundas, que mente alguma jamais precisou encarar. Comparando o número de níveis semânticos, uma teoria matemática é praticamente plana. Por necessitar hierarquias conceituais profundas, o computador nos apresenta um desafio intelectual radicalmente novo, sem precedente na história.
Outra vez tenho de reforçar essa novidade radical porque o verdadeiro crente nas mudanças graduais e nos aperfeiçoamentos incrementais não consegue vê-la. Para ele, o computador é algo como a familiar caixa registradora, apenas um pouco maior, mais rápido e mais flexível. Mas a analogia é ridiculamente pobre: é ordens de magnitude pior que comparar a velocidade de um jato supersônico com a de um bebê engatinhando, já que a razão de velocidades é apenas mil.
A segunda novidade radical é que o computador automático é o nosso primeiro dispositivo digital em larga escala. Nós tínhamos alguns poucos com componentes perceptivelmente discretos. Eu mencionei a caixa registradora e posso acrescentar as máquinas de escrever e os teclados com suas teclas individuais: com um único pressionamento, você pode produzir um Q ou um W mas, embora suas teclas estejam perto uma da outra, não produzirá uma mistura dessas duas letras. Mas tais mecanismos são a exceção e a grande maioria de nossos mecanismos é vista como dispositivos analógicos cujo comportamento é uma função contínua de todos os parâmetros envolvidos em grande parte de seu domínio: se pressionarmos a ponta do lápis mais fortemente, obteremos uma linha um pouco mais grossa; se o violinista desloca seu dedo, ele tocará ligeiramente desafinado. A isso devo acrescentar que, se nos considerarmos como mecanismos, nossa natureza é primordialmente analógica: se nos esforçarmos um pouco mais, esperamos ser um pouco melhores. Muito freqüentemente, o comportamento é mais que uma função contínua, é uma função monótona: para testar se um martelo é adequado a um conjunto de pregos, experimentamos com o menor e o maior prego e se o resultado dos dois experimentos for positivo, poderemos acreditar cegamente que o martelo nos atenderá em todos os outros casos.
É possível e mesmo tentador considerar um programa como um mecanismo abstrato, como um dispositivo de um certo tipo. Fazer isso, contudo, é altamente perigoso: a analogia é muito pobre porque um programa é, como mecanismo, totalmente diferente de todos os dispositivos analógicos que nos são familiares desde a infância. Como acontece com toda informação codificada digitalmente, ele possui inevitavelmente a desconfortável propriedade que as menores perturbações possíveis, - isto é, mudanças de um único bit - podem ter as conseqüências mais drásticas. (Para completar, acrescento que o quadro não muda essencialmente com a introdução de redundância ou correção de erros.) No mundo discreto da computação, não existe métrica significativa na qual "pequenas" mudanças e "pequenos" efeitos andam juntos, e não existirá jamais.
Essa segunda novidade radical compartilha o destino usual de todas novidades radicais: ela é negada, porque a verdade seria muito desconfortável. Não tenho idéia de quanto esta negação específica e esse descrédito tem custado aos Estados Unidos, mas um milhão de dólares por dia parece ser um palpite modesto.
Tendo descrito - admito que em termos genéricos - a natureza das novidades computacionais, devo agora prover a evidência de que tais novidades são de fato radicais. Devo fazê-lo explicando alguns fenômenos, que de outra forma seriam considerados estranhos, como os esforços furiosos - mas, que agora sabemos condenados ao fracasso - de esconder ou mesmo negar os aspectos apavorantes do não familiar.
Alguns desses fenômenos são encontrados na "Engenharia de Software". Da mesma forma que a economia é considerada como a "Ciência miserável", a engenharia de software deveria ser conhecida como a "Ciência condenada", condenada porque ela sequer atinge seu objetivo, uma vez que este é contraditório. A engenharia de software, obviamente, se apresenta como uma causa respeitável, mas isso é ilusório: se você ler cuidadosamente a sua literatura e analisar o que seus devotos realmente fazem, você descobrirá que a engenharia de software tem aceitado como seu mote "Como programar, se você não pode".
A popularidade de seu nome é bastante para torná-la suspeita. Nas consideradas "sociedades primitivas", é comum a supertição de que se você conhece alguém por seu nome verdadeiro, você passa a ter um poder mágico sobre ele. E nós também somos um tanto primitivos: Por que persistimos em atender o telefone com o inútil "alô" em vez do nosso nome ? Nem estamos salvos da supertição igualmente primitiva de que podemos exercer um certo controle sobre algum demônio desconhecido e malicioso simplesmente chamando-o com um nome seguro, familiar e inocente como "engenharia". Mas isso é totalmente simbólico, como demonstrado por um fabricante de computadores americano alguns anos atrás, quando contratou da noite para o dia centenas de novos "engenheiros de software" com o simples artifício de elevar todos os seus programadores à nobre categoria. Demais para esse termo.
A prática é mantida pela ilusão assegurada de que programas são dispositivos como quaisquer outros, a única diferença admitida é que a sua produção requer um novo tipo de artesão, o programador. Daí, um pequeno passo para se medir a "produtividade do programador" em termos do número de linhas de código produzidas por mês. Esta é uma unidade de medida muito custosa porque encoraja a escrita de código insípido, mas atualmente estou menos interessado em quão tola uma unidade é, mesmo de um ponto de vista puramente gerencial. Minha sugestão atualmente é que, se desejamos contar linhas de código, nós não devemos considerá-las "linhas produzidas" mas "linhas gastas"; a sabedoria convencional corrente é tão tola a ponto de contabilizá-las nas colunas trocadas.
Juntamente com a noção de produtividade, também a de controle de qualidade continua a ser distorcida pela ilusão assegurada de que se funciona com outros dispositivos funcionará também com programas. Já fazem duas décadas a demonstração de que testar programa pode mostrar convincentemente a presença de erros, mas nunca a sua ausência. No entanto, após citar devotamente essa constatação, o engenheiro de software retorna à sua mesa de trabalho e continua o refinamento de suas estratégias de teste, como o alquimista de outrora, que continuava a refinar suas purificações crisocósmicas. O desentendimento impenetrável aparece mais no termo "manutenção de software"; como resultado, muitas pessoas continuam acreditando que os programas - e mesmo linguagens de programação estão sujeitos a ficarem gastos com o uso. Seu carro necessita manutenção, não é ? Ficou famosa a história de uma companhia de petróleo que pensou que seus programas PASCAL não durariam tanto quanto os seus programas FORTRAN "porque o PASCAL não tinha manutenção".
Ainda no mesmo tema, devo chamar a atenção para a admirável aceitação com que a sugestão é aceita, de que o problema da produção de software decorre grandemente da falta de adequadas "ferramentas de programação". (O termo revelador "workbench" - cadeira de trabalho - rapidamente apareceu.) Novamente, a analogia subjacente é muito pobre, apropriada à Idade Média. Confrontado com as "ferramentas" insípidas de "animação de algoritmos", meu julgamento não foi alterado; ao contrário, confirmei minha suspeita de que lidamos aí com mais uma dimensão do negócio óleo-de-cobra.
Finalmente, para corrigir a possível impressão de que a inabilidade de enfrentar a novidade radical está confinada ao mundo industrial, deixe-me oferecer uma explicação para a popularidade ao menos americana - da Inteligência Artificial. É razoável que o povo se sinta ameaçado pelos "cérebros gigantes ou máquinas que pensam". De fato, o apavorante computador se torna menos apavorante se ele for usado apenas para simular um não-computador familiar. Tenho certeza que essa explicação permanecerá controversa por muito tempo, uma vez que a Inteligência Artificial imitando a mente humana prefere se ver na linha de frente, enquanto a minha explicação a relega para a retaguarda. (Os esforços de usar máquinas para imitar a mente humana sempre me pareceram tolos. Eu as usaria para imitar coisa melhor.)
Demais para a evidência de que as novidades computacionais são de fato radicais. E agora vem a segunda - e mais difícil - parte de minha palestra: as conseqüências científicas e educacionais do exposto acima. As conseqüências educacionais são, é claro, mais cabeludas, assim vamos postergar sua discussão e nos concentrarmos na ciência da computação. O que é computação ? De que trata a ciência da computação ?
Bem, quando tudo já foi dito e feito, a única coisa que os computadores podem fazer para nós é manipular símbolos e produzir resultados de tais manipulações. De nossas observações anteriores, devemos lembrar que isso se passa em um mundo discreto e mais, que tanto o número de símbolos envolvidos quanto a quantidade de manipulação executada é ordens de magnitude maior do que nós podemos imaginar: eles confundem totalmente a nossa imaginação, portanto devemos tentar não imaginá-los.
Porém, antes de um computador estar pronto para realizar uma classe de manipulações significativas - ou cálculos, se você prefere - nós devemos escrever um programa. Que é programa ? Muitas respostas são possíveis. Podemos encarar o programa como sendo aquilo que transforma um computador de propósito geral em um mani- pulador de símbolos de propósito específico e faz isso sem necessidade de mudar um único fio. (Isto foi um aperfeiçoamento enorme em relação às máquinas onde o arranjo das fiações do painel era dependente do programa.) Prefiro descrevê-lo de outro ponto de vista: o programa é um manipulador de símbolos abstrato, que pode se concretizar ao se fornecer um computador para ele. Afinal de contas, os programas não mais são feitos para instruir nossas máquinas; atualmente, o propósito das máquinas é executar nossos programas.
Assim, temos de projetar manipuladores abstratos de símbolos. Todos sabemos como eles se parecem: programas ou - para usar uma terminologia mais geral - fórmulas elaboradas a partir de um sistema formal. Realmente é útil ver um programa como uma fórmula. Primeiramente, isso coloca a tarefa do programador em sua perspectiva adequada: ele tem de deduzir essa fórmula. Em segundo lugar, explica porque o mundo matemático ignora o desafio da programação: os programas são fórmulas tão maiores do que as que eles estão acostumados a ponto de não serem reconhecidas como tais. De volta ao trabalho do programador: ele tem de deduzir essa fórmula, ele tem de deduzir esse programa. Nós conhecemos apenas uma maneira confiável de fazer isso, a saber: por meio de manipulação de símbolos. E agora o círculo se fecha: construímos nossos manipuladores mecânicos de símbolos por meio de manipulações humanas de símbolos.
Assim, a ciência da computação está - e sempre estará - envolvida com a relação entre a manipulação mecânica e humana de símbolos, usualmente referidas como "computação" e "programação", respectivamente. Um benefício imediato dessa percepção é que ela revela a contradição em termos da "programação automática". Outro benefício é que ela nos dá uma indicação clara de onde localizar a ciência da computação no mapa mundial das disciplinas intelectuais: na direção da matemática formal e da lógica aplicada, só que muito mais distante de onde elas estão atualmente, uma vez que a ciência da computação está interessada no uso efetivo dos métodos formais, em escala muito maior do que a verificada até então. Uma vez que nenhum empreendimento é respeitado atualmente sem uma STL ( = Sigla de Três Letras), eu proponho que adotemos para a ciência da computação, a IMF ( = Iniciativa dos Métodos Formais) e, por motivos de segurança, devemos seguir os exemplos iluminadores de nossos líderes e registrar a marca.
A longo prazo, eu espero que a ciência da computação transcenda suas disciplinas ancestrais, matemática e lógica, realizando efetivamente uma significativa parte do sonho de Leibniz, de prover um cálculo simbólico como alternativa ao raciocínio humano. (Por favor, note a diferença entre "imitar" e "prover uma alternativa a": as alternativas podem ser melhores.)
Desnecessário dizer que esta visão do que realmente seja a ciência da computação não é universalmente aplaudida. Pelo contrário, ela tem encontrado larga - e algumas vezes mesmo violenta - oposição vinda de todas as direções. Menciono como exemplos: (0) a corporação matemática, que continua a acreditar que o sonho de Leibniz é uma ilusão irrealista. (1) a comunidade de negócios, que tendo comprado a idéia de que os computadores fariam a vida ficar mais fácil, fica mentalmente despreparada para aceitar que eles resolvem os problemas fáceis com o custo de criar outros muito mais difíceis. (2) a sub-cultura do programador compulsivo, cuja ética prescreve que uma idéia vulgar e um mês de codificação furiosa são suficientes para torná-lo milionário a longo prazo. (3) a engenharia de computação, que continua a agir como se tudo se resumisse a maiores taxas de bits e mais comutações por segundo (4) os militares agora totalmente absorvidos nos negócios de transformar orçamentos de bilhões de dólares na ilusão da segurança automática (5) todas as ciências suaves ("soft sciences") para as quais a computação funciona como um tipo de abrigo interdisciplinar. (6) os empreendimentos educacionais que percebem que se tiverem de ensinar matemática formal para seus alunos de ciência da computação, logo fecharão suas escolas.
E com o sexto exemplo, eu atingi imperceptivelmente, mas também inevitavelmente, a parte mais cabeluda dessa palestra: as conseqüências educacionais.
O problema com a política educacional é que ela raramente é influenciada por considerações científicas derivadas dos tópicos pensados e é quase inteiramente determinada pelas expectativas combinadas dos alunos, seus pais e seus futuros empregadores, e a visão predominante sobre o papel da universidade: é o aborrecimento de treinar seus graduandos para o primeiro emprego, ou prover seus alunos com a bagagem intelectual e atitudes que permanecerão com eles nos próximos 50 anos. De má vontade, alocamos as ciências abstratas numa esquina distante no campus, ou as reconhecemos como motor indispensável da indústria da alta tecnologia ? Mesmo se assim fizermos, reconheceremos uma indústria de alta tecnologia como tal, se a sua tecnologia pertence principalmente à matemática formal ? As universidades oferecem para a sociedade as lideranças intelectuais que ela necessita ou apenas o treinamento que ela pede ?
A retórica acadêmica tradicional prontamente dá a essas questões respostas tranqüilizadoras, mas não acredito nelas. A título de ilustração de minhas dúvidas, em recente artigo "Quem regula o Canadá ?", David H. Flaherty repentinamente declara: "Ademais, a elite dos negócios despreza os acadêmicos tradicionais e os intelectuais, considerando-os totalmente irrelevantes e sem poder".
Então, se eu olhar para minha enevoada bola de cristal, para ter uma idéia sobre o futuro da educação na ciência da computação, vejo predominar o depressivo quadro de "negócios, como sempre". As universidades continuarão sem coragem para ensinar a ciência austera ("hard science"), elas continuarão a desorientar os estudantes e cada novo estágio de infantilização do currículo será saudado como progresso educacional.
Eu já tenho minha enevoada bola de cristal por longo tempo. Suas previsões são invariavelmente sombrias e usualmente corretas mas já estou suficientemente acostumado com elas e não me impedirão de dar-lhe algumas sugestões, mesmo se isso for meramente um exercício de futilidade cujo único efeito é fazer você se sentir culpado. Nós poderíamos, por exemplo, começar limpando nossa linguagem não mais chamando "bug" de bug, mas de erro. É muito mais honesto, pois coloca a culpa exatamente em quem deve, a saber, o programador que fez o erro. A metáfora animista do inseto ("bug") que imiscui-se maliciosamente enquanto o programador não está olhando é intelectualmente desonesta porque ela tenta esconder o fato de que o erro é criação do programador. O aspecto agradável dessa simples mudança de vocabulário é que ela tem um efeito profundo: Enquanto, anteriormente, um programa com apenas um bug era considerado "quase correto", agora um programa com um erro é simplesmente "incorreto" (porque está errado).
A minha próxima sugestão lingüística é mais rigorosa. É combater a síndrome: "Se-esse-cara-quer-falar-com-aquele-cara": nunca se refira a partes de programa ou peças de equipamento com terminologia antropomórfica, nem permita que seus alunos façam. Esse aperfeiçoamento lingüístico é muito mais difícil de ser implementado do que você pensa, e o seu departamento pode considerar a introdução de multas por violação, digamos 25 centavos para estudantes de graduação, 50 para estudantes de pós-graduação e 5 dólares para os professores; no fim do primeiro semestre do novo regime, vocês terão coletado dinheiro suficiente para dois bolsistas.
A razão para esta última sugestão é que a metáfora antropomórfica - cuja introdução se deve a John von Neumann - é um enorme obstáculo para toda comunidade de computação que a tenha adotado. Tenho encontrado atualmente programas querendo coisas, conhecendo coisas, esperando coisas, acreditando em coisas etc, e em todos os casos isso deu origem a confusões evitáveis. A analogia subjacente a essa personalização é tão superficial que além de enganar ela tem efeito paralisante.
Ela engana, no sentido de sugerir que é adequado confrontar o discreto não familiar em termos do contínuo familiar, isto é: nós próprios, oh não. Ela paralisa no seguinte sentido: uma vez que as pessoas existem e agem no tempo, sua adoção efetivamente impede a desvinculação com a semântica operacional e assim força as pessoas a considerar os programas em termos de seus comportamentos computacionais, baseados em um modelo computacional subjacente. Isso é ruim, porque o raciocínio operacional é uma tremenda perda de esforço mental.
Deixe-me explicar para você a natureza dessa tremenda perda e me permita tentar convencê-lo que "tremenda perda de esforço mental" não é um exagero. Por um instante, devo me tornar altamente técnico, mas não se sinta amedrontado: é o tipo de matemática que se pode fazer com as mãos nos bolsos. Devo salientar que se temos de demonstrar alguma coisa a respeito de todos elementos de um grande conjunto, é desesperançosamente ineficiente lidar com todos os elementos do conjunto individualmente: o argumento eficiente não se refere aos elementos mas é construído em termos da definição do conjunto.
Considere a figura plana Q definida como um quadrado de 8 por 8 do qual foram removidos os dois quadrados 1 por 1 em dois cantos opostos. A área de Q é 62, igual à área combinada de 31 dominós de tamanho 1 por 2. O teorema é que a figura Q não pode ser coberta com 31 dominós.
Outra forma de enunciar o teorema é: se você tomar um papel quadriculado e começar a cobri-lo colocando cada dominó em dois quadrados adjacentes, nenhuma disposição dos 31 dominós fornecerá a figura Q.
Então, uma possível maneira de provar o teorema é gerar todas as possíveis configurações de dominós e mostrar que em cada disposição a figura Q não é obtida: um trabalho tremendamente cansativo.
O argumento simples, contudo, é o seguinte: colorimos os quadrados do papel quadriculado imitando um tabuleiro de xadrez. Cada dominó cobrindo dois quadrados adjacentes, cobrirá um quadrado branco e um preto, e por isso cada configuração cobrirá o mesmo número de quadrados brancos e pretos. Porém, na figura Q o número de quadrados brancos difere do número de quadrados pretos em dois - uma vez que os cantos opostos estão na mesma diagonal - e por isso nenhuma configuração dos dominós fornece a figura Q.
O simples argumento acima não apenas é muitas ordens de magnitude menor que a exaustiva investigação das possíveis configurações de 31 dominós, mas é também essencialmente mais poderoso, uma vez que ele permite a generalização de Q, substituindo o quadrado original de 8 por 8 por qualquer retângulo cujos lados tenham comprimento par. Uma vez que o número de tais retângulos é infinito, o método anterior de exploração exaustiva é essencialmente inadequado para provar nosso teorema geral.
E isso conclui meu exemplo. Ele foi apresentado porque ilustra com poucas palavras o poder da matemática básica; desnecessário dizer que negar-se a explorar o poder dessa matemática básica é como cometer suicídio intelectual e tecnológico. A moral da história é: trate todos os elementos de um conjunto ignorando-os e trabalhando com a definição do conjunto.
Voltando à programação. A declaração que um dado programa atende a sua especificação equivale à declaração a respeito de todas as computações que podem ocorrer sob controle do programa. E uma vez que esse conjunto de computações é definido pelo dado programa, nossa recente moral afirma: trate todas as computações possíveis sob controle de um dado programa ignorando-as e trabalhe com o programa. Nós precisamos aprender a trabalhar com os textos de programas ignorando (temporariamente) que eles admitem a interpretação de código executável.
Outra maneira de dizer a mesma coisa: Uma linguagem de programação, com sua sintaxe formal e as regras que definem a sua semântica, é um sistema formal para o qual a execução do programa provê apenas um modelo. É bem sabido que os sistemas formais devem ser tratados como um todo e não em termos de um modelo específico. E, outra vez, o corolário é que nós devemos raciocinar a respeito de programas sem mencionar os seus "comportamentos".
E isso conclui minha incursão técnica na motivação porque o raciocínio operacional a respeito de programas é "uma tremenda perda de esforço mental" e porque na ciência da computação a metáfora antropomórfica deve ser banida.
Mas nem todos entendem isso suficientemente bem. Recentemente assistí uma demonstração de um suposto software educacional para um curso introdutório de programação. Com suas "visualizações" na tela, era um caso óbvio de infantilização de currículo, que seu autor deveria ser incriminado por "assédio ao corpo discente", mas isso é pouco se comparado com a finalidade das visualizações: elas eram usadas para mostrar todas as espécies de computações invocadas pelo programa do estudante ! O sistema salientava precisamente o que o estudante precisa aprender a ignorar, ele reforçava justamente o que o estudante precisa desaprender. Uma vez que desfazer-se de antigos maus hábitos em vez de adquirir novos é a parte mais penosa do aprendizado, devemos esperar desse sistema um dano mental permanente à maioria dos estudantes expostos a ele.
Desnecessário dizer, aquele sistema esconde completamente o fato que um programa por si só é uma meia conjectura. A outra metade é a especificação funcional que o programa deve satisfazer. A tarefa do programador é apresentar essa conjectura completa como teoremas provados.
Antes de terminar, gostaria de convidá-lo a considerar a seguinte maneira de se encarar a novidade radical da programação em um curso introdutório.
Por um lado, ensinamos algo parecido com o cálculo dos predicados, mas o fazemos de maneira muito diferente da usada pelos filósofos. A fim de treinar o programador novato a manipular fórmulas não interpretadas, nós ensinamos o cálculo dos predicados mais como álgebra booleana, familiarizando o estudante com todas as propriedades algébricas dos conectivos lógicos. Para cortar os vínculos com a intuição, renomeamos os valores { verdadeiro,falso } do domínio booleano para { preto,branco }.
Por outro lado, ensinamos uma linguagem de programação imperativa simples e limpa, com as instruções básicas de salto e atribui- ção múltipla, com uma estrutura de bloco para as variáveis locais, o ponto-e-vírgula como operação de composição de instruções, uma construção alternativa adequada, uma repetição e, se desejado, uma chamada de procedimento. A isso acrescentamos um mínimo de tipos de dados, a saber: booleanos, inteiros, caracteres e cadeias. O essencial é que, seja o que for introduzido, a semântica correspondente é definida pelas regras de prova que vão junto.
Desde o início e sempre no curso reforçamos que a tarefa do programador não é apenas escrever um programa, mas apresentar uma prova formal de que o programa proposto atende a especificação igualmente formal. Projetando provas e programas simultaneamente, o estudante obtém ampla oportunidade de aperfeiçoar a sua habilidade com o cálculo dos predicados. Finalmente, com o objetivo de reforçar a idéia que esse curso introdutório é primordialmente um curso de matemática formal, é preciso que a linguagem de programação em questão não tenha sido implementada no campus, protegendo assim os estudantes da tentação de testar seus programas. E isso conclui o esboço de minha proposta para um curso introdutório de programação.
Esta é uma proposta séria e muito sensata. A única desvantagem é ser radical para muitos, que impossibilitados de aceitá-la, são forçados a inventar uma razão rápida para desconsiderá-la, não importando o quão inválida. Darei a você algumas razões rápidas.
Você não precisa levar a minha proposta a sério porque ela é tão ridícula que obviamente eu devo estar totalmente desvinculado do mundo real. Mas essa pipa não voa, pois conheço muito bem o mundo real: os problem aplicar suas soluções efetivas. Então tentemos novamente.
Você não precisa levar a minha proposta a sério porque é ttalmente irrealista a tentativa de ensinar esse material para jovens universitários. Não teria um jeito mais fácil ? Você considera que isso seria muito difícil. Mas essa pipa também não voa porque foi provado que a sua consideração está errada: desde o início dos anos 80 tal curso introdutório de programação vem sendo dado com sucesso todos os anos para centenas de calouros. ( Uma vez que, em minha experiência, dizer isso uma única vez não é sufciente, a frase anterior deve ser repetida ao menos duas vezes.) Então, tentemos novamente.
Admitindo com relutância que talvez isso possa ser ensinado para estudantes suficientemente dóceis, ainda assim você rejeita a minha proposta porque tal curso desviaria demais do que os estudates de 18 anos estão acostumados e considera que infligir isso a eles seria ato de irresponsabilidade educacional: isso apenas frutraria os estudantes. Desnecessário dizer, essa pipa também não voa. É verdade que o estudante que nunca manipulou fórmulas não interpretadas rapidamente reconhece que está diante de algo totamente diferente de tudo que ele já viu antes. Mas felizmente as regras de manipulação neste caso são tão poucas e simples que muito cedo ele faz a descoberta excitante de que está começando a dominar uma ferramenta que, com toda a sua simplicidade, dá a ele um poder que ultrapassa em muito seus maiores sonhos.
Ensinar aos jovens o uso efetivo dos métodos formais é uma das alegrias da vida porque é extremamente recompensador. Em poucos meses eles encontram suas posições em um novo mundo com um nível de confiança radicalmente novo para eles; em poucos meses seus conceitos de cultura intelectual adquirem uma dimensão radicamente nova. Para o meu gosto e estilo, isso é a educação. As unversidades não devem ter medo de ensinar as novidades radicais; pelo contrário, devem agradecer a oportunidade de fazê-lo. A sua prontidão em fazê-lo é nossa salvaguarda contra as ditaduras, sejam do proletariado, dos estabelecimentos científicos ou das elites corporativas.
Edsger Wibe Dijkstra
Assinar:
Postar comentários (Atom)
Um comentário:
Deve ter sido altamente trabalhoso traduzir tudo. Um salve ao Prof. João Carlos – DCC/UFJF.
Obrigado pela postagem
Postar um comentário