You are on page 1of 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 ador-
mecida. como se o assunto tivesse ficado arrumado quando a programao estruturada foi des-
coberta e o Pascal inventado. No entanto, as ideias prevalecentes sobre a programao evolu-
ram, o panorama das linguagens de programao muito diferente do de h vinte anos, os estu-
dantes 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 ati-
tudes? Se arriscarmos, se quisermos usar hoje a programao orientada pelos objectos com a na-
turalidade com que antes abramos a programao estruturada, que linguagem devemos esco-
lher? O Smalltalk, to puro mas to estranho, o Eiffel, to bem construdo mas to difcil de ob-
ter, 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 cuida-
dosamente, 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 qua-
se quarenta anos. Aparentemente, no incio, ensinar Programao no era uma questo que preo-
cupasse demasiado os praticantes. O que era preciso era programas que funcionassem nas m-
quinas 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 lingua-
gem usada e as peculiaridades do computador onde trabalhvamos.
A situao s mudou com o advento da programao estruturada, no final dos anos 60, so-
bretudo 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 dis-
cusso filosfica que no a nossa, podemos aceitar que ensinar a programar , pelo menos, en-
sinar 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 apli-
caes 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 lin-
guagens pudessem em tese ser mais adequadas para isso.
No entanto, a programao estruturada clssica, aquela que inspirou o Pascal, j no o pa-
radigma nico, talvez nem sequer o dominante, e a funo do Pascal fica prejudicada. Com efei-
to, 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 indi-
vidual, o que compreensvel, tendo em conta a poca em que surgiu. Hoje no entanto, se enca-
rarmos mais abrangentemente a Programao no apenas como a actividade de escrever progra-
mas, 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 enge-
nheiros 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 ensi-
nar Programao, discutimos os prs e os contras da nossa escolha (Seco 6). Finalmente, ex-
plicamos 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, progra-
mao 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 resol-
ver. Em Pascal, a decomposio funcional, ou procedimental, quer dizer, ao dividir o proble-
ma procuramos funes e procedimentos. A natureza monoltica do Pascal era adequada para es-
ta 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 en-
volver consideraes de engenharia de software.
verdade que, de abstraco em abstraco, muita gente advoga que ao ensinar Programa-
o, 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 progra-
mao de algumas universidades encontramos, depois da enumerao dos tpicos a tratar (fun-
es, vectores, ficheiros, etc.), vem a indicao subsidiria de que a linguagem-veculo a lin-
guagem 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 no-
tacional, 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 senti-
do 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 h-
bitos de falta de rigor.
3 Programao com Pascal
O Pascal tem sido a linguagem favorita para ensinar Programao, se no desde que foi inventa-
da, 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 Small-
talk, o ML. A primeira tem a vantagem de permitir a programao com tipos abstractos, a segun-
da 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 in-
formtica 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 igno-
ram 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 imbri-
cados 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 mto-
do, 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 ca-
beas) 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 Programa-
o surja logo no primeiro ano, ocupando um semestre. O nosso curso na licenciatura de enge-
nharia informtica na Universidade Nova de Lisboa era uma excepo, pois a Programao apa-
recia como disciplina anual do segundo ano. As razes para esta escolha so antigas e nunca fo-
ram desmentidas: no primeiro ano, os alunos recm-chegados universidade tm sobretudo dis-
ciplinas de carcter propedutico (Matemtica, Fsica, Histria de Cincia, etc.) do mesmo gne-
ro 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 apren-
der as matrias especficas do curso que escolheram, mas descontando essas reclamaes, esta-
mos 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 uti-
lizao 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 ensi-
no desenvolvido no contexto da engenharia de software. Isto , os alunos so desde logo avisa-
dos 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 realmen-
te uma boa linguagem para ensinar a programao, que nos permite concentrar-nos em cada as-
pecto 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 ne-
nhum captulo sobre a linguagem no significa que os aspectos lingusticos sejam subvaloriza-
dos. 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 re-
lacionados com problemas. Por exemplo, os primeiros procedimentos que surgem so procedi-
mentos 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 ins-
trues, 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 ne-
cessidades. 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 lin-
guagem 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 instru-
o while e a instruo repeat, dir-se-ia que a instruo for se usa quando se sabe partida quan-
tas 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 pro-
grama 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 liga-
4
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 pr-
prio 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 interfern-
cias no seriam sentidas: um procedimento sempre um procedimento, uma instruo for sem-
pre uma instruo for.
Concretamente, no captulo sobre processamento de texto queremos ter uma tabela de ca-
deias 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, disci-
plinar o acesso a recursos que consideramos privativos, e deixar as coisas suficientemente abs-
tractas 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 dei-
xa muito a desejar e vai ao invs dos objectivos de compreensibiliade, modificabilidade e fiabili-
dade 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 programa-
o. 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 rendilha-
dos 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 aban-
donar 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 fa-
zamos 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 pertur-
baria 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 Small-
talk, 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 lin-
guagem 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 platafor-
mas, 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 me-
nos 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 ob-
jectos. O Ada original era uma linguagem muito extensa e difcil, ainda que bem construda. En-
sinar 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 platafor-
mas.
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 final-
mente 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 lin-
guagens 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 programa-
o 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 tra-
dicional, usando Pascal, refinamentos sucessivos, etc. Isto d-nos oportunidade de explicar aque-
les mecanismos prprios das linguagens sem grandes distraces: variveis, tipos, funes, pro-
cedimentos, passagem de parmetros, vectores, organizao da memria. No entanto, no leva-
6
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 surpreen-
dente, 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 fa-
vor 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 geral-
mente os programadores gostam do C++. No se percebe bem por que que gostam, mas gos-
tam. 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 garan-
tia 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 abs-
tractas 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 ferramen-
tas 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 ra-
zovel. 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 po-
dem 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 frequente-
mente 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 concei-
tos importantes em programao aparecem na linguagem lado a lado com outros que so mera-
mente 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 pro-
gramao. Com linguagens mais simples, talvez seja possvel levar a bom termo alguns peque-
nos projectos sem tomar conscincia da necessidade de disciplina. Com C++, isso praticamen-
te 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 limita-
es como programadores. Mesmo adoptando espontaneamente uma disciplina, muitas vezes co-
meteremos erros, no propriamente por termos compreendido mal o problema, mas porque pen-
svamos 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 mes-
mo os que vm de no termos compreendido o problema. O excesso de confiana mau conse-
lheiro 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 recor-
dar-nos que afinal sabemos ainda muito pouco.
Deixar um problema de programao bem resolvido uma tarefa estafante. preciso ultra-
passar tantos erros, uns aparatosos outros muito discretos, preciso rever e tornar a rever deci-
ses que pensvamos serem definitivas, preciso voltar a estudar pontos da linguagem que jul-
gvamos j dominar completamente, preciso atender a inmeros pormenores, preciso afinar o
cdigo interminavelmente, preciso deixar o programa em condies de ser continuado por ou-
tras 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 pron-
to. 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 progra-
maremos 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 lin-
guagem, nunca conduz a bons resultados. Mesmo na programao tradicional em Pascal h re-
gras 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 pro-
gramao 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-li-
nha, membros protegidos, funes amigas, argumentos por defeito, etc. Eis algumas dessas re-
gras:

