Spring 2022

Instructor: Anya E. Vostinar

Room: Olin Hall 310

Time: 1A

Course Staff: See Moodle

Course materials:


  • Don’t Make Me Think! Revisited, by Steve Krug
  • Clean Code, by Robert C. Martin
  • Some additional reading materials will be linked through Moodle

I recognize the potential financial burden of additional course fees, supply requirements, and travel costs. If you are in need of assistance to cover course expenses, please speak with me by Friday of Week 1.

Drop in student hours:

Mondays 11-12, Wednesdays 3-4, Thursdays 9-10 all in Olin 306.

Remember that you are always welcome to schedule an appointment with me outside of these times. To schedule an appointment, please see my calendar, find a time that isn’t marked ‘Busy’ within 9-5 M-F and either send a calendar invite to an event or email me.


By now, you’ve taken at least a couple of computer science courses. You know how to program. You might know how to program pretty well. But mostly, you’ve done small-ish projects with clear guidelines and clear outcomes. You may wonder, how close is your experience so far to that of those who develop software—to “real world” programming? What do you need to know about how to write software in the real world to be a successful and independent programmer? Further, what do you need to know about how to be ethical in developing software and working with a team and clients?

This course is an introduction to the key concepts of software design, which we’ll loosely define as the art and science of effective and ethical software planning, construction, development, and maintenance. In this class, we’ll focus on the tools, skills, and ideas that good software developers should use in their day-to-day work. The concepts we’ll cover, practice, and discuss will be useful for programs, projects, and teams of any size.

Learning Goals

There are five high level learning goals in this course, each of which has subgoals that you can find below:

Work effectively in stable teams over the course of the term.
  • Develop and successfully adhere to a team contract.
  • Complete candid and constructive peer and self evaluations.
  • Communicate consistently, effectively, and frequently with team members.
  • Execute a shared, equitable workload.
  • Participate in regular code reviews.
  • Successfully utilize one or more aspects of Agile development methodologies: pair programming, sprints, Scrum, Kanban.

Create a database-driven website that successfully meets the goals of a specified audience.
  • Develop appropriate user stories for your site.
  • Identify an appropriate dataset or data structure for your website.
  • Analyze and integrate web usability and accessibility principles.
  • Design and implement an appropriate user interface for your website.

Create code that is well-written, modular, self-documenting, maintainable, and follows acceptable best practices.
  • Write self-documenting code that is easy to read and maintain.
  • Write appropriate code comments that enhance and supplement the code.
  • Write code that adheres to the single responsibility principle (for classes) and single layers of abstraction (functions/methods).
  • Design and implement an appropriate functional interface for your database-facing code.
  • Design and implement classes that demonstrate best object-oriented programming practices like the Law of Demeter, encapsulation, etc.
  • Design and implement classes that follow specific design patterns (namely MVC).

Successfully select and utilize appropriate tools, languages, and methodologies to complete the database-driven web site project.
  • Demonstrate basic competency with git and GitHub: storing, versioning, and tagging code; resolving merge conflicts; working with branches.
  • Demonstrate basic competency with ssh and vi.
  • Successfully develop one database method using test-driven development.
  • Create a working interactive website using HTML, CSS, forms, and (optionally) Javascript.
  • Demonstrate basic competency with developing a database schema, importing data into a database, and constructing database queries.
  • Correctly use Python language constructs and modules.
  • Successfully use a web framework (flask) to implement a working database-driven website.

Analyze and apply ethical reasoning to the software development process.
  • Apply the ACM Code of Ethics to various scenarios.
  • Critically examine software development practices for potential harm and/or exclusion.
  • Develop a personal set of professional responsibilities based on ethical principles.

Course Administration

Moodle: all course related materials, assignments, projects, readings, and resources will be posted here.

EdStem: all course announcements and changes to assignments, projects, and readings will be posted here. We’ll also use EdStem for some pre-class discussions about the readings, and as a way to ask and answer questions about projects and such. I also encourage you to use EdStem to communicate with your project teams. This is a new technology that we are trying out, so we’ll see how it goes this term!

GitHub: all starter code for assignments will be distributed here, and your project repositories are hosted here. You will “hand in” most of your projects on GitHub.

Programming languages and environment

Languages: Python, HTML, CSS, SQL, and Javascript.

IDE: VSCode. You should download VSCode to your personal machine.

We’ll also be doing a fair amount of work in text editors and the terminal.

Default environment: I will default to Mac OSX in class, for development.

Universal learning

I am committed to the principle of universal learning. This means that our physical and virtual spaces, our practices, and our interactions should be as inclusive as possible. Mutual respect, civility, and the ability to listen and observe others carefully are crucial to universal learning.

I strive to create an inclusive and respectful classroom that values diversity. Our individual differences enrich and enhance our understanding of one another and of the world around us. This class welcomes the perspectives of all ethnicities, genders, religions, ages, sexual orientations, disabilities, socioeconomic backgrounds, regions, and nationalities.

