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

Um comentário:

Anônimo disse...

Deve ter sido altamente trabalhoso traduzir tudo. Um salve ao Prof. João Carlos – DCC/UFJF.

Obrigado pela postagem