6.031
6.031 — Software Construction
Fall 2021

General Information & FAQ

How can I get help in 6.031? Who should I ask?

  1. Before you ask: search the 6.031 course page, Piazza, or the web.

    We’ve tried to make the course documents as comprehensive as possible. Several FAQ questions below describe how to ask for help with specific problems.

  2. For most questions: post on Piazza. How to use Piazza in 6.031 has tips on how to do it and what to expect.

    For questions about TypeScript Tutor exercises, use Report a Problem in the Tutor.

    Do not post code on Piazza. Code cannot be shared publicly, and debugging over Piazza is not feasible.

  3. Visit lab hours and talk to a LA or TA, or visit instructor office hours.

  4. If you need more help than the staff can provide, HKN Tutoring provides free one-on-one tutoring for hundreds of Course 6 students each semester.

Should I email instructors, TAs, or other staff?

No. Please post privately on Piazza, except if you have a grading problem.

How do I post privately on Piazza? Should I restrict my private Piazza post to just certain staff?

Please make private Piazza posts by selecting Post to: instructors and entering “Instructors” to make the post visible to all staff. (Piazza uses “Instructors” to refer to all staff members: TAs, LAs, as well as the two instructors of the course.) Sending to all staff ensures that the right staff member will be able to see your post, and also that your post won’t fall through the cracks.

Do not direct your post only to a few staff members by name, because Piazza does not specially notify them. Your post will be buried among many Piazza questions for your intended recipients, and will be completely invisible to all other staff (particularly to the staff who are making sure questions get answered), so your question may get a delayed answer or no answer at all. To avoid this, always include “Instructors” in your recipients.

How do I report a TypeScript Tutor exercise that seems buggy?

Use “Report a Problem” in the bottom corner of the exercise. It’s easier than putting a screenshot on Piazza, and the tutor automatically includes extra information in your bug report that helps the staff zero in on what might have gone wrong.

How do I get a specific hyperlink to something I want to ask a question about?

When you ask a question, please include a URL pointing to what you’re asking about, as specifically as possible. It makes it easier to write your question and easier for the staff to understand what you’re asking. Here’s how to get a useful hyperlink for various places in the 6.031 web:

  • Course website (including readings, reading exercises, problem set handouts, course policy). Every paragraph on the course website is linkable. Move your mouse cursor into the left margin until an octothorpe # link appears next to what you want to refer to. Click on that #, and your browser’s address bar now has the URL you want.

  • Didit, Omnivore, Caesar, GitHub, Constellation. Links to your pages on these systems are visible to the course staff, so if you have a question about something you see on one of these systems, please include the URL of the page where you’re seeing it. The staff should be able to see it too.

  • Problem set specs. If you have a question about a method or interface spec, point to its TypeDoc API documentation (for example, here is drawSquare() from ps0). You can find links to the TypeDoc API pages in the problem set handout.

  • VS Code, TypeScript Tutor, Git. These tools don’t have hyperlinks, unfortunately. Report TS Tutor problems as described above rather than using Piazza. For VS Code and Git, try to copy-and-paste the text of error messages into your Piazza question, rather than using a screenshot.

Objectives

The prime objective of 6.031 is learning how to write code that is:

  • safe from bugs (SFB),
  • easy to understand (ETU), and
  • ready for change (RFC).

Every idea and skill in the course is calibrated against those goals. Specific objectives include:

  • an understanding of key software engineering ideas, including interfaces, representation independence, specifications, invariants, abstract data types, design patterns, and unit testing

  • the ability to apply these ideas to design, implement, and test a small- to medium-scale software system (up to a few thousand lines of code, multiple modules), by:

    • defining abstract data types
    • writing specifications for operations
    • choosing concrete representations and defining abstraction functions and representation invariants
    • writing a comprehensive suite of unit tests
    • creating regular expressions and grammars for parsing input
    • creating client-server programs that adhere to a given protocol
    • designing a concurrent program using concurrent language features and library types
       
  • an understanding of general programming-language concepts such as static typing, exceptions, access control, interfaces, and equality, and ability to use TypeScript as a particular example language with those concepts

  • the ability to use modern programming tools (e.g. VS Code, Git) and modern programming technologies (e.g. I/O, regular expressions, network sockets, threads, GUIs)

  • experience working in a project team

Is it possible to take 6.031 without the 6.009 prerequisite?

No. 6.009 is a required prerequisite, and exceptions are made only in extraordinary circumstances.

Can I take 6.031 as a listener if I don’t have the prerequisite?

Yes. Listeners are more than welcome to join us in class, and have access to all the course materials, including problem sets. Listeners don’t participate in peer code reviews, don’t get manual grading by TAs, and don’t participate in the group project.

