A beginner should work through these core units in order, though where noted, some material can be skipped over or deferred.

introduction: learning to program

a first programming language

Introduces a simple programming language called “Pigeon”. Covers expressions, variables, control flow, functions, global variables, et al.

numbers as bits

How numbers are represented as bits.

bits and text

Terminology for talking about bits and discussion of how text is represented as bits.

hardware and operating system basics

The basic components of computer hardware and the low-level software that controls it all.

  • Intro: html
  • Lecture video: Youtube (92 min.)
  • Lecture transcript: txt
  • Lecture slides: pdf, pptx
  • Notes: html
  • Quiz questions: html

programming languages

How source code becomes a running program, how languages are categorized, and a survey of important languages.

the Javascript language

The popular language Javascript (not to be confused with Java, another popular language) is very close semantically to Pigeon, so it’s a natural choice for our first real language. Some important material is only found in the supplement “Javascript continued”:

code practices

A discussion of what constitutes good code and how to write good code.

  • Lecture video: Youtube (69 min.)

the Internet

How the protocols of the Internet work, including discussion of IP, UDP, TCP, ICMP, and HTTP. For background material, you may need to first watch another unit intended for a more general audience (on Youtube).

  • Lecture video: Youtube (60 min.)


An intro to the essentials of creating web pages, HTML (Hypertext Markup Language) and CSS (Cascading Style Sheets).

  • Lecture video: Youtube (73 min.)

Javascript in the browser (with jQuery)

How to use Javascript code to manipulate the elements of web pages. Focuses on using jQuery.

2D graphics (with the HTML canvas)

An intro to 2D graphics programming using the canvas element in the browser.

Object-Oriented Programming (OOP)

Object-Oriented Programming is a paradigm of programming in contrast to the more obvious “procedural” programming. Many popular languages, including Python and Java, explicitly favor the Object-Oriented style.

the Python language

The language Python is very close semantically to Javascript but adds more structured mechanisms for Object-Oriented Programming. Some features of the language are only discussed in the supplementary notes:

  • Intro: html
  • Lecture video: Youtube (59 min)
  • Lecture video (Python continued): Youtube (47 min)
  • Lecture video (Python strings and collections): Youtube (55 min)
  • Notes: html
  • Notes (Python continued): html
  • Notes (Python strings and collections): html
  • Notes (additional Python miscellany): html

Unix system calls

The essential system calls in Unix for files, managing processes, and interprocess communication.


The issues of multi-process and multi-threaded programming.

Unix terminals and shells

Before graphical user interfaces, computer users interacted with the computer using a command line shell—basically, an interactive programming language in which each command the user types is immediately executed. Today, shells are tools still used by programmers and system administrators. In this unit, we’ll focus on the shell language used most commonly in Unix systems, BASH (the Bourne Again Shell). We’ll also discuss a few command-line programs commonly available on Unix systems and discuss how these programs can be tied together through the shell.

the C language

The C programming language is one of the oldest and most influential languages still in use today. Unlike most other languages (including Pigeon and Javascript), C gives programmers a fine degree of control over the hardware, making it suitable for writing systems software (such as operating systems, like the Linux kernel) and for programs requiring high performance, such as the latest computer games. Some features of the language are only discussed in the supplement “C continued”.

This unit is split into two parts, the latter of which can be deferred if you wish to move on:

  • Lecture video (part 1): Youtube (52 min.)
  • Lecture video (part 2): Youtube (44 min.)
  • Lecture slides: pdf, pptx
  • C continued: html
  • Notes (part 1): html
  • Notes (part 2): html

the Java language

Unlike Javascript and C, the Java language heavily emphasizes Object-Oriented Programming. Since the late 1990’s, Java has been the most commonly used programming language. Java’s success has spawned an imitator from Microsoft called C# (“C sharp”), which differs in many details but is fundamentally similar. We cover Java instead of C# mainly because Java is somewhat simpler and still more popular. Some features of the language are only discussed in the supplement “Java miscellany”.

This unit is split into two parts, the latter of which can be deferred if you wish to move on:

  • Lecture video (part 1): Youtube (109 min.)
  • Lecture video (part 2): Youtube (forthcoming)
  • Lecture slides: pdfpptx
  • Notes: html
  • Java miscellany: htmldoc


A database is a specialized program for storing large amounts of data in a way that can be searched and retrieved efficiently. For instance, a popular website like Amazon.com uses databases to store product and customer information. The most commonly used databases are relational databases, which structure data in the style of the relational model. The programs we write typically communicate with a relational database using a query language called SQL (pronounced “sequel”, Structured Query Language).

server-side web programming

Most web sites operate with custom code that governs the storage and presentation of their user data and content. This usually involves storing and retrieving data from a database and generating an HTML response upon each request to the server. Web frameworks facilitate these common tasks. In this unit, we cover the basics of server-side web programming and a specific web framework for Python called web2py.

version control with Mercurial

When we write code, it’s very nice to be able to keep track of all of our changes such that we can always go back to an earlier version when we mess something up. It’s also really important to coordinate our changes with others working on the same code. For these reasons, programmers use programs called version control systems to manage their code. We’ll focus on one such program called Mercurial.

  • Lecture video: Youtube (88 min.)

data structures

The fundamental ways of organizing data, such as lists, maps, and trees.

  • Lecture video: Youtube (38 min.)

searching and sorting algorithms

The most popular algorithms associated with collections and the basics of algorithm analysis.

  • Lecture video: Youtube (48 min.)

cryptography basics

The basics of cryptography, including symmetric encryption, asymmetric encryption, and cryptographic hashing.

  • Lecture video: Youtube (49 min.)

build tools

forthcoming. The whole process of translating source code and data files into a working program is called the build process. In most software projects, we end up building the project many times over as we develop the code, fix bugs, and change features, so it makes sense that we automate this whole process as much as possible. In this unit, we’ll discuss popular build tools, such as the Unix make program.

  • Lecture video: Youtube
  • Lecture slides: pdf, pptx
  • Notes: html, doc
  • Quiz questions: html, doc

software design and engineering

forthcoming. Once you can read and write code, there’s still much to learn about how to go about using code to solve problems.

  • Lecture video: Youtube
  • Lecture transcript: txt
  • Lecture slides: pdf, pptx
  • Notes: html, doc
  • Quiz questions: html, doc

Comments are closed.