Você está na página 1de 11

A mesma velha questo: como ensinar Programao?

Pedro Guerreiro Departamento de Informtica Faculdade de Cincias e Tecnologia Universidade Nova de Lisboa P-2825 Monte de Caparica, Portugal email: pg@di.fct.unl.pt telefone: +351 1 294 8536 fax: +351 1 294 8541 Resumo Durante os ltimos tempos, a questo de como ensinar a Programao tem estado um tanto adormecida. como se o assunto tivesse ficado arrumado quando a programao estruturada foi descoberta e o Pascal inventado. No entanto, as ideias prevalecentes sobre a programao evoluram, o panorama das linguagens de programao muito diferente do de h vinte anos, os estudantes que hoje aparecem nas universidades pertencem a outra gerao. Devemos ns continuar a usar os mesmo mtodos, que tm resultados garantidos pela experincia, ou arriscar novas atitudes? Se arriscarmos, se quisermos usar hoje a programao orientada pelos objectos com a naturalidade com que antes abramos a programao estruturada, que linguagem devemos escolher? O Smalltalk, to puro mas to estranho, o Eiffel, to bem construdo mas to difcil de obter, o C++ to mal-visto mas to popular? Se nenhuma destas linguagens apresenta vantagens decisivas, o C++ tem a seu favor o ser a mais requisitada. Contra si tem o ser a mais complicada. No entanto, se o ensino for feito cuidadosamente, aprender C++ pode ser uma experincia muito interessante e muito enriquecedora. 1 Introduo A programao como a praticamos comeou com o primeiro compilador de FORTRAN, h quase quarenta anos. Aparentemente, no incio, ensinar Programao no era uma questo que preocupasse demasiado os praticantes. O que era preciso era programas que funcionassem nas mquinas existentes, com os compiladores disponveis. Nesses tempos, o mtodo era o code it now, fix it later, e no havia muito para aprender em Programao alm de dominar a linguagem usada e as peculiaridades do computador onde trabalhvamos. A situao s mudou com o advento da programao estruturada, no final dos anos 60, sobretudo por influncia de Dijkstra, para quem ensinar a programar era essencialmente ensinar a pensar [Dijkstra 72A]. Trata-se de uma ligao muito ousada, mas, se quisermos evitar uma discusso filosfica que no a nossa, podemos aceitar que ensinar a programar , pelo menos, ensinar a pensar acerca dos programas. A linguagem da programao estruturada foi, e , o Pascal. Foi atravs do Pascal que as ideias da programao estruturada entraram nos hbitos dos programadores, a ponto de hoje toda a gente as aceitar pacificamente e naturalmente. E, se costume que as linguagens conservem os sectores de desenvolvimento para que foram criadas, mesmo depois de ter passado o auge da sua popularidade (o FORTRAN continua muito usado em aplicaes cientficas, o COBOL em aplicaes comerciais, o Ada em aplicaes militares e de telecomunicaes), de esperar que o Pascal se mantenha como o veculo principal do ensino da Programao, mesmo que outras linguagens pudessem em tese ser mais adequadas para isso. No entanto, a programao estruturada clssica, aquela que inspirou o Pascal, j no o paradigma nico, talvez nem sequer o dominante, e a funo do Pascal fica prejudicada. Com efeito, actualmente programar programar com objectos, assim como h vinte anos programar era 1

