Four weeks into my second term I know one thing for certain: The first term was a cakewalk.
In comparison, I mean. As my brain is flooding with automata theory (above all), logic, databases, and machine-oriented programming, I sometimes longingly hark back to the idyllic times when my worst problem was getting a good grade in Math 101. Not that I would have time to ponder a lot, these days.
And mind you, we don’t do any serious programming, yet. I don’t know whether I mentioned this before, but our programming professor (the same as in the first term) is spending the spring term teaching in Shanghai (yes, that Shanghai) at a partner university of UAS. He will be back in three weeks’ time and then we’ll have the pleasure of doing all the Java staff meant for one term in one-half of a term. A good thing I already know more or less how to program in Java.
So for the moment we have only four courses instead of the five prescribed by the study program. If this sounds like a breathing space it is only in comparison to what awaits us, though. You see, in the first term, we technically had five courses, but in fact only two of these mattered or required any effort: math and programming, the latter of which on paper counted for two courses, theoretical and practical, but came with only one practical training course. CS 101 and business administration required next to no effort, and the practical part had a purely theoretical existence, i.e. it consisted of the professor asking a couple of questions for ten minutes every two weeks or so.
And even the effort needed for math, the major stumbling block in the first term, pales in comparison to what the two math courses this term require. Yes, that’s right. After we had completed our math exam, we were most of us so naïve to assume that now we were done with math for the rest of our studies. We had a rude awakening when the professor we have in automata theory and formal languages as well as in logic and computability (henceforth I will shorten these to “automata theory” and “logic”) sent us his first exercise sheets before the term even started. For one thing, the problems made it crystal clear that both these subjects were just math under a different name. For another, we learned that this term we would have to hand in the solution for an exercise sheet for each of these two courses every week. Each of these sheets is about as long and at least as involved as those for math last term. Except then we had six of them over the duration of the term. Now we have twice the number, for twice the number of subjects, or four times the work load. And that’s in addition to practical courses for the three other subjects. Yes, there is one for each course now, instead of just two, for all practical purposes, in the first term. So we’re looking at the same number of lectures as in term one, but 2.5 times the number of practical courses, and each of these comes with a lot of homework.
Beyond mere numbers, the subjects are a lot more involved this term, and most or all the things we are learning are now new even for those of us who knew a little math or programming when they came here. In the first term, CS 101 rarely went deeper into a subject than the contents of the first two paragraphs of the respective Wikipedia entry, business administration was a lot of common sense and a handful of bookkeeping basics, programming limited to low- to mid-level Ruby and a few class design principles, and even math, in retrospect, kept entirely to things that were at least mentioned in high school, maybe except for proving techniques. Nothing went much beyond what an interested layperson might acquire from reading a few books. This term we get to the hardcore stuff.
In a very literal sense that is true for the so far most fun course this term, officially called “computer architecture and machine-oriented programming”, which takes us into the deepest entrails of the machine, the inner workings of a CPU. Not just bits and bytes, converting from binary to decimal to hex and back, but address buses and data buses, registers and memory, data alignments, carry bits, overflow bits, half-words, big endian, little endian, and so on. You see? If you are not a CS student or programmer yourself, I’ve probably lost you there. And I’m sure I haven’t done so in any of my previous posts. That’s why I said the hardcore stuff. It feels pretty arcane at times. And it’s not just theory either. In the practical course we are running assembly language instructions on a Cortex 4 microprocessor, writing memory addresses to registers, then using them to get data from memory to add numbers etc. And soon it’s supposed to get even more technical. Word is we are going to build a digital voltmeter. Does it show that this course is being taught by a professor from the technical computer science program? His opening quip was along the lines “so you applied computer science guys thought you’d get away with not getting dirty hands and never looking at an actual wire”? As one of my co-students put it, he’d never have thought that some day he’d consider C a high-level language.
I can’t say very much about the databases course yet because it started two weeks late, but obviously this one, too, is going to get pretty technical and detailed (though entirely digital). Mind you, it started rather on the general level, with our first homework assignment being to develop a questionnaire for the requirements for a web shop and to do a bit of research on current trends in database development and research. It’s not accidental, by the by, that the word research occurred twice in the previous sentence, for unlike everybody else we met so far at UAS, this professor emphasizes the academic aspects of our rather practical course of studies. In his opinion, studying at a technical discipline at a Fachhochschule is not about acquiring a professional qualification but the first step towards a career in research. (I seriously doubt that thought had ever occurred to any of the 50 or so students in that classroom.)
Logic started out rather slow as a slightly deeper and more theoretical recapitulation of the propositional logic part of Math 101, truth tables and all that. The last lecture yesterday–the third–however suddenly increased the pace dramatically by introducing quite a number of new concepts: Conjunctive and disjunctive normal forms, Horn clauses, the marking algorithm, resolvents, and a short foray into logic programming, all within the space of three hours. In fact, both logic and automata theory have recently started to exhibit the easily most memorable feature of our Math 101 course–cramming about one-third of the information into the last tenth of the lecture.
But even so logic pales in comparison to automata theory. To be sure, there is some fun in drafting simple finite state machines (graphs with nodes and arrows, of which our CS 101 professor said that they are what CS is all about; or technically states and arcs, in German: Zustände and Kanten), but as always with math, drafting them is only a small part of the work. Mostly we spend our time proving meticulously that they indeed do what they quite evidently do, and in two directions to be sure. So once again we find ourselves pretending to be stupid in just the right way, and then we prove the obvious, and its reverse, using a notation so incomprehensible it might as well be Da Vinci’s right-to-left-written shorthand, or hieroglyphs for that matter. And in all those four weeks I still haven’t found out whether all these various types of automata–deterministic, non-deterministic, generalized (in four flavours), pushdown–are in fact real or just elaborate mathematical models. For all I know they might as well be just a scarily roundabout way of constructing regular expressions. After all, all these “automata” do is read strings.
Did I ever mention that officially–under the study regulations–our workload is 60 hours a week? Five courses, each valued at 6 credits, each credit coming with an average workload of 30 hours, so 180 hours per course per semester. Minus 48 plus 16 hours for attending the lecture and the practical courses, respectively, that comes out as 116 hours divided by 13 effective weeks per term, or 9 hours workload per week per course beyond the actual attendance. At the start of every term several professors repeat these scary figures, fully knowing that only an exceptionally dedicated student without any kind of personal life would ever be able to invest 45 hours a week outside courses. So basically we are expected to deal with a permanently guilty conscience for not being able to study enough.
The math professor (automata theory and logic, I mean) drove home the point this term by proclaiming “you signed up for this,” but then also said we should let him know if our workload exceeded these completely unrealistic figures. So just in case I have recently starting keeping a time log to keep track of my workload. Unsurprisingly, I am a far cry from 45 hours a week. Over the past three weeks, I have always studied for 25 to 35 hours a week, though with an upward trend. Mind you, maybe the official workload gives gross figures allowing for inefficiency, in the same way you don’t actually work 8 hours when you are at work for 8 hours–that time includes talking with your coworkers, getting coffee, reading your emails, and so on. My log lists net working hours in quarter-hour increments, so I may be being too conservative in my calculations.
But the point I actually wanted to make is that per my time log I spend 35-40% of my studying time on a single course–automata theory. Sometimes I need two to three hours to precisely work out a single one of these stupid circular proofs of the obvious, and in between I read a textbook to further my understanding (meaning: to get completely confused). Two weeks I have exceeded the expected workload for this course, once by far (with 16 hours). Programming is on second place with 25-30%, though that’s primarily due to one week in which I worked on a project and logged 18 hours; then logic, accounting for around 20% of my studying time. Databases and machine-oriented programming are in the one-digit range so far, though with databases that may change.
Keep in mind though that we still don’t actually have any programming lectures or exercises, not for another couple of weeks. I did start doing an exercise sheet provided by our China-based professor, writing a complex number class for Java (that caused the 18-hour weekly workload I mentioned), and yesterday I wrote some convenience methods for operations on collections, just for fun. That’s still the difference: Time spent programming never feels like work, or even like studying. But I do wonder how–or in fact, whether–it will still all work out when databases starts with the nasty stuff and the programming marathon begins. Already managing university, work, three kids, and the household requires fine tuning an exceedingly fragile balance for my wife and me. I hope we won’t topple the house of cards before the term is over.