TECH 5300: Fundamentals of Modern Software

James Grimmelmann

Cornell Tech

Fall 2021


This is an introductory course in how software works and what it can do. It covers the basics of programming, databases, and web applications. There is a strong emphasis on learning by doing and the course includes biweekly programming assignments in Python.

Initial Assignment

We first meet in person on Thursday, September 2. Before then, watch the videos in Unit 1 in the Modules section of the course Canvas, and make an initial attempt at the exercises in Unit 1. Do not worry if you have difficulty with some of the exercises. That’s what the labs are for.

Course Outcomes

Students who complete the course will:

  1. Be able to write simple programs in Python to automate routine tasks.
  2. Understand fundamental software concepts including control flow, simple and compound data types, file formats, and modules.
  3. Be able to create basic apps using databases, APIs, and HTML interfaces.
  4. Have enough familiarity with the modern software stack to quickly contextualize new technical information.
  5. Be able to talk to technologists intelligently about the software development process and understand the kinds of constraints that shape technical decisions.

Who is This Course For?

The course is intended for students with no prior training in programming. It covers the essentials of program implementation and debugging. There are no prerequisites or corequisites.

Students who have significant programming experience may not take this course. Talk to me ASAP if you are uncertain whether this applies to you.

Course Logistics

COVID-19 Update

Cornell requires all students to have received an FDA- or WHO-approved COVID-19 vaccination, and “strongly encourages” all faculty and staff to be vaccinated. (I have received a full course of two doses of the Moderna mRNA vaccine.) However, Cornell allows for medical and religious exemptions from its vaccination requirement, faculty and staff are not required to be vaccinated, the Delta variant of SARS-CoV-2 can lead to “breakthrough” infections even in vaccinated people, and a substantial fraction of people who have been infected are completely asymptomatic. This has important consequences for our class.

First, masking remains an essential precaution. Cornell requires masks to be worn at all times in shared indoor spaces. You should assume that in any substantial gathering of people such as a class, someone present (including you) may be carrying an asymptomatic infection, or may be at risk of becoming severely ill if infected. For their health and yours, wear your mask consistently and make sure that it fits well.

Second, if you are feeling unwell, DO NOT COME TO CLASS. This has always been the case, but it is especially important now. Rest, take care of your own health, and keep your classmates safe. DO NOT FEEL UNDER ANY PRESSURE TO ATTEND CLASS. I will be happy to meet to discuss anything you are concerned about missing. If you have possible COVID-19 symptoms, please have yourself tested promptly.

Third, I will make every needed accommodation to make up for the disruption that COVID-19 creates in your life. These come in many forms, from family health issues to travel restrictions to stress and trauma. I do not know now what improvisations will be necessary over the course of the semester, but I promise you that I will do everything I can to help you thrive under these most difficult of circumstances.


This syllabus is at

Instructor: James Grimmelmann,

Huddle: Bloomberg 370
Desk: Bloomberg 3 NW, near the bookshelves

I hold drop-in physical office hours Mondays 2:15 to 3:15 PM and virtual office hours Wednesdays 7:30 to 8:30 PM. (The Zoom link is on Canvas.) I am happy to meet at other times by appointment. It is also always fine just to swing by to see if I’m free. If I have headphones on, just catch my eye. If my huddle door is closed, it’s closed for a reason (usually a call or a meeting) – send me an email! If it’s open, come on in! If I’m not around, email is generally best.


We encourage questions via the #fms-fall-2021 channel in the Cornell Tech Slack, and in the “Discussions” section of the course Canvas.

There are no required textbooks for this course.

The “Files” section of the course Canvas has PDF glossaries and key-concept handouts for each unit of the course.

The following resources may also be useful in understanding the material or in going beyond it, but none of them are required.


General Questions


Python Package/API Documentation

Web APIs

Command Line (macOS/Linux)

Command Line (Windows)

How Computers Work

Unicode and UTF-8






Your work for this class will consist of the following:

First, watch the assigned videos (available under “Modules” on Canvas). These are professionally produced eCornell versions of my lectures from a previous iteration of this course. They cover everything I would have covered in lecture, but more clearly, in less time, and with better animations. The course is divided into 5 “units,” each with 4-6 “modules,” and each module consists of about 4-8 individual videos, for a total of about 90 minutes of videos per unit. Some of the videos have ungraded multiple-choice and match questions that are useful for checking your knowledge.

