— Alex Reinhart and Christopher Genovese

Computing is an essential—and increasingly important—part of statistical practice and methodology, but computing’s role in the typical graduate Statistics curriculum (including ours) has not been commensurate with its importance. For most students, the primary opportunity to develop computing skills comes during research or analysis projects, but this tends to put completion above learning and tends to cover only those ideas needed for the specific project. While students may be able to take a computing-related course here or there, it is rare for such a course to cover the fundamental concepts in computing and develop critical skills in a way that will pay off during later research, work experience, and beyond. This course, 36-650/750, aims to fill that gap.

The premise of this course is that building a broad and solid foundation in computing will pay significant dividends throughout a student’s research and work career. We will focus on four main themes:

  • effective programming practices;
  • fundamental principles of software design;
  • important algorithms, data structures, and representations; and
  • essential tools and methods.

Along the way, we will also consider a variety of applications and techniques that are important for statistical practice. However, the focus of the course is not on specific statistical techniques. Similarly, although you will practice new tools and approaches to programming, the purpose of this course is not teaching you to program.

A second premise of this course is that practice is the key to developing strong computing skills. To this end, the work will consist of many programming tasks of various sizes, both between and during class. You will have access to a repository of exercises varying in complexity so that you can target your work to your experience level, and you will have opportunities to work interactively with your peers.

Prior programming experience is not a requirement, but if you have not programmed before (or much), you will be expected to work toward learning a chosen language. This course is, for the most part, language agnostic, and indeed, you will be asked to do several (simpler) tasks in a language outside your comfort zone to gain the valuable perspective that this offers.

By the end of this course, you should be better able to:

  • develop correct, well-structured, and readable code;
  • design useful tests at all stages of development;
  • effectively use development tools such as editors/IDEs, debuggers, profilers, testing frameworks, and a version control system;
  • build a small-to-medium scale software system that is well-designed and that facilitates code reuse and generalization;
  • select algorithms and data structures to solve common statistical and computing problems;
  • write small programs in a language new to you.

Class Mechanics #

Classes will feature a combination of lectures, interactive discussions, and (single and group) programming activities. We will often discuss, edit, and run code in class, and we will do many in-class programming activities. Hence, you should bring your laptop to every class.

Assignments will be submitted online. For this purpose, sign up for a (free) account at GitHub. (You do not need to sign up for the educational discount, since it’s all under our organization.)

Participation and attendance are important parts of the class and will count toward your final grade; see Grading below.

Important announcements will be sent to the class through Canvas. You are responsible for adjusting your Canvas notification settings so you receive these announcements.

Assignments #

The main work in this course consists of programming and related exercises. There will be three main types of assignments:

These are short, self-contained tasks that illustrate or build upon an idea we have discussed in class. Many of these involve writing a short program, but others will involve some related task (e.g., debugging, profiling).
These are groups of exercises around a central theme. Working on these exercises in succession is intended to help you understand the central idea more deeply. Within a vignette, each exercise is submitted as a separate homework assignment. We recommend you complete several exercises in a vignette once you start, rather than starting several vignettes and never finishing them.
The Challenge project is a larger programming task integrating several different ideas and skills. You’ll be able to choose between several Challenges at the beginning of the semester, and will then complete your chosen Challenge in three or four parts. Deadlines are shown below.

Using the facilities on GitHub, the TAs will review your submissions and provide feedback. Assignments will be graded on a simple rubric as either “Mastered” or “Not yet mastered”. Challenges can also be graded as “Sophisticated”. “Not yet mastered” assignments require revision to count for credit. The criteria for these levels are given in the programming rubric.

Because revision is an important skill for you to practice, you will have the opportunity to revise your assignments to address issues found during code review. Each assignment and project may be revised at most twice. Review the assignment submission instructions for more details.

You get to select which exercises to do from the repository. The exercises in the repository cover a wide range, both in topic and complexity, and we want you to challenge yourself in selecting exercises that expand your knowledge and skill. At times, however, specific exercises will be assigned to fit with work we are doing in class.

Finally, this course is (nearly) language agnostic: you can use as your primary programming language any reasonable one that the instructors or TAs have worked with, which covers a very wide range. (If you have any questions as to suitability, ask us.) In addition, we believe strongly that getting experience with multiple languages helps broaden your perspective on thinking about problems, so we recommend that you do at least two assignments (simpler ones, if desired) in a language that is new to you. We will offer recommendations in class.

Deadlines #

Homework #

You can submit homework assignments at any time; there are no weekly deadlines. However, you may make at most two submissions per week, including new assignments and revisions of previous assignments.

To get a B in the class, you should aim to have 25 homework points by the end of the semester. We recommend the following minimum pace:

Date Approved homework points
September 20 6
October 18 12
November 15 18
December 10 25

All homework, including revisions, must be submitted by the last date shown. No revisions will be accepted after this date.

Mid-semester grades will be based on the number of homework points received by October 18.

Challenges #

The Challenge is broken up into parts to be submitted throughout the semester. Each part has an initial submission deadline, and after you receive feedback from the TAs, there is a deadline for final revisions of that part.

For students enrolled in 36-750, the Fall 2019 deadlines are:

Challenge Part Initial submission Final version
1 October 1 October 15
2 October 22 November 5
3 November 12 November 26
4 December 3 December 10
Final revisions December 10

For students enrolled in 36-650, the Fall 2019 deadlines are:

Challenge Part Initial submission Final version
1 October 1 October 22
2 October 29 November 14
3 November 21 December 10
Final revisions December 10

