This is a document describing some of my best practices for studying for 143 exams. Obviously you might have different study habits that work best for you, but I wanted to share some general studying strategies to help you out.
Start studying early and often
Cramming technically helps you learn, but the learning is pretty shallow and quickly forgotten. It is far better to study a little bit every day rather than trying to fit all the studying into the late hours before the exam. It might be a bit more work, but the payoff is worth it!
It's really easy to be overwhelmed with the stress of all your classes and put taking care of yourself on the back burner. This is not a good thing and you should still prioritize being healthy while studying for exams. Surprisingly, your brain is part of your body so keeping your body healthy keeps your brain healthy. This means making sure to stay hydrated, eat a balanced diet of things other than chips and Oreos, and maintain a normal sleep schedule.
It's also important to give yourself some mental breaks every once and a while to make sure you aren't overexerting yourself (likely to cause you to stress or fatigue). Try to do some mindfulness exercises for a few minutes every hour to give yourself a well deserved break! Trying to fit all these things in your busy schedule can be tough at first, but making a habit of them makes it easier in the future.
Study like you test
Students often make a crucial mistake of not adapting their studying to the needs of the test. For example, our exam is going to be on paper so it's really important that you practice writing code by hand so it's not a brand new experience for you when you are taking the real test. Our brains can store a lot of information but it's extremely conditioned on context. Learning a skill in one context (coding on a computer) and never practicing it in the other (writing on paper) can potentially hinder the knowledge you gained during studying since the context is different.
So if you want to study like you are taking the test, what should you do?
- Do the problems by hand with pencil and paper
- Once you have a solution, simulate the code to verify if it's correct. You should at least try it on the sample input but then you might want to consider edge cases mentioned in the spec.
- I surveyed the class last quarter and over 25% of the students in the course said they made a mistake when checking their code and that's why they got a wrong answer. Making sure you can check your code correctly is really important!
- So now you think you have a working solution, go type it up in Practice-It or jGrasp and run it on the sample input to see if your solution is right.
- If you were right, that's good! But if you were wrong, that's even better! Now you have found a mistake in your ability to check your code (i.e. forgetting to handle the empty case). Make sure you check those cases in similar problems in the future.
- Now that you think you've gotten everything you can out of the problem, now you should look at the solution if there is one and verify you didn't miss anything. Once you look at the solution, the problem is kind of ruined since you can't "unsee" the solution.
This process can be slow, but very helpful for your ability to solve problems and check if they are correct.
You should save the full sample exams until the end so you can time yourself as if they were real tests. Remember to include checking your answers as part as your test time
Try to find connections between the problems
Compare and contrast two stacks and queues problems to see how they are similar and how they are different. Trying to figure out these "higher-level" features of the problems will help you see common patterns in solutions. Knowledge is made from connections so forming high-level connections between the problems you solve will help you learn how to solve new types of problems. Reflection is a form of practice that helps you understand the material in a deeper manner. You should reflect on what you found easy and what you found difficult to help guide future practice.
Mix up your practice
Mixing up the types of problems you practice increases long term learning.
There was a study where they were teaching students calculus and how to compute the volume of different solids (spheres, cubes, cones, etc.). One group of students were to practice by first doing all the cube problems, then all the sphere problems, and so on; this practice strategy is called "massed practice". The other group of students were to practice by mixing up the problem types and doing them in a random order. Right after finishing the practice problems, the students were tested on their knowledge. Which one do you think performed better? Turns out the students that did the "massed practice" or a problem type at a time did better! But what about if you test them a week later? The mixed practice students do better! What gives?
Massed practice is like cramming, it can work for short term gains but it's gone when you don't need it. It also requires you to learn the material in a much shallower manner. When you work between problem types, you are able to compare and contrast the aspects of the problem which you worked on and then apply that deeper understanding to future problems. It does a better job of forming connections between the information rather than treating them as completely separate silos of knowledge. It also has the added benefit of fitting the context of real life a bit better since you don't know right away what type of problem you're working on before you solve it!
This is not to say that mixed practice is "faster" than massed practice. It turns out that learning using mixed practice feels a lot slower because of the context switching, but the learning done is deeper and longer lasting than the fast way.
Don't do easy problems. Do problems that challenge you because it's a sign that you have somewhere you can improve. This plays into the concept I talked about earlier in the quarter called a "growth mindset" rather than a "fixed mindset".
People that have fixed mindsets believe their abilities are fixed at birth (i.e. you're either a CS person or not). Because of this, people with fixed mindsets don't like to be challenged because it is a sign of inherit weakness to them. People that have a growth mindset believe they can improve their abilities with practice. This means people with growth mindsets see challenge as an opportunity to learn since they can eventually overcome that challenge with enough practice.
Having a fixed mindset can be very difficult emotionally, but it's something that can change with intentional practice! You have to catch yourself when you are saying "I'm not smart enough" or "I'm not cut out for this" and instead think "I don't get this yet" or "Something isn't working right now, what do I need to change about my studying to see improvement?"
Let us know if you have any questions or if you have more study tips by posting on the message board! We are happy to update this document!
Have any feedback about this reading? Please let us know using this form.
Copyright © 2019 Hunter Schafer and Porter Jones. All rights reserved. Permission is hereby granted to students registered for University of Washington CSE 143 for use solely during Winter Quarter 2019 for purposes of the course. No other use, copying, distribution, or modification is permitted without prior written consent. Copyrights for third-party components of this work must be honored. Instructors interested in reusing these course materials should contact the authors.