• Nenhum resultado encontrado

Hello, world: uma análise sobre dificuldades no ensino e na aprendizagem de introdução à programação nas universidades

N/A
N/A
Protected

Academic year: 2021

Share "Hello, world: uma análise sobre dificuldades no ensino e na aprendizagem de introdução à programação nas universidades"

Copied!
193
0
0

Texto

(1)

Pós-Graduação em Ciência da Computação

RODRIGO PESSOA MEDEIROS

HELLO, WORLD: UMA ANÁLISE SOBRE DIFICULDADES NO ENSINO E NA APRENDIZAGEM DE INTRODUÇÃO À

PROGRAMAÇÃO NAS UNIVERSIDADES

Universidade Federal de Pernambuco posgraduacao@cin.ufpe.br www.cin.ufpe.br/~posgraduacao

Recife 2019

(2)

RODRIGO PESSOA MEDEIROS

HELLO, WORLD: UMA ANÁLISE SOBRE DIFICULDADES NO ENSINO E NA APRENDIZAGEM DE INTRODUÇÃO À PROGRAMAÇÃO NAS UNIVERSIDADES

Tese apresentada ao Programa de Pós-Graduação em Ciências da Computação da Universidade Federal de Pernambuco, como requisito parcial para a obtenção do título de Doutor em Ciências da Computação.

Área de concentração: Mídia e Interação. Orientador: Prof. Dr. Geber Lisboa Ramalho.

Co-Orientadora: Prof. Dra. Taciana Pontual da Rocha Falcão.

Recife 2019

(3)

Catalogação na fonte

Bibliotecária Monick Raquel Silvestre da S. Portes, CRB4-1217

M488h Medeiros, Rodrigo Pessoa

Hello, world: uma análise sobre dificuldades no ensino e na aprendizagem de introdução à programação nas universidades / Rodrigo Pessoa Medeiros. – 2019.

192 f.: il., fig., tab.

Orientador: Geber Lisboa Ramalho.

Tese (Doutorado) – Universidade Federal de Pernambuco. CIn, Ciência da Computação, Recife, 2019.

Inclui referências e apêndices.

1. Ciência da computação. 2. Mídia e interação. 3. Introdução à programação. I. Ramalho, Geber Lisboa (orientador). II. Título.

004 CDD (23. ed.) UFPE- MEI 2019-107

(4)

“Hello, World! ”: Uma análise sobre dificuldades no ensino e

na aprendizagem de introdução à programação nas universidades”

Tese de Doutorado apresentada ao Programa de Pós-Graduação em Ciência da Computação da Universidade Federal de Pernambuco, como requisito parcial para a obtenção do título de Doutor em Ciência da Computação.

Aprovado em: 18/02/2019.

______________________________________________ Orientador: Prof. Dr. Geber Lisboa Ramalho

BANCA EXAMINADORA

_________________________________________________ Profa. Dra. Patricia Cabral de Azevedo Restelli Tedesco

Centro de Informática/ UFPE

_________________________________________________ Profa. Dra. Simone Cristiane dos Santos

Centro de Informática / UFPE

_________________________________________________ Prof. Dr. Giordano Ribeiro Eulalio Cabral

Centro de Informática / UFPE

_________________________________________________ Prof. Dr. Eduardo Henrique da Silva Aranha

Departamento de Informática e Matemática Aplicada/UFRN

_________________________________________________ Profa. Dra. Maria Auxiliadora Soares Padilha

(5)
(6)

AGRADECIMENTOS

Agradeço a Constância, pela paciência, generosidade e compreensão em todos momentos que estive ausente nos últimos anos dedicado a este trabalho. Você mudou a forma como vejo o mundo. Não poderia deixar de mencionar nossos filhos: Yoko, Buda e Napoleão, sempre companheiros e trelosos. Faço um agradecimento especial aos meus pais, Fernando e Mita, que sempre me apoiaram nos desafios acadêmicos. Muito obrigado pelo amor, carinho, dedicação e pelas mensagens de incentivo nos momentos mais delicados. Estendo essa mensagem a Hélio e Davi. Deixo meu agradecimento a minha família agregada: Farias, Ana Clara, Mariente, Cassandra, Luís, Marinho, Amaro, Mércia, João, Pedro, João Henrique, Priscila, Amélia, Sérgio e Pedro Monteiro.

Nesse trabalho tive a orientação sempre precisa e genial do professor Geber Ramalho que me acolheu desde o primeiro momento no Centro de Informática. Obrigado pela paciência, generosidade e dedicação com esse trabalho. Preciso fazer um agradecimento a minha co-orientadora Taciana Pontual que abraçou a ideia dessa tese e me guiou nos momentos de maior desespero na execução desse trabalho. Obrigado pela paciência e pelas conversas que tornaram esse trabalho mais completo. Não poderia deixar de agradecer ao MusTIC e ao professor Giordano Cabral pelas dicas na fase inicial desse trabalho. Em particular, agradeço a Ricardo Scholz, pelas revisões e conversas. Estendo meus agradecimentos a Filipe Calegário, Jeraman, Ricardo Brazileiro, Jarbinhas, João Tragtemberg e Eduardo, o trabalho de vocês me inspira. E a Tancicleide, Viviane, Tatyane e Fernanda do grupo de pesquisa da professora Patricia Tedesco.

Agradeço ao Instituto Federal da Paraíba, em particular aos professores Licio Romero, Turla Alquete, Rafael Efrem, Renata Cadena, Daniel Lourenço e os docentes que fazem parte e passaram pelo curso Superior em Design Gráfico do campus Cabedelo, pela compreensão, apoio e flexibilidade durante todo o período em que estive vinculado ao Programa de Pós-Graduação em Ciências da Computação do Centro de Informática da UFPE. Agradeço aos professores que participaram da minha banca de qualificação, André Neves, Verônica Teichrieb e Patrícia Tedesco, que tiveram papel fundamental no encaminhamento teórico desse trabalho. Por fim, faço um agradecimento também aos funcionários do Centro de Informática da Universidade Federal de Pernambuco, por se dedicarem ao funcionamento do PPG-CC/UFPE.

(7)

RESUMO

Disciplinas de introdução à programação fazem parte de currículos de vários cursos de graduação, particularmente em Ciência, Tecnologia, Engenharia e Matemática - STEM. Tais disciplinas cobrem habilidades e conceitos que são importantes para a formação básica dos alunos. Entretanto, as taxas de evasão e retenção das disciplinas de introdução à programação ainda são altas, apesar dos avanços nos métodos e ferramentas para o ensino e aprendizagem de introdução à programação, bem como da integração gradual dos fundamentos de programação nos currículos do ensino básico. A literatura internacional sobre ensino e aprendizagem de introdução à programação ainda diverge no diagnóstico dos problemas, e apresenta reflexões sobre os mesmos de forma pouco sistemática e rigorosa. Nesse contexto, o objetivo desta tese se pauta em promover um melhor entendimento dos problemas e desafios de ensino e aprendizagem nas disciplinas de introdução à programação em nível universitário. Para traçar esse diagnóstico, realizamos três estudos complementares. O primeiro foi uma revisão sistemática da literatura sobre ensino e aprendizagem de introdução à programação escrita em inglês entre 2010 e 2016. O segundo foi uma revisão sistemática da literatura brasileira englobando o mesmo período. Por fim, o terceiro estudo foi uma pesquisa realizada com docentes de cursos de STEM em universidades brasileiras, sobre a percepção e utilização dos métodos de ensino não-tradicionais em sala de aula, incluindo dificuldades e os benefícios. A primeira contribuição dessa tese é o conjunto de achados inéditos que os três estudos forneceram. Desses temas, três merecem destaque: (a) a resolução de problemas em programação; (b) a necessidade de métodos e ferramentas de ensino mais adequados e específicos para as etapas de formulação de problemas e expressão da solução; e (c) as dificuldades decorrentes da deficiência dos conhecimentos prévios dos alunos em matemática e nas línguas maternas. A segunda contribuição adveio como efeito colateral dos estudos apresentados, onde as categorias criadas formaram um esboço de taxonomia que não tinha sido dado na literatura. A terceira contribuição são os resultados da pesquisa realizada com os docentes de universidades brasileiras dos cursos STEM, principalmente a baixa adesão na utilização de métodos não-tradicionais de ensino em sala de aula. Esta tese procura demonstrar que não adianta propor novas ferramentas e métodos de ensino para introdução à programação sem entender os problemas. Essa era uma

