- Instructor: Will Rosenbaum
- Email: email@example.com
- Office Hours: Virtually (TBD)
- Lecture 1: WF 10:10–11:00
- Lab 1: M 10:10–11:00
- TAs: Quentin Jeyaretnam & Hasham Warrich
- Lab 2: M 11:20–12:10
- TAs: Sarah Park & Naya Burshan
- Evening TA Sessions: MW 7:00–9:00 pm
- Monday TAs: Nico Ardila & Hasham Warrich
- Wednesday TAs: Nico Ardila & Faith Merritt
Main text: Java Programming by McGeoch (PDF only, available on the Moodle site)
Java documentation: Java SE 11 API Documentation
Other readings, videos, etc., will be posted to the Moodle site
Official Course Description
A continuation of COSC 111. This course will emphasize more complicated problems and their algorithmic solutions. The object-oriented programming paradigm will be discussed in detail, including data abstraction, inheritance, and polymorphism. Other topics will include stacks, queues, linked lists, programming for graphical user interfaces, and basic topics in probability. A laboratory section will meet once a week to give students practice with programming constructs.
Unofficial Course Description
In your first computer science course, you probably acquired some familiarity with the syntax and conventions of a programming language. Using this knowledge, you learned to write programs of a fairly limited nature that solve well-specified tasks in a prescribed manner. The goal of this second course is for you to progress toward what I call algorithmic fluency: the ability to formally specify a problem, devise a conceptual solution to the problem, design the structure of a solution, and implement the solution in code. In order to move towards algorithmic fluency, we will discuss general design principles and problem solving strategies. We will learn to implement solutions in the Java language.
In working towards tackling large-scale problems, we will discuss general design principles to structure our code—and our approach to reasoning about problems. We focus on the object-oriented paradigm. The object-oriented paradigm gives a framework to break a complicated task into smaller interacting parts—objects—that perform simpler tasks. By learning the art of object-oriented design, we will learn to break seemingly insurmountable problems into manageable pieces. Moreover, well-designed objects can be repurposed and modified. Thus, the code we write to solve one problem can be readily applied to solve other problems as well. In addition to general design principles, we will examine some specific data structures (linked lists, stacks, and queues) and algorithmic techniques (recursion and randomization) that are employed throughout computer science.
List of Topics Covered
- Course introduction and review of Java
- Defining and creating object classes
- Object allocation and garbage collection
- Inheritance and the class hierarchy
- Overloading and overriding
- Abstract classes and methods
- Generics and container classes
- GUI interfaces and event-driven programming
- Linked lists
- Stacks and queues
This course will be taught remotely. The main content will be a mixture of asynchronous content (videos, readings, etc.) and synchronous virtual meetings through Zoom. The synchronous meetings will typically consist of a brief “lecture” followed by informal and group discussion. Each week will begin with a lab session on Monday, followed by lecture sessions on Wednesday and Friday. The lab session is intended to get you started on the weekly lab assignment and address any technical issues you might have. Lab assignments will be posted well in advance of the lab session. You are strongly encouraged read and think about the assignment before the lab session so that we can address any questions or problems you might have during the session.
The asynchronous material (short videos and activities) will typically focus on the technical material, for example, describing details of how to implement things in code. Lecture sessions will focus on more conceptual material. Both components are intended to be highly interactive. Regular participation in the synchronous sessions is essential to the course, and your participation determines part of your grade in the class. If you cannot attend a scheduled lecture, please contact me in advance (if at all possible).
Finally, you will be assigned to small “accountability groups.” You will be expected to meet with your accountability group weekly and submit a brief report of what your group discussed.
The course will rely upon three shared communication channels:
- Moodle, for all official course information such as assigned readings, activities, required discussion forums, assignment posting, and assignment submission.
- Zoom for synchronous meetings.
- Slack for informal discussion.
Links to all of the Zoom lectures and instructions to get set up with Slack will be posted to the Moodle site.
Coursework and Evaluation
The graded coursework will consist of weekly lab assignments, individual projects, quizzes and exams, and class participation. Additionally, in order to receive an “A” grade for the course, you must submit an extension portfolio at the end of the semester highlighting open-ended work you’ve done throughout the course.
Coding/Lab Assignments (~25%)
Weekly lab assignments will be posted each Friday and due the following Friday. These assignments will consist of small-scale programming activities, with the expectation that each assignment will take roughly 1 to 3 hours to complete. The Monday lab sessions will mostly be devoted to group discussion and individual work on the labs. To get the most out of these sessions, please look over the assignments before attending.
Lab assignments will include two opportunities for extra credit:
Each assignment will suggest extensions to the “basic” task you’ll be expected to perform. The extensions will often be more open-ended, so this is one opportunity to express your creativity in the class and get credit for doing so! (See the “extension portfolio” section below to see how the extensions are factored into your grade.)
Lab assignments may be turned in up to 4 days early for extra credit. You will receive 1% extra credit for the assignment per day early. For example, an assignment turned in on Thursday will receive 1% extra credit, Wednesday 2%, etc. up to Monday.
Individual Projects (~30%)
There will be three larger-scale individual projects assigned during the semester. These projects will combine the individual tools and concepts explored in labs and lectures to create larger, more sophisticated (and more exciting!) programs. As with labs, the projects will include opportunities for open-ended extensions and exploration for extra credit. It is expected that you will spend approximately 2–3 hours a week working on projects, averaged over the time from when the project is assigned to when it is due.
There will be regular weekly short quizzes (~ 10–20 minutes). The quizzes serve primarily a diagnostic function to ensure you are keeping up with the material.
Class Participation (~20%)
You will be expected to engage in both the synchronous and asynchronous portions of the course. Asynchronous interactions will be primarily in the form of contributing to discussion forums on Moodle, and your responses to prompts in lecture/accountability group meetings.
At the end of the course, you may submit a compilation of (highlights from) the open-ended work you have completed throughout the semester. This work may consist of extensions from the labs and/or projects, or any other programs you’ve written during the semester that are relevant to the course. In order to receive a grade of “A” for the course, you must submit an extension portfolio. For a base-line of what is required for an “A” grade, the total amount of open-ended work should be the equivalent of 2 lab assignments, e.g., 4 small extensions to lab assignments, or 2 more elaborate extensions, or a larger scale project of your own devising. Any work above this base-line will be treated as extra credit, and there is no limit to how much extra credit you can receive for the extension portfolio.
It is expected that you will spend approximately 12 hours per week on this course (averaged over the semester):
- synchronous meetings 3 hr/week
- asynchronous material (reading, etc.) 2–3 hr/week
- lab assignments 1–3 hr/week
- projects 2–3 hr/week
- self study 1–3 hr/week
You are encouraged to collaborate with your peers, but all submitted work (labs, projects, quizzes, and exams) is expected to be yours and and yours alone. For labs and projects, this means you should talk about your work with your peers, but you should not share your code (for assignments) with anyone, nor should you ask anyone else—currently taking the class or otherwise—to show you their code or to directly help you write code. As a heuristic for what constitutes encouraged collaboration, if it is something you can discuss without sharing your computer screen or writing Java syntax, then you are probably alright.
If you are stuck on an assignment or are struggling with the material, there are many opportunities for help:
- ask during lab or lecture
- start a discussion on Moodle or the course Slack channel
- ask a TA during evening TA sessions
- ask during the professor’s office hours
- email the professor (see below)
Often, if you have a question about an assignment or course material, there will be many other students with similar questions. Thus, it is beneficial to everyone to discuss these questions in a shared venue such as the lecture or discussion forums. For questions that are specific to you or require sharing code (e.g., debugging), you should ask a TA during lab or me during lab or office hours.
You are always welcome to email me with questions you have, even if not related to the course. I will do my best to respond to all student emails in a timely fashion. In order to cut down on unnecessary email, however, please email me only if none of the communication formats above seem appropriate. In particular, please do not email me your code—if you are having difficulty troubleshooting your code, please ask during the lab session or talk to the instructor during office hours.
If you find that you are struggling with the course and would like more one-on-one help, please contact the instructor about individual tutoring through Amherst’s peer tutoring program.
UA. Finally for one piece of unsolicited advice: I have found that often the most productive way to make progress on any problem is to give it time. Step away from your computer. Take a few deep breaths. Get some physical activity, preferably surrounded by trees and/or dogs. Almost without fail, I find that I have a better perspective on things when I get back to work.
- share your code for assignments with other students in the class or ask others to share their code with you;
- discuss material appearing on a quiz before you or others have submitted the quiz;
- submit code written by someone else or derivative of someone else’s code without crediting the original author/source.
Failure to comply with these terms may result in loss of credit for the assignment or course, as well as possible disciplinary action by the college.
If you would like to use code that you did not write, be sure to attribute the source of the code in the comments of your code. Attribution is required even if you modify the original code.
UA. Your letter grade for the course is unlikely to have any long-term impact on your life. However, mastery of the skills and concepts covered in this course will be invaluable in almost any technical field you might pursue. Thus, I believe it is never in your interest to cheat in this (or really any) course. The long-term benefits of a good grade in this class are negligible, while the cost of not making a good-faith effort to master the material is potentially huge (independent of the ramifications of getting caught cheating). The course is designed to be challenging, but if you find yourself struggling to keep up, please reach out to the instructor.
Given the unusual circumstance of this semester, I will work to be accommodating of your needs. When computing grades, your lowest quiz score and lowest lab score will be ignored. Thus, a single missed quiz or lab will not by itself have any impact on your grade for the course. In my experience, offering extensions on assignments does not typically benefit students. Thus, I do not intend to accept late work except in truly exceptional circumstances. If you are having trouble with any aspect of the course, please get in touch with me.
Remark on Remarks
Throughout my written materials, I will use some abbreviations to indicate that you can ignore some of the material: IYI and UA. These stand for “if you’re interested” and “unsolicited advice,” respectively. Anything following these labels is not “officially” part of the course and can safely be ignored without concern that you skipping something I’ll reference later.
IYI. I stole the IYI label from author, thinker, and Amherst alumnus, David Foster Wallace. Among other things, he is known for his extensive use of footnotes and parentheticals in his writing.