Is it possible to join the class after the first day?

No. Exceptions are made only in extraordinary circumstances.

Is 6.031 a hard class? Can I succeed in 6.031?

We believe everybody entering 6.031 with the prerequisites has the potential to succeed. As with all learning, if the concepts and skills in 6.031 are new to you, mastering them will require hard work.

6.031 requires basic programming fluency provided by 6.0001 and 6.009. If you have less previous programming experience, you may need to work harder in 6.031. For many students with less experience, learning a second programming language (beyond Python) is the biggest challenge, so consider taking an IAP programming class in a language other than Python, or studying on your own, before taking 6.031.

Classes, readings, and nanoquizzes

Class meetings. There are three 90-minute class meetings each week on Monday, Wednesday, and Friday. You are expected to attend all class meetings and to participate actively in exercises and discussions.

Laptops required. Classes will include programming exercises that require a laptop set up with the course tools. If you don’t have your own laptop and you need to borrow one, IS&T has a laptop loaner program that will lend you one.

Readings. Most classes will have a reading that you must read before coming to class, with online exercises that you should do by 10pm the night before the class. The online exercises are designed to be practice for the in-class nanoquizzes, but are not graded for correctness, only for effort. There is no course textbook.

Nanoquizzes. Every class meeting will begin with a short quiz on the required reading for the class, plus recent class meetings. Nanoquizzes are closed-book and closed-notes, with a 3-minute time limit. The nanoquiz is part of the grade for each class, along with reading exercises, in-class programming exercises, clicker questions, and other activities.

The lowest 5 classwork grades are automatically dropped, so you are automatically excused from up to five classes. You can also make up missed or low classwork grades. More info: details of classwork grading and makeup.

Why is 6.031 structured the way it is?

Practice and feedback are key to learning, and 6.031 is structured to provide as many opportunities for practice and feedback as possible. That means we don’t want to spend class time on lectures, we want to spend it on exercises to practice the concepts and skills of building software.

Citations: Wieman et al., Course Transformation Guide · Deslauriers et al., Improved Learning in a Large-Enrollment Physics Class

Why is attendance in class required?

Class meetings are all about practice and feedback. The individual, pair, and small group questions, exercises, and coding problems we work on in class, and the discussions and feedback led by instructors, are a required component of 6.031.

Class is like swim/judo/math team practice: you don’t get good unless you show up, and practicing with others is a necessary complement to practicing alone.

I was or will be absent from class for one of the following:

  • Athletic event
  • Interview
  • Travel
  • Brief sickness or medical problem

… or couldn’t participate because of a technical issue, what can I do?

You are automatically excused from up to five classes. The grade for the missed nanoquiz and in-class work will be recorded as 0, but the lowest 5 classwork grades are dropped. You can also make up classes for partial credit by following the procedure for makeups.

We expect everyone to have to miss class for a legitimate academic, personal, or health reason at some point during the semester: that’s why the lowest grades are dropped automatically.

I was or will be absent from class because I have potential Covid symptoms, what can I do?

Like any brief sickness or medical problem, start by allowing that class to be one of your automatic drops. Consider submitting a makeup for extra practice, but first get some rest.

If you are comfortable doing so, please forward your medical hold email to the 6.031 instructors so we can take note of the circumstances. And if later in the semester you are concerned about needing to miss class for other reasons, please visit instructor office hours so we can discuss.

If you will be absent longer because you must isolate, see the next question about extended absences.

I was or will be absent from class for an extended (multi-day) period for:

  • Medical reason
  • Mental health reason
  • Religious holiday

… what can I do?

If you haven’t already contacted S3, talk to them to get help with all of your classes, not just 6.031. Then email the 6.031 instructors to explain the situation, and cc: your S3 dean for support. In some situations, you will be able to make up the classes you missed for full credit.

Why are we sometimes asked to close laptops during class?

Your laptop is a necessary tool for in-class programming, but it also presents a huge opportunity for distraction. The price of that distraction is paid not only by you, but by all those around you who can see your screen. In one study linked below:

  • For note-takers with laptops, multi-tasking led to a 11% drop in comprehension test scores.
  • For note-takers without laptops, merely having a laptop multi-tasker in their field of view led to a 17% drop in comprehension test scores!

If you want to use a smartphone in your lap, so that the screen is not visible and not distracting to others, we have no objection, but you’ll still be hurting yourself.

Citations: Sana et al., Laptop multitasking hinders classroom learning for both users and nearby peers · Mueller and Oppenheimer, The Pen Is Mightier Than the Keyboard

Why do I need to read the readings and complete the reading exercises the night before coming to class?

Reading the material before class prepares you to spend class time practicing the concepts and skills you’re learning. Reading in advance gives you time to think and ask questions, and repeated exposure to material spaced out over time improves learning.