Getting help

There are many resources available to help you succeed in this course – please take advantage of any or all of them!

  • Office hours: Office hours are a great time to clear up any lingering confusion you may have about certain concepts, ask about the daily readings and essay assignments, work through ideas, or just talk about something in the course or in computer science generally or in life that’s piqued your interest. We will decide as a group at the beginning of the term exactly when office hours should be and how they should be structured. Once we’ve decided, I will post that information here and to Moodle. These time slots are for you, so use them! If for whatever reason you cannot make it to office hours, feel free to make an appointment to see me (info at the top of this page), or send me a message on EdStem.

  • Lab assistant hours: The student staff person for this course holds lab assistant hours each week in Olin 310. These are posted on Moodle and I will remind you during the term. There are also lab assistants working in Olin 310 during the afternoons and evenings. These students are great resources for help thinking through debugging strategies, and design options.

  • Accommodations for Students with Disabilities: Carleton College is committed to providing equitable access to learning opportunities for all students. The Office of Accessibility Resources (Henry House, 107 Union Street) is the campus office that collaborates with students who have disabilities to provide and/or arrange reasonable accommodations. If you have, or think you may have, a disability (e.g., mental health, attentional, learning, autism spectrum disorders, chronic health, traumatic brain injury and concussions, vision, hearing, mobility, or speech impairments), please contact OAR@carleton.edu or call Sam Thayer (’10), Director of the Office of Accessibility Resources (x4464), to arrange a confidential discussion regarding equitable access and reasonable accommodations.

  • Assistive Technologies: Technological Resources for Students: The Assistive Technologies program brings together academic and technological resources to complement student classroom and computing needs, particularly in support of students with physical or learning disabilities. Accessibility features include text-to-speech (Kurzweil), speech-to-text (Dragon) software, and audio recording Smartpens. If you would like to know more, contact aztechs@carleton.edu or visit go.carleton.edu/aztech.

  • Library: Library staff can help you find and evaluate articles, books, websites, statistics, data, government documents, and more. You can make an appointment with a librarian, get help via chat 24/7 from any page on the library’s website, email, or call. The Library building has lots of great study spaces, and we’d love for you to visit! For more information and our hours, visit the Gould Library website at carleton.edu/library.

  • Student well-being: Your health and well-being should always be your first priority. At Carleton, we have a wide-array of health and wellness resources to support students. It is important to recognize stressors you may be facing, which can be personal, emotional, physical, financial, mental, or academic. Sleep, exercise, and connecting with others can be strategies to help you flourish at Carleton. For more information, check out Student Health and Counseling (SHAC) or the Office of Health Promotion.


One of my goals for you in this course is for you to continue to develop as an independent programmer and learner. I’m much more interested in what skills and understanding you have mastered by the end of the course than the exact pace at which you master them. However, it isn’t healthy for you or me if you leave everything to the last minute. It also isn’t fair to your team if you haven’t prepared as much as they have. Therefore, my goal with the following evaluation metrics is to balance providing you flexibility to learn at your own pace while also making sure to spread your learning out over the entire term.

Towards that end, your performance in this class will be evaluated in four different ways according to the learning goals for the course:

  • Preparation There will be short reading assignments due before almost every class, to introduce you to the class session topic and to help prepare you for the in-class activities that day. Many of these reading assignments will require you to post a response on EdStem and/or complete a short activity related to the reading. I assign these because I’ve found over the years that students really benefit from these first encounters with the material and that it allows students to engage more deeply with the material in class. You need to complete all of these to earn a B or higher in the course. Preparation assignments are evaluated on completion only, not correctness. These assignments have an expected completion time (i.e. before the relevant class), however I will accept late preparation assignments because you will still benefit from completing them after the relevant class. I highly recommend that you complete them before the relevant class for your own learning benefit.

  • Reflection Taking stock of your own progress and contributions in this course are important aspects of your learning. Periodically throughout the term, I will ask you to reflect on what you’ve learned in the course, how you’ve contributed to group and individual deliverables, how effectively your project team is collaborating, and how well your teammates are contributing to your team’s goals. You need to complete all of these to earn a B or higher in the course.

  • Group deliverables This course consists of a team project that lasts the majority of the course and has components that you will create and get feedback on along the way. Your work will be evaluated on the effectiveness of the process you and your team utilize, the product you attain (and how closely this product meets the project deliverable requirements), and the effectiveness of your team’s collaboration. This contributes to your final grade according to the specifications grading scale outlined below.

  • Individual deliverables Many of the team project deliverables will also have an associated individual portion. The individual deliverables allow you to demonstrate individual mastery of the key learning objectives in this course – which will provide you with more targeted feedback on your performance. This contributes to your final grade according to the specifications grading scale outlined below.

Grading Scale

