@hackage remarks0.1.2
A DSL for marking student work
Categories
License
BSD-3-Clause
Maintainer
oleks@oleks.info
Links
Versions
Installation
Dependencies (3)
- GenericPretty >=1.2.1
- base >=4.7 && <5
- pretty >=1.1.3.3 Show all…
Dependents (0)
remarks — A DSL for marking student work
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
- One human-readable/editable file per student.
- Export options to spreadsheet-formats.
- git-friendly file format.
- 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,
remarkslooks for files ending in.mrkinside 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.mrkfiles. Their contents is appended, in lexicographic filename order, to the last top-level judgement of<basename>.mrkmixed-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