Second, do the practice coding exercises interspersed with the videos. Clicking on an exercise in Canvas will open a frame to Codio, a cloud-based programming environment. In effect, each of you will have your own dedicated computer, which you can use from your web browser. (I recommend Chrome, as other browsers have had compatibility issues.) It comes preloaded with Python and all of the software you need for each exercise. The course staff will be able to see your work on Codio to provide you with help, but these are ungraded. (Ignore anything to the contrary on the questions and exercises. This is detritus left over from the eCornell export.) They are designed to give you initial practice with the course concepts.

Third, attend your assigned weekly lab session. Each session will be led by one or two members of the course staff, who will (a) demonstrate how to attack programming problems, (b) help you attack programming problems yourselves (individually and in groups), and (c) answer questions about the material. Bring your computer!

Fourth, complete five biweekly programming assignments. Each of the assignments will correspond to one of the five two-week units into which the course is divided (basic Python, lists and loops, databases, APIs, and web apps). The assignments will also be accessed through Canvas and hosted on Codio


There are five graded programming assignments. Each assignment will be due by noon on the Monday following a two-week unit.

Any assignment may be submitted up to 48 hours late – i.e. before noon on Wednesday – with a 20% late penalty. Assignments will not ordinarily be accepted after that.

If you have a medical emergency or other good reason that prevents you from completing an assignment on time, talk to me and we will make appropriate accommodations.

Your raw grade for the course will be the average of your grades for the five programming assignments. The course overall is graded S/U. We will set the cutoff for an S based on the difficulty of the assignments, but in the past it has typically been around 70%.

Course Policies


On October 7, 1868, at Cornell University’s dedication, its founder and namesake Ezra Cornell stated, “I would found an institution where any person can find instruction in any study.” The University is committed to the principle of “… any person … any study.”

In particular, Cornell University prohibits discrimination on the basis of race, ethnicity, national origin, age, religion, belief, disability, sex, pregnancy, sexual orientation, gender identity or expression, criminal history, military or veteran status, or genetics. All are welcome here.

I will do my best to make this course interesting, supportive, and enlightening regardless of your personal identity, beliefs, prior life experiences, degree program, or future plans. If there’s anything I can do to help, please let me know.

If anything in or out of class makes you uncomfortable or interferes with your ability to participate, please raise it with me. Not all discomfort is avoidable, but I will do everything I can to help that is consistent with the educational goals of the course. I will also respect any requests for confidentiality as far as my legal and professional duties allow.

Names, Titles, and Pronouns

I am happy to address you and refer to you however you prefer to be called. I will ask you for your name, title, and pronouns on the first day of class, and after that please tell me if I am getting something wrong or you would like me to make a change. As a matter of personal courtesy and professional respect, I also expect that you will address and refer to classmates and guests as they prefer. Beyond that, Cornell Tech is generally a very informal place.

Names: Most assumptions about other people’s names are fallacies. (See Falsehoods Programmers Believe About Names.) The only sure guide to a person’s name is to ask. It is tempting to think that when someone’s name is written as Firstname Lastname, it means that person is called Firstname. But this is wrong. Here are just a few of the many variations I have seen:

As for myself, I go by “James” (not “Jim”), and my surname is spelled with two ‘n’s at the end. For pronunciation, see my NameCoach badge.

Titles: I won’t use your title unless you prefer that I do. (Exception: when I write formal letters of recommendation, I will use your title unless you prefer that I don’t.) The Paper Chase convention of calling law students “Mr. Hart” survives only as parody or affectation. On those extremely rare occasions when a title is called for, I go by “Professor Grimmelmann.” But you should call me “James,” not “Professor” or “Prof.”

Pronouns: I go by “he” and its inflections. I generally use “they” and its inflections to refer to an unknown or indeterminate person. But when talking about a specific known person, the correct pronouns are the ones they themselves go by.

Place and History

The island on which Cornell Tech stands was traditionally Canarsee Lenape land. It was “purchased” by Dutch colonial authorities in 1637 as part of the long history of violence, displacement, and erasure by which European settler colonialists appropriated the North American continent. Lenape tribes today occupy small reservations in Oklahoma and Wisconsin, which gives a sense of the devastation that Europeans inflicted on the Lenape and other Native Americans in driving them out from here.

By divers mesne conveyances, the island passed to the City of New York in 1828. It was used as an asylum, a smallpox hospital, a workhouse, and a prison. The conditions of life for the inhabitants of all of them were notoriously poor. Cornell Tech itself stands on the site of the prison, Blackwell’s Penitentiary, where inmates were subjected to disease, abuse, and forced labor.

The Penitentiary was demolished in the 1930s and replaced by Goldwater Memorial Hospital, a chronic-care facility. It merged in 2013 with Coler Specialty Hospital, also on the island, which serves high-risk chronic-care patients, often elderly and disabled. During the Covid-19 pandemic, the dangerously crowded and poorly administered conditions at Coler were responsible for numerous infections and deaths among its residents.