programar estruturadamente. Ora o Pascal, na sua forma ISO, no serve para a programao orientada pelos objectos [Jensen, Wirth 88]. Para mais, a programao estruturada considerava a programao como uma actividade individual, o que compreensvel, tendo em conta a poca em que surgiu. Hoje no entanto, se encararmos mais abrangentemente a Programao no apenas como a actividade de escrever programas, mas como a de desenvolver software, vemos que ela tem que ser compreendida sobretudo como uma actividade de equipa, inserida na disciplina de Engenharia de Software. E, mais uma vez, o Pascal no adequado para o trabalho em equipa. Surge ento a dupla questo: quando a nossa misso ensinar Programao a futuros engenheiros de software, que devemos ensinar, e que linguagem devemos usar? essa questo que vamos tratar a seguir. Comeamos por uma breve reviso do ensino da programao estruturada (Seco 2), e da utilizao do Pascal nesse contexto (Seco 3). Depois analisamos as necessidades do ensino da programao orientada pelos objectos (Seco 4) e o modo como tentamos dar-lhes resposta no curso de Programao que actualmente leccionamos (Seco 5). Como a linguagem que usamos, o C++, no geralmente considerada boa para ensinar Programao, discutimos os prs e os contras da nossa escolha (Seco 6). Finalmente, explicamos alguns dos aspectos tcnicos da nossa abordagem (Seco 7). 2 Programao estruturada Todos os programadores sabem o que a programao estruturada, ou se no sabem, pelo menos esto convencidos que isso que praticam. Descontando as confuses acerca dos gotos, programao estruturada essencialmente o mesmo que programao por refinamentos sucessivos (stepwise refinement) [Wirth 71]. A ideia que para programar se faz como Descartes mandou: dividir cada um dos problemas em tantas partes quantas as necessrias para melhor os resolver. Em Pascal, a decomposio funcional, ou procedimental, quer dizer, ao dividir o problema procuramos funes e procedimentos. A natureza monoltica do Pascal era adequada para esta abordagem. Uma linguagem em que as funes e procedimentos pudessem ser agrupados em mdulos traria uma outra dimenso de complexidade (como dividir um sistema em mdulos? [Parnas 72]) indesejvel quando a preocupao era sobretudo a resoluo do problema, sem envolver consideraes de engenharia de software. verdade que, de abstraco em abstraco, muita gente advoga que ao ensinar Programao, devemos mesmo abstrair-nos da linguagem e concentrar-nos nos aspectos de resoluo de problemas. A linguagem de programao torna-se assim um pormenor secundrio. Quem pensa deste modo, usa descontraidamente uma pseudo-linguagem informal para exprimir os algoritmos que vo aparecendo. esta atitude que detectamos quando nos currculos de cursos de programao de algumas universidades encontramos, depois da enumerao dos tpicos a tratar (funes, vectores, ficheiros, etc.), vem a indicao subsidiria de que a linguagem-veculo a linguagem X ou Y. A ideia que se poderia mudar de linguagem mantendo a essncia do curso. Pensamos que esta atitude errada, pois para alm de tolerar um certo desleixo conceptual e notacional, passa ao lado de uma srie de questes fundamentais que no tm existncia real fora das linguagens: como o mecanismo de passagem de parmetros? que acontece quando o ndice de um vector est fora dos limites? como se detecta o fim de um ficheiro? como se avalia uma expresso lgica? Embora estas questes possam ser descritas em abstracto, elas s fazem sentido se estivermos a pensar nalguma linguagem. Se no dermos importncia a isto logo na origem, os estudantes subvalorizaro pontos fundamentais da programao, e adoptaro indesejveis hbitos de falta de rigor. 3 Programao com Pascal O Pascal tem sido a linguagem favorita para ensinar Programao, se no desde que foi inventada, pelo menos desde que se tornou largamente disponvel nos pequenos computadores com o sistema USCD Pascal. verdade que recentemente certas experincias tm sido feitas no sentido 2

