Credit: istock Recently, I had the good fortune to present a class at the ACM Conference for Computer Science Educators (SIGCSE). While I definitely shared my enthusiasm for parallel programming, I had two key goals for those who attended: 1. Advocate for “Think Parallel”: Explain why parallelism should be taught from day one when teaching programming. It’s a disservice to students to teach sequential programming without discussing concurrency. 2. Share useful resources for instructors seeking to teach parallel programming (course notes, sample problems, etc.) Think Parallel Parallel programming isn’t just about supercomputers and high performance. It’s also about dealing with a concurrent world. Concurrency is all around us. We all can grasp that grocery lines go faster if there are more lines open to use. We all have an intuitive feel that deadlock can happen if two cars heading toward each other meet on a one-lane alley. Airline computer systems book reservations in parallel; airlines can’t afford the luxury of handling only one customer in the world at a time. An introduction to programming should introduce the complication of concurrency. Map-reduce problems can be very rewarding to see how fast a computer can be. An introduction to data structures should discuss the challenges of concurrent access, and what it means to design thread-safe interfaces and implementations. One could build an elevator simulation that allows multiple people requesting elevators at the same time on different floors. All these things are facts of life. Anyone with a cellphone surfing the Web, enjoying applications like Snapchat, Facebook, and Instagram, or using Sri or Alexa can grasp the concept of concurrent activity as multitudes of users interact with common resources in the cloud. This is a fundamental, everyday part of our lives. Translating these real-world motivations for understanding concurrency and parallelism isn’t abstract. It’s real. When teaching programming, “think parallel” should come very early on. It’s easier to teach new programmers to think parallel than it is to try to change thinking around and introduce parallel programming after sequential programming is very ingrained in how one thinks about programming. The “NSF/IEEE-TCPP Curriculum Initiative on Parallel and Distributed Computing – Core Topics for Undergraduates” has interesting proposals on the desired levels of proficiency for undergraduates. You can read their detailed recommendation (from 2012) on their homepage. Included in their recommendations is a strong endorsement to integrate parallelism into computer science teaching at all levels rather than add new classes. They hold an annual workshop, NSF/TCPP Workshop on Parallel and Distributed Computing Education, which sounds very interesting (I haven’t attended). Resources for teaching parallel programming On a more practical note, teaching is always hard work. Teaching something new is even harder. The good news: There are a lot of people who have blazed trails. You can Google to find help learning/teaching parallelism. I’ll highlight two excellent resources for teaching parallelism – one for college sophomores, one for college senior/graduate-level study. I’d love to hear about others. 1. Sophomoric Parallelism and Concurrency: These materials from the University of Washington offer a 2-3 week unit introducing parallelism and concurrency in a lower-level data structures course. They’ve been used since 2010 as part of this full data-structures course, and they’ve also been adapted for CS2 courses and for introductions in more advanced courses. 2. Parallel Curriculum Development: Lecture and lab curriculum components for a 10-week course at the University of Oregon. Summary Our students deal with concurrency, multitasking, and parallelism every day of their lives. It shouldn’t be a stretch to simply take it as a fact of life and discuss it as we teach programming. The beneficiaries of such an education will be better equipped for our complex and demanding world. Click here to download your free 30-day trial of Intel Parallel Studio XE Software Development