The Wonders of Abstraction
Abstract
Fish are to water as programmers are to abstraction. We swim in it all day, barely aware of it. We say “abstraction” all the time, but have we thought about what it means?
I've spent 20 years asking how computers—that move electrons around in a complex circuit—do work useful to humans. Abstraction is the key. In this philosophical talk, we explore this wonderous process called abstraction. We'll wade through the everyday uses of the term, paddle out to formal definitions, and dive into why some abstractions give us incredible leverage. Along the way, we'll see how abstraction is at the heart of getting computers to do useful work. I hope you leave with a deeper appreciation of the wonders of programming.
Video
Transcript
(upbeat music) - My name is Eric Normand and today we are going to learn about, what are we gonna learn about today? (laughing) Abstractions! (cheering) Whoo, round of applause. (applause) - Is it working, or I thought this was intended? Mike on? - On. - Oh, there we go. I see her now. - Yeah, all right. - Cool. How's everyone enjoying their conference this couple of days? Yeah. I think we need to thank the organizers, the organization team one more time. Can we get a round of applause? (applause) Can we thank the AV people? Thank you so much. Everyone involved, the photographer, the people out front at the staff of the venue, please. (applause) I also wanna thank my family for being here, for... (applause) They bring so much meaning to my life and thank you for coming out here all the way just to support me. I know it has nothing to do with the chocolate or the waffles. (laughter) And I wanna get started 'cause it's only 45 minutes, so. This is gonna be a very personal story, and I hope you will follow me along on the journey. So when I was five or six, I used to love this show, Mr. Wizard. It's a Canadian show, but we got it in the U.S. Did it come here? Can any show of hands? Did anyone see this? Mr. Wizard's World, it was a couple of Americans down here. This show had a guy named Don Herbert. He was Mr. Wizard, and he would feature kids and do science and technology segments. And one of the segments that I remember from the show was a computer segment where he would sit down with a kid and the kid would type, and he would kind of direct it. But one of them was a kid programming, and he was programming in a logo system, and he taught the kid how to make a square. And you can see it's pretty simple. You just have to repeat 'cause there's four sides. You repeat for the turtle. Y'all are familiar with logo, right? The turtle graphics. You move forward 100, you turn right 90, and you do that four times, and it makes the four sides of a square. And then he said, look, you can use the square. So you were defining the word square. You can use that square to make a flower. You just make a square turn right 30 degrees, and you repeat that 12 times. You get 360 degrees, and you get a nice, cool flower. I was also lucky enough in school to have a computer lab. We had a bunch of Apple twos, and usually we just learned how to type. We put in a disc, a big five and a quarter floppy, and you'd boot up the typing program, and then you'd put in your other disc. You take that one out, put a new one in. That was your personal disc, so you could save stuff, right? And one day, instead of typing, the teacher said, "We're gonna do something different." Put in this disc, called logo. And so we put in the logo disc, and we didn't know what it was. And we saw this little triangle on the screen, and he said, "That's the turtle." And you're gonna teach it to draw a square. And I immediately remembered this show I saw. And so after I got done with my square, and I figured out the syntax and everything, I said, "I'm gonna try to do that flower," 'cause I finished a little earlier than a lot of the kids, so I had some time. And I figured out how to make the flower. It took some trying, some debugging, but eventually I got it. I think I got the angles wrong, I got the number of repetitions wrong, but eventually I got it, and I showed the teacher. And he was so excited. He showed the rest of the class what I had done. And at that point, I knew I was a programmer. (audience laughing) The fact, the debugging, and the feedback, and figuring it out, and the syntax, all that stuff was so cool. And then on top, I was actually proud, and in front of my class, the teacher was so proud of me. I was hooked. But what actually happened? Because I didn't remember this, I hadn't memorized the code. Somehow, the idea of how to make this flower stuck in my head, and I could then figure out how to make it again. I didn't remember the code. I remember having trouble with it and debugging it and stuff. It's a bit like how a cook, or a good cook, can go to a restaurant and eat a meal, and then go home and reproduce it. They don't know the recipe, but they can figure out how it was made. And there's something cool there, right? So later, I became a professional programmer. But this idea was always on my mind. How is it that we're able to make cool stuff happen with the programming that we do? Like, how is it that stuff that is important to us is programmable by a computer? Let me make it like super concrete. Here's a microchip, a microprocessor. It's basically a really complex circuit. We pump electrons through it, and somehow that's a bank. (audience laughing) Electrons and bank, they have nothing to do with each other. But somehow, we get to do that. And so, I've been asking this question for about 20 years, and doing research and trying to answer this. How is it that there's this relationship between the two? And we do it all the time as programmers. So, I'm about to start the journey of explaining this, trying to answer this. I've been researching and reading, and it's like one of those Feynman problems that I keep in the back of my head, and every time I read a book, I'm like, "Oh, this might explain a little bit of it." And so, I've put together a coherent story. I've had to leave a lot of stuff out. But this is my personal opinion of what's happening. It's got all my biases baked in, so apologies for all of that. But if you will join me on this journey, I'd like to take you through a tour of abstraction. So, my name is Eric Normand. My talk is called "The Wonders of Abstraction." And I'm very happy to have you all here with me. So first, we have to talk about abstraction itself. It's a word we use all the time as programmers. We use it kind of willy-nilly without thinking about it. I'm the same, I use it all the time. And the thing is, when you actually start to think about what does it mean, you realize how poorly we use the word. We just throw it around. Mathematicians actually do have a definition of abstraction that is actually well-defined and written down. But I'd like to go over some uses that we have of abstraction. So, a lot of times when we say the word abstraction in a programming context, we mean encapsulation. So, what does this mean? You have some complex bit of code. I'm just drawing squares for like really complicated thing. And so you make a wall so that you don't see the insides. And then you make a little bit of an interface so that you're able to control the thing in a very minimal way instead of having to know about that. So, who here has heard people use this term abstraction but they really mean encapsulation. Just raise your hand so I can see. Okay, good, good, I'm on the right track. Okay. Another way we use the term is we say layers of abstraction. And what we mean by this is you build up an application, you start with the machine code and then you build a programming language on top of that. Then maybe you have a web framework and then on top of that you finally write your application code. And when we say this, show of hands people who've heard this, layers of abstraction, yeah. So when we say this, what we usually think of is that down here we've got this thing that's like the least abstract, the most concrete. And then we're just kind of building up abstraction up at the top so that that's the most abstract thing. And we think of it as like, oh, there's too much abstraction or something like that. Another thing we use is, we say abstraction but we mean indirection. So what does this mean? So like let's say you wanna call some code that sends an email. So first you call this one function but that doesn't send the email, it actually calls another function. And then that one calls, it actually puts something on the queue and then something's reading from the queue and then that one calls another function. And then finally it calls the code that actually sends the email. And people use the term abstraction for this that I've indirected the thing. Have you all heard people, yeah. Maybe y'all are getting tired or I've put them in the order, at least most to least used. Okay, and finally we use the term abstraction to mean reuse. So just real quickly, we have some code, it looks like a rectangle, we see some other code that also looks like a rectangle. They're very similar. We think, oh, instead of duplicating this code, we could just abstract that into a new thing and then have the two things call it or instead of having the code in line. Raise hands, yes, all right. These are all related to abstraction but they are not the process of abstraction itself. Let's see what mathematicians call abstraction. All right, so this is a situation that you'll see in a physics class who solved the problem like this. We have to guess where the cannonball is gonna land and I guess calculate where the cannonball is. All right, so we have this concrete situation and we have a cannonball and we're gonna shoot it in a field and it's gonna land somewhere and we have to know where it's gonna land. So what we do is we say, well, you know, the cannon doesn't matter, the name of the person firing the cannon doesn't matter. Like if there's a cloud in the sky, none of that stuff matters. We eliminate all these irrelevant details and then we also take these physical real-world concrete concepts and turn them into abstract quantities. So we take the position which is an actual thing you could see and touch the position of the cannonball and we turn it into X and Y coordinates. The speed of the ball, the velocity, we turn it into like a VX, VY, vectors. And then we're assuming we're on Earth so we know the acceleration due to gravity and then there's also time which is gonna pass as you shoot the cannonball and it flies to the air. So these are all abstract quantities that we can then take and plug into a formula and get the answer. So just to summarize, we start with a concrete situation. We map it into abstract quantities and we go from more information to less information. Now this is the reveal. The abstraction is that mapping. The abstraction is the process, the function of going from the real-world things to the abstract conceptual things. That's what a mathematician calls abstraction. So if I say the word mapping, everyone understand what that means? It's a function, right? It takes the inputs and it gives you different type out the other end, this type of, is now abstract quantities. And so just real briefly, just concisely, abstraction is the mapping from concrete domain to abstract domain. This is the mathematical notion of abstraction. And we can do this as humans. This is what we do all the time. But where did that come from? We couldn't always do it. To answer that question, I started looking into a field called cognitive archeology. And in cognitive archeology, they study stone tools and other artifacts to figure out the cognitive abilities of the people who made them. And then you can lay it out over time based on the age of the artifacts. So they'll look at a site where they could tell that someone was making arrowheads right here. And how did they do it? Oh, it was a three step process. They started here, then they did step two over here, and then they moved over here. And actually step three was like, if you drew out the diagram, it's like a hierarchical three step process. And so there's three nested levels deep and so they must have been really smart to be able to do that. So our story starts 2.6 million years ago. This is the kind of stone tool that people used. I would pass this on the street and just say, oh God, this rock is in my way. But apparently this was made by a Homo erectus. You can see the bottom side is smooth and the top side is jagged and rough. And the Homo erectus person would scrape meat off of a bone or chop down small trees with it. And anthropologists have made these archeologists as well and they've tested them and they're like, yeah, it works. Okay, that's all you're doing is scraping meat off of a bone. Now, it doesn't look like much and we can imagine how it was made. You just take a rock and smash it against another rock enough times and it gets very jagged. And so we can map out this process. So you start with a rock, that's your concrete thing and you abstract it into the idea of a rock. Okay, have a rock and that's your abstract domain. And you imagine I want this to be a scraper and then you think this needs some banging. So you're gonna go back down to the concrete world and you bang it. And when you bang it, now you're gonna measure, you're gonna abstract the roughness of it. Did I bang it enough? And you're gonna compare it to your imagined ideal, you know, scraper and how rough you want it to be. And you are just gonna do that again. Okay, I need to bang it some more. And so we can draw this a little bit more simply with this kind of feedback loop. You just bang it and see if it's sharp enough. Bang it some more. And we know like a two year old could probably figure that out. So we have an idea of the cognitive ability. It's not something like a dog could do a dog is smart, but like they can't do that. So, you know, we're on the way to our human, a modern human level of skill. About 1.4 million years ago, the tools start to look like this. These are hand axes. You can see that they're triangular, they're symmetrical. They on two planes, they're symmetrical. So they got two blades on them that are sharpened. You can tell it's a lot better. You hold it by the bottom, the smooth edge. And we can map out the process. It's actually a two step process. You have to shape the rock first and then you sharpen it into blades. And this is because it's a two step process. We think that the homo sapiens, Neanderthalis, and early homo sapiens who are using this, were actually a little bit smarter. Sorry, 200,000 years ago, the tools start to look like this. It's, I've looked at these so much, like when I'm going through my slides that I can see the shape. It kind of just looks like a rock, but this is actually way more advanced. You can see it has a nice blade that goes all the way around the edge, a very smooth side and it's very thin. And the way you make these is basically a three step process. You have to remove a core from a rock so that you have the right thinness to it. And then you prepare it so you're gonna make it flat and then you finally sharpen it. That's a spearhead, by the way. You would put that on the end of a stick and you could throw it at an animal. Right, three step process. All right, and then 30,000 years ago, the tools start to look like this. And this, I'm not gonna map out the process for making that, like that's modern level skill and technique there. This is definitely modern human. There's all sorts of different shapes and it's not just like one shape, it's like there's little blades. These are harpoons, by the way, they are made of stone. And you can tell it's not just someone guessed at this shape. They probably had experience making them and found different shapes that worked. They passed those on to other people over time, collected a culture of how to shape these things so that they work better. So we're getting not just cognitive ability, but also like a cultural heritage coming in. And the things I wanna highlight from this section are that the feedback and planning are really central to abstraction. The ability to see ahead, I'm gonna make this move and then make that move and then make that move. You can't make one of those spearheads, the three step process, without imagining three steps ahead. You wouldn't start if you didn't know where you're going with it. 20,000 years ago, we have evidence of a rhythmic. This is called the Ischango bone. It's from Central Africa. You see it has these lines on it. I don't know if y'all can see it from the audience there. But those lines are like tally marks, but there's some evidence that they're doing addition on it. And one of the sides, there's three different sides. It's really hard to see, but there's lines on this side and lines on that side too. And those, one of the sides has all the prime numbers between 10 and 20. There's a big debate about whether it's just a coincidence or whether they had prime numbers. Maybe they did, but they didn't have division, so it's probably not prime numbers. But anyway, mass was going on 20,000 years ago. An arithmetic is like a really interesting thing because we're all so good at it because we've been doing it for so long, since we were in early school, that I mean, I love doing this thing where you take some process that you learned a long time ago and try to figure out what is actually happening with it. Now that I have this new perspective of 20 more years of education, what is going on? So bear with me 'cause I'm gonna take you on that trip. So you start with, there's a group of sheep, okay, and you don't know how many there are. So how do you count them? How do you know how many there are? Well, one thing you could do is you could stick up your fingers and you correspond one sheep to each finger and you know you have five fingers and so you have five sheep. Another thing you could do is a thing we all learn early on is there's a sequence of words. One, two, three, four, five, et cetera. We learn how to generate every number that way. And you say the words one at a time in the right order and you correspond a sheep to each word. And then when you run out of sheep, that number that you just said, that's the count, right? That's what we learn how to do. Now the cool thing is you can do it for rocks, not just sheep, you can do it for anything. And so we must have this ability to have this abstract notion of count without, and we don't have a notion for five sheep and a notion for five rocks. We have this abstract notion of five. All right, I have to say this, I forgot to say it. Whenever there's an up arrow, there's abstraction happening. Okay, so there's gonna be a lot of abstraction in this talk. Up arrow means abstraction. So we're going from the concrete five sheep to an abstract five. And then we can do some more complex stuff. So let's say we have two groups of sheep, we have three and four sheep and two groups. We can count the two groups and get the numbers three and four. And then we can add that and get seven. Okay, easy. Or we can take those two groups and push the group together. I'm calling that group, like group it together. And we get a group of sheep. And then we can count that group and get the same number. Now this is not a coincidence. We can go up, so meaning abstract. We can go up and to the right, or we can go to the right and up. Who knows what that's called when you have a diagram like that? Say, shout it out. Commutative diagram. That's what this is called. And there's, you know, this is something mathematician study. And there must be something going on so that the ad operation, which is purely abstract and the group operation, which is purely concrete, correspond. Like they always come up with the right answer. Something is shared there. There's something going on between them. And mathematicians have a name for this. It's called a homomorphism. The homomorphism is the abstraction. You're mapping from the concrete to the abstract. That's the abstraction. And it's a homomorphism, meaning it shares structure. That's what they call it 'cause they don't have a better word for it. It just means that you've got this commutativity between these two operations. And, you know, we can make up, you know, if you have subtraction and multiplication, there are equivalent concrete operations you could be doing. Now, the other cool thing is we can take the number seven and we can, you know, find some sheep and make a group of seven. So we can go from concrete to abstract. And I'm calling that instantiation because I couldn't find a better word. That is, you know, that's what I found. I didn't make it up. And the thing is, this is like kind of like an inverse. It's actually the mathematicians call it a right inverse. A right inverse 'cause it's not a full inverse because you've lost information going up. So if you start with these two groups of sheep, you go to the number seven and then you go back down, you might end up with seven different sheep, right? And you didn't lose information on the way down. You actually lost it already. You can't recover it. It's too late. And just by nature, abstraction has to lose information. So it's a right inverse, not a full inverse. I'm only using these mathematical terms just to say that people have studied this and this is a real thing. You don't have to, it's not on the test, okay? Now we can do some cool stuff. Like let's say we have these two groups again. We're gonna count them and we're really bad at addition. We just, this one's too hard for us. So we can put it on our fingers. We can hold up the same, oh, sorry. We can hold up the same number of fingers as we have sheep or as we have up here, these two numbers. And then we can count our fingers. We can group them and get the right answer, right? Isn't that cool? Because we can go up and down. We can do all these cool operations and not have to do it all in our head. So the two things that you don't have to remember, I just wanna highlight homomorphism and right inverse. The fact that you can go up and come back down and also commute in that diagram. Very important for abstraction. 2.3,000 years ago, Euclid published a book called "The Elements." And this is a really great example of abstraction. And it was used as a textbook. I mean, it's not, the text itself isn't used, but we still study his system in like maybe a more modern pedagogical way. Who took geometry in school? Yeah, okay. So Euclidean geometry, like we use it all the time. So let me describe the system. First, you start with three simple tools, a piece of chalk, a straight edge and a compass. The system also has some definitions, which are basically, they correspond basically to things you can do with those tools. There's some axioms, which are things that are, that they're gonna assume to be true, that you probably agree with already, like that doesn't need any explanations, stuff like, if A equals B and B equals C, then A equals C. But he doesn't attempt to prove it. And then there's the postulates, which are things you can draw. So you can draw a line between any two points. You can draw any circle and you can, oh, I should have put that over here, huh? That would, this switch those two. Oh, next time. All right, so you can take the, any segment and extend it to infinity on either side. And that's it. I mean, there's a few more that I didn't have room on the slide for, but it's just this, it's just a bunch of these. And then you get this whole set of theorems, like it explodes and they combine and blossom into lots of geometrical theorems that can help you do stuff like architect a house or plan your garden or whatever you wanna do on a plane, right? It's really nice. And for thousands of years, this was the best abstraction that we had for this kind of thing. But the things I wanna highlight in this are that we had a small set of formal concepts. That small set of axioms and postulates can combine to create some abstract things that themselves are telling you stuff about the concrete world. And the other thing is that the instruments, you couldn't do that without instruments. You can't figure out where two lines are gonna intersect without actually drawing them. Like it's really hard for us to imagine that kind of thing. Algebra was developed in Persia 1.2,000 years ago. This man, oh, I always get his name wrong. Al quarries me. I believe that his name might be wrong, but his name is the word that got corrupted into algorithm. Yes, okay, yeah. He wrote a really big book on Algebra. He collected information from other people, but he wrote a big book that became the textbook. Even in Europe, the standard textbook up until a couple hundred years ago. And it's really a shame, 'cause when I was taught about the Dark Ages in Europe, all we learned about the outside world was that the Arab world had kept the classics like Aristotle and Plato, and then we retranslated them and had the Renaissance. Like they didn't do anything except keep the books. But like they were doing actual math and expanding our knowledge, and we knew it. I mean, this was the textbook in Europe for a long time. It was like, what do you learn at university? So there's been kind of a cover up of that information. Anyway, that's such a shame. I wanted to mention it. But the cool thing about algebra is that, I mean, one of the cool things, is that it unified all these different abstract quantities. So you could take the measures of angles, take the length of segments, you could take rational numbers and irrational numbers, which the Greeks were afraid of, and it unified them into one system that you could manipulate symbolically. The other thing was, it would take these algebraic objects, these quantities, and you could start talking about them in the abstract. They had properties. They weren't just things that you measured, right? And so you could start grouping them and studying them. And so we have groups and rings and all sorts of cool stuff that all started in the Middle East. And so what I want to take from algebra is the idea of meta abstraction, the idea of applying algebra to itself as you could study the stuff that you were studying. Four hundred years ago, these two gentlemen basically created modern physics, modern physics. No, that means like relativity, right? Classical physics, that's the word. But to talk about classical physics and why it was such a breakthrough, I do have to talk about Aristotle. So Aristotle, smart guy, he was interested in situations like this where you have a rock falls in the water and why does it sink and make a splash and all these things, wanted to explain it. So he had this idea of these, they weren't substances, they were aspects, right? So everything had, all the matter in the world had four different aspects. And based on the ratio of those aspects, different you would expect different behavior. So the Earth's aspect tends to move toward the center of the Earth and the air aspect tends to move things away from the center of the Earth. And of course the Earth is at, I mean not the center of the Earth, sorry, the center of the universe. And so that's why the Earth, which is at the center of the universe, has all the dirt and the rocks at the bottom and then we have water on top of that and then there's the air and fire doesn't really fit into that, but it's there. And so this idea of where things belong is called the natural place. And natural motion is things want to return to its natural place, they just naturally wanna do that. Don't have to touch them, they'll do it by themselves. And so that explains why the rock sinks to the bottom of the water, first why it sinks through the air and then sinks to the bottom of the water. And why the splash, well that's unnatural motion. When two things collide, things get jostled, that's unnatural motion. So you take these concepts and for thousands of years, people treated this like geometry, like Euclidean geometry. They took the concept and they just mashed them together and tried to prove things and talk about them and guess what's gonna happen and explain phenomena that didn't quite fit? And frankly, they tied themselves in knots for thousands of years trying to explain things that didn't fit. Galileo came along and he basically just changed the method. He said, "Okay, I'm interested, "why is this guy falling through the air? "He's gonna hit the water and go into the water." What he did was he abstracted away a lot of the information and tried to, instead of coming up with these kind of circular concepts, just armchair philosophy like Aristotle was doing, he said, "We're gonna make a system, "a small system using instruments, "just like in Galileo, right?" And we're gonna design the instruments to answer specific questions about things we can measure. This is actually a really cool instrument. I think this is a reproduction. I don't know, can y'all see it? So it's a ramp and it's made of wood and on the ramp are these bells that can move up and down and he would roll a ball from the top and he would sing a song while he was rolling and the song had a nice rhythm to it so he could keep the rhythm and he made sure to move the bells so that the ball hit the bells on the beat. And so that was measuring time and so he's relating time and distance using this instrument. So depending on the size and weight of the ball, he could, actually it probably doesn't depend on the weight. Well, that's what he figured out. But you put the, depending on the size of the ball, you could, you would get different measurements but he would relate them and say that, well, it's like there's a square relationship going on. Like, you know, they start out, like it takes a long time to hit the first bell, but then it gets faster and faster and faster and so you see bigger spaces between them. And so he turned, using this, he started using different abstract concepts from Aristotle. There's time, distance, there's this horizontal and vertical thing, like he figured out that when you drop something from a moving ship, it was gonna continue moving forward while it dropped but that they were basically independent. And so he went through this feedback loop of developing new processes, new instruments that would help him answer more and more questions. And I'm gonna call that a meta-iterative refinement. This is Galileo's contribution to abstraction. Then along came Newton and he unified the gravity that Galileo had done with a lot of the data that Kepler was gathering about the motion of the planets in the solar system. And so he said, hey, listen, do you know how when you push on something and you feel like it's hard to push? Well, that's called a force. Same thing with pulling, that's two forces, you're pulling and it's pulling back on you. Force has always come in pairs in his system. But you know what? When stuff falls, that's also a force. And turns out also, I don't think he talked about magnetism but magnetism is also a force. And it's kind of a coincidence. Like there's no, like force is an abstraction, right? There's nothing relating, pushing on a rock to why the Earth is rotating around the sun. There's no chain, there's no rope pulling the sun and Earth together. But somehow it works. Like we know that that's not the best explanation. Like space-time curvature is actually a much better explanation for what's happening. But why does it still work? Why does this system work? And it can get you to the moon. Like I just feel like there's some coincidence there that needs a lot more explanation. And he had a phrase, hypothesis non-fingo. Which basically means I'm not gonna try to explain it. I don't know. And people thought this was very unscientific. You know, you're saying that the Earth and the sun are pulling each other. How is that, I don't know, but the math works. You know, I can predict where the sun is gonna be in the sky and all that. And there was a big controversy. But that's actually something we do all the time. You know, it's kind of like, well, the test pass, you know. It's actually important. We don't understand our whole system, but we trust that line wide made this change. I don't know if it changed anything, but I don't think so. Okay, so the two things I wanna take from physics, meditative refinement, what Galileo was doing of changing his instruments. See, Euclid never changed his instruments. And for thousands of years, no one even thought of changing them. It wasn't until the 19th century that people thought, maybe some of these postulates could be different. And that's where you get non-Euclidean geometry. And then scoped understanding. That's what I'm calling what Newton said. Like, we don't have to understand everything. We can still make use of these models, of these abstractions, and we'll still get results. Okay, fast forward to the 20th century. We have Alan Turing, Turing basically said, look, if you have some abstract problem that you wanna do, you can write some code and run it on a machine. You get some binary digits out the end. So the problem, I don't know if you can read it. Problem is, digits apply. You get some binary code still in the abstract 'cause it's just like electrons and a piece of memory, right? And you read it out and you can turn it into the digits that we would understand. Well, what he said was like, you can actually do that to the whole computer. You can understand the computer, how it works, and then build that in code, and then run it on the machine. And then you can take your problem of calculating digits of pi and run that on that virtual machine. And of course, you can iterate it. And the thing is, we do this today, right? We write some code and it runs on the JVM, and then we run it in a Docker, and then we run the Docker on a virtual VPS, right? And then that actually runs on some hardware. And maybe one day our descendants will forgive us. (audience laughing) And the other cool thing is, it doesn't matter what the computer is made of. It's like abstract. I don't think about what my computer is made of when I'm programming, right? It could be silicon, but it could be like some, you know, brass seam-punk thing, or it could be vacuum tubes like we used to use. And so the cool thing is, like what's up and what's down? The computer, you could consider it the concrete machine, right, the machine code that we had at the bottom of our layers of abstraction. But you could also say, no, that's just an abstract idea. It is the machine code is like the small number of formal concepts that we found in Euclidean geometry. And we're actually abstracting up to it. Touring said this doesn't matter. So the computer, as abstract domain, is the last one I'll talk about. Okay, now we're at today. We're all programmers. We automate human tasks. And just to give an example, let's say, we're hired by a bank. They wanna digitize their system. So we could look at it like this. We understand their system in terms of these abstract concepts, then we write code for a machine. It runs them, and then we read the binary and it's a bank account balance, right? Makes sense? Show of hands, following me. Okay, 'cause we're about to go upside down here. But what I would like to propose is we put the computer at the top. This is a thing I've been working on in my own mind to think of the computer as the abstraction. The machine code is the small set of formal concepts that I'm mapping to. And if we put the machine at the top, then we, you know, eventually we do have to run it on an actual machine. But what that lets us do is to build a chain of abstractions going up. So we understand the bank in terms of banking concepts, and then we define those in terms of some programming language. And then there's a, that programming language is defined as basically in its compiler and how it converts into machine code. And each of these is losing information. It's an abstraction. It's a mapping from a concrete domain, the bank, up into the concepts, up into something more abstract, more abstract, et cetera. And this is, we could stratify more, but you know, it's just a slide. You get the idea. And we can use the meta iterative refinement to build better concepts and better definitions for those concepts. We can take a cue from Galileo and do that. Another thing we can do is we can use the computer in another way, which we can run it on our code and analyze it and give us more information. 'Cause you know, things get complicated. You want a little help from something. And we can also write tests. And so these are like our experiments, right? And we're using this feedback loop with this analysis and the tests to help us build better and better software. This better and better chain of abstractions. We usually don't change the compiler much, but maybe we should, I don't know. Maybe we need some fixed point where we're just like, I'm not gonna think past the programming language. So just to review all the cool things from the history of abstraction. So there's the feedback and planning that we saw with the stone tools. There's the homomorphism and right inverse, which we saw with arithmetic, not on the test. Small set of formal concepts that we got from Euclid. The meta abstraction that we get in algebra. The meta iterative refinement that Galileo developed. The scoped understanding that we get from Newton. And the computer as the abstract domain, which is what Turing showed us. We all have access to these. We have 2.6 million years of evolution that led to our brains. 20,000 years of accumulated cultural knowledge about how to do abstraction. There's probably more we could learn, but this where we're at. And then we get 20 years of education to train our brains 'cause you can't just, well, our brains take training, right? We don't come out of the womb able to do this stuff. And then finally, we have computers. The ultimate abstraction instrument. So my question to you is, what are you going to do with it? Thank you. [BLANK_AUDIO]