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.