@futurebird
I'm not entirely sure about several of these:
Computer Hardware
What level is this taught at? Logic gates are fun, but most people struggle to understand how you go from 'and gate' to 'mobile phone'. That's a huge leap. If you take it a bit further and talk about memory and compute (and sequential execution) then you've got some useful building blocks you're straying quite a way from hardware because it's the abstractions that are the important bit.
Encoding and Decoding
In the sense of encoding text as numbers and so on? Definitely core to computer science, but there's a lot there where even most practitioners don't really need to know the details, people who just want a side knowledge of computer science are going to get lost.
The core learning I'd want from this is people to understand that you can represent anything with numbers. The rest of it is information theory, and I'd teach that without direct reference to computers, with problems like:
- Given 12 balls where one is heavier than the others, how many times do you have to weigh it to get the answer?
- Given 12 balls where one is either heavier or lighter (but you don't know which), how many times do you have to weigh it?
Ans so on.
Logic and Control Structures
I'm not sure what this is. Flow control? Conditional and repeated execution is important. The computer science unplugged curriculum had some nice things for teaching this.
Iterration
That's weirdly specific.
Objects & Functions
It's really easy to get into the weeds with details here. A few things:
- Do you think functions and procedures are the same thing?
- Are objects the C model (blocks of data), the Alan Kay model (simple models of computers that communicate by exchanging messages), a language-level representation of abstract data types, or something else?
Databases
To actually understand databases, you need a solid grounding in set theory as a prerequisite. That seems a bit too specialised for a general class.
Ethics and Applications
Very broad, but important.
User Interfaces and Design
A lot of this also doesn't need to start with computers. The Design of Everyday Things has a bunch of good examples. Though you do get to have fun explaining to people why every dialog box on Windows has the buttons the wrong way around.
This has a lot of overlap with psychology, but it's nice to show people that this side of computer science exists.
Computer Networks
At the very least, teaching people the difference between an application, a service, and a protocol, would make the world a better place.
Computer History
Again, this is very board and the value can change a lot depending on what it includes.
The key thing that I don't see on the list is anything about systematic thinking and building abstractions. To me, these are the most important parts of computer-touching and run through a lot of the underlying computer science.