Department of Electrical Engineering and Computer Science

6.001 – Structure and Interpretation of Computer Programs

Spring Semester, 2007


General Information


Issued/released: Tuesday, February 6, 2007


Welcome to 6.001!


We are distributing this organizational memo in printed form, but in general all information about 6.001 will be placed on the 6.001 web page located at


You should check this page regularly for announcements, schedules of assignment due dates, and more detailed information about 6.001.



Contact information


In Charge: Prof. Eric Grimson – Office: 38-403, Ext: 3-4645, Email:


Lecturers: Prof. Eric Grimson – Office: 38-403, Ext: 3-4645, Email:    

                  Prof. Robert Miller – Office: 32-G716, Ext: 4-6028, Email:



Course secretary: Donna Kaufman – Office: 38-409a, Ext: 3-4624, Email:

Recitation changes contact: Donna Kaufman by email ONLY:


Scheduled exams: (mark these on your calendar now)

  • Quiz 1:  March 8, at 7:30-9:30PM in 4-163, 4-270, and 4-370 (for students with a conflict at this time, an alternative make-up time will be arranged)
  • Quiz 2:  April 18, at 7:30-9:30PM in 4-270 and 50-340 (for students with a conflict at this time, an alternative make-up time will be arranged)
  • Final Exam: at the end of the term during finals period.


Subject meetings


6.001 is a large subject, but we have tried to design it so that you can receive a lot of personal attention. In particular, you are expected to participate actively in recitations and tutorials, and the quality of your participation will be a factor in your grade.




For many years, the entire class met twice a week for lectures in 10-250, in “intimate” groups of 250-400. More recently, we have engaged in a major educational experiment in which the lectures were replaced with online lectures, to which students were expected to listen, either in the 6.001 lab, or on their own computer.  We have learned through student feedback that solely using the online lectures is not as effective as a combination of live lectures, with online lectures as an additional resource.  Hence, a few terms ago, we moved to the following plan, which we will use this term as well.


Lectures will be given live on Tuesdays and Thursdays in 32-123 (the large lecture hall in the Stata Center).  Many of the lectures will also be available online, but that material will not be identical to the live lectures.  You should treat these online lectures as a kind of audiovisual textbook – they expand on the material presented in lecture, and as opposed to a live lecture, you can listen to them (if you wish) on your schedule and at your pace.  If you rely solely on the online lectures, you may miss material covered in the live lectures.  Hence, we strongly encourage you to attend the live lectures, and use the online lectures as support material (and yes, we know that lectures at 10:00 are very early in the day for many of you!).


Lectures are the primary vehicle for introducing and motivating new material, some of which is not in the book. It is essential that you listen to the lectures (whether live – which we prefer – or online), as the recitations will assume you have already heard the material, and will build upon it.  The online versions of lectures can be accessed via the 6.001 online tutor system, which will be described in recitation section, and which is reached by clicking the appropriate link on the course web page:


The first time you use the tutor, it will ask you to register to set up a username and password. Once registered, you will find a button “Choose a Lecture” on the main tutor page that will take you to the lecture page. As well, you can use the “Set Preferences” button to set your choice of how you want to view the lectures. We plan to allow viewing of the lectures by PowerPoint (instructions on how to load a PowerPoint viewer are provided on the web site), as a Java Script, or as an HTML presentation. If you prefer not to listen to the audio, the latter two methods also will provide text annotations to go with each slide. Details on the use of the tutor are described below.




