Syllabus

— 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 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 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 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.

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.

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.

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. (Announcements are the only way that we will use Canvas in this course.)

Assignments #

Homework assignments will be discussed in class and distributed regularly throughout the semester (approximately every week and a half to every two weeks). Homework assignments will be graded as either “Mastered” (M) or “Not Mastered” (NM). For each homework submission, you will have the change to revise it, e.g., to convert a NM to a M.

If we have time, there will be a challenge assignment later in the semester. It will be graded similarly to the regular 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 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.)

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 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 the proportion of total points you earn in mastered assignments. However, points for sophisticated mastery on the challenge project count as extra credit, allowing a way to earn an A+. The specific thresholds depend in part on which and how many assignments we get to during the semester. The default baseline puts the boundaries at 80% and 90% for B and A, though these may be adjusted downward in your favor, especially if the point totals end up being low.

To get a B- in the class (the minimum passing grade for P/N), you will need to exceed 75% in your score.

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

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)

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. (Or from a friend, Stack Overflow, or any other source.) 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.

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 use code comments to make it clear what code you wrote and what code is 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.

Diversity and Inclusion #

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, at CMU, 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 speak out for justice and support, within the moment of the incident or after the incident has passed. Anyone can share these experiences using the following resources:

All reports will be documented and deliberated to determine if there should be any following actions. Regardless of incident type, the university will use all shared experiences to transform our campus climate to be more equitable and just.

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.

Rough Schedule #

Assignment Due Approximately Notes
swag Week 2
migit 1 Week 4 Concurrent
state-machines Week 5
zippers Week 7 Option A
monoidal-folds Week 7 Option A
migit 2 Week 9 Concurrent
parser-combinators Week 9
regular-expressions Week 11
fast-gibbs Week 12
derivatives End of Semester
laser-tag As time allows
dominoes As time allows
migit 3 As time allows
sym-spell As time allows

A Selection of Upcoming Topics (Week 7+)

Topic
Divide and Conquer
Dynamic Programming
Graph Algorithms
Parsing
Categorical Thinking
Optimization 2
Databases 1
Databases 2
Geometric and Topological Problems
Fun with Semirings
Algebraic Design
Proof Assistants
Proving Correctness