I have been teaching Compiler Design for years, and next year I will also be teaching part of Operating Systems.
I really like these kind of courses: these systems are where all the bits of computer science scattered around (algorithms, data structures, languages, architecture, etc) come together – and they have to come together correctly and efficiently, as no one can really afford to have such integral parts of a computing platform fail. And any shaving of even little bits of time can make a huge difference in user experience.
I hope that I am able to transmit my enthusiasm for the subject. I know that when I learned both these topics I was very bored by them, as the courses took an almost anatomic perspective on them: “a compiler is composed of …”, “memory can be classified as…” and so on. I think it is more important to understand *why* designers come up with such convoluted structures, and I hope I explain this. Also, I try to make sure students know there are many many variants on how these systems are built, in ways which can give enormous competitive advantage to one over another.
Operating systems should provide an excellent field on which to base these ideas, especially with so many different OSes surrounding us daily. What I still don’t have a clear picture is: how practical should these courses be? Is it important that students be required to actually look at the programs involved, with some marked programming assignments? Do they have to actually be able to produce code and inject it into a working system, or even build it from scratch? My gut feeling is that this is not necessary, and actually within a crowded curriculum there is no benefit in allocating all that time to learn only some aspects, and potentially waste a lot of effort by debugging programs, which sometimes fail reasons irrevelant to the main topic of the course. However, over the years Compiler Design students have often suggested that a practical component be added, and the OS module certainly has some of the marks allocated to a practical assignment.
At the moment, I am thinking very hard about what kinds of practical work can be added, which will still allow students to get an appreciation of more of the issues which affect the understanding of these complex systems.
— Edit: I’ve just been told that our excellent TAs have been thinking about this too and have come up with an assignment to design and implement scheduling algorithms.