conceitos básicos de programação

Propaganda
Ambiente de suporte à aprendizagem de
conceitos básicos de programação
Anabela de Jesus Gomes
Centro de Informática e Sistemas da Universidade de Coimbra
Instituto Superior de Engenharia de Coimbra
Coimbra, Portugal
Tel.: +351 39 790334 Fax: +351 39 790270
email:[email protected]
António José Mendes
Centro de Informática e Sistemas da Universidade de Coimbra
Coimbra, Portugal
Tel.: +351 39 790000 Fax: +351 39 701266
email:[email protected]
Ambiente de suporte à aprendizagem de
conceitos básicos de programação
Resumo
O insucesso generalizado verificado na aprendizagem das linguagens de
programação, por parte de alunos do ensino superior, segundo os métodos de ensino
tradicionais, leva a que seja feita uma reflexão sobre as suas possíveis origens. É
apresentado, neste trabalho, um conjunto de eventuais alternativas que possam apoiar o
aluno no seu processo de aprendizagem, nesta área. Para esse efeito, é efectuada para
cada uma delas uma análise que as permite distinguir entre si, apresentando as suas
vantagens e desvantagens, bem como o contexto em que se enquadram. A abordagem
proposta consiste na criação de uma ferramenta híbrida automatizada, reunindo várias
das características das alternativas apresentadas. Antes porém de a descrever é feita uma
breve exposição sobre o estado da arte em aplicações com um propósito análogo.
Finalmente, é apresentada uma descrição muito sumária e incompleta, do material
proposto, uma vez que este se encontra no início do seu desenvolvimento.
Introdução
O ensino das linguagens de programação tem como propósito conseguir que os
alunos desenvolvam as suas capacidades, adquirindo os conhecimentos necessários para
conceber programas e sistemas computadorizados capazes de resolver problemas reais.
Porém, a experiência tem demonstrado que existe, em termos gerais, uma grande
dificuldade em compreender e aplicar certos conceitos abstractos de programação, por
parte de uma percentagem significativa dos alunos que frequentam cadeiras
introdutórias nesta área. Uma das grandes dificuldades reside precisamente na
compreensão e, em particular, na aplicação de noções básicas, como as estruturas de
controlo, à criação de algoritmos que resolvam problemas concretos. Também os
métodos de ensino tradicionais parecem não ser os mais adequados para o entendimento
destas matérias, essencialmente devido aos seguintes aspectos:
 grande nível de abstracção exigido;
 necessidade de um bom nível de conhecimentos e prática de técnicas de
resolução de problemas;
 aprendizagem de conceitos dinâmicos utilizando principalmente materiais de
índole estática;
 exigência de um estudo muito baseado na prática e, por isso, bastante diferente
do requerido pela maioria das disciplinas (mais baseado em noções teóricas, implicando
muita leitura e alguma memorização);
 impossibilidade de um acompanhamento individualizado ao aluno, devido à
existência de turmas demasiado grandes;
 as linguagens não são visuais, traduzindo-se, em geral, num reduzido nível de
compreensão;
 as linguagens aprendidas são demasiado grandes e idiossincráticas, com
características muito próprias;
 insuficiência de laboratórios para utilização fora do horário curricular;
 existência de laboratórios equipados com um número insuficiente de
máquinas.
Aliado a todos estes problemas existe um outro que acentua este conjunto de
dificuldades. Actualmente, no ensino português, é permitido que alunos de áreas algo
diversificadas, e como tal com backgrounds muito diferentes, frequentem um curso
superior, onde são leccionadas disciplinas de linguagens de programação. Assim, é
possível encontrar turmas com alunos provenientes de cursos tecnológicos, já com
algum conhecimento de programação, e outros dos mais variados cursos, que quando
muito apenas se defrontaram com um computador na óptica do utilizador, traduzindo-se
em diferentes ritmos de aprendizagem e de interesses.
Todos estes factores levam a que o aluno sinta necessidade de acompanhamento
e orientação, que o professor nem sempre disponibiliza e a que os métodos de ensino
tradicionais nem sempre dão resposta. Entre os principais motivos que levam os alunos
a ter dificuldades e a solicitar ajuda, há que destacar os seguintes:
 incapacidade de concepção de algoritmos;
 incapacidade de detectar erros de lógica de programação;
 falta de pré-requisitos sobre as matérias em questão e de técnicas de
programação eficazes;
 conceitos errados sobre os recursos e técnicas utilizadas;
 problemas devido a efeitos colaterais não previstos;
 erros de sintaxe e advertências na compilação.