de substituir o Pascal por outras linguagens mais modernas, por exemplo, o Modula 2, o Smalltalk, o ML. A primeira tem a vantagem de permitir a programao com tipos abstractos, a segunda a orientao pelos objectos, a terceira uma maior clareza na abstraco funcional. No claro que os ganhos tenham sido enormes. Actualmente, muitos dos alunos que chegam universidade em Portugal para cursos de informtica ou outros de engenharia j conhecem o Pascal. Aparentemente, esta a linguagem mais usada no ensino secundrio, nas escolas que tm Informtica. Na realidade, verifica-se que, na quase totalidade dos casos, o conhecimento bastante superficial: no s os estudantes ignoram aspectos importantes da linguagem, como a utilizao que dela fazem rudimentar: por exemplo, frequente encontrar longas sequncias de if-then-elses, quase sempre as variveis aparecem todas declaradas globalmente, os procedimentos e funes so ad-hoc, h ciclos imbricados com uma profundidade excessiva, etc. Alm disso, desconhecem quase completamente os principais algoritmos e estruturas de dados. E por fim, no s geralmente no tm nenhum mtodo, como adoptam alegremente a perigosa filosofia de que o que preciso que funcione. Seja como for, os estudantes novatos pensam que, de Pascal, e por conseguinte (nas suas cabeas) de Programao, j sabem quase tudo. Por isso, muitos encaram com uma certa m-vontade, ou mesmo com sobranceria, o curso inicial de Programao com Pascal. Ainda por cima, nos cursos de Informtica frequente que a disciplina inicial de Programao surja logo no primeiro ano, ocupando um semestre. O nosso curso na licenciatura de engenharia informtica na Universidade Nova de Lisboa era uma excepo, pois a Programao aparecia como disciplina anual do segundo ano. As razes para esta escolha so antigas e nunca foram desmentidas: no primeiro ano, os alunos recm-chegados universidade tm sobretudo disciplinas de carcter propedutico (Matemtica, Fsica, Histria de Cincia, etc.) do mesmo gnero das que conhecem do ensino secundrio, e isso ajuda a suavizar a transio. As disciplinas da especialidade (Sistemas de Operao, Bases de Dados, Anlise de Sistemas, etc.) s surgem a partir do terceiro ano. Assim ficava o segundo ano todo para fazer a aprendizagem universitria da Programao. verdade que muitos alunos reclamavam, porque estavam ansiosos por aprender as matrias especficas do curso que escolheram, mas descontando essas reclamaes, estamos convencidos que o rendimento do curso no segundo ano era muito melhor do que poderia ser caso ocorresse no primeiro. Se bem que no haja medidas objectivas, esta convico refora-se de cada vez que directamente ou indirectamente participamos no ensino da Programao a alunos que so do primeiro ano da universidade. Apesar disto tudo, recentemente a Universidade Nova de Lisboa decidiu antecipar a disciplina de Programao para o primeiro ano, a partir do ano lectivo 1996-1997. Veremos quais so os resultados. Neste curso de Programao, adoptamos desde logo a atitude de que programar resolver problemas usando uma linguagem de programao. Quer dizer, a resoluo de problemas e a utilizao esclarecida, rigorosa e competente de uma linguagem de programao so as duas faces das mesma moeda. Para mais, tratando-se de estudantes de engenharia informtica, todo o ensino desenvolvido no contexto da engenharia de software. Isto , os alunos so desde logo avisados que no basta que o programa funcione: tambm preciso que seja compreensvel, eficiente, modificvel e fivel [Ross, Goodenough, Irvine 1975]. A linguagem escolhida tem sido o Pascal. As razes desta escolha no so muito profundas: o Pascal existe, existe a experincia de ensinar a Programao com o Pascal, o Pascal realmente uma boa linguagem para ensinar a programao, que nos permite concentrar-nos em cada aspecto da matria, sem distraces, e por uma ordem que eficaz pedagogicamente. O nosso curso tem os seguintes captulos: 1. Resoluo de problemas de programao. 2. Programao com funes e procedimentos. 3. Processamento de vectores e matrizes. 4. Processamento de ficheiros sequenciais. 3

5. Tcnicas de processamento de texto. 6. Estruturas de dados recursivas. 7. Elementos de clculo numrico. O curso guiado, portanto, pelo tipo de problemas a resolver. O facto de no aparecer nenhum captulo sobre a linguagem no significa que os aspectos lingusticos sejam subvalorizados. Pelo contrrio: a ideia que no vale a pena, por exemplo, explicar em abstracto o que um procedimento ou o que a instruo for. prefervel apreciar a necessidade desses conceitos relacionados com problemas. Por exemplo, os primeiros procedimentos que surgem so procedimentos sem parmetros, resultantes da decomposio do problema em subproblemas:
procedure ReadData; begin ... end; procedure ComputeResults; begin ... end; procedure DisplayResults; begin ... end;

No vale a pena, portanto, insistir na passagem de parmetros quando o que se quer apenas encapsular um conjunto de instrues. Os parmetros surgem depois, naturalmente, no contexto de funes, que inicialmente tm um sabor matemtico:
function Min(x: Integer; y: Integer): Integer; begin ... end;

Os parmetros no procedimentos servem normalmente, no para parametrizar listas de instrues, mas no contexto do processamento de estruturas de dados, inicialmente vectores:
procedure Sort(var theArray: IntegerArray; numberOfElements: Integer); begin ... end;

Quer dizer, como o ensino guiado pelos problemas, a linguagem aparece conforme as necessidades. Se, inversamente, nos basessemos na linguagem, ento teramos um captulo sobre procedimentos, e nele percorreramos todas as variantes (sem parmetros, com parmetros, com variveis globais, sem variveis globais, com parmetros e com variveis globais, etc.) e ficaria talvez mais difcil ver claramente que algumas destas variantes so indesejveis, ainda que a linguagem as coloque todas em igualdade. Um outro exemplo o do instruo for. Numa abordagem guiada pela linguagem haveria um captulo sobre instrues iterativas, e nesse captulo, provavelmente depois de estudar a instruo while e a instruo repeat, dir-se-ia que a instruo for se usa quando se sabe partida quantas vezes se vai repetir o passo do ciclo. Nem sempre assim, claro, mas a simplificao at razovel, num primeiro contacto. Depois, exemplificar-se-ia a instruo com um troo de programa para escrever 100 vezes uma frase qualquer:
for i:=1 to 100 do Writeln("O Pascal que bom.");