(8)

hipótese deste trabalho, mas a pesquisa reforçou a necessidade de entender melhor os problemas, os conceitos e melhorar os métodos de avaliação dos experimentos realizados na área de Educação em Computação relacionados ao ensino e aprendizagem de introdução à programação.

Palavras-chave: Introdução à programação. Educação em Computação. Ensino e aprendizagem de programação. Método de ensino.

(9)

ABSTRACT

Introductory programming courses are part of the curricula of several undergraduate degrees — particularly in Science, Technology, Engineering, and Mathematics (STEM) — and provide central skills and concepts for the training of students in these fields. However, dropout and retention rates for introductory programming are still high, despite pedagogical advances such as new methods to teach programming and the increasing integration of fundamental notions of programming into primary education. The international literature on the teaching and learning of programming to novices has no clear answer regarding the causes of this problem and does not explore it systematically and rigorously. Addressing this issue, the present thesis advances a better understanding of the challenges involved in the teaching and learning of introductory programming at the university level based on three complementary studies. The first was a systematic review of international papers on the teaching and learning of introductory programming published between 2010 and 2016. The second was a systematic review of the Brazilian literature covering the same period. The third study was an empirical research with teachers of STEM courses at Brazilian universities focusing on their perception and use of teaching methods, including the difficulties and benefits associated with them. The main contribution of this thesis is the creation of two research scripts featuring topics identified via the systematic reviews. Three of these topics are worth highlighting: (a) problem-solving in programming; (b) detailed teaching methods and tools for formulating problems and expressing solutions; and (c) the difficulties resulting from students' inadequate prior knowledge. A secondary contribution is the identification of categories that served as the basis for the discussions presented in the systematic reviews. Finally, the thesis also contributes to the literature by providing a panorama of the Brazilian teachers’ awareness and use of non-traditional educational methods. Overall, the thesis demonstrates that the first step to develop effective courses on introduction to programming is the identification of the learning problems associated to it. This was the general hypothesis guiding this work which showed ways to better understand these didactic problems. The thesis also shed light on the importance of clarifying the learning concepts and improving evaluation methods in the area of Computer Education in order to advance the teaching and learning of introduction to

(10)

programming.

Keywords: Introductory programming. Computer Education. Teaching and learning programming. Teaching method.

(11)

LISTA DE FIGURAS

Figura 1 – Habilidades de alto nível necessárias ao programar ... 28

Figura 2 – Processo de busca, indicando os números de artigos em cada etapa ... 55

Figura 3 – Histograma das notas da avaliação de qualidade que mostra uma descontinuidade no limiar de nota adotado ... 57

Figura 4 – Processo de busca, indicando os números de artigos em cada etapa ... 83

Figura 5 – Histograma das notas da avaliação de qulidade que mostra uma descontinuidade no limiar de anota adotado ... 85

Figura 6 – Fluxo do questionário e quantidade de participantes em cada etapa ... 134

Figura 7 – Professores em relação a faixa etária ... 135

Figura 8 – Professores em relação a experiência de ensino ... 136

Figura 9 – Professores em relação ao tipo do curso ... 136

Figura 10 – Professores em relação a instituição ... 137

Figura 11 – Professores em relação a região onde ensinam ... 137

Figura 12 – Professores conhecem ou não os métodos de ensino ... 138

Figura 13 – Periodicidade da utilização dos métodos de ensino ... 139

Figura 14 – Esboço de taxonomia para o ensino e aprendizagem de introdução à programação ... 159

(12)

LISTA DE TABELAS

Tabela 1 – Lista de problemas sobre o ato de programar ... 36

Tabela 2 – Lista de problemas na perspectiva dos alunos ... 41

Tabela 3 – Lista de problemas na perspectiva dos professores ... 46

Tabela 4 – Métodos utilizados nos artigos selecionados ... 57

Tabela 5 – Habilidades dos estudantes ... 60

Tabela 6 – Dificuldades dos estudantes ... 63

Tabela 7 – Desafios do corpo docente ... 68

Tabela 8 – Métodos utilizados nos artigos selecionados ... 85

Tabela 9 – Habilidades dos estudantes ... 87

Tabela 10 – Dificuldades dos estudantes ... 93

Tabela 11 – Desafios do corpo docente ... 105

Tabela 12 – Métodos utilizados nos artigos selecionados ... 119

Tabela 13 – Comparação das habilidades dos estudantes ... 121

Tabela 14 – Comparação das dificuldades dos estudantes ... 123

Tabela 15 – Comparação dos desafios enfrentados pelos professores ... 125

Tabela 16 – Utilização dos métodos por regiões ... 139

Tabela 17 – Utilização dos métodos por tipo de instituições ... 140

Tabela 18 – Utilização dos métodos por tipo de curso ... 140

Tabela 19 – Utilização dos métodos por experiência de ensino ... 141

Tabela 20 – Periodicidade do uso de métodos de ensino ... 141

Tabela 21 – Métodos de ensino conhecidos pelos professores ... 142

Tabela 22 – Métodos de ensino utilizados pelos professores ... 143

Tabela 23 – Métodos de ensino utilizados pelos professor a partir da frequência ... 144

Tabela 24 – Razões pelas quais os professores não utilizam os métodos de ensino em sala de aula ... 145

Tabela 25 – Percepção de benefícios ao utilizar os métodos de ensino ... 146

Tabela 26 – Benefício mencionados pelos professores ... 146

Tabela 27 – Percepção de dificuldade ao utilizar os métodos de ensino ... 147

(13)

LISTA DE ABREVIATURAS E SIGLAS

ACM Association for Computing Machinery

IEEE Institute of Electrical and Electronics Engineers PBL Problem Based Learning

RSL Revisão Sistemática da Literatura SBC Sociedade Brasileira de Computação

(14)

SUMÁRIO

1

INTRODUÇÃO

...

18

2

ENSINO E APRENDIZAGEM NAS DISCIPLINAS

DE INTRODUÇÃO À PROGRAMAÇÃO NOS

CURSOS SUPERIORES

...

23

2.1

Introdução à programação nas universidades ... 23

2.1.1 O que é? ... 23

2.1.2 Qual é a sua finalidade nos cursos? ... 24

2.1.3 Objetivos pedagógicos ... 25

2.2

Existem dificuldades ...

30

2.3

Quais são os problems precisamente? ... 33

2.3.1 Aprender a programar ... 33

2.3.2 Problemas referentes os alunos ... 37

2.3.3 Problemas referentes as estratégias de ensino dos professores ... 43

2.4

Considerações finais ...

47

3

REVISÃO SISTEMÁTICA DA LITERATURA

INTERNACIONAL

...

48

3.1

Objetivos ...

48

3.2

Escolha do método ...

48

3.2.1 Por que uma revisão sistemática da literatura? ... 48

3.2.2 Por que uma nova revisão sistemática da literatura? ... 49

3.3

Método ...

51

3.3.1 Questões de pesquisa ... 51

3.3.2 Processo de busca ... 51 3.3.3 Critérios de seleção e procedimento ... 51

3.3.4 Snowballing ... 51

3.3.5 Avaliação de qualidade ... 52

3.3.6 Coleta de dados e análise ... 52

(15)

3.4.1 Questões de pesquisa ... 52

3.4.2 Processo de busca ... 52

3.4.3 Critérios de seleção e procedimento ... 53

3.4.4 Snowballing ... 56

3.4.5 Avaliação de qualidade ... 56

3.4.6 Coleta de dados e análise ... 58

3.4.7 Limitações do protocolo ... 59

3.5

Resultados ...

59

3.5.1 Habilidades e conhecimentos prévios (QP1) ... 59

3.5.1.1 Habilidades referente à programação ... 60

3.5.1.2 Habilidades educacionais gerais ... 62

3.5.2 Dificuldades encontradas pelos estudantes (QP2) ... 62

3.5.2.1 Formulação do problema ... 63

3.5.2.2 Expressão da solução ... 64

3.5.2.3 Execução da solução e avaliação ... 65

3.5.2.4 Comportamentos ... 66

3.5.3 Desafios do corpo docente (QP3) ... 67

3.5.3.1 Desafios revisitados ... 68

3.5.3.2 Métodos e ferramentas para o ensino de programação ... 69

3.5.3.3 Problemas de escalabilidade ... 70

3.5.3.4 Comunicação professor-aluno e feedback ... 71

3.5.3.5 Escolha da linguagem de programação ... 72

