The topic of 2021’s special issue is The Role(s) of Abstraction in CS Education. Abstraction is a pillar of computational thinking and plays a key role in many CS related areas. In computational thinking abstraction is used to understand a problem, manage its complexity and select an appropriate level of detail and degree of generality when solving it. Procedural and data abstractions allow algorithms to be used without knowledge of their details. Besides, the ability to abstract facilitates generalization and knowledge transfer.
Abstraction has been considered, either implicitly or explicitly, in the literature that covers top-down design of programs, system modelling and problem solving. However, teaching students to abstract when reading, designing or implementing code remains a challenge at both k-12 and tertiary level. Hence, our goal when proposing this special issue was to provide a range of papers that could help instructors to understand abstraction in more depth and to find approaches or insights on how to foster abstraction in the classroom. We have achieved that goal by collating eight papers that describe the multiple roles of abstraction in CS education.
Three papers focus on programming skills, as teaching them is a core and challenging task for educators. Fowler et al. explore the abstraction skills needed to reason analytically about source code. Haglund, Strömbäck and Mannila focus on the challenges posed to students by functional abstraction, while Sbaraglia, Lodi and Martini discuss the abstraction mechanisms of programming languages and the rollercoaster of abstraction that students face at introductory level.
Four papers present different perspectives of abstraction in specific CS fields. Dorodchi et al. discuss abstraction in modelling and its role in teaching software engineering; Strömbäck, Mannila and Kamkar investigate how students abstract the behaviour of concurrent programs; Ginat illustrates the use of abstraction to solve algorithmic tasks, and Vaníček, Šimandl and Klofáč identify computational tasks from the Bebras Challenge that would help to develop abstract thinking. Finally, Mirolo et al. provide an overview of abstraction in CS education literature that binds the different perspectives within computer science and computational thinking.
We are thankful to the authors of this special issue for sharing their perspectives and their experiences on the use of abstraction in their fields.
Teaching software engineering (SWE) as a core computer science course (ACM, 2013) is a challenging task. The challenge lies in the emphasis on what a large-scale software means, implementing teamwork, and teaching abstraction in software design while simultaneously engaging students into reasonable coding tasks. The abstraction of the system design is perhaps the most critical and theoretical part of the course and requires early engagement of the students with the necessary topics followed by implementation of the abstract model consistently. Normally, students would take such courses in the undergraduate curriculum sequence after data structures and/or object-oriented design/programming. Therefore, they would be able to learn about systematic modeling of software as a system. In this work, we address how to facilitate the teaching of SWE by introducing abstract modeling. Furthermore, functional decomposition is reviewed as a critical component which in turn, requires understanding of how different tasks are accomplished by enterprise software. Combining such pieces with concepts of architecture and design patterns of software provides foundational knowledge for students to be able to navigate around enterprise software in the real world.
Computer science students often evaluate the behavior of the code they write by running it on specific inputs and studying the outputs, and then apply their comprehension to a more general understanding of the code. While this is a good starting point in the student’s career, successful graduates must be able to reason analytically about the code they create or encounter. They must be able to reason about the behavior of the code on arbitrary inputs, without running the code. Abstraction is central for such reasoning.
In our quest to help students learn to reason abstractly and develop logically correct code, we have developed tools that rely on a verification engine. Code involves assignment, conditional, and loop statements, along with objects and operations. Reasoning activities involve symbolic reasoning with simple assertions and design-by-contract assertions such as pre-and post-conditions as well as loop invariants with data abstractions. Students progress from tracing and reading code to the design and implementation of code, all relying on abstraction for verification. This paper reports some key results and findings from associated studies spanning several years.
The notion of algorithm may be perceived in different levels of abstraction. In the lower levels it is an operational set of instructions. In higher levels it may be viewed as an object with properties, solving a problem with characteristics. Novices mostly relate to the lower levels. Yet, higher levels are very relevant for them as well. We unfold the importance of higher level abstractions for novices, by demonstrating the role of declarative observations of algorithmic problems, and the benefit of developing awareness of such observations in algorithmic problem solving. This is shown in a two-stage study, which first reveals the unfortunate lack of declarative observations, and then displays comparative results of experimental and control groups, which stems from different awareness and competence with declarative observations.
Controlling complexity through the use of abstractions is a critical part of problem solving in programming. Thus, becoming proficient with procedural and data abstraction through the use of user-defined functions is important. Properly using functions for abstraction involves a number of other core concepts, such as parameter passing, scope and references, which are known to be difficult. Therefore, this paper aims to study students’ proficiency with these core concepts, and students’ ability to apply procedural and data abstraction to solve problems. We collected data from two years of an introductory Python course, both from a questionnaire and from two lab assignments. The data shows that students had difficulties with the core concepts, and a number of issues solving problems with abstraction. We also investigate the impact of using a visualization tool when teaching the core concepts.
When we “think like a computer scientist,” we are able to systematically solve problems in different fields, create software applications that support various needs, and design artefacts that model complex systems. Abstraction is a soft skill embedded in all those endeavours, being a main cornerstone of computational thinking. Our overview of abstraction is intended to be not so much systematic as thought provoking, inviting the reader to (re)think abstraction from different – and perhaps unusual – perspectives. After presenting a range of its characterisations, we will explore abstraction from a cognitive point of view. Then we will discuss the role of abstraction in a range of computer science areas, including whether and how abstraction is taught. Although it is impossible to capture the essence of abstraction in one sentence, one section or a single paper, we hope our insights into abstraction may help computer science educators to better understand, model and even dare to teach abstraction skills.
Introductory programming courses (CS1) are difficult for novices. Inspired by Problem solving followed by instruction and Productive Failure approaches, we define an original “necessity-driven” learning design. Students are put in an apparently well-known situation, but this time they miss an essential ingredient (the target concept) to solve the problem. Then, struggling to solve it, they experience the necessity of that concept. A direct instruction phase follows. Finally, students return to the problem with the necessary knowledge to solve it. In a typical CS1 learning path, we recognise a challenging “rollercoaster of abstraction”. We provide examples of learning sequences designed with our approach to support students when the abstraction changes (both upward and downward) inside the programming language, for example, when a new construct (and the related syntactical, conceptual, and strategic knowledge) is introduced. Also, we discuss the benefits of our design in light of Informatics education literature.
Concurrency is often perceived as difficult by students. One reason for this may be due to the fact that abstractions used in concurrent programs leave more situations undefined compared to sequential programs (e.g., in what order statements are executed), which makes it harder to create a proper mental model of the execution environment. Students who aim to explore the abstractions through testing are further hindered by the non-determinism of concurrent programs since even incorrect programs may seem to work properly most of the time. In this paper we aim to explore how students’ understanding these abstractions by examining 137 solutions to two concurrency questions given on the final exam in two years of an introductory concurrency course. To highlight problematic areas of these abstractions, we present alternative abstractions under which each incorrect solution would be correct.
This paper focuses on the analysis of Bebras Challenge tasks to find Informatics tasks that develop abstract thinking. Our study seeks to find which Bebras tasks develop abstraction and in what way. We analysed hundreds of tasks from the Czech contest to identify those tasks requiring participants to abstract directly or use abstract structures. Results show that an agreement among experts on stating which task is focused on abstraction is at a moderate level. We discovered that tasks focused on abstraction occur four to five times less frequently in sets of contest tasks than algorithmic tasks. Our findings proved that abstract tasks results compared with algorithmic ones did not differ in neither age nor gender group of contestants.