See: Spacing effect

Why does the class have nanoquizzes on topics before we practice them in class?

Nanoquizzes assess whether you did the reading and practiced with the reading exercises before coming to class, and they provide feedback to you on your comprehension. Nanoquizzes are themselves part of the practice we do in class: recalling information from the readings benefits learning more than just re-reading or re-hearing it.

See: Testing effect

Are past nanoquizzes available?

No. However, reading exercises are often based on (or copied from) past nanoquiz questions.

Problem sets, iteration, and slack days

Problem sets. To consolidate your understanding of the ideas from class, you will do five problem sets, PS0 to PS4, involving both design and implementation work. Problem sets will be done individually. More info: collaboration on problem sets.

Code review. As part of each problem set, there will be a code-reviewing period when other students and staff will give you feedback about the code you submitted, using a web-based system. You will be expected to participate in this process by reviewing some of your classmates’ code. More details about objectives and guidelines for the code reviewing process: code reviewing.

Iteration. Each problem set will have two submissions, alpha and beta. The alpha submission will be graded and will be subject to code review. The beta submission is due a few days after you receive feedback on alpha. You will be expected to iterate on your design and implementation, fix any failed test cases, and revise your code based on code review feedback.

The beta submission must address all the code reviews received by the alpha submission. More details here: how should I address my code reviews?

Since the beta submission happens after code review for the problem set, it’s understood that you’ve looked at other students’ written solutions, and been inspired by other ways to solve the problems. You must be exceedingly scrupulous, therefore, in not using those written solutions during your revision. Both your original code and your revised code must be your own. Looking at other students’ answers to the problem set while you are revising your solution will be considered a violation of the collaboration policy.

Slack days. To give you some flexibility for periods of heavy workload, minor illness, absence from campus, and other unusual circumstances, you may request limited extensions on problem set deadlines, called slack days. Each slack day is a 24-hour extension on the deadline. You have a budget of 10 slack days for the entire semester, which you may apply to any combination of problem sets, on either the alpha deadline or beta deadline or both. You can use at most 2 slack days for a given deadline. After your deadline has passed, whatever has been pushed to your repository on github.mit.edu is what we will use for grading.

You must request your extension before the problem set is due, by logging into the Caesar code-reviewing system and clicking on Request Extension. The system keeps track of your slack days and informs you how many you have left.

Slack days are atomic; you can’t chop them up into slack hours or minutes. If you choose to use a slack day because you’re struggling with an assignment, go to bed and sleep, and get help in the morning. Seriously, that’s why the smallest unit is a day.

Slack days apply only to individual problem sets, not to team projects.

If you have used up your slack days or exceeded the 2-day limit for a single deadline, you will need an instructor’s permission and support from an S3 dean for more extension, and your circumstances will have to be extreme to justify the special request.

Can I change my slack day request after I’ve made it?

You can increase your slack request before your current deadline passes, by visiting Caesar and clicking Change Extension. You can decrease your slack request only if your new deadline would still be in the future. See also: I forgot to push my work or make a slack day request…

I need an extension but I used up my slack days, what can I do?

As described above, only extreme circumstances will justify a request for extensions beyond the usual slack days.

If you haven’t already contacted S3, talk to them to get help with all of your classes, not just 6.031. Then email the 6.031 instructors to explain the situation, and cc: your S3 dean for support.

I forgot to push my work or make a slack day request before the deadline, what can I do?

  1. Push your work immediately to maximize the likelihood it can be considered.
  2. Post privately on Piazza and explain the circumstances.

I forgot to do code review or missed the code review deadline, what can I do?

You cannot make up missed code reviews. You can recover code-review-participation credit by doing excellent code reviews on future problem sets.

I failed many auto-grader tests because of a small mistake, can my problem set be re-graded?

Correctness is one of the central ideas of 6.031, and it’s your responsibility. On later problem sets in the course, you will have more and more design freedom, which means we can test your individual components less and less: we can only test the required specifications. You must use your own careful design and thorough testing to achieve correctness.

This sort of issue is one of the reasons we have iterative submissions: your beta submission is the opportunity to fix problems with your alpha and recover partial credit.

I don’t think my problem set was auto-graded fairly or correctly, what can I do?

If your submission did not compile and pass the public tests on Didit, we are not likely to reconsider the grade. It’s your responsibility to ensure that your submission passes those tests.

  1. Investigate the problem by visiting lab hours, since debugging on Piazza is infeasible.
  2. If there was an issue, post privately on Piazza and explain the circumstances.
  3. Visit instructor office hours.

How is the overall grade for a problem set determined?

The overall grade for a problem set will be weighted as roughly half from alpha and roughly half from beta, but it may vary from one problem set to another.

