> Read with pencil and paper in hand, making up little examples for yourself as you go on.
I like to find a difficult question that I can answer with an understanding of the material. This acts as a litmus test of my understanding and a forcing function.
The question can be almost anything, but a general approach I use is to write a "compiler" that maps some concept from the material to a concept I already understand (this normally takes the form of a denotational semantics). Then the question would be, "How can I interpret X as Y?" This technique has its limits since the material can't be too far afield from something I already know and the idea isn't novel but it has been effective for me. The critical bit is forcing myself to write down a fairly comprehensive mapping function. This gets me into the dark corners of my understanding very quickly and adds new questions to answer.