Course Syllabus

Table of Contents:

Click the links below to jump to that section.


Credits and Hours


Course Structure

Collaboration and Grading Policy

Class Contract


Getting Help

Welcome to 6.170: Software Studio | Fall 2020! 🎉


6.170 is a junior/senior level class suitable for students who already have taken 6.031 (or equivalent), have experience writing non-trivial programs in a high-level language, and understand and have applied basic programming principles such as data abstraction and modularity. Familiarity with JavaScript, HTML and CSS is helpful but not required; these languages will be taught during the class, albeit in a concentrated fashion. You should be comfortable with elementary structures of discrete mathematics (notably, sets, relations and graphs) and their operators (union, join, transitive closure, etc). If you have not already learned this material (eg, in 6.042), you will have the opportunity to do so in a preparation exercise.

Credits and Hours

6.170 is a 15-unit course, and offers AUS2, DLAB2, and II credit. You can use this course to provide all of these credits at once.

In last year’s evaluation, students reported on average 15.2 hours of work outside class, with a standard deviation of 5.94. You should bear in mind that this class involves a substantial commitment of time. Our impression is that much of the extra time taken by some students could be mitigated by careful upfront design and by approaching programming tasks in a systematic fashion, working incrementally and testing hypotheses as you go.


This class is about designing software. By design, we mean the invention and shaping of an application's behavior to serve its users' needs. This includes need-finding (figuring out what the needs are), conceptual design (designing the key concepts and their mechanisms), data design (structuring the data that is stored), user interface design (shaping the physical interactions between user and machine) and visual design. This does not include engineering aspects of software, in particular how to structure the internals of an application, or how to achieve robustness or high performance. Our chosen focus is motivated by what we perceive to be the greatest need, both for the skills of our students and for the work they will do in their careers.

As a context for developing these design skills, you will learn to build web applications using a full web stack of standard modern technologies. These technologies are not themselves the focus of the class, however; they are a means to an end. We will explain the key ideas that you need to get going with them in lecture and recitation, but you will be responsible for learning the details yourself. The documentation for the technologies we will use are thorough and easy-to-understand.

The learning objectives of the class are as follows. By the end of this class, you will be skilled in the following areas:

  • Design:
    Identify the essential needs for an application; create a conceptual design comprising elegant, well-motivated and precisely defined concepts; build rich and robust abstract data models; develop a user interface and visual design that makes the application attractive and pleasant to use; construct and evaluate wireframes and prototypes; conduct heuristic evaluations and basic user tests.
  • Realization:
    Realize a design all the way from pencil-and-paper sketch to deployed application; implement a full web stack including a reactive front end in JavaScript, HTML and CSS, and a backend in Node/Express; maintain a shared code repository in GitHub; deploy the application using Heroku.
  • Communication:
    Articulate needs and designs in appropriate notations with clarity and precision, and without redundancy; express design tradeoffs and give cogent explanations of design decisions; work with a team to plan and execute an application development from start to finish, formulating and revising goals; pitching a project in a slide presentation; participating in constructive critiques of the work of other students and teams.

Course Structure

Partner Assignments. There are partner assignments for the first half of term each of which lasts one or two weeks. These include both programming and design assignments. The course staff will try our best to match pairs based on the desired grade in the course, your preference to work early or later on assignments, and compatible time zones. Due to an odd number of students in the course, we may be unable to assign you a partner for one of the assignments. 

Upon completion of the partner assignments, you will complete peer and individual critiques, documenting the work each student completed for the assignment as well as critiquing the effort & participation of your partner and of yourself. It is important for each student to engage with each part of the assignment (design, implementation, reflection, etc.) to solidify understanding and that the work be evenly divided. 

Team Project. The second half of term is spent on a team project. Teams will generally have four members; you will be able to choose your teammates. The projects will encapsulate all concepts learned in the first half in the collaboration of ideating, designing, implementing, iterating, and reflecting on an application of social value. 

Repositories. You'll keep all your work in a GitHub repository. A repository will be created for you within an organization for this course; do not submit code to pre-existing personal repositories.

