This is a course on how to be a hacker. Being a hacker means a lot of things. It means:
-
wanting to know how and why computers work
-
being efficient / never repeating yourself
-
using and contributing to open source software
-
understanding the edge cases of your software
-
using tools in creative and unexpected ways
-
(occasionally) we combine all these together and break stuff
Hacking is a mindset.
I can't force it on you---it's up to you to embrace it.
For example, we'll be discussing many new tools in this course: a version control system called git
, an editor called vim
, debugging tools called gdb
, valgrind
, and cppcheck
, and we'll be going into quite a bit more depth on how to use the bash
shell and the Linux
operating system.
All of these tools are very weird.
Using them will make you uncomfortable.
At first.
But these tools are powerful.
Mastering these tools will make you a much more efficient programmer.
Once you've mastered them, you'll never go back.
Your main goal in this course is to build your own unix shell. This is the biggest project you've undertaken so far. You'll be developing it as an open source project and will be forced to collaborate with each other at various points.
By the end of the course, you should be comfortable running your own open source project and contributing to other people's open source code.
position | name | office hours |
---|---|---|
lecturer | Mike Izbicki | Thursday 3:30-5:00 PM, WCH110 |
teaching assistant | Taeyoung Kim | Tuesday 3:40-5:00 PM, WCH110 |
IMPORTANT: If you want to contact the instructors about the course, you should NOT do it via email. Instead, you should report an issue via github. We will talk about how to do this in class. This is a system similar to the piazza system you may already be familiar with, but it is more popular for open source software development.
The course textbook is The Art of Unix Programming by Eric Steven Raymond (more commonly known as esr). You can download it for free at esr's website. All required reading is listed in the "assignments" category of the outline below. It includes reading from the textbook and outside sources. You can also get extra credit for reading certain books I've selected about computer programming.
week | date | assignments | topics |
---|---|---|---|
0 | Oct02 | introduction; using vim | |
1 | Oct07 | Paul Graham on what to do in college and Ian Malpass's advice to future software engineers | version control with git |
1 | Oct09 | esr's all about unix and about common software licenses | version control with git |
2 | Oct14 | quiz | syscalls: managing processes (fork ,wait ,exec ,perror ) |
2 | Oct16 | esr's thoughts on unix documentation and part II | syscalls: managing files (open ,close ,read ,write ) |
3 | Oct21 | hw0 | debugging tools (gdb ) |
3 | Oct23 | Paul Graham on how to be a good hacker and Jeff Atwood on how to become a better programmer | debugging tools (valgrind ,cppcheck ) |
4 | Oct28 | quiz | syscalls: managing directories (readdir ,stat ) |
4 | Oct30 | Ycombinator's startup ideas we'd like to fund and Paul Graham's start up funding | shell scripting: io redirection/piping |
5 | Nov04 | hw1 | shell scripting: io redirection/piping |
5 | Nov06 | Patrick McKenzie on salary negotiation for programmers | syscalls: io redirection/piping (pipe ,dup ) |
6 | Nov11 | quiz | shell scripting: control flow with if and for |
6 | Nov13 | esr's thoughts on using make | shell scripting: detailed makefiles |
7 | Nov18 | hw2 | syscalls: signal handling (signal ,sigaction ) |
7 | Nov20 | esr's classic Master Foo | shell scripting: environment variables (export ,PATH ,HOME ,EDITOR ) |
8 | Nov25 | quiz | syscalls: environment variables (getenv ,setenv ) |
8 | Nov27 | THANKSGIVING | |
9 | Dec02 | hw3 | syscalls: pthreads |
9 | Dec04 | esr's thoughts on flaws with unix | syscalls: sockets |
10 | Dec11 | quiz | case study: hacking the email system and the ioccc.org |
10 | Dec13 | hw4 | case study: stuxnet and heartbleed |
This schedule is only a rough outline, and will probably change a lot. If there's something you want to learn not on the schedule, let me know! We have a lot of flexibility in this course to learn fun things.
We will not be using ilearn in this course.
Instead everything will be done using a combination of git and bash scripts.
The file GRADES.md
contains a detailed breakdown of how your grades will be stored electronically, and how you can access them.
We will be using this system as a case study in bash programming and the unix philosophy.
Every assignment specifies different collaboration policies. Some assignments will be individual, and some will be in a group. Follow the specified policy exactly!
I take cheating seriously. When I catch students cheating, I give them an F in the class. Then I forward your case to the academic integrity board and recommend that you be expelled from UCR. Finally, I will post a note on this project with your full name and a description of your infraction. This will be available on the internet forever for future employers to find.
All of your code will be run through an automated cheating detector. It is very good. It understands C++ better than you do and can find instances of cheating much more sophisticated than just copy and pasting.