Face a todo o conjunto de problemas mencionado, surgiu a ideia de conceber um
sistema educativo capaz de auxiliar o ensino e aprendizagem de mecanismos básicos de
programação. Posteriormente colocou-se a questão sobre qual a linguagem de
programação a ensinar. Porém, havendo níveis de insucesso bastante elevados na
globalidade das linguagens, a sua escolha não é, em nossa opinião, um factor relevante
para a decisão em causa, apesar de cada linguagem ter as suas características próprias. O
que é necessário é a existência de técnicas eficazes que permitam a compreensão dos
conceitos, mecanismos e estratégias de programação em geral, pois havendo um
domínio completo neste campo, em qualquer linguagem de programação, os problemas
focados serão com certeza minorados. Contudo, como um considerável número de
estabelecimentos do ensino superior está a optar pela linguagem C em detrimento de
outras, o que também acontece nas instituições a que pertencemos (Departamento de
Engenharia Informática – Faculdade de Ciências e Tecnologia da Universidade de
Coimbra e Instituto Superior de Engenharia de Coimbra), optámos por utilizar esta
linguagem.
Análise de alternativas
Tendo em conta o que já foi referido, é feita uma breve exposição sobre
eventuais alternativas e sistemas complementares aos métodos de ensino tradicionais,
que possam apoiar o aluno no seu processo de aprendizagem de programação.
 Existência de manuais de problemas com soluções. Estes meios, apesar de
poderem constituir uma alternativa para o esclarecimento de dúvidas, sempre que o
professor não pode estar presente, apresentam a desvantagem de serem passivos e
estáticos. Além disso, ver problemas resolvidos raramente se traduz num aumento da
capacidade de solucionar outros problemas. Por vezes, basta pedir aos alunos para
resolverem um problema ligeiramente diferente ou fazer alterações ao existente para
constatar que este método é pouco eficaz.
 Aplicação de práticas de programação em equipa, permitindo que os membros
do grupo comuniquem e partilhem as suas ideias efectivamente, colaborando na
resolução do problema. A colaboração é um factor crítico para o sucesso da
aprendizagem, em especial neste tipo de matérias em que predominam conceitos
abstractos, os quais quando discutidos colectivamente poderão tornar-se mais evidentes.
Porém, esta solução pode apresentar a desvantagem de, por um lado, carecer de um
acompanhamento especializado que dirija a equipa, sem o qual poderá haver dedução de
conclusões a partir de pressupostos errados, por outro lado, se o grupo formado não for
devidamente escolhido, poderá existir um aluno com conhecimentos muito superiores
aos restantes que monopolize as actividades ficando os outros com a sua participação
reduzida à simples observação.
 Apoio por correio electrónico. Constitui uma forma para que o professor possa
estar disponível de uma forma assíncrona e distribuída. Porém, apresenta uma certa
passividade e insuficiência de informação acerca do nível de conhecimento que o
professor recebe para um bom esclarecimento da dúvida em questão, pois normalmente
não tem acesso a informação importante como o código fonte do programa ou não tem
disponibilidade para o analisar.
 Utilização de tutoriais multimedia. Têm havido algumas propostas de sistemas
de tutores multimédia, porém, pensamos que apesar de componentes deste tipo poderem
ser úteis, esta abordagem por si só não é a mais adequada, pois a programação aprendese essencialmente fazendo e não vendo como se faz. Também, o desenvolvimento de
um bom tutorial é muito caro e difícil, exigindo a participação de uma equipa
multidisciplinar. Além disso, a maioria dos tutoriais existentes requer poucas acções por
parte do aprendiz, perpetuando um método de ensino que é pouco eficiente, mas agora
em versão computacional.
 Criação de laboratórios virtuais. Esta alternativa possibilita que os alunos por
iniciativa própria experimentem e provem as suas teorias acerca do mundo real,
verificando os resultados ao aplicá-las. Porém, se por um lado esta solução é
dispendiosa, quer do ponto de vista do desenvolvimento do software, quer em termos de
exigências de grande poder computacional, recursos gráficos e sonoros, por outro, torna
difícil a sua concretização em áreas como a programação, provavelmente devido ao
facto de serem abstractas e difíceis de representar de uma forma física e visual, não
existindo muitos trabalhos avançados nesta área.
 Ajuda on-line, hipertexto, hipermedia e/ou aprendizagem através da WEB.
