An online, always up-to-date version of this syllabus can be found online.

  • Contact:
  • Lectures:
    • Some content available as videos or readings before class.
    • In-Person Labs:
      • CS201X: Mondays 9:05a-9:55a in 75SHS 202
      • CS201Y: Mondays 1:45p-2:35p in 75SHS 202
      • CS201Z: Mondays 2:50p-3:40p in 75SHS 202
    • In Person Lectures:
      • CS201A: Tuesdays & Thursdays 8:00a-9:15a MBH 220
      • CS201B: Tuesdays & Thursdays 1:30p-2:45p MBH 220
  • Office Hours
    • Office Hours or "Student Hours" are times when I am available for you to discuss aspects of the course, Computer Science, Middlebury, your plans, your questions about college in general, or really anything else I might be able to help with.
      • In Person
        • Due to my experience with low attendance in fixed, in-person office hours during the Pandemic, I'm only offering one date/time for this modality.
        • Thursdays: 10am-noon
      • Wed/Fri Zoom Appointments:
        • Schedule a 15, 20 or 30-minute meeting with me. Calendly is a service that lets you drop a meeting on my calendar whenever I'm free. I will guarantee I can make anything with 24 hours notice, but I will try my best with anything sooner.
      • Message me on Slack to arrange a meeting outside of these times.

TA/Tutoring Sessions

This course has tutoring resources. Information about the tutors can be found at go/cstutors.

Course Description

In this course we will study the ideas and structures helpful in designing algorithms and writing programs for solving large, complex problems. The Java programming language and object-oriented paradigm are introduced in the context of important abstract data types (ADTs) such as stacks, queues, trees, and graphs. We will study efficient implementations of these ADTs, and learn classic algorithms to manipulate these structures for tasks such as sorting and searching. Prior programming experience is expected, but prior familiarity with the Java programming language is not assumed. (CSCI 0145 or CSCI 0150) (Juniors and Seniors by waiver) 3 hrs. lect./lab

CSCI 0201 Middlebury Course Catalog

About This Course

This course covers two big transitions in your computer science journey.
1. The first is the transition to the more verbose, object-oriented and statically-checked language of Java from the wilderness of Python.
2. The second is to begin to understand machine constraints and how to solve problems with the data structures broadly available to computer scientists in all programming languages.

Course Topics

I think of this course as actually covering five mastery areas:

  1. Java Fluency, including object orientation.
  2. ADT Usage, or the use of data structures of various shapes, knowing only suitability to different problems.
  3. Memory Concepts, or the understanding of how values and classes and arrays are laid out in memory and which data structures and algorithms start to take advantage of them.
  4. Recursive algorithms, with a focus on understanding trees, but also other classic algorithms such as binary search, merge sort, and quick sort.
  5. Graph reasoning, or the idea that with random access memory and references to values we can construct different shapes of data, control, and model problems from lists to trees to graphs.

Concept Map

Where are the Textbooks?

There are very few textbooks that are a perfect fit for this course. I will likely be providing notes and slides as resources.

For a more detailed list of my thoughts on free resources, please consult the Textbooks page in the online syllabus.

Course Equipment & Software

Since this course will at least begin virtually, and we have a rather large enrollment, we will need to use software in addition to the course-specific software we would ordinarily setup and use.

Computer / Laptop Access

If you have any questions about computer access, please don't hesitate to contact me ASAP - - there are options through both the College and Department. Some more details are below, but I'm happy to help you navigate these systems.

If you ever find yourself temporarily in need of a laptop, the Computer Science department has 10 rotating Dell laptops available to our students. These come pre-installed with software for most of the courses in the major. They are available to be loaned out short-term or long-term. Please get in touch ahead of time if you think you might need one. Due to COVID-19, short-term loans may be trickier than usual.

On Long-Term Use: College policy has changed recently to include the expectation for every student to have a laptop available. The college provides laptops to those who need them where “need” is based on Student Financial Services calculations. If you anticipate needing a laptop for the whole term, we encourage you to inquire with Student Financial Services and the library first due to our smaller pool of equipment. However, our department commits to meeting the needs of every student, so do not be afraid to reach out if you believe you need one of our laptops for any length of time.

