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 promote critical skills in a way that will pay off during later research, work experience, and beyond. This course, 36-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 several main themes:
- thinking about problems from new perspectives;
- building and using meaningful abstractions;
- crafting elegant, maintainable, extensible software designs;
- choosing appropriate representations and algorithms
- employing effective programming practices;
- establishing efficiency and correctness;
- enabling generalization and reuse; and
- developing efficient workflows.
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 or use particular tools.
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 classes. You will have access to a repository of exercises varying in complexity so that you can target your practice to your experience level. You will also 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. (If your programming experience is limited, please come see me so that we can craft a plan to this effect.)
By the end of this course, you should be better able to:
- use types, algebraic structure, and several programming paradigms to reason about problems and code;
- develop correct, well-structured, and readable code;
- select appropriate algorithms and data structures for several common families of statistical and other problems;
- design useful tests at all stages of development;
- formally verify the correctness of programs and mathematical proofs
- effectively use development tools such as editors/IDEs, debuggers, profilers, testing frameworks, and a version control system;
- design and build a moderate scale software system that is well-designed and that facilitates code reuse and generalization;
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 using GitHub. I will need your GitHub username, so that I can invite you into the course GitHub organization. If you do not have a GitHub account, sign up for a (free) account.
Class attendance and participation are important 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. (Announcements are the primary way that we will use Canvas in this course.)
Assignments #
Homework assignments will be discussed in class and distributed regularly throughout the semester. There are two types of assignments:
- Major assignments are standalone problems. They will be available in the problem bank repository and will be due roughly every two weeks.
- Minor assignments will involve completing or polishing your work on problems and activities from class. These should require relatively minor time to complete, especially if you make progress during in-class activities.
Homework assignments will be graded as either “Mastered” (M) or “Not Mastered” (NM). For each homework submission, you will have the chance to revise your work based on feedback from earlier submissions. Such revision can convert an NM to a M.
There is a possibility that the last assignment will be slightly different. It will be graded similarly to the rest of the homeworks but with an additional performance level “Sophisticated” to acknowledge submissions that go beyond demonstrating mastery of the main concepts.
The criteria for these performance levels are given in the programming rubric.
Also, please note that this course is (nearly) language agnostic. For homework assignments, you can use any reasonable language that the instructors or TAs have worked with, which covers a very wide range. (If you have any questions as to suitability, ask us.)
Code Reviews #
We will have three code reviews during the semester, one individually with me, and two paired with one of your colleagues. Code reviews give you insight into your code and designs by getting feedback from another perspective by an informed user.
In the individual review, you and I will go over your code for one assignment together, discussing your design, approach, etc. and going over questions or issues.
In the paired reviews, you and a colleague will exchange work on the same assignment. You will review each other’s code in a pleasant and constructive manner, and then meet to discuss comments and feedback in each direction.
Deadlines #
Assignments will be made with a specific deadline, although in practice I will offer some flexibility when needed to balance your workload across courses.
You can submit revisions at any time, although at most two per week.
All homework, including revisions, must be submitted by December 9. No submissions or revisions will be accepted after this date.
Grading #
Each homework assignment counts for between 1 and 9 points once it is Mastered. The point value depends on the length and challenge of of the task. It is listed in the problem bank README and at the top of the homework PDF (or next to each exercise, in vignettes).
Your grade is determined by three categories of work:
- 60% Major Homeworks
- 30% Minor Homeworks
- 10% Participation (including code reviews)
Major and minor homeworks are graded in separate categories. Participation includes work in class, questions and interactions in office hours, and engagement with code reviews.
Mid-semester grades will be based on the homework points accumulated prior to mid-semester break.
AI/LLMs #
You may use LLMs and related tools for general informative purposes only: documentation for programming interfaces and language syntax, broad conceptual questions, exploration of topics, and such. It is considered a violation of academic integrity to use feed these tools problems we are working on, in whole, in part, or in analogous versions.
Collaboration, Cheating, and Plagiarism #

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:
- You must first make a serious effort to solve the problem.
- If you are stuck after doing so, you may ask for help from the instructor or TA. You may discuss strategies to solve the problem with a fellow student in the class (though not with people outside the class or with LLMs), but you may not look at their code, nor may they spell out the solution to you step-by-step.
- 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.
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 (including generative AI) may only 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, in whole or in part, or for analogous versions)—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 snippets from online or other sources, you must use code comments to clearly acknowledge code excerpts from other sources. This rule applies to code, 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 to 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 access@andrew.cmu.edu.
A Welcoming Environment #
We must treat every individual with respect. We are diverse in many ways, and this diversity is fundamental to building and maintaining an equitable and inclusive campus community. Diversity can refer to multiple ways that we identify ourselves, including but not limited to race, color, national origin, language, sex, disability, age, sexual orientation, gender identity, religion, creed, ancestry, belief, veteran status, or genetic information. Each of these diverse identities, along with many others not mentioned here, shape the perspectives our students, faculty, and staff bring to our campus. We will work to promote diversity, equity and inclusion not only because diversity fuels excellence and innovation, but because we want to pursue justice. We acknowledge our imperfections while we also fully commit to the work, inside and outside of our classrooms, of building and sustaining a campus community that increasingly embraces these core values.
Each of us is responsible for creating a safer, more inclusive environment. Unfortunately, incidents of bias or discrimination do occur, whether intentional or unintentional. They contribute to creating an unwelcoming environment for individuals and groups at the university. Therefore, the university encourages anyone who experiences or observes unfair or hostile treatment on the basis of identity to reach out and report the concern at this link. All reports will be reviewed and addressed as appropriate and consistent with our policy.
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.