CS312 Course Page and Syllabus: Fall 2023 Last updated on 2023-12-05 16:45:32 -0500

When and Where
312A: MW 11:15 AM – 12:30 PM in 75SHS 202
Michael Linderman
75SHS 216
Office Hours
M: 2-4PM
T: 10:30AM-Noon
W: 2:30-4:30PM
Th: 2-4PM
Or by appointment
Getting Help
Ed discussion board
CS peer drop-in help sessions
Frequent Links
Class GitHub site
Gradescope (and submission instructions)
In-class tool (go/cs312-inclass)
Project Guide

Mask Policy (subject to change)

Masks are required in Prof. Linderman’s office and are encouraged, but not required, in class and other spaces.

We in the Computer Science department want to do everything we can to create a safe learning and working environment for all. I will be wearing a mask in class and I encourage you to do the same.

Schedule: (subject to change)

Week Date Topics and Links Practicals Assignments
1 9/11 Introduction (slides), Javascript (slides)
SaaS, agile processes, learning a new language
Attendance, Getting Started then submit your GitHub username
9/13 Javascript, cont. (slides, read more)
Event loop, closures, functional programming, common syntactic sugar
Javascript Attendance
2 9/18 Testing, TDD, Static Analysis (slides, read more)
Unit, integration, end-to-end tests, Jest, linting with ESLint
9/20 Introduction to React (slides, read more)
React, props and callbacks, color picker examples (JS+html, React)
React page Assignment 1 due
3 9/25 React components (slides, read more)
Presentation/container components, hooks, inheritance vs. composition, Film Explorer example
9/27 React testing (slides, read more), NextJS (slides)
Front-end testing, Testing library, Promises, async/await
React testing Assignment 2 due
4 10/2 Consuming REST APIs (slides, read more)
HTTP, REST APIs, AJAX, Promises, useEffect Hook
10/4 Behavioral testing, User stories, Lo-fi Mockups (slides)
BDD, INVEST user stories, Cucumber-like behavioral testing, UI design strategies
Assignment 3 due
5 10/9 Version control, CI/CD, deployment and DevOps (slides)
Git workflows, CI/CD, introduction to DevOps
Deployment Project proposals (optional) due at 4:15PM
10/11 Agile development processes (slides)
Scrum, point estimation, pair programming, workflows
Assignment 4 due, Project preferences
6 10/16 Sprint 0 planning Project Guide
10/18 Servers, Creating REST APIs, Models (M in MVC) (slides)
NextJS API routes, Middleware and AOP, OO modeling with CRC cards
10/20 Sprint 0 deliverables
7 10/23 Sprint 1 planning
10/25 Databases, Models, Associations, RDBMS (slides)
SQL vs. NoSQL, Schema, Migrations, ORM
10/27 Practicals 1-6 due at 4:15PM
8 10/30 RDBMS, ORM (cont.) (slides)
11/1 Deployment, Monitoring, Performance (slides)
DevOps, *aaS, Performance metrics, Indexes, caching and other optimizations
CSS frameworks
11/3 Assignments 1-4 due at 4:15PM
9 11/6 Sprint 1 Demo, Sprint 1 Retrospective, Sprint 2 planning Sprint 1 deliverables
11/8 Authentication (authn) and Authorization (authz) (slides)
3rd party authn/z, Google single-sign on, basic security practices
11/8-10 Midterm (solution)
S23 midterm 1 sample (solution)
S23 midterm 2 sample (solution)
S20 midterm sample (solution) (less representative for this semester)
S19 midterm sample (solution) (less representative for this semester)
10 11/13 Code hygiene, Refactoring, Legacy code (slides)
SOFA, Code metrics, Exploring legacy codebases, Characterization testing
11/15 Design patterns, SOLID (slides)
Design patterns, "Gang of Four" patterns, SOLID principles for OOP
Thanksgiving Break
11 11/27 Sprint 2 Demo, Sprint 2 Retrospective, Sprint 3 planning Sprint 2 deliverables due
11/29 Workshop time (time to work on projects)
12 12/4 Responsible developer? (slides)
12/6 Wrap-up (slides)
EX 12/13 Final demos 10AM-12PM Project final deliverables
TBD Optional take-home retest


