6.031 — Software Construction
Fall 2019

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, the Java API docs, 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.

    For general questions, post publicly so others can benefit.
    For sensitive issues, post privately.
    For questions about Java 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 on Piazza, privately if needed, except if you have a grading problem.

How do I post privately? 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. This ensures the right staff member will see your post.

How do I report a Java 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.


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:

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

  • ability to apply these ideas to design, implement, and test a small- to medium-scale software system (thousands of 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
  • understanding of general programming-language concepts such as static typing, exceptions, access control, interfaces, and equality, and ability to use Java as a particular example language with those concepts

  • ability to use modern programming tools (e.g. Eclipse, Git, JUnit) 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.

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 Java is the biggest challenge. Consider taking another class (e.g. 6.178 during IAP) or studying on your own (e.g. Head First Java) 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 multiple-choice questions and programming exercises that require a laptop. 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 and submit 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 completion. 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. There will be approximately 25 nanoquizzes. Your lowest 5 nanoquiz grades will be automatically dropped, and you can make up missed nanoquizzes or low grades. More info: details of nanoquiz 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, what can I do?

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

You are automatically excused from up to five classes. The grade for the missed nanoquiz(zes) will be recorded as 0, but the lowest 5 grades are dropped. You can also make up any nanoquizzes for partial credit by following the usual procedure for nanoquiz makeups.

Similarly, the in-class exercises and reading exercises for up to five missed classes will be automatically excused. Although there is no way to make up exercises beyond that, they contribute only to your class participation grade. You can compensate by doing an excellent job of participating during other classes.

I was or will be absent from class for a multi-day medical reason, mental health reason, or religious holiday, what can I do?

  1. Post privately on Piazza and explain the circumstances.

  2. If you haven’t already visited S3, go there to get help with all of your classes, not just 6.031. Ask your S3 dean to get in touch with the 6.031 instructors.

In some situations, you will be able to make up nanoquizzes for full credit, but you will not be able to make up in-class exercises, as explained in the previous answer.

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

How is participation in class graded?

In general, participation in class is graded based on whether you attempted the questions, exercises, coding problems, etc., not on correctness.

Programming exercises are graded based on whether you’ve attempted the exercise and made some progress, even if you don’t complete it. You are not expected to complete unfinished exercises after class, but TAs and LAs will be happy to help you review or finish them.

You must collaborate using Constellation to receive credit for programming exercises. If you encounter technical issues, ask a TA for help. If necessary, visit lab or post on Piazza to resolve the issue for next time.

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

How are reading exercises graded?

Reading exercises are graded only based on whether you have completed them, not whether your answers were correct. The reading exercises help you check your understanding and practice for the in-class nanoquiz, so take them seriously. Merely reading something is not as effective for learning as first reading and then testing yourself on what you read.

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 Git repository on Athena 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.

  1. Post privately on Piazza and explain the circumstances.
  2. If you haven’t already visited S3, go there to get help with all of your classes, not just 6.031. Ask your S3 dean to get in touch with the 6.031 instructors.

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 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 roughly be weighted as 40% from alpha and 60% from beta.

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?


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.

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, on dates specified on the course calendar. 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.

Are quizzes closed-book?

Yes, but you may bring a single 8.5×11” double-sided page of notes, readable without magnification, that was 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.


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

  • Quizzes: 30%. Nanoquizzes are worth 10% total, and each comprehensive quiz is worth 10%.
  • Problem sets: 49%. PS0 is worth 5%, and PS1-PS4 are each worth 11%.
  • Project: 11%.
  • Code review: 5%. Judged by regular participation in code review and providing substantive, useful comments.
  • Participation: 5%. Reflects your continuous participation in the course. Determined by completion of reading exercises and participation 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 email the grader to ask for the correction, if the grader’s username is shown on the grade report. (It isn’t always shown.)

Otherwise, this is a rare case in 6.031 where we ask you not to post on Piazza, and not to email or talk to a TA. 6.031 TAs are not empowered to have discussions about grades, and Piazza is reserved for learning and problem solving. The point of this rule is so that TAs can focus on helping people learn, rather than being grade arbiters.

Instead, please bring your grading questions in person 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?

Answering questions on Piazza is a great, lightweight way to help your classmates.

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.