I’ll be using a version of specifications grading this term. Each assessment that you hand in will be evaluated against a checklist or rubric related to one or more of the course learning objectives. I will distribute the rubrics and checklists I’ll use to assess each assignment so that you know exactly what constitutes each of these levels. I will rank each learning objective, and the overall submission, according to a five-level scale:

  • Insufficient evidence (basically nothing turned in)

  • Does not meet expectations (something was turned in but it did not fulfill the criteria)

  • Partially meets expectations (the submission was on the right track but is not quite there yet)

  • Meets expectations (the submission satisfactorily met the learning objective(s))

  • Exceeds expectations (the submission shows strong mastery of the learning objective(s))

An important aspect of specifications grading is revision. You may revise any group or individual deliverable up until the end of exams. Learning is not a linear process, and learning involves making mistakes and learning from them. You may revise and resubmit a deliverable at least once, within a week after its assessment has been released. I will keep the higher of the {original, revised} levels (though if you end up with a revised submission at a lower level than the original, we should meet to discuss it). You may further revise that deliverable before the final submission and request additional feedback via this form, however I make no guarantee of how quickly the resubmission will be assessed; it might not happen until the end of the term.

How this translates to course grades

To earn a C in the course: at least half of the components of the group project and half of the individual deliverables are at “Meets expectations” level and at least half of your preparation and reflection work was submitted satisfactorily.

To earn a B in the course: all components of the group project and individual deliverables are at “Meets expectations” level and all of your preparation and reflection work was submitted satisfactorily.

To earn an A in the course: at most one component of the group project OR individual deliverable is at “Meets expectations” level, and all others are at “Exceeds expectations” level and all of your preparation and reflection work was submitted satisfactorily.

Late work and extensions

In this course, we need to balance flexibility for individuals with structure for teams and the class as a whole. I also want to help you avoid procrastinating to the point that you can’t get everything submitted by the end of the term. Therefore, the late work/extension policy varies depending on the type of work:

  • Preparation assignments can be submitted late, up to the end of the final exam period, without penalty. However, you will gain the most benefit from them and therefore the course if you complete them by their recommended due date or as soon after as you can manage.
  • Reflection assignments can be submitted late, up to the end of the final exam period, without penalty. However, you will again gain the most from them if you complete them by their recommended due date or as soon after as you can manage.
  • Individual deliverables have a 48-hour grace period after their posted due date. If you miss that cutoff, you will still be able to submit something during the revision period. I highly recommend you aim to submit something in the original submission window so that you can benefit from feedback and revision.
  • Group deliverables also have a 48-hour grace period after their posted due date and you can submit during revision if you miss that cutoff. I again highly recommend you aim to submit something in the original submission window so that you can benefit from feedback and revision.

All work must be submitted by the end of the last finals period as per College policy. All that said: This term is going to be weird, and hard, and disruptive, for all sorts of non-academic reasons. If you’re staring down a deadline that you know you can’t meet, or if you’ve fallen behind, get in touch with me immediately and we’ll work something out. While I need to put boundaries in place for my own health and wellness, and for fairness to everyone in the class, I also want to make sure you are progressing in your learning.

Doing honest work

Working in groups is a great way to learn computer science, and learning how to work with others is an essential skill. The opportunity to work in groups also comes with some additional responsibilities:

  • As a member of a team, it is your responsibility to contribute equally and fully to the final product. For example, it is not acceptable to let a teammate “finish the project” without you and put your name on it before submitting it, or work on significant portions of the project without you, or any permutation of this. When pair programming, I expect you to actively work side-by-side with your partner the majority of the time.

  • As a member of a team, it is your responsibility to be able to explain and/or reproduce your solution individually, if asked. If you do not understand the solution, then you did not contribute fully to the project, and this will hinder your learning of the course material.

  • Whether you are working in a team or individually, it is your responsibility to follow the written and stated guidelines for any particular project. This includes instructions on the level of acceptable collaboration, restrictions on the tools and resources you can use, etc.

  • Whether you are working in a team or individually, it is your responsibility to credit any assistance you receive. If you receive assistance from anyone (another book, a lab assistant, a classmate, me), you must properly cite your source. I’m not concerned with format—use any format with which you are comfortable. Here’s an example of citing assistance in code: if a piece of your program utilizes someone else’s idea, you might include the following in your program’s comments:

      # Method to calculate the first ten prime numbers in a series. 
          # Thanks to Mary Smith for helping me fix the logic in the # loop in this method.
  • It is never acceptable to turn in a program, or a problem solution, that you have found anywhere (on the Internet, in your textbook or another book, from a friend who took this course before) or commissioned as your own. Making cosmetic changes to someone else’s program or solution (such as changing the variable names or comments) is also not acceptable. In general, when you put your name on an assignment or project, you are verifying to me that this work represents your own work and not the work of someone else. You should consider putting your name on an assignment, project, or exam as a contract between you, your teammates (if applicable), and me that this work is your own work and not the work of someone else.

Cases of suspected academic dishonesty will be turned over to the dean’s office, as per Carleton policy.

This syllabus is based on the materials from Profs. Amy Csizmar Dalal and Jeff Ondich.