CS 2135 (A03) Individual Project
Implementing an Automated Testing Service

[ Design Phase | Implementation Phase | Grading | Collaboration Policy | FAQ ]

Project Description

You are designing a software system for giving computer-based exams. In particular, you must provide:

  1. A language for specifying exams, and

  2. A program (interpreter) that will give (aka "run") an exam written in your language. Giving an exam entails asking students questions from the exam and reading in their answers. It can also involve giving students progress reports (i.e., what percentage of questions they got right), either at the end or during the exam. Since this is a computer-administered exam, your system should also be able to skip or change questions based on how a student is doing on the exam.

The language you provide would be used by a teacher to write down an exam that your system would then give to a student. The teacher specifies (in the program) which questions to ask, when to skip questions based on past results, when to print summaries of a student's progress, and when to print other messages to the student. Your system (interpreter) "runs" this program to administer the exam to a student.

Your system (language and interpreter) should support the specific exams and interactions shown on the sample exam page.

You will do the project in two stages: a design stage, followed by an implementation stage. Each stage has a separate due date, as described below.

Project Goal

The goal of the project is to make sure each student can define, design, and implement a domain-specific programming language within a software project. This is an individual project -- you may not work with your homework partner, or any other students, on this project (see the collaboration policy for more details).


The Design Phase: DUE Monday, September 29, 11:59pm

For this phase, you must propose a language design for electronic exams. You must submit both the proposed language and Scheme expressions showing how to represent the sample exams in your language:

You do not need to be able to give exams at the end of this stage. In other words, you do not need to implement the interpreter until the next stage. For this stage, we are only asking for the data definitions (the language) and examples of data (how to write the exams in your language).

Not sure how to start? Design phase suggestions.

What to Turn in

Submit an electronic file design.scm or design.ss (under turnin name project-design) containing your work for this phase.


The Implementation Phase: DUE Sunday, October 12, 11:59pm

For this phase, you must provide a function give-exam that, when run, administers an exam to a student, outputting any progress information that the teacher specifies in the exam program. This program should consume an exam (as you define it in your data definition) and return void. The sample exams page show an acceptable format for interacting with students during the exam. You may design another as long as it conveys the same basic information.

We expect that you will revise or enhance your original language design as you try to implement the language. That's fine. Your project report will describe all changes you decided to make.

Warning: This phase is going to take you longer than you think. If you start this the weekend it is due, you're unlikely to finish enough of it to pass the project. One week into the implementation phase, you should have enough code working to ask the questions and read the answers, even if you can't skip questions or print summaries.

The Project Report

Provide a text file with answers to the following questions:

  1. What must the TA do to run your program? Provide concrete instructions (such as "execute (give-exam exam1)") for each of the two sample examples. The TAs won't grade a program that they can't run.

  2. What is the state of your implementation? Explain which features/aspects work and which don't. If you didn't get progress-based question skipping to work, for example, say so. This gives the TAs guidelines on how to test your system.

  3. How have you changed your design since the version you submitted for the design deadline? Explain the changes and why you made them (i.e., I found I couldn't do X because of problem Y with my earlier definition). We're interested in seeing what doing the implementation taught you about the language design.

  4. What, if anything, do you think could be cleaner in your design or implementation? If you are satisfied with your design, say so. If you think certain aspects should really be easier to use, easier to write, etc, explain those aspects and what you'd like to see different. No danger of losing points for honesty here (you'll only lose points for problems that we detect without reading your report) -- we just want to hear your assessment as we determine our own.

What to Turn in

  1. A file exams.scm or exams.ss containing your work for this phase.

  2. A file report.txt containing your project report. Please submit these in plain text, rather than in Word format.

Submit these via turnin, under the name project-final.


Grading

In general, the design phase counts for 25% of your project grade, the implementation phase (including final language design) for 70%, and your project report for 5%.

Design Phase Grading

We will grade your language designs on a 4-grade scale (check+, check, check-, no credit). At this stage, we're looking to see whether you thought out the design phase well -- did you identify appropriate data, control, etc? Does your design adequately support the sample exams?

There's no single right answer for this part, and while we will make suggestions on your designs, we won't give you a single right answer to follow when doing your implementation. Part of the exercise is for you to have to work with, and perhaps revise, your initial language design when it comes time to implement your exam system.

Implementation Phase Grading

In the implementation phase, we will be looking at your final language design and its implementation. More specifically:

Some General Notes on Grading


Helpful Scheme Functions

For I/O in Scheme, you will most want the commands (all documented in the help-desk):

Example:

(define (age-to-year)
  (begin
    (printf "Enter your age: ")
    (let ([age (read)])
      (printf "You were born in ~a or ~a~n"
              (- 2001 (+ 1 age)) (- 2001 age)))))


Collaboration Policy

This is an individual project. Collaboration is not permitted on this assignment. The course staff are the only people you may approach for help with this project (but do come to us if you need help). You may not ask anyone outside of the course staff questions on any aspect of this project. This includes:

Violations of this policy follow the general course collaboration policy, and may result in an NR for the course.

Why this policy? Given the fairly open collaboration policy on homeworks, this assignment helps me assess how much each student understands of the course material. Since some students struggle in timed situations such as exams, the project gives you a more open-ended setting in which to demonstrate what you've understood of the course material.