==================================== Notes on Teaching Computer Science ==================================== :author: Bryan Newbold .. 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