Lecture 1: Course Overview

Monday, April 3

We covered basic class logistics (also available on the course info page), and did Assignment 0 to get everyone set up.

Lecture 2: The Shell and Shell Tools

Wednesday, April 5

We defined what "the shell" is, went over the history/background of the UNIX operating system and the shell as we know it today, and covered how to use basic shell commands.

Useful Resources:

I used a non-standard command bat in my lecture demo; the software installation page contains installation instructions if you want to try it out.

Lecture 3: Data Manipulation

Monday, April 10

We will learn how to efficiently process large datasets (or any other text-based data) from the shell using tools like regular expressions.

There's a great regular expression debugger at regex101.

Lecture 4: Shell Scripting

Wednesday, April 12

We will learn how to write our own "scripts"—mini-programs that combine shell commands.

Lecture 5: Text Editors

Monday, April 17

We will compare and contrast different programs commonly used to edit code; namely, the terminal editor vim and the graphical IDE (integrated development environment) Visual Studio Code.

Lecture 6: Command Line Environment

Wednesday, April 19

We will delve in more detail into the environment command-line programs run within, including:

  • how we configure programs
  • how programs find data (the filesystem)
  • how we can run multiple programs at the same time

We will also cover a terminal multiplexer called tmux; be sure to install it using the instructions on the software page

Lecture 7: Compilers and Package Management

Monday, April 24

We will see two related concepts:

  • how source code (in C and Python) is turned into a program
  • how we can install programs shared by other people

Lecture 8: Computer Networking

Wednesday, April 26

We will learn how computers talk to one another across the internet.

Lecture 9: Version Control I

Monday, May 1

We will learn how to keep track of, switch between, and merge different versions of our code using the popular version control system git.

Lecture 10: Version Control II

Wednesday, May 3

We will learn how to collaborate with others using git and GitHub.

Lecture 11: Build Systems & DevOps

Monday, May 8

We will learn how to set up a system that can automatically compile, test, and deploy our code.

Lecture 12: Debugging and Profiling

Wednesday, May 10

We will cover common debugging strategies and various static analysis tools that can be used to make programming easier.

Lecture 13: Security

Monday, May 15

We will introduce the concept of computer security, including different types of attacks you might see in the real world (and strategies to protect yourself from them).

Lecture 14: Cryptography

Wednesday, May 17

We will see real-world tools used to verify people's identity and keep data secure even in untrustworthy settings (like the internet).

Lecture 15: Virtual Machines & Containers

Monday, May 22

We will set up and run virtual computers on your real computers, both for security and for ease of software development and deployment.

Lecture 16: Cloud & Serverless

Wednesday, May 24

We will set up a connection to a computer running on a "cloud" service, such as Amazon AWS, Google GCP, or Microsoft Azure, and run our own code on it. We will also set up a simpler service using a "serverless" platform, which is a convenient way of deploying code without much work.

Lecture 17: Media Encoding

Wednesday, May 31

We will look at how different types of media (text, images, audio, and video) are represented by computers, including the tradeoffs of different formats.

Lecture 18: Q&A and Conclusion

Monday, June 5

Whatever topics you find interesting! Let us know what you want us to cover.

No Lecture

Wednesday, June 7