What are good/bad topics for a non-major CS0 course?

I'm teaching CS0 again this fall. This is an introductory course, entirely separate from CS1. It is for non-majors. It doesn't lead to additional coursework or prepare students for CS1 (it's not a prerequisite for anything), so it has no specific goals beyond educating students in concepts of computation and computing. I am specifically asking for recommendations on topics to cover to better help students understand computation and computing, and ideally topics that students who perceive themselves "forced" to take the course will find least objectionable. Below, I will describe what I intend to include, what I am considering adding, and what has been unsuccessful in the past. I am looking for comments/thoughts on any of these things and/or additions.

Given the general education student learning outcomes (SLOs) I have to satisfy/evaluate, I have significant constraints, but I generally want to rethink the course. My goal is to help students appreciate computation and computational thinking and to understand basics of computing systems. I also want to structure the course around labs (although it's not a lab course). I'm going to use Danny Hillis' The Pattern on the Stone, but I'll be adding significant detailed material that Hillis doesn't cover. I am also going to use Don Norman's The Design of Everyday Things, which I use in my CS0 major course, to introduce designing/planning/functional decomposition.

Here are things I've covered on computing/computational thinking and might bring back:

• Basic computer architecture
• Boolean logic
• Finite state machines

Here's what I have covered on design and plan to bring back:

• Norman's concept of "design thinking"
• Theory of mind
• OODA loop
• User testing
• Ethics

• Number systems and base conversion
• AI/ML concepts

Some things that have gone very, very poorly, but I would like to include:

• Basic prob/stat
• Programming basics & AppInventor
• Process-oriented design

The typical student for this course has already decided to be miserable; we're typically able to turn a few heads, but many of the students have gone years without math, so a big chunk of the course is necessarily applied arithmetic and algebra. The ones who are willing to engage with trial & error tend to be effective in AppInventor, but they're precious few.

Any thoughts about what to cover, what not to cover, and how to cover things effectively, are welcome!

• Welcome to CSEducators! I'd like to make a request:could you add a bit of detail about CS0? It's not a generally understood term or universal curriculum. You give a bit of a hint when you mention that the students have decided to be miserable, but some more context would be helpful. – Ben I. Jun 7 '17 at 22:36
• Also, what are "SLOs"? – Ben I. Jun 7 '17 at 22:36
• @BenI. My guess is that SLO = Student Learning Outcomes. – Peter Jun 7 '17 at 22:57
• It feels like we're getting much closer to a viable question here. What is "CS0"? Or "CS1"? I am based in the states, and I have never heard of these things. I can make guesses about what they might be, but they would just be guesses. – Ben I. Jun 12 '17 at 1:02
• If you're interested in discussing how we could narrow the scope of your question with us, feel free to say something in the chat room. We'd be happy to talk about how to improve the question. – thesecretmaster Jun 12 '17 at 1:17

Since you've described this a standalone course, I'd treat it as a "computer literacy" sort of thing. I wrote another answer yesterday that got me thinking about what topics everyone should know about computer science, which I'm adapting here.

I like that you're starting with basic computer architecture. People should understand that there are logical rules and processes between them pressing on the keyboard or clicking the mouse and pixels lighting up on the screen. A logical step from there might be basic network architecture, for the same reason; just as the inside of a computer doesn't work by magic, neither do e-mails move from one computer to another that way. (Do people still write e-mails? Maybe Facebook or Twitter posts1 instead?)

I also agree with your choice of DOET. It was a part of my own CS education in the distant past, though I didn't realize it until I read the book years later on my own and found a particular section to be very familiar. From there, you might also discuss basic security topics, such as passwords; why they're important, how they work, and how they can fail. Obligatory xkcd 936:

A quick mention of the fact that there are problems computers can't solve, no matter how fast we make processors. Not necessarily the whole, heavy mathematical proof, just the concept (again) that computers aren't magic boxes. Maybe a mention of the fact that even though computers are fast, efficiency still matters for computer algorithms.

At least some cursory coverage of programming, algorithms, and data structures should be included, as they are fundamentals of the practical side of things. I've never used AppInventor, but I looked it up just now and it seems like it would do that job. I'm curious why you say it's gone poorly in the past.

AI and ML are cool topics, but I don't see a ton of promise in adding them to the course, given that your students are, by your own description, intending to be miserable, largely uninterested in CS and unlikely to be directly applying what they learn. There is a bit of human element here, which, to be perfectly frank, I probably didn't spend enough time thinking about. Your course plan already seems full to bursting, but if you can make the time, maybe start out day one by asking the students what they hope to get out of the course? It'll be a long and draining semester for everyone, including you, if the students' initial expectation of misery doesn't change.

1: Actually, the first "relatable, common type of web traffic" example I thought of was Netflix movies, but they're technically a terrible example, because Netflix avoids backbone peering. I thought that might be beyond the scope of your course, but I guess that's up to you.

My recommendation is draw from Brian Kernighan's course at Princeton that is designed for a similar audience to what you have.

Here is the course material from Fall 2014.

A few key lines from the course summary:

This course is meant for humanities and social sciences students who want to understand how computers and communications systems work and how they affect the world we live in. No prior experience with computers is assumed, and there are no prerequisites. ...

The labs are complementary to the lectures, though intended to reinforce the basic ideas. They will cover a spectrum of practical applications; two of the labs are a gentle introduction to programming in Javascript.

The course will have fundamentally the same structure as in previous years, but lectures, case studies and examples change every year according to what's happening.

When teaching it, he used the book D is for Digital, which I assign to my AP CS Principles students. That AP class is similar in spirit to a CS0. He just recently released a new edition of the book called Understanding the Digital World. Here is its ToC:

Part I: Hardware
What's in a Computer?
Bits, Bytes, and Representation of Information
Inside the CPU
Wrapup on Hardware
Part II: Software
Algorithms
Programming and Programming Languages
Software Systems
Learning to Program
Wrapup on Software
Part III: Communications
Networking
The Internet
The World Wide Web
Data and Information
Privacy and Security


Kernighan is great at drawing from real-world examples, examples that would speak to the lives of students. His writing is accessible, and he covers a lot of ground successfully.

• This looks like a good list, and I would follow Kernighan in to the depths of Hell. – user737 Sep 1 '17 at 13:20

I'd really recommend adding some materials on security and cryptography. You don't need to get into the nitty gritty details of how it's implemented. I think that everyone should learn a bit (pun intended) about what encryption is and how and why security works so they can be informed.

I think what's particularly practical would be a lesson on how to use the internet safely. Topics like http vs https, not using the same password for everything, etc.