GUY WHITE: Hello, Indonesia. [CHEERING AND APPLAUSE] It's so good to see all my friends here. So many of you come from such a long way away. How many of you walked here? How many walked here? [LAUGHTER] How many of you took a plane? How many were on a plane? Oh, my gosh. I want to say from the bottom of our heart here at CS 50. We are so thankful for you. And please, tonight we want you to contact your family, and we want-- [LAUGHTER] Seriously. I'm serious. I want you to contact your family, and please, extend our thanks to them for allowing you to come here this distance to be away from your family and to work. [CHEERING AND APPLAUSE] It takes such a commitment to have done what you have done. But today, is not the end of your journey. This weekend is not the end of your journey. This weekend is just the start of something. [CHEERING] So I want to see who has traveled the longest way. So the way we're going to do this is let us stand up. All of you stand up, please. Thank you. Stand up, please. All right, so if you have come less than five kilometers, please, sit down. Five kilometers? 10 kilometers or less sit down. How about 50 kilometers or less, go ahead and sit down. Thank you, 50 kilo-- oh, there we go. Got some movement. [SIDE CONVERSATIONS] OK, if you had come more-- less, if you've come less than 100 kilometers, go ahead and sit down. Sit down. How about 300, less than 300, please, sit down. Less than 300? Oh, it's the longest. It's-- [SIDE CONVERSATIONS] I'm going to have to make it higher. How many of you have come from less than 1,000? Go ahead and sit down. Oh. How many of you have come less than 1,500? Go ahead and sit down. OK, all right, now let's look around. Let's look around and look at these people. How many people have come less than 2,500? Go ahead and sit down. Less than 2,500? Oh, one? Wait, oh, we have two? We have two? OK, those people stand back up. Stand back up. I did it again. OK, not a good-- OK, so let's try this again. 2,200. If you have travelled-- if you traveled more than 2,200, stand up. OK, now, let's try here. If you traveled less than 2,300, sit down. 2,300. 2,300? AUDIENCE: Whoa. GUY WHITE: Oh, look at-- OK, so sir, please, where are you from? AUDIENCE: [INAUDIBLE]. GUY WHITE: Wonderful, give him a round of applause. [APPLAUSE] Thank you. And right here. My friend, where are you from? AUDIENCE: Oh, oh. [SIDE CONVERSATIONS] AUDIENCE: I'm Indonesian but based on [INAUDIBLE]. [CHEERING AND APPLAUSE] GUY WHITE: And how about you? AUDIENCE: I'm from London. GUY WHITE: Wonderful. How many kilometers? AUDIENCE: [? 234. ?] GUY WHITE: Wonderful. AUDIENCE: [INAUDIBLE]. GUY WHITE: Wonderful. [APPLAUSE] And up here. AUDIENCE: I'm from [INAUDIBLE]. GUY WHITE: Wonderful. [CHEERING AND APPLAUSE] Thank you. Thank you. Thank you. And did I see-- I see a face over here. Excellent. I'm going to go this way and not get injured. [LAUGHTER] And let's pass the mic up, but I want it back. OK. AUDIENCE: I come from the western of Indonesia at the end of Sumatra and Aceh province. [APPLAUSE] AUDIENCE: Thank you. I'm from [INAUDIBLE], around [? 3,000 ?] kilometers. AUDIENCE: Wow. [APPLAUSE] GUY WHITE: So not only is your family proud of you, but your city, you province is proud of you. Last night the minister visited you and the school. You're part of the reason-- you are the reason this is all happening. We are so happy to be here with you today. So we're going to play is we're going to play a game really quick to get us started called counting to 23. But we can do it in Bahasa. So how do you say the number one in Bahasa? AUDIENCE: [SPEAKING BAHASA] GUY WHITE: [SPEAKING BAHASA] AUDIENCE: Yes. GUY WHITE: [SPEAKING BAHASA]. [LAUGHTER] OK, so we're going to count. In a minute, we're going to hand of the mic. We're going to go 1, 2, 3 in [? Bahasa. ?] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. GUY WHITE: And 123. [LAUGHTER] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. GUY WHITE: 21. AUDIENCE: Yeah! AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. [CHEERING AND APPLAUSE] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [INAUDIBLE]. [CHEERING AND APPLAUSE] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. [LAUGHTER] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. [LAUGHTER] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. GUY WHITE: And remember your number. [LAUGHTER] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. [SPEAKING BAHASA] [LAUGHTER] AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. AUDIENCE: [SPEAKING BAHASA]. GUY WHITE: Is that it? Yay! [APPLAUSE] And now we will spend the entire weekend making a better algorithm for that. [LAUGHTER] All right. It is so awesome to be with you here today. I'm so honored to be part of this. We're so happy to be joined by the Harvard team today to be here and just to be here with you. So please, do send our thanks to your family. To get us started, we need to make some noise to bring on Dr. David Malan. [CHEERING AND APPLAUSE] DAVID MALAN: Thank you so much to CS50 [INAUDIBLE]. This is a very hard act to follow. And in fact, he was kind enough to pass the applause off to me. But I think we should give it back to him. [CHEERING AND APPLAUSE] And allow me to begin this way, if we may. This is-- AUDIENCE: CS50! DAVID MALAN: So nice to have all of you here with us this weekend. And welcome to CS50's full community. We thought we-- before we dive into the behind the scenes of CS50's pedagogy, let's do a bit of a pop quiz of sorts. Could we get eight brave volunteers to come on down? We need eight volunteers. 1, 2, 3, 4, 5. Let me go over here. No hands over here? OK, 6, 7, 8. Come on down. And if you can form a line right here in the middle. Come on down [INAUDIBLE]. AUDIENCE: All right. DAVID MALAN: Thank you. All right, here comes number eight, so 1, 2, 3, 4, 5, 6, 7, 8. OK, from left to right, do you want to introduce yourself to the group? AUDIENCE: I'm [INAUDIBLE]. My name is [INAUDIBLE] from [INAUDIBLE]. AUDIENCE: Hello, welcome. My name is [? Zach. ?] [LAUGHTER] I'm mathematics teachers from South Sulawesi. AUDIENCE: Hi, my name is [? Luth ?] from [INAUDIBLE], Jordan. AUDIENCE: Hello, everyone. My name is [INAUDIBLE]. I'm from West Sumatra. AUDIENCE: Hello, everyone. My name is Diana, and I am from Pocasi, West Java. AUDIENCE: Hi, guys. My name's [INAUDIBLE]. I'm [INAUDIBLE]. [LAUGHTER] AUDIENCE: Hello, everyone. My name is [INAUDIBLE], and I'm an [? MS ?] teacher, and I'm from [INAUDIBLE]. Thank you. AUDIENCE: Hello, guys. My name is [INAUDIBLE]. I come from Aceh. AUDIENCE: Hello, my name is [INAUDIBLE] [? Sandy, ?] and [INAUDIBLE]. DAVID MALAN: Thank you so much to our nine volunteers. [APPLAUSE] So what's your name again? AUDIENCE: [? Sandy. ?] DAVID MALAN: [? Sandy. ?] OK, let's have you step-- step this way. You're going to help me with this algorithm. [CHEERING AND APPLAUSE] All right, volunteers now could reveal by turning around their pieces of paper what number they are. So show your number to the audience. You'll see that, unfortunately, they're unsorted. And so I think our first question for the volunteers here is, please, sort yourselves. [LAUGHTER] OK, [? Sandy, ?] what algorithm was that? [LAUGHTER] Unclear, unclear, so let's rewind. Randomize yourself, different order, any order is fine. All right, and now, why don't we propose to have just our volunteers-- Sandy will give you the third algorithm. [LAUGHTER] [INAUDIBLE] volunteers, could you bubble sort? [LAUGHTER] Starting from left to right, bubble sort yourselves. [SIDE CONVERSATIONS] [? Sandy, ?] what algorithm was that? [LAUGHTER] Hopefully, that was the bubble sort. I know. Sorry. Let's run the randomizer. [LAUGHTER] [SIDE CONVERSATIONS] [? Sandy ?] and I [INAUDIBLE] out with this. So now they're unsorted. Now, [INAUDIBLE] the bubble sort has us go left to right, left to right, left to right, swapping elements that are out of order. So accordingly, at the 6 and 7 are OK. So [? Sandy ?] look over here. 7 and 3 are out of order. So what should they do, [? Sandy? ?] [INTERPOSING VOICES] [CHEERING] OK, [? Sandy, ?] 7 and 4? AUDIENCE: Yeah! DAVID MALAN: 7 and 8? AUDIENCE: No! DAVID MALAN: [INAUDIBLE]. AUDIENCE: [INAUDIBLE]. AUDIENCE: [INAUDIBLE]. DAVID MALAN: Yeah, 8 and 1? AUDIENCE: Yeah! DAVID MALAN: 8 and 2? AUDIENCE: Yeah! DAVID MALAN: Are we done? AUDIENCE: No! DAVID MALAN: OK, again, [? Sandy, ?] you take it from here. 6 and 3? [INTERPOSING VOICES] [CHEERING] [INTERPOSING VOICES] DAVID MALAN: Are they done? AUDIENCE: No! DAVID MALAN: 3 and 4, 4 and 6, 6 and 5. [INTERPOSING VOICES] DAVID MALAN: 6 and 1. AUDIENCE: Yeah! DAVID MALAN: 6 and 2. AUDIENCE: Yeah! DAVID MALAN: 6 and 7? AUDIENCE: No! DAVID MALAN: 7 and 8. AUDIENCE: No! DAVID MALAN: Are they done? AUDIENCE: No! DAVID MALAN: 3 and 4, 4 and 5, 5 and 1. AUDIENCE: Yeah! DAVID MALAN: 5 and 2. AUDIENCE: Yeah! DAVID MALAN: 5 and 6. AUDIENCE: No! DAVID MALAN: 6 and 7. AUDIENCE: No! DAVID MALAN: 7 and 8. Are they done? AUDIENCE: No! DAVID MALAN: 3 and 4, for 4 and 1. AUDIENCE: No! DAVID MALAN: 4 and 2. AUDIENCE: Yeah! DAVID MALAN: 4 and 5. 5 and 6. 6 and 7. 7 and 8. AUDIENCE: No! DAVID MALAN: Are we done? AUDIENCE: No! DAVID MALAN: 3 and 1. AUDIENCE: Yes! DAVID MALAN: 3 and 2. AUDIENCE: Yes! DAVID MALAN: 3 and 4. 1 and 5. [INAUDIBLE]. [CHEERING AND APPLAUSE] Round of applause for [? Sandy. ?] [CHEERING AND APPLAUSE] Thank you so much to our volunteers. Please, have a seat. All right, so that you can keep this [INAUDIBLE]. So that then was bubble sort. Well, then the next two days are meant to be about CS50. It's meant to be not what is CS50 and what is computer science, but really why is CS50? Among our goals for today and tomorrow are to look initially at the pedagogy behind CS50 itself, looking at why we teach things the way we do so that you can decide for yourselves as a teacher, do you agree? Do you disagree? Do you want to adopt the class for your own students? Do you want to adapt the class for your own students? So there is no one way to teach certainly computer science and even CS50. Both back home and around the world, teachers like you really modified it as they see fit for their students. And what you'll find typically is that when you're teaching computer science or CS50 for the first time, you might indeed want to adopt the class, lean on us. So have your students watch, for instance, my videos or some of our shorts online until you get comfortable yourselves with the material. And then maybe later in the year or a year or two later you can adapt the class and make it your own doing what you agree with, not doing what you don't disagree with. And instead of having your students watch the videos, maybe just you watch the videos and then bring the same material to life yourself in the classroom. But before we dive into the why, allow me to thank all of our amazing hosts here at JIS. You met some of the Ministry last night. And a round of applause if we could for everyone who's made this [INAUDIBLE]. [APPLAUSE] Allow me to take a moment to in that same microphone to introduce, not just Guy and myself, but more of CS50's team, including CS50's own, formerly JIS's own Bernie Longboy. [CHEERING AND APPLAUSE] BERNIE LONGBOY: [NON-ENGLISH SPEECH] AUDIENCE: [NON-ENGLISH SPEECH] BERNIE LONGBOY: Is it [NON-ENGLISH]. AUDIENCE: [NON-ENGLISH SPEECH] BERNIE LONGBOY: I could never get that one right. [NON-ENGLISH SPEECH]. Welcome, so happy to have you all here. We waited for what? Six months, and super excited to have you all here today. So I'm Bernie, and I'm in charge of-- what do I do? outreach and partnerships. So really this big event is something that we all worked on, and we're really excited to kick off today. So again, welcome. And if you have any questions or anything, just look out for any of us, and we're happy to answer them. [CHEERING AND APPLAUSE] DAVID MALAN: And we next introduce CS50's own Carter Zenke, who has the distinction of running CS50 itself back home at Harvard with our 600, 700 students over the course of the year. Carter. [CHEERING AND APPLAUSE] CARTER ZENKE: Hello, everyone. It's so good to see you again. My name is Carter. And I [? lead ?] the courses lectures. I lead our sections, our recitations, our [INAUDIBLE] hands-on [INAUDIBLE] classes. I also get to work with our 80 teachers that we have at Harvard College who help teach the class. It's a big group. We are a big group here. And I love being part of that community. So it's exciting being part of that community. You all as teachers can grow in that way. So thank you [INAUDIBLE] here in [INAUDIBLE]. [APPLAUSE] DAVID MALAN: Allow us to next introduce all the way from New York City, Margaret Tanzosh who teaches her own classes of computer science for high schools. And has been wonderfully working with CS50 for years, adopting and adapting the class as she sees fit too. MARGARET TANZOSH: Hi, so nice to meet all of you. I am so excited to share what I've been doing in my classroom in CS50 for the past eight years. I was actually one of the first high school teachers to take on the course and do a combination of adopting and adapting and everything in between. So I'll be talking to you tomorrow a little bit about what I do my class like. And I'm [? asking ?] if you can now visualize how you want to run your class as well [INAUDIBLE] discussion. [CHEERING AND APPLAUSE] DAVID MALAN: I daresay he needs no reintroduction, but for those of you who [INAUDIBLE]-- [LAUGHTER] --allow us to ask Guy to introduce himself [INAUDIBLE]. [CHEERING AND APPLAUSE] GUY WHITE: Hello, I'm Guy White from Portland, Oregon-- [CHEERING AND APPLAUSE] --where are the weather is a lot like this today. It's raining there right now. I just want to say again, it is my pleasure to have worked with you. Truly, please, thank your family. You've just filled my heart. This such a blessing. Thank you so much, everyone. And I look forward to working with you over the next two days. [CHEERING AND APPLAUSE] DAVID MALAN: And we don't want to give them the mic because otherwise we'll stop recording everything. But not only are we joined by JIS's video team here, we also have Max, and Xochi and Rongxin. [CHEERING AND APPLAUSE] So indeed, the videos that we film this weekend we'll make available ultimately online. All of the photos that we've been taking out in the photo booth, we'll follow up with the URL so you can get our versions thereof. And all of the materials today and onward will be available on this website here, CS50.ly/indonesia, which will give you links to the slides, any code that we distribute, the agenda itself. So this is the URL that you should keep in your phone today and tomorrow, but perhaps after the workshop as well. As we forge ahead today, please, do interject at any point if you have questions and also during the breaks or lunch time tomorrow. Please, feel free to ask any of us questions that you might have. But thought I'd give you an overview of what we hope to do over the next couple of days as follows. So today, we are at that first white bullet, CS50 explained, behind the pedagogy. Between now and 4:00 PM, what we'll do is focus on that line of teaching CS50 the way that we do. We'll then take a 30-minute break. And at 4:30 PM we'll resume focusing on what we call back in Cambridge microteaching, giving everyone an opportunity to very comfortably, very safely, very experimentally teach something to some of your fellow teachers. And we'll explain after the break what that will involve. No prior preparation is expected. Maybe we should do this. Maybe we should teach bubble sort in all of the individual [INAUDIBLE] you can do that. [INAUDIBLE] explain what that's all about it. It's meant to really help you get any of the nerves you have out now because, especially if you're teaching CS50 for the first time or will have been a few months since you've seen your own students, it will be a much safer space, much more comfortable space to be nervous in among your colleagues than necessarily feeling that way in a few weeks or month's time in your classes. Tomorrow, meanwhile, we'll get started early. And over breakfast, we'll distribute a packet of puzzles. Some of you might know online that we have a tradition of CS50 Puzzle Day. More on that in a bit. So upon arrival tomorrow, you'll be provided with some food as well as some puzzles. Now, you don't have to solve all of the puzzles. You'll find that they're somewhat easy or medium or hard. But the goal is just to enable you to chat with more teachers than you came into this workshop knowing so you hopefully make a few new connections and friends and colleagues while having some fun solving the very types of problems that we'll make available to you in the coming year if you to run a similar event for your students. We'll then focus on teaching CS50 itself and actually experimenting with and talking about methodologies thereof. Managing a CS50 classroom, really a computer science classroom more generally, focusing thereafter on comfort levels. As you might know, within CS50, certainly back home where we have a lot of undergraduate students, we have problems for those less comfortable and more comfortable and somewhere in between too. And so what we'll discuss is exactly how you too, having students who might have been programming since they were six years old, and some students who don't even have access to computers outside of school, but you can balance those two different types of demographics. We'll take a break and do a working lunch with some Q&A followed by a hands-on opportunity to actually-- and this will be much more fun than being graded by the teaching fellows-- actually grading some sample work so that you'll get a sense of what is a 5 out of 5 for correctness, at least as we view it, or design, or style, and getting you to think about the teacher perspective of what you've just experienced for months as the students as well. We'll then have a round two of microteaching, an opportunity to improve on however later today goes. And ultimately, we'll be giving you an overview at the end of tomorrow, all of the resources that will be available to you from CS50's team, both now and in the coming months and years. And then we'll conclude with a presentation of your very own CS50 certificates and congratulate you and acknowledge you [INAUDIBLE]. [APPLAUSE] I do think the right way to think about CS50 as being OpenCourseWare, freely available open concept, is that you can indeed adopt it or adapt it. And to reiterate, adopt in our mind means lean on us heavily. Have your students watch me, watch Doug in the shorts, use our problem sets as is, use all our [? grading ?] as is until such time as you just feel more comfortable maybe making some changes or creating your own problems or presenting material your own way. Now, you could certainly do that from day one if you're already comfortable. But in general, adapting the course would be just that. Like any good teacher, using what you like or what you don't like or changing what you don't like in order to really make the class and your students' experience your own. And so that's generally how we frame the course. It's not some curriculum. It's not some textbook that you have to either use or not use. So do know that first and foremost. And those of you who have never taught CS before, are maybe coming from another field, maybe it's math. Maybe it's something completely unrelated. Realize and know that it is perfectly OK, and I would encourage you to just learn along with your students, especially those kids who are already a little more comfortable, maybe have been programming even longer than you. They're going to catch on if you're just pretending to know what you're talking about. And so no good will come from that. So I would encourage you to be comfortable feeling uncomfortable at times. And if you don't know some topic or some answer, just offer, well, we'll figure it out together. And indeed, that plays into really something that's a little unusual within CS50 or at least certain courses back at Harvard is consider, if you so can with your schools, using students as your own teaching assistants or teaching fellows, as we call them, or TAs. And by this I mean, if you already have that one or a few students who probably don't really need to be taking the class, but maybe it still fills in gaps in their knowledge, so it's not pointless for them to be taking the class formally. But if you already know that they're going to be the kid with their hand up or they're going to be the one getting 100% on the assignments already, consider, if you can, deputizing them, so to speak, so as to be in addition to you one of the humans walking around helping their classmates. For instance, we give some of our staff little lanyards that say CS50 that make clear that they are part of the team. So little touches like that, or name tags, or just knowing that this person or that is the teaching assistant for the class. That's an invaluable resource, truly, especially if your class is somewhat larger. You now had two humans or three instead of just one. So here we go. CS50 explained, behind the pedagogy. This is the why. Please, interject at any point. And of course, we'll make these slides available for reference thereafter. Thought we would present to you a few types of answers to why, namely on the courses languages, on the courses lectures, or really classroom curriculum, and finally, focusing too on some of the courses problem sets. So this is an image you might recall. It might still feel this way. This is a photograph of a [? half ?] down the road from Harvard and MIT, where some industrious students connected a fire hose and fire hydrant to a water fountain. And pictured on that sign there, even though it's very pixelated, is a the statement along the lines of, getting an education from MIT is like drinking from a fire hose, which is to say there's no way you're going to absorb or swallow all of the information at once. And it is a little bit forceful. But the point though, is that to expect this from the get go means that you can indeed be comfortable feeling uncomfortable throughout the course. It is not the expectation, even of our own students back home, that they'll master each and every topic, but that they'll have that exposure. CS50 is indeed meant to be this foundation for, this introduction to computer science, not necessarily something that's going to come naturally to all students the very first time that they dive into it. So with that said, why do we use the languages that we do? Because CS50, as you might have gleaned, is already a little different from many introductory courses, most introductory courses, which are typically a Java class or a Python class or a C++ [INAUDIBLE]. They are very language centric. And we're not, because over the course of 12 or so weeks we, of course, go from Scratch to C to Python to SQL to HTML, CSS, Java. It's very fire hose, right, on my fingers. It's a lot. But what's the point? Well, very early on when I actually started teaching CS50, the course was pretty much only taught in SQL. Though there's a little bit of a language called Ruby at the end. But students would exit the class, even when I took it 20 years ago, with the mindset that they learned how to program in C. And so it was rather exclusionary to them understanding or diving into other courses or other languages because they had learned C. They hadn't learned computer science, and they hadn't learned how to program period. And so among our goals with this suite of languages is twofold. One, to make sure that students do feel that they learned how to program period. Or if we want to qualify it, they learned how to program procedurally. So not so much object-oriented stuff, not so much functional stuff, if you're familiar with these terms, procedurally programming. And this is the type of languages we've generally introduced. But beyond that, among our goals in CS50, is to ensure that it's a foundation for students taking computer science for the very first time before they go on to higher level classes and more computer science and programming so they're prepared for it. But at least back home at Harvard, half of our students never take another CS course before. And we know that going into it. And for those students we felt that it's very important that they not only have the conceptual mindset of a computer scientist, they know how to process information and think about problem solving more effectively, but they also have some practical skills that they can bring back to the arts, humanities, social sciences, physical sciences, medical sciences, and the like. They just have some practical programming techniques. And so while we start with this terminal window using C, and we end with more of a familiar paradigm, namely of course, web programming that's also increasingly used-- thanks to HTML, CSS, and JavaScript in the mobile world as well. So the students are prepared to never again take a CS class, but at least to continue to teach themselves new languages. So why Scratch? So back in 2007, one of the first changes we made when I took over the class was changed the class from introducing-- no joke-- assembly language in the first week of the class to Scratch, which is dare say the complete opposite. And even though you might not know much assembly yourself, if you think back to week two, we talked about this. And we showed the very scary looking code that wasn't even 0s and 1s. It was almost scarier and more cryptic. But that's still with us today, and that's a worthy topic for computer science or engineering students to learn but maybe not on the first day of class. So Scratch, for us, is really meant to introduce these ideas, these building blocks to students. By the way, this is fun, and better yet, in a way that they can share it with their roommates or send a link back to their parents back home and delight in what they've created very visually, very graphically, without the stupidity of semicolons and parentheses and curly braces and stuff that is just not intellectually interesting. Certainly, something you have to get over eventually, but again, not on the first day of the class. And so it's very deliberate, as you might recall, from our own week 0 and week 1, that when we introduce this as the first program that someone could write in Scratch, we then tease students with this code, which, my god, that escalated quickly. But then if you think about what you can do with these visuals, we briefly color code it. So now, everything that's orange has to do with the green flag being clicked. Everything that's purple has to do with the save block. And yes, it looks ridiculous. It's not going to be obvious what most of those symbols do. But that's not the point, certainly on the first day. This program, of course, still just prints out, Hello, world. And then of course, we translate it to the actual Scratch blocks so that in the subsequent week 1, as we call it, now students hopefully have a mental model where they're comfy with the idea of functions and conditionals and loops and maybe a few other ideas like variables and more. Now we can literally side by side compare the two so that if you're comfy with the program you wrote just having the task say, Hello, world, OK, it looks a little harder to master now on the right, but it's just the same idea. So the syntax will come, but the ideas are the same. Same thing here. On the left here, we have an if, else if, else statement in Scratch. And of course, it looks much scarier to a student unfamiliar with textual code, but it's the same idea. And so pedagogically the motivation is to really assure students that it's fine if you don't quite get all the syntax or you make stupid typographical errors. What's important is that you understand this, and you'll get, with practice, more comfort with this. And of course, we can do this with loops, and we can do this with so many other different features, including transitioning. And this too is delivered mid-semester in week 6 from C to Python. You might recall that we use the same kinds of slides where I pulled out the exact same pictures of Scratch blocks but then showed students how we would translate it to Python as well. And this [? isn't ?] very intentional. Among our goals with CS50 too in teaching these different languages is to show students that you don't need to take a whole course on Python to learn Python. Now, that might accelerate your learning, and there is something to be said for learning from an expert in the field who might be able to structure your lessons. But in reality, they're probably not going to take courses endlessly in the future. And so all the better if we can give them some discomfort now looking some things up online, looking at some slides, googling for some answer as to how to do the syntax, but making clear to them that, even after three, after six months of CS50, you've seen most of the ideas out there. And you just now need to translate them to some different syntax as well. We introduce beyond those languages, of course, SQL for databases. And here is where I think teachers, among them Margaret and others, have made different decisions as how to structure their classes. So SQL we introduce so that students have a real-world database that they can rely on. And nowadays, data science and statistics are increasingly popular. So this is just a really useful tool, especially for those students who never take CS again. And we use it so that at the end of the term, especially when we introduce web programming, students just don't have to use a CSV file, which would work for small websites. You could read and write data, but it's not the right way to do things for any decent number of users. So we introduce students to at least the simplest flavor of SQL, so not my SQL anymore or [INAUDIBLE] or, god forbid, Oracle or the like, but rather just SQL lite, which shows all of the ideas of the language but also helps students get the job done on the web or in mobile environments too. We introduce HTML, right? This isn't going anywhere. Like it or hate it, it's being used now for the web, of course, but also for mobile applications increasingly, especially since in this room some of you might have iPhones. Some of you might have Android devices. That means twice as much labor for a company or an individual developer to make if they want to have an app that is cross-platform. So increasingly, you're seeing, even though we don't talk about this in CS50 much, but you're seeing HTML, CSS, and JavaScript being used. So you write the code once, and then you just put it in a different type of rectangular window, if you will, so that it works on both Android and iOS as well. So we introduce this though, again, so that we could off-board students at the end of the semester to an environment that they can actually build real world tools with. Of course, we introduce Flask, which I think is probably the simplest of the Python frameworks that doesn't abstract too much, doesn't get especially bloated, like I think Django gets, especially if we just have a week or two to introduce it. And this of course, is how we introduce students then to writing code but now interacting with users via HTTP and the like. And as for tools, of course, we've introduced, over the past two years now, Visual Studio code, implemented by way of GitHub code spaces in the cloud. For us, this too is very deliberate. Code.org has their own platform. Many of you might have used Replit or certain other platforms out there or even client side IDEs, like Eclipse or NetBeans or the like. It's deliberate that we use VS Code insofar as it's a very general purpose solution. It's not one language specific. It's also free, which is great. It's also very popular nowadays. And certainly among US tech companies and increasingly internationally, it's just VS code [INAUDIBLE] development environment of choice because it's so extensible by having extensions and plugins and the like. And so this is deliberate too that we want students not using a toy CS50 specific environment such that when they finish the class they have no idea how to write code. But rather, they use this in the cloud. And then at the end of our term, we try to off-board as many of our students as we can by giving them instructions and videos for learning how to install Python and VS Code and anything else they want on their own Mac or PC. It's still a headache even a few months into the class, but it's not like a barrier on day one when they just want to write Hello, world, but they can't get Python working in their Windows path or something like that. So it's literally start in the cloud but try to end in the local Macs and PCs. Any questions now on this whirlwind tour of our use of languages and tools and why? AUDIENCE: Questions [INAUDIBLE]. DAVID MALAN: Yeah. AUDIENCE: [INAUDIBLE] about [INAUDIBLE]? DAVID MALAN: Ah, sure try me and I'll defer it if its two specific. AUDIENCE: I was thinking about [INAUDIBLE]. Is it like [INAUDIBLE]? Or is it [INAUDIBLE]? And then [INAUDIBLE] DAVID MALAN: Sure, a really good question about the capacity of a SQL-like database as it relates to something like Google Drive. The capacity of a SQL-like database completely depends on the device that your storing the database on. As you might recall from the end of the class, a SQL-like file is usually [INAUDIBLE] in something like dot dB or even dot SQL lite. And that's literally just a file, a binary file made with 0s and 1s that might be 0 bytes if there's nothing in it yet. That could be a megabyte if you've got a few tables and rows. Could be 100 megabytes if you've got a lot of data. So the only limiting factor is what's available on your own Mac or PC or Android or iOS device. AUDIENCE: I have a question. DAVID MALAN: Other questions on languages. AUDIENCE: [INAUDIBLE] to make SQL [? lite ?] by sending some [? technical ?] [INAUDIBLE] as easy to write code [INAUDIBLE]. And can we use [INAUDIBLE] for our student [INAUDIBLE]? DAVID MALAN: Yes, absolutely. So you can, in fact, use code.CS50.IO, which will lead you to the same environment that you've all been using as students the past several months. Your own students can use the same. There are also other ways you can use code spaces even independent of CS50. And what we'll do in the coming weeks is we hold a Zoom-based tutorial for those who want to see other ways of using these same tools. You can actually use code spaces itself as a teacher for free because of grants that Microsoft and GitHub provide that essentially it gives you more control over the student's experience. Whereas, code.CS50.IO automates a lot of things right now. So both options. AUDIENCE: Including all the [INAUDIBLE] class. DAVID MALAN: Yes. AUDIENCE: In C or Python. DAVID MALAN: There is nothing you have just experienced in the past six months that you will not continue to have access to. [CHEERING AND APPLAUSE] So allow me to transition now to the more curricular side of things. And as you might know from the videos, we tried within CS50 on that beautiful stage that in Sanders create as many memorable moments for students as possible. And what this means is just trying to bring the material to life in ways that PowerPoint slides do not belong or just talking about the material or having students read a textbook. It doesn't necessarily mean that these memorable moments and these physical demonstrations are showing or introducing any more material that you couldn't introduce via those other technologies and techniques, but that you're creating, hopefully, this visual, like the eight or nine of you who came up. You will never again forget how not to do bubbles sort perhaps, like [? leading ?] that demonstration. Until then, we actually did it with the one final way. And so the goal is just to give that visual that persists long after term's end for many more months, maybe even years. And we don't do that for every topic, of course. Otherwise, we'd be here forever. But we try to do it for some of the most difficult topics or at least those topics that lend themselves to theatricality, so to speak. And so I thought I'd share with you a few screenshots in a few slides that explain why we did things this past year the way we did. So with that said, the first and foremost, maybe most memorable for students, tends to be our implementation of binary search at the very beginning of the class. So here is me in a very awkward screenshot, tearing that phone book, which admittedly are getting very hard to find, so much so we tried to find one here in Indonesia, and we could not. [LAUGHTER] But they're even hard to find back home too. But this is an example that, honestly, after 16 years of teaching CS50, some students, alumni still come up to me and mention, oh, I still remember when you tore that phone book. [LAUGHTER] There's something to be said for certainly the memories that instills but also just the idea. Those students, hopefully, will never forget the essence of binary search. They forget the term, the essence of dividing and conquering a problem by dividing and dividing and dividing again. And so when you have access to props like this or anything, any collection of paper that you can tear this way, consider doing it to bring that material to life. Vary it up. Sometimes I have students come up onto the stage, and I have to whisper into their ear that you have to want them to tear the phone book. But for now, that just allows you to create all the more visuals for your students to latch on to even as they might struggle with those same topics. Something like Scratch, meanwhile, so Scratch has been meant again to be this practical, fun, accessible opportunity to bring material to life. And even though some of your students might have already used Scratch or Scratch Junior as kids in school or at home, it's still an opportunity to elevate it intellectually to make clear that it's not just a game or something to poke around with. It is computer science. It is an example of programming, certainly, that's much more accessible than what they're about to see weeks later. And here too, we have fun, especially in that first class, where if you're trying to convince students who might not necessarily even consider computer science for them demographically, academically, or otherwise, Scratch is just a nice way to put everyone on the same playing field. And you might remember from week 0, it's great when you can get students literally jumping on stage and implementing this. Recall that I think he was trying to hit the Whack-a-mole, so to speak, as we say in English, where the thing was moving up, down, left, and right. So just this idea too. It's not maybe as high information content as something like tearing the phone book for binary search. But it's just fun. It makes students want to be there. It makes them want to come back the next day, and we particularly do these kinds of things at the beginning of the class as students are trying to figure out if this is indeed a world for them. With that said, binary itself, of course, is something we talk about early on. And this too is an opportunity to bring students up on stage. So here, for instance, didn't have paper. We actually had found plastic numbers with light bulbs that lighted up. And we had our students represent the 1s place, 2s place, 4s place, and 8 place in a way that just allows us to get some audience participation. And really, pedagogically, for the students in the audience or the puppets in the audience-- [LAUGHTER] --to see the students on stage as themselves sort of imagining what would I do in that student's position? So they're engaging a little more actively within than in just listening to someone like me talk about these kinds of ideas. So debugging, we quickly transition to now our week 2, and we tell students about print f and print later in Python. We introduce them to debug50, which is CS50 specific, but all it does is automatically open the built-in Visible Studio Code debugger. So that too is not CS50 specific, but we make it a little easier to use. And then of course, we introduce them to, in our case, a seven-foot rubber duck standing on stage, an inflatable duck in this case. These are sometimes-- well, actually, they've gotten very hard to find at that scale. But we also have, of course, these tinier little ducks that we actually give out to students. And they don't even have to be that big. You can find online or you can make ones [? own ?] out of paper or the like, tiny little ducks. The goal is to give students recall some inanimate objects, something cute, something memorable just to put on their shelf so when they don't have a friend or roommate or teacher available to answer questions, they can just start talking through their ideas. And there's a reason that we do this to steer into this. And this is kind of ridiculous that we have this seven-foot duck among all our teaching supplies. But the goal is to just normalize this, not just to tell students, hey, go find something inanimate to talk to. But to say, hey, if I can stand there for three hours in front of this goofy duck, you can certainly try it as a debugging technique. And some students do take that to heart and indeed attest that this little guy proves helpful for them sometimes because they just hear the illogic in something they're saying, and the proverbial light bulb goes on. How about now arrays? So arrays are one of the first data structures that we introduce students to, specifically in C in our case. And we introduced them initially in the abstract like this. And you might recall too that [INAUDIBLE] even more of the computer's memory. But we try to focus on just a few bytes at a time left to right. And from this though, we try to connect it to something metaphorical, like closed doors. Like in the US, it's very common to have hallways filled with lockers, where the kids can put their books and their backpacks and the like. And so we try to give them that mental model to latch onto like they used to have maybe in middle school or high school. And now some years, most recently this year, we were fortunate to find, let's see, seven actual lockers. These aren't even the big ones, though they're not fun to move across campus, seven big lockers. But the point is that the door is closed. You can't see all of the numbers at once with this bird's-eye view. You have to deliberately index into it one at a time. And this too, of course, involves not just me but a student potentially coming on up to act this out, lending itself to that memorable moment. But this is the perfect example, too, of things where it doesn't need to be as high budget as this. The fact that I brought paper today with those numbers is exactly what we used to do back in the day. We might just have the students turn it around. When it's closed, they turn it this way. So even though we're fortunate in Cambridge sometimes to have seven-feet ducks and seven of these red lockers, paper and pencil and tape is all we used in my first several years of teaching CS50 because that's what I had in home or we had there on campus. So all of these examples are meant to be quite accessible. Now, they didn't know we were going to do that demo at first. So here's a discussion of bubble sorted selection sort. Here, of course, we have those same plastic numbers that we used back home, but paper certainly suffices for this too. But this is an opportunity, again, to get the audience viewing themselves as maybe thinking, my god, thank god I'm not up there on stage doing this. [LAUGHTER] But they think to themselves, how would they do that? Or just like you all were wonderfully yelling like a game show up here, just rooting for the participants to actually sort themselves properly. That is probably a memory that will not leave you, will not leave them for some time. And I daresay, it's a lot more fun to have that memory about something as arcane as bubble sort or selection sort. These are not topics that you go home and tell mom and dad about all that commonly. But you might tell mom and dad and your friends about what you did in your CS class today when this sort of hilarity but educational presentation came to life in this way. Now, merge sort, recall, was harder than those two algorithms too. And it's especially harder for students to wrap their mind around what's going on. And we often try different techniques. So while I talk about it, for instance. And I might show the pseudocode. I might then pull up one of those web-based animations with the graphics or the YouTube video that's showing it. That's deliberate too because some students are very visual learners. Some are very audible. Some are very intellectual about it. And so by just trying 1, 2, 3 different approaches, hopefully, we're getting most of the students on board. With this example here, this is just a metal shelf we put together. This allows us to convey very visually the merge sort that the key to its speed is you have more space. And bubble sort and selection sort just use in-place swapping here. We only need as many bytes if we had people. But merge sort, you need at least twice as much space. Now, just for convenience, I actually use four times as much space in this demo. But I could go down, up, down, up as I do those merging. So this too, having a couple of shelves is certainly something that should be discoverable most anywhere. We talk about issues of scope, for instance. Recall that the issue of scope means where can you use the variable? And the short answer, at least in C is, if you declare a variable inside of curly braces, you can only use it inside of those curly braces. You can't use it in some other function or file. So we talk about scope before a lot with students because of our discussion of memory. But at that point, as well as for our solving algorithms, we need to be able to-- for our sorting algorithms, we need to be able to swap values. So you might recall that we really focus on swapping things. And this is a demo I've always liked where we actually use glasses of water. We get some food coloring. Just choose two different colors that ideally are visible by students, especially with color blindness. So you want to choose those carefully. And then you can have fun with this, as you might recall, like don't give the student three glasses at first. Give them two. See what happens. One year, it was funny. When I did this, the student just got a little creative. And she just went like this and moved them slopping them. It's not really what I meant. We wanted them to, of course, pour it left and right. But this is a fun example too. In case your mind is racing, I also thought I'd be really clever one year because it turns out-- we don't teach this now in CS50-- using bitwise operators. If some of you are familiar, there's an operation called XOR for exclusive or, which allows you to operate in C on individual bits, not just integers or chars or the like. You can actually swap two values in C, if you're clever, without needing a temporary variable. You can use this other operator that we don't use currently in CS50, but it's a pretty cool trick. And so I thought, years ago, that I'd try to simulate this by being very scientifically clever. And so I used one glass of oil and one glass of water because I vaguely remembered from chemistry class that these two things shouldn't mix. Of course, it mixes but messily. We got some bubbles, as I recall. So I was trying to prove-- to be very clever, pour one into the other then dump the other out. It didn't work, so sometimes these demonstrations backfire. So another moment I would encourage you to do is to test things in advance, not in front of your students. But again, that too just lends itself all the more to a memorable moment. Well, what about memory itself? In the US, we very commonly have on long roads these kinds of mailboxes. So they all follow a similar shape, and so it's very familiar to students. And we use these as representative of how we might store values. Now, these I did happen to go to the local hardware store. But you could mimic this with a picture thereof or just a cardboard box of the like. And so we use this to give students just a more concrete visual of what we mean when we say an address. We can tell them it's like a mailbox address, but there's a little something special or more memorable about showing that actual thing. And what I do too is you might have, at least in American football games back home, as we discussed pointers, these foam fingers tend to come out, maybe in soccer games as well around the world. You're like, you're a number one. We just use it as a big pointer, not to say we're number one. Rather, the value is over there. So this is just again a silly visual that we're very careful to choose our school colors and the like, whereby this pointer, p, might be pointing at some other value, some number, like n over there. So just acting things out, taking a few moments to do exactly that same thing. But at the same time-- and this might have been a discomfort for some of you-- would you get very low levels sometimes in CS50. And this is deliberate. In fact, one of the reasons why we don't use just Python in the class is because I think it's a really missed opportunity for students to understand at a lower level what's going on inside of a computer. And if you only learn Python and that's the only language you ever learn and then use, you can use a list. You can use a dictionary. But do you ever really understand what it is? Maybe conceptually at a high level. But there's something about, I think, pedagogically just showing students what's going on underneath the hood. It [? don't ?] abstract everything away, that they'll get it. Even though it might be very technical-- and pointers are a hard topic-- the result is like, wow. That light bulb does go off when in one line of code in Python you can re-implement the entirety of your speller problem set code in C. And so that too is very deliberate to not be fearful of just going into the weeds sometimes with students. So for instance, here is the very technical, pictoral way of describing a pointer p, storing the address of some value n, storing the specific number 50. But again, we can abstract that away with a number. And then at that point, is when the foam finger comes out in class, and I start pointing at it between those two mailboxes. Later on in the class, too, you might recall this demonstration, and there's so many good little videos like this on YouTube and other universities websites. Look for these things, and hang on to these things. Share these kinds of things with each other. This, of course, was Vicki, as I recall, made by a friend of ours at Stanford University, like in his basement with a little cardboard box and some clay that acts out of what can go wrong when you actually use pointers incorrectly. And then toward the end of CS50, we introduce more sophisticated topics, data structures, like hashing. So recall that hashing means you take as input some value, maybe a person's name, and you decide what bucket it goes into. Like this is the A bucket, the B bucket, the Z bucket. Or what we choose is, I went online and I looked for playing cards like that you might gamble with that I thought it would be more fun and more visual to search for jumbo playing cards. And so we indeed have these 18-inch cards that I can use very visibly in the class. We literally went to the hardware store and got some buckets that looked like this. And we introduced students to hashing by literally bucketizing the values. And that's a technical term a lot of engineers would use, even though it's a little abstract for students. But if you use actual buckets, you decrease that gap between the idea and the actual incarnation thereof. Lastly, among topics, maybe race conditions. Now, this is where things really get sophisticated in an introductory course. And as we tell students, CS50 is really a combination of what in the US and in many countries is called CS1 and CS2 combined because we introduce students to software-based programming. But we also touch on data structures and algorithms quite a bit that many schools separate into two separate courses. So by the end of the class, we're nonetheless talking about very sophisticated topics like this that often come up in databases, be it SQL-like or otherwise. So here is the tiniest refrigerator we've yet found. We were fortunate a couple of years ago during COVID, we were collaborating with some friends at the theater on campus where they had a whole warehouse of actual props that were used in plays and musicals that had been used on campus. So in some years we've used an actual refrigerator that was as tall as me. It turns out it's a lot easier to carry around a foot-tall, plastic refrigerator here so as to paint the same picture for students. This, recall, was the scenario in which-- what had I run out of if you recall? AUDIENCE: Database. DAVID MALAN: Oh, database, yes, but what was I pretending to run out of and I needed to go to the store to get more of. AUDIENCE: Milk. DAVID MALAN: Milk, yeah. So I picked a beverage and said I was out of it. I had to go to the store to get it. But if I don't leave a note or if I don't lock the database, my roommate, for instance, would come home, open the variable, if you will, and inspect its value, make a decision based on the exact same value as I did. And that's when a race condition arises because one of us is going to come back first. The other is going to then arrive, and then we have too much milk. This is exactly what happens in the world of databases. And in fact, I actually learned this topic myself. And a former professor of mine gave us this example of a refrigerator in an operating systems class that I took 20 some odd years ago. And so here's an opportunity too, I think, to not be scared of or disinclined to even introduce students to advanced topics. I think especially if you can base it in something metaphorical, something physical, something theatrical, if you will. So that's a whirlwind tour of just some select topics as to the [? line. ?] AUDIENCE: No. [INTERPOSING VOICES] DAVID MALAN: What? No? No way? [LAUGHTER] It is so much better being a teacher than a student [INAUDIBLE]. [LAUGHTER] But if there's any questions on those memorable moments or the why, I am presenting topics like those. These are meant to just be examples to get you thinking. Certainly, you've spent the past six months on all of the topics. Yeah. AUDIENCE: So last year my class [INAUDIBLE] they thought that it would be easier [INAUDIBLE]. DAVID MALAN: OK. AUDIENCE: [INAUDIBLE]. Right now, I'd also like [INAUDIBLE] see the [INAUDIBLE]. What do you think [INAUDIBLE]? DAVID MALAN: That's a good question. For those who couldn't hear, you've started with save. You then switched to Kotlin so as to introduce object-oriented programming. Then you switched to Python. And so the question is, should we maybe go back to C? Should we continue using Kotlin? I think it depends on the goals. Kotlin is particularly conducive to mobile apps nowadays, at least that's what Google, for instance, has been pushing in that space. And everything is in object, really, in that space now, unlike Java. So I think that's helpful if you want your students focusing on mobile in particular. AUDIENCE: Yeah, because for the second year they have to [INAUDIBLE]. DAVID MALAN: OK. AUDIENCE: [INAUDIBLE]. DAVID MALAN: And I think this is where I'll be careful too because I think in the world of programming languages, it's very much a religious debate as to which language is best, which you should use. But I would say that, if you introduce students first to C, a very common next language would be something like C++, which isn't technically a superset but does add additional features on top of C. So for instance, you could spend maybe less time, maybe in this first class, introducing students to C. And then maybe in the last week, the last two weeks, last four weeks, whatever seems appropriate curricularly, you could say that, well, structs in C only get us so far because there's no functions or methods built into them. So it turns out you can use this other language, which is almost just like C but has classes. And you can make these objects. So you can start to bridge one or the other without completely changing syntax from one to the other. Or instead, if you liked your experience with Python and maybe you still start with C, you could focus more on the object-oriented aspects of Python. And so for instance, some of you might know. We actually have a class in CS50 called CS50P, CS50's introduction to programming and Python. And we spend like an entire module on the object-oriented aspects of OOP in that class. We don't touch it in CS50. So I think I would decide based on what you want-- where you want your students writing the code. Like if it is a mobile app, then maybe just focusing really on-- Kotlin. Make sense? AUDIENCE: Yeah, [INAUDIBLE] and [INAUDIBLE]. DAVID MALAN: OK. AUDIENCE: So [INAUDIBLE] then [INAUDIBLE]. They have two [? markers ?] [INAUDIBLE]. So [INAUDIBLE]. DAVID MALAN: Gotcha. AUDIENCE: [INAUDIBLE]. Right now, [INAUDIBLE] because-- DAVID MALAN: I think, if there's no one right answer-- and I would encourage you as a group to, like during today's breaks, tomorrow's lunch, and [INAUDIBLE], have that chat and solicit more opinions than just mine. But those are the kinds of thoughts that I would bring to the conversation. Yeah. AUDIENCE: What is the reason behind [INAUDIBLE]? DAVID MALAN: Well, which aspect [INAUDIBLE]? AUDIENCE: [INAUDIBLE]. DAVID MALAN: Oh, the Harvard preps video. OK, so you might recall in week 8 we showed the prank that Yale did on Harvard by having us hold up an offensive sign to all of the guests. So the motivation for it really was, one, safetyschool.org recall was one of the domains that we played with. And I ran the command that showed us that safetyschool.org actually issues an HTTP redirect to Yale.edu. And that's kind of funny, I think. But the catch is because we in CS50 back home also had Yale students at Yale University, not quite fair if we only pick on one. So I looked up a similar prank, and that one was maybe the best prank put on Harvard before. So we introduced that as well. That is certainly something you can omit, especially if your students don't care about Harvard or Yale. But the motivation was to make it an even playing field and picking on both. Yeah. AUDIENCE: Yeah, OK, [INAUDIBLE] amazingly both [INAUDIBLE] CS50 is [INAUDIBLE], yeah? But what is the story behind the [INAUDIBLE] [? episode ?] so I am so [? sorry. ?] DAVID MALAN: OK. AUDIENCE: I thought of the [INAUDIBLE], and [INAUDIBLE] or [INAUDIBLE]. And [INAUDIBLE]. And I think, I [INAUDIBLE] it starts [? out ?] of there are a [INAUDIBLE]. There are [INAUDIBLE]. There are [INAUDIBLE]. There are [INAUDIBLE]. How is CS50 [INAUDIBLE] make a good [INAUDIBLE]? And it's [INAUDIBLE] won't be the problem. DAVID MALAN: Sure. AUDIENCE: No [INAUDIBLE] never has a feature [INAUDIBLE] the this problem set [INAUDIBLE]. DAVID MALAN: Oh, yes, of course, you can and should use-- AUDIENCE: Can we adopt or take the problem set and [INAUDIBLE] problem set to [INAUDIBLE]? DAVID MALAN: Thank you, and yes, the answer to all questions like that would be yes. The material is yours to use as you see fit. [APPLAUSE] And what we'll discuss actually tomorrow in more detail is just how many problems are available, some of which are used for CS50 for teachers. There are yet other labs, as we call them, or practice problems. And you're free, certainly, to use some, all of those, none of those, and really adapt them to your own students. And in fact, Margaret, tomorrow will talk about her own experience with her students changing the schedule of the class, picking and choosing some of the problems more so than others. So more of that to come. And in fact, it's a perfect segue way to what I thought I'd propose is just some of the motivation behind some of those problem sets that you kindly note. So the very first you might remember is really one of my favorite games from my own childhood, even though I'm showing my age, and perhaps now yours, is the fact that this is a very two-dimensional game versus what kids have nowadays. But Mario is with us in many forms. But this is an example of a problem where you have to make that half pyramid using like hashtags and ASCII marks, if you will. And this is an example of a problem that could very easily be very boring. If you just ask students to print out a pyramid with these hashes that looks like this. OK, but there's something more, I think, and something special about just giving them something to latch onto, that it's not as simple and boring as a black and white pyramid made out of hash tags. But it's like the beginnings of this game that they might know or already love or something familiar to them. And so almost always, when Carter and I write in courses problem sets, we try to find that hook. It's not enough to come up with the code. It's like, what is the angle? What is the image we're going to put at the very top of the problem set? What's the silly YouTube video that's just there for fun to click on, to motivate you with some music or some TV or some movie clip or the like, just something to make it very real and fun, even though it's like fun for Mary Poppins. A spoonful of sugar makes the medicine go down. Actually, incorporating just a little bit of fun for a problem set that is still just for loops, just code that does this, which in and of itself might not be nearly as engaging. So Mario is sort of representative exactly that mindset. We also-- and not all of you might have done this-- there's the more comfortable version of this problem where we take the same idea. And it's still going to involve some for loops and maybe some conditionals that will make it a little harder. But it's the type of problem where it's just kind of turning the knob a little bit. It's not making it crazy difficult in that week 1 of the class. But it's kind of difficult for many students to figure out, OK, it's very easy to do this. Probably pretty easy to do this. Starts to get a little annoying to do this in the middle. You have to think a little harder. And that's exactly the point. And so this is why we have more comfortable versions of some of our problems is so that students who are very uncomfortable, have no prior programming experience, we want to give them a very low floor. So it doesn't take much to get into the class. But for students who have been programming for a while or think they've been programming for a while and they're just more confident, justly or not, they have sort of a higher ceiling, so they don't walk into the same room and have no room to grow. But the ceiling is higher for them, and that's what we mean by these more comfortable problems. So a low floor for less comfortable, but a high ceiling for those more comfortable. And so Mario captures exactly that idea at the start of the class. Anyone recall? Very [INAUDIBLE]. [INTERPOSING VOICES] DAVID MALAN: We're not [INAUDIBLE]. [INTERPOSING VOICES] --CS50, but this is an example in week 2 of the class where recall we introduced arrays and the beginnings of memory and data structures. And it's very easy to make arrays and conditionals and loops boring. And I honestly daresay from my own experience textbooks are very good. Many textbooks are very good at making things boring. But if you contextualize that same problem and find that hook, all right, well, all we want students really to practice this week is strings but treating them as arrays. How could we actually make those strings interesting? So it occurred to us some years ago that, why don't we turn it into an example of cryptography and encryption and have a narrative around it and bring the excitement to students even though, at the end of the day, they're just writing for loops and conditionals. But hopefully, they're getting better at those building blocks at the same time. Now, we transition in week 4 to imagery, and you can't escape the popularity of Instagram and TikTok and similar platforms around the world nowadays that have filters that change the colors or do fun things with labels and the like. And so we use this is an opportunity, of course, to introduce low-level for idle IO, input and output, reading a file, changing it, and the like. We deliberately choose the simplest file format we can for images, like a BMP file, even though no one really uses them much nowadays. But a BMP file's way simpler than a JPEG or even a ping, PNG. So we use bitmap because it has a very well-defined structure that we introduce students to. And of course, if I advanced here, now it's in black and white. Now, we've detected all of the edges. And even though this too is a bunch of loops but it's also a bunch of functions because this is one of the first problems where we now give students distribution code. And so we imagine the class, [? too, ?] is this notion of scaffolding, much like you're doing repairs on a building. You start to build up those metal platforms or wooden platforms so that the humans can go up and up and up and work on the outside of the building. Scaffolding, for us, really means, at the beginning of the class, we really just give students an empty file because we really want them to go from nothing to something. But if they have to start from scratch every week-- no pun intended-- there's only so far they can go in just seven day's time or maybe 14 day's time. So eventually, we do introduce them to library code, like the CS50 library, and thereafter, distribution code, like code that we write in comment that they should read and understand. But then we have them start filling in blanks, helping them realize how they can start to structure bigger, more sophisticated programs without spending a month implementing that program. If we had a month, I don't think that would be a bad approach. But if time is limited, we pick and choose exactly where we want our focus to be. So with this image problem set, so we focus on exactly that, the manipulation of files but still using those same primitives. This demarcates the start of what kind of file? AUDIENCE: [INAUDIBLE]. DAVID MALAN: Say again. AUDIENCE: [INAUDIBLE]. DAVID MALAN: [INAUDIBLE] that. AUDIENCE: [INAUDIBLE]. DAVID MALAN: Not RGB. AUDIENCE: [INAUDIBLE]. DAVID MALAN: It's hexadecimal. AUDIENCE: Hexadecimal. Hexadecimal. DAVID MALAN: I'm not sure I'm hearing the file format. This is not a bitmap. It's a? AUDIENCE: JPEG. DAVID MALAN: J-- oh, I heard it over here. JPEG. It's a JPEG. So these are the first three bytes of any JPEG, like a photograph that you might take and store on a digital media card, much like our own recover assignment. So what these numbers are-- don't worry. If you've already forgotten what hexadecimal is, that's OK. But the point is that-- and this honestly was the best slide I can come up with for recover, which is really hard because you can't see what you're recovering until you recover it. So this is just meant to trigger a recollection of that recover problem set, which for me was actually inspired by real life. So like 20 years ago, a friend of mine had a digital camera before we were all carrying phones. He had a proper digital camera with a compact flash part and the like that somehow got corrupted. Something went wrong, and he lost like 100 or 1,000 photos, something significant. And so he and I figured out by doing some googling and poking around that we can actually write code in C to do exactly what you all did with recover, which was to iterate over file, top to bottom, left to right, looking for that pattern. And just with high probability, if you see that pattern, statistically, odds [INAUDIBLE] means, oh, there's one of my friends JPEGs, there's another, there's another. And I think we recovered like 97% of his JPEGs this way. A few years later, I took overseas CS50, and we introduced exactly the same problem set. And I actually tell that story to students often to make the point that some of these problems are actually real-world solutions. And funny enough, after 16 years, I've gotten multiple emails from alumni, former students, who wrote to thank us because they too accidentally deleted some files, or they had their memory card get corrupted. And they literally used their problem set [? for ?] code to recover their own photographs, which does not happen for everyone, certainly. But it, again, attests to just how real world some of these problems are. We try to introduce students to other domains. So you might not know, and I'm not very good at biology. But last time I studied biology was in ninth grade in high school. [LAUGHTER] So thankfully, I leaned on a former colleague, Brian, to help with this. So you know from the [? Walthers, ?] this, of course, is an example of our DNA problem set. And this too is intentional. We try as much as we can, even though we're a computer science class, to intersect our ourselves with other fields. And I am not an expert in most other fields, but this is why I ask lots of questions of colleagues or teachers like you when we do workshops like these just to get the germ of an idea because odds are, if you've been teaching for a few years, sometimes you don't need to hear a whole lecture, ironically. You just need to hear that one sentence, that one thought, that one picture, and you're like, aha, I can turn that into a homework assignment. And so we're constantly on the lookout for that from other fields, talking to friends in the math department, chemistry department, humanities, or the like. And then lastly, of course, is-- [LAUGHTER] --problem set 9. I actually checked. If you bought Netflix stock at the moment we shipped this problem set, you would have made money in the past few months. And funny enough, I've looked back. Years ago, we used to use what are called penny stocks, which are very low-price stocks that generally mean the company might go out of business. But funny enough, we had this map years ago. Any time you chose, not Netflix, but penny stocks, they always went way up. And it would have been this fascinating experience to actually buy your own stock. But in this case, we got lucky again with Netflix, but this is meant to be the final problem set for students that serves a couple of goals. One, it's meant to introduce them to web [INAUDIBLE] so that at the end of the class, if they never CS again, they have the ability, not just to write programs in C in a black and white terminal window, but full-fledged applications using common, nowadays, technology. But it also pedagogically is meant to be, and as it might have been for many of you, a starting point for their final project. Most of our students back home in Cambridge who use a web-based final project, start with their own problems 9 code, or they go back to the original distribution code. They delete all the stuff that's specific to finance or the API and the like. But they keep the overall structure and then use-- they start changing things. And that's exactly what a aspiring programmer should do is stand on the shoulders of libraries and maybe things they've seen before but start to make it their own. And so for us that's really what that problem set serves as is this offboarding of students curricularly so that they can build something of their very own. But we've given them just enough of that scaffolding. This is the weak 9 of the scaffolding being built outside of the building here. All right, lastly, we have back home a series of events, one of which you saw came in a little early, called CS50 Fair. But it would probably give you a sense of some of these more unusual social or cultural aspects of the class that we don't do, admittedly, via Zoom. These are really meant to be done in Cambridge at Harvard, in New Haven at Yale, here in Jakarta or your own towns with your own schools. And the first of those, as I alluded to earlier, is what we call CS50 Puzzle Day. So several years ago, we decided to start our school year at Harvard by distributing a packet of puzzles to students. So if they sign up for this-- they don't even have to be taking CS50-- they arrive in our case on a Saturday afternoon around lunchtime. We then hand them a printed packet of puzzles, and those puzzles are not jigsaw puzzles. They are logic problems, but they have nothing to do with programming and nothing to do with computer science. And indeed, the messaging of the event is to come one, come all and just collaborate on some fun problems. Now, it helps that we typically try to find some food for them. We deliver some pizzas and the like. We typically have some prizes that we maybe ask a local company to sponsor so that we can award to the folks who solve the most puzzles over the course of three hours. But really, this event is meant to send a message that computer science, programming, computer science is not about programming. It really is about problem solving, and you don't even need your laptop or your phone. You just get some friends and some paper and pencil. And indeed, that's what we'll do for fun tomorrow morning over breakfast is just experience a little bit of that if you've not done it already with us online. And so in Cambridge, for instance, we're fortunate to usually get 300 to 600 students because we invite not just our students but their friends too. So this is one of my favorite memories at the end of every semester here. You have a whole bunch of students looking this way because on the projector here we were walking them through the solutions to the problem, which we'll do tomorrow, for instance, at some point too. And it's just the neatest most inspiring thing to see a whole bunch of smart people delighting in just solving problems together. And they none of them need higher programming experience in CS. What they do for the 2 and 1/2 hours prior to that is just a little bit of this in a classroom, in a building, anywhere on campus, inside or outside. They get together in groups of two or three or four. They try to give themselves a little bit of a buffer so they can whisper and talk about the problems to try to be the team next to them. But it's just students, smart students getting together trying to solve some problems that they've never seen before. Toward the end of the semester, we have what we call a CS50 hackathon. And a hackathon is, for us, an opportunity for students to gather, in our case, overnight. We start at 7:00 PM, and we end at 7:00 AM. So it's a long night all together in one of the larger buildings on campus. And it's an opportunity for them to work on their final project. So odds are, most of you worked on your final projects at home or at the office or the like alone. That's fine, and you still created those final projects. But wouldn't it have been nice if we could have gotten together today and started working on those? But that's what this event is all about just to get smart people together, people who might have bugs, have questions of each other and lean on each other because every student at that point is pretty much doing something on their own. Maybe they have a partner or two, but everyone's working on something different. So it really is collaborative. And this is different from what industry tends to do. A lot of companies sponsor hackathons, which are great too. But those tend to be competitive. And CS50's back home is not competitive. There's no prizes. Everyone gets pizza. Everyone gets desserts and the like, and there's no reward at the end other than you finished. You took CS50 by having finished your project, and not necessarily that night, but having begun or done well. And here, for instance, are some students around probably midnight. And here is a student around 5:00 AM. [LAUGHTER] And the last memory and the last tradition that I thought I'd share with you is what you saw playing before we began today, the CS50 Fair. This is something that we put on hold back home for like three years because of COVID but just resumed it in December of 2022. And the vision here was modeled originally on what in the US is commonly like a middle school science fair where the kids get together and they demonstrate something that glows or something that explodes or maybe a volcano they built or something fun like that. But in our case, the students bring their laptops or their phones depending on what their final project is. And we play fun music like we were playing earlier. We inflate balloons. We bring some candy and snacks. And in our case, too, we try to invite companies just to be there-- they have tables-- just to talk to students about future opportunities in technology. Maybe not so applicable for middle school students, but yes, for university students and maybe for high school students too. And so this too has been a secret ingredient for us over the years. If you're in a town or a city where there are some technology companies or if you have connections to folks who-- colleagues who are now in industry, I wouldn't hesitate to just ask companies for support, to have them bring the pizza, to have them send over some snacks, to have them send some T-shirts with their company's logo on it, but things to just give students and engage them all the more. And strategically, what we often do is we don't just ask them to, please, provide the pizza, or please, send some T-shirts. We invite them to join us at some of these events. We invite them to give a Tech Talk, maybe a 20-minute or 30-minute talk for students. We invite them to join us for a lunch or dinner with students just to chat about using technology and programming in the real world. So depending on where you are and what companies might be nearby, I want you to know, I think there's some really interesting opportunities to collaborate in that way. With that said, we don't typically invite companies to our office hours or the sections or recitations that we keep purely academic. But for these more social, these more collaborative environments, we do open the door, not only to our students, but also the bigger world as well. So here is just a photograph of one such fair just before the pandemic. Here is exactly what students do the whole time, standing at a laptop, smiling, being asked questions. And just to add a little twist to things, what we do here too is everyone who attends this particular event gets a blank card, a raffle card, that's got like 10 unhappy faces on it. But we give to all of our CS50 students little yellow smiley face stickers. And the idea is that any time-- and attendee, whether it's a teaching fellow or a student or another professor or a parent comes by and asks the student for a demonstration of their project, the social contract is that the student gives that attendee a yellow sticker. And every sticker entitles you to one entry in the raffle, and we typically ask some friends in industry, could you give us some prizes that we can raffle off? And what it really does socially is just grease the wheels, especially for students who might be more introverted or less comfortable, it just gives them an excuse to walk up to a stranger and say, hey, can I see your project? And they end up, invariably, delighting in what they're seeing. They also get that sticker, and so it's sort of a social greasing of the wheels. So we do try to think about these things both inside and outside of the classroom. And this was just CS50 really in an hour and a half. You, of course, have spent six months living and breathing it. But our hope is that to in reviewing these problem sets, these languages, these memorable moments, you just have more of a sense of the why. And if you disagree with some of the why, that too is fine. React to it by making something your own. So allow me to flip here to our final slide, and we still have a few minutes before we take a break for any questions. Yeah, let's go over here. I'll bounce back and forth. AUDIENCE: Actually, this is a question [INAUDIBLE]. Can [? we ?] deliver the [INAUDIBLE]? How long does [INAUDIBLE]? And how long [INAUDIBLE] because [INAUDIBLE]. We [? want ?] [INAUDIBLE] be swept away [? without ?] [INAUDIBLE]? DAVID MALAN: Well, thank you. You're too kind, and I-- [LAUGHTER] Carter can attest that they're far from perfect because, in fact, one of the things he and I do and Brian and I used to do is, after every lecture is painful, but we will then walk through all of the slides and write down to-do's, like a to-do list for all of the mistakes I made, all of the regrets I had. And every week, we have a long laundry list of imperfections, if I may. And some years we could rewatch the videos, which is a horrible experience, to watch this-- [LAUGHTER] --on video [INAUDIBLE]. But with that said, the way I myself prepare, every term, and CS50 in particular, is I start by looking literally at this list of things I wish I had done better because, especially if it's been a semester or even a year since I taught the class, it is so valuable to have a list of things I know I want to change even if I didn't remember it. Two, what I do is I look through my previous year's slides, and I just start to think through, is this how I would present this material this year? And invariably, I start moving things around, or I start hiding slides because I don't like doing that. And every year, even after 16 years, if you look through the slides, there's definitely similarities. And like 70% of the class might stay the same, 60%, 80%, something like that. But I'm constantly regretting how I taught something the previous year. And so I'm striving for my white whale, so to speak, trying to find the perfect version of CS50, which is only to say that I very carefully think through things from start to finish. I then look through the source code that I wrote the past year. And sometimes, with the source code, I actually start that from scratch because I find, honestly, even after doing this all these years, I'd like to think I'm getting better even at C and certain other languages, or industry trends are changing with some of the later material, and so it needs to be updated. But at least in my case, I don't write things down. If you see me flipping here, all I have is a printout of the slides. There's no notes or script or anything like that, which is fine if that's the type of teacher you are and you want that outline or if you want to script things out. I tend to go with the flow, if you will. But it's each their own. Carter has a different style, Guy and Margaret have a different style. I would find your own. But it takes practice. AUDIENCE: [INAUDIBLE]. DAVID MALAN: Yeah, over here. Sure. AUDIENCE: In almost every known [INAUDIBLE]. And we just add necessary code to [INAUDIBLE]. I wonder what's the reason-- which one more effective? Do we give the student-- we let the student code from the start to the end? Or give them the template like you did, each one [INAUDIBLE]? DAVID MALAN: That's a really good question. So to recap, toward the middle of the semester onward, we tend to give students starter code or template code or distribution code, same idea. And we often have to-do's or blanks that they need to fill in. Should we do that or not? I think it depends partly on your students and partly what you want the focus of that week to be. So for me, it's important in the beginning of CS50 that you start with a blank file. I want them to understand, from start to finish, that what they see on the screen, even if it's just Hello, world, is entirely of their own doing, no magic or things they don't understand. But as I said earlier, especially with C, it's hard to do fun, engaging homework problems in a language like C and even in Python if you're only using a terminal window, and still, you give students some libraries or some starter code. And I would say our own view on this has been changing. And just this spring, we've been going back and adding least comfortable versions of some of the problems which, for us, means providing a little more starter code. And for us, this is an opportunity for those students who are somewhat self-selecting, if they really feel uncomfortable, we give them a bit more of the solution and guide them step by step through it. But some other students who have either been programming for years or they just they want a challenge, and then you probably have students just like that, especially if they like the field, we give them less starter code. And we allow them to have this higher ceiling instead. So I think it depends on your students. But for us, it's very important to me that our problem sets get interesting or stay interesting. And I don't think you can do that if you give them a blank file every week to start with. Other questions. Let me go here. Let me-- some new hands first, if I may. AUDIENCE: Yeah, [INAUDIBLE] thank you for the chance. DAVID MALAN: Sure. AUDIENCE: I want to ask you about [INAUDIBLE] if we want to [INAUDIBLE] that evening, we must make the students feel comfortable and make them understand what happened in their [INAUDIBLE]. And I have some problem at my school. DAVID MALAN: Sure. AUDIENCE: VS code is too heavy to teach my [INAUDIBLE] in my computer [INAUDIBLE]. DAVID MALAN: OK. AUDIENCE: And can you-- I think if they just understand what happened [INAUDIBLE], but it's not [? grandfathered. ?] DAVID MALAN: OK. AUDIENCE: [INAUDIBLE] was they can't program a single [INAUDIBLE] it will work like that. Can you give me a citation by using another [INAUDIBLE] to teach my students without the VS code? DAVID MALAN: Sure, so VS code is very heavyweight [? and ?] so on your school's computer lab computers. So VS code itself can be downloaded for free for Mac and Windows, which I think you're referring to. But what Code Spaces is, code.CS50.IO, in our case, it's just a browser-based version thereof. And so long as the computers are within five or six years old, it should be OK so long as you have a good enough internet connection, which not everyone does. And I do realize that's a challenge. So in terms of other text editors, let me probably follow up with an email with some links to something like this because there are lighter weight ones. Like on Windows, Notepad++ comes to mind. It's not as popular nowadays as VS code, but there's others too. And if I forget, just email me tomorrow to remind me of that. I think we have time for maybe one or two more questions. AUDIENCE: [INAUDIBLE] days ago [INAUDIBLE]. DAVID MALAN: Yes. AUDIENCE: [INAUDIBLE]. [INAUDIBLE] I use other [INAUDIBLE]? DAVID MALAN: Good question. So in this class, as well as with our undergraduates back home, we ask them at the start of the term to bucketize themselves among those less comfortable, more comfortable, somewhere in between, and in our case, most recently, least comfortable as well. Generally, that's been sufficient detail for us, and we don't give them a test or a quiz or any kind of assessment like that because I think most students know what bucket they fall into because those who are less comfortable or least comfortable, they're uncomfortable just even being in the class on that first day. By contrast, the students who are more comfortable are the kids that have been programming since they were six years old, or they're highly confident. And so they know who they are. And our answer to the students who are like, I don't know which group I'm in, by definition, they are somewhere in between. And so for us, we have either these three buckets or now four, which can help just in our case-- and we can't do this in all classrooms. It can help you group students so that they're only among students who are similarly uncomfortable, similarly comfortable, so they don't feel like they're competing with the smarter kids or the slower kids in the class, which is not healthy for anyone. Other questions? Yeah. AUDIENCE: [INAUDIBLE]. DAVID MALAN: OK, yeah. AUDIENCE: [INAUDIBLE] all [INAUDIBLE]? DAVID MALAN: Vis a vis a matter of academic honesty? AUDIENCE: Yeah. DAVID MALAN: Yeah, that's a good question. So the question is about whether it's a Harvard thing or a CS50 thing, this emphasis on academic honesty. It is especially CS50 focused. Harvard, for instance, has its own honor code where across all courses and departments students are not supposed to be copying each other's work. They should be adhering to certain rules. In CS50, we philosophically, for many years since I took over and even before my time, proactively look for instances of academic dishonesty for a couple of reasons. And the first and foremost is just fairness to other students because we want them to be meeting us halfway. We're fortunate back home to have a lot of teaching assistants, as Carter noted, a lot of resources and support for students. And if we're going to provide this, we want them meeting us halfway and taking advantage of those resources. Where even in a smaller class, coming to me as the teacher and not turning to someone else's solution. Now, with that said, what we try to teach students over the course of the semester is where the line is. They're absolutely should be googling for certain things. They should be googling for how to write a for loop in C or how to implement a conditional in Python or function that makes HTTP requests in Python, like very commodity things. What they shouldn't be doing is how to print a pyramid for Mario or very specific things. Or any time they get a search result, where clearly it's a CS50 problem, and CS50 might even be mentioned somewhere in the post, that's the point at which, OK, you've found your way there accidentally. That's when you close the tab. And trying to teach students that leaning on each other for help, asking questions of us and others for help is fine. But copying someone else's work and presenting it as their own-- and then in our case, letting 72 or more hours pass and not realizing, darn it, I really shouldn't have done that even though I was very tired and stressed at the time and not coming forward. At that point, we take more punitive approaches because if students aren't ethically meeting us that way, then we try with the last measure we have. And the goal ultimately, especially for an introductory course, which for us at the university level is one of the first four courses that many first-year, freshman students take, this is where-- we're the funnel leading to other courses. So we try to place a lot of that effort there. And we'll talk more about this over time as well. Maybe one final question, if we may. Let me do one-on-one because we already chatted, but how about here? [LAUGHTER] AUDIENCE: [INAUDIBLE]. So [INAUDIBLE]? DAVID MALAN: So for the final project, we encourage students to take their finance code or our starter code and make it their own. That's very much blessed and encouraged at that point. What would be inappropriate for a final project is downloading someone else's project from GitHub or elsewhere and then just saying, I made this code. What is OK would be to download someone's code perhaps, especially if it's open source in a lab, but make clear to their teaching fellow, in our case, or to me as the teacher what they added to it. For instance, treating it more like a library, that's reasonable. And as you can imagine, the whole point of taking a class or being your students is for students to learn something. And it's not meant to be an exercise in simply submitting someone else's work but going from some starting point to some endpoint. So what we try to do with students even more so in person back home is help them navigate that line. And many of you have probably played with or heard about Racine's rules like ChatGPT, which honestly, for us teachers, is going to make things a little harder. It doesn't make things fundamentally any different because there's always-- whoa, there's always-- for the past 20 years there's been Google. And for the past 100 plus years, there's been other human beings in the classroom. But it does make it easier, tools like ChatGPT, to misbehave anonymously because you're just asking the internet very specific questions. And I hope-- and we're not there yet, but I think the educational opportunity of ChatGPT, Co-pilot, if you've heard these terms, is that we're going to have many more virtual TAs, and not bad virtual TAs where it just tries to autocomplete the answer to your question in like an FAQ or a knowledge base but would be able to have students highlight the starter code and have the computer explain it to them instead of needing to ask me or Carter or you. And so the goal there, I think for us, [INAUDIBLE] of these tools over the next one to two years is to actually leverage the positive aspects so that your software, your VS code, your student's code can answer, let's say, 70% of the introductory questions so that one of you, who's running around to 30 or 20 students or more in the class, can focus really on the harder questions, the more sophisticated questions as well. So all this and more tomorrow as well. But why don't we go ahead and take a 30-minute break here. There's cookies outside, thanks to our hosts. And we'll resume at 4:30 PM. [APPLAUSE]