Expectations¶
Computational Social Science (CSS) uses computation to understand social phenomena. “Using computation” means giving a computer very precise instructions about what steps to follow to calculate something of interest. This is what it means to “program” a computer. So to do CSS, you have to learn to program computers.
In this class you will learn to write computer programs in Python. The following are all consequences of this primary goal:
High variability: Students have very different levels of prior experience with programming, so the material in this class will be easy for some, and difficult for others.
Lots of practice: There are many small assignments, rather than a few large tests.
Objective evaluation: Computer programs either work as intended or not. We have designed the grading of labs and problem sets so that you can test your code to make sure that it works before turning it in (although see next section on effort).
Scale effort not grades: All students can get a good grade, but students who find the material new and difficult will have to spend more time and exert more effort to get all of their code working properly.
Effort required: For many students, this course requires more effort than most social science courses. To succeed you need to start assignments early, work consistently, persevere through failure (which all programmers, no matter the skill level, must do), and ask questions during class/lab/office hours.
For further details to refine your expectations about this class read:
Class structure¶
Programming requires practice, and this class is structured to give you lots of practice programming. You have opportunities to practice programming as a whole class in lecture, in small groups in labs, and on your own in problem sets.
What we expect of you:¶
Put in a good faith effort. Go to lectures and labs (attendance is not required, but is expected and you will miss out on a lot of important interactions if you cannot attend - especially the labs)
Ask questions as soon as you have a slight inkling that you are confused. Remember that if you are confused, then at least 50% of the rest of the students are likely confused as well. I take all questions seriously and will treat you with respect, and questions help me identify topics/concepts that I am not explaining clearly.
Be proactive: Start assignments early, ask questions early. If you skip lectures and labs, and put off working on assignments until the last minute, we will not be able to help you.
Persevere: You will make errors in your programs - all programmers make errors, no matter their skill level or amount of experience. I started programming in the last century when I was a third year undergrad (1997!) and I know many languages and applications. Nevertheless, I make errors all the time and you will see me make plenty of them while I am coding in class. This can be frustrating, it can sometimes seem hopeless, and you may sometimes want to give up. Do not give up: keep trying and ask for help. This is probably the most important skill of a good programmer, and learning to see errors as learning opportunities instead of personal failures will make for a much more pleasant and productive experience.
What you can expect of us:¶
Responsive: We will respond to questions on slack within one working day.
Transparent and predictable grades. Assignments are mostly auto-graded. You should have a very good sense whether your solutions work for a given assignment before you turn that assignment in.~~
Learning to program¶
TL; DR:¶
Facts are declarative knowledge: what things are true. Skills are procedural knowledge: how to do things.
Learning facts requires memorization. Developing skills requires practice.
Computer programming is mostly a skill.
Therefore, learning to program computers requires lots of practice writing computer programs. There is no way around this, and you will not learn if you just listen to lectures and try to passively absorb the material.
Computer programming is a skill¶
Learning different topics requires some combination of acquiring new skills and committing to memory new facts, but the exact balance of skills and facts differs across domains. Learning to write computer programs is primarily about acquiring a new skill, rather than memorizing new fact. This emphasis on skills makes computer programming classes different from many other classes you may have taken.
Learning facts vs Acquiring skills¶
Skills are “procedural” knowledge – they amount to learning how to do something. Facts are “declarative” knowledge – they amount to learning what statements are true. Acquiring and improving skills is different from learning facts.
Consider a fact, such as “The Battle of Gettysburg happened July 1-3, 1863”. To learn it, you have to commit it to memory, and there are lots of strategies for memorizing things which apply equally well to all facts (e.g., write the fact on a flashcard and quiz yourself repeatedly). It helps to have a larger understanding of the history of the US, and the American Civil War to remember this fact, but ultimately, you just have to remember the fact.
Consider instead a skill, such as shooting a basketball free-throw. To learn this skill you have to practice doing this skill, over and over and over again. Your ability to shoot free throws will not improve much from studying flashcards about free-throw mechanics. Likewise, learning all there is to know about the history of basketball, common basketball strategies and the role of free-throws in the game, etc. will also not make you better at shooting free throws. You have to actually go to a basketball hoop and shoot many free-throws. To acquire a skill uou have to practice. There is no substitute.
Likewise, to learn the skill of programming a computer, there is no substitute for writing many computer programs. So, to teach you this skill, we need to give you ample opportunities (and incentives!) to practice. To this end, we have many problem sets, in-lab exercises, and ungraded practice opportunities.