This is a rare new course that is only being taught in-person in Chicago. It is only being offered once in 2023. It has only been offered once before. It has taken me one year to recover from it. Attendance is strictly limited to 6 people.
Software development has always involved a mix of craft and creativity. The craft side of it is more familiar--the syntax of a programming language, development methodologies, design patterns, learning how to use common packages, etc. These are concrete things. Creativity, on the other hand, is more undefinable. Yet it's the sort of thing makes an appearance when you start a new project or when you're forced to debug a supercomputer using nothing more than a blinky LED. Is creativity something that can taught or nurtured? Experience in the arts suggests that the answer might be "yes" and THAT is the thinking behind this course.
Let's talk about the arts for a moment--specifically music. In music, there are a vast number of things that one must master to be considered "competent." For example, the physical act of playing an instrument, reading musical notation, understanding rhythm, listening, learning scales and chords, and so forth. These sorts of things can be practiced and measured. You can either play a scale or you can not. If you know more scales or can play them more quickly than the person next to you, perhaps you'll win an audition. There is little dispute here. However, the picture becomes a lot more muddy if you ask a musician to spontaneously play an interesting improvised solo. What distinguishes a great solo from a random mess of notes? Clearly there's got to be more to it than just "play whatever you want!"
How does one come up with such a solo? Part of the answer lies in awareness. What have musicians of the past done? Can THAT be studied and emulated? Clearly, the answer is yes. Anyone can listen to a recording of their favorite artist on an endless loop and apply focused listening techniques to learn what they are doing. It will involve a lot of work, but immitation is a powerful tool.
However, a second part of the creative puzzle might reside in the practice of "constrained creativity." As an example, could you play an interesting solo using only a single musical note? Such a restriction forces you to think in different dimensions. With scales off the table, what remains? After some pondering, you realize that there is still a LOT that you can work with--maybe things that you've been neglecting! For example, rhythm, dynamics, space, and tone. So, you practice those things--these different dimensions of playing. In reality, it's unlikely that you'd EVER play a one-note solo. However, your practice of doing so opens a greater palette of creative possibilities. That's a superpower.
A true story: before the pandemic, I was asked by a friend to sit in on trombone with a Chicago big-band. At one point during the performance, everyone in the band got their chance to play a solo during a blues tune ("Sweet Home Chicago", of course). Oh, what an awful mess that was--literally everyone got up one-by-one to play a meandering mess of mostly loud and fast notes. When my turn came up, I thought about the whole "constrained creativity" thing and decided to play a single 4-note phrase followed by total silence. A different dimension. At this point, the whole band and the audience sat there wondering "what is he doing?" Naturally, tension was building because of all of that silence. Finally, I played the exact same 4-note phrase again and sat back down. That was the whole solo. Afterwards, my friend turns to me to say "that was pretty interesting man!"
Does creativity have a place in coding? Most programmers would agree that it does. However, what are the big ideas to emulate? Can a practice of "constrained creativity" be applied? If so, what is the coding equivalent of only playing a single note? What dimensions of coding can you work with?
That's the goal of this course. Specifically, we'll take a focused look at some deep ideas in computing--singular ideas that will challenge your thinking. We'll then attempt to solve problems within the framework of these ideas. Like a musician challenged to play a one note solo, you'll be pushed well outside your comfort zone. Honestly, it will probably sound pretty bad at first. However, in doing so, you'll open your mind to greater possibilities as you return to your real work.
This class is for experienced programmers who want to be challenged in ways that will stretch their mind. Past experience with different styles of programming (i.e., imperative, functional, object-oriented, etc.) is highly recommended as is familiarity with certain mathematical concepts such as first-order logic and set theory. Coding is involved, but the choice of language is not so important. Examples will likely involve Python and maybe Scheme.
Each day of this course will present an idea based on a singular concept from computer science ("the one"). From there, we will explore how that idea unfolds into the greater domain of problem solving as we apply it to a series of projects, big and small. Expect to be challenged and for there to be a significant amount of group discussion.
The following topics are indicative of the kinds of things that might be covered in the course. As this is a new course, this list could be expanded or revised at any time. Just to be clear though, this is definitely NOT an introduction to programming for beginners.
This class is led by David Beazley. You might know Dave from this somewhat infamous bit of practical live coding. More recently, he gave a tutorial on lambda calculus at PyCon 2019. That might be a good thing to watch before signing up to this course--the topics covered here might be even MORE mind-bending than that.
Copyright (C) 2005-2023, David Beazley