[So, this past week my Computer Class finally started. We purposefully delayed the start until the school year was well underway so that the students didn't have everything starting at the same time. This class is sortof a continuation of what I taught last spring, and sortof a new class since we'll be taking things a different direction.
Last spring, I covered basic pre-programming skills: number systems + logic and data representation. Later we went into electronics since that meshed well with what was being taught in the students' regular class.
This year I'll be doing (roughly) the following:
- (Review) Pre-programming skills: number systems and logic
- How computers work and computer architecture
- Computer programming (embedded systems like GBA and Arduino, then HTML+JavaScript)
The rest of this post is a rough outline of what I covered in the first class.]
(1) Welcome - Introductions and getting settled.
This was a simple intro and an overview of what the goals are for the class. These goals are:
- Get everyone to understand how computers work
- Get everyone to understand how to write a basic program
I also emphasized that the class will be working together to learn these things. We're not going to zip along and leave people behind, so it's in everyone's best interest to collaborate and help each other out.
My goal is to make all of this seem easy. Your goal is to work together and let me know if anything doesn't make sense.
(2) Roadmap - What we'll be covering in this class.
As a roadmap for the class, I drew (something like) the following on the whiteboard:
| Java App | C# App | HTML/JavaScript |
C/C++ App | JVM | CLR | Browser |
Operating System (Windows, Mac, Linux) |
Kernel, device drivers |
~~~~~~~~~~~~~~~~~~~~ |
CPU, Memory, I/O Devices... |
Functional units |
Logic gates |
Transistors |
Electricity |
Everything above the squiggly-line is software and everything below it is hardware.
Most desktop applications (like Microsoft Office or Adobe Photoshop) that you buy today fall into the "C/C++ App" bucket in the above diagram (although there are many other languages that can be used as well). You can also find a lot of applications written in Java or C# as well, and many websites make use of JavaScript in addition to basic HTML.
Computer classes will typically spend all their time in one of the upper "programming language" boxes: C, C++, Java, C#, JavaScript or whichever language the class is built around. There's nothing particularly wrong with that - it's perfectly valid to choose a language and focus on the parts of programming that are "above" this diagram (like data structures and algorithms).
But notice how many layers there are between the programs you write and the underlying hardware. You have at least the OS and you might also have one or more virtual machines (like the Java Virtual Machine - JVM) or an application (like your web browser). Rarely do programming classes attempt to describe what it going on in these lower layers, and rarer still are those that attempt to describe what's going on in the hardware layers.
But this class is different. In this class we will:
- Start from the bottom and work our way up (for the most part)
- Explore embedded systems (like the GBA, Nintendo DS and Arduino) so that we have fewer layers between the software we write and the hardware we use.
This will help us to actually answer the question: "How do computers work?"
We'll still do some work at these upper layers as well. Once we'll built the foundation, we'll start covering higher level languages and discuss more advanced programming concepts.
(3) So, How do computers work?
I asked the class, does anyone know? How would you describe it to a friend who was curious to know how they worked?
The answers to this question typically fall into one of three categories:
- Magic gnomes
- CPU + Memory + "other stuff"
- '0's and '1's
What's interesting about these answers is that none of them really tell you anything useful about how a computer works.
Compare this to common answers for "how does a car work?" and you can see the difference. Yes, some people will simply say "I don't know" or have stop at an "engine + wheels" description, but a large number of people will be able to talk about "gasoline + pistons + tiny explosions + crankshaft to make rotary motion + wheels". It's not perfect, but there's enough information there to understand why you need put gasoline in a car and change your oil regularly.
Going back to the computer descriptions above, and you'll see that they are (at best) the "engine + wheels" variety. The last 2 (technically correct) descriptions are really not much better than the "magic gnomes" description - none of them make you feel like you understand what's going on.
This is why we'll be focusing (at least at the beginning) on "how computers work" rather than "how to use computers" or "how to program computers".
(4) Binary (review)
[This was a review from material covered at the end of last year, so we went pretty quickly over this.]
I took out a bunch of counters - I use glass counter beads because I like the feel - and dumped a bunch on the table in the front of the class. How many glass beads do I have?
I forget the exact number, but it was something like 25. So I write '25' on the board.
What are some other ways of recoding this number?
- Tally marks: using vertical lines or 正 (in China, Japan and Korea)
- Roman numerals: XXV
- Chinese/Japanese characters: 二五 or 二十五
- Arabic (middle-eastern) numerals: ٢٥
- Scientific notation: 2.5e1 or 2.5 x 101.
What are the advantages/disadvantages of each?
- Tally marks: Good for counting, keeping score in a game (easy to add 1). Bad for numbers greater than ~50. No way to represent 0.
- Roman numerals: Better than tally marks for numbers greater than 20. Still not good for numbers larger than ~10,000.
- Scientific notation: Useful for very large and very small numbers.
- Chinese/Japanese/Arabic: Note that the actual symbols don't matter, they're all valid for representing numbers.
The number system we commonly use is a "positional number system" called decimal or base-10. Key features of our number system:
- Uses 10 distinct symbols, including a symbol to represent zero.
- Positional: Symbols are arranged in positions based on powers of 10: ones, tens, hundreds, ...
- Each symbol changes meaning based on its position. '3' in the ones position means 3, but in the tens position is means 30.
Why ten? We could have used any other number. In fact, some cultures have used 12 instead of 10 because 12 is 'more interesting' (evenly divisible by 2,3,4,6, whereas 10 is evenly divisible by only 2,5). We still have remnants of 12 in our culture (hours on a clock, dozen eggs, ...).
What about base-8 (for octal). That would have 8 symbols: 0,1,2,3,4,5,6,7. Each position would be based on 8: ones, eights, sixty-fours (8x8), ...
How would we represent this number of counters (remember we had 25) in octal? 3 groups of 8 + 1 left over = 3 in the 'eights' position and 1 in the 'ones' position = 31.
What about base-2 (for binary). That would have 2 symbols: 0,1. Each position would be based on 2: ones, twos, fours (2x2), eights (2x2x2), sixteens (2x2x2x2), ...
We were running out of time, so we didn't have a lot of time to practice, but I gave each student a handful of counters and they each practiced counting in decimal and octal and binary. This was review from last year and most remembered how the process worked.
Key takeaways:
- The positional number system was a key cultural advance. Requires a symbol for zero to work.
- The choice of 10 was arbitrary - any number base could have been used.
- Binary uses only 2 symbols 0,1, but it can represent any number that you can in decimal. It just requires more digits.
- Computers do, in fact, use binary for everything. How this works will be covered later.
Ah, well. Out of time.... This is where we'll pick up next week as we do a bit more review of number systems...