CS340 Final Project

For the remainder of the semester[1], we'll be working on open-ended final projects!

Projects should be substantially more complex than the weekly assignment you've completed up to this pointto give you a general idea, think:

The project is worth 25% of your final grade, with these 3 components:

  1. [5%] Proposal: as described in this document. Due April 18.
  2. [10%] Presentations: On May 7, we'll meet for each group to present their project to the class; for many projects, this will include a demonstration. Depending on the number of projects, presentations will be around 15-20 minutes.
  3. [10%] Artifact: Each group will submit their code and a writeup describing their final artifact. Group members will also complete individual reflections/peer summaries.

Final project proposal

The topic of your final project is intentionally open-ended. The topic can be anything substantial that touches on modeling computer systems, as long as it has sufficient scope.

Examples:

  1. Modeling systems algorithms and verifying correctness (up to some scope) in Alloy. This likely will also include showing incorrect versions fail to verify.
  2. Implementing a property-based-testing system for existing software or a new systems implementation.
  3. Using an SMT solver to verify systems-related topics, potentially related to Alexa's research (talk to me if you are interested in this option)!

Final project presentations

We will have final project presentations on Tuesday, May 9 from 9-11:30am in Sci L037.

Each presentation should be 15-20 minutes. We have 7 presentations total, so 20 minutes is a hard cutoff; you should practice your presentation to make sure the timing is correct. Each group member should speak for a roughly proportional amount of time.

Most presentations will be slides as well as a demo component; you are also welcome to use the chalkboard.

Components your presentation should likely include (does not necessarily need to be in this order):

  1. Motivation and description of the specific problem you have chosen to model. Include diagrams and pseudocode as appropriate. This might take up to half of your presentation time.
  2. Which tool did you use to model your chosen systems problem? Why?
  3. Describe your model, showing either a live demonstration or screenshots of a demonstration.
  4. Describe what tradeoffs you made in choosing your representation. What else did you try that didn’t work as well?
  5. What assumptions did you make about scope? What are the limits of your model?

Project partners

Final projects will be completed in groups of 2-3, or solo with prior instructor permission[2]. I will help with assigning groups, including potentially adding a 3rd person to already formed groups of 2.

Everyone in the group should have some creative control over the project direction. You can either opt to pair-program together, divide responsibilities up within the project, or some combination of the two. See the section below on using GitHub for collaboration.

We want this class to be a supportive community. You are expected to abide by standards of professional behavior when working with your group members. Every group member must:

  1. Remain in regular communication with your group and me.
  2. Contribute meaningfully to the proposal and the project itself.
  3. Allow all other group members to contribute meaningfully (e.g., not rewriting others’ work or taking charge of a piece of the project without discussing first).
  4. Conduct themselves professionally (e.g., arriving reasonably on time for meetings, provide thoughtful feedback on others' work, etc).

If a member of your team is behaving unprofessionally or you are having any difficulty reaching a consensus on project work, reach out to me ASAP!

Project goals

Your project proposal will include a description of your project (what the problem you will model and what technique(s) you will use) and a foundation, target, and reach goal. My evaluation of your project will be partially based on your own stated criteria, although you may pivot throughout development (this is a feature, not a bug, of open-ended projects!).

  1. Foundation. This should describe the basic functionality you plan on completing, the component(s) and property(s) you are confident that you will be able to accomplish in the project time frame. (You will want to discover potential problems with this goal ASAP, and seek advice from if this scope is not working). Completing just this goal roughly maps to an 80%.
  2. Target. This should describe the project you plan on handing in (that is, the scope you think you will mostly likely be able to cover). It should include some interesting component(s) and property(s) that you are fairly sure you will be able to complete. Completing this roughly maps to a 90%.
  3. Reach. This should be something extra that you may attempt after your target goal is reached. It can be something that you aren't sure is possible! A 100% or above requires at least attempting to address your reach goal, or at least describing why the reach goal was not achievable in the project time frame.

GitHub

Since each group's final projects will be different, you will develop your projects as on GitHub with software best practices.

I strongly encourage you to make your project public, but in any case you must add my account (avanhatt) as a collaborator.

GitHub best practices, in general:

  1. You should commit frequently, both to save your work and to document design decisions as you go. Commits should have informative descriptions.
  2. Your README should document how to install and run your project. I suggest you write your README in GitHub-flavored Markdown. More on the README below.

Some policies specific to CS340:

  1. All commits should specify which group members worked on the commit (if more than one).
  2. If not all group members contributed to a commit, or if the commit is large, then it should be opened as a pull request for the other group members to review.
  3. For changes you would like additional feedback on, add me (avanhatt) as a PR reviewer as well.

README

You should maintain an up-to-date README for your project. Write such that a hypothetical CS major could follow the installation steps and basic ideas, even if they have not taken CS340. Here are some examples of points you might cover:

  1. How to install required tools (you can link to tool pages for the main instructions).
  2. How to run your project.
  3. The general problem your project is tackling.

The final README should also include:

  1. What tradeoffs did you make in choosing your representation? What else did you try that didn’t work as well?
  2. What assumptions did you make about scope? What are the limits of your model?

Your final writeup (due May 8) can share much of the text from this README; but I encourage you to develop the README incrementally as you go. The final writeup may include additional private components:

  1. Did your goals change at all from your proposal? Did you realize anything you planned was unrealistic, or that anything you thought was unrealistic was doable?
  2. How should we understand an instance of your model, if applicable?

Reflection

Please complete this reflection, individually (completely separately from your project partner(s)), by 4:00pm on Thursday, May 9.

GitHub issue tracking

I encourage you to organize your project into small, actionable steps, and to track these as GitHub issues on the project. You can use Project Tracking to help organize issues.

Attribution

Some final project structure borrowed from Tim Nelson's Logic for Systems at Brown University.


  1. With a quick digression for SMT 2 next week. ↩︎

  2. Before submitting the proposal, e.g., this week. ↩︎