summaryrefslogtreecommitdiffstats
path: root/tmp/Teaching CS.page
blob: d44198554d23ad8b2eecb4493c8615ad69deb1ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
---
format: rst
categories: cs
toc: no
...
====================================
Notes on Teaching Computer Science
====================================

:author: Bryan Newbold <bnewbold@mit.edu>

.. note:: Incomplete, just a structure of starting topics

.. contents::

In thinking about how to teach somebody new "how to program" or "about 
computers", it seems like getting the rough big picture is the best first step.


Engineering and Scientific Philosophies
-----------------------------------------
keywords: computation, computability, hierarchy, interface, implementation

In approaching computer science it is important to note an arbitrary division
of the field between "computation" and "computability" that has arisen over
the years. Similar to the "theory" vs "experiment" schisms in other scientific
fields like physics, "computation" puts emphasis on actually generating
hardware and software to run in the real world, while "computability" focuses
on what can be computed and generalizations of specific computations. Of course
they are two sides of the same coin and should be appreciated together.

It is almost impossible to deal with computer systems (hardware or software)
without breaking them up into modules and layers. Perhaps more so than in any
other field, conceptual barriers are reflected in the actual design and
implementation of systems, which can make it hard to learn how things work
because their inner workings are shielded from view both literally and 
figuratively. For example, a software developer writing a web browser doesn't
have to know about what kind of monitor the user is sitting in front of, 
what kind of physical link to the internet they have (or even how this
connection is managed), the details of their computer architecture, how their
application is delegated computing resources, what kind of mouse is being used,
etc etc. 

A more formal example is the ethernet protocol, which is used to
pass data between nodes in a relatively unstructured network. The ethernet
protocol itself lies above the physical "link layer", which means the same
protocol can be used for wireless radio communications or with conducting
wires. It lies below any sort of higher network layers and far below the
"application layer", so large amounts of data can be streamed over it between 
two nodes, or messages between dozens of nodes can be passed over it, or it 
can be only one link in a very large web of interconnections. This flexibility
has made it ubiquitous and is the protocol most network devices use without
a hitch, but occasionally it's imperfections can lead to problems at higher
levels which are hard to track down.

Turing Completeness
-----------------------------------------
keywords: finite state machine, deterministic

Personal Computer Hierarchy
-----------------------------------------
keywords: CPU, RAM, hard disk, peripherals, network, BIOS, motherboard,
    operating system, serial, parallel, interrupts, multicore, register

UNIX Operating Systems
-----------------------------------------
keywords: file system, kernel, driver, threading, 

UNIX is the Latin of operating systems: there were operating systems that came
after, and the average user isn't running a UNIX operating system, but it's
design is simple, functional, and has represents the dominant paradigms for
modern (non-experimental or special use) operating systems. 

As some context, Microsoft Windows is not directly based on UNIX. Apple OSX
and subsequent versions is built on top of a UNIX core. Linux is an open source
implementation of UNIX. BSD was the free UC Berkeley distribution of UNIX which
has branched off into open source implementations like FreeBSD, OpenBSD, and
NetBSD. "UNIX" got started as a Bell Labs research project in the 70's (?)


The Internet
-----------------------------------------
keywords: IP (internet protocol), ARP, MAC, routing, servers, backbone, 
    protocol, email, http, html


Software Development Tools
-----------------------------------------
keywords: compiler, lexical analysis, library, language, interpreter


Data Formats, Structures, and Algorithms
-----------------------------------------
keywords: string, integer, bit, list, pointer, tree, sort, P/NP


Design Paradigms
-----------------------------------------
keywords: server/client, object oriented, wrappers, KISS, parallelization, 
    resource locking, serialization, buffer