1. Cada classe tem uma parte pblica e uma parte privada (no se usa a parte protegi-
da).
2. O ficheiro .h contm a declarao da classe e o ficheiro .cpp a definio de todas as
funes.
8
3. Todas as classes tm um ou vrios construtores explcitos e um destrutor explcito,
mesmo se vazio (excepto classes abstractas).
4. Cada funo normais (isto , todas excepto os construtores e o destrutor) so ou se-
lectores (retornam um aspecto do estado do objecto, sem o modificar) ou modifica-
dores (mudam o estado do objecto, sem retornar nada).
5. A inicializao dos membros nos construtores faz-se sempre que possvel na lista de
inicializao dos membros e no no corpo do construtor.
6. Todas as funes so virtuais.
7. S se definem operadores com significados consagrados: afectao (=), indexao
([]), e comparao (==, !=, <=, < , >=, >).
8. No se usa funes em-linha (nem se fala nisso).
9. No se usa funes amigas (nem se fala nisso).
10. No se usa funes com argumentos por defeito (nem se fala nisso).
11. S se usa a variante posfixa dos operadores ++ e --.
12. Os argumentos de tipos simples (int, long, apontador) so passados por valor, e
aqueles cujo tipo uma classe so passados por referncia const.
13. Os resultados de uma funo ou so de tipos simples ou so passados por referncia
const.
14. No se usa resqucios desnecessrios do C, como struct, union (nem se fala nisso).
15. Instancia-se classes genricas atravs de typedef.
16. A herana sempre pblica.
17. Todas as estruturas de dados so implementadas atravs de classes.
18. As classes de biblioteca so enriquecidas por derivao.
19. No se usa abreviaturas nos nomes das classes nem nos nomes das funes pblicas.
20. Usa-se sistematicamente o mesmo nome (em Ingls) para funes anlogas em clas-
ses diferentes.

Nem todas estas regras tm que ser enunciadas explicitamente. Algumas correspondem ape-
nas 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 compi-
lador 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 dis-
ciplina 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 refe-
rncia 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 ca-
da 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.
9
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 apontado-
res, 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 permi-
tiria, 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, du-
vido que a componente de programao orientada pelos objectos em C++ pudesse acabar por re-
ceber a ateno necessria.
Concluso
Mesmo quando estamos contentes com o que temos, com os mtodos que usamos, nossa obri-
gao 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 in-
teressantes. 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 deci-
dir como fazer.
Se bem que nestes assuntos de programao, frequentemente os campos estejam muito mar-
cados, compete-nos ter uma atitude aberta, exploratria, e simultaneamente no aceitar dogmati-
camente aquilo que dizem os que fazem mais barulho. Alis, penso que devemos mesmo trans-
mitir 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++: clas-
ses, herana, polimorfismo, classes genricas, separao entre interface e implementao, modu-
larizao, portabilidade, bibliotecas. Infelizmente, diro alguns, isso vem no meio de um grande
nmero de conceitos estranhos que tornam muito difcil escrever programas fiveis, compreen-
d-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 tor-
narem-se bons programadores. E esse caminho faz-se com as linguagens existentes, e no na mi-
ragem 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

You might also like