How to Succeed in the Course
Before we get started, we're going need you to understand and
commit to these five principles:
- The Principle of Simplicity.
Because this is an online course without some of the
social and in-person advantages of a typical on-campus program,
simplicity will help both you, so that you are less
often in need of clarification or help, and will help us so that
we're best able to help you remotely. We're going to achieve
simplicity with the following:
- All the coursework is presented in a particular order and,
even if you're tempted to work on material out of order, we ask that you
stick to the presented order. A lot of thought has gone into
how to lay out the material especially into how microskills
build on earlier skills.
- Please follow instructions precisely because we use
software that performs automated testing of the programs
you submit: this software looks for particular things and needs
your code to be a certain way. Typically this includes precise
naming of files and not mixing up lowercase and uppercase (capital letters).
- The Principle of Practice.
This is perhaps the most important principle of all. Learning
programming is like learning any other complex skill: it takes
continual practice and takes time. Just as you can't learn
a musical instrument solely by watching videos or reading a book,
you can't learning programming without significant practice.
Committing to this principle means understanding and
acknowledging the following:
- Micro-skill hierachy. Any complex skill features
a multitude of micro-skills that need to come together just right.
For example, in learning a new language, you have to learn
the alphabet and words, but also sounds and grammar, and each
of these themselves consist of many microskills such as
diphthongs fluency or grammar expertise. So it is
with programming: ignoring or skipping past some microskills will
impede your progress later.
- Deliberate practice. The science of learning tells us
that the most effective way to practice a
microskill is to push yourself to do something just slightly harder
than your current skill level. Thus, in tennis, you don't want
to practice backhands at your current level of comfort but instead
to try and master something just slightly more difficult.
Some people say that you aren't really practicing if you don't
experience some struggle during practice.
- People are different. As with any skill, people learn
them at different rates. One person might appear to sail through
the initial exercises but struggle later; someone else might find
the early skills very hard and then really take-off. Do NOT judge
your skill acquisition by comparison with others. We have seen
all kinds of students: some of the best students are the ones
that struggled throughout the first few courses.
- Anyone can learn. Saying "I'm not cut out to learn programming"
is like saying "there's no way I can learn Japanese". Anyone can learn a new,
even supposedly difficult, language. It just takes time and patience.
While not everyone can become
a world-expert, you can certainly achieve reasonable mastery over
several courses.
- Delayed gratification.
You won't, and won't need to, understand every detail as you
proceed. Some things will become understandable only towards
the end of the program. You have accept a little confusion
and be willing to push along.
It is tempting to think "if only I receive the right explanation,
then it'll all make sense and I'll be able to program anything".
Unfortunately, this is just not true. We will simplify as
much as possible but you'll have to accept not understanding
every little thing.
- Your approach to struggle. You need to understand
your own reaction to struggle and the key to your
resilience. Do you give up easily and seek help right away?
Are you easily frustrated? If you are willing to develop a
good attitude towards struggle and even celebrate your own grit,
you will succeed more comfortably.
- The Principle of Initiative.
Learning programming and computer science differs from other
disciplines in one significant way: there are many ways in which
a programming task can go wrong. It could have to do with your
own computer setup, some small detail about the text editor,
some issue with version numbers, some problem with installation
or one of many types of programming errors. Contrast this with,
for example, studying biology in which the textbook has everything
you need and there is little uncertainty in just simply working your
way through the material; generally, you tend to believe "if there's
something not in the book, they would have told me".
In computer programming, on the other hand,
you will have to get used to taking initiative in tracking
down problems. Do not expect that "they will tell me everything
I need to know". For example, we can't tell you about every single thing in
a text editor, nor every detail in the programming language.
We'll certainly tell you enough to get
started, but there's at least some that you'll have to explore on your own.
This approach to can-do optimistic self-driven exploration will
be even more needed in later material. It's an essential quality
for a successful student.
- The Principle of Motivation.
An online learner may not have some of the motivational advantages
of an on-campus learner such as a social circle, a fixed schedule, and
regular in-person contact with professors. It's all to easy to
feel low motivation in an online course
especially during a time of struggle. To
create a motivational safety net, we're asking for the following
before you start the program:
- Create a schedule for time alloted to this course and
stick to it rigidly. At least some of that time should be
high quality "first thing in the morning" time.
- Design and implement your micro-reward system.
Give your self small rewards for milestones achieved along
the way. Since the program is divided into units, and each
unit consists of small modules, we think that completing a
module deserves a reward. So, OK, how are you going to reward
yourself?
- The Principle of Integrity.
We are going to assume you are here because you want to learn.
And the only way to learn is to complete all the coursework
by yourself. You cannot learn a musical instrument by having
someone else play it for you. Thus, while it's easy to google
solutions to exercises and succeed in that manner, the only
way to learn is to struggle by yourself. You might be tempted
to think "I'm not like the other homework-googlers, I get
answers online but I make sure I understand them".
Again, no explanation is going develop your skill
level; it's your own practice and struggle that will.
Note that a student
passes a unit by passing an in-person on-campus exam; it is not
going to be possible to pass this exam without learning.
- Important: Your course material is peppered with
lots of small exercises and assignments. Parts of the final
exam will be based on these exercises and assignments, and
therefore, there's no way to succeed in the final exam without doing
these exercises yourself.
Here are some tips based on comments from former students:
- Get ahead of the schedule because there will be busy times when
you fall behind.
- Try to get "in the flow" and do a module in one sitting.
- If any one problem appears to take too long, take a break and
come back to it.
- It's in the nature of programming that the smallest error can be a
showstopper. You will get better at finding them, you have to accept
getting a bit frustrated along the way.
- Do some coursework every day, don't pile it up for the weekend.
- Ask a friend or family member to check in with you or nag you
about the course.
- It feels really good to get a program working!
Lastly, an opportunity for self-reflection. Did you read this whole
page carefully and in sequence? Or did you skim through quickly
and find it too "text-y"? That tells you something about yourself,
about how you read.
We are going to ask that you make a
habit of reading everything
slowly and carefully, digesting and mulling over, as you proceed.
You will need this careful attention to detail in reading
code and the precise instructions that accompany exercises.