Fundamentals of Modern Software

James Grimmelmann

Cornell Tech

Fall 2018


This is a crash 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 weekly programming assignments in Python.


There are no prerequisites or corequisites.

The course is intended for students with 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 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, databases, and web servers.
  3. Have enough familiarity with the modern software stack to quickly contextualize new technical information.
  4. Be able to talk to technologists intelligently and understand the kinds of constraints that shape technical decisions.

Course Staff

Instructor: James Grimmelmann,


Campuswire is the best way to reach all of us.


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 usually meet Mondays and Wednesdays 1:55 to 3:10, usually in Tata 123. You are also required to attend a weekly lab session, led by thes TAs. The labs meet Thursdays either 9:30 to 10:45 or 12:30 to 1:45. The lab sessions will be differentiated by your degree of comfort with the material; you are welcome to choose which session to attend, and you are free to shift from one to another week by week. There are some occasional exceptions tos this template, which are listed on the detailed schedule below.

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 midnight on Wednesday the following week, and the TAs will hold office hours Monday through Wednesday with the idea that you can go to office hours if you have questions about the assignment. 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 that the recording doesn’t work.

Course Tools

All of your work for the course will be done using the cloud-based Codio servvice. In effect, each of you will have your own dedicated computer, which you can log into and use with any modern web browser. It comes preloaded with Python and all of the other software you will use in the course. It will update with sample code, slides, and assignments as we proceed. It includes an easy-to-use code editor that you can use to write your programs. And you can submit your assignments at the click of a button.

Toward the end of the course, we will talk about how Codio, and other similar cloud services, work under the hood. And we will help you through the process of getting your own computer set up to do coding if you want to continue further down that road. But Codio is a great place to start, because it gets you down to business about as quickly and as smoothly as possible.

You will receive (via email or Blackboard) an invitation link with more specific instructions. Note that Codio is not free: student accounts are $10/month. You are welcome to continue or cancel your account once the course finishes. If this cost will be a financial hardship for you, please contact me ASAP so that I can make appropriate arrangements.

The first lab session will be substantially devoted to helping you get set up.


There are six graded programming assignments. There is also an ungraded “assignment 0” which is designed to get you comfortable with the course programming environment and with the mechanics of completing and submitting your code.

Your grade for the course will be determined based on the grades for the six homework assignments. We will drop your lowest score and then average the remaining five.

Any assignment may be submitted up to 48 hours late – i.e. before midnight on Friday – with a 20% late penalty. (The final assignment may be submitted until midnight on Sunday.) 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.

Class Resources

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

We will create a Campuswire site for this course; all students enrolled will be invited. We will post announcements there. 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. TThe notes underneath each class are the reading assignments.

Aug. 19 - 25:

Aug. 26 - Sept. 1:

Sept. 2 - 8:

Sept. 9 - 15:

Sept. 16 - 22:

Sept. 23 - 29:

Sept. 30 - Oct. 6:

Oct. 7 - 13:

Oct. 14 - 20: