15-440 Assignments

There will be four programming projects and four written homework assignments.

Topic Assigned Due Collaboration Other Info Solutions
Project 0 9/4 9/13 11:59 PM individual
Homework 1 9/13 9/23 11:59PM individual Solutions
Project 1 9/14 9/25 11:59PM (CKPT)
10/6 11:59PM (Part A)
10/16 11:59PM (Part B)
group of 2
Homework 2 10/2 10/13 11:59PM [EXTENDED] individual Solutions
Project 2 10/22 11/5 11:59PM (CKPT)
11/12 11:59PM (Final)
individual Recitation Slides
Homework 3 10/29 11/8 individual Solutions
Project 3 11/13 11/21(CKPT)
12/1 (Final)
group of 2 Recitation Slides
Homework 4 11/20 12/4 (NO LATE DAYS due to exam) individual Solutions

Some of the projects are done in groups for two reasons. The first reason is that this is an opportunity to experience the joys and frustrations of working with others. It's a skill you only get better at with practice. The second reason is that working on coding projects with a partner gives you the opportunity to learn coding practices from your peers, learn to structure you code for cooperation, and work on larger, more interesting projects.

Since 15-440 fulfills the project-class requirement of the CS degree, you will be expected to learn and practice good software engineering, as well as demonstrate mastery of the networking concepts. Both partners in a project group will need to fully understand the project and your solution in order to do well on those exam questions relating to the projects. For example, a typical question might be: "When you implemented X, you came across a particular situation Y that required some care. Explain why this simple solution Z doesn't work and describe how you solved it." We'll pick questions such that it will take some effort to figure out Y. If you didn't take the time to work the problem yourself and just relied on your partner, you won't have enough time during the test to figure it out. Be careful, the insights you'll need will come only from actually solving the problem as opposed to just seeing the solution.

Programming in Go

This term we will be doing all of our programming in Go, a language developed at Google, but now part of an open source project. We believe that Go is an especially suitable language for writing distributed systems for the following reasons:

Go is available on the Andrew Linux machines, including those in the GHC third-floor cluster as /usr/local/bin, with the libraries and documentation in /usr/local/lib/go. /usr/local/bin is actually a symlink to /usr/local/depot/go/bin where Go is actually installed. Because Go is installed on Andrew machines in a custom location, you will need to set the GOROOT environment variable as well. If you use bash (you can execute ps -p to find out what shell you are using), you can add the following line in your $HOME/.bashrc file:

If you use csh or tcsh, you can add the following line to your .cshrc file:

The standard means for maintaining a set of go programs is to have a single directory, named go with subdirectories src (for source code), pkg (for compiled libraries), and bin (for executable binaries). In order to build/compile your Go code for each project, you will need to set the GOPATH environment variable to the project's root directory. For project 0, for example, the GOPATH environment variable can be set by adding the following line of code to your $HOME/.bashrc (assuming you are using bash and that you have copied the p0 project directory into your home directory):

If you use csh or tcsh, you can add the following line to your .cshrc file:

Note that the GOPATH will need to be updated for each new project we release, so don't forget to update it when beginning a new project!

Lastly, you can check out the relevant Go-related posts on Piazza for helpful resources and specific installation instructions.

General Notes on the Programming Projects

A key objective of this course is to provide a significant experience with system programming, where you must write programs that are robust and that must integrate with a large, installed software base. Oftentimes, these programs are the ones that other people will build upon or use as tools. Systems programming is very different from the application program development you have done in earlier courses:

Finally, please note that by design, the projects do not always specify every corner case bit of behavior or every design decision you may have to make. A major challenge in implementing real systems is in making the leap from a specification that is often slightly incomplete to a real-world implementation. Don't get frustrated—our grading will not dock you for making reasonable design decisions! We suggest three general guidelines to follow:

Please keep in mind: The programming assignments are larger and more open-ended than in other courses. Doing a good job on the project requires more than just producing code that runs: it should have a good overall organization, be well implemented and documented, and be thoroughly tested.

Last updated: 2019-07-24 00:17:17 -0400 [validate xhtml]