Com o desenvolvimento e aperfeiçoamento dos interfaces gráficos com o utilizador,
surgiram uma série de sistemas de ajuda on-line, permitindo a navegação de uma forma
não linear, tornando a pesquisa do utilizador mais eficiente. Porém esta alternativa
apresenta as desvantagens de o aluno se poder perder com o excesso de informação,
para além de ser um sistema que não se pode adaptar para mostrar informação ao aluno
de acordo com o seu desempenho, não reconhece padrões de conhecimento, nem toma a
iniciativa de dar recomendações ao aluno, indicando apenas um resultado como resposta
às suas acções. Esta alternativa pode ajudar a resolver muitos dos problemas focados se
funcionar como um sistema complementar e não como um sistema principal.
 Sistemas de Tutores Inteligentes. Estes sistemas quando bem concebidos
poderiam ser altamente eficazes como ajuda na aprendizagem, permitindo simular ou
substituir as funções de auxiliares humanos. Porém, muitos deles apresentam alguma
falta de profundidade na representação do conteúdo e nos aspectos pedagógicos. Na
realidade, existem pouquíssimos sistemas deste tipo para avaliação, na medida em que
são muito difíceis e dispendiosos de construir.
 Jogos educacionais. A pedagogia subjacente nesta abordagem é a da
exploração auto-dirigida em vez do ensino explícito e directo. Os proponentes desta
filosofia de ensino defendem a ideia de que o aluno aprende melhor quando é livre para
descobrir as relações entre os objectos por si próprio do que quando explicitamente
ensinado, em especial se se encontrar num ambiente atraente que estimule a sua
curiosidade. Porém, esta solução só é eficaz se tiver sempre presente um compromisso
entre dois objectivos, o entretenimento e a aprendizagem das matérias em questão.
Perante este conjunto de situações parece-nos que a proposta mais credível vai
para a criação de uma ferramenta automatizada híbrida, reunindo várias características
das alternativas apresentadas, capaz de assistir o aluno, apoiando as actividades de
supervisão habitualmente conferidas ao professor, de detectar as partes não entendidas e
assimiladas pelo aluno, bem como os problemas que ele pessoalmente enfrenta na
aprendizagem de determinada linguagem. O sistema a desenvolver terá ainda um
conjunto de materiais multimédia que utilizem métodos dinâmicos, como a animação,
simulação e o uso interactivo de múltiplas representações algoritmicas.
Estado da arte
O ensino das linguagens de programação usando sistemas assistidos por
computador tem sido usado desde os finais dos anos 70. Vários sistemas têm sido
construídos usando diversas técnicas pedagógicas bem como de Inteligência Artificial.
Existem diversas aplicações desde sistemas de tutores inteligentes, sistemas adaptativos,
ambientes de aprendizagem a sub-linguagens dedicados aos mais variados domínios.
Com aplicação no ensino de linguagens de programação destacam-se os seguintes meios
automatizados: PMS (Tomek, 1985), PROUST (Johnson et al., 1985), VIP (Mendes,
1987), COACH, (Selker, 1989), Lisp-Tutor (Anderson et al., 1990), ADAPT (GeggHarrison, 1992), Ceilidh (Benford, 1993), G2 (Geoffrey e Geoffrey, 1994), TurtleGraph
(Jehng, 1994), C-Tutor (Song et al., 1996), Programação Assistida por Computador
(Santos, 1996), MRUDS (Hanciles et al., 1997).
Outros exemplos de aplicações nesta área são os micro-mundos, seriamente
influenciados pelos gráficos da tartaruga do LOGO (Papert, 1980). O LOGO não foi
concebido especificamente com o propósito de ensinar programação, mas o
“subconjunto da tartaruga” surge como sendo um bom instrumento para introduzir
conceitos de programação a alunos sem qualquer experiência neste domínio. Como
exemplos típicos de micro-mundos com aplicações na área de programação destacamse, entre outros: “Karel the robot” (Pattis, 1981), “Josef the robot “, (Tomek, 1982),
Martino, (Olimpo et al., 1985), Marta (Calabrese, 1989), Turingal (Brusilovsky, 1991),
Karel-3D (Hvoreky, 1992), Darel (Kay e Tyler, 1993), “Karel Genie” (Miller et al.,
1994), Wayfarer (Kouchnirenko e Kouchnirenko, 1988), Tortoise (Brusilovsky, 1994),
referidos em (Brusilovsky et al, 1997).
Mas, com um conjunto tão vasto de alternativas porquê criar mais uma? Na
realidade, muitas destas soluções foram construídas no âmbito de projectos académicos,
não se encontrando disponíveis para avaliação e experimentação. Também o facto de a
maioria delas apresentar um interface em inglês faz com que não se adequem ao caso
pretendido, traduzindo-se numa dificuldade acrescida para o público alvo em questão.
Além disso, há ainda a referir que muitas destas aplicações foram construídas com
algumas limitações essencialmente a nível de hardware e características gráficas que
hoje em dia é possível ultrapassar, possibilitando a construção de uma ferramenta mais
apelativa e motivadora.
Programa em desenvolvimento
Características
A alternativa em desenvolvimento foi pensada e projectada atendendo aos
seguintes aspectos:
 Disponibilidade. Para que seja acessível ao aluno, durante o maior período de