The Registrar’s office will have assigned you to a specific section of 6.001 – please ignore this assignment except for the first day. Because of special circumstances in the class, we are going to redo the section assignments. During the first lecture (on February 6th) you will be filling out a form, which we will use to assign you to a recitation section. We will post section assignments on the web site later in afternoon of that day. In order to keep sections balanced, we ask you to attend the section to which we assign you. If for some reason you cannot, you MUST contact Donna Kaufman ( BY EMAIL asking to switch sections. Donna will try to find a new section to accommodate you, but because of the need to keep sections reasonably balanced in size, she may not always be able to do so. Please do not contact Donna until after the first day of recitations.


We will also be using the information form to schedule you for a regular weekly tutorial. Details on this assignment will be handled during recitation.


The class is divided into sections of about 25 students. Each section meets twice each week (on Wednesday and Friday). Recitations expand upon the material currently being introduced in lecture, as well as introducing supplementary material that is not directly covered in lecture. They also give you a chance to practice working with the material in an interactive setting. Recitations are the primary source of interaction with the staff, and your attendance at recitation is essential to good performance in this class. This is your opportunity to ask questions about the lecture material, to work through examples that reinforce the material, and to explore variations on topics introduced in lecture.




Tutorials will be scheduled in your recitation section during the first week of classes. Tutorials are one-hour small group meetings held once each week, on Mondays or Tuesdays. They provide you an opportunity to obtain individual help, to review homework assignments, and to have your progress in the subject checked. Attendance at tutorial is essential! If you are unable to attend a tutorial, you should contact your tutor in advance to make alternate arrangements for that week.


Course Materials


The textbook for the course is Structure and Interpretation of Computer Programs, Second Edition by Abelson, Sussman, and Sussman. This book can be obtained at a discount from Quantum Books. The book is also available (without the discount) from the MIT Press bookstore or the Coop.  You may also find the site useful for ordering this and other textbooks.  Perhaps most importantly, an online version is available, and can be found through the link on the course web page.


Your major source for subject materials is the 6.001 web page. On it you will find general announcements, a detailed syllabus and lecture schedule, downloadable implementations of Scheme (the programming language used in 6.001) for use on personal computers, copies of the projects, guidelines for preparing homework, specific information associated with each recitation section, and useful documentation.


Warning!  This term we are trying an experiment, in which we use the DrScheme version of the Scheme programming language as the framework for completing programming projects.  We are working to ensure that the legacy code and documentation we have used in prior terms is compatible with DrScheme, but we may miss something.  If it turns out that there are too many compatibility problems, we may revert back to the traditional 6.001 system, including MIT Scheme and Edwin (an Emacs-like editor used in 6.001).




Problem sets are released, typically on a weekly basis, onto the 6.001 online tutor system. This tutor is found by clicking the appropriate link off the course web page:


Each problem set will include questions intended to reinforce the material covered by the lectures. This includes two different types of problems.  Some are short “finger exercises” intended to directly reinforce material from the each lecture.  Others are longer problems intended to allow you to explore ideas introduced in the lecture.  These problems are due on the date listed, typically Friday at midnight.


As you will see, the tutor system provides you with an opportunity to check your answers. This will provide you with feedback as to which problems you have understood, and which still need work. Please note that once you press the “submit” button, the answers for that question will be locked in. This is equivalent to your turning in your answers to the TA, and thus you cannot change them. Your answers must be submitted by the due date listed on each problem set. Your work will be reviewed by your TA, who will discuss it with you in tutorial.


In addition to the problem sets, there will be several substantial projects this term, each involving extensive programming that uses the 6.001 computing facility or a personal computer. The programming assignments have been planned on the assumption that you will do the required reading and other preparation before you start programming. It is generally much more efficient to test, debug, and run a program you have planned before beginning than to try to do the planning online. Students who have taken the subject in previous terms report that failing to prepare ahead for programming assignments generally ensures that the assignments will take much longer than necessary. Not only is it more efficient to begin work on each problem set soon after it is distributed, but it is advantageous to complete your computer work early. If you use the 6.001 Lab, you'll find that there is larger demand for the laboratory facilities and for help from the laboratory assistants just before assignments are due.


                                               Late homework will not be accepted!


In case of illness or absence from MIT, make arrangements to complete assignments with your recitation instructor and tutor.




Your grade in 6.001 will be determined by the following approximate weighting (though the staff reserves the right to consider other factors such as participation in adjusting this formula): two mid-term quizzes (25%), final exam (25%), projects (40%), and problem sets (10%).  In addition, participation in tutorials and in recitations can garner up to 5 additional bonus points – however, this requires active and consistent participation.  Please note, you must do the projects to pass the course; a passing grade based on the other parts may be converted to a failing grade if you do not turn in all the projects, where turning in a project means including a serious attempt to complete each project.


  • Homework: You are expected to do all the homework. While performance on exams is an indication of basic competence, performance on homework is your major opportunity to demonstrate outstanding achievement in 6.001. Mediocre homework performance will result in a lower grade, even if performance on exams is good. It is virtually impossible to get an A in 6.001 unless all homework assignments have been turned in. Missing more than a couple of the homework assignments may result in a failing grade for the semester, regardless of performance in exams, tutorials, and recitations. This applies to the weekly problem sets and to the programming projects.


  • Participation in recitations: You are expected to participate actively in recitation and tutorials. Many recitations will include sets of problems, to which you may be asked to provide answers to the class. Note that you can earn up to 5 bonus points towards your final grade based on active participation in recitation and tutorial!


  • Participation in tutorials:  You may be asked to explain or to expand upon your written homework solutions in order to demonstrate your mastery of the material. Note that you can earn up to 5 bonus points towards your final grade based on active participation in recitation and tutorial!  


6.001 Policy on Collaborative Work


Most people learn more effectively when they study in small groups and cooperate in various other ways on homework. This can be particularly true in programming assignments, where working with a partner often helps to avoid careless errors. We are very much in favor of this kind of cooperation, so long as all participants actively involve themselves in all aspects of the work – not just split up the assignment and each do only a fraction.


We are structuring the work this term into two types: problem sets that you should turn in weekly and projects that you should turn on the listed dates. Please abide by the following guidelines with regard to these different types of work. Problem sets (all the on-line work) are designed to reinforce key concepts. These should be completed by each student individually, though seeking tutoring help from Lab Assistants or other staff is perfectly appropriate. Projects are designed to be larger scale activities, in which group activity in brainstorming and design is often a key component. For these projects, we encourage you to work with one or two other people. When you turn in your project, you must identify with whom you worked. We expect, however, that you are involved in all aspects of the project, that you write and comment your own set of code, and that you write up your results separately. When you hand in material with your name on it, we assume that you are certifying that this is your work and that you were involved in all aspects of it. Do not just turn in a copy of a single file; write your own version. This means that you create this file yourself, and not just annotate a copy that you received from someone else. We know that this may sound like replication of work, but an important part of learning the material is making the process an active one, particularly with respect to editing, executing, and debugging software, which you do by ensuring that you create and explain your solution.


Here is an example scenario of how a good collaboration might work:


      Both (all) of you sit down with pencil and paper and together plan how you're going to solve and test things. You go together to a cluster and sit at adjacent machines. You check after each problem to make sure that the others have working implementations and are all caught up. When one of you has a problem, the others look over your shoulder. For example, your partner has a bug on one part, and you are able to point out where the bug is and how to fix it. On each part of the problem, you write your own code and solution, seeking help from the others when you have difficulties. On the write-up, each of you lists the names of all of your collaborators.


Here is an example of an inappropriate collaboration:


      Your send your friend a copy of your code so far. She works on it to complete the procedure you had not finished, and she fixes a bug in another procedure. You each submit this shared code and solution. Even though you list the names of each other as collaborators, this is inappropriate collaboration because you were not both involved in all aspects of the work – you did not each write your own implementation even if to a common plan, and you shared a common set of code and writeup.


Not listing the name of a collaborator will be deemed cheating. Similarly, copying another person's work and representing it as one's own work is a serious academic offense and will be treated as such.


In general, we strongly encourage you to work as a group. It is a very effective way of catching conceptual and other errors, and of refining one's thinking and understanding. Also note that if you are having trouble solving a problem, please take advantage of the Lab Assistants. Part of their responsibility is to answer questions and provide advice and guidance on the course material.


See the discussion of the use of “bibles” below for additional information on use of materials in completing problem sets and projects.


The 6.001 Programming Laboratory


Many years ago, the computers provided as part of the 6.001 experience were among the most powerful on campus.  Today, of course, many students have laptops or desktops that are comparable to what the course provides. As a consequence, it is easy for a student to work on their problem sets or projects wherever and whenever they like.  At the same time, getting help with the course material is important to aid a student’s understanding.  As a consequence, we have provided two mechanisms for working on 6.001 course material.


First, a laboratory facility for 6.001 is located on the fifth floor of Building 34. The room contains a set of personal computers (donated to MIT by Intel), laser printers, and network servers. There is also wireless access, and many students find it convenient to simply bring their laptop to the lab, and work there where they can interact with the lab assistants for help.  Please note that this space is shared with several other courses, and there may be times when the space is crowded and noisy.  In particular, 6.081 (aka 6.01) will be using that space on Tuesdays from 3:30—5:00 and on Thursdays from 2:00—5:00 so we advise you to work around those hours.  Second, we have set up a mailing list ( to which you can send requests, which will be answered by the next available Lab Assistant.


The 6.001 Lab is staffed by undergraduate lab assistants (LA’s), who are there to help with the assignments and answer questions about the system. Perhaps more so than the availability of machines, a key benefit to your working in or visiting the lab is the opportunity to get help from the lab assistants. Lab coverage hours will be posted. Please do not attempt to cajole lab assistants into staying beyond these hours--they work long hours as it is, and they need occasional sleep.


As noted, if you want to use your own computer, the 6.001 staff provides implementations of Scheme for Linux and Windows, and versions of DrScheme (being used this term) are available for a variety of platforms. See the course web page for software and installation instructions.


The problem sets and projects are designed so that they should run on all of these implementations, and you can move your work between them if you find this useful. For example, you might start problem set at home, then spend some time debugging it in the lab where the Lab Assistants can help you, and then finish things up at home.


6.001 is not officially supported on Athena. The implementation of Scheme on Athena that runs on Linux machines should be compatible with the 6.001 implementations, although we do not guarantee that it can run all the problem sets. Other versions of Scheme on Athena are likely not to be compatible with 6.001.


The lab machines are set up as Athena machines in the following manner, however. They will automatically save all your work in your Athena home directory (in ~/u6001/work by default). You can perform most Athena operations on these machines. Please note that this is not a supported Athena platform, so don't bug IS&T employees with problems. Send all bug reports, comments, and questions about the lab setup to .


Using your own computer


You'll find it convenient to work in the 6.001 lab because the lab assistants are available to help you, and you can share the warmth and camaraderie of your classmates while you work on problem sets. In addition, you can send email to if you are in need of technical assistance with the Scheme system.


If you want to use your own computer, DrScheme (being used this term) is available for a variety of platforms (see If you use Athena, you can only run Scheme from an IBM or a Dell computer. Finally, you cannot run Scheme from a dialup Athena machine. If you have a PC capable of running Scheme, we suggest that you install it there, since it will be convenient for you to work at home. The 6.001 lab is probably the best place to work if you want help, however, since that is staffed by knowledgeable and friendly Lab Assistants.


See the course web page for software and installation instructions (these can be found at ).


One way you can use Athena is as a repository for your own working files, and for transferring the files between the 6.001 Lab and your personal machine. See the 6.001 problem set web pages for information on transferring files.


During the semester, we will place copies of the 6.001 project code on the web page, so this can be downloaded by people doing 6.001 on PCs. (Most of the problem sets will not require that you load pre-designed code, but the projects will generally build upon code that we provide for you.)




6.001 is time-consuming--but the assignments are not intended to require excessive amounts of time. In past subject evaluation surveys, students have typically reported that they spend very close to the expected 15 hours per week on the subject. Spending enormous amounts of time in 6.001 is often the result of simply not asking for help when you need it. If you find yourself spending more time on 6.001 than you think you should, please speak to your recitation instructor. It is also possible to spend an excessive amount of time programming. This is often the result of failing to prepare properly, i.e., not reading the assigned text and exercises, understanding the distributed code, developing plans to solve the questions, etc.


In addition, please be aware that prolonged computer usage combined with poor posture or improper typing habits can result in conditions such as repetitive strain injury. Remember to take frequent short breaks and to consult the medical department for more information.


Getting Help


The 6.001 staff is always willing to help you. If you feel that you are getting lost, cannot understand the statement of a problem, have a gripe about the way things are being done, or have any other problem that we might be able to help with, please come see us. We hope that you will develop a good relationship with your tutor and recitation instructor as the term progresses. Your recitation instructors will have posted office hours; often these are underutilized, and you should take advantage of these to overcome confusions or deepen your understanding. Do not hesitate to call for help.


For additional tutoring resources, we recommend contacting the EECS Tutoring Service, or the MIT Tutorial Services Room at or 3-8406 to connect you with tutors experienced in giving help with 6.001.


6.001 Bibles


Collections of past 6.001 homework assignments and solutions are available in various living groups. A database of 6.001 problem sets and solutions is also available on the 6.001 Web page and in the 6.001 locker on Athena. This material must be used very carefully. It is legitimate to use bibles as a source of supplementary problems for additional practice, to try to test and increase your understanding of the material.


It is NOT legitimate to use bibles a source of code or solutions to any of this year’s assignments. Doing so is not only likely to hinder your learning the material, it is intellectually dishonest and a form of cheating. In recent terms several students made use of bibles in this way, resulting in disciplinary action taken against them. Do not copy from bibles. Solve the problems on your own, work on the projects in an appropriate fashion consistent with the collaboration policy, or get assistance from the teaching staff.


Copyright © 2007 by Massachusetts Institute of Technology. All rights reserved.