Our research focuses on computing education and its connections with programming languages and software engineering. Given these three foci, we are particularly interested in how people learn to program.

Several international studies over the last two decades have shown that learning to program is exceptionally difficult. A majority of students, even at elite universities, have difficulties to solve even simple programming assignments. In a time where programming is to be taught not just at university level, but also in schools, it is important to better understand the processes and difficulties involved in learning to program. It is this issue that motivates our research.

Conceptual Change

Research in conceptual change in learning stresses the importance of "tracking students' moment-by-moment thinking while learning" (DiSessa, 2014), and that knowing "exactly what changes when may be the gold ring of conceptual change research".

Supported by the Swiss National Science Foundation for 2020 to 2023, we will study the process of learning to program in detail. We will observe, document, and analyze the changing understanding of programming language concepts as well as the gradual learning of the associated solution strategies of individual programming students over a longer period of time. For this, we will observe learners during programming and problem solving sessions, and we will develop methods to automatically analyze their programs. Based on a triangulation of all these observations, we will formulate hypotheses on typical learning progressions. We then will experimentally test those hypotheses to identify particular difficulties and possible pedagogical approaches.

In an initial effort related to this project, together with colleagues from Portugal and Canada, we are developing a catalogue of misconceptions held by novice programmers. Our catalog includes over 160 misconceptions for Java programming. A first subset of our catalogue is visible on our prototype Progmiscon web site. We will extend our understanding beyond coarse-grained misconceptions, by using microgenetic approaches to study the finer-grained learning trajectories.

Mastery Learning

Mastery learning goes back to Bloom's effort to boost learning by two standard deviations without having to resort to one-to-one tutoring (Bloom, 1984).

At Luce we have developed the Informa Mastery learning platform to support courses using a mastery learning approach. 

Together with researchers and instructors of undergraduate programming courses in Canada, Sweden, and Singapore, ranging from 40 to 500 students, we are studying how mastery learning can be used effectively in teaching programming. Supported by an ACM SIGCSE Special Projects grant for 2020, we are now building a web site that documents our different variations of mastery learning for programming. The site will include videos of mastery check sessions to help others to better understand and adopt the approach, and it will come with protocols, workflows, and the different sets of achievements and competencies tested in mastery checks for programming.

With our collaborative efforts we intend to bootstrap a community of practice around the mastery learning approach, and to prepare for thorough empirical evaluations of the effectiveness of using mastery learning in programming courses.


We have been and are working on research beyond the above topics, such as the use of types in programming, using program slicing for debugging, or automatically inferring the algorithmic complexity of code. Check out our publications and our tools. For research predating the Luce Research Lab, check out our old Sape Research Group pages.