3.5.3.6 Currículo e sequências instrucional ... 72

3.6

Discussão geral ...

73

3.6.1 Melhor compreensão e caracterização da resolução de problemas em programação ... 75

3.6.2 Melhorando o conhecimento prévio ... 76

3.6.3 Melhores ferramentas e métodos específicos para a formulação de problemas e expressão de soluções ... 77

3.6.4 Melhorando a motivação ... 77

3.6.5 Mais bases empíricas e padrões ... 77

(16)

4

UMA REVISÃO SISTEMÁTICA DA LITERATURAS

NAS UNIVERSIDADES BRASILEIRAS

...

79

4.1

Objetivos ...

79

4.2

Método ...

79

4.3

Bases conceituais ... 80

4.4

Aplicação do método ... 80

4.4.1 Questões de pesquisa ... 80 4.4.2 Processo de busca ... 80

4.4.3 Critérios de seleção e procedimento ... 81

4.4.4 Snowballing ... 82

4.4.5 Resultados das seleções ... 82

4.4.6 Avaliação de qualidade ... 84

4.4.7 Coleta de dados e análise ... 86

4.4.8 Limitações do protocolo ... 86

4.5

Resultados ...

87

4.5.1 Habilidades e conhecimentos prévios (QP1) ... 87

4.5.1.1 Habilidades referentes à programação ... 87

4.5.1.2 Habilidades educacionais gerais ... 91

4.5.2 Dificuldades encontradas pelos estudantes (QP2) ... 93

4.5.2.1 Formulação do problema ... 94

4.5.2.2 Expressão da solução ... 97

4.5.2.3 Execução da solução e avaliação ... 99

4.5.2.4 Conhecimentos de base ... 100

4.5.2.5 Comportamento ... 101

4.5.3 Desafios do corpo docente (QP3) ... 105

4.5.3.1 Desafios revisitados ... 106

4.5.3.2 Métodos e ferramentas para o ensino de programação ... 118

4.5.3.3 Problemas de escalabilidade e infraestrutura ... 110

4.5.3.4 Comunicação professor-aluno e feedback ... 112

4.5.3.5 Escolha da linguagem de programação ... 113

4.5.3.6 Currículo e sequências instrucionais ... 114

(17)

4.6

Discussão geral ... 116

4.6.1 Enfrentamento dos conhecimentos prévios inadequados ... 116

4.6.2 Diminuir as barreiras de escalabilidade e infraestrutura ... 116

4.6.3 Enfrentamento dos problemas de adoção de novos métodos de ensino e ferramentas para os cursos de introdução à programação no Brasil ... 117

4.7

Considerações finais ...

117

5

COMPARAÇÃO DO ESTUDO INTERNACIONAL

COM O NACIONAL ...

119

5.1

Considerações finais ...

127

6

ANÁLISE SOBRE A ADOÇÃO DE NOVOS

MÉTODOS DE ENSINO NAS DISCIPLINAS DE

INTRODUÇÃO À PROGRAMAÇÃO NO BRASIL ....

129

6.1

Métodos de ensino nas disciplinas de introdução à

programação ...

129

6.2

Objetivo ... 132

6.3

Público alvo ... 132

6.4

Método ... 133

6.5

Resultados ... 134

6.5.1 Perfil dos docentes ... 135

6.5.2 Conhecimento e adoção dos métodos de ensino ... 137

6.5.3 Métodos de ensino utilizados pelos docentes ... 142

6.5.4 Razões para não utilização dos métodos de ensino ... 145

6.5.5 Benefícios e dificuldades na utilização dos métodos de ensino ... 145

6.6

Discussão ...

148

6.7

Considerações finais ... 152

7

CONCLUSÃO ...

154

(18)

APÊNDICE A – LISTA DOS ARTIGOS DA

REVISÃO SISTEMÁTICA DA LITERATURA EM

INGLÊS

...

170

APÊNDICE B – LISTA DOS ARTIGOS DA

REVISÃO SISTEMÁTICA DA LITERATURA EM

PORTUGUÊS ... 178

APÊNDICE C – LISTA DAS FERRAMENTAS

LEVANTADAS NA LITERATURA

...

185

APÊNDICE D – E-MAIL ENCAMINHADO PARA

OS PROFESSORES UNIVERSITÁRIOS

BRASILEIROS DAS DISCIPLINAS DE

INTRODUÇÃO À PROGRAMAÇÃO ... 189

APÊNDICE E – QUESTIONÁRIO REALIZADO

COM OS PROFESSORES DAS DISCIPLINAS DE

(19)

1 INTRODUÇÃO

Há autores que entendem que o ensino de programação deve se dar desde a infância ou adolescência (Baranauskas, 1984; Ackermann, 1988; Valente, 1993; Resnick et al., 2009). Assim como também existem certos autores que defendem que profissionais de todas as áreas devem saber programar (Papert, 2008). O fato é que as disciplinas de introdução à programação fazem parte de vários currículos de graduação, particularmente em cursos de Ciência, Tecnologia, Engenharia e Matemática, ou cursos STEM – como comumente é descrito em inglês. Em todos esses cenários, fica claro que a aprendizagem de programação é cada vez mais importante nos dias atuais.

O ensino de introdução à programação em nível universitário presente nos currículos dos cursos STEM tem como propósito que os alunos adquiriram os conhecimentos básicos necessários para conceber programas capazes de resolver problemas reais simples.

Infelizmente, as taxas de evasão e retenção dos cursos de introdução à programação ainda são altas (Bennedsen; Caspersen; Michael 2007; Giraffa; Mora 2013). Isso ocorre apesar (a) dos avanços nos métodos e ferramentas para o ensino e aprendizagem de introdução à programação (Mohorovičić; Strčić 2011; Salleh; Shukur; Judi, 2013; Vihavainen; Airaksinen; Watson, 2014), bem como (b) da integração gradual dos fundamentos de programação nos currículos do ensino básico (Andrade et al., 2013; Barcelos; Silveira, 2013; Carvalho; Chaimowicz; Moro, 2013; Scaico, 2013; Resnick et al., 2009).

A literatura internacional atualmente disponível sobre ensino e aprendizagem de introdução à programação ainda diverge muito no diagnóstico dos problemas. Além disso, a literatura apresenta as reflexões sobre os problemas de forma pouco sistemática e rigorosa. Existem, trabalhos que usam o método de Revisão Sistemática de Literatura que se prestaria a justamente dar mais clareza na enumeração e discussão dos problemas, mas elas ou cobrem períodos mais antigos (tipicamente anteriores à 2010) (Jenkins, 2002; Lahtinen; Ala-Mutka; Järvinen, 2005; Pears et al., 2007; Robins; Rountree; Rountree, 2003) ou se limitam à perspectiva do professor. Certamente os problemas do ensino e aprendizagem de introdução à programação envolvem várias perspectivas que precisam ser detalhadas para se ter uma visão ampla da situação. Quais são as habilidades e conhecimentos prévios necessários

(20)

para os alunos serem bem-sucedidos nessas disciplinas? Quais são as dificuldades desses estudantes iniciantes em programação? Quais são os desafios dos professores no ensino de programação em nível universitário?

Nesse contexto, o objetivo desta tese se pauta em promover um melhor entendimento dos problemas e desafios de ensino e aprendizagem nas disciplinas de introdução à programação em nível universitário para criar um diagnóstico para outros pesquisadores poderem conceber métodos de ensino e artefatos educacionais mais eficazes, e assim minimizar os problemas atuais de retenção e evasão nessas disciplinas.

Percebe-se como público alvo desta tese docentes das disciplinas de introdução à programação e dos cursos de tecnologia em geral, gestores educacionais envolvidos com as políticas dos cursos STEM em todos os níveis de ensino, pesquisadores da área de Educação em Computação e pesquisadores da área de Educação. Assim como todos os atores ligados à Educação que se envolvem de alguma forma com a programação.

O escopo da pesquisa se concentra no Ensino Superior e nas disciplinas de introdução à programação. A escolha da disciplina de introdução à programação tem como base ser a mais recorrente em problemas de evasão e retenção e, principalmente, porque a mesma é basilar na trajetória educacional do estudante durante os cursos STEM. Já o foco nas universidades tem a ver com a diminuição da ameaça à validade desta tese. Há problemas nas universidades mensurados e é indiscutível o papel da programação nestes cursos STEM. Percebe-se na literatura no Brasil muito foco nas questões do pensamento computacional no ensino médio e fundamental, porém ainda não há um consenso sobre a computer literacy nestes níveis de ensino.

