According to my grade sheet, Philosophy of Science (where we talk about what science is, what CS is, how CS != math even though CS ~= math). But we were graded on something we were never taught: how to analyze and discuss a text (think high-school essay).
According to my own estimation of my skills: usability and functional design (what the application should do, not how it should work internally), as taught to me. I don't deal well with wooly, unspecifiable problems which I felt bombarded with.
According to my own opinions: the software architecture course. I get that you want to slice your code into loosely coupled pieces which are small (so they're easy to understand) and few (such that the interactions are easy to understand), but I can't agree that passing around single-method stateless classes around is anything other than a really sucky compensation for Java's lack of anything resembling first-class functions. I also can't agree that a unit testing tool which makes me write a python script which autogenerates lots of boilerplate Java code qualifies as convenient. Nor that drowning your code in useless patterns helps you against interface breakage when you have to implement a change which invalidates an invariant of that interface.
That being said, I think philosophy of science is really interesting, I want all usability bugs I find to be fixed, and it's kinda' neat to say that in
sortBy (<) xs
the (<)
is an instance of the Strategy pattern (and Just
is a Factory instance).