Question: **Situation**

Students have three weeks to write a little application (UI, some logic, event handling, persist data to a file). They are given one page with some requirements (input). They are supposed to hand in a compilable and running application (output). No software documentation required.

**Question**

How would you grade a software project? What criteria would you use? Can you give examples?

**Idea**

There are a few areas that seem important to me.

1. Are all the given requirements implemented?
2. Is error handling implemented or does the application crash when the user inputs invalid data?
3. Does the user interface look good, is it usable?
4. Is the code well structured?
	* Each class in a separate file
	* Small methods which do one single task
	* Public methods are documented
5. Can I save the data, quit the application, restart it again, and all the data is reloaded?

Those criteria are very vague, I know. For each of the above criteria, I don't know when to give an A and when to give an F. Any suggestions to improve the criteria and any suggestions on how to grade it?

Answer: 
My policy, my 2 cents:

* Part of the grading corresponds to the expectation of the "customer". if this project is considered as an actual development project in industry, does it deserves that the customer is paying its full price. For instance, I will give 10 points (over 20) for that criteria. If the software fulfil all the requirements then the student is awarded the 10 points, otherwise he/she starts losing some of the points.
* Part of the grading is for the quality of the code (structure, naming of variable, algorithmic aspects, etc.). I give 5 points at max here.
* The rest is for the tasks around the code: modeling, UML stuff, reports, etc. The last 5 points can be found here.
Grading depends on the level of the students. The younger the student the more beneficial it is to be explicit in your grading policy. In an introductory class the grade is paramount for many people who may be taking that class to fulfill a requirement. In upper level undergraduate or graduate classes, grades seem like more of a curious administrative requirement. 

For introductory classes one approach is to enumerate your requirements and give equal weight to all of them. The OP gives five domains. Give each 20 points. I assume that somewhere you specify what the "given requirements" are and what you mean by "error handling". (Are students expected to write custom error classes?)

If a domain has further divisions, such as #4, then divide that domain's points equally among the subdivisions. In this case 7,7,6. 

This makes an explicit enough grading criteria that heads off undergraduate complaints about a biased system while giving the more motivated students something to do beyond writing code that checks off boxes.