CS Education

Posts about computing education research, curriculum design, teaching programming, novice learners, and CS pedagogy.

2026-05-30How to Not Be Wrong About AI
2026-05-26Summer Projects
2026-05-20Twelve Ways to Be Wrong About AI-Assisted Coding
2026-05-20Why Don't You Just…
2026-04-18Changing Minds
2026-04-01Current Projects
2026-03-26Feasible
2026-03-26Penguin Geography
2026-03-08Cognitive Pollution
2026-01-28Four Traditions Revisited
2026-01-18If Not Lessons, Then What?
2025-10-25Cognitive Pollution
2025-05-01We Weren't Ready for the Flood
2025-04-09Congratulations to This Term's Students
2025-01-11Fairness
2025-01-10Grades
2025-01-09Managing Conflict
2025-01-08Division of Labor
2025-01-07Forming Teams
2025-01-06Making Decisions
2025-01-05Air Time
2025-01-04Meetings
2025-01-03Time Management
2025-01-02Crunch Mode
2024-12-28Being a Great Teacher
2024-12-14How It Will Be Used
2024-11-30Another Static Site Generator for Lessons
2024-11-10What Worked Last Time?
2024-10-12Browsercast Revisited
2024-08-21Teaching Workshop in September 2024
2024-08-12Tutorials I Would Like to Attend
2024-04-27Building Tech Together
2024-04-27Software Design by Example in Python 27: Conclusion
2024-04-26Software Design by Example in Python 26: A Debugger
2024-04-25Software Design by Example in Python 25: A Virtual Machine
2024-04-24Software Design by Example in Python 24: Undo and Redo
2024-04-23Software Design by Example in Python 23: A File Viewer
2024-04-22Software Design by Example in Python 22: Serving Web Pages
2024-04-22Background Knowledge
2024-04-21Software Design by Example in Python 21: Transferring Files
2024-04-20Software Design by Example in Python 20: A Package Manager
2024-04-19And Now to Lead
2024-04-19Software Design by Example in Python 19: A Build Manager
2024-04-18Software Design by Example in Python 18: A Database
2024-04-17Software Design by Example in Python 17: Binary Data
2024-04-16Software Design by Example in Python 16: Object Persistence
2024-04-15Software Design by Example in Python 15: Performance Profiling
2024-04-14Software Design by Example in Python 14: Page Layout
2024-04-13Software Design by Example in Python 13: A Code Linter
2024-04-12Software Design by Example in Python 12: A Template Expander
2024-04-11Software Design by Example in Python 11: An HTML Validator
2024-04-10Software Design by Example in Python 10: A File Archiver
2024-04-09Software Design by Example in Python 9: Protocols
2024-04-08Software Design by Example in Python 8: Functions and Closures
2024-04-07Software Design by Example in Python 7: An Interpreter
2024-04-06Software Design by Example in Python 6: Running Tests
2024-04-05Software Design by Example in Python 5: Parsing Text
2024-04-04Software Design by Example in Python 4: Matching Patterns
2024-04-03Software Design by Example in Python 3: Finding Duplicate Files
2024-04-02Software Design by Example in Python 2: Objects and Classes
2024-04-01Software Design by Example in Python 1: Introduction
2024-03-15Thinking About Lessons
2024-03-01Why I Draw
2024-02-22Code, Cucumbers, and LLMs
2024-02-21A New Metric
2024-02-03First Draft of SQL Tutorial
2024-01-31Lesson Log
2024-01-24Working Backwards
2024-01-17The First Six Questions
2024-01-13What's the Scratch of the Social Sciences?
2024-01-06My Academic Flyby Revisited
2023-12-12Ultracrepidarian
2023-12-11Meetings, Interruptions, and Power
2023-12-10Research Software Design by Example
2023-11-22Seeing Like a Student
2023-11-21One Damned Thing After Another
2023-11-13Replacing Make
2023-11-12Software Design Homework
2023-10-02Two Unfunded Proposals
2023-09-09An Approach to Motivating Coding
2023-08-10Language and Library Features for Teaching
2023-07-12Software Design by Example (Python edition) Now in Beta
2023-04-10Dressed in Hand-Me-Down Clothes
2023-03-24Code Complexity
2023-03-12Rethinking Design Examples
2023-03-04The Only Features I Need
2023-01-29Software Design by Example Summary
2023-01-29Would You Take This Class?
2023-01-26Software Design by Example 20: Debugger
2023-01-24Software Design by Example 18: Package Manager
2023-01-20What Would Entice Them?
2023-01-17Software Design by Example 13: Module Loader
2023-01-14Do These Tools Exist?
2023-01-09Software Design by Example 7: Pattern Matching
2023-01-08Somewhere Between Hobbes and Wishful Thinking
2023-01-06Software Design by Example 6: Data Tables
2023-01-04Software Design by Example 4: Unit Testing
2023-01-03Software Design by Example 3: Asynchronous Programming
2023-01-02Software Design by Example 2: Systems Programming
2023-01-01Software Design by Example 1: Introduction
2022-12-29The Fourth Tradition
2022-12-28Ways to Explain Code
2022-12-28Six for the To-Don't List
2022-12-18Sessioncasting
2022-12-14Teaching in the Third Dimension
2022-12-04I Want a Memory Diagram Generator
2022-12-01Software Design in Python Glossary
2022-11-30What I Want for Code in Textbooks
2022-11-21Software Design by Example Personas
2022-11-18Debuggable Explanations
2022-11-13The Notebook Not Taken
2022-10-29I Don't Know What to Teach
2022-10-29Learning Objectives for Teaching Workshop
2022-10-26Software Design Homework
2022-10-02Empirically Minimal
2022-09-24The Least Assholish Person
2022-08-14Empirical Software Engineering Vignettes
2022-08-11Slides for Teaching Tech Together
2022-06-20Dev Ed Book Club
2022-05-08A Language for Teaching
2022-04-30Four Books I'm Not Writing (Plus One)
2022-02-01What I Would Change in Lox for Teaching
2022-01-16A Cacaphony of Explanations
2021-08-24Textbooks (Alone) Are Not Enough
2021-07-18What Everyone in Tech Should Know About Teaching and Learning
2021-07-17Software Engineering's Greatest Hits
2021-06-25A Proficiency Test for Research Software Engineers
2021-04-17Choose Your Own Adventure
2021-04-17Building a Book (Part 3)
2021-04-08Lesson Maps
2021-03-15Homework
2021-02-22Strategies for Change
2021-01-26Dead Last
2021-01-23But Can She Type?
2021-01-18Good Enough Teaching
2021-01-17Punchcards Considered Harmful
2021-01-07Steps in Order
2020-10-21Tools
2020-10-12Circular Imports
2020-07-19Slither.io, the Two Sigmas, and Customer Support
2020-07-09Thoughts from a Not-So-Influential Educator
2020-04-06Teaching Code Review
2020-03-30SIGSOFT Influential Educator Award
2019-09-05How Do You Tell?
2019-08-14Research This!
2019-08-10Exoplanets
2019-08-05Computational Science Education (1996 edition)
2019-07-15Is This a Notional Machine for R?
2019-07-05A Modest Proposal
2019-06-15Ten Quick Tips for Delivering a Programming Lesson
2019-06-06ICER Acceptance
2019-05-26Active Teaching
2019-05-04In the Classroom
2019-05-03Shorter Lines
2019-04-17Learning Curves
2019-04-12Python Flash Cards
2019-04-12Ten Quick Tips for Creating an Effective Lesson
2019-04-06Bootcamps
2019-03-30Curriculum Roadmap
2019-03-21Twelve Weeks, Twelve Tools
2019-03-07Learning to Program
2019-02-20Is Code-Along Formative Assessment?
2019-02-11Examples Wanted for Code Review
2018-12-26Poor Thinking
2018-12-16Speaking of Accessibility
2018-12-06Analyze That! Very Preliminary Results
2018-12-06Three Courses
2018-12-02Learning from McMaster
2018-12-02OER Landmines
2018-12-02One Last Step
2018-11-29Teaching as a Telenovela
2018-11-28Augmenting Error Messages
2018-11-05Abstraction and Comprehension Continued
2018-11-03Abstraction and Comprehension
2018-11-01Twelve Questions
2018-10-31Credit and Respect
2018-10-24Two Columns
2018-09-18Teaching Ethics
2018-09-05Analyze That!
2018-09-04Two Courses
2018-08-12The Real Challenge
2018-08-07Three Terms
2018-07-21Weak Failure, Strong Failure, and Butter Tarts
2018-07-05Performance Curves, Curriculum Design, and Trust Revisited
2018-06-20End-User Teachers
2018-04-12Is This a Notional Machine for Python?
2018-03-23Where Does This Come From?
2018-03-17I Can't (Quite) Teach JavaScript
2018-03-16Seven Ways to Think Like a Programmer
2018-02-18Teaching Programming in the Wild
2018-02-14'Analyze This!' for CS Education
2018-01-26Assessing Competence
2018-01-15Procedural versus Declarative
2018-01-09Teaching Statistics in the 21st Century
2017-12-17Teaching for Learning
2017-12-17Consider the Bicycle
2017-11-28My Favorite Tool - Asking for Help
2017-11-24Common Misconceptions
2017-11-05Carpentry For Everyone
2017-10-21Change Strategies
2017-10-16Exercises for Teaching Programming
2017-05-31How to Teach Programming (And Other Things)
2016-10-04Python as a Second Language
2016-09-23Teaching Programming to the Blind
2016-09-21What I Wish I'd Read
2016-09-12Collaborative Choral Software Exegesis
2016-09-10The Discussion Book
2016-09-10Slides for Two Talks Online
2016-08-02Heuristic Evaluation for Novice Programming Systems
2016-06-10The Superbug in Education
2016-02-16A Counterpoint to Collaborative Lesson Design
2016-02-07Come a Long Way, Got a Long Way to Go
2016-01-13A New Book from Mark Guzdial
2016-01-09What the Data Says About Novice Programming Mistakes
2016-01-09Change Strategies in STEM Education
2016-01-03A Data Programming CS1 Course at the University of Washington
2015-12-26New Words Needed
2015-11-29Exaptation and the Future of Software Engineering
2015-11-15CourseSource: A(nother) New Hope
2015-10-09Teaching in the Large
2015-07-18Top 10 Myths about Teaching CS
2015-07-01Pushing Back
2015-06-17Get More Done in Less Time
2015-06-14Routinely Unique
2015-06-12Learning in Both Directions
2015-05-25A Few Articles on Education
2015-05-24ICSE 2015
2015-05-02Selling Hope
2015-04-22The Paradox of Learning Objects
2015-04-13The Future Then and Now
2015-02-02Nouns and Verbs
2014-12-15Who Are We?
2014-12-02What About MOOCs?
2014-12-01Goalposts for the Digital Humanities
2014-11-05Politics for Current Physicsts
2014-11-04A 'Joel Test' for Grassroots Programming Groups
2014-10-02A Better Software Engineering Course
2014-09-11What Sciences Are There?
2014-09-04Building Better Teachers
2014-08-18Conversations About Teaching
2014-08-11Inessential Weirdness in Software Carpentry
2014-04-23Mr. Biczo Was Right
2014-03-27One of Our Inspirations
2014-03-14You and Jimi Hendrix
2014-03-14Is Learning at Scale Just Another Name for Ubiquitous Surveillance in the Classroom?
2014-03-14Everything Old is New Again
2014-03-07Anatole France, Updated
2014-01-19Why Not a MOOC?
2014-01-07Mental Models and Vicious Circles
2013-12-19Andromeda's Advice
2013-10-08Assuming the Problem
2013-08-12Offering a New Order
2013-06-07Is There Only Room for One Utopia?
2013-03-01Alternative Teaching Models
2013-02-10Why Don't I Just Go Ahead And Frame That Debate In A Way That Guarantees I'll Win?
2013-02-03Features and Scope in Open Courseware
2013-01-28Novelty, Efficiency, and Trust
2013-01-11Teaching Commercially
2012-12-23Computer Science Curricula 2013
2012-12-16You've Shown Me the C, Now Where's the Python?
2012-12-14Would You Like Your Programming Language to Have a Million Users?
2012-12-06Two Solitudes Illustrated
2012-11-19If Udacity is Napster, Who Will Be iTunes?
2012-11-05Who Decides?
2012-11-02I'd Like an Argument, Please
2012-11-01Charging and Being Charged
2012-10-25Prime Numbers, Biologists, and Data Visualization
2012-10-23Twenty Percent
2012-10-21Why Teaching People to Program Is Hard
2012-10-04USV's 'Research' on Online Education: Well, That's Depressing
2012-09-30The Real Hard Work
2012-09-26Computational Thinking and Ice Floating in Bathtubs
2012-09-04Not Really Disjoint
2012-08-29A Problem With Badges
2012-08-21Two Solitudes (talk)
2012-08-17Who Are You?
2012-08-15Is This Really Necessary?
2012-07-18Eyes, Brains, and Fingers
2012-06-29That Seems Simple to Me
2012-06-26Pessimism and Doom
2012-06-25If You Want to Teach, Isn't It Only Fair to Learn a Few Things First?
2012-06-14The Past Is Here Too
2012-06-08But the Greatest of These Is…
2012-06-08We Get Mail
2012-06-07Responsibility, Timidity, and the Bird's Eye View
2012-05-24Everything You Need to Know About Standardized Testing
2012-05-24No CT Without PL
2012-05-23Alone and Misunderstood
2012-05-11Teach Teachers What They Use, Teach Kids Where They Are
2012-04-28Stop Me If You've Heard This One
2012-04-18Behind the Scenes (or, the Ethics of Cultivating Discontent)
2012-04-09A Future Student
2012-04-06Greener Grass
2012-04-03Maybe That's Why
2012-03-22Two Questions After the Audrey Test
2012-03-18Informed Choice and the Audrey Test
2012-03-15The Audrey Test
2012-03-09What's the Model, Kenneth?
2012-03-01ULP (or, This is tricky and perhaps profound)
2012-03-01Why I Think 'YouTube for Textbooks' is a Bad Idea
2012-02-22What Deep Thoughts Look Like
2012-02-09Comparing Software Carpentry to CS Principles
2012-02-02Bullshit, Appropriation, and Technology in Education
2012-02-01On Algorithmic Thinking
2012-01-29A Browser-Based Programming Tool That's Better Than Many Desktop Tools
2012-01-23A Better Solution to the Final Problem
2012-01-20By Any Means Necessary
2011-12-07How to Teach Webcraft and Programming to Free-Range Students
2011-12-02Iron Triangles Are Great—Everyone Should Have One
2011-12-01Direct Reports and Self-Directed Learning
2011-11-30The Greatest Story Never Told
2011-11-08The Ladder of Abstraction and the Future of Online Teaching
2011-11-08The Best vs. the Good
2011-10-31D is for Digital
2011-10-06Insufficient Purity Considered Harmful
2011-10-05D Is For Digital
2011-08-25Three Paradigms (or, Why LLC Should Teach Javascript)
2011-08-18Spelling, Fairness, and JavaScript
2011-08-17Demos Reinforce Errors, and Confusion is Good
2011-08-08Introducing Programming a Different Way
2011-08-04Computing in Physics 101: What We're Doing Wrong
2011-07-15The Finger Is Not The Test
2011-07-12Grown-Up Languages
2011-06-15Mostly Pleased, But…
2011-06-12If You're Going to Teach an Undergrad Intro to Software Engineering…
2011-05-28You Doesn't Exist
2011-05-27It's Not Theory vs. Practice, It's Two Solitudes
2011-05-18Catalog Models Like Views and Controllers
2011-04-26Competence
2011-04-18Holding Up a Mirror
2011-04-06It's Complicated
2011-03-16Graph Layout, Models vs. Views, and Computational Thinking
2011-03-15Twenty Questions (Minus Two)
2011-03-12Dying Breeds
2011-03-09Who's Cribbing Who?
2011-01-26Thinking Like the Web
2011-01-20MIT Rethinking OpenCourseWare
2011-01-05Cognitive Dissonance
2010-12-02Programmer Competency Matrix
2010-10-19Peter Norvig on Python
2010-10-08Yes, We *Can* Design Languages for Human Beings
2010-08-25Three Rules for Supervising Student Programming Projects
2010-08-05Python in CS1 is Growing Fast
2010-07-28Mark Guzdial on Software Carpentry
2010-06-29The Violas of Programming
2010-06-18People You Don't Want On Your Team
2010-06-16A Voice from the Back of the Room
2010-04-12Professors *Can* Teach Open Source
2010-04-12On the Failure of Inquiry-Based Teaching
2010-04-07How Do You See Maps?
2010-03-30Why Do Students Cheat?
2010-03-26Online Delivery
2010-03-15Master of Science in Applied Computing
2010-03-13Something That Won't Be On The Final Exam
2010-03-03More on Computational Thinking
2010-03-02What We've Learned
2010-02-02Before We Get Too Excited About Online Education…
2010-01-25CUSEC 2010
2010-01-22CUSEC
2010-01-15We're Apparently Still Not a Science
2009-12-18Double Standards
2009-12-11Open the Hatch
2009-11-11Following Up on the Toronto Innovation Showcase
2009-11-05Toronto Innovations Showcase
2009-11-05The Greatest Failing of High School Science
2009-10-21Should Modeling Be Part of This Course?
2009-10-17Lunchbox Games
2009-10-09Two More From Mark Guzdial
2009-10-06Government 2.0 Project Selection
2009-10-06Comments on Course Reorganization
2009-09-23Applications and Data Sets
2009-09-21Want to Go to MIT?
2009-09-16Teaching Computational Thinking on the Web in Just Two Hours
2009-09-15First Gov 2.0 Class
2009-08-31Different Weights, Different Answers
2009-08-28elmcity and WordPress
2009-08-21City Data Projects
2009-08-15Evaluating the Usability of Programming Languages
2009-07-31Fall Projects Redux
2009-06-29Four Crowdsourcing Lessons
2009-06-25Mondays This Fall
2009-06-21A Going-Away Present
2009-06-15Crunch Mode and Burnout
2009-06-01Guido van Rossum reviews 'Practical Programming'
2009-05-12Suitable for High School Students
2009-05-09Making Is Thinking
2009-05-05'Practical Programming' Is Available
2009-04-15End-of-Term Showcase Went Well
2009-04-09GSoC Stats: The Last 10% Is The Hardest
2009-03-29End-of-Term Demos on Tuesday April 14
2009-03-25Recent Reading
2009-03-22What I'd Like To Do Next
2009-03-19Keywords Speak Louder Than Words
2009-02-18Papers
2009-02-02Theory vs. Practice: Shall E'er the Twain Meet?
2009-01-02This Term's Projects
2008-09-18Risk Budget
2008-09-08Start of Another Academic Year
2008-08-12Winter Grad Course Evaluation
2008-07-24Fall Courses
2008-07-07Consulting Course Fall 2008 Needs You!
2008-04-07Always Outnumbered, Always Outgunned
2008-03-30Old Dogs Are Suspicious of New Tricks
2008-03-15SIGCSE Day 3
2008-03-14SIGCSE Day 2
2008-03-13SIGCSE Day 1
2008-03-12On My Way To SIGCSE'08
2008-03-06A Student-Oriented Software Development Process
2008-01-21I Wasn't At CUSEC This Year…
2007-12-15Prepping for Next Term
2007-11-22On Being Bumped Up
2007-11-06Measurement
2007-10-25Today Was More Fun
2007-10-02Doomed to Repeat It
2007-07-14ITiCSE'07
2007-07-12User Interface Jam Session
2007-06-26A Thumb on the Scales
2007-06-12Software Games
2007-06-06Java Ecosystems for Python Programmers
2007-05-22Teaching Software Architecture
2007-04-15Jorge Aranda on OLPC
2007-04-12One Laptop Per Child
2007-04-01Knowing Where You Are
2007-03-28Pictures from the Competition
2007-03-26Engineering Strategies & Practice Team Wins Award
2007-03-25New Software Engineering Courses at U of T
2007-03-12What I Missed Most by Not Going to SIGCSE
2007-02-07Research in Action: W00t!
2006-12-18Further Thoughts on Filing Bugs
2006-11-30Writing Blackboard Plugins
2006-09-23Turnitin and Translucency
2006-09-18Taking Intellisense to the Next Level
2006-09-14Step N: Deliverables
2006-09-14CASCON Workshops
2006-09-07Step 4: Respect
2006-09-04Step 3: Your Daily Routine
2006-08-31Step 2: Analysis & Estimation
2006-08-30CSC49X: Figuring Out Where the Goalposts Are
2006-08-14ITiCSE'06 Readings
2006-07-18The Camel's Humps Are Very Popular
2006-07-17Possible CSC49X Projects for Fall 2006
2006-07-09Reorganizing Our Software Engineering Courses
2006-04-13Online Marking Grant
2006-04-08Post-Mortem on This Term's Projects
2006-02-15Entry-Level Requirements Engineering Revisited