Course Information

Course Objectives

At the completion of the course you should be able to:

  1. Describe and employ modern methodologies for managing SW development
  2. Use tools and services that support those processes, such as version control, GitHub, continuous integration, etc.
  3. Describe and employ SW development principles, patterns and best-practices, such as test-driven development (TDD), DevOps, etc.
  4. Describe, evaluate and employ technologies for full stack web development and single page web applications (SPAs)
  5. Complete a large software development project as part of a team


There is no official course textbook, although you may find the following books helpful:

Software and Computing

Please review the Getting Started page for a guide to obtaining and installing the necessary online accounts and software.

If you find yourself in need of a working computer (even if for just a single class period), please contact the instructor about the availability of the department’s loaner laptops. The CS Department maintains a set of loaner laptops, preinstalled with relevant course tools, for both short-term and longer-term use. Given the small number of machines available (approximately 10), if you anticipate needing a laptop for a longer period (e.g., multiple weeks), I encourage you to also inquire with the library about loaner equipment and/or Student Financial Services about need-based resources for purchasing a laptop. Our department commits to meeting the needs of every student, so please don’t hesitate to contact me or the department ASI(s) if you need a computer (in any way) for this course.


This semester we will be using a form of “specification” grading. Instead of using points to assess work, all assignments and exams will be evaluated as Satisfactory/Not Yet Satisfactory or with an EMRN rubric (Exemplary, Meets expectations, Revision needed, Not assessable). “Satisfactory” (S) or “Meets expectations” (M) is not synonymous with “minimally competent”, but instead an indication of a fully working program or having achieved the learning goals for that course element. There is no partial credit, instead you will receive feedback on your submission and, where possible, have one or more opportunities to resubmit an assignment or retake a similar exam problem based on that feedback. The only grade you will receive will be the final grade and it will be determined according to the bundles of specifications (listed below) you have satisfactorily achieved.

Why? A grade should reflect your demonstrated understanding of the material at the end of the course (and only that). Assessing your work is a necessary but imperfect proxy for assessing understanding. My goal and responsibility is to create the best structures possible for you to demonstrate your true understanding. And your corresponding responsibility is to do everything you can to make your work accurately reflect your true understanding.

Note that this is a new system for me and this course. I am committed to do whatever is needed to ensure you understand the expectations and processes and are equipped to achieve your desired definition of success. I welcome your feedback and am ready to change any aspects that are not working. My goal is for you to achieve a Satisfactory understanding of all material you choose to tackle.

Some language adapted from Jason Mittell, Robert Talbert and Brett Wortzman.

Programming Assignments: In the first half the semester you will complete (approximately) weekly programming assignments that help prepare you for the course project. Programming assignments are generally submitted via Gradescope and GitHub classroom. Programming assignments are evaluated on correctness and execution (see below, but generally “good style”). Each assignment will specify the criteria for “Meets expectations” and “Exemplary”, but the former will generally require a submission that passes most or all correctness tests. An exemplary submission will need to be well executed.

Well executed code works, but is also:

If your program does not successfully pass all of the automated tests or meet the execution goals prior to the due date, you can still obtain full credit. To do so, you must submit a meaningful attempt prior to the due date (or extended due date, see below). You can then resubmit your assignment (multiple times) prior to the late deadline. Note that this deadline is different for different assignments but is tied to the sequence of the course. For example, the programming assignments are designed to prepare you for the project. That only works if you complete them before the project is really underway (e.g., the 6-7 week of the semester).

When you are ready for a resubmission to be evaluated, please send the instructors an e-mail to that effect. Resubmissions will not be evaluated until you notify me (since I won’t know if your code is ready). A meaningful attempt is generally characterized by passing some but not all of the automated tests. The ability to resubmit recognizes that learning is an iterative process that doesn’t always happen exactly on schedule. However, making an attempt by the due date ensures you are regularly practicing and solidifying what you are learning (especially while it is fresh!).

