Here's a list of learning strategies and hacks I use when learning computer science. Many of these techniques are applicable to other fields too.
1. Learn in iterations: You're not going to understand everything when you study a topic for the first time, so accept that fact and allocate time for multiple readings. An important question will answer itself many months or years down the line as you make more connections, so being patient is a virtue.
2. Refer the definitive books and websites: The Internet is full of resources. But initially, it is difficult to separate the good websites, books and MOOCs from the bad ones. So work on skimming through all the available options and choose the ones which feel good to you. Even if you spend an extra two days up front on choosing the right resource to get started, the search effort will payoff in the long run.
For example, the w3schools site comes up first on google when you're learning web development or
SQL, but you need to learn to wean yourself off basic tutorials and graduate to better sites like Mozilla Developer Network.
Similarly, I found that I liked the lesser-known book on the Theory of Computation by Michael Sipser instead of the famous book by Ullman because it included intuitive explanations for each proof unlike the Ullman one which made me question my intellectual capacity once every 5 minutes.
On a related note, use site-specific search engines like hn.algolia.com , and curated sites like Reddit and StackExchange before jumping to Google to discover curated books and beginner-friendly material.
3. Be an active producer of knowledge, instead of a passive consumer: Don't be scared to ask questions and provide answers and opinions on StackExchange/Khan Academy/Reddit/Disqus/Quora. This is an effective way to get feedback on your thought process and understanding. For example, when learning Maclaurin and Taylor series on Khan Academy, I had a newbie question and felt embarrassed. But I asked it anyway and received a wonderful reply, which was more helpful than the original video.
4. Celebrate when you solve a difficult problem or achieve a milestone. Don't fixate on things you don't know all the time.
5. Read A Mind for Numbers by Barbara Oakley which explains how to learn better through chunking, taking breaks, spaced repetition, Pomodoro technique and other methods.
6. Read How to Solve it by George Polya and work constantly to enlarge your problem solving toolset: When things aren't going well, don't give up. Instead, give your learning process more structure and go through all the tools in your arsenal.
7. Create a concept graph: Let's say you're difficulty understanding Optimal binary search trees. You need to understand basic proof techniques like proof by induction and proof by contradiction, basics of dynamic programming and optimal substructures, binary trees and some basic probability. So if you have difficulty in understanding any of these prerequisites, focus on learning these concepts and then attack your original problem.
8. Go on a Wikipedia web-crawling spree When you learn a topic completely foreign to what you've studied so far, you'll inevitably be barraged with dozens of new terms. Having at least a superficial familiarity with all the important terms in the topic will make you feel at home faster. Check if the topic has a glossary of terms. If not, then read the first paragraph of a bunch of Wikipedia articles and follow the links to your heart's content. Also follow the topic on Quora/StackExchange and find out all the FAQs and gotchas that beginners have to deal with.
9. Write down a list of questions that you want answered before you even embark on studying a topic. For example, before I started to learn programming seriously and only had an Intro to C programming course under my belt - when branching, looping and arrays were the only tools in my programmer toolbox - I had the following question.
When I log into Google and give my username/password, does the software loop through all the usernames before finding mine? Isn't it too inefficient? Later, (after about a year of self taught programming) I discovered about trees, hash tables and other data-structures, I was ecstatic. I realized that GMail doesn't loop through all the usernames, after all. Now, when I am embarking on learning a new topic, I ask similar questions which keep me motivated when going through tough times - I know there's light at the end of the tunnel.
10. Maintain a list of all your queries and answers along with their timestamps. Sometimes, It may seem as though you haven't made much progress. But you'll be amazed at the improvements you've made when you look back at the same questions a few months later. If you have been slacking off, the data will make you feel guilty and provide motivation to invest more time in your studies. If you follow this process religiously, you'll have a rich data set within months and you can analyze your strengths and weaknesses more objectively.
11. Write to test your quality of thinking: You might think you've learnt something well enough, but how do you validate your hypothesis? Writing about something you've just learnt is an excellent proxy for your clarity of thinking and the level of understanding. If your typing speed isn't fast enough, use Dictation - Online Speech Recognition. You can also record an audio or video of you explaining the concept to yourself or teach a friend or someone on the Internet.
12. Ask provocative questions during your note taking. Don't blindly copy a formula or an algorithm. Note taking is not only a tool for future reviews, but for stimulating your mind and potentially coming up with original thoughts. When I make a note, it usually results in adding multiple questions to my dataset as well
13. Write code / simulations even when you aren’t learning CS. When you’ve communicated your understanding successfully to a computer, you’re pretty much guaranteed to have learned the concept well. This also makes the process interactive and fun (especially when learning through a bland online video). For example, see Udacity’s Statistics class. I have also tried it extensively to learn various probability distributions when following along Khan Academy videos and yeah, it works! For the definitive example, see the animations in The Mechnical Universe lectures where the instructors developed animations to explain physics concepts.
14. Live the concept. Connect your learning to events in your daily life and make analogies. Here's an example. My friends gifted me a soft toy football. Whenever I want to take a break from studying, I kick the ball around our house (much to my dad's chagrin). I noticed that there was a thin straight line from our living room to my parents' room with no obstacles or walls.
So I wanted to check if it was possible to "take a free kick" from the edge of the living room to my parents' room. There was no margin for error if I chose to kick the ball in a straight line. So I had to apply some spin to increase my chances which made it more fun. I had three independent variables to fiddle with - speed, spin and direction. During each break, I would take 10 kicks. I would apply various combinations of the three variables during each session. My average score always hovered around 2 and my highest score was 3 during the first few days and I could feel the Gaussian distribution in my scores even though I did not note them down. After 2 weeks of practice, I reached 6 for the first time. I was elated. But then I realized that this could be an outlier, or in other words, a fluke. How many more scores above 3 do I need to ensure I have really improved? Now, I had to do more sessions and measure my new mean and standard deviation - in other words, hypothesis testing. So yeah, this was one of my first conscious Statistics experiment in real life.