duvidoso que isto deixe perceber como que se pode usar a instruo for para resolver problemas. Inversamente, numa abordagem guiada pelos problemas, a instruo for aparece liga4

da ao processamento de vectores, quando o problema exige que se percorra todo o vector: um bom exemplo o problema de achar o mximo de um vector, para o qual no faltam situaes reais, que podem servir de pretexto. O inconveniente desta abordagem guiada pelos problemas que medida que o nosso prprio estilo de programao evolui, medida que a influncia da programao de tipos abstractos de dados e da programao orientada pelos objectos se refora, o Pascal vai reagindo cada vez com mais dificuldades. Comparativamente, se nos basessemos na linguagem, essas interferncias no seriam sentidas: um procedimento sempre um procedimento, uma instruo for sempre uma instruo for. Concretamente, no captulo sobre processamento de texto queremos ter uma tabela de cadeias de caracteres, com operaes para inserir uma palavra na tabela, outra para ver se a palavra existe, etc. Ao mesmo tempo, queremos separar claramente a interface da implementao, disciplinar o acesso a recursos que consideramos privativos, e deixar as coisas suficientemente abstractas para poder mudar a implementao sem grandes sobressaltos. Nessa altura constatamos que o Pascal no nos d margem de manobra para nos exprimirmos como desejamos. O mesmo acontece quando se estudam as estruturas de dados recursivas: listas e rvores. Se bem que a programao seja perfeitamente fazvel, a organizao que o Pascal proporciona deixa muito a desejar e vai ao invs dos objectivos de compreensibiliade, modificabilidade e fiabilidade que queremos que os estudantes persigam nos seus programas. Quer dizer, a partir de certa altura, o Pascal deixa de reagir convenientemente s nossas prprias necessidades de programao. De certo modo damos por ns numa posio ridiculamente semelhante dos que h 20 anos praticavam programao estruturada em FORTRAN, simulando ciclos while base de rendilhados de instrues IF e GOTO. Que fazer ento? J que as nossas dificuldades tm a ver com a transio para a programao de tipos abstractos e para a programao orientada pelos objectos, devemos ns finalmente abandonar o Pascal clssico e adoptar uma linguagem decididamente orientada pelos objectos? 4 A Programao Orientada pelos Objectos H vinte anos, o facto de no se saber bem o que era a programao estruturada no impediu que ela se tornasse o principal paradigma de programao, aceite e adoptado em todo o lado. Agora parece que o que todos querem programao orientada pelos objectos, mesmo se tambm no claro o que isso seja, nem to-pouco onde nos vai levar. Tambm no ser num curso introdutrio de Programao que essa discusso deve ser feita: provavelmente os estudantes no compreenderiam o alcance das nossas angstias de professores numa encruzilhada. O que h a fazer, se continuarmos a adoptar uma abordagem guiada pelos problemas, adoptar um estilo orientado pelos objectos, com a mesma naturalidade que antes fazamos os refinamentos sucessivos. Mas ento, que linguagem devemos usar? O Pascal ISO s d at certo ponto, como vimos. Adoptar uma verso no normalizada de Object Pascal perturbaria a portabilidade (frequentemente, mesmo na aprendizagem, preciso mudar de plataforma, e fundamental que isso se faa sem atrapalhaes). A necessidade de uma linguagem disponvel na maior parte das plataformas, e que realmente inspire confiana, reduz muito a nossa escolha. partida, as linguagens possveis so o Smalltalk, o Eiffel, o C++ e o Oberon. Mais recentemente, juntaram-se a este grupo o Java e o Ada95. No ser, portanto, por falta de linguagem que no tornamos o nosso ensino orientado pelos objectos. No entanto, a escolha difcil pois nenhuma das linguagens se distingue como sendo particularmente apropriada para o ensino, como era o caso do Pascal em relao programao estruturada. O Smalltalk uma ptima linguagem (as outras tambm) mas um tanto estranha, para quem tem uma cultura de programao formada nas linguagens da famlia Algol. Se bem que existam sistemas Smalltalk em muitas plataformas, no claro para um no iniciado se eles so 5

