remarks: A DSL for marking student work

[ bsd3, library, program, web ] [ Propose Tags ]

A DSL for marking student work; see README.md for further details.


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0, 0.1.1, 0.1.2, 0.1.3, 0.1.4, 0.1.5, 0.1.6, 0.1.7, 0.1.8, 0.1.9, 0.1.10, 0.1.11, 0.1.12, 0.1.13
Dependencies base (>=4.7 && <5), directory (>=1.2.6.2), filepath (>=1.4.1.0), GenericPretty (>=1.2.1), remarks [details]
License BSD-3-Clause
Copyright 2017 Oleks
Author Oleks
Maintainer oleks@oleks.info
Category Web
Home page https://github.com/oleks/remarks#readme
Source repo head: git clone https://github.com/oleks/remarks
Uploaded by oleks at 2017-01-16T12:34:50Z
Distributions
Executables remarks
Downloads 8194 total (31 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2017-01-16 [all 1 reports]

Readme for remarks-0.1.1

[back to package description]

remarks — A DSL for marking student work

License: BSD 3-Clause Travis CI (Linux + macOS) Status AppVeyor (Windows) Status"

When judging student performance, it is useful to have both small, composable, quantitative judgements, and qualitative remarks. This makes both spreadsheets and mere text-files ill-suited for marking student work. Although org-mode can solve this problem to a great extent, it becomes a heavy tool in the light of having to mark hundreds of students in a distributed fashion. With org-mode, everything is in one file, while global, intra-student statistics are not needed until all the students have been fully marked.

Design Goals

  1. One human-readable/editable file per student.
  2. Export options to spreadsheet-formats.
  3. git-friendly file format.
  4. Synchronization options with Dropbox and/or Google Drive.

Goal 4 is not necessarily related to remarks, but is related to marking student work with external examiners, who are not always willing to use more explicit version-control systems, such as git.

Status

There is a parser and baseline validator. These can be invoked using remarks parse and remarks check, respectively.

See Issues for a roadmap. Feel free to add or fix some.

Installation

remarks is on Hackage, so you can just use Cabal:

$ cabal install remarks

You can also clone this repository and use Stack:

$ stack build
$ stack install

Syntax

A .mrk file is a list of judgements.

A judgement starts with a header mark (a sequence of #), a title (followed by a :), given points (followed by /), and maximum points (followed by a line break). The number of # determines the depth of the header, and every file must start at depth 1, but may have multiple depth 1 judgements. Headings may be arbitrarily nested, but must sum up correctly. For instance, here is a file containing only quantitative remarks:

# Theory: 27/50
## Question 1: 10/10
## Question 2: 10/20
## Question 3: 7/20
# Practice: 35/50
## Task 1: 20/25
## Task 2: 15/25

The header of a judgement may be followed by qualitative remarks. Remarks begin with an indent (two spaces), and a mood mark:

  • * for neutral/structural remarks;
  • + for positive remarks;
  • - for negative remarks;
  • ? for impartial remarks.

Impartial remarks are good for judgements where the mood is left to be judged by a higher authority. For instance, when a teaching assistant is uncertain, and would like to let the teacher decide, or the solution cannot be used to make a judgement about this point.

Structural remarks are good for listing things to look for. For instance, a (template) judgement for an operating systems exercise may look something like this:

## T1: 15/15

## Formal requirements: 5/5
  * Has code
  * Has XML in a reloadable/testable form
  * Has an explanation

### Quality assessment: 10/10
  * Understands semaphores
  * Understands deadlocks
  * Understands starvation
  * Avoids deadlocks
  * Avoids starvation
  * Avoids race conditions
  * Has a good degree of multiprogramming
  * Solves the problem

Once filled in by a teaching assistant, this may look something like this:

## T1: 7/15

### Formal requirements: 5/5
  * Has code
    + Yes.
  * Has XML in a reloadable/testable form
    + Yes.
  * Has an explanation
    + Yes.

### Quality assessment: 2/10
  * Understands semaphores
    - Seems to treat them as counters. Report doesn't talk about procuring or
      vacating at all.
    - Checks semaphore value directly.
    - Seems to have mixed up procure and vacate.
  * Understands deadlocks
    - If more than 5 cars arrive, then only 5 cars will be allowed to drive
      through, and everything will then deadlock.
  * Understands starvation
    ? Seems to, but this is hard to judge.
  * Avoids deadlocks
    ? See above.
  * Avoids starvation
    ? Can't judge this.
  * Avoids race conditions
    - Uses a busy loop in attempt to synchronize.
    - There is a race condition after the busy loop.
  * Has a good degree of multiprogramming
    + It's a ticket system, so it could be okay.
  * Solves the problem
    + In a complicated way, but yes.

Files and Directories

The file-format is kept "git-friendly" by keeping it comprehensible in plain-text, and allowing for independent marking by splitting the remarks for a student into multiple files.

The simplest setup is to have one .mrk file per student (e.g. basic.mrk).

To support more exotic setups, remarks can also work with directories:

  • If supplied with a directory path, remarks looks for files ending in .mrk inside that directory, and comprehends the files as above, in lexicographic filename order (e.g., directory-with-mrk-files).

  • If there exists a directory <basename> for any <basename>.mrk, <basename> is recursively searched for further .mrk files. Their contents is appended, in lexicographic filename order, to the last top-level judgement of <basename>.mrk mixed-directory).

See the organization samples for some examples of how judgements may be structured using files and directories.

├── basic.mrk
├── directory-with-mrk-files
│   ├── 01-theory.mrk
│   └── 02-practice.mrk
└── mixed-directory
    ├── 01-theory.mrk
    ├── 02-practice
    │   ├── Task1.mrk
    │   └── Task2.mrk
    └── 02-practice.mrk

basic.mrk, directory-with-mrk-files, and mixed-directory all parse to the same judgements. In particular, the output from the following remarks commands is identical:

$ cd samples/organization/
$ remarks parse basic.mrk
$ remarks parse directory-with-mrk-files
$ remarks parse mixed-directory