Archive for February, 2009
The time has come to completely incorporate groups into checkmark. With various discussions with Karen and the crew here are the changes I am going to make to the schema and where I will be heading in the future. But first …
Where We Are
Currently, checkmark supports the simple case where an assignment has groups of a specified size. These groups can be made by the instructor manually or through a CSV upload (which is incompletely implemented – a little bit more on this later) and also by the students themselves. Basic group creation currently works with the current schema: (Which does not include the rubric or annotation stuff) which is explained by Geofrey here.
But, from a need for error checking groups on creation (mainly through the CSV upload) as well how classes like CSC301 run, I decided that we must incorporate a group name (auto-generated or provided) to distinguish between groups. From this we decided to do a small (and hopefully final) revamp on the schema to support the following 3 cases:
- Situations when students choose to work in groups but can choose to work alone on an assignment;
- Situations when groups do not persist across assignments;
- and situations when groups persist across assignments (But sometimes the members of a
group might change)
To support these cases, there are a number of front end and back end changes that need to be made. The front end is fairly straight forward and so I am going to focus on the back end for this post.
Back end Changes
We decided to support these cases with very few changes to the schema. We are going to remove the assignments_groups table and maintain the groups-assignments associations solely in the memberships table with the addition of an assignment_id field. So, the schema now looks like this (Sorry for the change of format from the above picture):
The above cases are now supported as follows:
- Students who choose to work alone will have one entry for the specific assignment in the memberships table, this is the same as the current situation with the addition of the assignment_id field.
- If groups do not persist across assignments, again, this is currently supported.
- If groups do persist, then each student will have a distinct entry in the memberships table for each assignment. This way, memberships can change across assignments by simply changing that students group_id for that assignment and all previous assignment memberships will be maintained. Every time an assignment with persisting groups is created, all the groups from the previous assignment will be copied over by duplicating the entries for the previous assignment and updating the assignment_id.
But this situation is a bit more complicated. Most likely, instructors are going to set up all assignments at the beginning of the term and so the memberships entries for those assignments may already exist before the assignment is released. So, to ensure that each assignment has the most up-to-date group information, we will cascade any group modification actions that happen on any previous assignments to the future (and maybe currently open — by an extension) assignments. This is an expensive operation, but it is not likely to happen often.
It seems that few changes to the schema actually supported what we wanted, without sacrificing much performance (hopefully I am right in claiming this).
Where We Are Going
Now I am going to outline where I plan to go in the future.
I am going to apply all the schema migrations within the next couple of days.
The relationships within the models do not actually change, since assignments_groups was simply a join table and does not hold any extra information on the relationship.
Changes to the Models and Controllers
- I am sure there will be some refactoring that will need to be done, so I will revisit the old code and make sure everything that worked before still works.
- I need to fully incorporate the group names, allowing the instructor to choose when the names will be auto-generated or provided by the user and when the group names should be viewed as well as who can view them.
- Complete the CSV upload, with proper error checking and group creation.
- Implement the functionality (front end and back end) described above for persisting groups.
- … etc. I am sure there is more.
But before I make these changes, I am going to try something I have never tried before and which should be interesting…
Unit Testing, Unit Testing, Unit Testing and Test Driven Development
I am going to try my hand at test driven development and write all the unit tests required to (hopefully) adequately test all of the group functionality. Not only that, I am going to keep a journal of sorts and blog about it! So stay tuned for exciting unit testing goodness.