todos compatveis entre si. Alm disso, a programao com Smalltalk parece to diferente da programao habitual em C ou COBOL, que no fica claro que se ganhe muito com aprender Smalltalk, para alm de eventualmente alguns bons hbitos. O Eiffel ambiciona ser o Pascal dos objectos, isto , a linguagem de eleio para o ensino da programao orientada pelos objectos. uma linguagem que tem preocupaes de Engenharia de Software, o que uma vantagem. Mas relativamente pouco acessvel, e ainda no se livrou de uma certa fama de pouca confiabilidade. O C++ gaba-se de ser linguagem mais usada na programao orientada pelos objectos, mas quase todos concordam que complicada demais para ensinar. Tem a vantagem de ser popular, de haver muitos livros de texto para C++, e muitas boas ferramentas para a programao C++, disponveis em todas as plataformas. O esforo para aprender C++ no se perde, pois uma linguagem muito requisitada nas empresas. O Oberon mantm-se ainda no sector das curiosidades. uma linguagem simples, eficaz e directa, com um pequeno manual de referncia, disponvel gratuitamente para muitas plataformas, mas que no conseguiu ainda o estatuto de uma linguagem sria. O Java uma inveno ainda muito recente. Apesar de todo o alarido que tem havido sua volta, a linguagem ainda no est suficientemente difundida, e as suas ferramentas inspiram menos confiana que as do C++, por exemplo. certamente cedo demais para a adoptar no ensino da programao. O Ada95 traz as boas credenciais do Ada original (Ada83), e junta-lhe a orientao pelos objectos. O Ada original era uma linguagem muito extensa e difcil, ainda que bem construda. Ensinar Ada83 j era complicado, ensinar Programao com Ada95 no deve ser mais simples. Tem a vantagem de, tal como o Oberon, dispor de implementaes gratuitas para vrias plataformas. O panorama animador: h muito por onde escolher e nenhum dos candidatos apresenta vantagens decisivas. Ainda bem! Podemos assim escapar monotonia e estagnao que surge quando todos esto de acordo. 5 O novo curso de Programao Ensinar vrias linguagens num curto espao de tempo costuma dar mau resultado. Quando finalmente os estudantes comeam a apreciar uma linguagem, j tm que a pr de lado para comear com a prxima. Se isto se passa no contexto da aprendizagem da Programao, a confuso pode ser grande. Por isso, ao ensinar Programao, o ideal seria ter uma linguagem nica que nos acompanhasse de uma ponta outra. (Claro que os estudantes devero depois estudar mais linguagens noutros cursos, mas isso outro assunto.) Infelizmente, ao querer praticar a programao orientada pelos objectos no nosso curso de Programao, no encontramos uma linguagem que nos satisfaa e que nos tranquilize. O que ns gostaramos de ter era uma linguagem que nos permitisse ensinar a resoluo de problemas de programao, comeando pelas coisas simples, e continuando gradualmente at programao orientada pelos objectos, sempre com as preocupaes da engenharia de software em mente. Ora, em nossa opinio, nenhuma das linguagens enumeradas h pouco d para cobrir todo este espectro. Mas se uma no cobre, talvez duas em conjunto cubram. verdade que isto vai contra a ideia de uma linguagem nica, mas pelo menos temos a consolao que, tratando-se de um curso anual, h tempo para fazer a transio. O soluo que est a ser experimentada neste momento consiste em dividir o curso em duas partes semestrais. Na primeira, em que temos que comear do zero, mantemos a abordagem tradicional, usando Pascal, refinamentos sucessivos, etc. Isto d-nos oportunidade de explicar aqueles mecanismos prprios das linguagens sem grandes distraces: variveis, tipos, funes, procedimentos, passagem de parmetros, vectores, organizao da memria. No entanto, no leva6