tempo possível, sem as limitações de tempo que um professor normalmente apresenta;
 Portabilidade. Para que seja facilmente transportável, de tal forma que o aluno
a possa aceder em qualquer lugar onde esteja a desempenhar a sua prática de
programação;
 Custo. De forma a não envolver custos elevados ao nível de software e
hardware, para poder atingir um elevado número de alunos;
 Funcionalidade. A aplicação construída deve ser configurável, a fim de
permitir a adição, remoção e alteração dos exemplos e exercícios propostos, sem que
isso implique qualquer alteração no código do sistema;
 Adaptabilidade. Para que seja facilmente ajustável aos diferentes perfis dos
alunos que a vão utilizar;
 Retroação. De forma a apresentar uma capacidade de resposta imediata, não
apenas positiva mas também negativa, para com o aluno no momento da programação.
Positiva, porque é fundamental fomentar a autoconfiança do aluno. Negativa, para evitar
a edificação de novos conceitos sobre bases incorrectas;
 Poder. Para que dê ao aprendiz uma sensação de domínio e controlo dos
projectos que desenvolve e que, de outra forma, não desenvolveria, aumentando assim a
sua auto-estima;
 Simplicidade. O material apresentado deve ser simples de utilizar, óbvio e
intuitivo, exigindo pouco tempo de aprendizagem, para que o aluno não fique
desencorajado à partida. Porém, isto não significa que o ambiente criado não deva ser
rico e poderoso, pois os iniciados em determinada matéria necessitam de sistemas
persuasivos e sofisticados e não de sistemas simplistas como a maioria das vezes se
pensa;
 Visualização. Uma das características mais importantes a ter em conta na
construção de uma aplicação deste tipo é a capacidade de visualização dos algoritmos
construídos e a sua simulação, dando ao aprendiz uma panorâmica sobre as várias fases
e entidades envolvidas no algoritmo em causa;
 Animação. Para que a visualização do algoritmo expresse as ideias e transmita
a informação nele presente com mais vivacidade e entusiasmo, facilitando a apreensão
dos conceitos. Porém, esta animação deve ser clara, atractiva e poderosa mas não
exagerada para não gerar confusão visual;
 Representações alternativas. Aliada à característica de visualização é desejável
que haja mais do que uma representação alternativa para cada algoritmo, de forma a
possibilitar ao aluno diferentes perspectivas e soluções para os mesmos conceitos ou
ideias;
 Interactividade. É desejável que a aplicação seja dinâmica permitindo ao aluno
