I am an undergraduate CS major with strong interests in applied math and theoretical computer science. In the past, I've done reasonably well grade-wise in all math-related (that is, pure math, applied or theoretical CS) classes, but I feel that I still haven't taken away as much as i could have from most.

As people who have often taught math courses and had to deal with the inevitable fact that no lecture will be universally effective, what are your suggestions for how I (as a student) can best learn in these classes.

A few problems I've experienced regularly:

When professors try to present long and difficult proofs on the blackboard. I always find it ridiculously hard to understand proofs in real time or to understand verbal and visual explication of the proof simultaneously. I have to look the proof up in a textbook, and the comprehensibility of textbook proofs varies widely.

More generally, accessing the "kernel" of the proof that really makes it comprehensible is sometimes difficult, especially when it's presented more formally. I tend to think of proofs in terms of algorithms, and proofs that don't fit this well tend often evade me.

Definitions, even, (especially in pure math) tend to blend together and become obscure. I've re-learned the basic definitions of probability waaaay too many times.