Embedded - 424: Between Midnight and 6am

Episode Date: August 11, 2022

Gustavo Pezzi spoke with us about using fun and simple systems to explain low-level concepts and how they work in higher-level engineering tasks. For example, teaching microprocessor concepts using At...ari 2600 assembly and physics by creating a simple game engine. Gustavo’s site is Pikuma.com. He has a free taster course on bit-shifting. We also talked about Atari 2600 Programming with 6502 Assembly and Physics Game Engine Programming.  Stella, a multi-platform Atari 2600 emulator For examples of optimizing in different ways, check out this bit hacks page. Gustavo is mentoring for Classpert’s Building a Language course. (This is where Elecia teaches Making Embedded Systems.) The conjecture about a shortage of  electrical engineers was from The Register. Transcript

Transcript
Discussion (0)
Starting point is 00:00:00 Welcome to Embedded. I am Alicia White, alongside Christopher White. As you may know, I'm someone who enjoys taking apart toys, and Christopher likes some retro gaming. So we're excited to talk to retro game terror abhorter, Gustavo Betsy. Hi, Gustavo Betsy. Hi, Gustavo. Welcome. Hi, everyone. How are you? Glad to be here.
Starting point is 00:00:31 Could you tell us about yourself as if we met, I don't know, at a games conference? That's a very existential thing, right? Who am I and what do I do. Right. So I am Gustavo. I have been working with technology for as long as I kind of remember being born, I guess. But I am right now, I work as an educator, right? So I am a teacher at a university. And I also have my own kind of side projects where I teach. I teach things that I usually cannot teach at the university. So the things that I kind of really, you know, my hobby and the things that I get excited and the things that I believe students get value from. So that is usually what I am lately. I am an educator. So that is, I think that is my quick pitch. Okay. And of course, since I've been teaching and really want to always talk about education, we will be touching on that too.
Starting point is 00:01:28 But that involves the Atari. So before we get there, we have lightning round where we ask you short questions and we want short answers. And if we're behaving ourselves, we won't ask how and why and what about Zork. Zork wasn't on the 2600. Best Atari 2600 game of all time? Best Atari 2600? River Raid. Oh.
Starting point is 00:01:52 I remember that one. What was your first computer? My first computer was a 286. It wasn't actually an IBM PC. What's the best game of all time on anything? Ooh. There's a lot of nostalgia there for me, but I like a game. It was called Full Throttle.
Starting point is 00:02:13 I don't know if you guys remember. It was from LucasArts. Yes, yes. The guy with the motorcycle, and it was one of the LucasArts adventure games. Yeah, yeah. Yeah, again, there's a lot of nostalgia and probably a lot of historical context
Starting point is 00:02:24 and why do I like that? You know why I like that game so much? But yeah, that just changed me. It was just incredible. Like a lot of his storytelling. So I really liked that. It was very good. What is the best microprocessor and why is it the 6502?
Starting point is 00:02:42 Oh, man, I will get in trouble for saying that, but it is not the 6502. I know, I know. I will get in trouble for saying that, but it's not. Only with me. I like the 68K, yeah, from Motorola. Again, there's a lot. We can go a whole day explaining why I think it was and why it was a lot. I mean, the assembly for that was super friendly for programmers. But yeah, I still think the 68K holds the title. Charles Mingus or Ray Brown? Oh, I love Charles Mingus. All right. Yeah.
Starting point is 00:03:24 Why isn't Pong your favorite game? Isn't it the quintessential game? It's incredibly boring. Well, it would be if I have to pick a game to teach the concepts of game design or even, you know, basic electronics and things like that. Yeah, that would be. But again, it's all about fun, right? I think Chris is right on that. It is all about, like, what really gets my blood pumping.
Starting point is 00:03:47 So yeah, probably Pong would not be the one I would pick. Favorite fictional robot? Fictional robot? Let me think about that. I really don't want to say R2-D2, but... It's okay, you can. Okay, fine. I'll think about that later better.
Starting point is 00:04:04 And I'll probably come back to something smarter but yeah i mean it is the correct answer do you have a tip everyone should know um always don't overlook the basics. I think that's usually, there's something that I always like, don't overlook the basics, right? Don't overlook the fundamentals.
Starting point is 00:04:34 They are very important. Don't get, complexity can get super overwhelming. So always go back to the basics. That seems like a really good transition into the Atari 2600 and why we're talking about that today. Absolutely. Absolutely. Right. So that is the whole... People usually talk to me and they find out that I teach Atari 2600 programming,
Starting point is 00:05:00 especially using assembly language and really low-level stuff. And people think that, oh my God, you must be this incredible game connoisseur or someone that is just passionate about games. But weirdly enough, the reason why I picked the Atari or that I teach the Atari 2600 is, I think the word is simplicity. I see most students, they come to me and they are, especially now, right? When I was beginning, things were a lot simpler, but especially now, people already start working with the browser and they start working with the super complex frameworks. And I can only imagine
Starting point is 00:05:39 how it is to be a beginner programmer right now. It must be super, super overwhelming. And again, not just guessing, right? That is empirically, that's what I hear from people and I see from students at university and everywhere. And I don't know, I just always had this, I had this gut feeling that when I was growing up and whenever we were just starting out, things were a lot simpler, right? We didn't have as many complex pieces to work with or, you know, you go on YouTube and then someone says that this language is better and that this framework is better. And then it just gets crazy. So I just thought, why not just go back to the basics, right? Absolutely basics, right? ALU, processor, stack, things that people just kind of read on books, but they don't actually understand.
Starting point is 00:06:25 And they might be using those things. Of course, they might be using those things on the servers and in computers at home, or even at the PlayStation and things that they have at home. So I always thought, like, why not go back to the basic and really remove all those layers of abstraction? So I think the word, like I said, is simplicity. I use the Atari 2600 because it is so rudimentary, right? It's so simple. You cannot overcomplicate what it's presented in. You just have a box, you have some circuits, you have a processor that communicates with memories, like that very basic volume and thing that you cannot escape from. And well, it seems to be working, right? People have been really liking going back to the basics and kind of limiting themselves in order to not get completely overwhelmed by complexity.
Starting point is 00:07:14 So you just have the simple building blocks. You understand how they work. You send instruction to the processor. There is a program counter. It goes up. You create a loop. And then people just like, aha, so that is how things work. So that up. You create a loop. And then people are just like, uh-huh. So that is how things work. So that's pretty much the reason why I picked the Atari 2600. For my own selfish education, can you describe really briefly what the 2600's architecture was like? Because I didn't have one. I had an Apple II Plus.
Starting point is 00:07:42 But I knew about them and I played at friends' houses and stuff. But I didn't. Yeah. How do they work? Absolutely. Absolutely. That's a great question. And so everyone understands what we're talking about, right?
Starting point is 00:07:54 If you had an Atari 2600, you received this box that was like, you had this cabinet that was like wood and plastic, right? So if you open that thing, you had a board and that board is basically composed with the heart of the 2600, which was the 6502 processor. So the 6502 processor was this extremely cheap processor back then. And then because it was super cheap, it just got super famous, right? Everyone was using the Apple II, the Commodore 64, the NES, right? The Nintendo Entertainment System. All these super popular machines, they used this 6502 or variants of the 6502 because it was cheap. So that was the main processor. And the 2600, or people call the VCS, right? The Atari VCS, the VCS had also a chip which was responsible for sending instructions to the television set, which we usually call the TIA chip.
Starting point is 00:08:53 So you have, these are the two main components, sorry, the three main components, which is 6502 processor, the TIA chip, which is responsible for generating the signal to the TV, to generate the scan lines with the CRT beam. And you also have memory. So you have this chip with actual RAM that you can just write to and read from. So these are the main three chips that you will find on the board. And of course, on that board, you have connected the joystick, the joystick input, you have, well, on that board, you have connected the joystick, right? The joystick, input, you have, well, power, electricity, you have RF modulator. So, but I think the basic
Starting point is 00:09:32 architecture is 6502, the TIA chip that generates signal output, and also the memory, right? You have RAM. So that's, I think this is it. That's what you have to work with. But where do I get a 2600? You must not use them in your course. Is there an online simulator? Yeah, so I do. There is probably the de facto emulator and simulator that we talk, which is the Stella, right? So there is something called Stella, which, parenthesis, right? Stella was actually the original name of the project, the 2600.
Starting point is 00:10:07 It was supposed to be called Stella. So then you can go online and just download this simulator called the Stella emulator. So, yeah, that's what most students use. For example, if you are programming 2600 with me, you're probably not going to go and program directly for the hardware. I kind of teach a little bit about that, how to write an EEPROM or use an EEPROM writer to actually generate a ROM for those things. But usually, the students, they're just happy downloading the emulator,
Starting point is 00:10:39 programming, generating the binary, right? Assembling the assembly binary and just running on the emulator. So that is usually what students kind of use. And I guess for all purposes, it is helpful for them to understand, right? You can actually see the register. You can see the values of the registers, the values of memory.
Starting point is 00:11:00 So you actually have this kind of visual helper that is a lot easier to understand what's going on inside the machine. So it sounds like you are teaching microprocessors and how they work. Yeah. Again, I'm teaching the things that people usually don't. I'm teaching the things that people that work with high-level programming languages don't stop to think that much about. So, again, the very low-level things like ALU, yeah, microprocessor, ALU, the instruction set that you have, how do you move bits, how do you flip bits around, and how do you communicate with this other chip that generates outputs for the TV set? Or how do you communicate with memory? How do you work with the stack, right? If you have a stack in the... So yeah, I would agree. I do teach in the specific course, in the 2600. It is mostly
Starting point is 00:11:57 about the 6502 and how to poke the 6502 to make things happen on that limited box that you have in front of you. But when I look at your site, Pikuma, P-I-K-U-M-A, I don't really, I mean, I see that a little bit, but it looks like it's game engines and graphics. Right. So the 6502 processor and the Atari VCS, the Atari 2600, that is just one of my courses, right? So I teach this kind of retro programming and assembly and low-level programming with the Atari 2600. But I don't teach just Atari 2600, right? So I always like to go low level. So I do have, I mean, I do teach other things like C++, game engines,
Starting point is 00:12:49 or even how to create a 3D render using C. So I always try to keep this kind of low level approach to things. And also everything is from first principles, where I try not to use libraries or I try not to use just a framework that has an API or even OpenGL or things like that. I just go from first principles, where I try not to use libraries, or I try not to use just a framework that has an API, or even OpenGL, or things like that. I just go from first principles, like how do I draw
Starting point is 00:13:10 a pixel on the screen? And then from that pixel, how do I draw a line on the screen? And from that line, how do I draw a triangle? And from that triangle, how do I draw a 3D object? So it is not simply just microprocessor. I try to cover this low-level, again, things that people usually don't get the chance or not even universities teach anymore, right? The kind of the low-level things that evolved to be OpenGL or the things that evolved to be this complex physics engine that we have today.
Starting point is 00:13:43 Yeah, it's super amazing to use these super powerful complex tools that we have in libraries for physics and graphics, but how do they really work under the hood, right? What are they actually doing under the hood at a very low level detail? Christopher likes learning from first principles. I think he went back to get a master's degree in physics just because it irritated him not to understand the first principles. There you go. But I tend to want, I want those libraries. If I do it myself from first principles, everything looks crummy.
Starting point is 00:14:14 Absolutely. They do. And again, you have to, again, people usually think that I am very radical when it comes to this, but I'm not. I'm completely sober when it comes to this discussion because what I'm doing here is just about offering a place where you can just kind of come with me and learn if you want to, right? So if you have that kind of, if you have that itch that if you want to learn these things, then you can just go and kind of, yeah, sure, come with me and we're going to learn and have fun. But again, it's just for fun. I'm not completely crazy to dictate and say that the 6502 has any place in the industry today, for example.
Starting point is 00:14:51 How can I say this in a way that is my approach is mostly about education, right? So I am trying to offer something that if you want to understand these things, this is what you have, and you have all this appeal of using a processor that probably was the processor that was used to create all these games that you played in your childhood or something. So yeah, if you want to do that, that's absolutely fine. But not everyone kind of likes that,
Starting point is 00:15:17 and also not everyone needs that to be a productive practitioner. Again, I'm completely sober when it comes to that. I have thousands and thousands of people, incredibly great programmers and people that they are productive, they deliver, they are reliable, and they really don't know
Starting point is 00:15:32 and they don't have to know these things. And that's absolutely fine, Alicia. And again, it's not better. One is not better than the other. My point is just like, if you want to have some fun and come with me, sure, let's just do that. I'm just trying to offer some options if you want to learn these details.
Starting point is 00:15:48 How does this fit in with your day job? Oh, that's a great question. So it fits in between midnight and 6 a.m. when I can record my day job. So, yeah, so, yeah, so I'm currently like faculty, right? So I teach and, yeah, that's not easy, right? So you have to kind of office hours and teaching. But also, I was always interested in these things, right? Into this kind of low level understanding.
Starting point is 00:16:17 And in my day job, again, my background was mathematics. So I tend to teach mostly like statistics. I'm teaching like data science now so i'm teaching all these very uh very pragmatic uh courses and very like industry focused courses and since i do have that itch to kind of go back to the lab when i do know the students also want that that is why i decided to just i've decided to start picoma.com just to say okay let's see if people enjoy these things, and let's see if there are other students out there that would like this content. So yeah, it's usually between, yeah, let's say 10 p.m., I start recording, not just because
Starting point is 00:16:56 of schedule, but because of noise. So if you are trying to record, if you try to record any lessons here, especially in a big city like London, you have someone building something beside you or a dog walking and barking. So 10 p.m. is a good time for me to record. And then, yeah, so and then at 7 a.m. I'm ready to go to university again. So that's kind of that's my day routine, I guess. I mentioned that one of your courses is about physics simulation in games, which is kind of a vast field. It's physics and CS because you're programming and calculus. And are you expecting people who come into the class
Starting point is 00:17:40 to know most of these things or not? Because it's hard to learn them all at the same time. Absolutely. It's incredibly difficult. So, okay, there's a lot of things in that question I just want to unpack. So, first of all, right, physics for games. We have to understand that physics for games is just a very, very, very small subset of what we understand as physics, as human beings, right? And if you look at the whole spectrum of physics, we are just dealing with some small, very small set, right? So if you think about physics for games, you're talking about Newtonian physics, right? How things move, how things collide, what happens when they collide. That is usually what we understand by game physics. So just to be clear, this is what I'm covering with this whole game physics stuff.
Starting point is 00:18:29 It's just this very subset of physics that kind of makes sense in the game. We are not looking at the atomic properties and how these nanoparticles interact. Because unless the whole idea of your game is about the relationship of these particles and things, I don't think you actually have to go to, you know, it's not, it's before Einstein, I would say. It's a lot, it's the whole Newtonian physics that is usually how we, very high level understanding of collision, mass, gravity, this type of things. But again, it's super fun and it's usually what games need. And again, remember when I said about the Atari 2600, right? The reason why I'm creating these courses to teach Atari 2600
Starting point is 00:19:12 is not because I'm just in love with games and I'm extremely game related things. There was a reason behind why I chose the Atari 2600. It's because of simplicity. And to teach game physics also is not just because I want to create extremely fun games with physics. The reason why I'm teaching is because I want to expose the beauty of the mathematics that go behind all those things. And again, the same way that people didn't take the time to understand how an ALU or a processor works or how it communicates with memory or how DMA works, people don't usually stop to understand
Starting point is 00:19:56 how calculus influences computer simulation or how even basic trigonometry can be used for this type of fun things with games. So if I have the option of using this kind of creating this physics simulation and while at it teaching these people, you know, basic trigonometry, because I see more and more, right? People, they graduate high school, they even go to college, but there are a lot of gaps in the understanding of applications of those things,
Starting point is 00:20:26 right? Maybe people, they leave high school understanding how to simplify an equation, and they know how to, you know, numerator, denominator, they, oh, I can just cross these things. But what does it really mean, right? Do you understand exactly what are you doing when you take a cosine of something? Or do you understand exactly what is going on? Why do you take an integral in this place? This is why created a course and to answer your question you said like don't people need to kind of understand these things already not really right i think for example if you want to take the physics course a basic understanding of high level algebra is enough i kind of cover everything i try to at least cover everything in the course, right, to make it self-contained.
Starting point is 00:21:05 So I think that is always one of my goals as well. You don't have to have this incredible background in mathematics to program a physics engine. It's kind of, again, first principle, right? You go, you start, you experiment, you see the numbers, and then you try to find a connection. I think that is the whole goal. Do you cover linear algebra and matrix operations? Oh, yeah. Absolutely. Yeah, absolutely. Again, that is when I say calculus, not only calculus, but yeah, linear algebra is incredibly, it's probably the most, the omnipresent thing in
Starting point is 00:21:35 most of my courses. So in the physics engine course, I do cover a lot of linear algebra, a lot of vectors, a lot of matrix manipulation. There's a lot of, you know, line collision with line collision. There's a lot of these nice things. But also, for example, in the computer graphics course, right? So if you were talking about drawing triangles and rotating triangles and transforming things, there is a lot of matrices there, right? You have matrices, you have vectors, you have transformations, you have projection. There is a lot of beautiful mathematics there. So yeah, I cover a lot of matrices there, right? You have matrices, you have vectors, you have transformations, you have projection. There is a lot of beautiful mathematics there. So yeah, I cover a lot of those things. It's funny. I knew all of the matrix stuff from college, but when I tried to use it,
Starting point is 00:22:16 I wasn't very good at it after school until I picked up a book about computer science and actually game simulation. Because the CS form of matrix manipulation makes so much sense. I'm completely accustomed to arrays and how they go together. But just drawing it on a piece of paper and trying to find eigenvalues was... Well, linear algebra was not taught well, at least at our college. It was taught by the math department, and it was linear algebra and a lot of theory and the matrix stuff and eigenvalues and eigenvectors. But there wasn't, I remember, any applications at all in that course. And so I didn't really learn it well until physics, when it's like, okay, this is what this stuff is used for, and here's how you understand it. And it's like, oh, okay, these are basically little functions.
Starting point is 00:23:06 And, you know, getting an intuitive sense for what was going on instead of just, you know, here's some theorems and stuff. And some numbers. And let's talk about the, you know, the inner workings of linear algebra, which is of interest, but not of interest to people who want to use it necessarily. But then if you go to, like, machine learning, you need to have all of that well internalized. And yet, people don't.
Starting point is 00:23:28 You know, I said I like doing the higher level things. Machine learning, I'm totally the opposite. I'm like, you need to know first principles. You need to understand how the integration works and how the derivatives are going to affect your gradient. And other people are just like, yeah, I use DALI.
Starting point is 00:23:44 Exactly. I just import TensorFlow STS and continue from there. No, yeah, I completely relate to what you're talking about. This is absolutely, again, this is like, that's what I live for, right? This whole education thing. Like, I'm passionate about this. I really love because I did exactly the same thing. I studied high school with, you know, probably the same curriculum as you did. We always go exactly the same thing. I studied high school with, you know, probably
Starting point is 00:24:06 the same curriculum as you did. We always go to the same thing. I remember, I think it's all about context for me. Again, it might be just my brain that works like that. But if I don't put things into context, again, they are just numbers on paper for me, right? I just go and I manipulate those numbers and I get the eigenvalues and I get, I don't know. And again, the examples that people try to use as a context before, they also didn't resonate with me as a teenager or as a kid, right?
Starting point is 00:24:35 So it's always about, okay, you have this system of linear equations that you're trying to get the, well, you know, right? It's always like something, again, I always say that if you put a dollar sign in front of a number, you just kind of lose my attention.
Starting point is 00:24:48 But if you don't really kind of put things into context and people, I mean, it's very hard to kind of get the attention of people and hold their attention, right? And also make them motivated to come to the next class because, okay, fine, I understood a little bit about how these dollars things are working and I optimized something. But what better to motivate people than seeing something moving on the screen, right?
Starting point is 00:25:14 Seeing kind of that vertex rotating as you thought. You know, you ask to rotate that vertex and then the triangle rotates as you expected to see in that formula. And then everything kind of makes sense. I think that was the divisor for me when I saw that students were like, ah, okay. So that was why all those things that I pretended to learn before are used, right? So yeah, there's a lot of beauty in machine learning now. All this linear algebra from machine learning, that is something kind of, yeah, I have to
Starting point is 00:25:43 kind of teach at university. That is usually what I mostly focus on. I just found out that I have to teach R next semester, so that's going to be a little bit. Yeah, so there's a lot of mathematics is something that I see more and more people understanding the reason why. When it was like in the 90s and the 2000s, it wasn't very cool to learn mathematics, right? I mean, you had all these jobs like, yeah, you'll be an engineer or you will be, you know, there was a very kind of purist way of looking at mathematics. But now I see kind
Starting point is 00:26:16 of mathematics and even physics. There's a lot of STEM disciplines that are really getting to the kind of into the good eyes of people. And it's cool to be a nerd. It's almost like I see there is this kind of shift in the way that people are thinking. It's very cool to understand the math. Math is almost like this superpower that you get, that you can use to make things happen.
Starting point is 00:26:42 And if you really understand how math works, it differentiates you from the rest. That is also a very good point, I guess. In addition to having your own course set, some of which is also on Udemy, and having a regular lecturing job at a university, you also are mentoring for Classpert, which is where I teach my course, but you're not mentoring for my course. You're teaching, you're mentoring for building a programming language. How is that going? That's going super well. So yeah, that is, again, the Classpert people, it's an amazing initiative that they have, right? So I knew about your course and I knew about your book, of course, and I knew about the Classpert thing.
Starting point is 00:27:30 And then Classpert contacted me and they said, like, look, we saw that you taught Lua, right? The programming language that we use in this whole, in the Classpert course is the Lua programming language. And I do have a history with Lua, right? So Lua is also, it was created in Brazil, right? So I knew these people from before. I knew Roberto, which is the creator of the language. So I had this history with Lua before. And then Classpert
Starting point is 00:27:57 contacted me and said, look, we're going to have a course. Roberto is going to be the main lecturer, right? Because he has a book on it and we decided to kind of have this course that focuses on building a programming language from first principles and from scratch. And I was like, well, that's absolutely what I'm all about, right? We're learning, teaching computer science topics from first principles and teaching computer science topics at the fundamental, right?
Starting point is 00:28:22 So, and yeah, it's going completely, I mean, this is the first cohort. So, I'm still in the middle of the, in the eye of the hurricane, kind of answering questions and going, you know, evolving the course. But it's, yeah, it is absolutely great. It's just, I mean, just for people that don't know, it is a course that focuses on creating a programming language from scratch, right? So, you go, you start creating a programming language from scratch. So you start creating a programming language, you start creating things like expressions. So how do you create a parser,
Starting point is 00:28:50 something that goes and reads an expression from a text file and can actually compute and break those things apart, create a model and parse an expression and give you a result? And then you evolve and then you create a variable, right? You have an assignment and you create a variable. And then after the variable, you can create a block. And then you evolve and then you create a variable, right? You have an assignment and you create a variable. And then after the variable, you can create a block. And then after a block,
Starting point is 00:29:09 an if statement and then an else statement and then a while. And then, you know, again, everything that we kind of, the fundamentals, the building blocks, those things that we learn,
Starting point is 00:29:18 if you know low-level programming, program counter, that thing goes and increments, right? You have an instruction pointer and then you have to simulate those things sending to memory fetching from memory so yeah i thought it was a beautiful a beautiful class and it's going pretty well it's very very well some people have have asked uh i know at class part they have asked why is building a programming language a useful course um and it's somewhat like your physics courses,
Starting point is 00:29:46 that it's about understanding the first principles. It's not necessarily that you're going to build a new physics game engine. It's not necessarily that you're going to build a new programming language, but understanding how is so important. Yeah, well, we say that we don't use, right? I always, when I was younger, I used to say that, like, oh, I'm never going to use this. You know, I used to go to the computer science class and Yeah, well, we say that we don't use, right? I always, when I was younger, I used to say that like, oh, I'm never going to use this. You know, I used to go to the computer science class
Starting point is 00:30:08 and learn like complexity of algorithms. I was like, oh, no, I'm never going to use this. But just to open a parenthesis about this whole programming language and why is this useful. My first job, I remember that I used to work with this kind of computer graphic. It's like a CAD software, right?
Starting point is 00:30:25 So I used to be a programmer for this CAD software. But it was a CAD software for like architects. So the architect used to kind of move and drag and drop furniture blocks. So they kind of, you can render the view, you know, like if you have a kitchen or a bedroom, you can render and see those things in action. And then one of my first things that I had to do, one of my first tasks were, I had to create a module that the architects, they had to enter an expression that was supposed to dictate, for example, how does a certain furniture,
Starting point is 00:30:59 how does the door of a certain furniture opens? So I had to expose this kind of very small, what we call domain-specific language, right? So I had to expose this little scripting language for the architect so they can dictate where is the pivot point of the rotation of the furniture door? What is the angle?
Starting point is 00:31:17 What is the curvature that it opens? So we think that we are never going to use this type of thing, but out of nowhere, sometimes you just have to, you know, it is useful. You have to expose this small little language or something that is very specific. And then it's very important to understand, you know, how do you parse this input that the user is typing? How do you parse those things?
Starting point is 00:31:40 Operator precedence, right? You have to think about those things. You have to think about loops and whiles and you have to create those things from scratch. So yeah, I think it is funny that we always think like, oh, maybe it's not that useful, but every now and then sometimes it is useful, right? And if the more you understand
Starting point is 00:31:56 and the more you understand how these things work under the hood, then the more you are free from tools because the tools, they are going to come and go. And the more you understand the building blocks of how those tools work, then you are free, right? You own that knowledge. You don't depend on the tool.
Starting point is 00:32:14 So I think that is why things are useful, even at something like building a programming language from scratch. From scratch is always there. And it's not even that you need to be, you know, an expert in everything or ah, geez, you know, I have to know how to write programming language from scratch and remember how to do it for the next 15 years
Starting point is 00:32:31 in case it ever comes up. You know, you just never know when you're going to be given, like you say, given a task that you need to at least have the right words, the right terms to look up have the right words, the right terms to look up, the right... Or to talk to other people about things.
Starting point is 00:32:49 Yes, yes. Or just to know, okay, this is the domain of problem that I'm solving, and so here's how I can go find things that will help. Like you say, tools. Maybe you're so ignorant of the topic that you've been given that you don't even know what the tools are called. Yeah. And so just going through a course like this this even if you don't retain it all even if you're not you know able to sit down five years later and knock out a c compiler uh in my
Starting point is 00:33:15 experience stuff like that gives you just just the the little bit of head start to know how to start solving the problem even if you don't remember exactly. Absolutely. I completely agree with you. Yeah. And also, everything now is about, you have to cooperate with, you have to, it's about cooperation, right? You don't solve anything by yourself. So the more you understand, I always tell my students, the more you understand the jargon and the lingo and the words that people usually talk and they refer to when they're talking to these things. It's better for you to also discuss and also find new solutions to things. Because as you are talking about things and as you are, you know, as you are fetching from your brain that knowledge that you have, it's a lot easier for you to come up together with a new solution or something that kind of makes sense.
Starting point is 00:34:09 So, yeah, it's all about understanding, right? Understanding and if you understand, again, if you understand how things work under the hood and if you open that black box, then I think everything is a lot easier in the future. I have this question here about is teaching on PICUMA different than on Classpert because of the Classpert cohorts? But I realize you're a lecturer, you always have cohorts. It's not having cohorts that's odd for you, isn't it? Yeah, it's very different. I would say that the whole concept of recording a course and not being there real time and having this kind of students do things self-paced it's different than what i'm what i'm used to yeah i'm usually i'm usually i'm very kind of okay and i'm very it's very familiar for me to go and you know point my fingers at a blackboard and explain things and look into people's eyes but also
Starting point is 00:35:03 online right if you have a cohort and then you have Discord and you're talking, there's like ping-ponging ideas with people, that is somewhat easier. But if you just kind of create something, it is a lot of preparation. You have to think, what is the flow that the student, how are the student, what is the knowledge that the student already have, right? So what is the baggage that they're bringing? Are they going to be able to follow the flow and the whole roadmap that I have? It's a lot of preparation. I think it's a lot more preparation, I would say, for this type of things, because it is not agile, right? If you are on a cohort base, you can kind of steer as things are going. And if you have just a recorded lecture, you just have to really kind of think a lot more about the planning of that thing.
Starting point is 00:35:48 One of the problems with my course is that my quizzes are terrible, according to the last cohort. They're too hard. That's rush. How do I fix that? Right. So you're saying that they're horrible because they're too hard. I'm not saying that that's actually a bad thing. They said that they were like puzzles, that they had to figure out what I meant, which is not what I want to have happen. Well, isn't it life, right?
Starting point is 00:36:13 Isn't life like that? That's true. Okay, so they're just students and they're whining and I should ignore them? No, no, I'm not going to say that. So, yeah, so I think I always say that my sin is to actually do the opposite. Sometimes I try to over-explain things maybe that I shouldn't. I kind of understand it's always, right? There's a different type of personality, right? And I think that people are just...
Starting point is 00:36:40 I'm going to be completely a grumpy person and say that I think this is just a sign of times as well where people are very used to get everything super fast and not sit down and kind of try to savor the moment of trying to solve something. So that is my grumpy response. But I would say that I try to give always examples. So if I give just a quiz or like a multiple choice question, I always try to give an example kind of in the question that would kind of help them reason and give some tips, right? I think maybe that's my approach. If I'm asking them how a processor works
Starting point is 00:37:22 or how a certain formula is actually working or, you know, is actually working or, you know, this type of thing. I try to always put things into context. So maybe that will help them kind of know where to look for examples or even go on Stack Overflow and look for that specific example. There is always some answer there that might help them kind of find a solution. So I don't know. Maybe just adding some context and giving some example
Starting point is 00:37:46 in the question. But again, Alicia, I will have to look at a course that you created to see what's going on. I just need general pointers at this place. And it's funny, my first cohort didn't complain about it. The second one did. So I'm never sure of what's happening. N equals two. That's statistically significant now. That's it, yeah. We have a couple of listener questions. Okay. The first is from Brian, who asked,
Starting point is 00:38:17 what is the most ambitious porting project to the Atari 2600 that you have seen? Porting project for the Atari 2600 that I have seen. I mean, is Tetris on there? Well, yes, it is. But again, I was going to answer something completely selfish, which would be actually from one of my students. So again, it is not, I wouldn't say that it is significant in terms of like the most well-polished and like that. But there was one of my students that I was completely blown away by this thing. Actually, it's just the things that you don't actually, you never even imagined that will happen.
Starting point is 00:38:51 So one of my students, he just created a port of a game. It was like an old Commodore Amiga game called Shadow of the Beast. I don't expect you guys to remember that. But so there was this game called Shadow of the Beast. And then one of my students, he just decided to create a port for the Atari 2600.
Starting point is 00:39:09 And that game was, it looks so good. And I was like so blown away by what he did. I actually, yeah, so the name of the game now that he renamed, right, is called Soul of the Beast. So you can just Google and you'll find it's so well made. He did such an amazing job. I was so proud of that. And so I would say that that might be my favorite. I would probably pick that one as the most significant port for me, at least. It was super, super fun. I just clicked the link and it's running it in my browser.
Starting point is 00:39:38 Exactly. It runs on my browser. The first link just comes up and starts running an emulator. It was incredible. Yeah. So yeah, it is a port of the Shadow of the Beast. It's an old game, actually. It has been important for a lot of other consoles and machines. But when I saw that someone that kind of learned with me was able to do that and win awards on that game, I was just like, I cannot believe that this is happening.
Starting point is 00:40:01 It was incredible that day. So I would say that that was the most significant for me, at least. Very selfish answer. What's interesting is that those consoles lasted for a fixed amount of time and the game developers for them Oh, they never die. They learned
Starting point is 00:40:17 along with the emergence of arcade games they were learning as they went and making games. And now you still have these conceptual consoles in existence. And people who have had the advantage of 30 or 40 years of further development of concepts of programming and stuff, going back to that, the things they can do are now much more impressive, I think, than what the people in the 80s were struggling to accomplish. Absolutely.
Starting point is 00:40:49 And also, it's so much easier to find information about things. Back then, I remember, like, if I had to learn programming assembly for, like, the first 6502, it was just like a book. It was just one book in the library of the city that I just went there and I kind of rented for months. And it was just this kind of Apple II, 6502 processor, which I didn't understand. I didn't have an Apple II. So I just kind of had to, you know, as a kid, I just had to, it was very complicated for me. But that was just one book.
Starting point is 00:41:14 That was all I had. And now you have information, you have like actual developers from back in the day creating blogs and you can read the things that they did and you can read all this bit magic that they were using. It's super fun nowadays. I believe that you know i cannot think of a better time to to be alive to just learn about these things things everywhere it's incredible
Starting point is 00:41:33 actually that brings up another question from brian which is about the optimizations that game developers use. I mean, we've heard about incredible, just making things small and weird optimizations because they didn't have the space. Do you teach those? Yeah, so I try to keep everything as simple as possible during the course. But you will see that every now and then, in the middle of the course, I throw some spices of historical things that happened or how a certain game solves a certain problem. So I try to just give this kind of, you know, put things into context. Again, you know, if you're trying to do this with the CRT display, this is what this certain game had to do. I might not go and spend three hours explaining all that optimization and, you know, really squeezing all the bits,
Starting point is 00:42:31 but I just maybe, I throw it out there so people at least know that those things were used. But absolutely, this is a huge, huge thing. I had a student once that said like, oh, you were trying to approach the 2600 programming from this whole educational perspective and he said but that was not how how people did back then right people are just like cowboys doing things as they try to do things and squeeze everything that they can uh i don't know how to solve that because i'm a teacher so i try to kind of go from the from the more educated you know point of view but i completely agree uh back then and the things that people had to do,
Starting point is 00:43:08 is like you try to make as much as you can out of nothing, right? You have just this, especially for the Atari 3600, you have to squeeze everything from that machine. And I think one of the biggest things that I was just like learning, programming for the NES last week, and the things that people had to do in terms of compressing data, right? Because if you just have a certain amount of memory, you have 32K usually, right? You have 32 kilobytes to store the entire ROM of a game. And that includes data as well, right? So if you have, for example, Super Mario Bros. level, everything needs to fit, right? The actual data of the level has to be in those
Starting point is 00:43:41 32Ks. So the ways that people compress the data or create this kind of meta, you know, the tiles of the game, they need to create meta tiles and group things into blocks and compress things using these different compression methods. I try to cover all those things,
Starting point is 00:43:58 but of course, every game is different and every game has a different way of approaching this type of compression things. But yeah, it was a crazy time, right? The optimizations that people had to do back then, I tried to cover them and explain these things. But again, you will spend a lifetime learning about these things. And some people actually do spend a lifetime talking about the Atari 2600 and the NES and all these things. Again, you can spend a lifetime learning and teaching about these things. One of the things that I like to share is the graphics from Stanford, or the graphics bit twiddling hacks from Stanford.
Starting point is 00:44:31 Oh, yeah. I love that. It's so nice because they put together all of these different small algorithms with optimizations for different reasons. Like if you're out of code space or out of RAM or out of processing power. And I like the comparison of what kind of algorithms solve which kinds of problems instead of just optimize it. It's optimize it for. And I think that's so important. Yeah, I always say like, again, there is a lot of passion because people come to the course and they want to learn about the Atari. Oh, it was my first console.
Starting point is 00:45:06 I want to learn program. But you have to understand that everything has all the optimizations that we're doing and all these kind of bit manipulation and bit flipping. They are useful for the Atari. Right. So you have to always put things again. You have to always put things into context, understand what you are programming for. And especially back in the day. Right. So you have to always put things again. You have to always put things into context, understand what you are programming for. And especially back in the day. Right. You cannot create so many generalizations of things. You cannot create, for example, if you were talking about Pac-Man, you are talking about the beats that compose that graphics of the Pac-Man.
Starting point is 00:45:40 You cannot think, for example, as entities and components. I don't know if you ever learned game engine programming, but there's a lot of abstraction and generalizations that we create right now. If you talk about an entity in a game, people are talking about this entity can be Super Mario or Sonic or the pickup point that you have to pick. You create these abstractions. If you're working with a modern game engine, you have these abstractions, you have these generalizations that you create. Back in the day, you don't have the space or the processing power or any resource to think about these generalized ideas of creating an entity that moves. You have to program the Pac-Man for that specific frame, for that specific time
Starting point is 00:46:24 interval, right? You have to really tailor your game for what you are doing. So it's a different way of approaching development. It's a different, again, you are limiting yourself, but I think that by limiting yourself, it forces us to think about what's going on at the low level of everything, including today, right? We try to escape from it, but in the server, in the console that you're using, yeah, it may be a different architecture and maybe some incredible different ways of moving data around, but you still have a processor. You still have digital signals.
Starting point is 00:46:56 You know, you still have to work with negative numbers. You still have to work and think about how to represent floating point numbers. All these things are still around. So it's still useful for us to learn about these things. It is. And yet I used to spend a fair amount of my time optimizing things. And now I don't. I guess it's not true because my current project is all out of space again.
Starting point is 00:47:21 But it seemed the processors have gotten bigger and the code has gotten flabbier. And that's okay because it doesn't have to be super efficient anymore. But I do like hearing how it can be because sometimes it does need to be. Well, but I do agree. Things are faster and we do have processing power and CPU cycles to spare, like a lot, right? So you can just create this incredible complex algorithm that shouldn't even be looping that much. And it's fine.
Starting point is 00:47:53 It's okay. It delivers what it has to deliver. Again, sorry, there are schools of thought, right? There are several schools of thought that say that this is why we have the crazy software landscape that we have today and we should actually be paying more attention. So there's a lot of thoughts when it comes to these approaches.
Starting point is 00:48:11 But I tend to agree with you. There are different industries, different requirements. Maybe you have deadlines. Again, there is no right or wrong answer here. Sometimes you just need to quickly do something, deliver and test. Because if you just spend so much time optimizing and then you spend two weeks optimizing, your competitor already released something, it fails, it got back, they fixed and they got your client. So it's all about, you know, you cannot isolate yourself and just think about
Starting point is 00:48:38 the technical aspect of it, because we are immersed in this whole capitalism and there's business and there are different constraints at play. So, yeah, it's not an easy answer to just say, oh, yeah, you have to always optimize or you should never optimize. Also, that is also probably the wrong decision. So, yeah, again, every case is a case, right, Alicia? You have to look at where are you, what are you talking about? What is the project that you're working with? My reality is that I usually work with, I don't work so much with low level in my kind of day-to-day job or what I teach.
Starting point is 00:49:14 And I didn't work with low level in my industry years as well. But even though you have to always ask yourself, right, is this worth it? And you see a lot more frameworks and a lot more software methodologies that they just rely on failing, right? So if you go and you fail fast and you fail hard, that's what you want. And then you can just go and adapt. And you just, you know, optimizing can be a tricky thing to do. And sometimes it's the wrong thing to do as well.
Starting point is 00:49:39 I agree. I think the question often is, what are you optimizing for? Because when we say optimizing, we think, okay, I'm going to go into these loops and make them fast. And so they use less resources. What are you optimizing for? Because when we say optimizing, we think, okay, I'm going to go into these loops and make them fast, and so they use less resources. What are you optimizing for? Are you optimizing in a larger sense? Are you optimizing for release date? Are you optimizing for how much this board
Starting point is 00:49:54 costs? Because that might mean that you have to, you know, write more compact software if you need a smaller part. So there's all sorts of questions beyond optimizing code. Absolutely. Or sometimes as a business decision, you just say, like, throw more hardware at it and forget and just get on. Because it's cheaper, right?
Starting point is 00:50:14 At the end of the day, it would be cheaper to just throw this super cheap hardware. It gets the job done, delivers in 0.5 seconds to the user. That's all they want. That's fine. Yeah. Speaking of hardware, you asked me an interesting question in email about double e's um and i haven't i haven't clued christopher in yet so could you ask it again right so my question was basically um you know i try to read things and i i i end up reading a lot about this whole reduction of offer in terms of electrical engineers, right?
Starting point is 00:50:46 So there's a lot of, if you look at the graph of graduates and even job offers, it seems like EE is being in decline. So I just wanted to kind of poke your brains a little bit because you probably have been immersed in this world with, you know, the division between software and people from the EEs. And what do you see in this kind of, how can I say, in this alleged decline of EE offers and the EE market? Do you think people are still going to go always for the kind of software world,
Starting point is 00:51:22 or is there still place for EE in in the future we had a long discussion about this on the slack uh the the podcast slack a few weeks ago because somebody posted an article and a graph that claimed that um that ee uh i think it was uh students are declining at universities and such such such, such like. And I wish I had it in front of me because I thought I'd said some things that were cool, but no, I don't remember any of them. You can pause. I don't even know where it is. Come on, man, just open there and it will sound super cool.
Starting point is 00:52:00 It will sound super smart. I don't know which channel it was. So let me look for it. It's probably it's probably the same article that everyone is sharing you know something gets into hacker news and then he just becomes everyone is sharing on twitter everyone is sharing on facebook it's the same thing yeah um so yeah i saw that article uh that i think you're referring to. And just from my own experience, I don't feel like much has changed in terms of working with double E's or the interaction between them, how many of them there are. There's always seems to be fewer than we need on a team.
Starting point is 00:52:42 That's my first impression. It's usually one or two people per project for these small embedded kind of projects where there needs to be a board made and sometimes a non-form factor board and that kind of thing and support for that. I do think there's some truth to the fact that programming and coding, you know, that the salary, exaggeration is the wrong word, the salary explosion that's happened with things like Facebook and Google and, you know, the Silicon Valley companies really pushing up salaries draws people away from hardware to software. I think that's definitely the case. But if I'm remembering right, in that article, there were just a lot of anomalous stuff that didn't make sense to me. Like the graph had a big pulse of software beating out double E's in like the early 80s, which didn't make a lot of sense to me. And it was unclear kind of what the sources of data were
Starting point is 00:53:46 and how good the data was about what was happening. And the data was suggesting that basically universities are producing fewer double Es and there's just less interest in it. And so I think it's a mix of truth and maybe exaggeration. I don't know what the truth of it is. Alicia, please comment. I think that there is probably truth to the fact that there are fewer double E's. When I started my career, it was often one-to-one, one EE per one software engineer. And that was because the complexity of the software was matched by the complexity of the hardware.
Starting point is 00:54:32 The hardware engineers had to deal with EE PROMs and being able to flash them. And they had to deal with power-on boot sequences that were very complex because the chips were dumb. And ESD was, I don't know, I don't want to say ESD isn't an issue now, but ESD was a huge issue then. I mean, you just breathed around it. I still don't believe in it. And they had so much more to worry about. And now they buy a chip. The chip says, give me three volts and I don't care about the
Starting point is 00:55:07 rest of it. You power on, just power on. It has its own memory. It has its own flash. And so all these things they used to take care of now are single pieces. And now I can have one EE per five or even 15 firmware engineers because the firmware engineers have a lot more to do because the software is more complicated. So you're saying it's been optimized? I'm saying we've optimized away the double E's. But yeah, the double E problem, the double E amount of work has decreased
Starting point is 00:55:44 as industry tries to make their job easier and cheaper, while the firmware side has increased because they've made the EE's job too easy and now we have processors that are too big. So I'm not seeing it as a problem, except if we're saying they're going away entirely. But I don't think that's going to happen because antennas are always going to be a problem and power is always going to be a problem. And so while they may not need to deal with how do you have two RAMs that you can only access one or the other at a certain time based on the processor. Yes, that really happened. Now they have to deal with different problems. But a lot of their job is putting together the Lego blocks that companies give them
Starting point is 00:56:34 and figuring out how to smooth out the edges instead of having to design the whole thing. And, you know, a lot of the people I work with in firmware are double Es. They're people who write firmware, but they also do hardware. Like, you know, half the people we have on this show are, you know, firmware engineers who make their own boards or former double Es who are doing firmware. So I don't think it's a simple and or. And one of the things that article said, and I have now found my comments. One of the things that article said was,
Starting point is 00:57:09 EEs are in short supply and they threaten the industry, and there are no job openings and low pay. Wait a minute, wait a minute. There are no EEs. There are no EEs. And there are no jobs for them. And there are no jobs for them, and therefore the industry is threatened. So dramatic.
Starting point is 00:57:22 Supply and demand. That doesn't make any sense. You can't have both of those things together. If the industry is threatened, the industry will adapt and hire more double E's and raise prices. And pay them better. If the industry isn't threatened, then they just don't need as many double E's. And so like some other people ask, how are they measuring these things? Like what is a measure of popularity? It had a graph of popularity. So how do you measure popularity, right? Which universities? So there's a lot of truth to things like the industry evolves, but I'm not sure.
Starting point is 00:57:52 If you look at the graph and take it at face value, it's been a crisis for 30 years. And at what point? So I'm not poo-pooing it and saying there is nothing going on, but I also, I don't know the truth of what's going on either. And certainly from the article that prompted a lot of people to ask questions about it, it's not clear what's really going on. That's fine. I mean, if I transpose that to software, I see everything you guys are talking about, the problems that you're solving and how things evolved. And sometimes you don't have to think, you know, it's like I said, it's being optimized, right?
Starting point is 00:58:29 That happens in the software world as well. But again, it's always about you rely on a certain solution and then you just kind of glue things based on that solution that is already being implemented. But I don't know. I always, at least during my 30-something years of life, I've seen that real actual change in technology is a lot more connected to hardware than with software. Weirdly enough, I shouldn't be saying that, but I always see that huge dent of our lives and everything that changes. There's a lot of hardware involved, and I kind of feel a little bit sad that people are taking this kind of easy route to just kind of glue things together and, you know,
Starting point is 00:59:10 sell a solution and glue things together that are kind of based on something that has been quote-unquote optimized. So yeah, I still always think that there is a lot of market for it, especially in innovation, if you're talking about hardware and EEs, so much, so much, so much. I have a couple more questions about PicoMa. First, where does the name come from? Oh, that's a, the answer is not as cool as people would expect. The nameuma is just a brazilian it was like a native brazilian uh word for and i just love the sound of it so basically that's it it's just like picuma is um in brazil like if you have a fire right if you're just have like a bonfire or something and you have those you know those little sparks of flame that sometimes get out of the fire? I don't know if you know what I'm talking about.
Starting point is 01:00:06 These little kind of golden things. Yeah, that's kind of like a picuma. I just love the sound of the word as well. And my wife always loved the sound of that word. So that was just, I decided picuma. No real, no other reason for that. There's no smart nerd reason. Just that.
Starting point is 01:00:21 Just that I like the sound of it. The little sparks. Yeah, little spark maybe you can kind of force a little spark of knowledge or something but i'm not going to go that far and uh how how did you set up picama you have your own i don't know delivery system system yeah so um i i um i have a kind of a third party lms right so i do hire i hired and i pay for a hosting thing that they host videos and they host the quizzes and the text and all the resources so i do have an lms which is uh some people call thinkfic i think they're canadian it's very good it's very reliable so i use them as this kind of main LMS support. But then, yeah, I mean, the website and everything
Starting point is 01:01:10 else is just kind of me writing HTML, CSS, and kind of building, gluing everything together and yeah, throwing out of the world and see how it works. And I'm going to point out to those people who haven't been in the world of teaching LMS is learning management system. Took me a while to get that one. Got it. Yeah. And you have a free bit shifting course. It's only a couple hours. Do you want to tell me about it? Right. So that was just my attempt of, yeah, it's just free bit shifting is just a very, very quick, quick introduction to, for example, why would you even shift bits left and right?
Starting point is 01:01:51 And why is that important? And why that was important back in the day for game developers, right? If you were programming for like MS-DOS or even like some older machines that didn't have a matco processor, why would people shift bits left and right? And why was a lot of older games using bit shifting left and right all over the place? So again, that course is basically just a trial. So if you want to see my delivery style, if you want to see if you like that or not, if you like the context, it's just a trial. So if you want to check it out, yeah, that's the goal of that course.
Starting point is 01:02:23 What do you mean there are people who don't do bit shifting all the time that's important not anymore i would say but uh gustavo it's been a pleasure to talk to you do you have any thoughts you'd like to leave us with my thoughts sure um first of all i don't say it has been super cool to speak to you guys but i would like to tell all the the listeners that if i if i can give you one advice is do not do not overlook the fundamentals and the essential building blocks of life. Sometimes we tend to skip steps. And only after we are old, we realize that we should actually spend a little bit more time understanding how things actually, you know, the basic, basic building blocks of things.
Starting point is 01:03:18 So that was a motto that I realized later in life. And as soon as I realized that, you know, learn the fundamentals, spend time with the basics, that really changed the way that I realized later in life. And as soon as I realized that, you know, learn the fundamentals, spend time with the basics, that really changed the way that I learned. So if you really want to kind of deep learn things, pay attention to the building blocks. Don't go too crazy over the high level mathematics classes from MIT and, you know, all these things.
Starting point is 01:03:42 Yeah, sure, they are amazing, but don't look at the basics first, right? Make sure you understand the basics. They are super, super important and you can go a long ways only with the basics. Our guest has been Gustavo Pezzi, teacher. Check out his course on picoma.com. That's papaindiakilouniformmichalpha.com. Of course Papa India Kilo Uniform Mike Alpha.com.
Starting point is 01:04:08 Of course, we'll have a link in the show notes to that and a number of other things. Thanks, Gustavo. Thank you very much, everyone. Thank you to Christopher for producing and co-hosting. Thank you to Felipe and Jason at Classpert for introducing us and to our Patreon listener Slack group for questions. And of course, thank you for listening.
Starting point is 01:04:26 You can always contact us at show at embedded.fm or hit the contact link on Embedded FM. And now a quote to leave you with from Jorge Luis Borges. So plant your own gardens and decorate your own soul instead of waiting for someone to bring you flowers.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.