Fundamentals of Modern Software

James Grimmelmann

Cornell Tech

Fall 2017


This is a crash course in how software works and what it can do. It is organized around data: how it can be stored, acquired, transformed, analyzed, transmitted, displayed, and secured. There is a strong emphasis on learning by doing: students will have hands-on experience in and outside of class with a wide range of technologies.

Students who complete the course will be able to write simple programs to automate routine tasks. They will have enough familiarity with the modern software stack to quickly contextualize new technical information. Even more importantly, they will be able to talk to technologists intelligently and understand the kinds of constraints that shape technical decisions.

The course is intended for students no prior training in programming. It covers the essentials of program implementation and debugging. 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 Staff

Instructor: James Grimmelmann,

Head TA: Eyvind Niklasson,


Piazza is the preferred way to reach the course staff.


The primary readings will be from a draft of the textbook Computer Programming for Lawyers (CPFL) by Jonathan Frankle and Paul Ohm. We will provide you with a PDF of the draft. It is not public, and should not be shared with anyone outside of this course. If you have corrections or suggestions for the authors, please send them to me and I will pass them along.

In addition, we will frequently point you to online resources, including documentation for various languages and APIs, question-and-answer sites, and useful tools.


Python package/API documentation:

Web APIs:

Command Line (macOS/Linux):

Command Line (Windows):

How Computers Work:

Unicode and UTF-8



Regular expressions:

Class Meetings

We meet Mondays and Wednesdays 12:20 to 1:35 in the Bridge case classroom (L23). You will also be assigned to a weekly lab session, co-led by two TAs. The labs meet Thursdays 2:00 to 3:00.

Each week of the course will follow a standard rhythm. Lectures on Monday and Wednesday (together with the assigned readings for those lectures) will present new material. The lab on Thursday will then review the material from lecture and give you a chance to reflect and ask questions at more leisure. We will “hand out” a homework assignment during lab that draws on the concepts from that week. The assignment will be due by noon on Thursday the following week. This means that for most of the course you will be working on an assignment that covers one set of material while you are reading and learning about different new material.

Bring your computer with you to class and especially to labs: we will frequently invite you try things for yourself as we go. The TAs will provide technical support in and out of lab; they can’t do your programming assignments for you, but they can help you make sure that your programming environment is working correctly, help you with the mechanics of submitting your homework, etc.

Attendance is required. Especially in view of the other significant demands on your time, I will be understanding about conflicts and flexible in working with you to make alternative arrangements as needed. That said, consistent unexcused absences are not okay, and may lead to a reduced grade or exclusion from the course (after reasonable written warning).

Class Policies

I want our classroom to be a welcoming space, one where we all learn from the diversity of each others’ experiences and perspectives. The best comments are ones that help your colleagues learn. I expect you to act professionally and respectfully to your classmates (and our occasional guests) at all times. I will not condone harassment.

If anything in or out of class troubles you, please come and talk to me about it. 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.

If for any reason your preferred name is not the one that appears on the course roster, please let me know how you would rather be addressed. (For example, I regularly have students who go by their middle names rather than their first names, or who have changed their names as part of significant personal transitions.) It’s a small thing, but there’s no reason I should get it wrong.

All class sessions are recorded. You will have access to the recordings. So will I, your classmates, and other Cornell Tech faculty and staff as part of their jobs. The recordings will not be shared outside the Cornell Tech community. In special circumstances (e.g. at the request of a guest speaker) I may turn off the recording, and it might sometimes happen (especially during the new building’s shakedown cruise) that the recording doesn’t work.

Course Tools

You must have a computer on which you can install up-to-date software. That means a Mac running a recent version of OS X, a PC running Windows 10, or an up-to-date distribution of Linux.

Follow these tutorials in order to set up your programming environment:

  1. Install Anaconda. Anaconda is a program for managing Python programming environments. It ensures that you will all run the same exact version of Python.
  2. Install Atom. We recommend that you use Atom to write your code. Other well-regarded editors include Visual Studio Code and Sublime Text, but they are not officially supported by the FMS course staff.
  3. Install GitHub Desktop. You will use a program called Git to keep track of the code you write. You will get and submit your assignments to a web-based Git service called GitHub. And we recommend that you use a program called GitHub Desktop as a convenient graphical interface to Git and GitHub.
  4. Do “Assignment” 0. This is a fictitious (and very simple) assignment that will help you (a) understand how all the tools you just downloaded work, and (b) get used to the workflow of obtaining, completing, and submitting your assignments.

The first lab session – and if necessary, the second – will be primarily devoted to helping you get set up.


Your grade for the course will be determined based on the grades for homework assignments 2 through 6. (Assignment 1, which would have been required but ungraded, has been dropped.) We will drop your lowest score and then average the remaining four.

Any assignment may be submitted up to 36 hours late – i.e. before midnight on Friday – 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.

Here are the instructions for downloading and submitting assignments.

Class Resources

This syllabus is at It will be updated as the course progresses.

We have created a Piazza site for this course; all students enrolled will be invited. We will post announcements there, and use it to distribute handouts and homework assignments. You can also post questions for the course staff there and discuss course-related topics with your classmates.


We are members of an academic community built on respect, trust, and honesty. 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 and the Campus Code of Conduct.

We are also joined in the endeavor that is Cornell Tech because we believe in improving the world through law and technology. I cannot compel you to do what is best and right in all things. But you should aspire to.

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 string, 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 general 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 “what is a tuple?”
  4. You may discuss answers to class exercises, those from the book, or those found elsewhere that have not been assigned, and in doing so, you may share or view code with others. Do not use this as an end-run around this policy.
  5. You may use online references and Google freely. More than that, 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.


All of the following is subject to change as we go along. This is the first time this course has been taught; we are all learning by doing. The notes underneath each class are the reading assignments.

Aug. 20 - 26:

Aug. 27 - Sept. 2:

Sept. 3 - 9:

Sept. 10 - 16:

Sept. 17 - 23:

Sept. 24 - 30:

Oct. 1 - 7:

Oct. 8 - 14:

Oct. 15 - 21: