The Programming for Lovers Manifesto
Every radical must have a manifesto, and I cannot consider myself above this law. So here goes.
I teach a programming course to introductory graduate students at Carnegie Mellon University. Over the past several years, I have watched the audience flip from predominantly complete beginners to predominantly students who have coded before. Has the course been forced to change drastically? No! My students are wonderful, yet despite their previous experience, they typically have retained very little knowledge of the basics of coding.
Many online resources teach the basics of coding, and I admire these platforms for making the subject accessible to so many. Yet despite their success in growth and inclusion, few of these platforms approach the rigor of an immersive university course in programming. As a result, they fail to train students who are prepared to take next steps in the study of computer science.
Perhaps you have explored coding resources online and felt like you struggled to take the next steps; if so, then you have come to the right place.
My dream for P4❤️ is to build a bridge connecting beginners to a more thorough understanding of the foundations of programming and its application to scientific problems. To this end, the P4❤️ manifesto comprises six defining points.
The Six Point Plan
- Fun. Students of all ages learn the most when they enjoy the experience, and so above all else, I want P4❤️ to be fun. I have worked hard to find engaging narratives that serve as the bedrock for each chapter.
- Real applications. Many programming courses are designed by and for computer geeks and mathmos like me. At every moment of P4❤️, learners will be able to put their finger on a real scientific application motivating what they are doing, whether it is identifying hidden messages in bacterial genomes, forecasting a presidential election from polling data, or simulating the moons of Jupiter. In this way, I want to help learners appreciate that computing is everywhere.
- Rigor. When a programming course is taught rigorously, with a thorough treatment of topics that respect its learners’ intelligence, it trains students who become empowered. In P4❤️, we will explain how random numbers get generated. We will explain how the computer manages memory. And we will not shy away from mathematical details, since programming is inextricable from quantitative problem solving.
- Appreciation of the foundations of computing. A computer is an electrical machine whose transfer of information is predicated on sequences of electrical signals that can be represented by strings of ones and zeroes. P4❤️ learners will appreciate the connection between the programming language and the machine by understanding how the code that we write can be converted to a binary representation. The course will also introduce the theoretical topics of Turing machines, undecidability, and P vs. NP. With this theoretical grounding, students will understand what a computer is and what a computer will never be.
- Language independence. P4❤️’s current programming language is Go, which has features that make it easy to teach to beginners. However, P4❤️ is not a course about how to code in Go; it is a course about how to program. Go just happens to be the currently featured language. Programming is clearly and correctly telling a computer how to execute a task, a skill that is independent of any particular language. Accordingly, the “main text” of this course is written without any specific reference to a language. Instead, we teach the basics of how to translate ideas into instructions that a computer can understand by using pseudocode, which is a language-neutral way of describing algorithms. Pseudocode gives learners a stress-free way to learning the basics of programming without stressing out about a specific language’s syntax. Each chapter includes a separate set of code alongs showing how to implement the ideas that we learn about in the main text. Rather than being redundant, this structure provides learners with the repetition that is needed for topics to sink in.
- Learn by doing. P4❤️ facilitates active learning by integrating “just in time” exercises throughout the course. Each code along includes autograded exercises allowing students to check their work from code alongs. And each chapter concludes with a collection of exercises providing students with extra practice on the chapter’s topics.
Programming for Lovers owes a debt of gratitude to a number of people who helped make it possible.
My experience in teaching programming derives from teaching a Programming for Scientists course to undergraduates and master’s students from scientific backgrounds at Carnegie Mellon University, which I was fortunate to inherit from Carl Kingsford. Teaching Programming for Scientists since 2015 has greatly informed my development of Programming for Lovers, and I would like to thank all of my wonderful students over the years, who made me a better instructor as I found my footing as a programming instructor.
Chapter 1 grew from previous work with Pavel Pevzner, the co-author of Bioinformatics Algorithms: An Active Learning Approach (http://bioinformaticsalgorithms.org). If you enjoyed this project, then I think you would love Pavel and my textbook or the online courses that it powers.
The Go gopher is courtesy of Renee French.
This course is a bootstrapped labor of love, and Alexey Guzey along with NewScience provided a grant to help us get up and running.
I greatly appreciate all of the 2,800 learners who joined me for a trial run of Programming for Lovers in fall 2019, when we gave $2,500 to charitable outreach causes in computer science. Special thanks go to a few learners who helped their peers learn where I fell short: Mark Mammel, Bill Bourne, John D. Cox, and Vos H.
Mustafa Guler and uber-learner Mark Mammel gave some amazing comments on the text. Katyanna Quach helped me understand which features I needed to add. Students in Carnegie Mellon’s PreCollege Program in Computational Biology and MS in Computational Biology completed part of the course as preparatory material and showed me that it would work in two very different student groups.
But above all others, I must thank the haters. To my dear haters, you keep me motivated every day. Without you, Programming for Lovers would not exist.