Syllabus
| Instructor | Paul Cantrell |
| Contact | Email or Slack |
| Class meetings | MWF 3:30–4:30pm, OLRI 254 |
| Office hours | Grab a spot |
Course Description
Why do people create different programming languages? What characteristics do languages have in common? What design decisions differentiate them, and what tradeoffs motivate those decisions? How do languages affect the style of code we write, our development processes, and the ways we think about software?
In this course, we will examine a wide variety of programming languages, many briefly and a few in depth. We will compare how they approach concerns such as type systems, abstraction, composition, state and mutability, access control, flow control, function dispatch, closures, metaprogramming, concurrency, memory management, compilation, and runtime environment.
Learning Goals
Programming languages are far too large a topic to fully cover in an entire graduate program or even an entire career, let alone in a single semester. (I am still learning new things about them all the time!) This is an introductory course, whose goal is to give you an eye for the questions of programming languages, and a solid footing for your future language explorations. In particular, after taking this course, you should:
- have a working understanding of many common constructs, patterns, and features that occur across different programming languages in widespread use today;
- recognize problems that motivate language features, and tradeoffs those features involve;
- be able to recognize familiar constructs in unfamiliar languages;
- be comfortable learning unfamiliar languages rapidly, and working with them productively even when your understanding is limited;
- have a nascent awareness of how a language’s design choices shape code written in it, and shape the development practices of the people who write that code; and
- be able to critically examine the implications of writing software in a particular language.
Note that nowhere do these learning goals mention gaining deep expertise in any particular programming language! On the contrary, this course is about learning to work effectively in languages of which you know very little. At the end of the semester, having encountered a dozen or so new programming languages, you will not know any of those languages well — but you will be prepared to encounter the next dozen new languages that come your way with greater ease and confidence.
It will sometimes be frustrating to work in languages you barely know. When this happens, remember that learning to be comfortable working with the unfamiliar is the point! Intro CS classes build up programming knowledge for you in small, logical pieces, like Legos with step-by-step assembly instructions. You are moving beyond that now. Experiment, explore, and embrace the unknown.
Course Structure
Throughout the course, we will study a few core languages in depth. You likely already have some exposure to Java and Python; we will start with these. As the semester progresses, we will add additional languages to our core list: first Ruby, then Elm, and finally Swift. We will also use JavaScript and C as recurring examples, although I do not necessarily expect you to have prior knowledge of them and we will not study them as thoroughly. As we move through different programming language topics in the course, we will compare how each topic plays out across our growing list of core languages.
In addition to these core languages, we will have intermittent student-led language excursions. These give us the chance to explore the world of programming languages in its wonderful and mind-boggling breadth. For each language excursion, a pair of students will make an in-class presentation, approximately half an hour long, introducing the class to a language and highlighting a few of its particularly interesting details. The specific languages for our excursions will depend on how many students end up enrolled in the course, but will likely include Smalltalk, Scheme, Haskell, Elixir, Typescript, Factor, Rust, Prolog, and MAX/MSP.
In addition to your language excursion presentations, class time will be devoted to lecture-demos and small in-class activities. All of these are meant to get your explorations started. I trust that you are capable of reflecting, experimenting, and exploring on your own when you encounter topics of interest to you.
There will be small pre-class tasks throughout the course, due at 1:00pm the day of class. These may include readings, software installations, surveys, exercises, and brain teasers. Their purpose is to prepare us all for class: to get you thinking about the material, and to help me know how you’re doing and what you’re wondering about.
There will be programming-centric homework assignments, approximately 5 of them. Their purpose is to give you hands-on experience with different languages, and to help you to look closely at some of the concepts we discuss in class.
At the end of the course, you will create a final project. These projects will be smaller than capstone size, and will involve independent exploration on a topic of your choosing. I encourage you to do them in pairs. Your project must draw some connection between the theory of programming languages and the practice of writing code. Beyond that, you have flexibility in the topic and format you choose.
Grading
Of all the things I do as a teacher, none have a lower value-to-cost ratio than assigning grades. Providing feedback to students is one of the most valuable things I do; however, assigning grades — flattening that feedback to a one-dimensional scale — is one of the least useful, and often one of the most damaging. Grades are objectivity theater, coercion, quantification hijacked to give education the appearance of authority. I would happily do away with them entirely.
Unfortunately, grades do matter (if only temporarily), because many actors and institutionalized systems — the college, scholarships, visas, parents, jobs, grad schools — require them. Since we cannot eliminate them, I am experimenting in this course with de-emphasizing grades. The goal is to minimize our waste of time and emotional energy, and maximize our focus on the things that truly matter: learning, growing, exploring, thriving.
For your homework submissions, language excursion presentation, and final project, I will provide qualitative feedback and ask you to reflect on your own work. I will not, however, assign a score for any of them. I will not provide evaluative feedback on readings, exercises, and class activities — answers to questions, of course, just no evaluation — but I will ask you to think about how you engaged with them and what you gained from them.
I will ask you to write reflections on your goals for the class, your learning strategies, and how things are working out for you. So that I have a sense of how many students are reading this syllabus, please email me a picture of an octopus stinkhorn. You will write one of these reflections near the start of the semester, and some smaller reflections along the way.
At the end of the semester, I will ask you to review all the feedback you received from me alongside with your own past reflections, write a short guided retrospective on your learning over the course of the semester, and propose a course grade for yourself. If I do not think your proposed grade is fair, I will let you know why. I reserve the right to assign the final grade in the course; however, I will treat your reflection and your proposed grade with deference.
Policies
Copying code
Programming is a social activity, and I encourage you to seek out help from your professors, preceptors, fellow students, and the web. Collaboration is good; however, cheating is not. Copying any code you did not write without attribution is cheating, and under many circumstances copying code is also a federal crime. This is true even if you modify what you copied.
In this class, you are welcome to discuss problems and solutions with other students, as long as you do not share code with them when you are each supposed to be writing your own. If someone helped you with a problem or talked through it with you, acknowledge their help on the assignment with a comment in the code. I will never subtract points for acknowledging the help of others.
If you copy code from an outside source (e.g. blog, tutorial, docs, Q&A site such as Stack Overflow), you must:
-make sure that you have the legal right to copy it and
- provide attribution the code’s origin by adding a code comment with the URL or other source where you found it.
For language excursions and final projects, this same policy applies to AI-generated code: add attribution for anything you did not write. The homework assignments, however, are puzzles, designed to make you think. Do not use AI to help you write code for the homeworks. You struggling over the code and puzzling it out for yourself is the point. At best, an AI will solve the problem for you and rob you of your learning; more likely, an AI will mislead you and turn a small confusion into a larger one. Don’t.
The act of turning in copied code without attribution is a violation of Macalester’s academic honesty policy, and is subject to disciplinary action according to college rules. This is a big pain for both of us, so please don’t put us through that.
Late work
You will hand in all homework online. If technical troubles are preventing you from handing in your assignment, contact me immediately, even if it is the middle of the night.
Despite this class’s un-grading approach, it is still critical that you honor deadlines so that you do not fall behind on the material, and so that I can manage the workload of the course. If you are going to fall off the course schedule, talk with me so that we can make sure that doesn’t cause havoc for either you or me. Late work requires planning. Think ahead! Communicate!
If meeting a deadline will not be possible, or even if it it could technically be possible to meet it but you are lifting a heavy load in your life and could use some more time to catch your breath, talk to me before the work is due. My goal is for our class to create the best outcomes — both in terms of learning and in terms of well-being — that are possible for us given the constraints we face. We are collaborators in making that happen. Talk to me, and we’ll solve any problems together as they arise.
Support and Well-Being
All of us — you, me, your other professors, your fellow students — are human beings. All of us carry our own experiences, thoughts, emotions, needs, and hopes with us, including in class. All of us have bodies and minds that need care. Please do what you need to do to take good care of yourself, and make our class a good experience for yourself and your fellow students. In the classroom, eat if you are hungry, drink if you are thirsty, and step out if you need a break. Outside of the classroom, take the time to sleep well, eat well, and connect with others — even when life is busy and the pressure is high. If you are feeling sick, stay home. We keep each other safe! And when you need help, reach out.
I put the paragraph above in my syllabus every term. It is especially important right now, during a time of multiple ongoing crises in the larger world. We urgently need to be present for each other, and present for ourselves. Our physical and mental health depends on all of us taking care of ourselves and each other.
I am committed to providing assistance to help you succeed in this course. I love programming, and I hope you will love it too. I am living through these difficult times preserving my spirit as best I can, and I want to help you do the same.
If anything poses a risk of interfering with your ability to thrive in this course or on this campus, please discuss it with me. This includes health issues (both mental and physical), disabilities (both documented and undocumented), schedule conflicts, competing obligations, life changes, and personal challenges. We will talk about what you need, and form a strategy for this course together. You don’t need to share any more personal detail than you are comfortable sharing. Just let me know that you need support, and I will do my best to support you.
Official accommodations are available for students with documented disabilities. Contact Disability Resources to make an appointment or learn more about the process. Note that even if you do have an official accommodation, it is still your responsibility to contact me.
Please communicate with me. No matter whether you have a sticky personal situation, a vague concern, or a struggle that is impacting you and your work, no matter whether it is officially recognized by the college or not, please communicate with me. I will try not to ask for details you are not comfortable sharing, but I do want the chance to help you out. The golden rule:
Never suffer in silence!
Never. I am here to support you. I know it can be hard to ask for support when you most need it. When that time comes, remember that I asked you to ask me.