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, immigration agencies, parents, jobs, grad schools — require them. Since we cannot eliminate grades, I am experimenting in this course with de-emphasizing them using an ungrading approach. 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.
How does this work? Near the start of the semester, I will ask you to write a short reflection on your own goals for the class, and what you wish for from the course and from yourself. This will function as instructions to yourself, as well as guidance for me in shaping the course. So that I have a sense of how many students are reading this syllabus, please email me a picture of an octopus stinkhorn.
For your homework submissions, language excursion presentation, and course project, I will provide some qualitative feedback and/or some structure for you to reflect on your own work. I will not, however, assign a score for any of these assignments. I will not provide evaluative feedback on readings, quick 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.
At the end of the semester, I will ask you to think back on the totality of your experience in the course, write a short guided retrospective on your learning over the course of the semester, and propose a course grade for yourself based on a rubric I provide. 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
Academic integrity
Programming is a collaborative social activity, and in their work, programmers rely (and should rely!) on help from external resources and from other people. That includes the work you do in this class. Seeking and offering help is good! Collaboration is good! There are lines, however, that you should be careful not to cross:
-
Learning loss: Some assignments in this class ask you to complete challenges whose answers are quite easy to find online. The point of these assignments is not for you to output the correct answer; it is for you to puzzle it out for yourself. No struggle, no learning. The process is what matters; the output is an afterthought. Bypassing the struggle is cheating: cheating in class, but also cheating yourself.
(If you go to the gym and have somebody else lift weights for you, or have a robot lift them for you, do you expect to get any stronger?)
In those cases where the puzzling is the point, which includes all the homeworks in this class:
- You may discuss problems in general terms with other students and seek answers to general questions in (for example) programming language documentation and web sites.
- You may not copy code wholesale — either from other people or from generative AI (which often ends up being an anonymized way of copying from other people).
-
Misrepresentation of work: If you present something as your own original work when it is not, then you are deceiving others about your own efforts and abilities. This is unethical in most professional contexts, and is certainly unethical in a course where college credit is supposed to depend on you doing certain work.
In some assignments in this class, including language excursions and course projects, you are allowed to use external resources freely. In these cases, you must do the following:
-
If you copy substantive chunks of code or text from some external resource, anything more than a few lines, then include the URL of the resource you used next to the code you copied. This can be as simple as adding the URL in a one-line comment in your code.
-
If you consult a resource, such as a web site, a book, or another person, then cite the resource. This can be as simple as a footnote or endnote or parenthetical remark in written work, or an acknowledgements slide in a presentation.
-
If you use generative AI, then add a brief note explaining what tool you used and how you used it. If you copy its output into your own work, then delineate which portions of your work came from the tool. (Note that gen AI use is strictly prohibited on homeworks in this class!)
-
-
Devaluing others: In addition to robbing yourself of learning and misrepresenting yourself to others, using people’s work without giving them credit for that work also harms those other people. History is full of ugly stories of people miscrediting, ignoring, and erasing the important contributions of others. That history stops when we start lifting up others who have been important to us.
In addition to those moral concerns, you need to be careful not to run afowl of copyright law. If you copy anything, make sure you have the legal right to copy it. Check the license; learn about the legal limits of “fair use.” These legal concerns are related to but not the same as the moral concerns of devaluing other’s work. You need to think about both.
Note that these concerns apply no matter what tool you use. If something would be plagiarism if a human did it, then it is still plagiarism if a generative AI does it. If you use gen AI, is your responsibility to ensure that you are not plagiarizing the work of others. If you are wondering how on earth you’re supposed to check that…well, that is a very good question, and you should take it up with the AI vendors.
Violation of these rules may constitute a violation of Macalester’s academic honesty policy, and thus be 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. Be mindful, and ask me for guidance.
Note that none of the concerns above will vanish after you graduate. Mindfulness about all of these questions must continue to be a part of your professional and personal life.
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.
We live in 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, financial problems, 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.