You may take up to two (2) 24-hour extensions on the initial (not final) due date on these assignments at your discretion (no explanation required or desired). Only one extension per assignment is permitted. To take an automatic extension e-mail the instructor(s) anytime prior to when the assignment is due with a note to that effect. Other than the two extensions described above, we will not accept late assignments except under extenuating circumstances or when otherwise specified (extenuating circumstances do not count against your allotment of extensions). If you are unable to complete an assignment (with or without the extension) contact the instructor(s) as soon as possible and before the deadline.

Practical exercises: Throughout the semester, there will be a collection of in-class programming exercises where you will work through step-by-step examples. These will typically be completed in class, but occasionally you may be required to complete them outside of class. Similar to your programming assignments, the practicals will have a suggested due date and final due date by which any revisions must be completed. The practicals will be evaluated as Satisfactory/Not yet satisfactory, generally using automated testing. There is no requirement for a meaningful attempt by the suggested due date and your automatic extensions cannot be used for the final deadline for these assignments.

Exam (and optional retest): There will be an exam (approximately ⅔ through the semester). The midterm will be on paper and will cover both the specific technologies we use in class (e.g. JavaScript) and general SW development principles, patterns and best practices. The specific questions will be tied to our class learning targets. Later in the semester here will be an optional retest with new problems for each of the learning targets (i.e., no new material). You are encouraged to solve any of the problems for which you have not already earned a Satisfactory mark.

Project: The focus of this class is the final project. In the second half the semester you will undertake a large software development project as part of team of 5-9 students. You will need to be in frequent contact with your group and actively contributing as a software developer each week. Your team will receive regular feedback throughout the project. The final rubric will be developed as part of class, but will include the overall success of project, but more significantly your participation and contributions to the project in both programming and non-programming activities. Our goal is to grow as software developers. To do so requires focusing on the practice of software development itself (as opposed to just number of features implemented or other similar metrics). You will submit regular status reports summarizing your contributions and will also be evaluated by your peers.

Final grades: Final grades will be determined by the following bundles (subject to change):

Final Grade Bundle
A Earn M+ (>= 3) on all programming assignments with >M (>3) on at least 2 assignments, and
Earn S on 9/10 practical exercises, and
Earn an S on 7/8 of learning targets (exam problems), and
Make multiple meaningful technical contributions (or equivalent) and non-technical contributions to the final project
B Earn M+ (>= 3) on all programming assignments, and
Earn S on 8/10 practical exercises, and
Earn an S on 6/8 of learning targets (exam problems), and
Make a meaningful technical contribution (meeting expectations) and non-technical contributions to the final project
C Earn M+ (>= 3) on 3/4 programming assignments, and
Earn S on 7/10 practical exercises, and
Earn an S on 5/8 of learning targets (exam problems), and
Make technical and non-technical contributions to the final project
D Earn M+ (>= 3) on 2/4 programming assignments, and
Earn S on 6/10 practical exercises, and
Earn an S on 4/8 of learning targets (exam problems), and
Make some but minimal technical and non-technical contributions to the final project

The “+” and “-“ modifiers will be applied by the instructor to the base grade above when the work completed falls in between bundles, e.g., an “A-“ would be assigned for work that is close to but not does meet all the requirements for the “A” bundle and “B+” would be assigned for work that meaningfully exceeds the “B” bundle requirements but is not close to the “A” bundle.

Getting Help

We are going to be using the Ed discussion board for our class discussions outside of class. Rather than emailing questions to the instructor(s), please post the questions on Ed. This will allow other students to answer questions and to benefit from the answers you receive. This system will only work if you use it, so please do so.

Expectations of You as a Student