Note that students in 36-650 are not required to do Part 4 of the Challenge.

All revisions, including homework and Challenges, must be submitted by the date shown. No revisions will be accepted after this date.

Grading #

Each homework assignment counts for between 1 and 3 points once it is Mastered; the point value is listed at the top of the homework PDF (or next to each exercise, in vignettes).

  • Each Mastered assignment counts for the listed number of homework points. You may earn a maximum of 30 homework points. This maximum is reduced by 10 points for each required Challenge part you do not complete.
  • Each Mastered Challenge part counts for five Challenge points. Prior Challenge parts must be Mastered before later parts can be Mastered.

We use a simple formula to calculate final grades. Let \(H\) be your number of homework points and \(C\) be your number of Challenge points. Then let \[ \text{total points} = H + C. \]

For students enrolled in 36-750, total points translate to letter grades as follows:

Total points Letter grade
55 A+
50 A
45 B
40 C
35 D
\(< 35\) R

For students enrolled in 36-650, total points translate to letter grades as follows:

Total points Letter grade
50 A+
45 A
40 B
35 C
30 D
\(< 30\) R

The points can be modified in several ways:

  1. You gain 5 total points if you earn a Sophisticated on your Challenge.
  2. You lose 2 homework points if you submit or complete a Challenge part late.
  3. You may gain or lose up to 5 total points for outstanding or poor participation in class activities.

Note that you can only achieve an A+ by earning a Sophisticated on the Challenge, because of the limit on homework points. You also cannot skip required Challenge parts and make up for them by doing extra homework, because skipping Challenge parts reduces the maximum number of points you can earn from homework.

Statistics & Data Science PhD students only: As part of the core curriculum, this course is pass/fail by default. Email us if you prefer a letter grade.

Collaboration, Cheating, and Plagiarism #

                       Figure 1: My reaction to plagiarism is much like Calvin&rsquo;s dad&rsquo;s reaction to being hit by snowballs. &ldquo;Suppose you just glanced at code online. How bad would that be? Say maybe you only copied five or ten lines or something.&rdquo; (source)

Figure 1: My reaction to plagiarism is much like Calvin’s dad’s reaction to being hit by snowballs. “Suppose you just glanced at code online. How bad would that be? Say maybe you only copied five or ten lines or something.” (source)

Discussing assignments with your classmates is allowed and encouraged, but it is important that every student get practice working on these problems. This means that all the work you turn in must be your own. You must devise and write your own solutions and carry out your own tests. The general policy on homework collaboration is:

  1. You must first make a serious effort to solve the problem.
  2. If you are stuck after doing so, you may ask for help from another student. You may discuss strategies to solve the problem, but you may not look at their code, nor may they spell out the solution to you step-by-step.
  3. Once you have gotten help, you must write your own solution individually. You must disclose, in your GitHub pull request, the names of anyone you got help from.

This also applies in reverse: if someone approaches you for help, you must not provide it unless they have already attempted to solve the problem, and you may not share your code or spell out the solution step-by-step.

These rules also apply to getting help from other people: friends not in the course, homework help websites, Stack Overflow, and so on.

You can always, of course, ask for help from the course instructors.

You may also use external sources (books, websites, papers, …) to

  • Look up programming language documentation, find useful packages, find explanations for error messages, or remind yourself about the syntax for some feature,
  • Read about general approaches to solving specific problems (e.g. a guide to dynamic programming or a tutorial on unit testing in your programming language), or
  • Clarify material from the course notes or assignments.

But external sources must be used to support your solution, not to obtain your solution. You may not use them to

  • Find solutions to the specific problems assigned as homework (in words or in code)—you must independently solve the problem assigned, not translate a solution presented online or elsewhere.
  • Find course materials or solutions from this or similar courses from previous years, or
  • Copy text or code to use in your submissions without attribution.

If you use code from online or other sources, you must include code comments identifying the source. It must be clear what code you wrote and what code is from other sources. This rule also applies to text, images, and any other material you submit.

Please talk to us if you have any questions about this policy. Any form of plagiarism or cheating will result in sanctions to be determined by the instructors, including grade penalties (such as negative points for the assignment or reductions in letter grade) or course failure. Students taking the course pass/fail may have this status revoked. We are also obliged in report violations to your academic program and the appropriate University authorities. Please refer to the University Policy on Academic Integrity.

Disability Resources #

If you have a disability and have an accommodations letter from the Disability Resources office, we encourage you to discuss your accommodations and needs with us as early in the semester as possible. We will work with you to ensure that accommodations are provided as appropriate. If you suspect that you may have a disability and would benefit from accommodations but are not yet registered with the Office of Disability Resources, we encourage you to contact them at

Wellness #

Course work at this level can be intense, and we encourage you to take care of yourself. Do your best to maintain a healthy lifestyle this semester by eating well, exercising, avoiding drugs and alcohol, getting enough sleep and taking some time to relax. This will help you achieve your goals and cope with stress.

All of us benefit from support during times of struggle. If you are having any problems or concerns, do not hesitate to come speak with us. There are also many resources available on campus that can provide help and support. Asking for support sooner rather than later is almost always a good idea.

If you or anyone you know experiences any academic stress, difficult life events, or feelings like anxiety or depression, we strongly encourage you to seek support. Counseling and Psychological Services (CaPS) is here to help: call 412-268-2922 or visit their website. Consider also reaching out to a friend, faculty member, or family member you trust to help get you the support you need.