From Robert Lichenstein (rlichenstein@), lightly edited ('S21).


When the college is remote, or the roads are un-navigable at 6:30am when I am traveling to Campus, we will resort to meeting via Zoom. Keep an eye on your slack/canvas messages before you head to lecture or lab.


Slack is an online, real-time chat service commonly used in industry/etc. This will:

  • Provide a space for asking questions that is less formal than email and doesn't require a good Zoom connection.
  • Provide a long-lasting chat space, since Zoom chat disappears at the end of any specific call.
  • Provide the opportunity for students to have one-on-one or small group conversations.

You should receive an invitation to participate in a private Slack. I recommend downloading their application rather than using it in a web browser.

Java & VSCode

Java is a programming language, but also a program that runs code in that language. We'll also need something that lets us edit the text files (with the .java extension) that we'll be putting code into. That's where VSCode comes in.

Java 11 (via

Installation Instructions

This course will use the Java Programming language to explore Data Structures. Although a brand new long-term-support release came out this year (Java 17, Sept. 2021), we'll be using the slightly older Java 11 LTS (Sept. 2018) because that's what's available on; our "back-up" environment.

A lot of companies and Android development are still stuck to Java 8 only features, anyway.

Java is open source, and many companies offer versions of it. We will use the one provided by the Eclipse foundation. You can get it from Oracle, the company that partially owns Java, but they make you sign up for an account nowadays, which is too annoying.

Visual Studio Code (VSCode)

Installation Instructions

Visual Studio Code is a relatively new editor that's immensely popular and useful. It's more complex and adaptable than Thonny (if you've used it), while being a little less java-specific than Eclipse or IntelliJ, if you're familiar.

Out of the box, VSCode is also good or great with Python, JSON files, and many other programming languages.

Grading Information

Learning a new programming language requires practice. Learning about data structures requires using them and seeing example programs.

As part of almost every class meeting, you will have practice work (a 'practical') given or started in class, to be finished as homework. Ideally, each practical is quite short, and would be completed before the next class meeting. However, we live in the real world, and conflicts will arise, not to mention that we will meet on Mondays for labs, and Tuesdays for lecture. Therefore, the deadline in Canvas will always be 1 week from assignment, at midnight.

Course Part Grade Percentage
Participation 15%
Java Ex. (P0..P10) 25%
Data Structures Ex. (P11..P32) 35%
Exams 25%

The practical assignments from the first part of the class (P0..P10 or so) are in a separate grade category from the practical assignments in the second part of the course (P11..P30) because while we are learning Java it is critical that you do every exercise you can, the data structures material has more challenging practicals, and I expect to require students to do most of them (but perhaps not all) instead for full credit.


Your participation grade reflects your preparation for class (practicals are ideally attempted before the next class), whether you ask questions on our Slack, give hints to your fellow students, and the fraction of lecture quiz questions you answer.

Other opportunities, such as registering for Slack, our primary communication for the semester, will be available (with a deadline) for some participation points.


This course will have two exams and a final exam. These exams will mostly feature questions of the style.

  • Exam 1 will focus on Java Fluency and ADT usage.
  • Exam 2 will be cumulative, but focus on Memory Concepts with some Graph Reasoning and Recursive algorithms.
  • The Final Exam will be cumulative.

Practical Grading

Practical assignments will be on one of three rubrics:

  1. (4/2/0 points) Pass/Retry/Fail. These will be most common in the beginning of the course, where we just need to practice Java as frequently as possible to build comfort with this new tool.
    • Submissions with small errors will still earn full credit (PASS).
    • Only submissions where you've accumulated many errors, or missed a key point will be given a grade of a RETRY, where I will allow for resubmission.
    • Submissions with no effort will not earn a RETRY, but a FAIL.
  2. (10/8/6/4/0 points) Perfect/Good/OK/Retry/Fail. Some practicals will require presenting results (like from a timing experiment), we want to recognize creativity and presentation (e.g., Perfect) as well as effort (Good..OK) while not penalizing any confusion or misunderstandings (Retry).
  3. (10 points, Percent Correct) Some later practical assignments will give you the opportunity to implement some classical algorithms or parts of data structures. For tasks like these, we will have unit tests that verify they behave correctly in all circumstances. Your grade will be based on the fraction of tests that succeed on your submission.

It will be clear on the Canvas pages which rubric is used for which assignments.

Academic Honesty at Middlebury

As an academic community devoted to the life of the mind, Middlebury requires of every student complete intellectual honesty in the preparation and submission of all academic work. Details of our Academic Honesty, Honor Code, and Related Disciplinary Policies are available in Middlebury’s handbook.

Middlebury College Syllabus Template retrieved 18 August 2020.

My personal take

When you get the opportunity to discuss your work with other students, ensure that everyone leaves the group discussion with the same level of understanding. A working solution you do not understand has no value to your learning.

Because Java & Data Structures are rather popular, it is likely you will be able to find partial or full solutions to challenges in your project or labs using online resources such as google or StackOverflow. A working solution you do not understand has no value to your learning.

Lastly, I remind you that I have a PhD in search engines. If you can find it, I can find it, too. Just CITE it and tell me, and don't turn in something that is fully-quoted from any sources.

Universal Access & Accommodations

The Disability Resource Center (DRC) at Middlebury provides for student accommodation in courses.

The DRC provides support for students with disabilities and facilitates the accommodations process by helping students understand the resources and options available and by helping faculty understand how to increase access and full participation in courses. The DRC can also provide referrals for students who would like to undergo diagnostic testing. Students who are on financial aid and have never undergone diagnostic testing can apply to the CTLR for support to cover the cost of off-campus testing. DRC services are free to all students.

If you have any accommodations through this office, please notify the instructor as soon as possible at the start of the semester so that your accommodation can be supported as quickly as possible.

I try to create course materials with "Universal Design" in mind: that is, I try to make it so that all materials can be accomplished fairly by all students. If there is any change that can be made to the course materials that would improve your learning, don't hesitate to ask or suggest such changes.

Inclusivity & Discussions

It is important to me to create an inclusive learning environment where diversity and individual differences are respected and recognized as a source of strength. However, this must be a team effort so I expect you to join me in fostering such an environment. This class will represent a diversity of individual backgrounds and experiences, and every member is expected to show respect for every other member so that everyone can learn in this space. If you experience or witness any behavior that opposes this idea, it would be helpful for me to know so that I can address it, but I do recognize that this is additional work and may be difficult. If you are comfortable reporting such incidents, there are a few ways you can do so:

You belong in this class and in the computer science department. Thank you for being here and for contributing to this course.

Pronouns and Identity

I will use your preferred gender pronouns and name, and I expect you to use the names and pronouns your classmates prefer. (I understand that some students may be in the process of exploring their gender identity, may not feel comfortable sharing a gender pronoun, or may not go by gender pronouns; you can let me know if you do not want to share a gender pronoun.)

If you are communicating about another student and do not know their pronouns, go ahead and use their whole name to refer to them e.g., -- "I agree with John.". You will notice that I also use they/them when referring to a hypothetical student.

Practical Assignments

This course will have a large number of practical assignments, that is, during almost every class meeting you will have some kind of exercise to practice what we're learning. As discussed in the grading section, each individual practical will not be worth too many points (many will be Pass/Retry/Fail) but this will serve a few purposes.

  1. Rather than have weekly or bi-weekly assignments that students tend to do at the last minute, there will be more frequent check-ins to hopefully help us stay on track. If you prefer, they can still be done once a week and treated as a larger assignment (e.g., P0,P1,and P2 will be assigned the first week, and all can be completed together)
  2. By having numerous, smaller checkpoints, we hope to get you more targeted and frequent focus with Java when it is a new programming language.
  3. By having flexibility in the grading scheme, where each is worth fewer points, we hope to allow for focusing depth on topics of interest in the second half of the course.

Preliminary Schedule

This is quite a strange semester and time in the world -- this schedule represents my best guess about the future -- something will have to change. Check the online version for the latest; it will be kept up-to-date.

I will also periodically present snippets of this table in class.

I reserve the right to edit/create/destroy future practicals with limited notice.

Date Kind Topic Practical
2/14 Async Lab Installation P0: Slack, Install
2/15 Zoom Lecture Course Overview P1: print/loops
2/17 Lecture Java from Python P2: Guessing Game
2/21 Lab GFX P3: Class Creation
2/22 Lect. Classes & Objects P4: Class Design
2/24 Lect. Lists and Arrays P5: PlayingCard
2/28 Lab Intro GridEnv P6: HungryTurtle
3/1 Lect. abstract/interface P7: FishRescue
3/3 Lect. More interfaces P8: Pre-Midterm I
3/7 Lab JUnit P9: ListProblems
3/8 Lect. MapADT P10: MapProblems
3/9 Lect. ADTs/Review
3/10-3/13 Exam 1 ADTs/Java
3/14 Lab Empirical Timing P11: ComplexityEx
3/15 Lect. Complexity
3/17 Lect. Extra Credit P12: TwosGame (2048)
3/21-3/26 . Spring Break
3/28 Lab Testing ListADT P13: JavaStack
3/29 Lect. Contiguous Lists P14: GrowableList
3/31 Lect. Boxing / SLL.Node P15: drawing
4/4 Lab Linked Lists
4/5 Lect. SLL Operations P16: SLL
4/7 Lect. Linked List Variants P17: DLL
4/11 Lab Lists Reprise P18: Practice Midterm 2
4/12 Lect. Bubble, Bogo P19: InsertionSort
4/13 Lect. MergeSort P20: MergeSort
4/18 Lab Trees P21: TreeTBD
4/19 Lect. BST insert/contains P22: IntBST
4/21 Lect. Review
4/22-4/24 Exam 2 Recursion/Memory
4/25 Lab Trees P23: IntBST.insertSorted
4/26 Lect. HashTables P24: HashTable
4/28 Lect. Association Review P25: HashTiming
5/2 Lab Sort Enough P26: Top-K
5/3 Lect. Heaps P27: Top-K Reprise
5/5 Lect. Graphs/Neighbors P28: adjacency
5/9 Lab Old-School AI P29: loadMap
5/10 Lect. BFS/DFS/A* P30: reach
5/11 Lect. Review
Exam Period Final Exam Cumulative Topics