You are expected to keep up with the material by completing any reading, watching any videos, etc. You are expected to bring a laptop to class every day to participate in online in-class questions, work on practicals, etc. If you forget your device or it is temporarily out-of-service, please obtain a loaner laptop from the departmental ASI(s) or another source (see above). Be curious! Come prepared to our class meetings with any questions you have about the current material and assignments.

Outside of class, proactively attend office hours and use the Ed discussion board to ask and answer questions about the material. Rather than emailing questions to the instructor, please post the questions on Ed as described above. This will allow other students to answer questions and to benefit from the answers you receive. I will regularly post FAQs and other material to the Ed discussion board.

Learning Community

I encourage an open exchange of ideas and questions in all interactions throughout the course. My goal is to help each of you develop your own understanding of the material, and I recognize that each of you has your own journey. So I encourage you to ask lots of questions and to be supportive of your classmates on their unique journeys.

As part of the Middlebury community and the Computer Science department, I support an inclusive learning environment where diversity and individual differences are understood, respected, appreciated, and recognized as a source of strength. Creating and maintaining an inclusive and positive learning environment where all have a sense of belonging is an important priority and a shared responsibility.

Our shared expectation is that everyone in this class will respect differences and demonstrate diligence in understanding how other people’s perspectives, behaviors, and world views may be different from their own. Should you experience or witness any behavior that opposes this idea, I hope you will let me know so that it can be addressed. If you feel comfortable doing so, you can report any incidents or concerns by:

You belong in this class and in Computer Science. I am glad you are here!

Honor Code

You are encouraged to discuss material from the lectures and online resources with your classmates, to post questions (and answers) to Ed, and are welcome to provide advice and help a classmate hunt for bugs. But you need to do so in a way that respects others’ work and contributes to your and your classmates’ learning (rather than hindering learning).

The work that you turn in must be completed independently, unless an assignment is explicitly designated as a “team” or “pair” assignment. Helping a classmate or working together does not mean working jointly on the same solution (on the same or different computers). You should never copy another students code or solutions, or exchange computer files, until after the final due date for assignment. If you see substantial portions of someone else’s solution in the process of helping or being helped, you should not copy it. Step away from your solution for an hour and then complete the assignment independently later. Alongside manual inspection, I may use automated tools for detecting software similarity.

You are permitted (and encouraged) to search online for documentation about the tools and technologies we are using, and consult the various online and offline resources for hints, techniques, and code snippets. You may and are encouraged to use any code that we provide to you. Any code that you didn’t write, or we didn’t provide you, must be cited (e.g., by providing the URL in a comment) in accordance with its licensing terms. Large language models (e.g., ChatGPT, GitHub Copilot) are a permitted resource (and we will discuss them in class), but you must cite their use in a comment. You are not permitted to search for solutions to the assignments themselves, e.g. if the assignment is to implement Tic-Tac-Toe in JavaScript, searching for “tic-tac-toe javascript” is not permitted. Assignments and solutions from previous semesters or other similar courses are not allowed resources (even if available freely online); consulting such materials constitutes a violation of the Honor Code.

As described above, attribute any ideas, code, etc, that you incorporate directly or indirectly into your work (this goes for classmates, books, online resources, large language models, etc). Be explicit. Tell me (e.g. in a comment) where you got the idea, approach, technique, code snippet, etc. and explain what your contribution was.

If you are ever unsure about what constitutes acceptable collaboration, acceptable use of Google, StackOverflow, etc. or permissible resources please ask!


Students who have Letters of Accommodation in this class are encouraged to contact me as early in the semester as possible to ensure that such accommodations are implemented in a timely fashion. For those without Letters of Accommodation, assistance is available to eligible students through the Disability Resource Center (DRC). Please contact ADA Coordinators Jodi Litchfield and Peter Ploegman of the DRC at ada@middlebury.edu for more information. All discussions will remain confidential.

A Final Note

This course is a “living being” that is continually evolving. I want you to have the best possible learning experience, and I welcome your feedback (whether in person, via e-mail or via an anonymous note) at any time on how to make any and all aspects of the course (e.g. class time, materials, assignments, office hours) work better for you.