|dc.description.abstract||Programming activities are not trivial tasks. Rather, to carry out such complex problem solving tasks, programming expertise developed through long-term experience is required. In contrast, the current landscape of computing demands more reliable and efficient implementations of concurrent software programs. In this thesis work, we research topics in psychology of programming and computer science education with an emphasis on programming with concurrency to inform the fields of psychology of programming, computer science education, empirical software engineering and a broader scope of human factors related fields.
We identify the barriers to learning programming with concurrency through review and empirical work. We synthesize the previous research findings with regard to programming expertise, generalize a conceptual framework of the development and application of programming expertise and indicate the importance of the knowledge repository component. We reveal the structure of concurrency-related concepts, and provide insight into the acquisition procedures for such knowledge with our description of a “misconception hierarchy” grounded from qualitative analysis of empirical data. Comprehensive arguments generated through a case study are further provided to describe non-concurrency-related barriers that are critical for students to learn and appreciate programming with concurrency.
We conduct explorations on the impact of existing and innovative techniques and course designs used in teaching programming with concurrency topics. We review the pedagogical impact of pair programming and indicate its protective effect on retaining female and less-experienced students through our quasi-experiments. We also reveal the engineering and cognitive effect of pair programming in that pair programming helps students to write code using better style and promotes more comprehensive and critical thinking in earlier phases of software development. We survey curriculum guides on topics regarding programming with concurrency and identify two concurrency models (shared memory versus message passing), three implementation approaches (Threads, Actors, and Coroutines), and several classic scenarios (Bounded Buffer, Dining Philosopher, Sleeping Barber, etc.) to teach in an upper-level undergraduate computer science course. We provide feedback on benefits and drawbacks of this series of pedagogical innovations including flipped classroom design, using a language-independent pseudocode system, and introducing repeated practice with different implementation approaches on a single problem.||