interactuar, controlar e desempenhar um papel activo na animação do algoritmo.
Descrição
O programa educativo destinar-se-á a apoiar a aprendizagem de estratégias e
mecanismos básicos de construção de algoritmos para resolver problemas de
programação, dando especial ênfase à utilização de estruturas de selecção e repetição.
O programa utilizará um interface simples e intuitivo, recorrendo a múltiplos
meios para a comunicação com o utilizador.
A primeira etapa consiste na identificação do aluno perante o sistema, para que
seja possível armazenar a sua actividade. A informação a registar será essencialmente a
referente às mensagens de erro enviadas pelo sistema ao utilizador, os pedidos de ajuda
por ele solicitados e os exercícios bem resolvidos ou falhados. Assim, será possível
monitorizar o progresso de cada aluno, avaliando a sua aprendizagem.
Durante o desenrolar das suas actividades, o aluno visualizará dois tipos de
cenários, consoante pretenda resolver/alterar ou executar/simular um algoritmo. Assim,
a primeira situação é constituída essencialmente pelo módulo “escrita/alteração do
código”. Neste, o utilizador constrói/altera o código de determinado problema. A
resolução de um problema por parte do utilizador é feita de uma forma interactiva sendo
questionado sobre a generalidade das informações necessárias à sua realização. Ainda
para facilitar as suas tarefas, parte da informação, como por exemplo tipos de variáveis
ou estruturas de controlo, é-lhe disponibilizada limitando-se o aluno a seleccionar o
pretendido, exigindo pouca memorização e permitindo uma apreensão intuitiva e
gradual da sintaxe da linguagem.
Sempre que o aluno pretender simular um determinado algoritmo visualizará os
seguintes módulos, perfeitamente sincronizados:
Módulo “evolução do código”. Consistirá numa zona onde reside o código de
determinado programa, sendo salientada a estrutura de controlo activa e a linha de
código dentro desta.
Módulo “animações algoritmicas”. A ideia patente neste módulo consiste em
usar uma das várias representações alternativas para a simulação e compreensão do
algoritmo. Assim, existe uma transformação dinâmica da informação escrita no código
em representações gráficas animadas, demonstrando a evolução das diversas entidades
presentes nesse mesmo algoritmo.
Durante toda a sessão de trabalho do utilizador é gerado continuamente feedback
sendo comentadas as acções do utilizador, denunciando não apenas o que está mal,
informando sobre a origem do erro, mas também gerando informação que estimule e
reforce as atitudes do aluno.
É ainda dada ao utilizador a possibilidade de não só obter mais informação sobre
os conceitos teóricos subjacentes, mas também de conhecer o sistema através de uma
pequena exemplificação das suas potencialidades.
Conclusão
Esta comunicação apresenta em linhas gerais uma proposta que visa dar resposta
aos problemas sentidos pelos alunos na aprendizagem de uma linguagem de
programação, em especial à sua incapacidade de concepção e compreensão de
algoritmos.
Este sistema apresenta a vantagem de permitir quer ao professor quer ao aluno
simular de uma forma animada, através de diversas representações alternativas, um
determinado programa o número de vezes que for desejado. Em particular, permitirá ao
próprio professor, despendendo pouco tempo, modificar o programa de forma a
responder às dúvidas colocadas pelos alunos, ou ainda exemplificar outras versões do
mesmo de uma forma rápida. Também os alunos poderão visitar os diversos módulos do
programa, o número de vezes que entenderem, até haver um domínio completo dos
conceitos em jogo, avançando ao seu próprio ritmo e segundo a sua própria
disponibilidade.
Neste momento ainda não é possível prever qual o impacto deste produto no
processo de ensino/aprendizagem, pois encontra-se em desenvolvimento, no entanto
espera-se que seja do agrado de alunos e professores.
Agradecimentos
Os autores agradecem ao Centro de Informática e Sistemas da Universidade de
Coimbra e ao Instituto Superior de Engenharia de Coimbra pelas facilidades concedidas.
Referências
Anderson, J., Boyle, C., Cobbert, A. e Lewis, W. (1990). Cognitive modeling and
intelligent tutoring. Artificial Intelligence, 42, 7-50.
Bental, D. (1995). Why doesn’t my program work? Requirements for automated
analysis of novices computer programs. Disponível em
http://www.cs.mdx.ac.uk/staffpages.Dbental/aiedpaper.html.
Brusilovsky, P., Calabrese, E., Hvorecky, J., Kouchnirenko, A. e Miller, P. (1997) Minilanguages: a way to learn programming principles. Education and Information
Technologies, 2, 65-83.
Ellis, G. eLund, G. G2- A design language to help novice C programmers. Disponível
em http://www2.ulst.ac.uk/misc/cticomp/gpellis.html.
Fix, V. e Wiedenbeck, S. (1996). An intelligent tool to aid students in learning second
and subsequent programming languages. Computers Education, 27 (2), 71-83.
Hanciles, B., Shankararaman, V. e Munoz, J. (1997). Multiple representation for
understanding data structures. Computers Education, 29 (1), 1-11.
Jihn-Chang, J., Shih, Y., Liang, S. e Chan, T. (1994). Turtle-Graph: A computer
Supported Cooperative learning envoronment. Proceedings of ED-MEDIA’94,
293-298.
Johnson, J., Lewis, W., Soloway, W. e Elliot, J. (1985). PROUST: An automatic
debugger for Pascal programs. BYTE. Abril 1985, 179-190.
Johnson, W. (1990). Understanding and debugging novice programs. Artificial
Intelligence, 42, 51-97.
Mendes, A. J. Mendes, T. (1988). VIP – A Tool to VIsualize programming exemples.
Education and Aplication of Computer Technology, 131-140.
Santos, C., Borges, A., Ferrari, A. e Ramos, F. (1996). Programação Assistida por
computador:a experiência na Universidade de Aveiro. 1º Simpósio Investigação e
Desenvolvimento de Software Educativo. Costa da Caparica.
Selker, T. (1994). COACH: A teaching Agent that learns. Comunications of the ACM,
37 (7), 92-99.
Song, J., Hahn, S., Tak, K. e Kim, J. (1997). An intelligent tutoring system for
introductory C language course. Computers Education, 28 (2), 93-102.
Tomek, I., Muldner, T. e Khan, S. (1985). PMS – A program to make learning Pascal
easier. Computers and Education, 9(4), 205-211.
Download