All of these things are parts of what we call “history.”

She said, What is history?
And he said, History is an angel
Being blown
Into the future
He said: History is a pile of debris
And the angel wants to go back and fix things
To repair the things that have been broken

But there is a storm blowing from Paradise
And the storm keeps blowing the angel
Into the future

And this storm, this storm
Is called

—Laurie Anderson, “The Dream Before” (after Walter Benjamin and Paul Klee)

We cannot unsmash the debris of history; we cannot now restore the Canarsee to their homes as they were, or bring the dead to life. But we can force ourselves to look clearly upon the wreckage, to acknowledge the suffering and injustice that have brought us to this point. From it we salvage we what can, and learn what we can, to hold a mirror up before the face of the angel of history, that it might gaze upon the future, where it is always still possible to do better.


We are members of an academic community built on respect, trust, and honesty. Many of us are also members of a learned and regulated profession, one that enforces stringent codes of professional responsibility. I will take you at your word; in return, I expect you to be truthful and candid in your dealings with me and your classmates. Your conduct in this course is subject to the Cornell Code of Academic Integrity, the Law School Code of Academic Integrity, and the Campus Code of Conduct.

Collaboration Policy

Part of the process of learning to code is getting stuck and working to get unstuck. Part of getting unstuck is talking to your classmates, but part of it is rolling up your sleeves and working on the problem alone. For this reason, although we encourage many forms of collaboration, we are implementing a strong, bright-line collaboration policy for the class. Any violation of this policy will be considered a violation of the Code of Academic Integrity.

  1. For graded assignments, you may not view the code of anybody else who has taken or is taking the class.
  2. For graded assignments, you may not show your code to anybody except the course staff.
  3. You may discuss concerns or concepts with your classmates, but please keep this at a general level. For example, you are allowed to discuss questions such as, “what does this error message mean?” or “how does this code from the lecture video work?”
  4. You may freely collaborate on and discuss the ungraded Codio and lab exercises and their answers, including sharing code. Do not use this as an end-run around this policy.
  5. You may use online references and Google freely. In fact, you are positively encouraged to look things up early and often. There are, however, two important limits. First, you may not ask questions based on the assignments. Treat the Internet like a classmate: general questions about Python are fine, but posting your code or asking questions about specific tasks required for the homeworks is not. Second, you may not look at solutions to the assignments if you see that someone else has posted them.


If you have a disability requiring accommodation, I find it helpful to receive your accommodation letter from Student Disability Services as early in the semester as possible so that I have adequate time to make appropriate arrangements. If you need an immediate accommodation for equal access, or if you think there is something I could do to improve the accessibility of the course for yourself or others, please talk to me or send me an email. Everyone’s experience is important to me.


I expect you to act respectfully to your classmates (and our occasional guests) at all times. I will not condone harassment.

Beyond that, I view “professionalism” as an act of care for others. I will do my best to model this version of professionalism in and out of class, and I encourage you to, too.


I will record all class sessions. I will provide you with access to the recordings (via Cornell’s video-on-demand platform) for any reasonable justification, such as absence due to illness, job interviews, court appearances as part of a clinic, or disruption to your ordinary life due to a global pandemic.

I will have access to the recordings, as will your classmates who have reasonable needs for them, and any other Cornell faculty and staff who need access as part of their jobs. The recordings will not be shared outside the Cornell community. In special circumstances (e.g. at the request of a guest speaker) I may turn off the recording, and it might sometimes happen that the recording doesn’t work. You can request access to specific class recordings by emailing me.

You may not record your own audio or video of this course without the knowing consent of all people being recorded.


The lab sessions meet on Thursdays from 9:40 to 10:55 and from 11:25 to 12:40 in room 61 in the basement of the Bloomberg Center.

The course is divided into five two-week units. The first lab session in each unit will focus on the concepts from the videos. The second lab session will focus on larger programming tasks and on the concepts tested on the assignment.

I strongly recommend that you start the programming assignment before the second lab session in each two-week unit. That way, you will come to lab oriented to what the issues and challenges are and leave with a better sense of how to tackle them.

Unit 1: Basic Python

Watch the Unit 1 videos on Canvas and do the associated exercises.

Unit 2: Lists and Loops

Watch the Unit 2 videos on Canvas and do the associated exercises.

Unit 3: Databases

Watch the Unit 3 videos on Canvas and do the associated exercises.

Unit 4: APIs

Watch the Unit 4 videos on Canvas and do the associated exercises.

Unit 5: Web Apps

Watch the Unit 5 videos on Canvas and do the associated exercises.