Nosso entendimento, que o pressuposto básico por trás da concepção de qualquer artefato (Barbosa; Silva, 2010), é que sem o entendimento adequado do problema, é grande o risco da solução criada não alcançar seus objetivos. Existe, de fato, muita literatura propondo métodos e ferramentas para ensino e aprendizagem de introdução à programação (Mohorovičić; Strčić 2011; Salleh; Shukur; Judi, 2013; Vihavainen; Airaksinen; Watson, 2014; Aureliano; Tedesco, 2012; Da silva; Medeiros; Aranha, 2014; Silva et al., 2015a). E isso apesar da pouca convergência em torno de qual seriam os principais problemas ou desafios envolvidos nessa área. Por essa razão, preferimos nos focar em avançar no entendimento dos problemas ao invés de

(21)

ser mais um trabalho onde se propõe novos métodos e ferramentas, porque acreditamos que quanto melhor for entendido o problema, potencialmente melhor serão as soluções.

Para alcançar tal intento, realizamos três estudos complementares. O primeiro foi uma revisão sistemática da literatura sobre ensino e aprendizagem de introdução à programação escrito em inglês entre 2010 e 2016, que resultou em um roteiro de tópicos de pesquisas relevantes. As questões de pesquisa desse estudo se pautaram em saber: quais habilidades e conhecimentos prévios são fundamentais para um aluno iniciante, quais os desafios dos estudantes iniciantes na aprendizagem de programação e quais os desafios os professores encontram ao ensinar introdução à programação? A principal dificuldade encontrada foi organizar de forma sistemática e de fácil compreensão os problemas referentes à perspectiva do aluno. Tais problemas se referiam à temas muito diversos, o que levou a um trabalho minucioso de reflexão sobre as categorias de problemas.

Ao longo da tese, observamos que há muitas publicações sobre ensino e aprendizagem de introdução à programação realizadas em português por pesquisadores brasileiros. Supomos que tais publicações podem ter sido motivadas por alguma eventual especificidade no ensino e na aprendizagem no Brasil. De onde, surgiu naturalmente a pergunta: em que medida os problemas elencados na literatura internacional coincidem ou divergem daqueles relatados na literatura nacional?

Assim, decidimos realizar uma segunda revisão sistemática da literaturam desta vez somente com a literatura nacional para depois comparar os resultados com a revisão da literatura internacional (primeiro estudo). As questões de pesquisa utilizadas no segundo estudo foram as mesmas do primeiro.

Os dois primeiros estudos mostraram a necessidade de entendermos melhor porque os métodos de ensino considerados promissores e modernos (por exemplo, Problem-Based Learning, Pair Programmming, Gamificação e etc.) não são frequentemente adotados no ensino superior, levando ao desdobramento de um terceiro estudo: uma pesquisa com os docentes das universidades brasileiras sobre a percepção e utilização dos métodos de ensino em sala de aula, assim como sobre as dificuldades e os benefícios dessa adoção.

O método escolhido para fazer essa coleta de dados foi a aplicação de um questionário online. As questões abordadas eram relativas a periodicidade de uso dos métodos de ensino e ferramentas, a percepção de benefícios e as dificuldades

(22)

percebidas pelos professores. Os docentes foram convidados a responderem esse questionário por meio dos correios eletrônicos institucionais coletados a partir do Censo da Educação Superior de 2016 do Ministério da Educação do Brasil. Este Censo lista todos os cursos em Computação e correlatos ativos. A maior dificuldade para a aplicação do método foi a comunicação e mobilização para que estes professores respondessem ao questionário contribuindo com a pesquisa. Entretanto, é importante ressaltar que a amostra coletada de 203 respondentes contemplou todas as regiões do país.

A partir dos resultados destes três estudos foi estruturado um esboço de taxonomia que apresenta os problemas encontrados no ensino e aprendizado de introdução à programação em três perspectivas: relacionado aos conhecimentos e habilidades prévias, relacionado ao aluno e relacionada ao corpo docente. Este esboço de taxonomia pode ser importante para os docentes desta disciplina, assim como para pesquisadores da área de Educação em Computação. Os pesquisadores podem focar em temáticas descritas nesta tese, aprofundando em temas que ainda não foram totalmente explorados na literatura.

É possível destacar alguns achados desta tese como as questões relativas a motivação, engajamento e resolução dos problemas aparecem como os principais problemas entre os alunos. Percebe-se déficits em relação a falta de base em matemática entre os alunos brasileiros. Em relação aos professores, os achados estão relacionados às dificuldades de adoção de novos métodos de ensino e ferramentas.

Esta tese está estruturada em sete capítulos: No Capítulo 01 está a descrição dos assuntos discutidos nesta tese. O Capítulo 2 introduz a importância do ensino e aprendizagem de introdução à programação no ensino superior, demonstra as evidências de problemas nestas disciplinas e aborda quais são os problemas nas perspectivas dos alunos e dos professores. O Capítulo 3 descreve a análise da literatura sobre ensino e aprendizagem de introdução à programação escrito em inglês entre 2010 e 2016. O Capítulo 4 descreve a análise da literatura sobre ensino de introdução à programação sobre o contexto brasileiro no mesmo período. O Capítulo 5 descreve uma comparação entre os dois primeiros estudos (Capítulo 3 e 4). E por fim, o Capítulo 6 descreve e analisa uma pesquisa com um grupo de professores das universidades brasileiras sobre a adoção de novos métodos de ensino e ferramentas nas disciplinas de introdução à programação nas universidades. Já as considerações finais da tese se encontram no Capítulo 07, assim como as contribuições e os

(23)
(24)

2 ENSINO E APRENDIZAGEM NAS DISCIPLINAS DE

INTRODUÇÃO À PROGRAMAÇÃO NOS CURSOS

SUPERIORES

Neste capítulo será apresentada a problemática do ensino das disciplinas de introdução à programação no ensino superior. Esta discussão será de fundamental importância para entender as discussões apresentadas nos próximos capítulos. A primeira seção apresenta o contexto das disciplinas de introdução à programação nas universidades, para que servem e o que se espera dos alunos nessas disciplinas. Já a segunda seção mostra as evidências de que existem problemas nessas disciplinas. Por fim, a terceira seção aborda quais são os problemas de ensino e aprendizagem das disciplinas de introdução à programação na perspectiva do professor, do aluno e sobre aprender a programar.

2.1 Introdução à Programação Nas Universidades

2.1.1 O que é?

As disciplinas de introdução à programação fazem parte de vários currículos de graduação, particularmente em cursos “STEM” (Ciência, Tecnologia, Engenharia e Matemática). A Association for Computing Machinery - ACM (ACM, 2013) por meio do Curricula Recommendations denomina as disciplinas introdutórias nos cursos de computação nos Estados Unidos como “CS1” e “CS2”. Estas disciplinas, normalmente, cobrem habilidades de resolução de problemas, conceitos básicos de programação, a sintaxe e semântica de uma linguagem de programação e o uso desta linguagem para formular soluções. As disciplinas são introdutórias nos cursos e basilares para o entendimento dos conceitos e fundamentações necessárias para outras disciplinas mais avançadas no decorrer do curso (Lahtinen; Ala-Mutka; Järvinen, 2005).

A Institute of Electrical and Electronics Engineers – IEEE por meio do Curriculum and Accreditation Committee (IEEE, 2013) denomina as disciplinas “CS1” e “CS2” como introdutórias nos cursos de computação e focadas em programação, nas quais os alunos aprendem conceitos da Ciência da Computação como, por exemplo, abstração, decomposição, por meio de tarefas explícitas para aprender uma linguagem de programação. Dar um foco em programação nessas disciplinas

(25)

introdutórias, segundo o relatório, fornece treinamento antecipado na habilidade crucial de programar para os cursos de Ciência da Computação. Além disso, ajuda a nivelar os alunos com diferentes experiências em computação em uma base comum. A ACM e a IEEE publicaram essas recomendações relacionadas aos currículos na área de Computação buscando consolidar alguns padrões e garantir qualidade. Outras fontes interessantes onde professores buscam experiências relacionadas ao desafio de ensinar programação são os eventos da área de Computação tais como Congresso da Sociedade Brasileira de Computação (CSBC), Congresso Brasileiro de Informática na Educação (CBIE) e Technical Symposium on Computer Science Education (SIGCSE).

2.1.2 Qual sua finalidade no curso?

