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. 



Best Practices for Learning Mathematics (especially in the classroom)
This is not a universal recipee for anything, rather a few random points.


1) Make sure your background matches the course expectations. If not, work on it before even thinking of taking an advanced class.


2) Read ahead, not behind. Most teachers will tell you what's coming next and if you come to the class knowing half the story already, you can concentrate on the other half and gain double time for absorbing it.


3) Ask questions, ask questions, and ask questions. Don't sit and try to digest everything on your own.


4) Learn each proof to the level that your professor can wake you up at midnight and you'd be ready to present it right away. Keep in mind that there are millions of theorems but only thousands of proofs, hundreds of proof blocks, and dozens of ideas. Unfortunately, no one has figured out how to transfer the ideas directly yet, so you have to extract them from complicated arguments by yourself. 


5) Solve problems, solve problems, and solve problems (not the ones that ask you to do something according to the ready scheme, of course, but the ones that ask you to prove something that is not clear from the beginning). You need to learn how to create simple proofs before you can understand the complex ones.


