If you're looking for a deep understanding of operating systems, take CS 167. If you're the completist type who doesn't leave a room in Zelda until you've sword-tapped AND bombed every wall, take CS 169. CS 169 will give you a few more worry wrinkles, though you'll have virtual memory to show for it, which *sounds* like it could be useful all over the place. 169 doesn't diverge from 167 until after the second assignment, so you get some time to see how you like writing systems code in a stunted subset of C++. 169 works like 123, where your code keeps building on itself (like a snowball, which when unsupervised likes to turn into an avalanche).

In CS 169, all the data structures and function declarations you'll need are given to you; you "just" have to fill them in. Systems code is all about thinking logically and dealing with corner cases, which makes filling in the functions a straightforward process once you understanding the design. The straightforward code also means your bugs tend to be small and simple. This doesn't mean debugging is easy, it means the bugs are more poisonous and hide better (tropical bugs). This all adds up to a somewhat unpredictable time demand. If you work diligently, you will finish every assignments with time to spare --- but you need to plan for the one or two bad lines of code that can hold you up for days.

Yotam