Ambiente para Assistência à Aprendizagem de Programação Baseado em Padrões Pedagógicos Carlos Henrique J. S. Oliveira1, Renan R. Greghi1 e Edson P. Pimentel1 1 Universidade Municipal de São Caetano do Sul (USCS) Av. Goiás, 3400 – 09550-051 – São Caetano do Sul - SP [email protected], [email protected], [email protected] Abstract. Difficulties in learning programming can be diagnosed by the high degree of disapproval of students in introductory courses. This reflects also in advanced disciplines that require this pre-requisite. Some studies show that expert programmers create patterns to solve problems and when they face a new problem recall this solution making it easier. Novice programmers do not have this programming library in their minds. This work aims to present the prototype of a tool to to assist the student in learning programming based on from pedagogical patterns. Keywords: Learning Programming, Pedagogical Patterns. Resumo. As dificuldades no aprendizado de programação podem ser diagnosticadas pelo alto grau de reprovação dos estudantes em disciplinas introdutórias. Isto se reflete também em disciplinas avançadas que exigem este pré-requisito. Alguns estudos apontam evidências de que programadores experientes criam padrões de soluções de problemas e depois os relacionam a um novo problema, tornando a resolução do mesmo mais fácil. Os aprendizes iniciantes em programação não possuem essa biblioteca de programação em suas mentes. Este trabalho tem por objetivo apresentar o protótipo de uma ferramenta para dar assistência ao estudante na aprendizagem de programação baseada em padrões pedagógicos. Palavras-Chave: Aprendizagem de Programação, Padrões Pedagógicos. 1. Introdução As problemáticas e dificuldades pertinentes ao aprendizado de programação, principalmente nas disciplinas introdutórias dos cursos de Computação e Informática, constituem um desafio para os docentes. As dificuldades encontradas podem ser diagnosticadas não somente pelo alto grau de repetência, mas também pelos problemas demonstrados pelos estudantes em disciplinas avançadas que exigem o pré-requisito de programação [Rocha, 1991; Gomes e Mendes, 2000]. Outro dado que pode ser observado é que diversos alunos que são reprovados em disciplinas introdutórias de programação tendem a reprovar uma segunda vez, repetindo o insucesso em disciplinas avançadas. Aprender a programar constitui uma tarefa complexa que inclui, entre outras coisas, adquirir habilidade para resolução de problemas, aprender a sintaxe e a semântica de uma linguagem de programação, utilizar um ambiente de programação e realizar testes e depuração de programas [Weber, 1996]. Cada uma destas atividades envolve certo grau de dificuldade. É preciso, portanto, identificar exatamente em quais delas existem “lacunas” que impedem ou dificultam o aprendizado dos discentes. Da mesma forma, as atividades de aprendizado através da realização de exercícios devem levar isto em conta, ou seja, subdividir e classificar os diversos tipos de problemas e guiar o aprendiz na sua realização. Muitas vezes, o aprendiz não resolve um problema de programação porque não consegue identificar os componentes necessários para a sua solução, ou seja, o aprendiz consegue resolver partes isoladamente porém não obtém sucesso quando necessita conectar estas partes para resolver um problema mais complexo. Nos estudos de Johnson e Soloway (1984) são apontadas evidências de que programadores experientes armazenam e recuperam experiências passadas, ou seja, eles criam padrões de soluções de problemas, e depois os relacionam a um novo problema adaptando-os à situação atual, tornando a resolução do mesmo mais fácil. No entanto os aprendizes que não têm nenhuma experiência real de programação em mente, não possuem essa “biblioteca”, portanto só podem recorrer a sentenças da linguagem que aprenderam. Baseado nessas observações fica evidente que a utilização de um modelo que consista em padrões para instrução em programação traz benefícios, pois o processo de reconhecimento de padrões compara experiências passadas com a situação atual de resolução de problemas. Este trabalho tem por objetivo apresentar o protótipo de uma ferramenta para assistência ao aluno na resolução de exercícios de lógica de programação com base em padrões pedagógicos. A ferramenta desenvolvida atua como assistente do estudante, guiando-o na resolução dos exercícios, em caso de necessidade. Ressalta-se que a decisão de requisitar ajuda é do estudante e que esta ajuda baseia-se no uso de templates (modelos) para resolução dos exercícios. O artigo está organizado como segue: a seção 2 descreve o cenário do Ensino de Progrmação. Na seção 3 os conceitos e aplicações dos padrões pedagógicos são relacionados. A seção 4 apresenta detalhes da ferramenta proposta nesse trabalho. implementação e funcionamento. Por fim, na seção 4 são apresentadas as considerações finais e a proposição de trabalhos futuros. 2. Ensino de Programação O ensino das linguagens de programação de computadores tem por objetivo capacitar os alunos a desenvolver programas e sistemas computadorizados que objetivam a resolução de problemas. Entretanto aprender a programar não é fácil e isto se reflete nos baixos níveis de assimilação experimentados por muitos alunos nos cursos de programação introdutórios [du Boulay, 1986]. Os problemas enfrentados pelos alunos no aprendizado de programação têm preocupado os educadores da área. Na prática, muitos alunos ainda acham que o processo de aprendizagem de programação é difícil [Garner, 2000]. Mendes [2001] cita algumas causas destas dificuldades, entre as quais se destacam: Elevado nível de abstração envolvido; Metodologias tradicionais de ensino, que privilegiam a aprendizagem de conceitos dinâmicos utilizando principalmente abordagens e materiais de natureza estática; Existência de turmas com backgrounds diversificados acerca das matérias em questão, traduzindo-se em ritmos de aprendizagem muito diferenciados; Impossibilidade de um acompanhamento individualizado do aluno, etc. Estes fatores podem levar o estudante de programação, principalmente em disciplinas introdutórias a sentir a necessidade de um acompanhamento e orientação que o professor nem sempre disponibiliza e que os métodos de ensino tradicionais nem sempre dão resposta. Entre os principais motivos que podem levar o aluno a ter dificuldade e precisar de ajuda, destacam-se: erros de sintaxe e semântica, dificuldades na compreensão do enunciado dos problemas e na concepção de algoritmos, incapacidade de detectar erros de lógica de programação e falta de pré-requisitos sobre matérias em questão e de técnicas de programação eficazes [Gomes e Mendes, 2000]. Ferramentas como, por exemplo, C-Tutor [Song et al., 1997] e SICAS [Gomes e Mendes, 2000] foram desenvolvidas com o propósito de facilitar o aprendizado de lógica e linguagens de programação. Segundo Barros e Delgado (2006), tas ferramentas devem permitir ao estudante adquirir melhor, e mais rapidamente, as habilidades necessárias para programação. As ferramentas podem ser classificadas em: (a) ambientes integrados de programação; (b) editores avançados de programas; (c) compiladores e (d) depuradores automáticos. 3. Padrões Pedagógicos de Programação Padrões são projetados para capturar a melhor prática num domínio especifico. Padrões pedagógicos tentam capturar o conhecimento do especialista na prática do ensinoaprendizagem. A intenção é capturar a essência da prática numa forma compacta que possa facilmente ser comunicada àqueles que necessitam do conhecimento [BERGIN, 2005). Diversas experiências em “padrões pedagógicos” têm sido realizadas nos mais diversos domínios de conhecimento. Mais recentemente, a área de Padrões Pedagógicos tem documentado os chamados padrões elementares (elementary patterns) para ensinar programação orientada a objetos e outros paradigmas de linguagens, tais como programação procedimental e funcional. Esses padrões buscam capturar o conhecimento de programação fundamentado sobre padrões mais avançados que correspondem ao tipo de conhecimento que programadores especialistas têm e usam de forma subconsciente [Wallingford, 2002]. Segundo Delgado (2004) esses padrões são uma forma de resolver problemas comuns em formatos que facilite a sua reutilização. Para isso o enfoque é mostrar aos aprendizes partes pequenas dos programas, ou seja, dividir os problemas em partes menores ao invés de esperar que sejam escritos os programas a partir de um fonte vazio. Johnson e Soloway (1984) propuseram o tutor PROUST desenvolvido com base na teoria da psicologia do processo de programação. O sistema PROUST decompõe objetivos de problemas de forma hierárquica através dos planos, conforme figura 1. Figura 1: Decomposição de objetivos - adaptado de Johnson e Soloway (1984) Os padrões pedagógicos estão de acordo com o paradigma construtivista de aprendizagem. O construtivismo é uma abordagem pedagógica que estimula o aluno a aprender (Bédard, 1998). Esta se baseia numa ação em que o professor ajuda na resolução do problema através de tutoriais ou templates, ou seja, induz o aluno a “aprender a aprender” através da busca orientada do conhecimento que o aluno necessita. É uma oportunidade que o aluno pode desenvolver a sua indução na solução de problemas mais complexos. A figura 2 mostra um exemplo de padrão pedagógico do domínio de programação. O “comando while” pode ser usado em muitas soluções de problemas que envolvem repetição com uma condição de parada simples ou composta (sentinela). Figura 2 – Exemplo de Padrão Pedagógico (Repetição com sentinela) Na mesma concepção proposta nesse trabalho, ou seja, o uso de padrões, Barros e Delgado (2006) apresentam o PROPAT, um Ambiente Integrado de Desenvolvimento (IDE) para cursos de Introdução à Programação que contém duas perspectivas: a do aluno (figura 3) em que o mesmo pode escolher exercícios e programar livremente ou por meio da seleção e inserção de padrões, e a perspectiva do professor usada para que este especifique novos exercícios e padrões Figura 3 – Ambiente de Programação PROPAT - Barros e Delgado (2006) 4. Ferramenta para Assistência baseada em Padrões A ferramenta SELP – Sistema para o Ensino de Lógica de Programação, descrita a seguir, é composta de diversos módulos, dentre os quais se destacam: o módulo de cadastro de templates , o módulo de cadastro de enunciado e o módulo de resolução que possui as opções “passo a passo” e livre. Figura 4 – Tela de Cadastro de Templates 4.1. Módulo de Cadastro de Template Neste módulo cadastra-se a estrutura básica dos componentes que poderão ser utilizados na resolução de um problema de programação. A figura 4 apresenta um exemplo disso: Por exemplo, o primeiro template denominado de “Declaração de Variáveis” possui a seguinte estrutura: [nome] [tipo]. Os termos entre colchetes devem ser substituídos de acordo com a solução necessária. 4.2. Módulo de Cadastro de Enunciado Neste módulo o professor deve cadastrar o enunciado que irá propor a sua respectiva turma, conforme Figura 5.. É obrigatório o cadastramento de uma solução para o enunciado mesmo que está esteja em branco. O enunciado deverá ser relacionado ao código de um Template e este deve ser previamente cadastrado. Figura 5 – Tela de Cadastro de Enunciado 4.3. Módulo de Resolução No ato da resolução, de acordo com a configuração do exercício realizada pelo professor, o estudante poderá escolher realizar a solução guiada, com o uso dos templates, ou a solução livre. Figura 6 – Tela de Resolução Guiada (passo a passo) Na resolução passo a passo será exibido ao aluno o padrão de solução cadastrado pelo professor. Além disso, o estudante pode ainda solicitar ajuda através de exemplos ao clicar no botão “Help”. A figura 6 apresenta a tela de solução guiada. Ao optar pela solução em modo livre o estudante construirá a solução a partir de uma tela vazia, conforme esquema da figura 7. Ainda assim o estudante poderá consultar os exemplos quando sentir necessidade. Figura 7 – Tela de Resolução Livre 4.4 Testes Preliminares Alguns testes preliminares foram efetuados para verificar a eficácia da ferramenta. Nesse cenário de simulação uma professor efetuou a criação de exercícios na ferramenta com o uso de templates e dois estudantes realizaram testes de resolução. O feedback coletado nesses testes foram mais relativos à interface do que propriamente aos efeitos de aprendizagem. Outros testes já estão sendo programados tanto com estudantes novatos em programação e também com estudantes que possuem dependência em disciplinas introdutórias de programação. 6. Considerações Finais e Trabalhos Futuros O Ensino de Programação carece de recursos didáticos variados que sejam adequados aos estudantes que demonstram dificuldades. Mesmo com a existência de diversas ferramentas para apoiar esta área, os insucessos dos estudantes continuam sendo contabilizados. Esse artigo apresentou o protótipo de uma ferramenta para assistência ao aluno na resolução de exercícios de lógica de programação com base em padrões pedagógicos. A ferramenta desenvolvida atua como assistente do estudante, guiando-o na resolução dos exercícios, em caso de necessidade. Ressalta-se que a decisão de requisitar ajuda é do estudante e que esta ajuda baseia-se no uso de templates (modelos) para resolução dos exercícios. Os seguintes aprofundamentos são necessários: registro estruturado do percurso do estudante na resolução do exercício através de logs e readequação do cadastramento dos templates para fins de reuso dos mesmos. Além disso, faz-se necessário a realização de estudos de casos reais envolvendo aprendizes de programação e a análise profunda desses dados para mensurar a eficácia da ferramenta. Referências Bédard, Roger. Construtivismo e Formação a Distância. In: Tecnologia Educacional (Rev) N 140, Pag 03-09, ABT, Rio de Janeiro, 1998 Bergin, Joseph et al. The Pedagogical Patterns Project. http://www.pedagogicalpatterns.org/. Acesso em 27 out. 2005. Disponível em: du Boulay, J. B. H. (1986) Some Difficulties of learning to program. In: Journal of Educational Computing Research, 2(1):57-73. Barros, L. N. ; Delgado, K. V. . Aprendizado de Programação. In: WEI l XIV Workshop sobre Educação em Computação, 2006, Campo Grande, MS. Anais do XXVI Congresso da SBC, 2006. p. 31-40. Delgado, K. V. (2005). Diagnostico Baseado em Modelos num Sistema Tutor Inteligente para Programação com Padrões Pedagógicos. Dissertação de Mestrado, IME - USP. Fricke, A e Völter, M. A Pedagogical Pattern Language about teaching seminars effectively, July 2000. Giraffa L. M. M. Seleção e adoção de Estratégias de Ensino em Sistemas Tutores Inteligentes. Porto Alegre: CPGCC/UFRGS, 1997. Gomes, A. e Mendes, A. Suporte à aprendizagem da programação com o ambiente SICAS. Actas do V Congresso Ibero-Americano de Informática Educativa, Viña del Mar, 2000. Gonçalves, Ana Angélica M. R.. Formação de professores mediada por tecnologia, p. 62-81, 2003. Johnson, W. L. e Soloway, E. Proust: Knowledge-based program understanding. In In Proceedings of the 7th international conference on Software engineering, Florida, United States, pages 369 – 380, 1984. Leite, A. de Sá. Um Modelo de Sistema Educativo Cognitivista Baseado em Tutoria Inteligente Adaptativa Via Aderência Conceitual. Tese de Doutorado. São José dos Campos: Instituto Tecnológico da Aeronáutica. 1999. Mendes, A. J. N. (2001) Software Educativo para Apoio à Aprendizagem de Programação. http://www.c5.cl/ieinvestiga/actas/tise01/pags/charlas/index.htm. Rocha, Helena. V. Representações Computacionais Auxiliares ao Entendimento de Conceitos de Programação. Unicamp. 1991. Song, J. S., Hahn, S. H., Tak, K. Y. e Kim, J. H. (1997) An Intelligent Tutoring System for Introductory C Language Course. Computers Education. Vol 28 No. 2. Tobar, C. M. et al. (2001). Uma Arquitetura de Ambiente Colaborativo para o Aprendizado de Programação. XII Simpósio Brasileiro de Informática na Educação, Vitória - ES. Wallingford, E. (2001). The elementary patterns home page. Disponível em: http://www.cs.uni.edu/~wallingf/patterns/elementary/. Acesso em 15/09/2008. Weber, G.; Brusilovsky, M.S.; Steinle, F. (1996). ELM-ART: An Intelligent Learning Environment for Programming. Lecture Notes in Computer Science Wenger, E. Artificial intelligence and tutoring systems: computational and cognitive approaches to the communication of knowledge. Morgan Kaufmann Publishers Inc, 1987.