mos a resoluo de problemas muito longe, para no entrar na zona em que o Pascal comea a dar-se mal. Assim, dos seis captulos indicados atrs, s mantemos os quatro primeiros: os trs ltimos tcnicas de processamento de texto, estruturas de dados recursivas, clculo numrico ficam para a segunda parte, ainda que num contexto diferente. A linguagem que seleccionmos para a segunda parte foi o C++. uma escolha surpreendente, face aos argumentos que temos vindo a desenvolver: o C++ de facto uma linguagem muito complicada, nada prpria, partida, para ensinar Programao. Que razes militam a favor do C++, ento? 6 C++ educativo O C++ uma linguagem popular. A popularidade s por si no qualidade claro, mas verdade que h cada vez mais gente a querer saber programar em C++. E tambm verdade que geralmente os programadores gostam do C++. No se percebe bem por que que gostam, mas gostam. Se calhar gostam pelas razes erradas. Se calhar gostam porque a linguagem complicada e d luta, se calhar gostam porque os programas ficam difceis de modificar (e isso uma garantia adicional de emprego), se calhar gostam porque a linguagem nos lembra constantemente que estamos a trabalhar com computadores de plstico e silcio e no com mgicas mquinas abstractas de estruturas e conceitos, se calhar gostam porque os espritos bem-pensantes acham que o C++ uma vergonha e devia ser proibido. Por outro lado, mesmo se complicado e difcil, o C++ inspira uma certa confiana. uma linguagem j bastante estvel, provm do C, que uma linguagem de referncia, existe em quase todas as plataformas, muitos fabricantes de software fornecem compiladores de C++ e ferramentas de programao associadas. O esforo necessrio para aprender a programar em C++ no se vai perder, com certeza. Pelo contrrio: acrescentar ao currculo uma linha com programa em C++ algo que cada vez mais programadores ambicionam. Tentar ensinar Programao com uma linguagem difcil demais pode parecer uma perda de tempo. Talvez fosse melhor esperar que surja, se no tiver surgido j, uma linguagem mais razovel. Ou ento no, ficamos com o C++, tal como ele , e esforamo-nos por fazer do vcio virtude, tirando partido construtivamente mesmo das suas dificuldades. Sendo o C++ difcil e complicado, para o dominar preciso disciplina. Se o enfrentarmos de qualquer maneira, rapidamente ficaremos soterrados por uma avalancha de conceitos que se podem combinar de imensas maneiras, que por vezes entram em conflito uns com os outros, que tm justificaes duvidosas, que esto l para assegurar estranhas compatibilidades. Com tantas maneiras de exprimir ideias parecidas, logo nos esquecemos por que optmos por uma e no por outra. Com tanto por onde escolher, hesitamos tempo demais perante cada escolha, e frequentemente ficamos com a impresso de que se calhar afinal no escolhemos bem. A linguagem, em vez de nos servir para ajudar a resolver o problema, torna-se um obstculo suplementar. claro que a linguagem neutra em relao nossa insegurana como programadores. Tudo o que ela permite vlido, em algum sentido, e at pode ser til. No obstante, por vezes conceitos importantes em programao aparecem na linguagem lado a lado com outros que so meramente acessrios. Como que o principiante pode distinguir o trigo do joio? Bom, cingindo-se a uma disciplina de programao, que se baseie nos mecanismos sos da linguagem, para com eles exprimir modelos claros do universo do problema, deixando de parte, ou para mais tarde, as construes mais fantasiosas. A disciplina uma das qualidades fundamentais de um programador, seja em que linguagem for. Um programador indisciplinado, mesmo que genial, de pouca utilidade para uma equipa de desenvolvimento de software. Ora o C++ uma linguagem boa para cultivar a disciplina na programao. Com linguagens mais simples, talvez seja possvel levar a bom termo alguns pequenos projectos sem tomar conscincia da necessidade de disciplina. Com C++, isso praticamente impossvel. Com C++, os estudantes percebem rapidamente que, ou se tornam disciplinados, ou no vo a lado nenhum. 7

