Learning to program involves developing several skills. We present this list not to overwhelm you, but to help you manage your learning. Each of you will find some of these skills easier to master than others. Paying attention to which skills you’ve mastered and which need more practice will help you focus your time and efforts in the class.
writing computations in the structured and precise notation of a programming language
understanding how the computer evaluates/runs programs in a given programming language
breaking down problems into individual steps that you can express in the programming language, then combine to produce a program that solves the give problem
reading existing programs (your own or others) to understand how and why they (don’t) work
locating and correcting errors in programs
communicating the design and intent of your programs to those who may read them later
testing that your program does what it is supposed to do
That said, how can you effectively learn and study the material in this class? Here are several tips based on educational research:
Write code, don’t just read it Learning to program involves internalizing the patterns within code: what statements are needed, where do they go, what statements are used for which tasks, etc. When you have internalized a code pattern, your brain can retrieve and reproduce it when you are given a similar problem to solve. You internalize code patterns by actually writing them down, not by reading them (writing and reading exercise different processes within the brain). This is also important because the order in which we write lines of code and the order in which we read them tend to be different. You need to practice each skill (reading and writing) independently.
Tip: When we cover new programming concepts, the syllabus will give a series of short (ungraded) practice exercises. Do as many of these as you need to get the code to come naturally, without your having to look back on your notes.
View CS as learning processes, not facts In some courses, you basically need to learn a bunch of facts and formulas and when to apply them. Programming is different: much of it is about learning a process of creating something or solving a problem, not about memorizing stuff (there’s a bit of memorizing stuff, but memorizing isn’t enough). Don’t expect to learn the material by reading it over and over. Instead, work on learning the steps we take and the questions we ask to make progress on problems. This goes back to the previous point: you won’t learn CS just by reading.
Tip: As you study, try to articulate the steps that we took to solve each problem. Don’t just try to memorize solutions.
View quizzes and clickers as learning, not testing Much interesting research has been coming out about the value of testing in learning. When you encounter a new fact, your brain might store it, but that doesn’t mean that your brain can find it again. In order for you to retrieve facts, your brain needs to have recalled them several times in a useful context. Repeated access to factual information over a period of several days or weeks is what leads to long-term retention of information. Quizzes and clicker questions are designed to help you with this retrieval process.
Tip: Participate in the clicker questions in class. Recognize quizzes as a tool to help you learn, not just a method of asssessment. Our grading system is based on points earned in themes rather than per-assessment averages so that you can make some mistakes but still demonstrate learning a topic later in the course.
Manually simulate how code runs on paper We understand concepts by building models of how they work. Think of a model as a high level map that helps you see how the various pieces of a problem fit together and evolve over time. If you develop a model of how programs work, for eaxmple, then you can use the model to understand and predict how new lines of code should fit into the program. Models are also important because they can break a larger problem into the sub-parts that you need to understand to make sense of the whole problem. Working through models can help you (and us) figure out the actual part of the problem on which you are stuck.
Tip: We will show you various models of how programs work and how data ties together. Practice filling out these models for specific programs, until you are confident that you understand how your programs run. Bring your models to office hours if you aren’t sure about how they work. Working with the models targets the low-level building blocks of learning to program.
Don’t believe in a "geek gene": you can learn this with practice People often believe that programming and computer science is something that some people are "born" to do while others are not. At this level, this idea is false. It is true that different people absorb the techniques faster than others, but that doesn’t mean that only those with the "geek gene" can do well in CS. Approach CS as something that you can learn with practice; don’t tell yourself "I can’t do this because I’m not a CS person". There’s much interesting research on something called mindset: very roughly, it says that if you assume intelligence is fixed rather than flexible, you engage differently with material.
Tip: Don’t fall into the trap of thinking that you can’t learn this. Some of your classmates have programmed before. Not surprisingly, that means they are better at it than you are right now. That doesn’t mean that you can’t learn to do this too. Work with the practice problems and the course staff.