Only six days of lectures left before the exams start. In all courses save one we have been doing nothing be repetition and examination preparation since New Year’s. My first term sure passed quickly.
All in all right now it feels like the pieces are slowly falling into place. In the last lecture on Business Administration we learned how to calculate the selling price of a product, a very simple exercise of adding up percentages, and this was the last thing missing to make me confident of a good grade in this course. Legal or not, we have access to copies of all of this professor’s past exams, and it certainly looks like this one is going to be as easy as he always promised. In his own words, “you have to be exceedingly stupid to fail in my examinations,” though he was quick to add that there are always a couple of people in each course who are that stupid. And since you can bring everything you want as long as it can’t connect to the internet, and there will be plenty of time, there is no reason to be anxious about this exam. As the saying goes, the grade in this course is basically geschenkt – you get it for free, or very nearly so.
CS 101 is also no cause for worries. Here the professor himself has provided us with all his past examination problems, complete with solutions, so we have had plenty of chances to practise how to solve them. And since his exams have always followed roughly the same pattern for the past eight years, what we need to know to pass this one is fairly predictable . There will be one general question along the lines of “name three …” (important contributors to the history of CS, functions of an operating system, parts of a compiler, areas in which computers have changed everyday life, etc.). Even if you don’t study, there is always a good chance for an educated guess. There will be rules for a very simple formal grammar and we will be asked to give the pattern for words in this grammar and decide whether eight given words can occur in this language or not. We will have to decide whether a few simple arguments unify in the vintage logical programming language Prolog. These are the mandatory questions it seems. In addition, there might be another Prolog problem, along the lines of “what does this predicate (i.e., function) do” and then we give examples of input and output. Nothing of these scares me, because Prolog is unfamiliar in the first couple of hours or so, but when you study it a little more, it fast becomes obvious, and I have been doing that for a full day last week, and the grammar question is close to being a no-brainer. The only somewhat juicy problem we can expect is providing pseudocode for a binary tree search or insertion function, and that’s somewhat involved only because I hate to write code I can’t test – I am the kind of person who codes by starting typing, not by thinking. But since it looks like we’ll have 90 minutes for the exam, and everything else is easily doable in a quarter of an hour, there will be plenty of time to get it right. Then again, it might only be a push and a pop function for a list, stack, queue or such, and that is a two-liner each.
In the programming tutorial course we did a mock theory exam yesterday. There were 18 questions along the lines of “what does term X mean” or “give three examples for Y”, and there was only a couple where I had to guess or forgot to mention one aspect (e.g., I said refactoring meant improving the design of the code without affecting its functionality, but forgot to mention that it also shouldn’t alter the interface). Then we had to translate a simple UML diagram into the outline for a design for the appropriate classes, and implement a couple of Ruby core functions (.map and .flatten, respectively). I made two minor mistakes there (as I said, I don’t easily code on paper and without the ability to test). But all in all this would have been at least an A-, and I finished within 25 minutes, i.e. 20 minutes early. True, the tutors were probably overcompensating for the disastrous mock practical exam a week earlier and were erring on the side of caution both in terms of difficulty and quantity of questions this time. Then on the other hand, for the real exam we can even bring a two-page crib, whereas we had to do the mock exam without it, and with that it should really not be a problem.
About the programming practical exam I am, after the mock exam in the tutorial course, no longer as confident as I used to be. But in the wake of the mock exam the professor repeatedly reassured us that the real thing would not be half as scary. Particularly, he says, we will have enough time to think things through. And since we can consult the Ruby documentation and one reference work as e-Book as well as bring our crib (and I will make sure mine contains example code for those tricky things like passing a code block to a method as an argument), the only somewhat awkward thing will be the unfamiliar programming environment. I will have to use a special exam account installed by the PC lab staff on one of their computers, a Windows machine to boot (I am a Linux person, myself), and if the worst happens I also may have to use a German keyboard layout, which is not only unfamiliar and thus will spoil my work flow to no end, but simply hell for programming (imagine having to hold down both CTRL and right ALT to type even things as simple as a square bracket or a backslash!). But no, the practical Programming exam will not be something to be uneasy about.
Which leaves, of course, math as the primary cause of anxiety. Again math, always math. Last week we wrote the official mock exam there, designed by the professor herself. Full length, full time, real difficulty, the whole shooting match, except we did not have separate tables one table-width apart. Boy, was I nervous!
Out of eight problems, I picked No. 5, the linear equation system, as the one thing I was most confident I could solve by mechanically applying the S.O.P. I had practised this a lot in the past weeks and usually it worked like a charm. Well, not this time. For a start I needed three tries to translate the equations correctly into the Gauss matrix with shaking hands, and then when I had a solution after much too long a time (20 minutes or so) it proved wrong. Not an auspicious start. I left it alone, intending to come back to it if there was time left in the end, and started from the beginning. But problem No. 1 was of the kind I hate most–three sub-problems, each of the kind “prove or disprove that X is an equivalence relation (or a partial order, etc.).” In other words, each required you to prove that X was three or four other things, e.g., reflexive, symmetric, and transitive. Basically each of these properties needs thinking through and then proofing, which for me means at least a couple of minutes per property, so upwards of 20 minutes for the whole problem. With 90 minutes for eight problems–out of the question. So I left that one for later, too.
Down to six. No. 3 was a proof, too, one involving two different equivalence transformations of quantifier expressions (forall, exists). I passed on that one, too. That was 30 minutes into the exam and I knew I had to finally start solving some problems, or I’d come up short. No. 2 was five truth tables. Not a big deal. No. 4 was proving a simple inequation by induction, a question of three minutes, knowing the solution was right (that’s what I love about induction), and briefly wondering why this should give the same number of points as the No. 1 monster. On to No. 6, 15 tick boxes going through all the possible properties of a relation explicitly given as a set of tuples. I draw a diagram (always helps me to understand relations) and ticked my boxes quickly (I got one wrong). No. 7 was two simple proofs (if x and y are rational numbers so is their product), again quite simple. No. 8 had us calculate the composition of two functions explicitly given as a set of tuples, again, calculate a third, and then decide which ones of the originals and the compositions were injective, surjective, bijective, or nothing of these things. Basic stuff.
So with 20 minutes left I wanted to come back to No. 1, the monster problem, assuming confidently I had done everything else. Yet flipping backwards through the pages, I saw to my shock another empty page. I had forgotten, entirely, that I had also skipped No. 3. So I quickly scribbled some vague stuff for part one, not taking the time to think it through, and did a quick equivalence transformation for part two. Then I turned to No. 1, but with just enough time to state some generalities that each came down to “obviously this is so because it is so”. Then time was up, or actually we could have had another 15 minutes, but everybody started talking, so my neighbour and I decided to evaluate what we had got.
So we exchanged our tests, got ourselves the solution from the professor, and started grading. I expect we were too generous, because I came out with an A+ and he with a straight B. In fact, I had next to nothing substantive on No. 1, for No. 3, part 1, I had proved a transformation that simply wasn’t true, and what’s more, my crib even said so, but I hadn’t had the time to read and think. I had messed up one truth table in my hurry, and as I said, my equation system was wrong, though I later found I had made a simple sign error in one place only, so probably close on full points for this one. My neighbour, on the other hand, had made a mistake already in passing the equations into the matrix, which unfortunately caused his system to become unsolvable.
But as I said, we were probably too generous in grading each other’s solutions. I expect our professor would have given us quite a number of points less for partial solutions or vague proofs. Say let’s subtract 15 to 20 points (out of 120 total), and we would probably have come out him with a C+ and me with a B.
Good enough, I suppose. Still, I was kind of shocked, again, by the difficulty of some problems, particularly the first, and by the time pressure. You’d need 100 points for an A+, and with 90 minutes time that means less than a minute for a point, or 11 minutes and 7.5 seconds for each problem. With a problem like No. 1, that’s hopeless and then some. I pressed the professor, again, to at least give us some more time, and she finally relented and made the regular time 100 minutes. If most people are not finished by then, we will get an extension of 15 minutes, so we will have close to two hours if nobody hands in early (and we will make sure nobody does). Doable, I suppose. But I still wonder why the time pressure is necessary.
Mind you, I also asked the professor what kind of a result she expects. The answer, again, was kind of shocking: She expects 50 to 70% of us to fail. For better or worse, she maintains that this is the function of this course: to weed out those not fit for this study program. As I said earlier, I assume some course needs to do this dirty work. But I still wonder. Those who will fail will fail, regardless of how much time we get, because they don’t study or because they simply because they don’t get it. But those of us who do get it, who tried to understand, who did study hard, why do we have to come out with barely a passing grade? After all, it all counts towards the graduation grade. It’s not a big deal, but it doesn’t make sense either. If even the best of us can’t expect a good grade, then something is wrong about this course, or rather, this exam.
In a nutshell, it comes down to what I said earlier: I accept that we need to understand and know how to use most of the many things we have to learn in this course and show in this exam. They are most or all of them pertinent to the study of CS. What I don’t get is why we have to know how to proof these things. We might leave that to the mathematicians. And that would take the horrible pressure out of this exam. Proofing is a time-consuming, circular, and ultimately futile exercise.
Our math professor’s last word on the subject of time pressure was that programmers need to be able to perform under such pressure, so we might as well start now. I suggested in return that we might want to leave learning to program under pressure to the programming courses. In any case, it’s simpler to work on an actual practical problem under pressure than on a mathematical proof. And besides, programming under pressure usually means working towards a deadline in a couple of weeks, at worst a couple of days. A couple of hours, when every minute counts, is an entirely different kind of animal. In short, I consider that argument a post festum rationalization at best, and sort of disingenuous at worst.
But that aside, even in math I am confident I can pass. In fact, I expect our entire core group to pass. So I suppose we will just live with the grade, whatever it is: that also takes some pressure out of the thing.
And everything else is entirely doable.