Grades on both iterations will be determined both by automated tests and by graders reading the code. One part of the beta grade is fixing your code in response to code reviews.

The grading breakdown will vary from problem set to problem set (for example, depending on how much can be autograded and how much requires human eyes), and the relative weights of components of automated and manual grading can change from alpha to beta. Each problem set’s breakdown will be announced when grades are released.

When will grades be released for a problem set?

Grade reports for a problem set are released as quickly as possible, but it depends on the speed of manual grading. We grade as fast as we can. Even before beta grades are released on a previous problem set, you can use the alpha feedback to improve your work on the next problem set.

Can I use slack days on assignments other than problem sets?

No.

Projects and quizzes

Project. You will complete a group software development project at the end of the semester, in a team of three students. Every team member is required to participate roughly equally in every activity (design, implementation, test, documentation), and we may ask for an accounting of what each team member did. A single grade will be assigned to all members of the team.

Project teams. Before the project, you will be able to request one or two teammates you would like to work with. If you don’t already know other students in 6.031 this semester, we hope that working together on in-class exercises will give you the opportunity to find potential project partners.

Team meetings. During the project, you and your project team will meet with your TA to discuss the work. Your TA will assign a grade based in part on these meetings. Team meetings will usually be scheduled during class times that will be reserved for this purpose.

Quizzes. There will be two quizzes. Quiz 1 is shown on the course calendar, and Quiz 2 will be held during the final exam period, so its date and time will be shown on the final exam schedule.

Each quiz will be comprehensive, drawing on any topics covered up to that point in the course, so e.g. Quiz 2 may include topics that were already covered on Quiz 1.

Both quizzes are an hour long.

Are quizzes closed-book?

Yes, but you may bring a single 8.5×11” double-sided page of notes, which can be either handwritten or computer-printed but must be readable without magnification, and must be created by you. Since the process of creating a crib sheet is most of its benefit, you may not share these notes or use someone else’s.

Are past quizzes available?

Yes, in the archive of past quizzes.

Collaboration and public sharing

This topic has its own page: collaboration and public sharing.

Grading

The relative contributions of the various elements to your grade are:

  • Quizzes: 24%. Quiz 1 is worth 12%, and Quiz 2 (scheduled during the final exam period) is worth 12%.
  • Problem sets: 54%. PS0 is worth 6%, and PS1-PS4 are each worth 12%.
  • Code review: 5%. Judged by regular participation in code review and providing substantive, useful comments.
  • Project: 7%.
  • Classwork: 10%. Reflects your continuous participation in the course. Determined by effort on before-class reading exercises, grade on nanoquizzes, and effort on in-class exercises.

Letter grades are determined at the end of the semester. The default cutoffs are: a final average of 90 and above is an A, 80 and above is a B, 70 and above is a C. These boundaries may be adjusted downwards if necessary because of the difficulty of the assignments or quizzes, but the boundaries will never be adjusted upwards, so a final average of 90 is guaranteed to be an A. The boundary adjustment is done heuristically, and there are no grade quotas, no grade targets, and no centering of the class on a particular grade boundary.

Every student is considered individually in the final grading meeting, judging from their entire performance in the course. A single bad mark in an otherwise consistent record will often be discounted.

What are the grade cutoffs this semester? What letter grade do I have?

Letter grade cutoffs are determined only in the final grading meeting, and they are assigned only after individual consideration as described above.

I have a problem with my grade on a problem set or quiz or other 6.031 assignment, what should I do?

If the problem is an objective grader error, like adding points incorrectly or overlooking something that was clear in your answer, then you can make a private post on Piazza to ask for the correction. Direct your post to “Instructors” to make sure your question is visible to all staff, but mention the specific grader (if shown in the grade report; it isn’t always). Include a hyperlink to the grade report you are asking about.

For other grading issues, this is a rare case in 6.031 where we ask you not to post on Piazza, and not to email or ask a TA or LA. Piazza is reserved for learning and problem solving, and TAs and LAs are trying to focus on helping people learn rather than being grade arbiters.

Instead, please bring your grading questions to an instructor’s office hours, which are shown on the course calendar.

Sharing your knowledge

How can I help other people in 6.031?

If you’re doing well in 6.031, you can become a paid tutor for a classmate, even while you’re still taking the class. HKN Tutoring provides one-on-one tutoring for hundreds of Course 6 students each semester and is another resource for students looking for extra help. Tutors are paid $15/hour and have the opportunity to significantly help a fellow Course 6 student.

Sign up as a tutor or contact hkn-tutoring@mit.edu with questions.

After you’ve finished 6.031 and done well, please think about applying to work as an LA. Becoming an LA first is the best path to joining the staff later as an undergraduate or MEng TA.