A Sociedade Brasileira de Computação (SBC) no seu currículo de referência para cursos de graduação em Ciência e Engenharia da Computação sugere as disciplinas de linguagens de programação, de algoritmos e estrutura de dados logo nos primeiros períodos do curso (Sociedade Brasileira De Computação, 2015).

A ACM (2013) nas recomendações dos seus currículos de referência comenta que as disciplinas de introdução à programação são projetados para fornecer uma iniciação mais ampla aos conceitos da computação sem as limitações de aprender apenas a sintaxe de uma linguagem. Isto é fundamental para que os alunos não percebam de forma errada o curso de Ciência da Computação. Introdução à programação precisa ser entendida como uma disciplina que formará um discente mais completo e preparado para os desafios do restante do curso de graduação. Esta é uma visão compartilhada pelo Ministério da Educação Brasileiro (MEC) desde 1999 quando a comissão de especialistas de ensino de computação e informática (Ceeinf) criou as Diretrizes curriculares de cursos da área de computação e informática (Lemos, Barros e Lopes, 2013). Nessas diretrizes o MEC (1999) entende programação de computadores como:

Uma atividade voltada à solução de problemas. Nesse sentido ela está relacionada com uma variada gama de outras

atividades como especificação, projeto, validação,

modelagem e estruturação de programas e dados, utilizando-se das linguagens de programação propriamente ditas, como ferramentas. Portanto o estudo de programação não se restringe ao estudo de linguagens de programação. As

(26)

linguagens de programação constituem-se em uma ferramenta de concretização de software, que representa o resultado da aplicação de uma série de conhecimentos que transformam a especificação da solução de um problema em um programa de computador que efetivamente resolve aquele problema (1999, p. 05).

A IEEE tem uma visão oposta em relação à essa disciplina introdutória. Segundo o Curriculum and Accreditation Committee da IEEE (IEEE, 2013) um curso introdutório focado em programação “pode ajudar a desenvolver habilidades essenciais nos estudantes desde o início e fornecer uma língua franca na qual outros conceitos da ciência da computação possam se encaixar” (2013, p. 42, tradução nossa). Assim, essas disciplinas introdutórias de programação podem ajudar estudantes de outras áreas dos cursos “STEM” a usarem a programação como uma ferramenta de trabalho.

A partir desta discussão fica evidente a importância da disciplina de introdução à programação nos cursos de ciência da computação e também nos demais cursos que fazem parte do “STEM”.

2.1.3 Objetivos pedagógicos

Antes de listar os objetivos pedagógicos da disciplina de introdução à programação nos cursos STEM é preciso discorrer um pouco aprendizagem, competências e sobre os termos conhecimentos, habilidades e atitudes (CHA) serão entendidos por esta tese. Dias (2010) comenta que competência no meio escolar enfatiza “a mobilização de recursos, conhecimentos e saberes vivenciados” (p. 74). Já Henrique e Tedesco (2017) comentam que a aprendizagem “trata de dimensões emocionais e sociais” (p. 1163) , ou seja, desenvolver as competências.

A partir dos anos de 1970 a palavra competência surge “associada à qualificação profissional” (Dias, 2010, p.74), na área de Administração. De acordo com a Organização Internacional do Trabalho (OTI) (2002) no Glossário de termos técnicos sobre certificação e avaliação de competências, o termo competência se refere:

Capacidade de articular e mobilizar condições intelectuais e emocionais em termos de conhecimentos, habilidades, atitudes e práticas, necessários para o desempenho de uma determinada função ou atividade, de maneira eficiente, eficaz e criativa, conforme a natureza do trabalho. Capacidade

(27)

produtiva de um indivíduo que se define e mede em termos de desempenho real e demonstrado em determinado contexto de trabalho e que resulta não apenas da instrução, mas em grande medida, da experiência em situações concretas de exercício ocupacional. (p. 22)

Para Chivenato (2004) apud Henrique e Tedesco (2017): O Conhecimento (saber) é o “resultado de aprender a aprender” (2017, p. 1164). Já a Habilidade (saber como fazer) consiste em “utilizar conhecimentos, métodos, técnicas e equipamentos necessários para desempenhar de tarefas específicas por meio da experiência e educação” (2017, p. 1164). E por fim, a Atitude (saber fazer acontecer) é o “comportamento ativo e proativo, (...) nos leva a exercitar a habilidade de um determinado conhecimento” (2017, p. 1164). Dessa forma, é possível descrever a competência como “uma combinação de conhecimentos, habilidades e atitudes adequadas ao contexto” (Estella e Vera, 2008, apud Dias, 2010).

O currículo de referência da SBC (2015) aprovado em 2015 apresenta quais os conceitos e técnicas que os alunos necessitam dominar para ter sucesso nas disciplinas de introdução à programação. Estes estão divididos em algoritmos, linguagens de programação e habilidades e competências alcançadas na disciplina de introdução à programação. A seguir será descrito cada um dos conceitos com suas especificidades.

Sobre algoritmos os alunos necessitam aprender:

• Análise e desenvolvimento de algoritmos iterativos e recursivos; • Tipos de dados básicos e estruturados;

• Comandos de uma linguagem de programação; • Recursividade, modularidade e abstração; • Estratégias de depuração;

• Estruturas de dados lineares como lista ordenadas, listas encadeadas, pilhas e filas;

• Árvores binárias, de busca e balanceadas;

• Algoritmos para pesquisa, ordenação e para garbage collection.

Sobre as linguagens de programação, os alunos necessitam:

• Entender os conceitos e paradigmas de linguagens de programação; • Semântica formal;

(28)

• Teoria dos tipos, polimorfismo, verificação e inferência de tipos.

A SBC também comenta sobre as habilidades que espera do aluno dos cursos de Bacharelados e Licenciatura da área de Computação. Entre estas, três são específicas ao que se espera das disciplinas de introdução à programação:

• Identificar problemas que têm uma solução algorítmica; • Resolver problemas usando um ambiente de programação;

• Compreender e explicar as dimensões quantitativas de um problema.

Para muitos pesquisadores e de acordo com os currículos de referência de associações como IEEE, ACM e SBC, o ensino de programação é associado ao de algoritmos. Isto é colocado desta forma porque para programar o aluno precisa dominar a forma e organização lógica possível de serem executadas pelo computador, ou seja, pensar algoritmicamente (Giraffa; Muller; Moraes, 2015).

Na revisão sistemática da literatura proposta por Silva et al. (2015) foram encontrados três tipos de habilidades que o aluno necessita ter nas disciplinas de introdução à programação: cognitiva, social e emocional. Todas essas habilidades descritas estão relacionadas com o conceito de atitude. Sobre a habilidade cognitiva, os alunos precisam: resolver problemas; estabelecer conclusões lógicas; planejar e tomar decisões. Sobre as características sociais os autores citam: lidar com regras, cooperar e elaborar. E nas habilidades emocionais: autoconfiança, autoestima e auto avaliação. Outras competências também foram citadas como criatividade, estruturação do pensamento, responsabilidade, curiosidade e trabalho em equipe.

Para Lemos, Barros e Lopes (2013) ao fazer essa transição para o contexto do computador, o aluno tem que ter a habilidade de: a) entender o problema; b) identificar as metas; c) encontras planos de programação; d) construir um algoritmo; e depois ainda transpor isso para uma sintaxe de uma linguagem de programação. Outra habilidade comentada é a auto avaliação por parte do aluno, com um entendimento claro do que se espera e do que ele está produzindo. Para as autoras estas são habilidades fáceis de identificar pelo programador novato. Entretanto, existe uma série de capacidades menos óbvias que não são tão simples de absorver como, por exemplo, a resolução de problemas.

Villalobos, Calderon e Jiménez (2009) entendem que a atividade de programar exige do aluno uma série de habilidades que precisam ser melhoradas iterativamente,

(29)

ou seja, realizadas várias vezes no intuito de sempre aprimorar. A habilidade do estudante ao programar vem ao desenvolver e aplicar conhecimento de maneira efetiva para resolver problema. A Figura 01 explica o modelo mental necessário para o aluno conseguir ter essas habilidades necessárias.

Figura 1. Habilidades de alto nível necessárias ao programar. Fonte:

Villalobos, Calderon e Jiménez (2009).

Dessa forma, percebe-se que o ato de programar para computador nada mais é que dar instruções para que a máquina realize alguma atividade que lhe foi indicada a ser executada. Para que isso seja executável pelo computador é necessário recorrer aos algoritmos e as linguagens de programação.