Attendance. Lectures & recitations will be recorded and available to the students to watch later at their convenience if they prefer. Students are expected to watch all lectures & the weekly recitation, but are not required to attend the synchronous sessions. 

Some limited synchronous interactions with the faculty and staff will be expected, but these will be arranged flexibly.

Lectures. Lectures will be given synchronously at MW2:30-4 ET. There are two 80-minute lectures each week, which will focus on fundamental ideas. During each lecture, there will be short exercises for you to conduct to solidify your understanding. We will have students go into Zoom breakout rooms to complete the exercises in groups. All lectures will be recorded and will be available here for students to watch later at their convenience if they prefer.

Preparations. You will be asked to individually do some small preparations (preps) in advance of lecture to give you some basic understanding and skills so that the lecture can focus on deeper issues. Like assignments, these preps will be handed in, but because they are intended to prepare you for lecture, they have different incentives for completing on time. If you miss the deadline for a prep, you will be able to submit within two weeks without penalty, but you will have to complete additional questions to achieve the same grade. After two weeks, late submissions will no longer be accepted and the prep will be graded as an automatic zero. Note that the preps do not contribute equally to your grade: some are very straightforward familiarization exercises and some are more like regular problem sets (and you should expect them to take longer, and thus start earlier).

Recitations. There is one 50-minute recitation each week. Recitations are taught by teaching assistants; each will be centered on a demonstration of a single key skill or technology. You can choose which recitation to attend. The recitation recording will be available here after the session. 

Open Lab Hours. The TAs will be available for consultation during open lab hours each week at times that will be posted on the Canvas site’s main page. These are likely to change in response to student demand, so be sure to check when you make your plans for the week. Lab hours are intended to provide a place where several students and TAs will be working so that you can get help as you need it. Lab hours will be phased out when the final project begins; after that, TA meetings will be made by appointment.

Listeners. Listeners for the class are welcome. You should have access to all necessary materials on the Canvas site as it is public, including lectures and recitations. By virtue of being enrolled in the class, we will create repos with starter code for all preps and assignments for listeners just like students taking the class fully. If you are a listener, please do not submit your work. If you do, we will not grade it.

Collaboration and Grading Policy

Partner assignments. You and your partner should work together exclusively to complete the assignments, although you are encouraged to ask TAs for advice in lab hours, and to use Piazza to obtain answers to questions from other students. Feel free to ask questions about particular solutions, so long as they can be embedded in the question (that is, no questions of the form "is the code at this URL correct?"). This policy is designed to ensure that all students develop strong skills. Additionally, partner assignments should evenly split the work and ensure that each student works on all parts of the assignment (design, implementation, reflection, etc.). 

The pair will receive one grade for the assignment. We will use peer and self critiques on assignments to aid in deciding final grades for the course, so ensure that work is split evenly and each partner engages with all parts of the assignment.

Team projects. Team projects, of course, encourage collaboration. You are encouraged to work together on all parts of the project, and must ensure that every team member is involved in all aspects of the project (design, realization and communication). Although the team will receive a single grade, each team member will be asked to identify their own work product to ensure equitable division of labor. Participation in team mentoring meetings will be evaluated separately from the team project materials, on an individual basis.

Reuse of third-party material. Unless otherwise stated in an assignment, you are free to use any third-party code, whether as libraries or code fragments, and to adopt any idea you find online or in a book, so long as it is publicly available and appropriately cited (see the section on code in the MIT handbook on academic integrity for details). You may not use work produced by students in earlier offerings of this class. Obviously, you may not reuse a complete solution to a project.

Sanctions. If you violate the course collaboration policy, you can expect to receive no credit for the assignment in question, and to have a letter regarding the incident filed with the Committee on Disciple (or worse).


Components of the class will be weighted as follows:

  • Partner Assignments: 40% (with all equally weighted, whether programming or design)
  • Final Project: 30%
  • Preparations: 20%
  • Participation: 10%

