"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.