Para Ferrari e Cechinel (2008) a linguagem natural é “a maneira como expressamos o raciocícinio e trocamos informações” (p. 19). Esse tipo de linguagem natural raramente constituti um sistema de regras rígidas que possa ser implementada por uma máquina ou ser transcrita logicamente. Dessa forma, foram criadas as linguagens de programação, ou seja,

uma maneira de tentar escrever as tarefas que o computador vai realizar de maneira mais parecida com a linguagem natural. Embora ainda seja muitas vezes complexo em comparação com a linguagem natural, um programa escrito em uma linguagem de programação é muito mais fácil de ser implementado, compreendido e modificado. (p. 21)

Segundo Sousa, Júnior e Formiga (2014) o termo algoritmo se refere a “um conjunto não ambíguo e ordenado de passos executáveis que definem um processo finito” (p. 02). A partir dessa concepção de algoritimo pode-se descrever atividades corriqueiras como fazer um sanduíche de queijo:

(30)

passo1: corte o pão em duas partes passo2: abra o pão

passo3: insira o queijo no pão passo4: feche o pão

Esses programas poderiam utilizar de pseudocódigo para facilitar a aprendizagem da programação. O pseudocógio consiste no emprego de uma linguagem intermediária entre a linguagem natural e uma linguagem de programação. Por exemplo, pode-se descrever um pseudocódigo para o ato de fritar um ovo que seria descrito dessa forma:

PROGRAMA FRITAR_OVO

RESERVAR OVO, FRIGIDEIRA, SAL, MANTEIGA; USAR FOGÃO;

COLOCAR FRIGIDEIRA NO FOGÃO; COLOCAR MANTEIGA NA FRIGIDEIRA; LIGAR FOGÃO;

ESPERAR MANTEIGA FICAR QUENTE; QUEBRAR OVO;

COLOCAR OVO NA FIGIDEIRA; COLOCAR SAL NO OVO;

ESPERAR OVO FICAR FRITO; DESLIGAR FOGO;

SERVIR OVO; FIM PROGRAMA

Se fosse necessário escrever a frase “Olá, Mundo!” em linguagem natural traduzida para uma linguagem de programação, pode-se ter vários resultados de acordo com a linguagem de programação escolhida. Por exemplo, caso fosse escrito na linguagem Python:

print(“Olá, Mundo!”)

Já em na linguagem de programação C, o programa teria essa configuração: #include <stdio.h>

int main() {

printf("Olá, Mundo!"); return 0;

}

(31)

quais conceitos e técnicas os alunos devem aprender nas disciplinas introdutórias de programação, é importante questionar se estas disciplinas estão de fato ensinando estes conceitos e técnicas de forma eficiente e satisfatória. Alguns elementos como o índice de evasão e reprovação, como será discutido a seguir, apontam para dificuldades neste sentido. Assim, esta tese propõe investigar quais são as dificuldades encontradas tanto por alunos quanto por professores no ensino e aprendizagem dessas disciplinas de introdução à programação.

2.2 Exitem Dificuldades

Pesquisadores no mundo inteiro têm se preocupado com esta temática e muitos fóruns, congressos e grupos de interesses foram se formando durante as últimas décadas. A SBC (2018), a ACM (2018) e a IEEE (2018) publicam relatórios em seus sites alertando para o problema com uma ampla repercussão na comunidade docente. A ACM começou o Special Interest Group on Computer Science Education, onde os educadores compartilham informações e avaliações sobre os currículos, os cursos e elementos pedagógicos e um dos temas mais recorrente é o ensino de programação. Apesar do crescimento no número de métodos e ferramentas para o ensino e aprendizagem de introdução à programação (Mohorovičić; Strčić, 2011; Resnick et al., 2009) e a integração gradual dos fundamentos da programação nos currículos do ensino básico (Resnick et al., 2009; Allan et al., 2010; Andrade et al., 2013; Barcelos; Silveira, 2013; Carvalho; Chaimowicz; Moro, 2013; Garcia; Correia; Shimabukuro, 2008; Machado et al., 2010; Scaico, 2013), as disciplinas de introdução à programação permanecem com altas taxas de reprovação e retenção de alunos, gerando uma série de evasões de estudantes logo nos primeiros semestres do curso (Aureliano; Tedesco, 2012b; Bennedsen; Caspersen, Michael, 2007; Giraffa; Mora, 2013; Gomes; Henriques; Mendes, 2008; Silva et al., 2015; Vihavainen; Airaksinen; Watson, 2014).

Muitos estudos acabam perpetuando a máxima de que os cursos de introdução à programação são difíceis e de que boa parte dos alunos evadem, reprovam ou desistem. Bennedsen e Caspersen (2007), entretanto, argumentam que ainda faltam estatísticas mundiais sobre as taxas de abandono e evasão nos cursos de introdução à programação em nível universitário. Os autores fizeram pesquisa em 20 escolas e 50 universidades e a taxa de reprovação ficou em 33%. Em Watson e Li (2014), um

(32)

estudo para revisar a média propostas por Bennedsen e Caspersen em 2007 foi realizado e diminuiu para 32,3%, uma diferença discreta.

O professor Geber Ramalho em sua palestra “Evasão, retenção e outras mazelas no ensino superior de computação: desafios e pistas a seguir” (Ramalho, 2015), em 2015, mostrou que a média de reprovação na disciplina de introdução à programação entre 2010 e 2014 no Centro de Informática da UFPE era de aproximadamente 31,8%. Um estudo feito por Ramos e colaboradores (2015) com dados de publicações brasileiras sobre introdução à programação mostra que a média das taxas de reprovações nessa disciplina, em 2015, era de aproximadamente 45,6%.

Giraffa e Mora (2013) consideram que o ambiente encontrado pelo estudante nestas disciplinas de introdução à programação no formato que se dão hoje no Brasil, e no decorrer do curso, não favorece o diálogo, diminui a eficiência dos professores na organização das aulas e obviamente desmotiva o aluno, causando como consequência as desistências e evasões. Todavia, é importante atentar para o argumento utilizado por Bennedsen e Caspersen que consideram preocupante pensar que muitos professores possam não estar tomando medidas para modificar seu método de ensino por acreditarem “que todos os cursos de programação têm taxas elevadas de evasão” (2007, p. 02).

Dos estudos feitos nessa área, muitos apenas perguntam ao professor quais são as dificuldades da disciplina. Não obstante não se aprofundam na temática de quais tópicos são difíceis de assimilar no início da aprendizagem da programação. É possível notar que não há um consenso sobre os principais problemas e desafios (Bennedsen; Caspersen, 2007; Lahtinen; Ala-Mutka; Järvinen, 2005; Mohorovičić; Strčić, 2011), nem uma categorização clara e completa deles (Kinnunen, 2009; Teague, 2011) e, em alguns casos, faltam fundamentações empíricas e quantitativas para determinados argumentos que se perpetuam há décadas (Bennedsen; Caspersen, 2007) como os de que as taxas de reprovações são altas e que a disciplina é complexa e difícil de aprender. Pesquisas anteriores e revisões sistemáticas da literatura focam em como ensinar introdução à programação ou como aprender (Jenkins, 2002; Lahtinen, Ala-Mutka e Järvinen, 2005; Pears et al., 2007; Robins, Rountree e Rountree, 2003; Koulouri; Lauria; Macredie, 2015; Huet et al., 2014; Gomes; Mendes, 2015 ), ou se concentram em métodos e ferramentas para ensinar introdução à programação (Vihavainen, Airaksinen e Watson, 2014; Marcolino; Barbosa, 2015; Watson; Li, 2014; Júnior; Rapkiewicz, 2004; Aureliano; Tedesco,

(33)

2012b; Silva et al., 2015b; Almeida; Netto, 2015; Barbosa et al., 2015; Francisco; Júnior; Ambrósio, 2016; Scaico; Scaico, 2016).

Alguns pesquisadores observam o sucesso no currículo como um todo e outros estão concentrados em analisar um único curso. Xenos, Pierrakeas e Pintelas (2002) realizaram um estudo na Finlândia e relataram cinco razões para os estudantes abandonarem o curso introdutório e consequentemente a graduação: profissão, fatores acadêmicos, família, fatores ligados a saúde e razões pessoais. Em geral, os alunos argumentam que não estimam bem o tempo despendido ao trabalho, ficando pouco tempo para os estudos.