Ao programar em C++, frequentemente seremos confrontados com as nossas prprias limitaes como programadores. Mesmo adoptando espontaneamente uma disciplina, muitas vezes cometeremos erros, no propriamente por termos compreendido mal o problema, mas porque pensvamos que j conhecamos bem a linguagem. Isto uma situao geral em Programao, mas fica mais gritante quando a linguagem complexa. verdade que os erros mais graves so mesmo os que vm de no termos compreendido o problema. O excesso de confiana mau conselheiro em programao. Por outro lado, errar, reconhecer o erro, corrigi-lo, faz bem alma. A linguagem C++, por ser complexa, ensina os programadores a ser humildes, a respeitar as suas limitaes, a reconhecer as dos outros, a nunca partir do princpio que programar fcil. A humildade, como Dijkstra observou h j muito tempo, outra das qualidades fundamentais de um programador [Dijkstra 72B]. Ao programar com C++ estaremos permanentemente a recordar-nos que afinal sabemos ainda muito pouco. Deixar um problema de programao bem resolvido uma tarefa estafante. preciso ultrapassar tantos erros, uns aparatosos outros muito discretos, preciso rever e tornar a rever decises que pensvamos serem definitivas, preciso voltar a estudar pontos da linguagem que julgvamos j dominar completamente, preciso atender a inmeros pormenores, preciso afinar o cdigo interminavelmente, preciso deixar o programa em condies de ser continuado por outras pessoas. E frequentemente isto tudo tem que ser feito sob a presso de prazos a cumprir. normal que surjam momentos de desnimo, em que apetece deixar as coisas como esto, e pronto. Mas no pode ser. Temos que perseverar, temos mesmo fazer as coisas como deve ser. Com efeito, a perseverana talvez a terceira qualidade fundamental de um programador. Ora o C++ bom para educar a perseverana. A linguagem difcil, s chegaremos ao fim se formos corajosos, perseverantes. Caso contrrio ficaremos com uma luzes, mas no programaremos verdadeiramente em C++. Em resumo, o C++ complicado? sim. Em vez de nos lamentarmos disso, vamos us-lo disciplinadamente, humildemente, perseverantemente. No final, os estudantes sero melhores programadores, no s porque conhecem uma nova linguagem mas tambm porque sero mais disciplinados, mais humildes, mais perseverantes. Assim seja! 7 Utilizao do C++ Uma utilizao desregrada do C++, tal como uma utilizao desregrada de qualquer outra linguagem, nunca conduz a bons resultados. Mesmo na programao tradicional em Pascal h regras que se sobrepem s da linguagem, a mais conhecida das quais : no usar gotos. Mas h outras, ou devia haver: No usar efeitos laterais em funes. No declarar globalmente o que pode ser declarado localmente. Evitar if-then-else muito imbricados. No usar if-then (sem else) dentro de if-then-else. Etc. Com o C++, h muito mais regras como estas. A maior parte tem a ver com eliminar da programao todos aqueles aspectos da linguagem que no tm a ver com a resoluo de problemas mas sim com a optimizao do cdigo ou com aspectos de convenincia pontual: funes em-linha, membros protegidos, funes amigas, argumentos por defeito, etc. Eis algumas dessas regras: 1. 2. Cada classe tem uma parte pblica e uma parte privada (no se usa a parte protegida). O ficheiro .h contm a declarao da classe e o ficheiro .cpp a definio de todas as funes. 8

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

Todas as classes tm um ou vrios construtores explcitos e um destrutor explcito, mesmo se vazio (excepto classes abstractas). Cada funo normais (isto , todas excepto os construtores e o destrutor) so ou selectores (retornam um aspecto do estado do objecto, sem o modificar) ou modificadores (mudam o estado do objecto, sem retornar nada). A inicializao dos membros nos construtores faz-se sempre que possvel na lista de inicializao dos membros e no no corpo do construtor. Todas as funes so virtuais. S se definem operadores com significados consagrados: afectao (=), indexao ([]), e comparao (==, !=, <=, < , >=, >). No se usa funes em-linha (nem se fala nisso). No se usa funes amigas (nem se fala nisso). No se usa funes com argumentos por defeito (nem se fala nisso). S se usa a variante posfixa dos operadores ++ e --. Os argumentos de tipos simples (int, long, apontador) so passados por valor, e aqueles cujo tipo uma classe so passados por referncia const. Os resultados de uma funo ou so de tipos simples ou so passados por referncia const. No se usa resqucios desnecessrios do C, como struct, union (nem se fala nisso). Instancia-se classes genricas atravs de typedef. A herana sempre pblica. Todas as estruturas de dados so implementadas atravs de classes. As classes de biblioteca so enriquecidas por derivao. No se usa abreviaturas nos nomes das classes nem nos nomes das funes pblicas. Usa-se sistematicamente o mesmo nome (em Ingls) para funes anlogas em classes diferentes.

Nem todas estas regras tm que ser enunciadas explicitamente. Algumas correspondem apenas a partes que so omitidas. Esta abordagem, se pode ser pedagogicamente justificada, depara-se com alguns obstculos. O primeiro que o compilador no garante nada disto. Por exemplo, se um estudante, por lapso ou por rebeldia, decidir omitir a palavra reservada virtual na declarao de uma funo, o compilador no se queixa. Mais tarde, o funcionamento polimrfico pode no corresponder ao que ter sido descrito. De qualquer forma, nunca podemos confiar no compilador para garantir que a disciplina preconizada respeitada. A dificuldade seguinte que os livros sobre C++ normalmente no seguem esta abordagem. O de Stroustrup, por exemplo, pretende ser um livro de referncia (e contm o manual de referncia do C++), e no tem grandes preocupaes metodolgicas ou pedaggicas [Stroustrup 91]. O de Lippman, sendo um livro de iniciao ao C++, segue a abordagem de passar em revista cada um dos conceitos exaustivamente, e considera todas as variantes, mesmo aquelas que no nos interessam [Lippman 91] . A terceira dificuldade de outra natureza: se estamos a praticar um C++ um tanto depurado, os estudantes, quando carem na realidade e confrontarem o que aprenderam com programas C++ de outras origens, podem sentir-se desprotegidos ou mesmo enganados, ao verificar que os programas a srio comportam muitas coisas que no curso foram desvalorizadas. Finalmente, normal que os estudantes pensem que ao aprender C++ vo aprender tambm C, por feito lateral. Ora as tcnicas de programao que aquelas regras induzem no tm nada a ver com as que so prprias do C. Basta observar que em C++ usam-se muito menos apontadores, e por isso toda aquela aritmtica de apontadores, to tpica no C, completamente omitida. Uma outra abordagem programao com C++, que comeasse pela aprendizagem do C permitiria, por hiptese, ganhar as duas linguagens pelo preo de uma. Talvez isso possa ser verdade, do ponto de vista das linguagens em si, mas dadas as diferenas de objectivos entre as duas, du9

