What exactly is computation? There are many definitions but here I want to address the light in which computation is looked at in this project. The approach for defining computation is taken up using workshops as a medium. This post will go in-depth.
The happy participants after the workshop
It all started with trying to learn and teach programming. If someone asks me how I learned how to code, I have no answer. Rather it is very difficult for me to put it in words. So, I tell them the usual story - watched coding tutorials, fiddled around with it when I was in 6th grade, I was part of the robotics team and used to code for them, and started using processing in college. But, I never get to tell them how I learned to code. Rather, what does it mean to code in the first place?
Perhaps the most annoying question I get asked often is "what programming languages do you know"? What most people don't understand (veteran programmers included) is that I can code not because I know a particular language, but rather because I know how to think computationally. After that, picking up any programming language is a matter of half an hour to two hours at most of flipping through documentation and watching a few tutorials. But the real magic is in being able to twist and turn the brains of the computer and be able to control it to do precisely what I want it to. The next, even harder question is how do you teach this to someone who has no background in programming, computation, or advanced mathematics? And this is where the journey starts and how this workshop came into being. With my previous experience in teaching processing, I would see how most participants would get bored and it would be a drag. It would be too much to take in. And at the end, most people would leave ever wanting to code or program out of frustration. Some even went on in regularly working with it for 1-2 months but dropped because they weren't able to reach the level of fidelity they expected even after putting all that effort.
For this workshop, I wanted to fundamentally change the way I teach computation. I realized that too much focus has gone into teaching the language and the nitty-gritty of the syntax. 90% of the time is spent on explaining and correcting the syntax and only 10% is spent on algorithms, computation, and the processes. That too most of that 10% is examples of works or inner workings I show them, not something that the participants come up with on their own.
For this workshop, I made distinctions between algorithms, computation, and computerization. Too often these words are thrown around without too much understanding. So, I came up with my definitions - algorithms are fundamentally the process. Any defined process (which could involve probability) is an algorithm. Computation is the mathematical translation of the algorithm. An abstraction of a sort. Here, when I say mathematics, I mean it in the broadest sense of logic and rationale (this definition is more vast than what is traditionally thought of as mathematics - linear algebra, calculus, arithmetic, etc.). And finally, computerization is translating the computation into a language that the computer can understand. I made it a goal for this workshop to focus on algorithms and computation without touching computerization. That meant we weren't going to use computers.
The focus of the workshop
For the first exercise, I came up with a game called silent choreography. The rules of the game are simple:
Everyone got super excited when I introduced the exercise. Perhaps, everyone was relieved that we weren't going to code on a computer but rather do some fun stuff. I heard some participants mention to each other - "this is basically coding". So some people did understand the relevance of this exercise.
The participants were given 15 minutes to plan the whole dance sequence. There was chatter in the room the entire time. Most were replaying the song they chose on their phones. Many couldn't help but show gestures and I had to tell them to try and not use gestures. Some even wanted to write down the steps in a notebook and I didn't allow that.
When I asked what strategies they used to choreograph the sequence, some interesting insights came out. Most of the groups said that when they had to explain what dance step they were referring to, they used association - or referred to something that moved in a similar way. They also said that it was easier in using steps that everyone knew. Immediately I saw how they were coding and using computation without even realizing it. Association is central when it comes to programming a computer and is the very essence of "code". When they were using steps that everyone knew, they were essentially picking pre-learned steps from a "database" of knowledge and using that - very similar to neural networks. One group literally used code (LH, RH, etc.) to refer to positions in space (they were forced to communicate that using language as well).
The second exercise is called Generative Pens:
The participants creating their own artwork After that, the exercise has a part two, which is the core part of the exercise:
The time limit on communicating the artwork goes to simulate the limited bandwidth that computers have. They were given some time beforehand to think about what they were going to say.
I asked them to think about which of their artworks were easy to communicate and which were harder and reflect on why that is the case. Very often the same problems come when trying to code complex artworks on a computer. The outcome of the exercise was interesting to look at. Some artworks were not possible to be copied at all. The entire essence was lost. Some artworks were exact replicas. But most-lied somewhere in the middle - where the essence was communicated but they weren't exact.
An example where the essence was well communicated but aren't exact copies
Fundamentally, through both the exercises, the participants had to think of a process and be creative with the process. They then had to translate it into a language that happened through computation. In this case, the language was verbal human language but when we are programming on a computer, the only difference in the process is that the language a computer understands is different, so most strategies change. The participants realized that the strategies (which often are similar) are dependent on who it is being communicated to and that programming on a computer is no different.
In the end, we had a discussion about intuition and intellect. A lot of times our brain is able to do things that we can't put into words how we are doing it exactly - like riding a bike or swimming. We just intuitively do it. Computation is no different and being able to program on a computer is just a muscle where we have to go deep and try to put something we intuitively do on a daily basis into precise instructions. Of course, the language we use has its own limitations and we have to always keep that into account. Some ideas are impossible to communicate precisely through language and compromises have to be made. In the human world, we make up for that by using other languages like gestures, drawings, etc. The same compromises have to be made when programming as well. Lastly, I would like to end with a quote by Sachin Sachar - "Engage with the world vs the word". This workshop was in the very essence based on this philosophy at all levels. Also, the fact that a lot of strategies that the participants used (without me telling them) are the same ones that are used in computer programming goes on to show that perhaps these strategies may be more universal than we think. They seem almost emergent and based on what language is being used. Another lens through which to look at this graduation project is - understanding nature's language and the computation within.
The I/O Perspective
There is another thing that Sachin Sachar said which has stuck with me. He said with (in a largely different context), that humans have 5 ways of input and 5 ways of output. The energy within is a balance with these 5 inputs and 5 outputs. The 5 inputs are all our senses through which we make sense of the world. The 5 outputs are - communication (verbal, gestures, expressions, etc.), hands (for making, interacting), feet (for movement), excretion, and reproduction. His conclusion was that an ideal way to live is where all 5 of our outputs are in balance and no one is in excess.
But I saw the connection between the input and output of the human body with that of computation. The process of algorithm and computation is defined in terms of input and output. The very basis of mathematical functions is defined in terms of what they input and what they output. Further, when I talked to Sahil, he mentioned how when we change the input, we get a different output and this workshop did the same - the process was the same but the input (or mode of communication) changed and we got a different output (some compromises had to be made).
This I/O lens brings together nature and computation in a whole new light. Fundamentally, every process in nature at every scale can be looked at as input and output strung together in a vast feedback loop. Computation is happening at every level, at every scale and each and every atom is involved. It goes on to a universal scale, where massive bodies are computing and everything, in essence, is then "alive".