Robins, Rountree e Rountree (2003) dividem os estudos do ensino em programação em duas perspectivas principais: uma perspectiva do engenheiro de software focando seus estudos em programadores experientes e profissionais para trabalhar em times e desenvolver projetos mais eficientes. E outra na perspectiva da psicologia e educação, interessadas no desenvolvimento inicial das habilidades cognitivas e de programação dos estudantes novatos. Kinnunen (2009) afirma que não é suficiente analisar o problema apenas pela perpectiva do aluno nas pesquisas. Isto porque os fatores que fazem o estudante desistir são bem diversos e único para cada um deles.

A partir das taxas significativas de evasão (Bennedsen e Caspersen, 2007; Watson e Li, 2014; Ramalho, 2015; Ramos et al.., 2015), uma alternativa encontrada para tentar descomplicar o aprendizado de introdução a programação foi a criação de alguns métodos de ensino e ferramentas específicos. Esta alternativa foi desenvolvida para tentar aumentar a motivação dos alunos, buscando reduzir a frustração destes ao serem confrontados aos conceitos difíceis da programação. Apesar disso, parecem ainda não ser suficientes para diminuir os problemas encontrados nas disciplinas de introdução à programação.

Entretanto, tais métodos e ferramentas ainda não demonstram de forma efetiva uma mudança no cenário de evasão e reprovações nessas disciplinas (Mohorovičić; Strčić, 2011; Vihavainen; Airaksinen; Watson, 2014). Dessa forma, é necessário tentar entender de forma mais detalhada e completa quais são os problemas no ensino e aprendizagem de introdução à programação para aprimorar e criar novos métodos e ferramentas mais eficazes.

A partir da discussão desenvolvida até aqui fica evidente a necessidade de analisar várias perspectivas acerca dos problemas de ensino e aprendizagem nas

(34)

disciplinas de introdução a programação. Algumas questões surgem como pontos relevantes para serem aprofundadas como, por exemplo, quais as habilidades e conhecimentos prévios necessários para os alunos serem bem-sucedidos nas disciplinas introdutórias de programação? Quais são as dificuldades dos estudantes na aprendizagem de programação? Quais são os desafios dos professores no ensino da programação? É necessária a criação de um estudo mais detalhado sobre os problemas em questão. Esta discussão vai ser a linha condutora deste trabalho, sendo aprofundada nos capítulos 3, 4 e 5 com o intuito de construir um diagnóstico que possa facilitar o entendimento e resolução dos problemas em questão.

2.3 Quais são os problemas precisamente?

Os diversos autores analisados até aqui demostaram que existem problemas no ensino de introdução a programação e que os métodos e ferramentas ainda não são tão eficientes na resolução desses problemas. Assim, é necessário entender de forma mais detalhada quais são os principais problemas encontrados por alunos e professores nessas disciplinas. Esta seção discutirá os problemas do ensino e aprendizagem de introdução à programação a partir de três categorias: o ato de programar, a perspectiva do aluno e a perspectiva do professor. Tais categorias são baseadas nos trabalhos de Päivi Kinnunen (2009), Donna Teague (2011) e de Viviane Aureliano (2016). Os trabalhos de Kinnunen (2009) e Teague (2011) abordam todo o contexto do ambiente de ensino e aprendizagem de programação, apontam questões sobre o conteúdo dessa disciplina, mostram as perspectivas do aluno, do professor e apontam quais os entraves das instituições nessa disciplina de introdução à programação. Já o trabalho de Aureliano (2016) aponta questões interessantes na perspectiva do aluno na aprendizagem de programação.

A partir desta categorização será feita uma análise da literatura que discute os problemas sobre ensino e aprendizagem em programação. Entretanto, é importante ressaltar que um dos resultados encontrados nesta análise é o de que a literatura ainda é bastante divergente em relação a quais desses problemas são os mais importantes.

2.3.1 Aprender a programar

(35)

e que exige uma série de conhecimentos e habilidades dos alunos. As principais dificuldades encontradas pelos estudantes e professores serão elencadas e discutidas a seguir a partir da análise dos problemas refereridos por diferentes autores.

O primeiro problema elencado é a dificuldade que os alunos encontram em traduzir uma determinada tarefa para a linguagem de programação. Este problema é conhecido como pragmática da programação. No estudo realizado por Robins, Rountree e Rountree (2003) foi percebida a tendência de o programador iniciante organizar superficialmente o conhecimento, se aproximando da abordagem de criação de programas "linha por linha", e não pensando o problema como um todo, ou por pedaços (chunks) como o computador irá executar aquela atividade. Ou seja, os estudantes sentem dificuldade na pragmática da programação, o aspecto de como entender a tarefa - o que o programa deveria fazer - e como conceber o programa - entender a tarefa, mas não saber como tornar esse entendimento em algoritmo para o computador. O estudo de Lahtinen, Ala-Mutka e Järvinen (2005) mostra dificuldades percebidas pelos estudantes na “compreensão de como projetar um programa para resolver uma tarefa determina e como dividir funcionalidade em procedimentos” (2005, p. 03), ou seja, da pragmática da programação. Outros autores como duBoulay (1986) e Robins, Haden e Garner (2006) também descrevem o não entendimento da pragmática da programação como um problema.

As estruturas utilizadas no ato de programar também são citadas como possíveis problemas, por exemplo, estruturas de controle (duBoulay, 1986; Dale, 2006), de repetição (Putman et al, 1986; Rogalski e Sumarçay, 1990), de seleção (Lahtinen, Ala-Mutka e Järvinen, 2005; Cherenkova, Zingaro e Petersen, 2014), condicionais (Rogalski e Sumarçay, 1990; Robins, Rountree e Rountree, 2003; Haden e Mann, 2003; Cherenkova, Zingaro e Petersen, 2014) e de dados (Haden e Mann, 2003; Lahtinen, Ala-Mutka e Järvinen, 2005; Schulte e Bennedsen, 2006). Outros estudos mostram os déficits na compreensão dos programadores novatos em várias construções específicas de linguagem de programação como variável (duBoulay, 1986; Putman et al, 1986; Solway e Spohrer, 1989; Rogalski e Sumarçay, 1990; Haden e Mann, 2003; Lahtinen, Ala-Mutka e Järvinen, 2005), parâmetro (Lahtinen, Ala-Mutka e Järvinen, 2005; Dale, 2006), ponteiros (duBoulay, 1986; Milne e Rowe, 2002; Lahtinen, Ala-Mutka e Järvinen, 2005; Dale, 2006), arrays (duBoulay, 1986; Robins, Rountree e Rountree, 2003; Lahtinen, Ala-Mutka e Järvinen, 2005; Dale, 2006; Robins, Haden e Garner, 2006) e loops (duBoulay, 1986; Solway e Spohrer, 1989;

(36)

Robins, Rountree e Rountree, 2003; Haden e Mann, 2003; Lahtinen, Ala-Mutka e Järvinen, 2005; Dale, 2006; Robins, Haden e Garner, 2006).

Existem outros conceitos que são essenciais para o sucesso em qualquer paradigma de programação e também os mais citados como difíceis para os alunos como recursão (Solway e Spohrer, 1989; Robins, Rountree e Rountree, 2003; Lahtinen, Ala-Mutka e Järvinen, 2005; Dale, 2006; Schulte e Bennedsen, 2006), herança (Dale, 2006; Schulte e Bennedsen, 2006) e polimorfismo (Dale, 2006; Schulte e Bennedsen, 2006). Giraffa, Muller e Moraes (2015) argumentam que um dos fatores que mais vai influenciar negativamente os alunos de Ciência da Computação é o próprio assunto da programação, complexo e de aprendizagem gradativa e lenta.