The participation grade is determined by your role in team mentoring sessions and your constructive contributions to discussion on Piazza (or to lecture or recitation), including your willingness to represent the class by articulating basic questions.

Lateness. You have 7 slack days, which you can apply to the assignments in the first half of term in any allocation of whole days. Slack days may not be applied to preparations or to the final project. For each assignment, you will submit on canvas the number of late days you would like to use. For students working in pairs, you must assign your slack days for each assignment before the assignment is released. This is intended to allow you to plan for times when you expect to have higher loads, while eliminating tricky negotiations between partners. On any given assignment, the larger of the slack day allocations of the two partners will apply. This means that you are likely to receive additional slack days due to your partners' choices. For students choosing to work individually, you may assign your slack days any time before the assignment deadline.

Additional extensions are provided for extenuating circumstances with a note from S3, which must specify exactly how many days of extension the dean believes is appropriate for the case. Due to the tight schedule of the class, and the overhead of negotiating for a large class, no other extensions will be given, so if you have any personal circumstances (such as an interview), make sure to plan your time and use of slack days carefully. Late submissions not covered by a slack day will incur a penalty of 10% of the total available grade for each day of lateness.

Class Contract

The teaching staff of the course will endeavor to:

  • Deliver content that is stimulating, practically useful and of long-term intellectual value;
  • Encourage interaction during all class and recitation sections, and take all questions seriously;
  • Provide constructive and helpful feedback on student work in a timely fashion;
  • Assign grades in a fair and consistent way;
  • Take seriously suggestions about course content and structure;
  • Help students who feel overwhelmed or lacking in background, despite prerequisites;
  • Support and encourage full participation of all students.

As a student, by taking this course, you agree to endeavor to:

  • To participate enthusiastically in the course in lectures, recitations, piazza, partner assignments, team project, etc.;
  • Share concerns and comments about the course with the instructors;
  • Do your fair share of work in partner assignments and on the team project.


Get started early. We strongly recommend that you get going on assignments as soon as you can, so you can coordinate and collaborate with your partner, get help from the teaching staff and from your colleagues using the Piazza forum, and make good use of lab and office hours. A good practice is to make a start early in the week, giving the assignment enough time to give you a sense of what's involved and how much work it's likely to be. Whatever you do, don't leave work until the day of the deadline!

Take design seriously This is not a class in web development. If you concentrate on coding at the expense of design, you will not be able to achieve a good grade. Moreover, if you work hard at the design aspects, you will find that your implementation work flows more easily and is more successful.

Work incrementally. A common mistake is to write a significant piece of code using a new framework, and then to spend a great deal of time debugging it. A much better approach is to grow your program, testing it at every step. Your tests need not always be systematic unit tests (although they have the obvious advantage that they can be easily rerun repeatedly). What defines a "step" will depend on how much confidence you have in what you're doing. If you're learning JavaScript for the first time, you might initially test almost every expression you write; if you're using a framework for the first time, it would be wise to check that each API call behaves in the expected manner. Don't be reluctant to throw code away. For example, if you're trying to write a program that creates a DOM structure dynamically, start by creating the elements with static HTML. The extra time taken will be more than repaid in the debugging time you save.

Getting Help

Do make good use of all the resources the course offers. We're here to help you! Here's a key to where to get help for different kinds of questions:

  • For administrative questions (eg, regarding due dates or interpreting assignment instructions), for technical questions about programming or the various platforms, or for questions about ideas that come up in lecture: post a public question on Piazza
  • For help when you're feeling confused on a technical issue, and can't formulate a question, or would like advice on your design or code: go to TA lab hours
  • For a personal issue about grading, attendance, partner assignment issues, team issues: send a private message to the staff on Piazza
  • For larger questions about design or topics raised in lecture, or to give feedback on the class, email the lecturers
  • For a personal problem or for friendly life advice: email a lecturer to setup a meeting.

Please do not email the TAs individually to ask for help.

We hope that you learn a lot and enjoy the course!

Course Summary:

Date Details Due