Errors should be explained in as much details as possible. Also explain how to correct it.
After an action, give a description of what happened, e.g. after a mass enroll operation, you can explain which students were added, which were modified, and how many remained the same.
Keep user informed of what is happening, e.g. inform user about sending emails to users.
Disable (rather than hide) unavailable functions so that users know they exist.
Minimize work (to be done by the user)
User convenience is far more important than developer convenience, e.g.
Submitting a page should take the user to the next logical page while showing feedback about the previous action at the same time.
When possible, give an 'undo' instead of asking to confirm every action.
Use defaults so that users are not forced to enter values for each field. This applies to sorting as well (i.e. sort by default using the most likely sorting order).
If only one option is available, choose it by default.
Take user point of view
Use terms from user domain.
Use terms that show 'user intent' rather than mechanism, e.g. 'leave this course' instead of 'delete'.
Be consistent
Use consistent naming guidelines for link, page name, page title.