vido que a componente de programao orientada pelos objectos em C++ pudesse acabar por receber a ateno necessria. Concluso Mesmo quando estamos contentes com o que temos, com os mtodos que usamos, nossa obrigao de professores universitrios, tentar melhorar, perceber o que est para vir, experimentar novas abordagens aos velhos problemas, enriquecer os nossos cursos com ideias modernas e interessantes. Neste momento de viragem nas tcnicas de programao, com a afirmao cada vez mais evidente da programao orientada pelos objectos, temos pela frente a necessidade de decidir como fazer. Se bem que nestes assuntos de programao, frequentemente os campos estejam muito marcados, compete-nos ter uma atitude aberta, exploratria, e simultaneamente no aceitar dogmaticamente aquilo que dizem os que fazem mais barulho. Alis, penso que devemos mesmo transmitir tambm isto aos alunos, no sentido de os ajudar a desenvolver o seu esprito crtico, e de serem capazes, mais cedo ou mais tarde, de escolher as linguagens e as ferramentas que melhor resposta podem dar s suas necessidades. A questo de como ensinar a programao uma velha questo, que no tem uma resposta definitiva. Se verdade que no h vantagem em embarcar levianamente em modas passageiras, tambm no devemos entrincheirar-nos naquilo que conhecemos bem, s porque mais seguro e j deu provas. O C++ no certamente a linguagem ideal, e muito menos a linguagem ideal para ensinar a Programao. De certo modo, os defeitos do C++ no esto no que lhe falta, mas na abundncia do que oferece. Aquilo que procuramos numa linguagem moderna, encontramos no C++: classes, herana, polimorfismo, classes genricas, separao entre interface e implementao, modularizao, portabilidade, bibliotecas. Infelizmente, diro alguns, isso vem no meio de um grande nmero de conceitos estranhos que tornam muito difcil escrever programas fiveis, compreend-los, modific-los. Mas programar bem difcil, e h-de ser sempre difcil. verdade que dispensaramos de bom grado as complicaes adicionais de uma linguagem com coisas demais. Mas se formos disciplinados, agora como antes, veremos que essas complicaes podem em grande parte ser evitadas. Pois bem, a nossa misso, hoje com a programao orientada pelos objectos como antes com a programao estruturada, descobrir o melhor caminho para ajudar os nossos estudantes a tornarem-se bons programadores. E esse caminho faz-se com as linguagens existentes, e no na miragem de uma perfeio inatingvel. Referncias [Dahl, Dijkstra, Hoare 72] O-J Dahl, E. W. Dijkstra, C. A. R. Hoare, Structured Programming, Academic Press, London, 1972. [Dijkstra 72A] E. W. Dijkstra, Notes on Sructuried Programming in [Dahl, Dijkstra, Hoare 72] [Dijkstra 72B] E. W. Dijkstra, The Humble Programmer ,Comm. of the ACM, Vol 15, 10, pp. 859-866, Outubro 1972. [Jensen, Wirth 88] K. Jensen e N. Wirth, Pascal User Manual and Report, Springer, 1988. [Lippman 91] S. B. Lippman, C++ Primer, Addison-Wesley, Reading Massachusetts, 1991. [Parnas 72] D.L. Parnas. On the Criteria to be Used in Decomposing Systems into Modules. Comm. of the ACM, vol 15, 12, pp. 1053-1058, Dezembro, 1972. [Ross, Goodenough, Irvine 1975], D. Ross, J. Goodenough e C. Irvine, Software Engineering: Processes, Principles, and Goals, IEEE Computer, Maio 1975. [Stroustrup 91] B. Stroustrup, The C++ Programming Language, Addison-Wesley, Reading Massachusetts, 1991. 10

[Wirth 71] N Wirth, Program Development by Software Refinement, Comm. of the ACM, Vol 14, 4, pp. 221-227, Abril 1971.

11