Outros problemas aparecem nas perspectivas de ensinar e de aprender. Entretanto, esses problemas são mencionados por apenas um trabalho cada, como: abstração (duBoulay, 1986), matriz (Solway e Spohrer, 1989), referência (Lahtinen, Ala-Mutka e Järvinen, 2005), métodos (Schulte e Bennedsen, 2006), tipos de dados abstratos (Lahtinen, Ala-Mutka e Järvinen, 2005), debugging (Dale, 2006), função (Dale, 2006), resolução de problemas (Dale, 2006), criação e desenvolvimento de algoritmo (Dale, 2006), deficiência no planejamento e no teste de código (Solway e Spohrer, 1989, construtores (Milne e Rowe, 2002), operator overloading (Milne e Rowe, 2002), alocação dinâmica na mémoria (Milne e Rowe, 2002), manipulação input/output (Lahtinen, Ala-Mutka e Järvinen, 2005).

Os autores analisados elecaram um total de 30 problemas. Porém, os problemas são percebidos de forma difusa entre esses autores. Da totalidade dos problemas citados, 16 (53%) foram mencionados por apenas um único trabalho como pode ser observado na Tabela 1. Não há, portanto, uma convergência clara sobre os problemas.

(37)

Tabela 1. Lista de problemas sobre o ato de programar. Problemas / Autores du Bo la y (1 98 6) Pu tma n e t a l (1 98 6) So lo w ay e Sp oh re r (1 98 9) R og alski e Su ma rça y (1 99 0) Mi ln e e R ow e (2 00 2) R ob in s, R ou ntre e e R ou ntre e (2 00 3) H ad en e Ma nn (2 00 3) La hti ne n, Al a-Mu tka e Ja rvi ne n (2 00 5) D ale (2 00 6) Sch ult e e Be nn ed se n (2 00 6) R ob in s, H ad en e G arn er (2 00 6) C he re nko va , Z in ga ro e Pe te rse n (2 01 4) G ira ffa , Mu lle r e Mo ra es (2 01 5) Pragmática da programação x x x x Variável / variáveis x x x x x x Parâmetro x x Ponteiros x x x x Arrays x x x x x Loops x x x x x x x Estruturas de controle x x Estrutura de repetição x x Estrutura de seleção x x Estrutura condicionais x x x x Estrutura de dados x x x Recursão x x x x x Herança x x Polimorfismo x x x Abstração x Matriz x Referência x Método x

Tipos de dados abstratos x

Debugging x

Função x

Resolução de problemas x

Criação e desenvolvimento de algoritmo x

Deficiência no planejamento x

Deficiência no teste de código x

Construtores x

Operator overloading x

Alocação dinâmica na memória x

Manipulação input/output x

(38)

2.3.2 Problemas referentes aos alunos

As principais dificuldades encontradas pelos estudantes serão elencadas e discutidas a seguir a partir da análise dos problemas refereridos por diferentes autores. A lista dos problemas com os autores que os mencionaram está na Tabela 2. A primeira dificuldade e uma das maiores é o estudante aplicar o conhecimento adquirido. Os estudantes podem saber a teoria da programação mas quando vão criar programas reais têm dificuldade de aplicar este conhecimento na prática (Lahtinen, Ala-Mutka e Järvinen, 2005). Para Lemos, Barros e Lopes (2013), isto é ainda mais grave quando se refere as habilidades para resolver problemas no contexto do computador, pois “ainda que um aluno saiba resolver muito bem um problema, como por exemplo, uma equação de segundo grau, ele ainda assim pode encontrar dificuldade em resolvê-lo no computador” (2013, p. 02). Amaral (2015) cita esse problema dos alunos como a ineficiência em armazenar o conteúdo estudado. Aureliano, Tedesco e Giraffa (2016) apontam que o “maior dos problemas vivenciados pelos iniciantes não parece ser o entendimento dos conceitos básicos de programação, mas a combinação e a utilização adequada destes conceitos na construção de um determinado programa” (Aureliano, Tedesco, Giraffa, 2016, p. 2017). Esses quatro trabalhos convergem ao citar que uma das principais dificuldades dos alunos está em aplicar conhecimentos teóricos adquiridos em problemas práticos no processo de programar, ou seja, a pragmática da linguagem de programação, problema mencionado na seção anterior.

Alguns autores citam o problema de aprender a sintaxe de uma linguagem de programação (Lahtinen, Ala-Mutka e Järvinen, 2005; Almeida et al., 2012; Barbosa, Ferreira e Costa, 2014; Henrique e Tedesco, 2017). Outros comentam sobre a dificuldade dos alunos entenderem conceitos abstratos (ou a abstração) (Gomes, 2000; Almeida et al., 2012; Zanini, 2013; Barbosa, Ferreira e Costa, 2014; Amaral, 2015; Henrique e Tedesco, 2017). Sobre abstração, Almeida et al. (2002) argumentam que a atividade de programar está associada há uma grande quantidade de conceitos abstratos, que não corresponde diretamente ao nosso cotidiano. Para os autores, a evolução das máquinas que utilizamos e as linguagens de programação cada vez mais complexas dificultam ainda mais a atividade de programar. Gomes (2000) comenta que em um dos experimentos realizados os alunos tinham “fracos níveis de abstracção” (2000, p. 148), assim como Amaral (2015) que comenta que os alunos

(39)

têm dificuldade de formar abstrações.

Outro ponto mencionado é a falta de habilidade de estudo que também pode ser compreendida como a adoção por parte dos alunos de uma metodologia ineficiente, ou seja, os alunos muitas vezes podem estudar de maneira inaqueda, superficial e passiva (Gomes, 2000; Dale, 2006; Gomes, Henriques e Mendes, 2008; Aureliano, Tedesco e Giraffa, 2016; Aureliano, 2016). A falta de tempo para se dedicar aos estudos também é outro problema relatado pelos estudantes (Kinnunen e Malmi, 2006; Barbosa, Ferreira e Costa, 2014; Henrique e Tedesco, 2017).

Bereiter e Ng (1991) e Gomes, Henriques e Mendes (2008) identificam dois problemas. O primeiro é que a aprendizagem de programação precisa ser gradual. O segundo problema identificado é o fato dos estudantes partirem direto para a atividade de codificação, sem antes entender por completo o problema a ser trabalhado. Segundo os autores, o aluno deveria ter maturidade para entender a sintaxe básica e aprender gradualmente a semântica, estrutura e finalmente o estilo.

Uma situação que alguns pesquisadores apontam é o mau hábito dos estudantes de decorar ao invés de compreender conteúdo (Amaral, 2015; Silva, 2016; Aureliano, Tedesco e Giraffa, 2016), ou seja, o uso atitude. Silva (2016) afirma que os alunos “sofrem a influência da experiência anterior (...) que, em sua maioria, vieram de um sistema educacional fundamentado na memorização/reprodução de informações e mecanização de procedimentos” (2016, p. 18).

A falta de persistência em resolver problemas complexos ou de encarar situações adversas também é mencionada como problema (Robins, Rountree e Rountree, 2003; Gomes, Henriques e Mendes, 2008). Para Gomes, Henriques e Mendes (2008) é “precisamente o conhecimento adquirido na procura de uma resolução difícil, que permite desenvolver estruturas cognitivas valiosíssimas neste domínio” (2008, p. 94). Robins, Rountree e Rountree (2003) distinguem dois tipos de estudantes iniciantes como stoppers ou movers ao encarar situações de adversidades.

O baixo conhecimento em matemática (Gomes, 2000; Byrne e Lyons, 2001; Júnior e Rapkiezcz, 2003; Gomes, Henriques e Mendes, 2008; Amaral, 2015; Silva, 2016; Henrique e Tedesco, 2017), a falta de treino lógico e de raciocínio nos ensinos básicos (Gomes, 2000; Zanini, 2013; Amaral, 2015; Henrique e Tedesco, 2017) e a dificuldade em pensar algoritmicamente (Lemos, Barros e Lopes, 2013; Silva, 2016) são três problemas relacionados entre si. Gomes (2000) na sua tese pesquisou como

Referências

Documentos relacionados

O bloco do ciclo for é definido pela indentação I i.e., número de espaços à esquerda da linha.!. Please come to

Entretanto, quando uma chamada de função não é a última expressão da lista, apenas um valor de retorno dela é usado, mesmo que ela retorne vários valores. O segundo retorno

Suponha que tem de desenvolver um programa mapeamento das cadeias de transmissão do vírus Covid-19. Para cada pessoa que tenha teste positivo, é necessário registar sobre

Permitem inspecionar linha por linha do programa Permitem inspecionar linha por linha do programa Outra forma, freqüentemente utilizada, é comentar partes do código para

condição – expressão cujo valor resultante é booleano estrutura condicional – estrutura de desvio do fluxo de controle que executa diferentes comandos de acordo com uma

É um conjunto formal de regras de descrição, sintáticas e semânticas, usadas para definir um programa de computador.. A sintaxe é o conjunto de regras que definem quais

Funcional Lógico Estruturado.

Neste exemplo, para além do atributo border=0 (que especifica que não se pretende a bordadura que é colocada, por defeito, pelo HTML), constate-se uma outra possibilidade que é