"This is for your own good!". That is what the Instructor told me as he
explained his decision to give me a zero on a very important 50-point
assignment. There were only 7 or so assignments in the class, so I felt that he
was basically taking a wrecking-ball to my grade. Effectively, I had immediately
cost myself half of a letter grade within the first couple weeks of the
semester. To make matters worse, I knew that this would be a difficult course
for me and that I didn't have too many extra points to "throw away". I mean, my
code passed 100% of my test cases, it was an awesome piece of work! How could I
possible have earned a ZERO?
Ok, the Instructor didn't actually use the exact words, "This is for your own good", but he may as well have. I can't remember the actual words as they were buried in a lengthy (and stern) lecture. Furthermore, there was lots of programming "jargon" involved that really didn't mean much to me at the time. Lots of stuff like: "You must ALWAYS follow the spec", and "even though only one word was incorrect, if you passed this work on to another programmer it would take them hours to figure out what you have done". I had certainly never met a "spec" in the real world and couldn't imagine how it could be so important that not following one could make all of my hard work on the project totally worthless. Also, what do I care about another programmer? This was just a CS assignment and there wouldn't be any other programmers I would pass my work off to. Who the heck was he talking about? I was convinced that this Instructor was just being mean, and must have been laughing on the inside as he took away my points for almost no reason. He said that my mistake would require the graders to manually grade my project, and that if his graders had to manually grade every part of every project, they would literally not finish grading before the semester was over. But it was just one word, why couldn't they find it and fix it? It was really no big deal.
Skip forward a couple semesters and I am now a UTCS Proctor. Or should I say I am now the "other programmer" that you will be passing your work off to, in this case, for grading. As a proctor, I create grading scripts to help me grade. Your assignments are still partly graded manually, but I can easily save a few hours with some handy automation. In fact, the correctness portion of your grade is very easy to grade automatically... well, as long as you follow the spec and correctly name all of your files, etc...
I proudly wrote my first Linux Shell script to assist me with the somewhat large weekly task of grading. My script compiles your Java file, 'pipes' in the test cases, prints out the results of your program, and then prints out all of your code so that I can manually grade the remaining requirements of your assignment. It does this for an entire section at a time, so I just run my grading script and then everything I need to quickly grade the whole class is right in front of me. The more efficient my grading process, the quicker I can start on my own projects and homework. So I tested my grading script on a project that I wrote, and, Wow! was it fast and good.
So now I was ready to automatically grade my first batch of projects. Last semester grading took me over 10 hours per week, and I realized how valuable it was to have grading scripts. As I downloaded the projects from the homework server, I was so psyched to enter the world of automation and efficiency. I had really come a long way as a programmer, and now I could quickly write tools to help me automate things. But when I ran the grading script on all of the projects, the error file was longer than all of the projects put together! To add insult to injury, there were errors that I had never heard of and they contained characters that I don't think I've ever seen on a computer screen! This was a total train-wreck. What a disaster, now my grading script that I had spent hours on didn't work, and I still had to grade all of the projects. My efficiency plan had just gone down the drain.
The grading script only does exactly what it is told, so if I tell it to compile "A1.java" but a student submitted "Assignment1.java" then it will never find the file at all. To the student, any reasonable person should easily know that they meant A1.java, so it really shouldn't matter what they name it. But my grading script IS NOT A REASONABLE PERSON, IT IS A COMPUTER PROGRAM. Suddenly I realized that if the students don't exactly follow the spec, then I'm stuck back in the stone ages with manual grading. I can't even go through and automatically compile the projects, much less successfully run the programs against the test cases. I also quickly learned that when I make my program look for "A1.java OR Assignment1.java", the next student might have turned in "a1.java". Wow, I would never be able to handle all of the "special cases". So by the time I searched for each "special case" (read: student's whose programs were usually only off by 1 word), the automation plan was much worse than just manually grading them.
I couldn't have been more bummed out, but suddenly I remembered my Instructor who had given me a zero for the exact same thing. It was kind of like an epiphany, and suddenly I felt the need to go find this Instructor and give him a huge hug. Then I felt horrible for all of the times that I passed him on campus and tried to muster a smile, but I was cursing him on the inside. I suddenly wanted to tell him I was sorry for thinking he was mean, because now I realized he really was doing me a favor and making me become a good programmer. I still had a mountain of projects to grade, but suddenly I was at peace with the zero I received several semesters ago.
Instructors at UT consistently teach that two keys to being a good programmer are 1) "Follow the Spec and 2) "Write your code such that the programmer you hand it off to can quickly and easily use your code". If you take CS 307 with Mike Scott, exactly following the provided "Checklist" on the Assignment pages will help ensure that you don't end up a "special case". Trust me, being on the wrong end of the old "this is for your own good" argument is no fun.