ICS 33 Spring 2024
Notes and Examples: Course Introduction


Course background and goals

If you've completed the prerequisite first-year courses in ICS, but otherwise have never studied programming before, then Python is likely to be the only programming language you've ever experienced. If so, that's not a bad thing; it's probably better to thoroughly study one programming language for a while — especially one that offers as much variety and customizability as Python does — so that you can plumb its depths before trying to wrap your head around conflicting concepts and alternative ideas about what it means to write quality programs. Arguments about programming languages and their features are commonplace and can be both fascinating and enlightening, but they can also be circular — with two groups of people that don't see eye-to-eye and probably never will — and can distract from the core goal of learning and applying those techniques to solve problems. So, when you're first starting out, learning one coherent set of techniques, regardless of whether it ends up being your favorite choice in the decades to come, is paramount. And, truth be told, most of what you're learning in these first-year courses is more universal than you might realize, even if it's expressed in terms of the design of Python and its standard library. (I haven't written a Pascal program in nearly thirty years, as of this writing, but many of the important lessons I learned when I plumbed Pascal's somewhat less impressive depths as a first-year undergraduate remain embedded in my thinking to this day.)

Going forward, once you have a firm understanding of a Pythonic way of writing programs, you'll want to seek out new ideas and fresh techniques, contrasting them against the ones you learned initially, while remaining as open-minded as you can; just because something is different from what you first learned won't necessarily make it wrong, even if its unfamiliarity will make it a little uncomfortable at first. Exposure to a broader set of approaches will make it easier to learn new ones as the years pass; the more you know, the more often a new idea connects to an idea you already understand. In our mainstream computing curricula in ICS, we ask students to do that in their second year, by offering courses that focus on programming languages other than Python. Python is far from the final word on programming language design, and the final word almost certainly hasn't been written yet. Since the days when I was first learning to program, many ideas have gained and lost favor, and a few "silver bullets" have flown by without hitting their targets. Popular programming techniques from the late 20th century have become passé, while techniques that were considered niche or impractical in those days are now fashionable. Times change, same as it ever was.

The most basic goals of programming haven't changed over the years, though. We still want the same things we did in decades past.

While there are numerous techniques that we can use to achieve these goals — this conversation ultimately leads to multiple courses' worth of material on its own — there are a couple of big-picture ideas that we can keep in mind now.

So, you'll eventually want to branch out and broaden your horizons, and future courses will help you to do that. But, before you go, Python still has many important lessons to offer, especially now that you've achieved a level of familiarity with it. Being able to write a Python program isn't the same as being able to write a Pythonic one. Being able to write a program that barely works isn't the same as being able to write one that meets its requirements and whose design will stand the test of time. To enable you to do those things, we'll need to plumb Python's depths, embracing its complexities where we need them, understanding some of the details of how Python programs are executed behind the scenes, as well as how we can influence those details to write better code (and, oftentimes, avoid writing code at all). The way you express a program doesn't have to be driven by the most basic constructs a language offers or solely by what's available in its standard library. As a programmer, if the tools you have available don't solve your problem, it's better to build your own tools that do, rather than struggle with the tools provided to you. But that tool-building requires knowledge.

So, that's where our focus will be in this course. Before moving on to new places, let's be sure you've learned enough about Python to use it effectively. You'll be surprised later how many of the same ideas will appear in other programming languages you learn as the years unfold.

My hope is that it'll be a rewarding trip, but it won't be an easy one. Most rewarding trips aren't; that's partly what makes them rewarding.


A brief tour of where we're going

So, given the goals we have in mind, what's on the menu for this course? What will we learn that will enable us to meet those goals?

Along the way, we'll ask you to solve problems both large and small, with weekly exercises that will gauge your understanding of the course material as we move forward, along with larger-scale projects that will let you put new techniques into realistic practice. There will be a lot of code to write, and we expect that not everyone will complete every task successfully, but we hope by the end of the course that you'll have built a wide variety of new skills, that we've been able to spark some new excitement about computing, and that you'll be looking forward to future courses that build on this one.

What we expect of you

There are three things we expect of you as we set off on our journey.


Course organization and logistics

This course web site describes the logistical details of how this course is going to be run. Particularly, be sure that you read through the Course Reference, the front page of the Project Guide, and the front page of the Reinforcement Exercises section, so you'll know how this course operates, what's expected of you each week, and how you'll be doing and submitting your work along the way. We want you to do as well in the course as you can, but we won't be watching over your shoulder, and we won't be able to offer a bespoke course for each of you; it'll be up to you to attend class when it's scheduled, complete and submit the assigned work before due dates, read and understand assignment requirements, and so on.