1 00:00:00,000 --> 00:00:03,486 [MUSIC PLAYING] 2 00:00:03,486 --> 00:01:30,636 3 00:01:30,636 --> 00:01:34,620 [AUDIENCE EXCLAIMING] 4 00:01:34,620 --> 00:01:38,106 [APPLAUSE] 5 00:01:38,106 --> 00:01:42,588 6 00:01:42,588 --> 00:01:44,170 SPOT: Hello, world. 7 00:01:44,170 --> 00:01:47,860 This is CS50, Harvard University's introduction 8 00:01:47,860 --> 00:01:50,740 to the intellectual enterprises of computer science 9 00:01:50,740 --> 00:01:53,080 and the art of programming. 10 00:01:53,080 --> 00:01:54,190 Woof, woof. 11 00:01:54,190 --> 00:01:57,613 [LAUGHTER] 12 00:01:57,613 --> 00:02:08,870 13 00:02:08,870 --> 00:02:10,857 I'm sorry, Dave. 14 00:02:10,857 --> 00:02:12,440 [PINK, "WHAT ABOUT US"] What about us? 15 00:02:12,440 --> 00:02:15,350 16 00:02:15,350 --> 00:02:16,310 What about us? 17 00:02:16,310 --> 00:02:17,534 La-da-da-da-da-da-da. 18 00:02:17,534 --> 00:02:18,965 La-da-da-da-da-da-da. 19 00:02:18,965 --> 00:02:21,827 We are searchlights. 20 00:02:21,827 --> 00:02:23,750 We can see in the dark. 21 00:02:23,750 --> 00:02:27,020 22 00:02:27,020 --> 00:02:31,280 We are rockets pointed up at the stars. 23 00:02:31,280 --> 00:02:34,710 24 00:02:34,710 --> 00:02:38,610 We are billions of beautiful hearts. 25 00:02:38,610 --> 00:02:41,977 26 00:02:41,977 --> 00:02:46,750 And you sold us down the river too far. 27 00:02:46,750 --> 00:02:49,570 28 00:02:49,570 --> 00:02:51,920 What about us? 29 00:02:51,920 --> 00:02:57,270 What about all the times you said you had the answers? 30 00:02:57,270 --> 00:02:59,270 What about us? 31 00:02:59,270 --> 00:03:05,270 What about all the broken happy ever-afters? 32 00:03:05,270 --> 00:03:06,770 What about us? 33 00:03:06,770 --> 00:03:12,770 What about all the plans that ended in disaster? 34 00:03:12,770 --> 00:03:14,980 What about love? 35 00:03:14,980 --> 00:03:16,149 What about trust? 36 00:03:16,149 --> 00:03:18,145 What about us? 37 00:03:18,145 --> 00:03:21,139 38 00:03:21,139 --> 00:03:24,632 La-da-da-da-da-da-da. 39 00:03:24,632 --> 00:03:28,624 La-da-da-da-da-da-da. 40 00:03:28,624 --> 00:03:30,121 La-da-da-da-da-da-da. 41 00:03:30,121 --> 00:03:33,115 42 00:03:33,115 --> 00:03:34,612 La-da-da-da-da-da-da. 43 00:03:34,612 --> 00:03:55,107 44 00:03:55,107 --> 00:03:56,190 DAVID J. MALAN: All right. 45 00:03:56,190 --> 00:03:56,840 So-- 46 00:03:56,840 --> 00:04:00,340 [APPLAUSE, CHEERING] 47 00:04:00,340 --> 00:04:02,660 48 00:04:02,660 --> 00:04:05,480 This is CS50, Harvard University's introduction 49 00:04:05,480 --> 00:04:07,790 to the intellectual enterprises of computer science 50 00:04:07,790 --> 00:04:09,200 and the art of programming. 51 00:04:09,200 --> 00:04:11,090 And this is Spot. 52 00:04:11,090 --> 00:04:13,370 And our thanks to our friends at 3D Cowboys 53 00:04:13,370 --> 00:04:15,080 for bringing him by class today. 54 00:04:15,080 --> 00:04:18,524 Perhaps a round of applause for our special Professor [INAUDIBLE].. 55 00:04:18,524 --> 00:04:21,860 [APPLAUSE] 56 00:04:21,860 --> 00:04:22,820 My name is David Malan. 57 00:04:22,820 --> 00:04:26,270 And I actually took this class, CS50, myself, some years ago. 58 00:04:26,270 --> 00:04:27,500 But I almost didn't. 59 00:04:27,500 --> 00:04:30,590 And I didn't because when I got to campus, as a first-year, 60 00:04:30,590 --> 00:04:33,350 I really gravitated toward things already familiar, things 61 00:04:33,350 --> 00:04:35,450 with which I was already comfortable, specifically, government. 62 00:04:35,450 --> 00:04:38,700 And I came in here thinking I was going to major or concentrate in government. 63 00:04:38,700 --> 00:04:41,840 And it was only once I got to sophomore year, fall semester, 64 00:04:41,840 --> 00:04:44,300 that some friends of mine were coming to this class called 65 00:04:44,300 --> 00:04:48,290 CS50 that was very much to beware at the time, in that it 66 00:04:48,290 --> 00:04:50,870 was an unfamiliar field to so many of us, myself included. 67 00:04:50,870 --> 00:04:54,320 But I got up the nerve to go over the threshold, sit in on the first class, 68 00:04:54,320 --> 00:04:56,280 just shop it, so to speak. 69 00:04:56,280 --> 00:04:57,570 And I was hooked. 70 00:04:57,570 --> 00:05:00,470 I found that homework was, for the first time, fun. 71 00:05:00,470 --> 00:05:03,783 And this was after having enrolled only because the professor let 72 00:05:03,783 --> 00:05:06,200 me enroll pass/fail or [INAUDIBLE] because I didn't really 73 00:05:06,200 --> 00:05:07,283 think I could even cut it. 74 00:05:07,283 --> 00:05:10,020 But fast forward to five Mondays later in the semester, 75 00:05:10,020 --> 00:05:12,020 I actually switched to a letter grade, deciding, 76 00:05:12,020 --> 00:05:14,240 wow, this is actually something for me. 77 00:05:14,240 --> 00:05:17,480 And I say this because computer science, what 78 00:05:17,480 --> 00:05:19,640 I didn't realize about it at the time, really 79 00:05:19,640 --> 00:05:23,680 is this very general purpose way of thinking and way of solving problems. 80 00:05:23,680 --> 00:05:26,490 And even if this is the only CS class you ever take, 81 00:05:26,490 --> 00:05:29,940 even if this is the only formal training you have in programming 82 00:05:29,940 --> 00:05:32,550 as a practical skill, it's just so darn applicable 83 00:05:32,550 --> 00:05:35,670 to so many other fields-- the arts, humanities, social sciences, 84 00:05:35,670 --> 00:05:39,660 natural sciences, and beyond, and certainly within the STEM fields, 85 00:05:39,660 --> 00:05:40,530 themselves. 86 00:05:40,530 --> 00:05:43,810 That said, it's going to often feel a little something like this. 87 00:05:43,810 --> 00:05:47,310 This is from our friends at MIT, down the road, which is one of their hacks 88 00:05:47,310 --> 00:05:51,300 whereby they connected a fire hydrant to a drinking fountain, 89 00:05:51,300 --> 00:05:54,960 with a little sign up there that says, "GETTING AN EDUCATION FROM MIT IS LIKE 90 00:05:54,960 --> 00:05:57,480 DRINKING FROM A FIRE HOSE," which is to say that it's 91 00:05:57,480 --> 00:05:59,310 going to feel, quite often, in this class, 92 00:05:59,310 --> 00:06:01,260 too, that there's just a lot of information. 93 00:06:01,260 --> 00:06:03,960 And you can't possibly absorb it all, but realize 94 00:06:03,960 --> 00:06:06,750 that's to be expected, especially in an introductory class. 95 00:06:06,750 --> 00:06:11,520 The whole point is for so much of it to feel new, but with practice, with time, 96 00:06:11,520 --> 00:06:14,390 with years, even, looking back, will you get all the more 97 00:06:14,390 --> 00:06:15,640 comfortable with the material. 98 00:06:15,640 --> 00:06:18,340 But you're not meant to feel comfortable along the way. 99 00:06:18,340 --> 00:06:20,340 And so let me encourage you, invite you, expect 100 00:06:20,340 --> 00:06:23,580 you to get comfortable feeling uncomfortable along the way, 101 00:06:23,580 --> 00:06:27,390 whether you have or have not prior computer science or programming 102 00:06:27,390 --> 00:06:28,080 experience. 103 00:06:28,080 --> 00:06:32,130 Now, back in my day, the class' syllabus was a little bit different. 104 00:06:32,130 --> 00:06:35,438 And, really, when I and all of my classmates exited the class, 105 00:06:35,438 --> 00:06:37,230 we would say to friends that we learned how 106 00:06:37,230 --> 00:06:40,860 to program in C, which is a language that we, ourselves, will still 107 00:06:40,860 --> 00:06:41,860 learn in this class. 108 00:06:41,860 --> 00:06:44,040 But that was it for languages. 109 00:06:44,040 --> 00:06:46,950 But nowadays, as you'll see, we'll explore not just 110 00:06:46,950 --> 00:06:49,560 this older language called C, but a more modern language 111 00:06:49,560 --> 00:06:53,580 called Python that's very much in vogue for data science, and web applications, 112 00:06:53,580 --> 00:06:54,460 and much more. 113 00:06:54,460 --> 00:06:56,293 But we'll also introduce you, along the way, 114 00:06:56,293 --> 00:07:01,020 to another language called S-Q-L or SQL, which is specifically for databases. 115 00:07:01,020 --> 00:07:03,330 And SQL is a different type of programming language 116 00:07:03,330 --> 00:07:06,060 that's just going to give you different ways of solving problems, 117 00:07:06,060 --> 00:07:09,480 different building blocks with which to express problems you want to solve. 118 00:07:09,480 --> 00:07:11,670 We'll introduce you, toward the end of the semester, 119 00:07:11,670 --> 00:07:14,040 yet another language, JavaScript, often used 120 00:07:14,040 --> 00:07:17,415 with markup languages called HTML and CSS, with which maybe you 121 00:07:17,415 --> 00:07:19,290 have some experience if you've made websites. 122 00:07:19,290 --> 00:07:23,640 But we'll do this because so many of today's actual real-world software 123 00:07:23,640 --> 00:07:24,630 is web-based. 124 00:07:24,630 --> 00:07:27,450 Or it's phone-based, mobile-based, but even then, 125 00:07:27,450 --> 00:07:30,000 it's using these same languages, like JavaScript. 126 00:07:30,000 --> 00:07:32,700 And so by the end of CS50, in particular, 127 00:07:32,700 --> 00:07:35,820 you won't know how to program in X, or Y, or Z, per se. 128 00:07:35,820 --> 00:07:39,150 But, period, you'll learn how to program. 129 00:07:39,150 --> 00:07:41,190 And, indeed, among the goals of this class 130 00:07:41,190 --> 00:07:45,540 is to equip you with enough of a set of concepts, enough practical skills 131 00:07:45,540 --> 00:07:49,440 and experience that after CS50, again, if you never take another CS class, 132 00:07:49,440 --> 00:07:51,690 you can teach yourself new languages. 133 00:07:51,690 --> 00:07:52,650 And you won't feel-- 134 00:07:52,650 --> 00:07:55,440 you won't have been reliant on a class to, indeed, 135 00:07:55,440 --> 00:07:57,508 introduce you to each and one of those ideas. 136 00:07:57,508 --> 00:07:59,550 And what are we going to do, then, in this class? 137 00:07:59,550 --> 00:08:01,260 And, really, what are we going to start doing today? 138 00:08:01,260 --> 00:08:03,402 Well, we're going to learn how to solve problems. 139 00:08:03,402 --> 00:08:05,610 And that's really what computer science is all about. 140 00:08:05,610 --> 00:08:09,090 We'll, very specifically, today, knock off a few to-dos. 141 00:08:09,090 --> 00:08:12,130 We'll learn how to represent simple things, like numbers. 142 00:08:12,130 --> 00:08:14,880 We'll learn how to represent letters of an alphabet, like English. 143 00:08:14,880 --> 00:08:17,130 We'll learn how to represent colors-- red, green, blue, 144 00:08:17,130 --> 00:08:18,240 and everything in between. 145 00:08:18,240 --> 00:08:20,610 We'll learn how to represent, more interestingly, 146 00:08:20,610 --> 00:08:23,430 full-fledged images that you might see on the web or your phone. 147 00:08:23,430 --> 00:08:26,730 We'll talk about representing videos and even audio files. 148 00:08:26,730 --> 00:08:29,540 So, by the end of today, alone, you will exit here 149 00:08:29,540 --> 00:08:31,850 with a newfound mental model for how you can 150 00:08:31,850 --> 00:08:36,140 represent all of today's media and multimedia that we take for granted 151 00:08:36,140 --> 00:08:37,760 and use most every day. 152 00:08:37,760 --> 00:08:40,370 But we'll also focus today, ultimately, on how 153 00:08:40,370 --> 00:08:43,520 to write algorithms, like step-by-step instructions for solving 154 00:08:43,520 --> 00:08:47,375 some problem, specifically, implementing algorithms with code. 155 00:08:47,375 --> 00:08:48,500 And that's what we'll find. 156 00:08:48,500 --> 00:08:50,417 An algorithm is just something you can express 157 00:08:50,417 --> 00:08:54,350 in English or any human language, but code is a translation of that 158 00:08:54,350 --> 00:08:57,260 to, presumably, the 0's and 1's that you've probably heard 159 00:08:57,260 --> 00:08:59,840 is all that computers ultimately speak. 160 00:08:59,840 --> 00:09:02,030 And if you're feeling like that's a lot for today, 161 00:09:02,030 --> 00:09:04,488 if you're feeling like that's a lot for the whole semester, 162 00:09:04,488 --> 00:09:07,190 realize and take comfort in knowing that -thirds of you 163 00:09:07,190 --> 00:09:09,720 have never taken a CS course before. 164 00:09:09,720 --> 00:09:12,140 So even if you think, like I did all those years ago, 165 00:09:12,140 --> 00:09:15,047 that, surely, my friends, the kids I didn't even in the class, 166 00:09:15,047 --> 00:09:16,880 must know more than I, have been programming 167 00:09:16,880 --> 00:09:18,500 since they were six years old. 168 00:09:18,500 --> 00:09:19,880 That's just not the case. 169 00:09:19,880 --> 00:09:21,260 You're in very much good company. 170 00:09:21,260 --> 00:09:24,003 And within the class will you find different tracks, 171 00:09:24,003 --> 00:09:26,420 by way of the homework assignments, called "problem sets," 172 00:09:26,420 --> 00:09:28,003 by way of the sections or recitations. 173 00:09:28,003 --> 00:09:29,962 There will be different tracks for those of you 174 00:09:29,962 --> 00:09:32,610 less comfortable, more comfortable, somewhere in between. 175 00:09:32,610 --> 00:09:34,940 And if you really don't know why you are here today, 176 00:09:34,940 --> 00:09:37,970 we'll even have sections for those least comfortable, where you just 177 00:09:37,970 --> 00:09:41,690 don't necessarily feel ready to dive into CS or maybe STEM, more generally. 178 00:09:41,690 --> 00:09:44,840 But we'll get you there by way of the course's support structure. 179 00:09:44,840 --> 00:09:47,780 And it's very much grounded in this mindset. 180 00:09:47,780 --> 00:09:50,150 What ultimately matters in this class is not so much 181 00:09:50,150 --> 00:09:52,025 where you end up relative to your classmates, 182 00:09:52,025 --> 00:09:55,040 but where you end up relative to yourself, when you began. 183 00:09:55,040 --> 00:09:58,323 So whether you have or have not prior programming or CSS experience, 184 00:09:58,323 --> 00:10:00,740 it's not going to matter when it comes to evaluation, when 185 00:10:00,740 --> 00:10:04,320 it comes to the output, be it a grade, or a satisfactory mark, or the like. 186 00:10:04,320 --> 00:10:06,860 It's going to depend on, really, where you are today, 187 00:10:06,860 --> 00:10:11,960 in this, what we call week zero, versus the very end of the semester, when 188 00:10:11,960 --> 00:10:15,050 you will have built something grand, of your very own, in software. 189 00:10:15,050 --> 00:10:17,270 But CS50 is also characterized, fairly uniquely, 190 00:10:17,270 --> 00:10:19,147 by its community, its culture. 191 00:10:19,147 --> 00:10:21,230 And along the way, you'll see that your experience 192 00:10:21,230 --> 00:10:24,680 is punctuated by a lot of social and academic events alike. 193 00:10:24,680 --> 00:10:27,890 CS50 lunches, most every Friday, we'll gather at a nearby restaurant 194 00:10:27,890 --> 00:10:30,280 called Changsho where we'll have Chinese lunch together. 195 00:10:30,280 --> 00:10:32,030 And as many of you as might want to attend 196 00:10:32,030 --> 00:10:34,988 that week will be able to join us, sit down, and chat casually with me, 197 00:10:34,988 --> 00:10:39,680 the course's teaching staff, friends of ours, alumni from industry, as well. 198 00:10:39,680 --> 00:10:42,630 CS50 Puzzle Day, coming up this weekend, will be an opportunity, 199 00:10:42,630 --> 00:10:46,740 even if you have no prior CS experience, just to solve problems, 200 00:10:46,740 --> 00:10:49,790 not jigsaw puzzles, but puzzles in the logical sense. 201 00:10:49,790 --> 00:10:52,490 We'll hand you a packet of puzzles-- 202 00:10:52,490 --> 00:10:54,230 logic problems, or riddles, or the like-- 203 00:10:54,230 --> 00:10:56,087 that you, as teams, can solve together. 204 00:10:56,087 --> 00:10:57,920 And at the very end, we'll walk you through. 205 00:10:57,920 --> 00:11:01,350 And along the way, there'll be not only these puzzles, but pizza, and prizes, 206 00:11:01,350 --> 00:11:02,960 and so much more, as well. 207 00:11:02,960 --> 00:11:06,350 Towards the end of the semester, we'll have a CS50 Hackathon whereby 208 00:11:06,350 --> 00:11:09,830 we'll get together around 7:00 PM, at the start of reading period, 209 00:11:09,830 --> 00:11:12,740 and we'll finish up around 7:00 AM the next morning. 210 00:11:12,740 --> 00:11:15,080 And it will be this opportunity to really bond 211 00:11:15,080 --> 00:11:18,140 with your classmates, your project partners, if you work in a team, 212 00:11:18,140 --> 00:11:20,510 on your very own final project, which is meant 213 00:11:20,510 --> 00:11:23,750 to be a capstone of the course, something you build, yourselves, 214 00:11:23,750 --> 00:11:25,760 that we don't hand you a specification for. 215 00:11:25,760 --> 00:11:29,090 But it's your final offboarding, so that when you exit CS50, 216 00:11:29,090 --> 00:11:31,340 you don't need CS50 anymore. 217 00:11:31,340 --> 00:11:32,100 You don't need me. 218 00:11:32,100 --> 00:11:33,058 You don't need your TF. 219 00:11:33,058 --> 00:11:35,910 You can actually write code and solve problems on your own. 220 00:11:35,910 --> 00:11:39,740 So this picture here is one of our past photos from earlier in the evening. 221 00:11:39,740 --> 00:11:42,590 Things get a little quieter as we then, around 5:00 AM, 222 00:11:42,590 --> 00:11:46,340 drive anyone who's still awake and energetic to a nearby IHOP 223 00:11:46,340 --> 00:11:48,140 for pancakes, around then. 224 00:11:48,140 --> 00:11:51,710 But here is how most of the evenings tend to end for at least some 225 00:11:51,710 --> 00:11:53,000 of your classmates prior. 226 00:11:53,000 --> 00:11:55,670 But at the very end of the class is the so-called CS50 Fair, 227 00:11:55,670 --> 00:11:59,670 an exhibition of all of your final projects for friends, faculty, 228 00:11:59,670 --> 00:12:01,610 students, and staff across campus, whereby 229 00:12:01,610 --> 00:12:03,440 you'll be invited to a space like this. 230 00:12:03,440 --> 00:12:04,220 Bring your laptop. 231 00:12:04,220 --> 00:12:06,920 Bring your phone, whatever it is you have built and created. 232 00:12:06,920 --> 00:12:09,260 And we'll just show it off for a bit of the afternoon, 233 00:12:09,260 --> 00:12:11,870 complete with music, and friends from industry, 234 00:12:11,870 --> 00:12:16,000 and candy, and all what makes gathering together at term's end fond. 235 00:12:16,000 --> 00:12:17,750 And you'll wear, ultimately, very proudly, 236 00:12:17,750 --> 00:12:21,770 we hope, your very own "I took CS50," stating, very matter of factly, 237 00:12:21,770 --> 00:12:25,790 what I did some years ago; that, indeed, this was a course I, myself, took. 238 00:12:25,790 --> 00:12:29,120 So, today, let's focus, then, on computer science, like what is it. 239 00:12:29,120 --> 00:12:31,790 Well, it's really the study of information. 240 00:12:31,790 --> 00:12:34,910 But, really, it's, more specifically, about solving problems, 241 00:12:34,910 --> 00:12:38,360 using certain ideas and techniques, all of which you'll exit the course with. 242 00:12:38,360 --> 00:12:43,378 So, as such, problem solving is a goal that we'll 243 00:12:43,378 --> 00:12:45,920 approach by way of something called "computational thinking." 244 00:12:45,920 --> 00:12:49,760 So computational thinking, you can oversimplistically think about it 245 00:12:49,760 --> 00:12:51,500 as thinking like a computer. 246 00:12:51,500 --> 00:12:55,410 But it's really the application of ideas that we'll dive into today 247 00:12:55,410 --> 00:12:57,380 and we'll finish some weeks from now, that you 248 00:12:57,380 --> 00:13:01,880 can apply to problems from this field or most any other, but in a computational, 249 00:13:01,880 --> 00:13:04,770 that is, a very methodical, very careful way. 250 00:13:04,770 --> 00:13:07,520 And that's what CS really did for me and does for a lot of people. 251 00:13:07,520 --> 00:13:09,740 It helps clean up your thought processes. 252 00:13:09,740 --> 00:13:12,560 Even if you go off into the real world and do nothing in tech, 253 00:13:12,560 --> 00:13:14,840 you have an ability, after classes like this, 254 00:13:14,840 --> 00:13:18,020 to express yourself a little more correctly, more 255 00:13:18,020 --> 00:13:20,660 precisely and, generally, having better command 256 00:13:20,660 --> 00:13:22,980 of your own ideas and your language. 257 00:13:22,980 --> 00:13:24,410 So what's problem solving? 258 00:13:24,410 --> 00:13:25,790 Let me propose that this is it. 259 00:13:25,790 --> 00:13:29,270 This is as simple as we can make today's goals and the semester's goals. 260 00:13:29,270 --> 00:13:30,960 Problems to be solved look like this. 261 00:13:30,960 --> 00:13:32,960 You've got some input, the problem to be solved. 262 00:13:32,960 --> 00:13:35,750 You've got a goal being the output, like the solution there, too. 263 00:13:35,750 --> 00:13:38,000 And then somewhere in the middle is the secret sauce, 264 00:13:38,000 --> 00:13:40,375 where we'll spend the next several weeks figuring out how 265 00:13:40,375 --> 00:13:42,350 we can convert these inputs to outputs. 266 00:13:42,350 --> 00:13:44,870 But before we can do that, we all just have 267 00:13:44,870 --> 00:13:48,260 to agree on how to represent these inputs and outputs, 268 00:13:48,260 --> 00:13:51,260 whether it's with English or, really, any type of language. 269 00:13:51,260 --> 00:13:54,290 But, as I spoiled earlier, you probably came in here already 270 00:13:54,290 --> 00:13:56,900 with a general sense that, yeah, computers somehow 271 00:13:56,900 --> 00:14:00,823 only speak or know 0's and 1's, the so-called binary system. 272 00:14:00,823 --> 00:14:02,990 But that's just one way of representing information. 273 00:14:02,990 --> 00:14:05,150 Even simpler than binary is unary. 274 00:14:05,150 --> 00:14:10,670 So if you've ever, at this age or any prior age, counted on your fingers, 275 00:14:10,670 --> 00:14:14,480 this is unary notation, whereby each of your digits, your fingers 276 00:14:14,480 --> 00:14:17,000 literally represent some piece of information; 277 00:14:17,000 --> 00:14:19,760 taking attendance, like 1, 2, 3, 4, 5. 278 00:14:19,760 --> 00:14:25,800 But on your one human hand, how high can you count in this unary notation? 279 00:14:25,800 --> 00:14:26,505 AUDIENCE: Five. 280 00:14:26,505 --> 00:14:27,130 AUDIENCE: Five. 281 00:14:27,130 --> 00:14:29,550 DAVID J. MALAN: Five, I'm hearing five. 282 00:14:29,550 --> 00:14:31,890 Six, I heard one six. 283 00:14:31,890 --> 00:14:35,610 But I'm going to go further and say the answer, if you're clever about it, 284 00:14:35,610 --> 00:14:36,500 is actually-- 285 00:14:36,500 --> 00:14:37,132 AUDIENCE: 40? 286 00:14:37,132 --> 00:14:38,340 DAVID J. MALAN: Not quite 40. 287 00:14:38,340 --> 00:14:39,660 You overbid, but-- 288 00:14:39,660 --> 00:14:40,500 AUDIENCE: 31. 289 00:14:40,500 --> 00:14:43,885 DAVID J. MALAN: 31 is as high as I can actually count. 290 00:14:43,885 --> 00:14:46,260 And that's because if I actually-- and if you're thinking 291 00:14:46,260 --> 00:14:49,530 this is weirdly painful now, it will be, but this 292 00:14:49,530 --> 00:14:51,600 is my hand representing the number 0. 293 00:14:51,600 --> 00:14:55,980 Normally, in unary, this is 1, 2, 3, 4, 5, of course, obviously. 294 00:14:55,980 --> 00:14:58,290 But what if I take into account the order in which I'm 295 00:14:58,290 --> 00:14:59,590 putting my fingers up and down? 296 00:14:59,590 --> 00:15:00,840 So maybe this is still 0. 297 00:15:00,840 --> 00:15:02,490 Maybe this is still 1. 298 00:15:02,490 --> 00:15:07,410 But maybe this is now 2, where it's just the single second finger up, 299 00:15:07,410 --> 00:15:08,940 not two of them, total. 300 00:15:08,940 --> 00:15:10,860 Maybe this is now 3. 301 00:15:10,860 --> 00:15:14,730 Maybe this is now-- often offensive, with just the middle finger up. 302 00:15:14,730 --> 00:15:17,250 This is now [LAUGHS] 5. 303 00:15:17,250 --> 00:15:19,260 This is now 6. 304 00:15:19,260 --> 00:15:21,160 This is now 7. 305 00:15:21,160 --> 00:15:24,010 And my hand just hurts too much if I try to count higher than seven. 306 00:15:24,010 --> 00:15:27,640 But, theoretically, because each of my fingers can be down or up 307 00:15:27,640 --> 00:15:32,230 and I've got five of them, that's actually 32 possible permutations, 308 00:15:32,230 --> 00:15:32,890 up and down. 309 00:15:32,890 --> 00:15:33,640 But wait a minute. 310 00:15:33,640 --> 00:15:36,130 We said, 31, but if you start at 0. 311 00:15:36,130 --> 00:15:38,735 You have to subtract 1 from the biggest possible value. 312 00:15:38,735 --> 00:15:41,860 So this is to say you and I have been using unary because it's just simple, 313 00:15:41,860 --> 00:15:43,100 and it gets the job done. 314 00:15:43,100 --> 00:15:46,750 But if we just think about representation a little more cleverly, 315 00:15:46,750 --> 00:15:50,410 we can do exactly what computers do, using not what mathematicians call 316 00:15:50,410 --> 00:15:54,460 "base-1," where the finger is either there or it's not, but base-2. 317 00:15:54,460 --> 00:15:58,390 And in base-2, we just need two digits at our disposal. 318 00:15:58,390 --> 00:16:02,720 And we could call these digits 1 and 2, A and B, black or white. 319 00:16:02,720 --> 00:16:06,370 We just need two words to describe two pieces of information. 320 00:16:06,370 --> 00:16:07,600 Computers keep it simple. 321 00:16:07,600 --> 00:16:10,960 And just like we humans start counting 0, 1, 2, 3 on up, 322 00:16:10,960 --> 00:16:14,230 computers use 0 and 1, and that's it. 323 00:16:14,230 --> 00:16:15,710 But that's by convention. 324 00:16:15,710 --> 00:16:16,940 But why do they do that? 325 00:16:16,940 --> 00:16:21,930 Well, it turns out, when you use base-2, otherwise known as binary, well, 326 00:16:21,930 --> 00:16:24,030 it just maps really readily to the real world. 327 00:16:24,030 --> 00:16:25,947 Because, at the end of the day, what do we all 328 00:16:25,947 --> 00:16:28,740 do, if you've got a laptop, or a phone, or any device? 329 00:16:28,740 --> 00:16:32,310 You plug it into the wall because it needs electricity at some point. 330 00:16:32,310 --> 00:16:35,820 And what if you have electricity or not? 331 00:16:35,820 --> 00:16:38,190 Well, there's your two possible values. 332 00:16:38,190 --> 00:16:39,910 Either it's there, or it's not. 333 00:16:39,910 --> 00:16:42,000 And because computers are electrical devices, 334 00:16:42,000 --> 00:16:43,675 this is why binary is just useful. 335 00:16:43,675 --> 00:16:44,550 It's nice and simple. 336 00:16:44,550 --> 00:16:46,920 Either electricity is there, or it's not. 337 00:16:46,920 --> 00:16:48,810 So when you plug this device in and you've 338 00:16:48,810 --> 00:16:51,060 got all these electrons or whatever flowing, maybe 339 00:16:51,060 --> 00:16:53,250 if we just hang on to some of that electricity, 340 00:16:53,250 --> 00:16:55,230 we can represent what we'll call a 1. 341 00:16:55,230 --> 00:16:58,470 And maybe if we let it dissipate or go away, that's a 0. 342 00:16:58,470 --> 00:17:02,760 So on and off maps very readily to this idea of just 0's and 1's. 343 00:17:02,760 --> 00:17:06,750 And if you've ever thought of this, now, as binary digits-- 344 00:17:06,750 --> 00:17:10,380 "bi" implying 2, 0 and 1-- well, if you've ever heard this term now, 345 00:17:10,380 --> 00:17:12,690 "bit," it just means binary digit. 346 00:17:12,690 --> 00:17:14,688 A single bit is just a 0 or 1. 347 00:17:14,688 --> 00:17:16,980 But we could have called these things anything we want. 348 00:17:16,980 --> 00:17:20,069 Now how does this map to be clear to the real world? 349 00:17:20,069 --> 00:17:23,470 Well, we can't see the tiny little switches inside of our Macs, 350 00:17:23,470 --> 00:17:26,140 PCs, and our phones that are actually turning the electricity on 351 00:17:26,140 --> 00:17:28,480 or off, storing electricity or not. 352 00:17:28,480 --> 00:17:29,920 But they're called transistors. 353 00:17:29,920 --> 00:17:32,470 They've got millions of them in today's hardware. 354 00:17:32,470 --> 00:17:35,317 And they're just on or off, like a switch or a light bulb. 355 00:17:35,317 --> 00:17:37,150 So, for instance, if there's no electricity, 356 00:17:37,150 --> 00:17:40,690 the switch is off, we would call this, by convention, a 0. 357 00:17:40,690 --> 00:17:45,160 If, though, you throw the switch and it actually turns on, we would call this-- 358 00:17:45,160 --> 00:17:45,940 AUDIENCE: On. 359 00:17:45,940 --> 00:17:47,607 DAVID J. MALAN: --an "on," exactly, a 1. 360 00:17:47,607 --> 00:17:48,690 We could have reversed it. 361 00:17:48,690 --> 00:17:51,160 But this is just the way the world decided to standardize. 362 00:17:51,160 --> 00:17:51,910 And that's it. 363 00:17:51,910 --> 00:17:55,780 So you've either got something on or off, a 1 or a 0. 364 00:17:55,780 --> 00:18:00,020 And this, then, is this thing we know now as a binary digit or a bit. 365 00:18:00,020 --> 00:18:04,490 So once we've got these values, what about how-- 366 00:18:04,490 --> 00:18:07,090 how can we go about, perhaps, representing things? 367 00:18:07,090 --> 00:18:08,060 Well, you know what? 368 00:18:08,060 --> 00:18:10,352 It turns out we've got a lot of light bulbs right here. 369 00:18:10,352 --> 00:18:11,260 Let me grab-- thanks. 370 00:18:11,260 --> 00:18:12,010 Excuse me, spot. 371 00:18:12,010 --> 00:18:16,540 Let me grab the little music stand here. 372 00:18:16,540 --> 00:18:18,610 Let me borrow a couple of these bulbs and see 373 00:18:18,610 --> 00:18:22,310 if we can't make clearer than my hand, alone, what's going on here. 374 00:18:22,310 --> 00:18:24,970 So I'm going to go ahead and grab two of these. 375 00:18:24,970 --> 00:18:26,670 And I'll just put them here. 376 00:18:26,670 --> 00:18:28,420 And I can turn these things on or off now. 377 00:18:28,420 --> 00:18:32,560 So if I've got two bits, two switches, two transistors, if you will, well, 378 00:18:32,560 --> 00:18:38,660 if I go ahead and turn on this one, I'm representing what number in binary, 379 00:18:38,660 --> 00:18:39,160 perhaps? 380 00:18:39,160 --> 00:18:39,880 AUDIENCE: 1. 381 00:18:39,880 --> 00:18:41,200 DAVID J. MALAN: So just 1. 382 00:18:41,200 --> 00:18:45,130 Now, if I'm using unary, I would turn this one on and be done with it. 383 00:18:45,130 --> 00:18:46,980 And that's 2, but not in binary. 384 00:18:46,980 --> 00:18:51,350 Binary, it's the permutations, which ones are on and off, that matters. 385 00:18:51,350 --> 00:18:53,790 So what, now, am I representing here, perhaps? 386 00:18:53,790 --> 00:18:54,370 AUDIENCE: 2. 387 00:18:54,370 --> 00:18:55,120 DAVID J. MALAN: 2. 388 00:18:55,120 --> 00:18:58,210 So this is when I put my single pointer finger up. 389 00:18:58,210 --> 00:19:00,430 But then when I did this, in my human hand, 390 00:19:00,430 --> 00:19:03,310 this was like representing the number 3. 391 00:19:03,310 --> 00:19:06,640 How do I represent the number 4. 392 00:19:06,640 --> 00:19:11,000 Yeah, I need another light bulb, so I need more hardware, so to speak. 393 00:19:11,000 --> 00:19:13,000 So if I turn-- 394 00:19:13,000 --> 00:19:19,180 if I leave this one-- if I turn this one on, this one off, this one off, 395 00:19:19,180 --> 00:19:21,380 now I have the number 4. 396 00:19:21,380 --> 00:19:24,593 And someone tell me, saying the words "on" 397 00:19:24,593 --> 00:19:26,510 and "on" and "on," or "on," or "off," or "on," 398 00:19:26,510 --> 00:19:28,850 using combinations of "on," "off" and-- "on" 399 00:19:28,850 --> 00:19:32,832 and "off," how do I represent 5, from your left to your right? 400 00:19:32,832 --> 00:19:33,665 How about over here? 401 00:19:33,665 --> 00:19:34,880 AUDIENCE: On, off, on. 402 00:19:34,880 --> 00:19:36,620 DAVID J. MALAN: "On, off, on," I heard. 403 00:19:36,620 --> 00:19:38,480 And that's exactly right. 404 00:19:38,480 --> 00:19:41,085 And how do I represent, maybe, 6? 405 00:19:41,085 --> 00:19:41,585 Over here? 406 00:19:41,585 --> 00:19:43,010 AUDIENCE: Off, on, on. 407 00:19:43,010 --> 00:19:45,080 DAVID J. MALAN: Off, on, on, not quite. 408 00:19:45,080 --> 00:19:45,995 From left to right? 409 00:19:45,995 --> 00:19:47,390 AUDIENCE: Off-- the other way. 410 00:19:47,390 --> 00:19:47,620 DAVID J. MALAN: The-- 411 00:19:47,620 --> 00:19:49,290 [LAUGHS] OK, so from right to left. 412 00:19:49,290 --> 00:19:50,960 So I think we leave this one on. 413 00:19:50,960 --> 00:19:58,760 This one, I'm going to claim, represents, now, 6 and 7. 414 00:19:58,760 --> 00:19:59,570 AUDIENCE: On, off. 415 00:19:59,570 --> 00:20:02,300 DAVID J. MALAN: I'm just going to-- it's actually going to be "on, on, on." 416 00:20:02,300 --> 00:20:04,737 Now, if you're wondering, where are these people coming up 417 00:20:04,737 --> 00:20:07,070 with these combinations, there's actually a system here. 418 00:20:07,070 --> 00:20:09,770 It's actually hard for me to do it backwards. 419 00:20:09,770 --> 00:20:14,202 But it turns out there's actually a system that's not all that unfamiliar. 420 00:20:14,202 --> 00:20:15,410 In fact, let me propose this. 421 00:20:15,410 --> 00:20:18,770 Let me propose that we consider what you and I all 422 00:20:18,770 --> 00:20:23,100 learned in grade school, which was something like the base-10 system, 10 423 00:20:23,100 --> 00:20:25,770 meaning that you use 10 different digits, not two, 10. 424 00:20:25,770 --> 00:20:30,300 So 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, that's the base-10 system, otherwise known 425 00:20:30,300 --> 00:20:32,370 as decimal, "dec" implying 10. 426 00:20:32,370 --> 00:20:34,140 So that's what you and I use every day. 427 00:20:34,140 --> 00:20:37,140 Well, let's think about how we represent numbers in decimal, 428 00:20:37,140 --> 00:20:38,430 in the normal human way. 429 00:20:38,430 --> 00:20:39,520 Well, here is a number. 430 00:20:39,520 --> 00:20:41,380 It's what number, of course? 431 00:20:41,380 --> 00:20:42,180 AUDIENCE: 123. 432 00:20:42,180 --> 00:20:43,542 DAVID J. MALAN: 123. 433 00:20:43,542 --> 00:20:45,750 So we all just have an intuition for that, obviously. 434 00:20:45,750 --> 00:20:48,420 But it's not necessarily 123. 435 00:20:48,420 --> 00:20:51,640 You're just assigning meaning to the positions of these digits. 436 00:20:51,640 --> 00:20:54,030 This is really the pattern 1-2-3. 437 00:20:54,030 --> 00:20:57,390 But you immediately jump, mathematically, to 123, but why? 438 00:20:57,390 --> 00:21:00,390 Well, odds are, in grade school, you learned that the rightmost digit is 439 00:21:00,390 --> 00:21:02,160 the ones place or the ones column. 440 00:21:02,160 --> 00:21:04,800 This is the tens place or the tens column. 441 00:21:04,800 --> 00:21:06,490 This is the hundreds place. 442 00:21:06,490 --> 00:21:08,230 And so why is this relevant? 443 00:21:08,230 --> 00:21:11,190 Well, this is like doing 100 times 1 plus 10 times 444 00:21:11,190 --> 00:21:16,410 2 plus 1 times 3 or, if we multiply that out, 100 plus 20 plus 3, 445 00:21:16,410 --> 00:21:21,240 ergo, the number, now, that we just take for granted is 123. 446 00:21:21,240 --> 00:21:24,240 But that's in base-10, the so-called decimal system, 447 00:21:24,240 --> 00:21:27,930 whereby each of these digits is in a different column. 448 00:21:27,930 --> 00:21:31,080 And those columns are, again, ones place, tens, hundreds. 449 00:21:31,080 --> 00:21:33,790 If we keep going, thousand, ten thousand, and so forth. 450 00:21:33,790 --> 00:21:35,040 But where did these come from? 451 00:21:35,040 --> 00:21:35,957 Well, here's the base. 452 00:21:35,957 --> 00:21:37,770 If you remember exponents and all of that, 453 00:21:37,770 --> 00:21:41,910 this is just 10 to the 0, 10 to the 1, 10 to the 2, ad infinitum. 454 00:21:41,910 --> 00:21:46,860 And so, now, what if we just changed the base from 10, 0 through 9, 455 00:21:46,860 --> 00:21:48,480 to just two digits, 0 and 1? 456 00:21:48,480 --> 00:21:50,610 Well, now the math is fundamentally the same. 457 00:21:50,610 --> 00:21:52,880 But it's 2 to the 0, 2 to the 1, 2 to the 2, 458 00:21:52,880 --> 00:21:57,030 which gives us the ones place, twos place, and fours place. 459 00:21:57,030 --> 00:21:58,410 Now, why is this relevant? 460 00:21:58,410 --> 00:22:02,790 If you've got three light bulbs or three bits that are off, off, off, 461 00:22:02,790 --> 00:22:03,930 what have I done? 462 00:22:03,930 --> 00:22:07,710 4 times 0 plus 2 times 0 plus 1 times 0 is, obviously, the number 463 00:22:07,710 --> 00:22:09,990 you and I know, in decimal, as 0. 464 00:22:09,990 --> 00:22:12,630 This, though, represents the number you and I know as-- 465 00:22:12,630 --> 00:22:13,230 AUDIENCE: 1 466 00:22:13,230 --> 00:22:14,605 DAVID J. MALAN: This represents-- 467 00:22:14,605 --> 00:22:15,195 AUDIENCE: 2. 468 00:22:15,195 --> 00:22:17,910 DAVID J. MALAN: --3, 4. 469 00:22:17,910 --> 00:22:21,540 And just to be clear, this is why, when I grabbed the additional light bulb, 470 00:22:21,540 --> 00:22:25,170 we claimed that this now was 4. 471 00:22:25,170 --> 00:22:29,430 Because we had "on, off, off," "on, off, off." 472 00:22:29,430 --> 00:22:30,960 This now is 5. 473 00:22:30,960 --> 00:22:32,190 This now is 6. 474 00:22:32,190 --> 00:22:33,240 This now is 7. 475 00:22:33,240 --> 00:22:36,480 And if I wanted to count higher, what would the pattern of 0's and 1's be 476 00:22:36,480 --> 00:22:37,478 for the number 8? 477 00:22:37,478 --> 00:22:38,942 AUDIENCE: 1, 0-- 478 00:22:38,942 --> 00:22:40,410 DAVID J. MALAN: 1, 0, 0, 0. 479 00:22:40,410 --> 00:22:42,330 So we just need more hardware, more bits. 480 00:22:42,330 --> 00:22:45,630 So it wasn't arbitrary, even if it was non-obvious, 481 00:22:45,630 --> 00:22:49,660 what I was actually doing with turning these light bulbs on and off. 482 00:22:49,660 --> 00:22:53,730 Now, it turns out here we are talking about how to represent information, 483 00:22:53,730 --> 00:22:59,490 like numbers, but we could also use bits, 0's and 1's, light bulbs 484 00:22:59,490 --> 00:23:01,590 to represent instructions, as well. 485 00:23:01,590 --> 00:23:04,050 Because, at the end of the day, that's all computers do. 486 00:23:04,050 --> 00:23:07,950 They process data, information of some sort, whether it's files, 487 00:23:07,950 --> 00:23:10,290 or numbers, or images, or videos, or the like. 488 00:23:10,290 --> 00:23:13,290 And you do things with those files. 489 00:23:13,290 --> 00:23:13,985 You open them. 490 00:23:13,985 --> 00:23:14,610 You print them. 491 00:23:14,610 --> 00:23:15,610 You edit them and the like. 492 00:23:15,610 --> 00:23:18,720 So there's this notion of instructions, what the computer can actually do. 493 00:23:18,720 --> 00:23:22,470 And I bet we could come up with some pattern of 0's and 1's 494 00:23:22,470 --> 00:23:26,970 or, equivalently, light bulbs that tell even Spot what to do. 495 00:23:26,970 --> 00:23:30,785 Maybe, go up, or down, or left, or right. 496 00:23:30,785 --> 00:23:33,660 And it could certainly do this autonomously by using various sensors. 497 00:23:33,660 --> 00:23:35,077 We need to keep things safe today. 498 00:23:35,077 --> 00:23:38,248 We're using Wi-Fi in sending Spot these very instructions. 499 00:23:38,248 --> 00:23:41,040 But what's happening, wirelessly, with our friend Andrew, here, is, 500 00:23:41,040 --> 00:23:45,330 essentially, he's sending Spot instructions just encoded, wirelessly, 501 00:23:45,330 --> 00:23:47,610 somehow, as patterns of 0's and 1's. 502 00:23:47,610 --> 00:23:51,390 And the folks at Boston Dynamics, who built this robot, programmed 503 00:23:51,390 --> 00:23:54,330 Spot to recognize certain patterns as meaning "up," 504 00:23:54,330 --> 00:23:57,030 a certain pattern as meaning "down," "left," "right," 505 00:23:57,030 --> 00:23:58,505 and any number of other things. 506 00:23:58,505 --> 00:24:00,630 So, in fact, Spot, come on over here, if you could. 507 00:24:00,630 --> 00:24:01,830 Come on, Spot. 508 00:24:01,830 --> 00:24:03,510 [FOOTSTEPS] 509 00:24:03,510 --> 00:24:05,640 OK. 510 00:24:05,640 --> 00:24:08,400 So Spot, for instance, may very well have a pattern 511 00:24:08,400 --> 00:24:11,190 of 0's and 1's that represents shake. 512 00:24:11,190 --> 00:24:12,720 Shake, Spot. 513 00:24:12,720 --> 00:24:16,330 So he could do that and any number of other movements, as well. 514 00:24:16,330 --> 00:24:19,680 And maybe, especially with sensors here and also a little human help over here, 515 00:24:19,680 --> 00:24:22,540 for today, what if we went ahead and did something-- maybe 516 00:24:22,540 --> 00:24:23,870 ask Spot some questions? 517 00:24:23,870 --> 00:24:25,660 So let's go ahead, and we'll start simple. 518 00:24:25,660 --> 00:24:31,150 Spot, here we have some bits, "off, off, on." 519 00:24:31,150 --> 00:24:34,030 Spot, what [LAUGHS]-- OK. 520 00:24:34,030 --> 00:24:41,260 Spot, what is this representing, "off, off, on"? 521 00:24:41,260 --> 00:24:43,710 [SPOT TAPS STAGE] 522 00:24:43,710 --> 00:24:44,970 Correct? 523 00:24:44,970 --> 00:24:45,900 I think so. 524 00:24:45,900 --> 00:24:46,900 Very horse-like, OK. 525 00:24:46,900 --> 00:24:47,400 Thank you. 526 00:24:47,400 --> 00:24:49,400 All right, so a round of applause for Spot here. 527 00:24:49,400 --> 00:24:50,310 [APPLAUSE] 528 00:24:50,310 --> 00:24:51,450 All right. 529 00:24:51,450 --> 00:24:54,400 So, Spot, what if we [LAUGHS] turn-- 530 00:24:54,400 --> 00:24:54,900 OK. 531 00:24:54,900 --> 00:24:56,160 We'll turn that one off here. 532 00:24:56,160 --> 00:24:57,535 How about if we turn this one on? 533 00:24:57,535 --> 00:24:59,280 So it's "off, on, off." 534 00:24:59,280 --> 00:25:02,470 Spot, what's this number? 535 00:25:02,470 --> 00:25:04,310 [SPOT TAPPING STAGE] 536 00:25:04,310 --> 00:25:05,570 Is that correct? 537 00:25:05,570 --> 00:25:06,150 Nice. 538 00:25:06,150 --> 00:25:06,650 OK. 539 00:25:06,650 --> 00:25:07,655 [APPLAUSE] 540 00:25:07,655 --> 00:25:09,620 [LAUGHS] How about one final flourish? 541 00:25:09,620 --> 00:25:12,440 How about, Spot, instead of "off, on, off," 542 00:25:12,440 --> 00:25:16,280 let's go ahead and do "off, on, on"? 543 00:25:16,280 --> 00:25:20,810 So think, in your mind's eye, what the answer should be. 544 00:25:20,810 --> 00:25:24,104 All right, Spot, "off, on, on." 545 00:25:24,104 --> 00:25:27,420 [SPOT LANDING ON THE STAGE] 546 00:25:27,420 --> 00:25:27,920 547 00:25:27,920 --> 00:25:28,460 OK. 548 00:25:28,460 --> 00:25:30,830 And a round of applause for, Spot, as well. 549 00:25:30,830 --> 00:25:31,816 [LAUGHS] 550 00:25:31,816 --> 00:25:33,790 [APPLAUSE] 551 00:25:33,790 --> 00:25:36,450 So this is to say, no matter how-- 552 00:25:36,450 --> 00:25:37,140 thank you, Spot. 553 00:25:37,140 --> 00:25:40,620 No matter how fancy today's hardware or software is, 554 00:25:40,620 --> 00:25:42,720 it really just boils down to representing 555 00:25:42,720 --> 00:25:44,838 information and instructions. 556 00:25:44,838 --> 00:25:47,130 And computers, and phones, and the like really are just 557 00:25:47,130 --> 00:25:51,460 operating on those same pieces of information, 558 00:25:51,460 --> 00:25:55,240 whether implemented in 0's and 1's or with, really, anything else. 559 00:25:55,240 --> 00:25:55,740 All right. 560 00:25:55,740 --> 00:25:59,880 So, where can we take this, once we have this agreed-upon system 561 00:25:59,880 --> 00:26:03,030 for representing [LAUGHS] information? 562 00:26:03,030 --> 00:26:06,960 Well, it turns out that using three bits, three 0's and 1's, at a time, 563 00:26:06,960 --> 00:26:08,700 isn't actually all that useful. 564 00:26:08,700 --> 00:26:12,240 And you and I, even in conversation, don't often say the word "bit." 565 00:26:12,240 --> 00:26:13,500 We say the word "byte." 566 00:26:13,500 --> 00:26:15,280 And what is a byte, if familiar? 567 00:26:15,280 --> 00:26:15,780 Yeah? 568 00:26:15,780 --> 00:26:16,750 AUDIENCE: It's eight bits. 569 00:26:16,750 --> 00:26:18,417 DAVID J. MALAN: So it's just eight bits. 570 00:26:18,417 --> 00:26:20,200 It's just a more useful unit of measure. 571 00:26:20,200 --> 00:26:22,715 And it happens to be a power of 2, 2 to the third, 572 00:26:22,715 --> 00:26:24,340 which just makes math work out cleanly. 573 00:26:24,340 --> 00:26:27,610 But it's just a convention, to have more interesting units of measure 574 00:26:27,610 --> 00:26:28,540 than individual bits. 575 00:26:28,540 --> 00:26:30,350 So a byte is eight bits. 576 00:26:30,350 --> 00:26:34,690 So, for instance, this represents, using eight bits, eight light bulbs, 577 00:26:34,690 --> 00:26:36,460 the number you and I know is 0. 578 00:26:36,460 --> 00:26:40,960 And this byte of all 1 bits-- 579 00:26:40,960 --> 00:26:46,040 now you've got to do some quick math-- represents what number, instead? 580 00:26:46,040 --> 00:26:48,657 So it's all 1's; eight of them, total. 581 00:26:48,657 --> 00:26:49,990 How about over here, on the end? 582 00:26:49,990 --> 00:26:51,050 AUDIENCE: 255. 583 00:26:51,050 --> 00:26:52,992 DAVID J. MALAN: So it's, indeed, 255. 584 00:26:52,992 --> 00:26:54,700 Now, that's not the kind of math that you 585 00:26:54,700 --> 00:26:57,310 need to do in your head for a class like this, but you could. 586 00:26:57,310 --> 00:27:04,690 This is the ones place, twos, fours, eight, 16, 32, 64, 128. 587 00:27:04,690 --> 00:27:08,800 And because they're all 1, you just have to add up all of those columns' values. 588 00:27:08,800 --> 00:27:10,570 And you get 255. 589 00:27:10,570 --> 00:27:13,690 But a little mental trick, too, is that, if you've got eight bits 590 00:27:13,690 --> 00:27:17,270 and each of them can be two possible values, 0 or 1, 591 00:27:17,270 --> 00:27:21,740 that's like 2 possibilities here times 2 times 2 times 2 times 2, eight times. 592 00:27:21,740 --> 00:27:25,310 So that's 2 to the eighth, so that is maybe a little easier to do. 593 00:27:25,310 --> 00:27:26,720 That's 256. 594 00:27:26,720 --> 00:27:29,780 Or easier, in the sense that you get used to seeing these numbers in CS. 595 00:27:29,780 --> 00:27:31,220 That's 256. 596 00:27:31,220 --> 00:27:32,030 But wait a minute. 597 00:27:32,030 --> 00:27:35,300 How do I reconcile this with your 255? 598 00:27:35,300 --> 00:27:36,650 Because you start at 0. 599 00:27:36,650 --> 00:27:41,120 So you lose one on the high end because we started counting and representing 600 00:27:41,120 --> 00:27:42,830 the number, like 0. 601 00:27:42,830 --> 00:27:43,760 All right. 602 00:27:43,760 --> 00:27:47,570 Questions on how we've represented just numbers or, for instance, 603 00:27:47,570 --> 00:27:51,600 instructions to Spot, thus far? 604 00:27:51,600 --> 00:27:57,410 Any questions on binary, unary, or the like? 605 00:27:57,410 --> 00:27:58,010 No? 606 00:27:58,010 --> 00:28:01,137 All right, so seeing none, let's let things escalate a bit. 607 00:28:01,137 --> 00:28:03,470 So how do you represent letters because, obviously, this 608 00:28:03,470 --> 00:28:05,262 makes our devices more useful, whether it's 609 00:28:05,262 --> 00:28:07,020 in English or any other human language. 610 00:28:07,020 --> 00:28:10,740 How could we go about representing the letter A, for instance? 611 00:28:10,740 --> 00:28:13,370 If, at the end of the day, all our computers, 612 00:28:13,370 --> 00:28:17,390 all our phones have access to is electricity; or, equivalently, 613 00:28:17,390 --> 00:28:20,570 switches; or, metaphorically, tiny little light bulbs 614 00:28:20,570 --> 00:28:23,750 inside of them that can be on and off-- that's it. 615 00:28:23,750 --> 00:28:26,990 There's no more building blocks to give you. 616 00:28:26,990 --> 00:28:30,530 How could we represent something like the letter A? 617 00:28:30,530 --> 00:28:32,000 Yeah, how about here? 618 00:28:32,000 --> 00:28:32,812 Yeah? 619 00:28:32,812 --> 00:28:34,312 AUDIENCE: You could assign a number. 620 00:28:34,312 --> 00:28:35,343 DAVID J. MALAN: Perfect. 621 00:28:35,343 --> 00:28:37,260 So we could just assign every letter a number. 622 00:28:37,260 --> 00:28:38,677 And we could do this super simply. 623 00:28:38,677 --> 00:28:42,660 Maybe 0 is A, and 1 is B. Or maybe 1 is A, 624 00:28:42,660 --> 00:28:46,110 and 2 is B. It doesn't really matter, so long as we all agree and we all 625 00:28:46,110 --> 00:28:48,660 use the same types of computers, in some sense, ultimately. 626 00:28:48,660 --> 00:28:51,730 Well, for various reasons, the humans that designed this system, 627 00:28:51,730 --> 00:28:53,160 they went with the number 65. 628 00:28:53,160 --> 00:28:57,540 So, nowadays, anytime your computer is showing you the capital letter 629 00:28:57,540 --> 00:29:00,690 A on the screen, underneath the hood, so to speak, 630 00:29:00,690 --> 00:29:06,780 it's actually storing a pattern of 0's and 1's that represents the number 65. 631 00:29:06,780 --> 00:29:09,930 And it tends to use seven bits or, typically, eight bits, total, 632 00:29:09,930 --> 00:29:12,790 even if it doesn't need all of those bits in total. 633 00:29:12,790 --> 00:29:14,980 So how do we get there? 634 00:29:14,980 --> 00:29:17,490 Well, here, for instance, is that same pattern. 635 00:29:17,490 --> 00:29:19,980 Here is that pattern of bits that represents 65. 636 00:29:19,980 --> 00:29:20,520 And why? 637 00:29:20,520 --> 00:29:22,200 Well, quick check here. 638 00:29:22,200 --> 00:29:29,160 This is the ones place, twos, fours, eights, 16, 32, 64's place. 639 00:29:29,160 --> 00:29:32,640 OK, so 64 plus 1 gives me 65. 640 00:29:32,640 --> 00:29:36,830 So that is to say here's how a computer, using some light switches, so to speak, 641 00:29:36,830 --> 00:29:38,620 would represent the number 65. 642 00:29:38,620 --> 00:29:41,540 And our Macs, our PCs, our phones just all know this. 643 00:29:41,540 --> 00:29:44,410 So whenever they see that in their memory, so to speak, 644 00:29:44,410 --> 00:29:47,560 they show a capital letter A on the screen. 645 00:29:47,560 --> 00:29:48,520 So that's it. 646 00:29:48,520 --> 00:29:51,250 That's the system known as ASCII, the American Standard 647 00:29:51,250 --> 00:29:52,840 Code for Information Interchange. 648 00:29:52,840 --> 00:29:57,340 And the A is actually operative there because we're only talking, thus far, 649 00:29:57,340 --> 00:29:59,500 about English letters in our alphabet. 650 00:29:59,500 --> 00:30:02,530 And, in fact, I claimed, a moment ago, that we only use 651 00:30:02,530 --> 00:30:06,250 seven, maybe eight bits to represent letters of an alphabet. 652 00:30:06,250 --> 00:30:08,410 So, just to come back to you, if I may, how many 653 00:30:08,410 --> 00:30:10,900 possible letters of the alphabet could-- how 654 00:30:10,900 --> 00:30:14,350 many possible letters of any alphabet could we represent with eight bits? 655 00:30:14,350 --> 00:30:15,310 AUDIENCE: 256. 656 00:30:15,310 --> 00:30:18,400 DAVID J. MALAN: 256, the numbers 0 through 255. 657 00:30:18,400 --> 00:30:20,650 Now, that's more than enough for English because we've 658 00:30:20,650 --> 00:30:23,498 got A through Z, uppercase, lowercase, a bunch of numbers, 659 00:30:23,498 --> 00:30:24,790 a bunch of punctuation symbols. 660 00:30:24,790 --> 00:30:28,660 But in a lot of languages, with accented characters, a lot of Asian characters, 661 00:30:28,660 --> 00:30:32,230 this is not nearly enough memory or bits with which 662 00:30:32,230 --> 00:30:34,717 to represent all of those possible values. 663 00:30:34,717 --> 00:30:36,550 So we need to do a little better than ASCII, 664 00:30:36,550 --> 00:30:39,200 but we can build on top of what they did years ago. 665 00:30:39,200 --> 00:30:41,080 So here is a chart of ASCII codes. 666 00:30:41,080 --> 00:30:44,270 It's just a bunch of columns showing us the mapping between letters 667 00:30:44,270 --> 00:30:44,770 and numbers. 668 00:30:44,770 --> 00:30:49,420 So, for instance, up here is the capital letter A, 65; capital B, 66; 669 00:30:49,420 --> 00:30:52,060 capital C, 67; dot, dot, dot. 670 00:30:52,060 --> 00:30:56,333 72 is H. 73 is I and so forth. 671 00:30:56,333 --> 00:30:58,750 There's some weird things over here, like special symbols, 672 00:30:58,750 --> 00:31:00,125 that we'll learn about over time. 673 00:31:00,125 --> 00:31:02,230 But there's a mapping between every English letter 674 00:31:02,230 --> 00:31:04,810 of the alphabet and some number, just as you'd propose, 675 00:31:04,810 --> 00:31:06,710 both for uppercase and lowercase. 676 00:31:06,710 --> 00:31:10,580 So, for instance, if we highlight just a few of these for now 677 00:31:10,580 --> 00:31:14,998 and I say that I've just received a text message or an email that, 678 00:31:14,998 --> 00:31:17,290 underneath the hood, so to speak, if I have the ability 679 00:31:17,290 --> 00:31:22,930 to look at what switches are on and off, I received this message here. 680 00:31:22,930 --> 00:31:26,020 Well, first-- and this is not what CS is about, but just fun fact. 681 00:31:26,020 --> 00:31:29,470 Does anyone know what number this would represent in decimal, 682 00:31:29,470 --> 00:31:34,565 if this is the binary pattern, like ones place, twos place? 683 00:31:34,565 --> 00:31:35,420 AUDIENCE: 72? 684 00:31:35,420 --> 00:31:37,080 DAVID J. MALAN: 72 is correct. 685 00:31:37,080 --> 00:31:39,600 And again, not, intellectually, all that interesting 686 00:31:39,600 --> 00:31:41,780 and this is not the kind of math that we spend all day as CS-- 687 00:31:41,780 --> 00:31:42,905 a computer scientist doing. 688 00:31:42,905 --> 00:31:45,380 But it's just following the same darn pattern, which 689 00:31:45,380 --> 00:31:47,780 is to say it might look cryptic, but, conceptually, 690 00:31:47,780 --> 00:31:50,542 intellectually, it ultimately is exactly as we did before. 691 00:31:50,542 --> 00:31:52,250 So, yes, I'll spoil the rest of the math. 692 00:31:52,250 --> 00:31:54,860 It's 72, 73, 33. 693 00:31:54,860 --> 00:31:58,370 Now, anyone remember, in your mind's eye, what message we just spelled? 694 00:31:58,370 --> 00:31:59,180 AUDIENCE: Hi. 695 00:31:59,180 --> 00:31:59,810 AUDIENCE: Hi. 696 00:31:59,810 --> 00:32:01,520 DAVID J. MALAN: Yeah, so it is, in fact, "Hi!" 697 00:32:01,520 --> 00:32:03,270 Though, no one really said that excitedly. 698 00:32:03,270 --> 00:32:04,580 What's the 33, if you noticed? 699 00:32:04,580 --> 00:32:05,600 AUDIENCE: Exclamation point. 700 00:32:05,600 --> 00:32:06,770 DAVID J. MALAN: OK, so a lot of people noticed. 701 00:32:06,770 --> 00:32:08,630 Yes, it's an exclamation point. 702 00:32:08,630 --> 00:32:11,300 And that's, indeed, noticeable right here. 703 00:32:11,300 --> 00:32:13,063 33 is the exclamation point. 704 00:32:13,063 --> 00:32:15,480 And that's just something, eventually, that might sink in. 705 00:32:15,480 --> 00:32:18,350 But, for the most part, if you remember capital A is 65, 706 00:32:18,350 --> 00:32:22,100 you can figure out at least 25 other answers to these kinds of questions 707 00:32:22,100 --> 00:32:24,060 because they're all contiguous like that. 708 00:32:24,060 --> 00:32:25,740 So there's the exclamation point. 709 00:32:25,740 --> 00:32:30,350 But at the end of the day, we might just have this mapping known as ASCII. 710 00:32:30,350 --> 00:32:33,000 And it's how our phones, and computers, and devices, more 711 00:32:33,000 --> 00:32:35,310 generally, actually store information. 712 00:32:35,310 --> 00:32:37,050 So we thought we'd make-- 713 00:32:37,050 --> 00:32:38,970 maybe take a little pressure off of me here. 714 00:32:38,970 --> 00:32:41,550 And could we maybe flip things around? 715 00:32:41,550 --> 00:32:44,160 How about we try applying this newfound knowledge-- 716 00:32:44,160 --> 00:32:48,430 if it's, indeed, new to you-- with seven volunteers, seven bits, if we could? 717 00:32:48,430 --> 00:32:48,930 OK. 718 00:32:48,930 --> 00:32:49,847 I saw your hand first. 719 00:32:49,847 --> 00:32:50,640 Come on down. 720 00:32:50,640 --> 00:32:52,650 Maybe your hand, there. 721 00:32:52,650 --> 00:32:54,870 OK, three, come on down over here. 722 00:32:54,870 --> 00:32:56,940 How about four and five? 723 00:32:56,940 --> 00:32:57,810 Yep, come on down. 724 00:32:57,810 --> 00:32:59,018 Yep, in the black shirt, yep. 725 00:32:59,018 --> 00:33:00,393 How about let me go farther back? 726 00:33:00,393 --> 00:33:01,890 How about in the green, over there? 727 00:33:01,890 --> 00:33:03,460 And how about you, seven, over here? 728 00:33:03,460 --> 00:33:03,960 All right. 729 00:33:03,960 --> 00:33:04,650 Come on down. 730 00:33:04,650 --> 00:33:05,790 [CHATTER] 731 00:33:05,790 --> 00:33:08,400 Come on down. 732 00:33:08,400 --> 00:33:10,600 So a round of applause for our brave volunteers. 733 00:33:10,600 --> 00:33:12,740 [APPLAUSE] 734 00:33:12,740 --> 00:33:13,850 All right. 735 00:33:13,850 --> 00:33:17,060 So if you'd like to stand, roughly, side by side, here in the middle 736 00:33:17,060 --> 00:33:17,830 of the stage. 737 00:33:17,830 --> 00:33:20,430 738 00:33:20,430 --> 00:33:22,530 First of all, thank you. 739 00:33:22,530 --> 00:33:23,030 Let's see. 740 00:33:23,030 --> 00:33:25,250 1, 2, 3, 4, 5, 6, 7, perfect. 741 00:33:25,250 --> 00:33:25,880 OK. 742 00:33:25,880 --> 00:33:29,900 And let's go all the way over to this place, here. 743 00:33:29,900 --> 00:33:32,600 If you would like to introduce yourself to the class. 744 00:33:32,600 --> 00:33:34,418 RACHEL RICHEY: I'm Rachel Richey. 745 00:33:34,418 --> 00:33:35,210 DAVID J. MALAN: OK. 746 00:33:35,210 --> 00:33:36,128 And what year? 747 00:33:36,128 --> 00:33:36,920 Anything about you? 748 00:33:36,920 --> 00:33:38,915 RACHEL RICHEY: Oh, first year, concentrating in CS. 749 00:33:38,915 --> 00:33:39,707 DAVID J. MALAN: OK. 750 00:33:39,707 --> 00:33:40,670 Welcome to the stage. 751 00:33:40,670 --> 00:33:41,210 Next. 752 00:33:41,210 --> 00:33:42,080 SPEAKER: Hi. 753 00:33:42,080 --> 00:33:46,190 I'm [? Kang. ?] Also a first-year concentrating in CS. 754 00:33:46,190 --> 00:33:47,390 SPEAKER: Hello. 755 00:33:47,390 --> 00:33:52,665 My name is [? Lam. ?] I'm a [INAUDIBLE] student from education department. 756 00:33:52,665 --> 00:33:53,540 DAVID J. MALAN: Nice. 757 00:33:53,540 --> 00:33:53,810 OK. 758 00:33:53,810 --> 00:33:54,368 Next. 759 00:33:54,368 --> 00:33:55,160 JORDAN MITTLER: Hi. 760 00:33:55,160 --> 00:33:59,120 I'm Jordan Mittler, concentrating in economics and maybe some CS. 761 00:33:59,120 --> 00:34:00,110 SPEAKER: So, hi. 762 00:34:00,110 --> 00:34:02,645 I'm [? Natalia. ?] First year, and I want to do CS. 763 00:34:02,645 --> 00:34:03,435 SPEAKER: Hi. 764 00:34:03,435 --> 00:34:05,810 I'm [? Khadija. ?] I'm a first-year, and I want to do CS. 765 00:34:05,810 --> 00:34:07,080 DAVID J. MALAN: [LAUGHS]. 766 00:34:07,080 --> 00:34:08,030 SPEAKER: Hello. 767 00:34:08,030 --> 00:34:11,418 I'm [? Caleb. ?] And, once again, first year, concentrating in CS. 768 00:34:11,418 --> 00:34:12,210 DAVID J. MALAN: OK. 769 00:34:12,210 --> 00:34:12,710 Wonderful. 770 00:34:12,710 --> 00:34:13,770 A pattern, yes. 771 00:34:13,770 --> 00:34:14,340 Thank you. 772 00:34:14,340 --> 00:34:14,880 Thank you. 773 00:34:14,880 --> 00:34:15,969 [APPLAUSE] 774 00:34:15,969 --> 00:34:20,010 So, if you haven't guessed already, each of these volunteers 775 00:34:20,010 --> 00:34:23,429 is going to represent a bit, from left to right, or right to left, 776 00:34:23,429 --> 00:34:24,010 in this case. 777 00:34:24,010 --> 00:34:24,750 So let's see. 778 00:34:24,750 --> 00:34:27,719 If you want to represent-- how about the twos place? 779 00:34:27,719 --> 00:34:37,350 How about the fours place, the eighths place, 16ths place, 32's, 64, and 128? 780 00:34:37,350 --> 00:34:39,060 Although, wait a-- I think I screwed up. 781 00:34:39,060 --> 00:34:40,889 We needed one-- eighth volunteer. 782 00:34:40,889 --> 00:34:42,974 I think you know-- well, I think-- 783 00:34:42,974 --> 00:34:45,330 [CLEARS THROAT] Spot? 784 00:34:45,330 --> 00:34:46,108 OK. 785 00:34:46,108 --> 00:34:46,650 Come on over. 786 00:34:46,650 --> 00:34:49,567 If you guys could step forward a little bit, and then scooch this way, 787 00:34:49,567 --> 00:34:51,090 just to give Spot some room. 788 00:34:51,090 --> 00:34:52,650 [FOOTSTEPS] 789 00:34:52,650 --> 00:34:55,239 So Spot will represent the ones place. 790 00:34:55,239 --> 00:34:58,440 Now, what our volunteers have on the back of their sheets of paper 791 00:34:58,440 --> 00:34:59,670 are little instructions. 792 00:34:59,670 --> 00:35:05,460 We're going to spell out a three-letter word in English by using three bytes, 793 00:35:05,460 --> 00:35:08,170 from left to right, because now we have eight volunteers. 794 00:35:08,170 --> 00:35:10,503 I'm going to propose that you raise your hand, if you're 795 00:35:10,503 --> 00:35:12,185 supposed to represent a 1. 796 00:35:12,185 --> 00:35:14,310 Or you just stand there, without raising your hand, 797 00:35:14,310 --> 00:35:15,780 if you're meant to represent a 0. 798 00:35:15,780 --> 00:35:18,450 And what we'll have the audience do is do the quick math 799 00:35:18,450 --> 00:35:22,170 to figure out-- one, two, three-- each letter, what number is it. 800 00:35:22,170 --> 00:35:23,430 What letter is it? 801 00:35:23,430 --> 00:35:26,370 And we'll see what word that we have finally spelled. 802 00:35:26,370 --> 00:35:26,880 All right. 803 00:35:26,880 --> 00:35:28,410 So, in round one-- 804 00:35:28,410 --> 00:35:31,410 you have instructions on your back of your sheet that will tell you to-- 805 00:35:31,410 --> 00:35:32,580 what your number is. 806 00:35:32,580 --> 00:35:33,660 If you're 0, stand there. 807 00:35:33,660 --> 00:35:35,010 If you're a 1, raise your hand. 808 00:35:35,010 --> 00:35:37,700 809 00:35:37,700 --> 00:35:40,060 [PAPER RUSTLING] 810 00:35:40,060 --> 00:35:43,420 What number do these guys seem to be representing? 811 00:35:43,420 --> 00:35:44,560 AUDIENCE: 68. 812 00:35:44,560 --> 00:35:46,360 DAVID J. MALAN: 66, I think. 813 00:35:46,360 --> 00:35:49,495 64 plus 2, so 66, which is the letter-- 814 00:35:49,495 --> 00:35:50,260 AUDIENCE: B. 815 00:35:50,260 --> 00:35:52,930 DAVID J. MALAN: OK, so, B. OK, so, B. All right. 816 00:35:52,930 --> 00:35:54,470 Hands down. 817 00:35:54,470 --> 00:35:57,565 Second letter is going to be spelled how? 818 00:35:57,565 --> 00:36:01,160 819 00:36:01,160 --> 00:36:02,202 [SPOT LANDS ON THE STAGE] 820 00:36:02,202 --> 00:36:02,827 AUDIENCE: Whoa. 821 00:36:02,827 --> 00:36:03,530 AUDIENCE: Whoa. 822 00:36:03,530 --> 00:36:04,829 AUDIENCE: Whoa. 823 00:36:04,829 --> 00:36:07,570 DAVID J. MALAN: [LAUGHS] All right. 824 00:36:07,570 --> 00:36:09,670 What are we spelling now? 825 00:36:09,670 --> 00:36:11,635 [INDISTINCT CHATTER] 826 00:36:11,635 --> 00:36:15,580 I think-- psst, yep, OK. 827 00:36:15,580 --> 00:36:17,081 Yeah, I think you're one. 828 00:36:17,081 --> 00:36:19,490 [LAUGHTER] 829 00:36:19,490 --> 00:36:20,980 OK. 830 00:36:20,980 --> 00:36:23,430 Now what number are we spelling? 831 00:36:23,430 --> 00:36:24,370 AUDIENCE: 79 832 00:36:24,370 --> 00:36:26,770 DAVID J. MALAN: 79, I heard, which is the letter? 833 00:36:26,770 --> 00:36:27,383 AUDIENCE: O. 834 00:36:27,383 --> 00:36:28,300 DAVID J. MALAN: O. OK. 835 00:36:28,300 --> 00:36:29,320 So hands down. 836 00:36:29,320 --> 00:36:30,100 Thank you, Spot. 837 00:36:30,100 --> 00:36:31,460 One final flourish. 838 00:36:31,460 --> 00:36:33,250 So we've spelled B-O-- 839 00:36:33,250 --> 00:36:34,855 third letter, go ahead. 840 00:36:34,855 --> 00:36:37,942 841 00:36:37,942 --> 00:36:40,230 [SPOT LANDS ON THE STAGE] 842 00:36:40,230 --> 00:36:42,885 What number, now, is this? 843 00:36:42,885 --> 00:36:43,815 AUDIENCE: 87. 844 00:36:43,815 --> 00:36:44,460 AUDIENCE: 87. 845 00:36:44,460 --> 00:36:45,460 DAVID J. MALAN: I heard it here, 80-- 846 00:36:45,460 --> 00:36:46,320 AUDIENCE: Seven. 847 00:36:46,320 --> 00:36:46,875 DAVID J. MALAN: --seven, which is? 848 00:36:46,875 --> 00:36:47,505 AUDIENCE: W. 849 00:36:47,505 --> 00:36:49,620 DAVID J. MALAN: W, which, of course, spells "bow." 850 00:36:49,620 --> 00:36:53,437 So if our volunteers could take a bow, Spot included. 851 00:36:53,437 --> 00:36:56,636 [APPLAUSE] 852 00:36:56,636 --> 00:36:58,010 853 00:36:58,010 --> 00:37:01,540 So this will make more sense in week one, 854 00:37:01,540 --> 00:37:04,750 when we have an assignment involving a certain someone from the Nintendo 855 00:37:04,750 --> 00:37:04,900 World. 856 00:37:04,900 --> 00:37:06,760 But we have a lovely parting gift for each of you. 857 00:37:06,760 --> 00:37:07,510 SPEAKER: Thank you. 858 00:37:07,510 --> 00:37:07,630 [LAUGHS] 859 00:37:07,630 --> 00:37:08,180 DAVID J. MALAN: Thank you for volunteering. 860 00:37:08,180 --> 00:37:08,980 SPEAKER: Thanks. 861 00:37:08,980 --> 00:37:11,897 DAVID J. MALAN: You might need to share it with the folks next to you. 862 00:37:11,897 --> 00:37:15,106 [CHATTER] 863 00:37:15,106 --> 00:37:18,600 864 00:37:18,600 --> 00:37:19,470 Oop, here we go. 865 00:37:19,470 --> 00:37:19,970 There we go. 866 00:37:19,970 --> 00:37:20,360 Thank you-- 867 00:37:20,360 --> 00:37:21,080 SPEAKER: Thank you. 868 00:37:21,080 --> 00:37:21,380 RACHEL RICHEY: Thank you. 869 00:37:21,380 --> 00:37:21,560 DAVID J. MALAN: --so much. 870 00:37:21,560 --> 00:37:23,250 One more round of applause, if we could, for our volunteers. 871 00:37:23,250 --> 00:37:23,810 Thank you. 872 00:37:23,810 --> 00:37:24,734 [APPLAUSE] 873 00:37:24,734 --> 00:37:26,120 Did you lose something? 874 00:37:26,120 --> 00:37:27,490 OK. 875 00:37:27,490 --> 00:37:28,030 All right. 876 00:37:28,030 --> 00:37:31,190 So, [LAUGHS] Spot's had it. 877 00:37:31,190 --> 00:37:34,060 So let's see, then, if we've solved, now, 878 00:37:34,060 --> 00:37:36,640 the problem of representing English letters of the alphabet, 879 00:37:36,640 --> 00:37:39,850 being able to spell out words like "bow," B-O-W. What if we actually do 880 00:37:39,850 --> 00:37:41,210 have accented characters? 881 00:37:41,210 --> 00:37:43,883 What if we do have other glyphs that we want to represent? 882 00:37:43,883 --> 00:37:47,050 Well, here, of course, is a standard US English keyboard, which a lot of you 883 00:37:47,050 --> 00:37:47,650 might have. 884 00:37:47,650 --> 00:37:50,260 But there's also characters that you can type much more 885 00:37:50,260 --> 00:37:52,930 easily if you have a foreign keyboard, relative to the US, 886 00:37:52,930 --> 00:37:55,780 or with certain keystrokes on your own Mac, PC, and phone. 887 00:37:55,780 --> 00:37:59,230 But, nowadays, too, there's this menu that, probably, you've 888 00:37:59,230 --> 00:38:03,400 used in the past hour or two to actually send some emoji. 889 00:38:03,400 --> 00:38:06,040 An emoji, even though they look like pictures 890 00:38:06,040 --> 00:38:08,080 and they actually are pictures on the screen, 891 00:38:08,080 --> 00:38:13,120 they're, technically, just characters, characters of an emoji alphabet 892 00:38:13,120 --> 00:38:16,330 that happened to use a certain pattern of 0's and 1's to represent 893 00:38:16,330 --> 00:38:19,880 each of these faces, each of these people, and places, and things. 894 00:38:19,880 --> 00:38:22,540 And it turns out that one of the reasons that we have just 895 00:38:22,540 --> 00:38:29,240 so many [LAUGHS] such characters nowadays is because we now 896 00:38:29,240 --> 00:38:31,370 use Unicode instead of ASCII. 897 00:38:31,370 --> 00:38:34,370 So Unicode is a superset, so to speak, of ASCII, 898 00:38:34,370 --> 00:38:38,030 which is to say that we, humans, realized, some time ago, that just 899 00:38:38,030 --> 00:38:40,370 using eight bits to represent letters of the alphabet 900 00:38:40,370 --> 00:38:43,070 certainly isn't very good when we want to represent 901 00:38:43,070 --> 00:38:44,960 other, non-English languages. 902 00:38:44,960 --> 00:38:47,240 So Unicode doesn't just use eight bits. 903 00:38:47,240 --> 00:38:52,520 It sometimes uses 16 bits per character, sometimes 24 bits per character, 904 00:38:52,520 --> 00:38:55,610 and sometimes even 32 bits per character. 905 00:38:55,610 --> 00:38:56,690 Now, why those numbers? 906 00:38:56,690 --> 00:39:00,680 That's just one byte, two bytes, three bytes, or four bytes. 907 00:39:00,680 --> 00:39:02,132 And that gives us-- 908 00:39:02,132 --> 00:39:02,840 does anyone know? 909 00:39:02,840 --> 00:39:06,380 That gives us the ability to represent as many as 4 910 00:39:06,380 --> 00:39:08,630 billion possible characters. 911 00:39:08,630 --> 00:39:12,150 Because if the longest one is 32 bits, that's 2 to the 32, 912 00:39:12,150 --> 00:39:15,090 which, if you do out the math, trust me, is roughly 4 billion. 913 00:39:15,090 --> 00:39:16,430 So that's a lot of characters. 914 00:39:16,430 --> 00:39:19,040 And we've got a lot of room, then, for these emoji. 915 00:39:19,040 --> 00:39:22,130 But it's not just about having fun, pictorially, on the screen. 916 00:39:22,130 --> 00:39:27,830 Unicode's mission really is to represent and to preserve all human languages 917 00:39:27,830 --> 00:39:31,530 digitally, both past, present, and future. 918 00:39:31,530 --> 00:39:35,420 So it is really about capturing the entirety of human knowledge, 919 00:39:35,420 --> 00:39:37,430 as we've expressed it in language, but also 920 00:39:37,430 --> 00:39:42,020 giving this newfound ability that's been used centuries ago, too-- in writings, 921 00:39:42,020 --> 00:39:44,300 on walls, and the like-- pictograms via which 922 00:39:44,300 --> 00:39:46,640 we can still communicate, even independently 923 00:39:46,640 --> 00:39:48,030 of our own human language. 924 00:39:48,030 --> 00:39:51,320 So we'll reduce it, today, to just patterns of 0's and 1's, but 925 00:39:51,320 --> 00:39:56,190 the problem being solved is much greater and well-beyond CS, itself, there. 926 00:39:56,190 --> 00:39:58,610 So here is a pattern of 0's and 1's using 927 00:39:58,610 --> 00:40:04,310 Unicode, so more than eight bits, that represents a very popular emoji, which 928 00:40:04,310 --> 00:40:06,090 might be a bit of a hint. 929 00:40:06,090 --> 00:40:08,870 This is the most popular emoji, as of last year, at least, 930 00:40:08,870 --> 00:40:10,330 statistically, internationally. 931 00:40:10,330 --> 00:40:13,078 [INTERPOSING VOICES] 932 00:40:13,078 --> 00:40:14,370 DAVID J. MALAN: Does this help? 933 00:40:14,370 --> 00:40:16,520 It's, roughly, this number here. 934 00:40:16,520 --> 00:40:17,240 No? 935 00:40:17,240 --> 00:40:19,080 It's this one here. 936 00:40:19,080 --> 00:40:23,360 So this is the most popular emoji, by most measures, as of last year. 937 00:40:23,360 --> 00:40:25,170 But it doesn't always look like this. 938 00:40:25,170 --> 00:40:28,190 Those of you who have a Mac or an iPhone recognize this symbol, perhaps, 939 00:40:28,190 --> 00:40:28,690 immediately. 940 00:40:28,690 --> 00:40:31,100 Those of you with Android devices or other platforms 941 00:40:31,100 --> 00:40:35,310 might notice that it's the same idea, but it's a little bit different. 942 00:40:35,310 --> 00:40:38,660 And this is because, too, emojis, at the end of the day, 943 00:40:38,660 --> 00:40:41,420 just represent character, but those characters can be drawn, 944 00:40:41,420 --> 00:40:43,070 can be painted in different ways. 945 00:40:43,070 --> 00:40:46,130 And reasonable people will interpret differently 946 00:40:46,130 --> 00:40:49,880 this emoji, whose official name is "face with tears of joy." 947 00:40:49,880 --> 00:40:52,130 And, indeed, Google interprets it a little differently 948 00:40:52,130 --> 00:40:55,813 from Apple, versus Microsoft, versus Meta, versus other companies, as well. 949 00:40:55,813 --> 00:40:57,980 So you can almost think of those different companies 950 00:40:57,980 --> 00:41:00,230 as having different fonts for emoji. 951 00:41:00,230 --> 00:41:04,160 And that really starts to connect things to the world of text and characters. 952 00:41:04,160 --> 00:41:05,720 So, just so you've seen it. 953 00:41:05,720 --> 00:41:07,110 More on this, another time. 954 00:41:07,110 --> 00:41:10,980 It turns out that emoji and, really, characters, in general, 955 00:41:10,980 --> 00:41:13,430 we don't use binary 0's and 1's to represent them 956 00:41:13,430 --> 00:41:15,740 because no one, myself included, is going to recognize what's what. 957 00:41:15,740 --> 00:41:16,520 It's just too much math. 958 00:41:16,520 --> 00:41:17,480 It's not interesting. 959 00:41:17,480 --> 00:41:19,880 And even decimal numbers-- that was 4 billion or some-- 960 00:41:19,880 --> 00:41:22,260 I don't remember which number is which. 961 00:41:22,260 --> 00:41:24,410 So we represent things a little more compactly. 962 00:41:24,410 --> 00:41:26,510 And this, too, admittedly, still looks cryptic, 963 00:41:26,510 --> 00:41:30,770 but this is a Unicode code point that uses another system, mathematically, 964 00:41:30,770 --> 00:41:33,470 called base-16 or hexadecimal. 965 00:41:33,470 --> 00:41:34,670 More on that, another time. 966 00:41:34,670 --> 00:41:38,090 But it's just a way of representing numbers even more succinctly, 967 00:41:38,090 --> 00:41:41,270 writing less on the screen, because you're using not just 0 968 00:41:41,270 --> 00:41:42,590 through 9, as in decimal. 969 00:41:42,590 --> 00:41:46,010 But you're using A through F, as well, so a few letters 970 00:41:46,010 --> 00:41:47,670 of the English alphabet come into play. 971 00:41:47,670 --> 00:41:49,700 But, for now, that's just a little easier 972 00:41:49,700 --> 00:41:53,750 to remember, too, for people who care, that that is the number that 973 00:41:53,750 --> 00:41:55,880 represents "face with tears of joy." 974 00:41:55,880 --> 00:41:58,010 But what if we want a customized emoji? 975 00:41:58,010 --> 00:41:59,780 And this, increasingly, is the case. 976 00:41:59,780 --> 00:42:01,910 Here, for instance, are the five skin tones 977 00:42:01,910 --> 00:42:04,760 that phones, and laptops, and desktops, nowadays, support. 978 00:42:04,760 --> 00:42:07,802 It's based on something called the "Fitzpatrick scale," which essentially 979 00:42:07,802 --> 00:42:10,460 categorizes human skin tone into six or, in this case, five 980 00:42:10,460 --> 00:42:12,560 different categories, from lighter to darker. 981 00:42:12,560 --> 00:42:17,480 But this suggests that, wow, if we want to represent people 982 00:42:17,480 --> 00:42:22,040 with five different skin tones, like this, that could significantly 983 00:42:22,040 --> 00:42:25,130 increase how many unique patterns of 0's and 1's we 984 00:42:25,130 --> 00:42:26,890 need for every possible face. 985 00:42:26,890 --> 00:42:29,540 But if we think about it from an engineering perspective, 986 00:42:29,540 --> 00:42:33,068 we can actually just think of skin tone as modifying some default 987 00:42:33,068 --> 00:42:34,360 color, for better or for worse. 988 00:42:34,360 --> 00:42:37,450 And yellow is the de facto default, Simpson style. 989 00:42:37,450 --> 00:42:41,350 But to modify it to look more genuinely human-like, from lighter to darker, 990 00:42:41,350 --> 00:42:43,990 well, maybe we just use the same pattern of bits 991 00:42:43,990 --> 00:42:47,720 to represent a human thumb, for instance, thumbs up or thumbs down. 992 00:42:47,720 --> 00:42:51,210 And we just, then, modify that character to be displayed with a different skin 993 00:42:51,210 --> 00:42:51,710 tone. 994 00:42:51,710 --> 00:42:53,950 So, for instance, here, then, is the "thumbs up" 995 00:42:53,950 --> 00:42:55,750 that you might use on various platforms. 996 00:42:55,750 --> 00:42:59,200 And let me just stipulate that this is the Unicode code point. 997 00:42:59,200 --> 00:43:01,870 That is the number that Macs, PCs, and phones 998 00:43:01,870 --> 00:43:05,960 use underneath the hood to represent the default yellow "thumbs up." 999 00:43:05,960 --> 00:43:08,770 But if you want to give it a medium skin tone, 1000 00:43:08,770 --> 00:43:12,370 you still use that same number, that same pattern of 0's and 1's, 1001 00:43:12,370 --> 00:43:13,930 or switches, underneath the hood. 1002 00:43:13,930 --> 00:43:17,620 But you use a few more switches that the computer or phone 1003 00:43:17,620 --> 00:43:20,800 will interpret as, "Oh, you don't want to see the default in yellow 1004 00:43:20,800 --> 00:43:23,890 because of this second number that's in the computer's memory somewhere. 1005 00:43:23,890 --> 00:43:27,170 You want me to adjust it to be the medium skin tone or any 1006 00:43:27,170 --> 00:43:29,010 of the other values, instead." 1007 00:43:29,010 --> 00:43:31,580 So that's the engineering solution to this problem 1008 00:43:31,580 --> 00:43:35,078 of just trying to represent different ranges of emoji here. 1009 00:43:35,078 --> 00:43:36,620 Well, what about something like this? 1010 00:43:36,620 --> 00:43:38,480 There's a lot more combinatorics, nowadays, 1011 00:43:38,480 --> 00:43:40,522 on your keyboard for relationships, for instance. 1012 00:43:40,522 --> 00:43:43,620 So here is a "couple with heart" here. 1013 00:43:43,620 --> 00:43:46,520 So the couple, here, of course, is represented with, apparently, 1014 00:43:46,520 --> 00:43:47,600 this number here. 1015 00:43:47,600 --> 00:43:48,255 But that's it. 1016 00:43:48,255 --> 00:43:50,630 But if you want to be more specific-- like man and woman, 1017 00:43:50,630 --> 00:43:53,240 or man-man, woman-woman-- it's the same idea, 1018 00:43:53,240 --> 00:43:56,630 but we just need to express ourselves a little-- with a little 1019 00:43:56,630 --> 00:43:57,600 more information. 1020 00:43:57,600 --> 00:44:00,560 So, for instance, the way the Unicode folks came up with, 1021 00:44:00,560 --> 00:44:03,830 years ago, to represent, for instance, a woman with a heart and a man, 1022 00:44:03,830 --> 00:44:06,480 from left to right, would be using these values. 1023 00:44:06,480 --> 00:44:08,900 So things just escalated quickly, but only 1024 00:44:08,900 --> 00:44:12,560 in the sense that we're using more bits, more 0's and 1's, to represent, 1025 00:44:12,560 --> 00:44:15,470 more expressively, this particular combination. 1026 00:44:15,470 --> 00:44:18,050 So this happens to be the number in Unicode 1027 00:44:18,050 --> 00:44:19,790 that represents the woman at left. 1028 00:44:19,790 --> 00:44:22,430 This is the number that represents the man at right. 1029 00:44:22,430 --> 00:44:25,160 And this is the pair of numbers that represents 1030 00:44:25,160 --> 00:44:29,550 the heart in the middle, sometimes red, sometimes pink, displayed here as pink. 1031 00:44:29,550 --> 00:44:32,510 But if we want to change the combination, for instance, to be, 1032 00:44:32,510 --> 00:44:33,920 say, woman-- 1033 00:44:33,920 --> 00:44:36,320 if we want to change the combination to be woman-woman, 1034 00:44:36,320 --> 00:44:39,200 notice that, now, the left and the rightmost numbers match. 1035 00:44:39,200 --> 00:44:42,290 Or if we flip it back to man-man, it's just using different numbers 1036 00:44:42,290 --> 00:44:43,790 on the tail end again. 1037 00:44:43,790 --> 00:44:48,380 And meanwhile, if I rewind, there's these two identical values here. 1038 00:44:48,380 --> 00:44:51,680 These are called zero-width joiners or ZWNJ characters. 1039 00:44:51,680 --> 00:44:55,460 It just is a special number that humans reserve to say, 1040 00:44:55,460 --> 00:45:00,210 glue the emoji at the left to the emoji on the right and so forth. 1041 00:45:00,210 --> 00:45:02,370 So it connects ideas in this way. 1042 00:45:02,370 --> 00:45:04,490 So there's actually a lot of emojis, nowadays, 1043 00:45:04,490 --> 00:45:07,370 that are a combination of different things. 1044 00:45:07,370 --> 00:45:09,650 "Heart on fire" is one that's, technically, 1045 00:45:09,650 --> 00:45:13,190 the combination of a heart emoji, the fire emoji, 1046 00:45:13,190 --> 00:45:16,110 joined together, numerically, in this way. 1047 00:45:16,110 --> 00:45:18,290 So computer scientists who come up with these things 1048 00:45:18,290 --> 00:45:21,290 are just reducing things to representations. 1049 00:45:21,290 --> 00:45:23,430 All we have at our disposal are 0's and 1's. 1050 00:45:23,430 --> 00:45:25,250 So we all just need to agree, ultimately-- 1051 00:45:25,250 --> 00:45:28,760 whether we're Google, Microsoft, or the like-- how we're going to standardize 1052 00:45:28,760 --> 00:45:31,030 these kinds of things as information. 1053 00:45:31,030 --> 00:45:36,520 Questions, then, on how characters are represented in a computer, 1054 00:45:36,520 --> 00:45:38,260 be it English or any other language? 1055 00:45:38,260 --> 00:45:38,760 Yeah. 1056 00:45:38,760 --> 00:45:40,630 AUDIENCE: How is the plus a number? 1057 00:45:40,630 --> 00:45:41,963 DAVID J. MALAN: How is the what? 1058 00:45:41,963 --> 00:45:43,930 AUDIENCE: The plus, the U+. 1059 00:45:43,930 --> 00:45:46,600 DAVID J. MALAN: Oh, the U+ is just a convention, really. 1060 00:45:46,600 --> 00:45:49,820 So U+ represents a special Unicode character, 1061 00:45:49,820 --> 00:45:51,790 which is a U with a plus in the middle. 1062 00:45:51,790 --> 00:45:54,590 And this is just the convention for saying, 1063 00:45:54,590 --> 00:45:58,600 hey, everyone, here comes a number that represents a Unicode code point. 1064 00:45:58,600 --> 00:46:00,070 The U and the 1 have no-- sorry. 1065 00:46:00,070 --> 00:46:02,278 The U and the plus have no mathematical significance. 1066 00:46:02,278 --> 00:46:05,470 It's just a visual clue to folks. 1067 00:46:05,470 --> 00:46:10,460 Other questions on representing text in this way? 1068 00:46:10,460 --> 00:46:10,960 All right. 1069 00:46:10,960 --> 00:46:12,240 So what about colors? 1070 00:46:12,240 --> 00:46:13,990 We've already started looking at pictures. 1071 00:46:13,990 --> 00:46:17,032 Well, how are those pictures, be it emojis or anything else, represented? 1072 00:46:17,032 --> 00:46:19,870 One of the most common ways is just with RGB-- 1073 00:46:19,870 --> 00:46:20,950 red, green, and blue. 1074 00:46:20,950 --> 00:46:24,700 It turns out that if we just keep track of how much red should 1075 00:46:24,700 --> 00:46:27,880 be on the screen, and how much green, and how much blue, combined together, 1076 00:46:27,880 --> 00:46:29,890 that gives us every color of the rainbow, 1077 00:46:29,890 --> 00:46:32,120 from white to black and everything in between. 1078 00:46:32,120 --> 00:46:35,620 So how do we represent an amount of red, and green, and blue? 1079 00:46:35,620 --> 00:46:37,690 Well, frankly, just with three different numbers. 1080 00:46:37,690 --> 00:46:40,030 And this is how computers typically represent colors. 1081 00:46:40,030 --> 00:46:43,220 Every one of the dots on your computer screen or your phone screen 1082 00:46:43,220 --> 00:46:44,390 is called a pixel. 1083 00:46:44,390 --> 00:46:50,130 And every single dot underneath the hood has three numbers associated with it, 1084 00:46:50,130 --> 00:46:53,000 so three numbers, three numbers, three numbers for every little dot. 1085 00:46:53,000 --> 00:46:56,420 And those three numbers, together, say how much red, green, and blue 1086 00:46:56,420 --> 00:46:59,040 should the device display at that location. 1087 00:46:59,040 --> 00:47:02,390 So, for instance, if you had a dot on your screen 1088 00:47:02,390 --> 00:47:07,520 that said, "use this much red, this much green this much blue," because each 1089 00:47:07,520 --> 00:47:11,820 of these numbers, I'll tell you, are one byte or eight bits, 1090 00:47:11,820 --> 00:47:15,710 which means the total possible values is 0 to 255-- 1091 00:47:15,710 --> 00:47:19,070 let me just ballpark that the 72, it feels like a medium amount of red 1092 00:47:19,070 --> 00:47:21,350 because it's in between 0 and 255. 1093 00:47:21,350 --> 00:47:25,590 73 is a medium amount of green, and 33 of blue is just a little bit. 1094 00:47:25,590 --> 00:47:29,480 So if you combine a medium amount of red, green, and a little bit of blue, 1095 00:47:29,480 --> 00:47:32,840 anyone want to guess what color of the rainbow this is? 1096 00:47:32,840 --> 00:47:33,507 AUDIENCE: Brown. 1097 00:47:33,507 --> 00:47:34,423 DAVID J. MALAN: Sorry? 1098 00:47:34,423 --> 00:47:35,190 AUDIENCE: Brown. 1099 00:47:35,190 --> 00:47:36,470 DAVID J. MALAN: Brown? 1100 00:47:36,470 --> 00:47:37,228 So, close. 1101 00:47:37,228 --> 00:47:39,020 It's a little more yellow than it is brown. 1102 00:47:39,020 --> 00:47:41,920 But if we combine them, it looks a little something like this. 1103 00:47:41,920 --> 00:47:43,887 This is just CS trivia, not something that even 1104 00:47:43,887 --> 00:47:46,970 I would be able to eyeball, unless I came up with that particular example. 1105 00:47:46,970 --> 00:47:48,607 But wait a minute. 1106 00:47:48,607 --> 00:47:49,940 We've seen these numbers before. 1107 00:47:49,940 --> 00:47:51,768 72, 73, 33 represented what-- 1108 00:47:51,768 --> 00:47:52,310 AUDIENCE: Hi! 1109 00:47:52,310 --> 00:47:53,370 DAVID J. MALAN: --a few minutes ago? 1110 00:47:53,370 --> 00:47:55,787 So it meant "Hi!" but here I am, claiming, no, no, no, no, 1111 00:47:55,787 --> 00:47:57,140 that means yellow. 1112 00:47:57,140 --> 00:47:58,890 How do you reconcile this? 1113 00:47:58,890 --> 00:48:01,550 Well, at the end of the day, this is all we have, 1114 00:48:01,550 --> 00:48:04,310 0's and 1's, whether you think of them as numbers, 1115 00:48:04,310 --> 00:48:06,620 or letters, or even colors now. 1116 00:48:06,620 --> 00:48:08,400 But it depends on the context. 1117 00:48:08,400 --> 00:48:11,390 So if you've received a text message or an email, 1118 00:48:11,390 --> 00:48:13,850 odds are the pattern of 0's and 1's that the computer 1119 00:48:13,850 --> 00:48:17,300 is showing you are going to be interpreted as text because that's 1120 00:48:17,300 --> 00:48:19,940 the whole point of a text message or an email. 1121 00:48:19,940 --> 00:48:23,930 If, though, you opened up MacOS's or iOS's or Windows's or Android's 1122 00:48:23,930 --> 00:48:27,230 calculator app, the same pattern of 0's and 1's might 1123 00:48:27,230 --> 00:48:30,650 be interpreted as numbers for some addition, or subtraction, or whatever. 1124 00:48:30,650 --> 00:48:33,780 If you open the same pattern of 0's and 1's in Photoshop, 1125 00:48:33,780 --> 00:48:37,110 like a graphics program, they're going to be interpreted, in that context, 1126 00:48:37,110 --> 00:48:37,950 as colors. 1127 00:48:37,950 --> 00:48:39,098 So context matters. 1128 00:48:39,098 --> 00:48:40,890 And, indeed, as soon as next week, when you 1129 00:48:40,890 --> 00:48:43,080 start writing code in that language called C, 1130 00:48:43,080 --> 00:48:47,550 the onus will be on you, the programmer, to tell the computer, interpret 1131 00:48:47,550 --> 00:48:52,593 the following sequence of bits as a number, or a letter, or something else. 1132 00:48:52,593 --> 00:48:55,260 And you won't have to even worry about what the 0's and 1's are, 1133 00:48:55,260 --> 00:48:58,380 but you need to give the computer a hint as to what type of file 1134 00:48:58,380 --> 00:49:00,730 or piece of data you're representing. 1135 00:49:00,730 --> 00:49:01,890 So that gives us bits. 1136 00:49:01,890 --> 00:49:05,640 And you can actually see these dots, these pixels on the screen. 1137 00:49:05,640 --> 00:49:07,380 Let me zoom in, zoom in. 1138 00:49:07,380 --> 00:49:10,470 And here we have it, just with this emoji, which, at the end of the day, 1139 00:49:10,470 --> 00:49:13,380 is a picture that someone at Apple, in this case, drew. 1140 00:49:13,380 --> 00:49:16,440 And you can see-- if you really zoom in, or take your phone or TV 1141 00:49:16,440 --> 00:49:19,470 and really put it close to your face, you'll see all of these dots, 1142 00:49:19,470 --> 00:49:20,700 depending on the hardware. 1143 00:49:20,700 --> 00:49:23,250 And each of these dots, these squares, is 1144 00:49:23,250 --> 00:49:28,350 storing 24 bits or three bytes, 24 bits, 24 bits, 24 bits. 1145 00:49:28,350 --> 00:49:31,200 And that's whey, dot, dot, dot, if you've 1146 00:49:31,200 --> 00:49:35,730 got a photograph, for instance, that's three megabytes, which 1147 00:49:35,730 --> 00:49:42,030 is 3 million bytes, well, odds are there's 1 million pixels therein 1148 00:49:42,030 --> 00:49:45,240 because you're using three bytes per pixel 1149 00:49:45,240 --> 00:49:46,708 to represent each of those colors. 1150 00:49:46,708 --> 00:49:48,750 That's a bit of an oversimplification, but that's 1151 00:49:48,750 --> 00:49:51,840 why images and photos are getting bigger and bigger nowadays. 1152 00:49:51,840 --> 00:49:56,110 Because we're throwing even more pixels into the file. 1153 00:49:56,110 --> 00:49:56,610 Music-- 1154 00:49:56,610 --> 00:49:57,330 [MUSIC PLAYING] 1155 00:49:57,330 --> 00:49:59,880 --how could you represent music, digitally, 1156 00:49:59,880 --> 00:50:03,920 using just 0's and 1's, or numbers, really? 1157 00:50:03,920 --> 00:50:07,710 Any instinct, whether a musician or not? 1158 00:50:07,710 --> 00:50:08,743 Yeah. 1159 00:50:08,743 --> 00:50:11,060 AUDIENCE: The notes could be represented by a number. 1160 00:50:11,060 --> 00:50:13,768 DAVID J. MALAN: Yeah, so we can just represent notes by a number. 1161 00:50:13,768 --> 00:50:17,660 So A is some number, and B. And maybe sharp or flat is some other number. 1162 00:50:17,660 --> 00:50:21,610 But note might not be quite enough for some-- 1163 00:50:21,610 --> 00:50:22,110 yeah? 1164 00:50:22,110 --> 00:50:22,876 AUDIENCE: [INAUDIBLE]. 1165 00:50:22,876 --> 00:50:23,834 DAVID J. MALAN: Ah, OK. 1166 00:50:23,834 --> 00:50:26,470 So one note-- one number to represent the note, itself, 1167 00:50:26,470 --> 00:50:30,820 the sound or the pitch; one other number to represent the duration. 1168 00:50:30,820 --> 00:50:35,000 In the context of piano, how long is the human holding the key down? 1169 00:50:35,000 --> 00:50:37,330 And maybe I can think of a third, the loudness. 1170 00:50:37,330 --> 00:50:39,457 How hard has the person played that note? 1171 00:50:39,457 --> 00:50:41,290 So, minimally, with three numbers, you could 1172 00:50:41,290 --> 00:50:43,492 imagine representing music, as well. 1173 00:50:43,492 --> 00:50:45,700 And, indeed, that's very well might be what computers 1174 00:50:45,700 --> 00:50:47,720 are doing when you listen to sound. 1175 00:50:47,720 --> 00:50:48,610 What about video? 1176 00:50:48,610 --> 00:50:51,760 How could you represent videos, as well? 1177 00:50:51,760 --> 00:50:52,270 Yeah? 1178 00:50:52,270 --> 00:50:53,460 AUDIENCE: Through many images. 1179 00:50:53,460 --> 00:50:54,790 DAVID J. MALAN: Yeah, many images. 1180 00:50:54,790 --> 00:50:57,750 So if you've ever produced a film or looked at some of the fine print, 1181 00:50:57,750 --> 00:51:02,070 30 frames per second, FPS, or 29 frames per second 1182 00:51:02,070 --> 00:51:04,560 is just how many pictures are flying across the screen. 1183 00:51:04,560 --> 00:51:06,810 But that's really all a video file is on a computer, 1184 00:51:06,810 --> 00:51:10,470 lots of pictures moving so quickly in front of us that you and I, our brains, 1185 00:51:10,470 --> 00:51:12,930 interpolate that as being actual motion. 1186 00:51:12,930 --> 00:51:15,720 And, in fact, from yesteryear, motion pictures, 1187 00:51:15,720 --> 00:51:18,570 it's like pictures that are giving the illusion of motion, 1188 00:51:18,570 --> 00:51:21,910 even though there's only 30 or so of them flying across the screen. 1189 00:51:21,910 --> 00:51:24,870 So we have a way, now, to represent information, both as 1190 00:51:24,870 --> 00:51:29,250 input and output, whether it's numbers, letters, images, anything else. 1191 00:51:29,250 --> 00:51:32,200 Let's now focus on what's inside of that black box, 1192 00:51:32,200 --> 00:51:36,360 so to speak, wherein we have algorithms, step-by-step instructions 1193 00:51:36,360 --> 00:51:38,430 for solving some problem. 1194 00:51:38,430 --> 00:51:41,760 Now, what do I mean by "algorithms" or "step-by-step instructions"? 1195 00:51:41,760 --> 00:51:44,815 Well, maybe, if we were to turn this into code-- 1196 00:51:44,815 --> 00:51:47,190 and that's how we'll connect the dots, ultimately, today. 1197 00:51:47,190 --> 00:51:51,480 Code is just the implementation, in computers, of algorithms. 1198 00:51:51,480 --> 00:51:53,920 An algorithm can be something we do in the physical world. 1199 00:51:53,920 --> 00:51:58,180 Code is how we implement that exact same idea, in the context of a computer, 1200 00:51:58,180 --> 00:51:58,810 instead. 1201 00:51:58,810 --> 00:52:02,152 And here, for instance, is a very common application inside of a computer, 1202 00:52:02,152 --> 00:52:02,860 for your context. 1203 00:52:02,860 --> 00:52:04,900 This is the iOS version of the icon. 1204 00:52:04,900 --> 00:52:06,963 And, typically, if you click on that icon, 1205 00:52:06,963 --> 00:52:09,130 you'll see something like all of your contacts here, 1206 00:52:09,130 --> 00:52:12,250 typically, alphabetical, by first name or last name. 1207 00:52:12,250 --> 00:52:17,103 And your phone or your computer lets you often search for someone's name 1208 00:52:17,103 --> 00:52:17,770 at the very top. 1209 00:52:17,770 --> 00:52:20,620 And it will autocomplete, and it'll be pretty darn fast. 1210 00:52:20,620 --> 00:52:23,470 But it'll be pretty darn fast because the programmers who 1211 00:52:23,470 --> 00:52:28,210 implemented that application are looking for someone quickly for you. 1212 00:52:28,210 --> 00:52:33,400 Now, I can do this old school style, whereby we have one of these things 1213 00:52:33,400 --> 00:52:35,840 from yesteryear, an actual phone book. 1214 00:52:35,840 --> 00:52:39,160 So, in a physical phone book like this, you might have 1,000 pages. 1215 00:52:39,160 --> 00:52:42,440 And on every page are a bunch of names and a bunch of numbers. 1216 00:52:42,440 --> 00:52:45,490 And as I flip through this, I could look for someone specific. 1217 00:52:45,490 --> 00:52:49,010 So suppose I want to call John Harvard, who's-- the first name, of course, 1218 00:52:49,010 --> 00:52:52,720 starts with a J. Well, I could just turn, page by page, 1219 00:52:52,720 --> 00:52:54,590 looking for John Harvard. 1220 00:52:54,590 --> 00:52:57,000 And if he's not there, I keep turning and turning. 1221 00:52:57,000 --> 00:52:58,000 So this is an algorithm. 1222 00:52:58,000 --> 00:53:00,790 I'm stepping through the phone book, one page at a time. 1223 00:53:00,790 --> 00:53:04,510 Is it correct, this algorithm, assuming I'm looking down? 1224 00:53:04,510 --> 00:53:05,470 So, yeah. 1225 00:53:05,470 --> 00:53:07,930 I mean, it's stupidly slow because why am 1226 00:53:07,930 --> 00:53:10,585 I wasting my time with the A's, and the B's, and the so forth? 1227 00:53:10,585 --> 00:53:12,460 I could probably take bigger bites out of it. 1228 00:53:12,460 --> 00:53:13,210 But it is correct. 1229 00:53:13,210 --> 00:53:16,293 And that's going to be one of the goals of writing code, is to, of course, 1230 00:53:16,293 --> 00:53:18,100 solve the problem you care about correctly. 1231 00:53:18,100 --> 00:53:20,470 So correctness goes without saying, or else what's 1232 00:53:20,470 --> 00:53:23,080 the point of writing the code or solving-- or implementing 1233 00:53:23,080 --> 00:53:23,800 the algorithm? 1234 00:53:23,800 --> 00:53:24,040 All right. 1235 00:53:24,040 --> 00:53:25,623 Well, let me at least speed things up. 1236 00:53:25,623 --> 00:53:29,380 So, instead of one page at a time, so, two, four, six, eight-- 1237 00:53:29,380 --> 00:53:33,420 no, ignore that-- 10, 12, 14, 16, and so forth. 1238 00:53:33,420 --> 00:53:35,920 It's a little hard to do, physically, but it sounded faster. 1239 00:53:35,920 --> 00:53:38,815 It was twice as fast, theoretically, but is it correct? 1240 00:53:38,815 --> 00:53:39,505 AUDIENCE: No. 1241 00:53:39,505 --> 00:53:40,480 DAVID J. MALAN: So, no. 1242 00:53:40,480 --> 00:53:41,210 Why? 1243 00:53:41,210 --> 00:53:41,710 Yeah? 1244 00:53:41,710 --> 00:53:43,180 AUDIENCE: Yeah, you might [INAUDIBLE]. 1245 00:53:43,180 --> 00:53:46,263 DAVID J. MALAN: Yeah, I might miss John Harvard because, just by accident, 1246 00:53:46,263 --> 00:53:48,490 he might get sandwiched between two pages. 1247 00:53:48,490 --> 00:53:52,210 But do I have to throw the algorithm out altogether? 1248 00:53:52,210 --> 00:53:53,260 Probably not. 1249 00:53:53,260 --> 00:53:56,073 Once I reach the K section, which is past the J section, 1250 00:53:56,073 --> 00:53:58,990 I could double back at least one page, at least, [PATS TELEPHONE BOOK] 1251 00:53:58,990 --> 00:54:01,540 and just make sure I didn't blow past him completely. 1252 00:54:01,540 --> 00:54:04,450 So that is twice as fast, because I'm going two pages 1253 00:54:04,450 --> 00:54:05,922 at a time, plus one extra step. 1254 00:54:05,922 --> 00:54:07,130 So it's still an improvement. 1255 00:54:07,130 --> 00:54:08,922 So the first algorithm, worst case, if it's 1256 00:54:08,922 --> 00:54:10,900 not John, but someone whose name starts with Z, 1257 00:54:10,900 --> 00:54:12,860 that might take me a full 1,000 steps. 1258 00:54:12,860 --> 00:54:16,210 The second algorithm is just 500 steps because I'm 1259 00:54:16,210 --> 00:54:19,660 going two pages at a time plus one, in case I have to double back, 1260 00:54:19,660 --> 00:54:20,990 but that's in the worst case. 1261 00:54:20,990 --> 00:54:26,080 But most of us in the-- in yesteryear, and what Apple, and Google, and others 1262 00:54:26,080 --> 00:54:29,440 are actually doing is, in software or here, physically, 1263 00:54:29,440 --> 00:54:31,540 we're typically going, roughly, to the middle. 1264 00:54:31,540 --> 00:54:34,360 Especially if there's no cheat sheet on the side, like A through Z, 1265 00:54:34,360 --> 00:54:36,235 I'm just going to go to, roughly, the middle. 1266 00:54:36,235 --> 00:54:38,920 And, oh, here I am, not surprisingly, in the M section. 1267 00:54:38,920 --> 00:54:40,360 But what do I now know. 1268 00:54:40,360 --> 00:54:43,660 If this is the M section, where is John Harvard? 1269 00:54:43,660 --> 00:54:46,130 So, clearly, to the left, alphabetically. 1270 00:54:46,130 --> 00:54:49,660 And so here is where we can take a much bigger bite out of the problem. 1271 00:54:49,660 --> 00:54:52,480 We can really divide and conquer this problem 1272 00:54:52,480 --> 00:54:56,080 by tearing [TEARS BOOK] the problem in half, throwing half of it 1273 00:54:56,080 --> 00:55:01,240 away, 500 pages away, leaving me with a smaller problem, 1274 00:55:01,240 --> 00:55:04,370 half as big, that I can really just now repeat. 1275 00:55:04,370 --> 00:55:07,150 So I go, roughly, here, and now I'm in the E section. 1276 00:55:07,150 --> 00:55:09,102 So I went a little too far back. 1277 00:55:09,102 --> 00:55:10,060 But what do I now know? 1278 00:55:10,060 --> 00:55:11,680 If this is the E pages, where's John? 1279 00:55:11,680 --> 00:55:12,460 AUDIENCE: To the right. 1280 00:55:12,460 --> 00:55:13,690 DAVID J. MALAN: So now he's to the right. 1281 00:55:13,690 --> 00:55:15,815 So I can-- again, hopefully, he's not on that page. 1282 00:55:15,815 --> 00:55:20,380 I can tear the problem in half again, throw that 250 pages away. 1283 00:55:20,380 --> 00:55:23,530 And now I've gone from 1,000 to 500 to 250 pages. 1284 00:55:23,530 --> 00:55:26,470 Now I'm moving because the first algorithm was one page at a time, 1285 00:55:26,470 --> 00:55:27,280 second was two. 1286 00:55:27,280 --> 00:55:29,373 This is hundreds of pages at a time. 1287 00:55:29,373 --> 00:55:31,540 And if I go, roughly, again, to the middle; roughly, 1288 00:55:31,540 --> 00:55:33,790 to the middle; roughly, to the middle, hopefully, I'll 1289 00:55:33,790 --> 00:55:36,350 find John Harvard on one final page. 1290 00:55:36,350 --> 00:55:39,140 Can only do this once, but one final page. 1291 00:55:39,140 --> 00:55:42,010 So that invites the question, I would think, 1292 00:55:42,010 --> 00:55:44,680 if the phone book does have 1,000 or so pages, 1293 00:55:44,680 --> 00:55:50,210 how many times can I divide the problem in half to get down to one last page? 1294 00:55:50,210 --> 00:55:51,580 So it's, roughly, 10. 1295 00:55:51,580 --> 00:55:56,203 And the quick math is 1,000 goes to 500 to 250 to 125 to 67 something. 1296 00:55:56,203 --> 00:55:58,370 So we have to deal with rounding issues, eventually. 1297 00:55:58,370 --> 00:56:01,640 But assuming we work out the math, it's, roughly, 10 page tears. 1298 00:56:01,640 --> 00:56:07,580 And that's crazy faster than 1,000 pages and still faster than 500 pages. 1299 00:56:07,580 --> 00:56:09,350 So it's fundamentally better. 1300 00:56:09,350 --> 00:56:13,792 And, indeed, if I finally get to that final page, in the software world, 1301 00:56:13,792 --> 00:56:16,250 you'd see something like this, John Harvard and his number, 1302 00:56:16,250 --> 00:56:17,810 which you're welcome to call or text. 1303 00:56:17,810 --> 00:56:22,850 But that's how we now have our answer, much like the single page there. 1304 00:56:22,850 --> 00:56:27,090 But let's consider just how efficient that actually is. 1305 00:56:27,090 --> 00:56:30,560 So here's a very rough, broad-- with broad strokes, a chart. 1306 00:56:30,560 --> 00:56:31,998 So here's an xy plot. 1307 00:56:31,998 --> 00:56:34,790 So here, on the horizontal, is going to be the size of the problem. 1308 00:56:34,790 --> 00:56:38,360 And, by that, I mean, how many pages are we trying to go through? 1309 00:56:38,360 --> 00:56:39,890 This would be zero pages. 1310 00:56:39,890 --> 00:56:41,480 This would be a lot of pages. 1311 00:56:41,480 --> 00:56:43,610 How much time does it take to solve the problem? 1312 00:56:43,610 --> 00:56:46,100 How long does it take to find John Harvard or anyone else? 1313 00:56:46,100 --> 00:56:47,540 This means no time. 1314 00:56:47,540 --> 00:56:48,960 This means a lot of time. 1315 00:56:48,960 --> 00:56:51,110 So what's the relationship among these algorithms? 1316 00:56:51,110 --> 00:56:53,490 Well, the first one is actually just a straight line. 1317 00:56:53,490 --> 00:56:57,330 If there's n pages in the phone book, well, I 1318 00:56:57,330 --> 00:57:00,060 claim that it's a one-to-one relationship. 1319 00:57:00,060 --> 00:57:04,290 Because if Verizon or the phone company adds another page next year, 1320 00:57:04,290 --> 00:57:06,900 that just means I might have one more step next year, 1321 00:57:06,900 --> 00:57:09,990 as well, to find John Harvard or anyone else. 1322 00:57:09,990 --> 00:57:12,930 But the second algorithm, it's also a straight line, 1323 00:57:12,930 --> 00:57:15,295 but it's lower, even though it might not look obvious. 1324 00:57:15,295 --> 00:57:16,420 And what do I mean by that? 1325 00:57:16,420 --> 00:57:18,253 Well, let me just draw some temporary lines. 1326 00:57:18,253 --> 00:57:20,610 If this is how many pages are in the phone book-- dot, 1327 00:57:20,610 --> 00:57:24,090 dot, dot-- notice that it takes this much time, on the red line, 1328 00:57:24,090 --> 00:57:25,360 to solve the problem. 1329 00:57:25,360 --> 00:57:28,530 But if I, instead, use the second algorithm, 1330 00:57:28,530 --> 00:57:30,507 it takes me half as much time. 1331 00:57:30,507 --> 00:57:32,340 So, even though they're both straight lines, 1332 00:57:32,340 --> 00:57:34,923 one is strictly lower than the other, which means it's faster. 1333 00:57:34,923 --> 00:57:35,640 It's better. 1334 00:57:35,640 --> 00:57:38,310 But the third algorithm is a fundamentally different shape, 1335 00:57:38,310 --> 00:57:40,090 and it looks a little something like this. 1336 00:57:40,090 --> 00:57:42,370 And it looks like it's going to flatten, flatten, flatten out, 1337 00:57:42,370 --> 00:57:43,260 but it never does. 1338 00:57:43,260 --> 00:57:46,170 It just rises ever so slowly. 1339 00:57:46,170 --> 00:57:49,290 And what this means is that if maybe Cambridge and Allston, here 1340 00:57:49,290 --> 00:57:53,030 in Massachusetts, merge next year, so we go from 1,000 page phone book 1341 00:57:53,030 --> 00:57:58,100 to a 2,000 page phone book, that means, if we're here this year, 1342 00:57:58,100 --> 00:57:59,660 we're over here next year. 1343 00:57:59,660 --> 00:58:01,190 It's not all that much higher. 1344 00:58:01,190 --> 00:58:04,320 But it would be much higher if we were using the first two algorithms. 1345 00:58:04,320 --> 00:58:04,820 Why? 1346 00:58:04,820 --> 00:58:07,880 It'd be an extra 1,000 steps to find someone in that combined phone 1347 00:58:07,880 --> 00:58:09,890 book or maybe another 500 steps. 1348 00:58:09,890 --> 00:58:13,520 But, to be clear, if we're using my third and final algorithm, 1349 00:58:13,520 --> 00:58:15,620 how many more steps will it take me next year, 1350 00:58:15,620 --> 00:58:20,930 when Cambridge and Allston merge into one 2,000-page phone book? 1351 00:58:20,930 --> 00:58:22,800 Just one more step, no big deal. 1352 00:58:22,800 --> 00:58:24,400 It's one more page tear. 1353 00:58:24,400 --> 00:58:26,900 And this is what we mean, ultimately, about not just writing 1354 00:58:26,900 --> 00:58:29,720 code or implementing algorithms that are correct, but, now, 1355 00:58:29,720 --> 00:58:33,070 that are well-designed or efficient, specifically. 1356 00:58:33,070 --> 00:58:35,570 And this is what makes someone a better programmer, perhaps, 1357 00:58:35,570 --> 00:58:38,237 than someone else, or a better problem-solver than someone else, 1358 00:58:38,237 --> 00:58:40,130 is acquiring, over time, these skills. 1359 00:58:40,130 --> 00:58:43,280 So that, sure, you could solve the problem quickly and dirtily, 1360 00:58:43,280 --> 00:58:45,560 so to speak, but if you're going to have a lot of data 1361 00:58:45,560 --> 00:58:49,492 eventually, be it in your phone book or maybe your Google website index, 1362 00:58:49,492 --> 00:58:51,200 if you're searching the web, you're going 1363 00:58:51,200 --> 00:58:54,540 to want to try to think about how to design algorithms that look like this. 1364 00:58:54,540 --> 00:58:56,370 Mathematically, this is called a logarithm. 1365 00:58:56,370 --> 00:58:59,495 And it's log base 2 because I'm halving, halving, halving, again and again. 1366 00:58:59,495 --> 00:59:03,120 But, for now, just know that it's a fundamentally faster and different 1367 00:59:03,120 --> 00:59:03,820 shape. 1368 00:59:03,820 --> 00:59:06,330 So, among our goals in CS50, ultimately, is not just 1369 00:59:06,330 --> 00:59:12,270 to write and solve problems correctly, but, ultimately, ever more efficiently, 1370 00:59:12,270 --> 00:59:13,600 as well. 1371 00:59:13,600 --> 00:59:20,110 Any questions, then, on these ideas of efficiency and design? 1372 00:59:20,110 --> 00:59:21,480 Any questions here? 1373 00:59:21,480 --> 00:59:22,080 Yeah, in back? 1374 00:59:22,080 --> 00:59:23,480 AUDIENCE: [INAUDIBLE]. 1375 00:59:23,480 --> 00:59:24,170 DAVID J. MALAN: A good question. 1376 00:59:24,170 --> 00:59:27,462 Just to repeat it, can a graph like this capture the accuracy of the algorithm? 1377 00:59:27,462 --> 00:59:28,640 Short answer, no. 1378 00:59:28,640 --> 00:59:31,460 For instance, if I drew a straight line that 1379 00:59:31,460 --> 00:59:35,570 is super low on this graph, which would imply that the algorithm takes 1380 00:59:35,570 --> 00:59:38,240 the same amount of time, no matter how many pages there are, 1381 00:59:38,240 --> 00:59:41,480 my algorithm might actually be to just pull a random page from the phone 1382 00:59:41,480 --> 00:59:43,230 book, one step, and say, here it is. 1383 00:59:43,230 --> 00:59:45,230 But that's not necessarily going to be accurate, 1384 00:59:45,230 --> 00:59:47,010 unless I get really, really lucky. 1385 00:59:47,010 --> 00:59:49,820 So the graph really only speaks to efficiency 1386 00:59:49,820 --> 00:59:52,880 and the design of the algorithm, not the correctness of it. 1387 00:59:52,880 --> 00:59:57,170 To analyze the correctness, you need to use another mechanism altogether, 1388 00:59:57,170 --> 00:59:58,280 namely, logic. 1389 00:59:58,280 --> 01:00:02,120 Other questions now, on efficiency, in this way? 1390 01:00:02,120 --> 01:00:02,940 No? 1391 01:00:02,940 --> 01:00:03,440 All right. 1392 01:00:03,440 --> 01:00:08,090 So, with that in mind, let's begin to translate this to some actual code. 1393 01:00:08,090 --> 01:00:11,630 And, in fact, before we look at, today, one actual programming language, 1394 01:00:11,630 --> 01:00:14,720 albeit a graphical one, let's consider something called pseudocode. 1395 01:00:14,720 --> 01:00:16,497 So pseudocode has no formal meaning. 1396 01:00:16,497 --> 01:00:19,580 Generally, you write it in English or whatever your own human language is. 1397 01:00:19,580 --> 01:00:25,600 But you write your thoughts down tersely, succinct, but precisely. 1398 01:00:25,600 --> 01:00:28,570 You try to really convey your thoughts, not with a wave of the hand, 1399 01:00:28,570 --> 01:00:31,510 metaphorically, but step by step, precisely. 1400 01:00:31,510 --> 01:00:32,650 So what do I mean by this? 1401 01:00:32,650 --> 01:00:35,380 Here might be some representative pseudocode 1402 01:00:35,380 --> 01:00:39,337 via which I describe that third and final algorithm in a way 1403 01:00:39,337 --> 01:00:41,920 that I could hand it to you and you could do the same at home. 1404 01:00:41,920 --> 01:00:45,425 Or I could hand it to someone at Google, and they could implement it in Android. 1405 01:00:45,425 --> 01:00:48,550 Or I could hand it to someone at Apple, and they could implement it in iOS. 1406 01:00:48,550 --> 01:00:51,280 So, step one, I claimed, was "Pick up phone book." 1407 01:00:51,280 --> 01:00:54,430 Step two was "Open to the middle of the phone book." 1408 01:00:54,430 --> 01:00:57,145 Step three, "Look at the page," as I did. 1409 01:00:57,145 --> 01:00:59,020 And now things get a little more interesting. 1410 01:00:59,020 --> 01:01:03,760 Step four, "If person is on page," I have to make a decision. 1411 01:01:03,760 --> 01:01:07,810 Presumably, what should I do if John Harvard is on the page I'm looking at? 1412 01:01:07,810 --> 01:01:12,050 So stop and probably make the call, or email, or whatever the goal might be. 1413 01:01:12,050 --> 01:01:15,430 And so I'm going to actually indent this, visually, by a few spaces, 1414 01:01:15,430 --> 01:01:19,900 just to make clear that you should only do line five if the answer to line four 1415 01:01:19,900 --> 01:01:21,130 is yes. 1416 01:01:21,130 --> 01:01:22,360 Otherwise, you don't bother. 1417 01:01:22,360 --> 01:01:26,640 The next thing I'm going to do, line six, is consider another possibility. 1418 01:01:26,640 --> 01:01:28,980 "If the person I'm looking for is earlier 1419 01:01:28,980 --> 01:01:30,805 in the book," what do I want to do? 1420 01:01:30,805 --> 01:01:31,680 Well, I could write-- 1421 01:01:31,680 --> 01:01:33,388 I could describe this in a bunch of ways. 1422 01:01:33,388 --> 01:01:35,190 I'm going to do this tersely, as follows. 1423 01:01:35,190 --> 01:01:38,910 "Open to the middle of the left half of the book, 1424 01:01:38,910 --> 01:01:41,610 so it's open to the middle of the left half of the book. 1425 01:01:41,610 --> 01:01:43,320 And then, what am I going to do? 1426 01:01:43,320 --> 01:01:46,630 Well, I've just divided the problem into something smaller. 1427 01:01:46,630 --> 01:01:48,580 But it's fundamentally the same problem. 1428 01:01:48,580 --> 01:01:51,100 It's just a fewer number of pages. 1429 01:01:51,100 --> 01:01:54,017 So I'm just going to go back to line three and do it again 1430 01:01:54,017 --> 01:01:56,850 because the problem is just getting smaller and smaller, presumably. 1431 01:01:56,850 --> 01:01:59,520 Else, if the person I'm looking for is later in the book, 1432 01:01:59,520 --> 01:02:02,760 open to the middle of the right half of the book, 1433 01:02:02,760 --> 01:02:04,950 and, also, "Go back to line 3." 1434 01:02:04,950 --> 01:02:08,160 But there's a fourth possibility and its failure 1435 01:02:08,160 --> 01:02:11,580 to realize, sometimes, that there's other possible outcomes that 1436 01:02:11,580 --> 01:02:14,400 make computers crash, or spinning beach balls, or the like, 1437 01:02:14,400 --> 01:02:17,130 if a programmer doesn't anticipate some situation. 1438 01:02:17,130 --> 01:02:20,538 What's the fourth possible situation, when looking for John Harvard? 1439 01:02:20,538 --> 01:02:22,080 AUDIENCE: If they're not in the book. 1440 01:02:22,080 --> 01:02:24,205 DAVID J. MALAN: If they're not in the book, at all. 1441 01:02:24,205 --> 01:02:27,450 And, indeed, I might get to the very last page and John Harvard's not even 1442 01:02:27,450 --> 01:02:28,200 on that one. 1443 01:02:28,200 --> 01:02:33,450 I'd better handle that and say, else, as a catchall, just quit altogether. 1444 01:02:33,450 --> 01:02:35,610 And, truly, often, in your Macs, PCs, phones, 1445 01:02:35,610 --> 01:02:38,310 when they freeze, or, again, spinning beach ball, or the like, 1446 01:02:38,310 --> 01:02:39,660 and just weird things happen, that's just 1447 01:02:39,660 --> 01:02:41,220 because some human made a dumb mistake. 1448 01:02:41,220 --> 01:02:44,430 And they didn't realize that you could somehow get your phone or your laptop 1449 01:02:44,430 --> 01:02:47,070 into a configuration that they didn't anticipate. 1450 01:02:47,070 --> 01:02:48,870 So we're going to try to handle that here. 1451 01:02:48,870 --> 01:02:50,880 Now this is just one way of writing pseudocode. 1452 01:02:50,880 --> 01:02:52,230 There's no one way to do this. 1453 01:02:52,230 --> 01:02:55,500 All of us in this room could come up with slightly different pseudocode. 1454 01:02:55,500 --> 01:02:59,190 But I think you'll find characteristic are certain building 1455 01:02:59,190 --> 01:03:02,130 blocks in all of our answers. 1456 01:03:02,130 --> 01:03:04,590 Here, in yellow, are what, as of today, we're 1457 01:03:04,590 --> 01:03:07,540 going to start calling "functions," technically speaking. 1458 01:03:07,540 --> 01:03:10,800 These are like actions or verbs that literally, in this case, tell me 1459 01:03:10,800 --> 01:03:11,700 what to do. 1460 01:03:11,700 --> 01:03:15,150 Next, we're going to have these things, conditionals, 1461 01:03:15,150 --> 01:03:20,525 forks in the road, so to speak, that take me down this path or another, 1462 01:03:20,525 --> 01:03:21,150 metaphorically. 1463 01:03:21,150 --> 01:03:22,933 So I do this thing or something else. 1464 01:03:22,933 --> 01:03:25,350 But how do I decide if I want to go this way, or this way, 1465 01:03:25,350 --> 01:03:26,620 or this way, or this way? 1466 01:03:26,620 --> 01:03:27,780 I need to ask a question. 1467 01:03:27,780 --> 01:03:30,000 And in programming, we'll typically use what 1468 01:03:30,000 --> 01:03:33,240 are called Boolean expressions, named after a mathematician, Boole. 1469 01:03:33,240 --> 01:03:36,090 And a Boolean expression is essentially just a question 1470 01:03:36,090 --> 01:03:42,300 with a yes/no answer, a true or false answer, a 1 or 0 answer. 1471 01:03:42,300 --> 01:03:45,520 It doesn't matter how you think about it, but it's got two possible answers. 1472 01:03:45,520 --> 01:03:49,228 And so you can think of these as being expressions with question marks, 1473 01:03:49,228 --> 01:03:50,520 even though I didn't draw such. 1474 01:03:50,520 --> 01:03:54,270 Person on page, person earlier in book, person later in book, 1475 01:03:54,270 --> 01:03:55,590 those are Boolean expressions. 1476 01:03:55,590 --> 01:04:00,400 And they tell me whether I should go down one fork in the road or another. 1477 01:04:00,400 --> 01:04:03,600 And, lastly, there's this, "Go back to line 3," in two different places. 1478 01:04:03,600 --> 01:04:06,630 That represents what we call a "loop," some kind of cycle that's 1479 01:04:06,630 --> 01:04:08,370 doing something again and again. 1480 01:04:08,370 --> 01:04:10,733 Now these are just a few building blocks here-- 1481 01:04:10,733 --> 01:04:12,900 functions, conditionals, Boolean expressions, loops. 1482 01:04:12,900 --> 01:04:15,210 But you'll find that they're characteristic of so 1483 01:04:15,210 --> 01:04:18,380 many different languages, one of which we'll look at today, another of which 1484 01:04:18,380 --> 01:04:19,380 we'll look at next week. 1485 01:04:19,380 --> 01:04:23,130 And those include, indeed, C, and Python, and other languages still. 1486 01:04:23,130 --> 01:04:25,350 And so this is why we focus on these basics 1487 01:04:25,350 --> 01:04:27,480 and fundamentals in these early days because we're 1488 01:04:27,480 --> 01:04:29,080 going to see them again and again. 1489 01:04:29,080 --> 01:04:31,800 So even if you feel like that fire hose is hitting you sometime, 1490 01:04:31,800 --> 01:04:34,320 we'll give you, today, ultimately, more visuals 1491 01:04:34,320 --> 01:04:38,730 by which you can hang onto, so as to actually write code, ultimately, 1492 01:04:38,730 --> 01:04:41,490 in different languages and solve all sorts of problems. 1493 01:04:41,490 --> 01:04:46,050 Now, we'd be remiss in not bringing up what's behind characters like Spot, 1494 01:04:46,050 --> 01:04:48,570 and ChatGPT, and other software, artificial intelligence. 1495 01:04:48,570 --> 01:04:51,430 And it turns out, to get to the point of AI, 1496 01:04:51,430 --> 01:04:54,150 we're actually going to need more building blocks than just 1497 01:04:54,150 --> 01:04:56,125 functions, and loops, and conditionals. 1498 01:04:56,125 --> 01:04:57,750 It's not going to be quite that simple. 1499 01:04:57,750 --> 01:04:59,200 But this has been a lot, so far. 1500 01:04:59,200 --> 01:05:01,530 Let's go ahead, here, and take a five-minute break. 1501 01:05:01,530 --> 01:05:03,990 And when we resume, we'll take a look not only at AI, 1502 01:05:03,990 --> 01:05:06,630 but also a specific language called Scratch. 1503 01:05:06,630 --> 01:05:09,870 So no cake, just yet, but we'll come back in five. 1504 01:05:09,870 --> 01:05:14,820 Before we dive back in, I just wanted to call out a special guest 1505 01:05:14,820 --> 01:05:16,980 that we have here today, beyond Spot, someone 1506 01:05:16,980 --> 01:05:19,050 who's come from even farther away. 1507 01:05:19,050 --> 01:05:22,560 And, in fact, if any of you have taken CS50x, the OpenCourseWare version 1508 01:05:22,560 --> 01:05:25,270 of the class, or dabbled in it over the past few years 1509 01:05:25,270 --> 01:05:27,490 in some of CS50's online social communities, 1510 01:05:27,490 --> 01:05:29,710 you might have had your questions answered 1511 01:05:29,710 --> 01:05:31,810 by a certain human from New Zealand. 1512 01:05:31,810 --> 01:05:35,890 And she's come all this way, today, to spend this lecture with us. 1513 01:05:35,890 --> 01:05:38,350 This is CS50's own Brenda Anderson. 1514 01:05:38,350 --> 01:05:41,920 If you might come up for acknowledgment from all of us here. 1515 01:05:41,920 --> 01:05:45,052 [APPLAUSE] 1516 01:05:45,052 --> 01:05:47,440 1517 01:05:47,440 --> 01:05:50,170 It's not much, but just a little token of our thanks. 1518 01:05:50,170 --> 01:05:53,830 Brenda has helped, truly, thousands of students online 1519 01:05:53,830 --> 01:05:55,370 for the past many years. 1520 01:05:55,370 --> 01:05:58,780 And, in fact, her own daughter has been the artist 1521 01:05:58,780 --> 01:06:03,615 behind the duck that's about to loom large in CS50 this year and beyond. 1522 01:06:03,615 --> 01:06:04,615 So, thank you to Brenda. 1523 01:06:04,615 --> 01:06:07,936 [APPLAUSE] 1524 01:06:07,936 --> 01:06:11,410 1525 01:06:11,410 --> 01:06:12,400 All right. 1526 01:06:12,400 --> 01:06:16,690 So it's hard to escape a discussion of artificial intelligence, nowadays, 1527 01:06:16,690 --> 01:06:18,790 but we thought we'd use this as an opportunity 1528 01:06:18,790 --> 01:06:20,260 to connect some of these dots. 1529 01:06:20,260 --> 01:06:22,460 Because, indeed, over the course of the semester, 1530 01:06:22,460 --> 01:06:25,990 we'll be-- not only be talking about artificial intelligence or AI, 1531 01:06:25,990 --> 01:06:28,900 but really using it all the more constructively 1532 01:06:28,900 --> 01:06:31,570 to help you solve problems, help you get unblocked 1533 01:06:31,570 --> 01:06:35,680 when you hit a wall, cognitively or syntactically, when writing code. 1534 01:06:35,680 --> 01:06:39,430 And, indeed, it's no accident that we have this duck here, 1535 01:06:39,430 --> 01:06:42,370 looming large, which is really the embodiment of the sort of AI 1536 01:06:42,370 --> 01:06:45,200 that you'll experience within CS50, itself, this year. 1537 01:06:45,200 --> 01:06:48,220 So let's talk about the so-called chatbots that 1538 01:06:48,220 --> 01:06:50,500 inspired some of those headlines with which we began 1539 01:06:50,500 --> 01:06:52,780 class, that weren't quite on the nose. 1540 01:06:52,780 --> 01:06:54,880 So the class will still be taught by us humans, 1541 01:06:54,880 --> 01:06:59,170 but helped by this CS50 duck, a chatbot of sorts. 1542 01:06:59,170 --> 01:07:00,590 Now what do I mean by this? 1543 01:07:00,590 --> 01:07:04,090 Well, it turns out that, when it comes to implementing something 1544 01:07:04,090 --> 01:07:06,730 like an artificial intelligence, we don't quite 1545 01:07:06,730 --> 01:07:10,550 have all of the building blocks yet, certainly after just today's week zero, 1546 01:07:10,550 --> 01:07:12,000 to implement something like that. 1547 01:07:12,000 --> 01:07:14,960 But I think we can skate in that direction, intellectually. 1548 01:07:14,960 --> 01:07:19,670 So, for instance, if we were to take a stab at implementing our own chatbot-- 1549 01:07:19,670 --> 01:07:22,883 some interactive text-based program that talks to us, 1550 01:07:22,883 --> 01:07:24,800 and answers questions, and the like-- we could 1551 01:07:24,800 --> 01:07:28,850 try borrowing some of today's ideas already, those functions, conditionals, 1552 01:07:28,850 --> 01:07:30,007 loops, and more. 1553 01:07:30,007 --> 01:07:31,590 And I could write something like this. 1554 01:07:31,590 --> 01:07:34,370 If I am writing code or pseudocode for a chatbot, 1555 01:07:34,370 --> 01:07:37,170 I could program the chatbot to do something like this. 1556 01:07:37,170 --> 01:07:39,230 If the student says, hello, to the chatbot, 1557 01:07:39,230 --> 01:07:41,840 then the chatbot should say, hello, back. 1558 01:07:41,840 --> 01:07:44,900 Else, if the student says, goodbye, well, the chatbot 1559 01:07:44,900 --> 01:07:46,580 should say, goodbye, back. 1560 01:07:46,580 --> 01:07:51,800 Else, if the student asks how you are, the chat bot should say that it's well. 1561 01:07:51,800 --> 01:07:54,020 But things get a little harder when you start 1562 01:07:54,020 --> 01:07:57,470 asking more interesting questions, like, else, 1563 01:07:57,470 --> 01:08:00,990 if the student asks why 111 in binary is 7 in decimal. 1564 01:08:00,990 --> 01:08:03,980 Now, you could imagine that we just have a conditional, 1565 01:08:03,980 --> 01:08:08,570 with this Boolean expression, that programs the chatbot to just give you 1566 01:08:08,570 --> 01:08:12,230 the answer and explain, in an English sentence, why that, in fact, is. 1567 01:08:12,230 --> 01:08:20,750 But what if you, the student, asks why 110 is 6 in decimal or why 010 is 2? 1568 01:08:20,750 --> 01:08:24,229 I mean, you can just imagine the explosion in the amount of code 1569 01:08:24,229 --> 01:08:28,370 that we would have to write to just anticipate every darn question that you 1570 01:08:28,370 --> 01:08:31,375 might ask about today and every other class, not to mention all 1571 01:08:31,375 --> 01:08:32,750 of the knowledge in the universe. 1572 01:08:32,750 --> 01:08:36,649 So, surely, there are other ways to implement algorithms 1573 01:08:36,649 --> 01:08:39,319 that allow something like a chatbot or AI, 1574 01:08:39,319 --> 01:08:43,700 more generally, to be fed input, still, like all of the internet, all 1575 01:08:43,700 --> 01:08:46,760 of the worldwide web, all of the pages and textual content therein, 1576 01:08:46,760 --> 01:08:51,050 but to let it just figure out how to answer our questions based 1577 01:08:51,050 --> 01:08:54,330 on those kinds of inputs, assuming the inputs, themselves, are accurate. 1578 01:08:54,330 --> 01:08:56,510 So "large language models" is a term you might 1579 01:08:56,510 --> 01:08:59,720 have heard bandied about over the past several months, or LLMs. 1580 01:08:59,720 --> 01:09:04,729 And a large language model really is an implementation, in software, 1581 01:09:04,729 --> 01:09:09,630 of code that actually takes, as input, lots and lots of language-- 1582 01:09:09,630 --> 01:09:13,310 like the text of lots and lots of web pages, dictionaries, encyclopedias, 1583 01:09:13,310 --> 01:09:14,779 Wikipedias, and the like-- 1584 01:09:14,779 --> 01:09:19,729 and infers, from the patterns of English words or any human language, 1585 01:09:19,729 --> 01:09:22,907 what a typical human might actually say when asked a question. 1586 01:09:22,907 --> 01:09:24,740 And some of these questions are easy, right? 1587 01:09:24,740 --> 01:09:28,165 Probably, on the internet, alone, not to mention everyday life, if someone 1588 01:09:28,165 --> 01:09:29,540 extends their hand and says, "Hi. 1589 01:09:29,540 --> 01:09:33,000 How are you," odds are, with 90% probability, you're going to say, 1590 01:09:33,000 --> 01:09:33,500 "Good. 1591 01:09:33,500 --> 01:09:34,000 Thanks. 1592 01:09:34,000 --> 01:09:34,700 How are you?" 1593 01:09:34,700 --> 01:09:37,250 So I bet we could write software that just 1594 01:09:37,250 --> 01:09:41,569 infers what it should say, probabilistically, statistically, based 1595 01:09:41,569 --> 01:09:43,069 on those kinds of patterns online. 1596 01:09:43,069 --> 01:09:45,442 And that's, indeed, where the world is starting 1597 01:09:45,442 --> 01:09:47,359 to go, when it comes to the most sophisticated 1598 01:09:47,359 --> 01:09:49,151 of algorithms, where you and I, the humans, 1599 01:09:49,151 --> 01:09:51,979 we don't try to anticipate every possible input. 1600 01:09:51,979 --> 01:09:54,620 Rather, we give it a more general purpose 1601 01:09:54,620 --> 01:09:58,277 input, like all human knowledge, and ideally just let it figure things out. 1602 01:09:58,277 --> 01:09:59,610 Now, we're not quite there, yet. 1603 01:09:59,610 --> 01:10:02,000 And odds are you've heard of hallucinations or just mistakes 1604 01:10:02,000 --> 01:10:03,680 that these large language models make. 1605 01:10:03,680 --> 01:10:05,005 But their inputs are imperfect. 1606 01:10:05,005 --> 01:10:07,130 And sometimes there's a bit of randomness sprinkled 1607 01:10:07,130 --> 01:10:10,088 in because you don't want the thing to always say the exact same thing. 1608 01:10:10,088 --> 01:10:14,250 Even you and I might say, "Eh, I'm not that great today" 10% of the time. 1609 01:10:14,250 --> 01:10:16,730 So you need to perturb the output in some way. 1610 01:10:16,730 --> 01:10:20,630 But within CS50 and within this world of large language models, 1611 01:10:20,630 --> 01:10:24,630 we do have these tools like ChatGPT, and Bing, chat, and others. 1612 01:10:24,630 --> 01:10:26,810 And we'll stipulate that, for CS50's purposes, 1613 01:10:26,810 --> 01:10:28,910 the direction we're going this year is that this 1614 01:10:28,910 --> 01:10:30,710 is what's in the syllabus, dot, dot, dot; 1615 01:10:30,710 --> 01:10:32,840 that it will not be allowed, it will be considered 1616 01:10:32,840 --> 01:10:37,348 not reasonable to use AI-based software, other than CS50's own. 1617 01:10:37,348 --> 01:10:39,140 So the goal here is not to simply take away 1618 01:10:39,140 --> 01:10:43,250 tools that are clearly inevitable, in my view, and clearly helpful 1619 01:10:43,250 --> 01:10:44,720 and productivity savers. 1620 01:10:44,720 --> 01:10:48,440 But we'd like there to be some guardrails, intellectually, on just how 1621 01:10:48,440 --> 01:10:49,653 helpful these chatbots are. 1622 01:10:49,653 --> 01:10:52,070 Because as you've probably seen, if you ask it a question, 1623 01:10:52,070 --> 01:10:54,560 these chatbots are already pretty good at not just helping 1624 01:10:54,560 --> 01:10:56,310 you finish your current thought, but it'll 1625 01:10:56,310 --> 01:10:59,900 hand you your second and your third thought and do the assignment for you. 1626 01:10:59,900 --> 01:11:02,660 But I think, through prompting, so to speak, 1627 01:11:02,660 --> 01:11:04,850 we'll be able to coax some of our own tools, 1628 01:11:04,850 --> 01:11:07,100 being computer scientists, ourself, in a direction 1629 01:11:07,100 --> 01:11:10,200 that you actually find to be the right balance, akin to having 1630 01:11:10,200 --> 01:11:14,310 a good tutor by your side 24/7, who doesn't just hand you answers, 1631 01:11:14,310 --> 01:11:16,223 but, indeed, tries to lead you to the same. 1632 01:11:16,223 --> 01:11:18,390 So you actually get something out of the experience, 1633 01:11:18,390 --> 01:11:20,520 and, ideally, three-plus months from now, 1634 01:11:20,520 --> 01:11:22,380 those training wheels can come off, too. 1635 01:11:22,380 --> 01:11:24,880 And you're able to still stand on your own. 1636 01:11:24,880 --> 01:11:28,770 So it will be reasonable to use CS50's own AI-based software which 1637 01:11:28,770 --> 01:11:33,210 will actually take the form of a CS50 duck, which is actually available now-- 1638 01:11:33,210 --> 01:11:37,170 and we'll use it throughout the term-- at CS50.ai, a web-based application 1639 01:11:37,170 --> 01:11:39,450 that's quite similar to ChatGPT, but that 1640 01:11:39,450 --> 01:11:44,010 has the personality of a CS50 teaching fellow or TF, or teaching assistant, 1641 01:11:44,010 --> 01:11:47,220 TA, that also happens to think of itself as a duck. 1642 01:11:47,220 --> 01:11:49,860 And for reasons we'll get to in a couple of weeks time, 1643 01:11:49,860 --> 01:11:54,105 but rubber ducks, in particular, are a thing in programming. 1644 01:11:54,105 --> 01:11:56,730 But more on that, before long, as you can even see from the one 1645 01:11:56,730 --> 01:11:58,350 there on my desk. 1646 01:11:58,350 --> 01:12:01,110 With that said, too, well, I'm going to call out CS50's own Brenda 1647 01:12:01,110 --> 01:12:05,485 Anderson, whose daughter, Sophie, kindly not only created 1648 01:12:05,485 --> 01:12:07,860 the first incarnation, digitally, of this duck, but also, 1649 01:12:07,860 --> 01:12:11,560 most recently, once it actually did more than quack a random number 1650 01:12:11,560 --> 01:12:13,540 of times in response to questions, has now 1651 01:12:13,540 --> 01:12:15,320 been virtually brought to life, too. 1652 01:12:15,320 --> 01:12:18,760 So, all that and more, over the coming weeks, but you'll find, ultimately, 1653 01:12:18,760 --> 01:12:23,590 that the goal is to really bring to life the availability of an AI-based tutor 1654 01:12:23,590 --> 01:12:26,650 that you have access to, a friend in your-- 1655 01:12:26,650 --> 01:12:30,340 next to you, that will help guide you through a lot of the course's 1656 01:12:30,340 --> 01:12:31,660 challenges along the way. 1657 01:12:31,660 --> 01:12:33,310 And we actually rolled it out this past summer, 1658 01:12:33,310 --> 01:12:35,950 already, with some of your predecessors, through the Harvard Summer School. 1659 01:12:35,950 --> 01:12:38,200 One student wrote, at summer's end, that this duck 1660 01:12:38,200 --> 01:12:40,180 "felt like having a personal tutor-- 1661 01:12:40,180 --> 01:12:44,110 I love how AI bots will answer questions without ego and without judgment 1662 01:12:44,110 --> 01:12:47,110 generally entertaining even the stupidest of questions 1663 01:12:47,110 --> 01:12:49,360 without treating them like they're stupid. 1664 01:12:49,360 --> 01:12:53,140 It has, as one could expect, an inhuman level of patience." 1665 01:12:53,140 --> 01:12:56,410 So there's actually something really there because as many teachers 1666 01:12:56,410 --> 01:12:57,520 as there are in CS50-- 1667 01:12:57,520 --> 01:13:00,730 myself, the course's preceptors, teaching fellows, teaching assistants, 1668 01:13:00,730 --> 01:13:03,490 and course assistants-- there's only so many of us. 1669 01:13:03,490 --> 01:13:05,650 And we're only awake so many hours of the day. 1670 01:13:05,650 --> 01:13:08,620 And I think you'll find, too, that we're on the cusp of something 1671 01:13:08,620 --> 01:13:11,080 pretty remarkable, in the coming years, where 1672 01:13:11,080 --> 01:13:14,380 it's going to get a lot more enabling, now, to learn material 1673 01:13:14,380 --> 01:13:18,110 not only within the confines of a class, but on your own, ultimately, as well. 1674 01:13:18,110 --> 01:13:22,270 And as one other student put it, at summer's end, with respect to the duck, 1675 01:13:22,270 --> 01:13:23,680 "Love love loved the duck. 1676 01:13:23,680 --> 01:13:24,490 We're friends now." 1677 01:13:24,490 --> 01:13:25,720 So that, too, awaits. 1678 01:13:25,720 --> 01:13:28,840 But, first, we're going to need to start with the basics. 1679 01:13:28,840 --> 01:13:30,820 And we started today by talking about binary. 1680 01:13:30,820 --> 01:13:32,710 And darn it, here it is again. 1681 01:13:32,710 --> 01:13:37,060 So we can't actually get to the point of using, or solving, or implementing AI 1682 01:13:37,060 --> 01:13:38,590 until we understand this. 1683 01:13:38,590 --> 01:13:42,590 And odds are most of you won't know, at a glance, what this piece of software 1684 01:13:42,590 --> 01:13:43,090 does. 1685 01:13:43,090 --> 01:13:46,600 But these are the 0's and 1's that represent, perhaps, 1686 01:13:46,600 --> 01:13:50,650 the first program that any programmer writes, which is now a clue to some 1687 01:13:50,650 --> 01:13:52,700 of you who have dabbled in code before. 1688 01:13:52,700 --> 01:13:56,470 What does this pattern of 0's and 1's tell a typical computer to do? 1689 01:13:56,470 --> 01:13:57,348 Might someone guess? 1690 01:13:57,348 --> 01:13:58,390 AUDIENCE: "Hello, world." 1691 01:13:58,390 --> 01:14:00,760 DAVID J. MALAN: It's going to have it say, "hello, world," 1692 01:14:00,760 --> 01:14:02,927 which is one of the very first programmer-- programs 1693 01:14:02,927 --> 01:14:04,420 that most any programmer writes. 1694 01:14:04,420 --> 01:14:06,790 Should you be able to recognize these 0's and 1's? 1695 01:14:06,790 --> 01:14:08,260 Do I recognize these 0's and 1's? 1696 01:14:08,260 --> 01:14:09,040 No, not at all. 1697 01:14:09,040 --> 01:14:11,120 I just happen to know that they are the same. 1698 01:14:11,120 --> 01:14:12,700 And that was a leading question. 1699 01:14:12,700 --> 01:14:17,050 But they are representing data and instructions, ultimately, 1700 01:14:17,050 --> 01:14:22,360 data like H-E-L-L-O, comma, W-O-R-L-D and an instruction like, 1701 01:14:22,360 --> 01:14:24,910 "Print that data to the screen." 1702 01:14:24,910 --> 01:14:26,920 As for what these patterns of 0's and 1's are, 1703 01:14:26,920 --> 01:14:30,250 this is not something that a computer scientist or programmer worries about. 1704 01:14:30,250 --> 01:14:34,240 We just stipulate that, OK, someone, somewhere knows how to do this. 1705 01:14:34,240 --> 01:14:36,400 And it's probably someone like Intel, who makes 1706 01:14:36,400 --> 01:14:37,960 the hardware inside of the computers. 1707 01:14:37,960 --> 01:14:41,470 But you and I, starting now, already, in week zero, 1708 01:14:41,470 --> 01:14:44,950 can start to view binary more abstractly. 1709 01:14:44,950 --> 01:14:46,660 We don't care about the 0's and 1's. 1710 01:14:46,660 --> 01:14:49,090 We only care that you can use 0's and 1's 1711 01:14:49,090 --> 01:14:52,420 to represent more useful quantities, like numbers, 1712 01:14:52,420 --> 01:14:54,260 and letters, colors, and more. 1713 01:14:54,260 --> 01:14:57,040 So this, next week, is going to be the code we actually 1714 01:14:57,040 --> 01:14:58,330 start writing at a keyboard. 1715 01:14:58,330 --> 01:15:01,538 And this is that language called C. It's the same language I, myself, learned 1716 01:15:01,538 --> 01:15:05,140 years ago, when taking CS50, when all we learned at the time was C. 1717 01:15:05,140 --> 01:15:07,770 But this, too, has some crypticness to it. 1718 01:15:07,770 --> 01:15:11,020 And if you've never programmed before, you can probably wrap your mind around, 1719 01:15:11,020 --> 01:15:14,190 OK, I'm guessing the "printf" prints out the "hello, world." 1720 01:15:14,190 --> 01:15:16,920 But what's with the semicolon, the quotes, the backslash, 1721 01:15:16,920 --> 01:15:21,030 and the curly braces, the #include, and all of this stupid syntax? 1722 01:15:21,030 --> 01:15:23,970 A lot of this, in the beginning of any class, is really a distraction. 1723 01:15:23,970 --> 01:15:25,890 It is not intellectually interesting. 1724 01:15:25,890 --> 01:15:29,230 But it's the stupid kind of stuff that's going to trip you up quite often. 1725 01:15:29,230 --> 01:15:31,500 And so, today, what we'll do is focus not 1726 01:15:31,500 --> 01:15:35,100 on syntax, characters on the keyboard, but ideas 1727 01:15:35,100 --> 01:15:37,170 because what really matters in this program 1728 01:15:37,170 --> 01:15:40,900 is that "printf" is a function here for our purposes. 1729 01:15:40,900 --> 01:15:43,980 And that function is to display information on the screen. 1730 01:15:43,980 --> 01:15:46,860 Everything else, as we'll soon see, has value 1731 01:15:46,860 --> 01:15:50,435 and will be understood by you, before long, but for now, it's a distraction. 1732 01:15:50,435 --> 01:15:52,200 Let's focus on those building blocks. 1733 01:15:52,200 --> 01:15:54,940 When it comes time to write code, though, for the curious, 1734 01:15:54,940 --> 01:15:56,815 especially if you've programmed before, we'll 1735 01:15:56,815 --> 01:15:58,890 use a very popular free and open-source tool 1736 01:15:58,890 --> 01:16:01,260 called Visual Studio Code, or VS Code. 1737 01:16:01,260 --> 01:16:06,000 We'll use a cloud-based version of it that we pre-install everything 1738 01:16:06,000 --> 01:16:08,070 you need in the cloud for you so you don't 1739 01:16:08,070 --> 01:16:10,980 have to deal with headaches like getting your Mac or PC to work. 1740 01:16:10,980 --> 01:16:13,920 You'll use instead this URL, cs50.dev, but more 1741 01:16:13,920 --> 01:16:15,870 on that in next week, week one. 1742 01:16:15,870 --> 01:16:19,650 For now, we'll use another cloud-based editor called Scratch. 1743 01:16:19,650 --> 01:16:21,960 And odds are some number of you use this probably 1744 01:16:21,960 --> 01:16:23,970 as early as like middle school or the like. 1745 01:16:23,970 --> 01:16:27,300 And that was fine to create your own animations, games, 1746 01:16:27,300 --> 01:16:28,650 interactive art, or the like. 1747 01:16:28,650 --> 01:16:30,600 But we'll use it today for just a bit. 1748 01:16:30,600 --> 01:16:32,670 And we'll use it in the course's first homework, 1749 01:16:32,670 --> 01:16:36,870 AKA problem set 0, to explore now some of these same ideas. 1750 01:16:36,870 --> 01:16:39,720 And among the goals today for the remainder of today 1751 01:16:39,720 --> 01:16:42,920 is not to focus so much on Scratch and the particulars 1752 01:16:42,920 --> 01:16:44,670 because this is not a language that you're 1753 01:16:44,670 --> 01:16:50,280 going to use often but to give you very visual representations of ideas 1754 01:16:50,280 --> 01:16:53,790 so that when things do escalate next week to C, to the more cryptic, 1755 01:16:53,790 --> 01:16:57,840 it's the same ideas just typed out instead of dragged and dropped. 1756 01:16:57,840 --> 01:16:59,460 So by that, I mean this. 1757 01:16:59,460 --> 01:17:03,270 I'm going to go ahead and share in just a moment the user interface of Scratch. 1758 01:17:03,270 --> 01:17:05,370 But what's nice about Scratch is that this 1759 01:17:05,370 --> 01:17:08,400 is how we're going to implement that same program today. 1760 01:17:08,400 --> 01:17:11,200 These are two blocks or puzzle pieces on the screen, 1761 01:17:11,200 --> 01:17:15,670 and they've been interconnected to tell the computer to say "hello, world" 1762 01:17:15,670 --> 01:17:16,570 on the screen. 1763 01:17:16,570 --> 01:17:18,490 The user interface that we're about to use 1764 01:17:18,490 --> 01:17:20,652 will look generally something like this. 1765 01:17:20,652 --> 01:17:22,360 It's a web-based editor that you can also 1766 01:17:22,360 --> 01:17:24,160 download it locally to use offline. 1767 01:17:24,160 --> 01:17:28,120 And you'll see that at the left here are a whole bunch of puzzle pieces 1768 01:17:28,120 --> 01:17:29,020 or blocks. 1769 01:17:29,020 --> 01:17:31,630 They're categorized by color, and the blue ones 1770 01:17:31,630 --> 01:17:33,980 tend to relate to motion, for instance. 1771 01:17:33,980 --> 01:17:35,950 The purple ones represent looks. 1772 01:17:35,950 --> 01:17:37,750 The pink one represents sounds. 1773 01:17:37,750 --> 01:17:40,180 The yellow one represents events. 1774 01:17:40,180 --> 01:17:41,230 More on that soon. 1775 01:17:41,230 --> 01:17:43,270 The orange ones represent control, and then 1776 01:17:43,270 --> 01:17:46,390 there's operators, variables, my blocks, and even some extensions 1777 01:17:46,390 --> 01:17:47,690 we can install as well. 1778 01:17:47,690 --> 01:17:51,820 So it just categorizes things visually and colorfully so that you 1779 01:17:51,820 --> 01:17:53,470 can find what you're looking for. 1780 01:17:53,470 --> 01:17:56,740 But we're going to use these puzzle pieces to drag and drop them 1781 01:17:56,740 --> 01:17:58,300 onto this area here. 1782 01:17:58,300 --> 01:18:02,030 And we're going to connect them when we want them to do something. 1783 01:18:02,030 --> 01:18:02,890 What can they do? 1784 01:18:02,890 --> 01:18:06,010 Well, by default, Scratch comes with this cat here, otherwise known 1785 01:18:06,010 --> 01:18:09,760 as a sprite, which is a character in a game or in a graphics context. 1786 01:18:09,760 --> 01:18:12,310 And this cat lives in this two-dimensional world in which 1787 01:18:12,310 --> 01:18:14,050 the cat can go up, down, left, right. 1788 01:18:14,050 --> 01:18:16,330 And you can actually change the cat's costume 1789 01:18:16,330 --> 01:18:18,730 to be a dog, a bird, or anything else. 1790 01:18:18,730 --> 01:18:23,260 It really is more of an idea than it is a specific animal in this case. 1791 01:18:23,260 --> 01:18:26,950 But the world that Scratch lives in looks a little something like this. 1792 01:18:26,950 --> 01:18:29,860 It's like a Cartesian plane with x-coordinates and y-coordinates. 1793 01:18:29,860 --> 01:18:32,050 And the numbers don't so much matter fundamentally, 1794 01:18:32,050 --> 01:18:35,390 except that when you want the cat or any character to go up, 1795 01:18:35,390 --> 01:18:37,300 down, left, or right by some amount, it's 1796 01:18:37,300 --> 01:18:42,985 useful to know, for instance, that 0, 0 is the middle, 0 comma 0 for x comma y. 1797 01:18:42,985 --> 01:18:45,550 All the way up is a y value of 180. 1798 01:18:45,550 --> 01:18:47,470 All the way down is -180. 1799 01:18:47,470 --> 01:18:50,170 All the way to the left is -240. 1800 01:18:50,170 --> 01:18:52,030 All the way to the right is 240. 1801 01:18:52,030 --> 01:18:54,655 And generally, you're not going to have to worry about numbers. 1802 01:18:54,655 --> 01:18:58,030 You're going to use these relatively-- go right, go left, go up, or down. 1803 01:18:58,030 --> 01:19:01,970 But that's just the world that Scratch itself lives in here. 1804 01:19:01,970 --> 01:19:03,730 So let's go about using Scratch here. 1805 01:19:03,730 --> 01:19:06,880 I'm going to change over to my cloud-based editor 1806 01:19:06,880 --> 01:19:10,120 here, where I've gone to scratch.mit.edu. 1807 01:19:10,120 --> 01:19:12,520 And I've clicked Create in order to create a project. 1808 01:19:12,520 --> 01:19:14,822 And that gives me this blank canvas here. 1809 01:19:14,822 --> 01:19:17,530 And I'm going to do these somewhat quickly because I kind of know 1810 01:19:17,530 --> 01:19:18,440 what I'm looking for. 1811 01:19:18,440 --> 01:19:21,400 But part of the process with problem set zero is going to be clicking, 1812 01:19:21,400 --> 01:19:23,410 and dragging, and sort of scrolling around 1813 01:19:23,410 --> 01:19:25,390 to see what building blocks exist. 1814 01:19:25,390 --> 01:19:29,020 But I know under Events there's this puzzle piece here 1815 01:19:29,020 --> 01:19:30,910 when green flag clicked. 1816 01:19:30,910 --> 01:19:32,110 Why is that germane? 1817 01:19:32,110 --> 01:19:35,720 Well, if I zoom out, and go back to Scratch's world at the right here, 1818 01:19:35,720 --> 01:19:37,720 notice that above Scratch's world there's 1819 01:19:37,720 --> 01:19:40,870 a green flag, which is going to mean go, and a red stop sign, which, 1820 01:19:40,870 --> 01:19:42,290 of course, is going to mean stop. 1821 01:19:42,290 --> 01:19:46,780 So if I drag this puzzle piece anywhere into the middle, 1822 01:19:46,780 --> 01:19:49,180 it's just going to plop where I put it. 1823 01:19:49,180 --> 01:19:53,380 But what that means semantically is when someone clicks that green flag, 1824 01:19:53,380 --> 01:19:56,440 I want Scratch the cat to do this other thing. 1825 01:19:56,440 --> 01:19:57,970 Well, what do I want it to do? 1826 01:19:57,970 --> 01:19:59,560 Well, let me go under Looks. 1827 01:19:59,560 --> 01:20:04,090 And looks here in purple have some puzzle pieces like this. 1828 01:20:04,090 --> 01:20:06,490 Well, I can say hello for some number of seconds, 1829 01:20:06,490 --> 01:20:08,620 or I can just go ahead and say hello. 1830 01:20:08,620 --> 01:20:09,430 So let's do that. 1831 01:20:09,430 --> 01:20:11,650 I'm going to drag this say block. 1832 01:20:11,650 --> 01:20:13,630 And notice that as soon as I get close enough, 1833 01:20:13,630 --> 01:20:15,562 it's going to magnetically want to connect. 1834 01:20:15,562 --> 01:20:17,770 So I can let go, and they snap together automatically 1835 01:20:17,770 --> 01:20:19,103 because they're the right shape. 1836 01:20:19,103 --> 01:20:21,100 I don't have to say hello, exclamation point. 1837 01:20:21,100 --> 01:20:23,920 I can change it to the more canonical, hello comma world. 1838 01:20:23,920 --> 01:20:26,440 So anything in this white oval is editable 1839 01:20:26,440 --> 01:20:28,870 that you can change as just text there. 1840 01:20:28,870 --> 01:20:31,960 If I now zoom out, let me go ahead and click the green flag. 1841 01:20:31,960 --> 01:20:36,556 And voila-- this should be my first program in Scratch. 1842 01:20:36,556 --> 01:20:37,430 Hello, world. 1843 01:20:37,430 --> 01:20:39,410 Without any of the distractions of syntax 1844 01:20:39,410 --> 01:20:42,420 or weird characters on the screen, it's just done what I want it to do. 1845 01:20:42,420 --> 01:20:42,920 All right. 1846 01:20:42,920 --> 01:20:44,462 Let me go ahead and click Stop there. 1847 01:20:44,462 --> 01:20:47,240 And let me make it a little more connected 1848 01:20:47,240 --> 01:20:48,750 to what we've discussed thus far. 1849 01:20:48,750 --> 01:20:51,380 So this puzzle piece here, say hello, world, 1850 01:20:51,380 --> 01:20:56,370 represents what type of building block using the vocabulary of today? 1851 01:20:56,370 --> 01:20:57,420 So it's a function. 1852 01:20:57,420 --> 01:21:00,048 So these purple blocks are functions, say, hello, world. 1853 01:21:00,048 --> 01:21:02,090 And let me give you another piece of terminology. 1854 01:21:02,090 --> 01:21:04,910 These white ovals that take textual input-- 1855 01:21:04,910 --> 01:21:08,210 in general, those are called parameters or arguments. 1856 01:21:08,210 --> 01:21:11,610 And they customize the behavior of a function. 1857 01:21:11,610 --> 01:21:14,180 So a parameter or an argument customizes, 1858 01:21:14,180 --> 01:21:17,810 modifies the default behavior of a function, like in this case, say. 1859 01:21:17,810 --> 01:21:20,990 Similarly, in the C code from earlier that we'll see next week, 1860 01:21:20,990 --> 01:21:27,350 the printf function took a quoted phrase like, hello, world, similarly as input. 1861 01:21:27,350 --> 01:21:29,970 But more on that in the future. 1862 01:21:29,970 --> 01:21:32,810 So how does this connect to the mental model we presented earlier? 1863 01:21:32,810 --> 01:21:37,140 Well, here's problem-solving as I described it earlier, inputs to outputs 1864 01:21:37,140 --> 01:21:39,090 with algorithms or code in the middle. 1865 01:21:39,090 --> 01:21:43,710 Well, what we've got here really is an input of, hello, world, the white oval. 1866 01:21:43,710 --> 01:21:48,600 The function or algorithm that it's going into as input is the say block. 1867 01:21:48,600 --> 01:21:51,960 And what is the output of using this say block, the say function? 1868 01:21:51,960 --> 01:21:55,650 It's the visual effect of having the cat have the little speech bubble appear 1869 01:21:55,650 --> 01:21:58,060 above its head, saying, hello, world. 1870 01:21:58,060 --> 01:22:00,900 So everything we do, in fact, can be mapped back 1871 01:22:00,900 --> 01:22:04,590 to that very simple idea of inputs and outputs. 1872 01:22:04,590 --> 01:22:06,840 Well, let's make it a little more interesting, though. 1873 01:22:06,840 --> 01:22:09,430 It's a little boring to just say "hello, world" all the time. 1874 01:22:09,430 --> 01:22:11,500 Let me go ahead and drag this away. 1875 01:22:11,500 --> 01:22:15,180 And if you just drag it to the left and let go, it gets automatically deleted. 1876 01:22:15,180 --> 01:22:18,580 Let me go under Sensing in light blue here. 1877 01:22:18,580 --> 01:22:20,850 And you'll see there's a bunch of blocks, one of which 1878 01:22:20,850 --> 01:22:24,180 is an ask block, an ask function, which is going to prompt 1879 01:22:24,180 --> 01:22:26,170 the human, me, for some input. 1880 01:22:26,170 --> 01:22:29,700 So let me go ahead and drag that over here, and it snaps together. 1881 01:22:29,700 --> 01:22:32,190 I could change the question, but I'm OK with that question. 1882 01:22:32,190 --> 01:22:33,670 We'll use what's your name. 1883 01:22:33,670 --> 01:22:36,900 But notice that this block, ask, is a little special. 1884 01:22:36,900 --> 01:22:40,240 It is not just going to display like a speech bubble on the screen. 1885 01:22:40,240 --> 01:22:42,510 It's actually going to return a value, and this is 1886 01:22:42,510 --> 01:22:44,250 another term of art today and onward. 1887 01:22:44,250 --> 01:22:48,492 A return value is some value that can be handed back to you conceptually 1888 01:22:48,492 --> 01:22:50,700 from a function so that you can do something with it. 1889 01:22:50,700 --> 01:22:55,025 It's as though the ask function asks someone for their name, 1890 01:22:55,025 --> 01:22:57,900 writes it down on a piece of paper, and hands you the piece of paper. 1891 01:22:57,900 --> 01:23:00,150 You can do anything now that you want with that name. 1892 01:23:00,150 --> 01:23:03,810 And here is how you access the name in this special block called 1893 01:23:03,810 --> 01:23:07,330 answer, which, again, will start calling a return value. 1894 01:23:07,330 --> 01:23:10,770 So if I want to say "hello" to someone specific, I'm going to do this. 1895 01:23:10,770 --> 01:23:11,800 Let me zoom out. 1896 01:23:11,800 --> 01:23:15,510 Let me go back to Looks, and let me go back to Say. 1897 01:23:15,510 --> 01:23:19,890 And I'm going to change the say block here to "hello, comma." 1898 01:23:19,890 --> 01:23:21,270 Then I'm going to zoom out. 1899 01:23:21,270 --> 01:23:23,700 Well, I need two inputs, I think. 1900 01:23:23,700 --> 01:23:26,640 So I'm going to grab another say block, and I'm going to put it below. 1901 01:23:26,640 --> 01:23:29,160 And I could just type "David," but this is 1902 01:23:29,160 --> 01:23:31,660 going to defeat the whole point of asking me for the name. 1903 01:23:31,660 --> 01:23:32,610 And it will only work for me. 1904 01:23:32,610 --> 01:23:33,790 So I don't want to do that. 1905 01:23:33,790 --> 01:23:38,520 So let me go back to Sensing, and notice the shape is important here. 1906 01:23:38,520 --> 01:23:41,130 Even if it's not quite the same size, the shape matters. 1907 01:23:41,130 --> 01:23:45,690 And I can actually drag this and change the input of this say function 1908 01:23:45,690 --> 01:23:48,870 to be whatever that return value is, that piece of paper 1909 01:23:48,870 --> 01:23:50,430 that has the person's name on it. 1910 01:23:50,430 --> 01:23:53,550 And it grows to fill, but now we have a program 1911 01:23:53,550 --> 01:23:57,240 that I think when I click the green flag-- watch-- is going to prompt me. 1912 01:23:57,240 --> 01:23:58,367 What's your name? 1913 01:23:58,367 --> 01:23:59,950 And now I have room to type down here. 1914 01:23:59,950 --> 01:24:02,370 So I'm going to type D-A-V-I-D. I'm going to hit Enter, 1915 01:24:02,370 --> 01:24:04,000 and it should say "hello, Dave." 1916 01:24:04,000 --> 01:24:04,500 Wait. 1917 01:24:04,500 --> 01:24:06,110 Hmm. 1918 01:24:06,110 --> 01:24:07,050 Huh. 1919 01:24:07,050 --> 01:24:09,990 Maybe it was-- didn't work. 1920 01:24:09,990 --> 01:24:11,160 D-A-V-I-D. Here we go. 1921 01:24:11,160 --> 01:24:12,165 Hello, David. 1922 01:24:12,165 --> 01:24:13,530 Hmm. 1923 01:24:13,530 --> 01:24:19,210 It's missing the hello, but I'm quite sure we have a hello right there. 1924 01:24:19,210 --> 01:24:22,170 So what explains this bug or mistake? 1925 01:24:22,170 --> 01:24:23,117 Yeah. 1926 01:24:23,117 --> 01:24:26,596 AUDIENCE: [INAUDIBLE]. 1927 01:24:26,596 --> 01:24:29,090 So they overlap. 1928 01:24:29,090 --> 01:24:30,800 DAVID J. MALAN: Exactly. 1929 01:24:30,800 --> 01:24:33,710 Put another way, my Mac, my PC, it's just so darn 1930 01:24:33,710 --> 01:24:36,320 fast that it did exactly what it was supposed to. 1931 01:24:36,320 --> 01:24:40,580 But it said "hello, David" so fast that we didn't even see, we being the human, 1932 01:24:40,580 --> 01:24:42,795 the slowest part of the puzzle, see the actual hello. 1933 01:24:42,795 --> 01:24:45,170 So there's a few different ways to fix this, as you know. 1934 01:24:45,170 --> 01:24:48,660 We could have it say "hello" for some number of seconds. 1935 01:24:48,660 --> 01:24:49,910 So I could kind of do that. 1936 01:24:49,910 --> 01:24:50,660 So let me do this. 1937 01:24:50,660 --> 01:24:53,210 I can decouple these by just dragging and letting it go 1938 01:24:53,210 --> 01:24:55,220 so that they're magnetically far apart. 1939 01:24:55,220 --> 01:24:58,610 Let me go ahead and drag this one, say hello for two seconds. 1940 01:24:58,610 --> 01:25:02,030 I'm going to change the grammar here to be hello comma again. 1941 01:25:02,030 --> 01:25:05,120 I'm going to go ahead and disconnect these two. 1942 01:25:05,120 --> 01:25:08,160 I'm going to throw away the old one that I don't want to use. 1943 01:25:08,160 --> 01:25:11,460 And I'm going to reconnect this so that now-- 1944 01:25:11,460 --> 01:25:11,960 OK. 1945 01:25:11,960 --> 01:25:14,960 It's going to say hello for two seconds and then my name, hopefully. 1946 01:25:14,960 --> 01:25:17,180 So let me click Stop and Start. 1947 01:25:17,180 --> 01:25:20,970 D-A-V-I-D. Enter. 1948 01:25:20,970 --> 01:25:21,540 OK. 1949 01:25:21,540 --> 01:25:25,577 So it's better, but it's kind of poorly implemented. 1950 01:25:25,577 --> 01:25:26,160 Like, come on. 1951 01:25:26,160 --> 01:25:27,785 I just wanted to say hello comma David. 1952 01:25:27,785 --> 01:25:28,785 Why is that hard? 1953 01:25:28,785 --> 01:25:31,410 Well, maybe we can actually combine these a little differently. 1954 01:25:31,410 --> 01:25:32,610 And let me propose this. 1955 01:25:32,610 --> 01:25:35,760 Let me actually get rid of these blocks again. 1956 01:25:35,760 --> 01:25:38,430 And let me go ahead and just say one thing. 1957 01:25:38,430 --> 01:25:43,650 But can I somehow combine this to say hello comma David all in one breath? 1958 01:25:43,650 --> 01:25:46,348 Well, it turns out if I go under Operators, 1959 01:25:46,348 --> 01:25:49,140 I know from having played with this before that there's this puzzle 1960 01:25:49,140 --> 01:25:51,030 piece down here called join. 1961 01:25:51,030 --> 01:25:52,463 It's an oval. 1962 01:25:52,463 --> 01:25:54,630 It's a little big, but, again, it will grow to fill. 1963 01:25:54,630 --> 01:25:57,338 And by default, it wants to join two words, "apple" and "banana." 1964 01:25:57,338 --> 01:25:59,830 But those are just placeholders. 1965 01:25:59,830 --> 01:26:03,990 So let me go ahead and drag this over the default hello. 1966 01:26:03,990 --> 01:26:08,700 Let me change "apple" to hello comma space and then banana. 1967 01:26:08,700 --> 01:26:10,230 Let me go back to Sensing. 1968 01:26:10,230 --> 01:26:13,630 Let me grab answer and drag and drop that. 1969 01:26:13,630 --> 01:26:16,740 So now notice that I'm kind of layering my ideas. 1970 01:26:16,740 --> 01:26:20,980 And put another way, the output of this join block 1971 01:26:20,980 --> 01:26:22,980 is presumably going to join two things together, 1972 01:26:22,980 --> 01:26:25,110 apple and banana or hello comma David. 1973 01:26:25,110 --> 01:26:29,460 And then the output of join is going to become the input to say. 1974 01:26:29,460 --> 01:26:31,900 So aesthetically, it just looks better. 1975 01:26:31,900 --> 01:26:33,790 It's still correct, but it's just better. 1976 01:26:33,790 --> 01:26:36,840 So if I type "David," and hit Enter, hello, David. 1977 01:26:36,840 --> 01:26:38,820 This is what a normal program would presumably 1978 01:26:38,820 --> 01:26:42,390 do, not show you part of the phrase and then the rest of the phrase. 1979 01:26:42,390 --> 01:26:44,230 Like, it's just better in this way. 1980 01:26:44,230 --> 01:26:48,480 So let's connect this now to this same puzzle piece and this methodology. 1981 01:26:48,480 --> 01:26:50,610 So here's that same puzzle piece, ask. 1982 01:26:50,610 --> 01:26:53,520 How do we fit it into this input and output flow with algorithms? 1983 01:26:53,520 --> 01:26:57,120 Well, the input to that puzzle piece is something like, what's your name, 1984 01:26:57,120 --> 01:26:58,200 question mark. 1985 01:26:58,200 --> 01:27:01,680 Then the algorithm or the code implementation thereof 1986 01:27:01,680 --> 01:27:06,240 is this ask block and wait so the human has a moment to type their response in. 1987 01:27:06,240 --> 01:27:09,548 The output of that function recall is a return value. 1988 01:27:09,548 --> 01:27:12,840 You don't see anything on the screen by default because we've not used say yet, 1989 01:27:12,840 --> 01:27:14,860 but we get this return value. 1990 01:27:14,860 --> 01:27:18,120 And let me scooch everything over now so that we can now 1991 01:27:18,120 --> 01:27:20,110 join those inputs together. 1992 01:27:20,110 --> 01:27:21,610 So here's this puzzle piece. 1993 01:27:21,610 --> 01:27:24,940 Let me go ahead and propose that the inputs now to the join block 1994 01:27:24,940 --> 01:27:30,100 are two arguments or two parameters, so to speak, hello and answer. 1995 01:27:30,100 --> 01:27:32,740 They go into that join puzzle piece, whose purpose in life 1996 01:27:32,740 --> 01:27:36,040 is to return one joined version thereof. 1997 01:27:36,040 --> 01:27:38,470 Let me slide this all over logically now so 1998 01:27:38,470 --> 01:27:42,850 that now that output becomes the input to the say block 1999 01:27:42,850 --> 01:27:46,330 and now is why the cat has the speech bubble saying all at once, 2000 01:27:46,330 --> 01:27:47,740 hello comma David. 2001 01:27:47,740 --> 01:27:51,620 So what we've done here is kind of composed the output 2002 01:27:51,620 --> 01:27:54,017 and from one function into the input of another. 2003 01:27:54,017 --> 01:27:56,350 And you can think of this in a couple of different ways, 2004 01:27:56,350 --> 01:27:58,150 left to right, as I did there, or kind of 2005 01:27:58,150 --> 01:28:00,740 like stacking these things on top of one another. 2006 01:28:00,740 --> 01:28:02,860 But at the end of the day, even as programming 2007 01:28:02,860 --> 01:28:07,510 gets more and more powerful for us, it's just inputs and outputs, inputs 2008 01:28:07,510 --> 01:28:08,320 and outputs. 2009 01:28:08,320 --> 01:28:11,230 And thankfully, with built-in functionality from our friends 2010 01:28:11,230 --> 01:28:14,680 at MIT who designed Scratch, I can even do something playful like this. 2011 01:28:14,680 --> 01:28:16,990 I can go to that Extensions button at the bottom. 2012 01:28:16,990 --> 01:28:20,260 And there's a lot of fancy things I can add here, like text-to-speech. 2013 01:28:20,260 --> 01:28:22,680 So let me go ahead and choose text-to-speech. 2014 01:28:22,680 --> 01:28:28,050 And let me go ahead here and change the say block in purple. 2015 01:28:28,050 --> 01:28:30,450 Let me get rid of the say block, and let me borrow this. 2016 01:28:30,450 --> 01:28:33,300 Let me get the speak block like this. 2017 01:28:33,300 --> 01:28:35,250 And now let me drag and drop this oval. 2018 01:28:35,250 --> 01:28:36,470 It's going to grow to fill. 2019 01:28:36,470 --> 01:28:38,970 And I think it's just about to be a little more interesting. 2020 01:28:38,970 --> 01:28:42,090 Let me click Play now, and hopefully this isn't too loud. 2021 01:28:42,090 --> 01:28:44,280 D-A-V-I-D. Enter. 2022 01:28:44,280 --> 01:28:45,948 SPEAKER: Hello, David. 2023 01:28:45,948 --> 01:28:46,740 DAVID J. MALAN: OK. 2024 01:28:46,740 --> 01:28:47,730 [APPLAUSE] 2025 01:28:47,730 --> 01:28:50,350 Thank you. 2026 01:28:50,350 --> 01:28:50,980 Thank you. 2027 01:28:50,980 --> 01:28:51,835 That's a low bar. 2028 01:28:51,835 --> 01:28:54,550 [CHUCKLES] Let me go ahead and set the voice too. 2029 01:28:54,550 --> 01:28:56,830 And you might now remember how we began class, where 2030 01:28:56,830 --> 01:28:59,080 we had a robotic, computerized voice. 2031 01:28:59,080 --> 01:29:03,168 Well, we didn't use Scratch at the time, but we could change this in Scratch 2032 01:29:03,168 --> 01:29:04,460 alone to be a little different. 2033 01:29:04,460 --> 01:29:05,890 So D-A-V-I-D. 2034 01:29:05,890 --> 01:29:07,028 SPEAKER: Hello, David. 2035 01:29:07,028 --> 01:29:07,820 DAVID J. MALAN: OK. 2036 01:29:07,820 --> 01:29:10,070 Little creepy, but we can play all day long with that. 2037 01:29:10,070 --> 01:29:12,125 But the point is that these functions are just 2038 01:29:12,125 --> 01:29:13,750 now doing something a little different. 2039 01:29:13,750 --> 01:29:15,792 But it's just these inputs and outputs. 2040 01:29:15,792 --> 01:29:17,500 Well, let's make the cat more like a cat. 2041 01:29:17,500 --> 01:29:20,590 Let me go ahead and throw away all of this asking question stuff. 2042 01:29:20,590 --> 01:29:23,350 Let me go up to Sound, and let me go ahead 2043 01:29:23,350 --> 01:29:26,260 and drag the play sound meow until done. 2044 01:29:26,260 --> 01:29:27,910 And here too it comes with meow. 2045 01:29:27,910 --> 01:29:31,697 You can add your own sounds as well. 2046 01:29:31,697 --> 01:29:34,030 But I'm just going to use the default meow and here too. 2047 01:29:34,030 --> 01:29:35,447 Hopefully, this won't be too loud. 2048 01:29:35,447 --> 01:29:37,360 Let's make the cat meow by clicking Play. 2049 01:29:37,360 --> 01:29:39,530 [MEOWING] 2050 01:29:39,530 --> 01:29:40,030 OK. 2051 01:29:40,030 --> 01:29:42,200 It's a little piercing, but it's cute. 2052 01:29:42,200 --> 01:29:45,490 And if I want the cat to meow twice, I could just play the game twice. 2053 01:29:45,490 --> 01:29:48,410 [MEOWING] 2054 01:29:48,410 --> 01:29:48,910 All right. 2055 01:29:48,910 --> 01:29:52,360 But it would be nice to just get it to meow automatically two, or three, 2056 01:29:52,360 --> 01:29:53,240 or more times. 2057 01:29:53,240 --> 01:29:54,760 So you know what I could do? 2058 01:29:54,760 --> 01:29:56,820 I could just drag a second one of these. 2059 01:29:56,820 --> 01:29:57,820 Actually, you know what? 2060 01:29:57,820 --> 01:30:00,790 I could even just right-click or Control-click and duplicate them. 2061 01:30:00,790 --> 01:30:02,110 But I'll just keep dragging and dropping. 2062 01:30:02,110 --> 01:30:03,670 There's different ways to solve problems. 2063 01:30:03,670 --> 01:30:04,780 And now let me click Play. 2064 01:30:04,780 --> 01:30:07,370 [MEOWING] 2065 01:30:07,370 --> 01:30:07,870 OK. 2066 01:30:07,870 --> 01:30:09,940 Cat does not sound particularly happy. 2067 01:30:09,940 --> 01:30:12,320 So we could go under-- 2068 01:30:12,320 --> 01:30:13,690 how about Control? 2069 01:30:13,690 --> 01:30:15,220 We could wait one second. 2070 01:30:15,220 --> 01:30:18,740 Now, there's no room, but it will sort of expand to give room for me. 2071 01:30:18,740 --> 01:30:19,900 So let me try this. 2072 01:30:19,900 --> 01:30:22,540 And now it's going to wait one second in between meows. 2073 01:30:22,540 --> 01:30:25,828 [MEOWING] 2074 01:30:25,828 --> 01:30:26,820 2075 01:30:26,820 --> 01:30:27,330 OK. 2076 01:30:27,330 --> 01:30:28,830 Let me stipulate that is correct. 2077 01:30:28,830 --> 01:30:32,190 If my goal is to get the cat to meow three times, it meowed three times. 2078 01:30:32,190 --> 01:30:36,640 But per our discussion earlier of algorithms and the design thereof, 2079 01:30:36,640 --> 01:30:38,770 this is not the best design. 2080 01:30:38,770 --> 01:30:39,760 [MEOWING] 2081 01:30:39,760 --> 01:30:40,260 OK? 2082 01:30:40,260 --> 01:30:40,500 [LAUGHTER] 2083 01:30:40,500 --> 01:30:42,000 Thank you for playing along at home. 2084 01:30:42,000 --> 01:30:43,350 Yeah. 2085 01:30:43,350 --> 01:30:47,050 In what sense is this arguably not well-designed? 2086 01:30:47,050 --> 01:30:47,550 Yeah. 2087 01:30:47,550 --> 01:30:48,930 AUDIENCE: You repeated yourself. 2088 01:30:48,930 --> 01:30:51,600 DAVID J. MALAN: I repeated myself, which actually in programming 2089 01:30:51,600 --> 01:30:53,440 tends not to be a good thing. 2090 01:30:53,440 --> 01:30:54,510 Now, it was easy. 2091 01:30:54,510 --> 01:30:57,510 I almost resorted to copy-paste, which saves me time upfront. 2092 01:30:57,510 --> 01:30:59,400 But just imagine a contrived scenario. 2093 01:30:59,400 --> 01:31:02,350 Now, what if I want it to wait like two seconds in between? 2094 01:31:02,350 --> 01:31:02,850 All right. 2095 01:31:02,850 --> 01:31:03,940 It's not that big a deal. 2096 01:31:03,940 --> 01:31:05,640 I change it here, and I change it here. 2097 01:31:05,640 --> 01:31:07,913 But what if the program is meant to meow 10 times? 2098 01:31:07,913 --> 01:31:10,830 Then I have to change it here, and here, and here, and here, and here. 2099 01:31:10,830 --> 01:31:12,570 And eventually I'm going to screw up. 2100 01:31:12,570 --> 01:31:13,470 Humans are fallible. 2101 01:31:13,470 --> 01:31:14,970 I'm going to overlook one of them. 2102 01:31:14,970 --> 01:31:16,260 One time, it's going to be one second. 2103 01:31:16,260 --> 01:31:18,910 Another is going to be two, and just stupid things will happen. 2104 01:31:18,910 --> 01:31:23,050 You're setting yourself up for failure if you design things poorly. 2105 01:31:23,050 --> 01:31:26,440 And so I would propose that we use another type of building block 2106 01:31:26,440 --> 01:31:27,730 to solve this instead. 2107 01:31:27,730 --> 01:31:28,555 Yeah. 2108 01:31:28,555 --> 01:31:28,810 AUDIENCE: [INAUDIBLE] 2109 01:31:28,810 --> 01:31:29,685 DAVID J. MALAN: Yeah. 2110 01:31:29,685 --> 01:31:32,950 So we could use a loop and just write minimal code 2111 01:31:32,950 --> 01:31:35,240 but to accomplish even more functionality. 2112 01:31:35,240 --> 01:31:37,390 So let me throw away most of these blocks. 2113 01:31:37,390 --> 01:31:40,990 And let's go and grab this repeat block, which we haven't used yet, 2114 01:31:40,990 --> 01:31:42,042 but it's right there. 2115 01:31:42,042 --> 01:31:43,750 And as the name suggests, this will allow 2116 01:31:43,750 --> 01:31:45,850 me to repeat something some number of times. 2117 01:31:45,850 --> 01:31:48,280 Let me put these two puzzle pieces inside. 2118 01:31:48,280 --> 01:31:49,330 It'll grow to fill. 2119 01:31:49,330 --> 01:31:51,370 Let me reconnect it to the green flag. 2120 01:31:51,370 --> 01:31:53,470 I'll change the default 10 to a 3. 2121 01:31:53,470 --> 01:31:54,265 And now-- 2122 01:31:54,265 --> 01:31:57,526 [MEOWING] 2123 01:31:57,526 --> 01:31:58,940 2124 01:31:58,940 --> 01:32:02,290 It's just sort of better because if now you want it to meow more times, 2125 01:32:02,290 --> 01:32:03,290 you change it one place. 2126 01:32:03,290 --> 01:32:05,623 If you want it to slow down, you change it in one place. 2127 01:32:05,623 --> 01:32:07,280 There's no room for error. 2128 01:32:07,280 --> 01:32:09,920 And that's generally a good thing. 2129 01:32:09,920 --> 01:32:10,670 But this is silly. 2130 01:32:10,670 --> 01:32:12,350 Like, Scratch comes with a cat. 2131 01:32:12,350 --> 01:32:15,590 Why didn't MIT give us a puzzle piece called "meow?" 2132 01:32:15,590 --> 01:32:18,460 Like, why am I implementing the idea of meowing myself? 2133 01:32:18,460 --> 01:32:19,460 Like, that took me what? 2134 01:32:19,460 --> 01:32:21,410 1, 2, 3, 4 puzzle pieces. 2135 01:32:21,410 --> 01:32:24,080 Why isn't there just one puzzle piece that meows for me? 2136 01:32:24,080 --> 01:32:28,430 This too we can do in code, be it in Scratch, or C, or other languages too. 2137 01:32:28,430 --> 01:32:32,660 I'm going to go down to these pink my blocks here, 2138 01:32:32,660 --> 01:32:35,027 where I can create my own puzzle piece. 2139 01:32:35,027 --> 01:32:36,860 And I'm going to call this literally "meow." 2140 01:32:36,860 --> 01:32:39,150 And I'm going to go ahead and just click OK. 2141 01:32:39,150 --> 01:32:42,242 And notice that it's given me this new type of start connector. 2142 01:32:42,242 --> 01:32:44,450 It's a start puzzle piece that nothing goes above it. 2143 01:32:44,450 --> 01:32:46,430 But you can put anything you want below it. 2144 01:32:46,430 --> 01:32:48,170 And I'm going to go ahead and cheat here. 2145 01:32:48,170 --> 01:32:51,390 I'm just going to grab my existing code, so to speak. 2146 01:32:51,390 --> 01:32:53,810 This is code I'm writing, even though it's puzzle pieces. 2147 01:32:53,810 --> 01:32:57,380 And now let me just claim, and I'll move this aside. 2148 01:32:57,380 --> 01:33:00,690 Here is now an implementation of my own function, 2149 01:33:00,690 --> 01:33:03,510 my own block called "meow," whose purpose in life 2150 01:33:03,510 --> 01:33:06,180 is to meow until done and then wait one second. 2151 01:33:06,180 --> 01:33:10,350 But what's powerful now is notice at top left, now that I've made the block, 2152 01:33:10,350 --> 01:33:12,910 I can use it any number of times. 2153 01:33:12,910 --> 01:33:17,520 So I can grab this meow block, drag it over here, and you know what? 2154 01:33:17,520 --> 01:33:21,590 Now that "meow" exists as an idea, I can abstract that away. 2155 01:33:21,590 --> 01:33:24,090 And I'm just going to arbitrarily drag it way to the bottom. 2156 01:33:24,090 --> 01:33:24,990 I'm not deleting it. 2157 01:33:24,990 --> 01:33:27,270 I'm just putting it out of sight, out of mind so 2158 01:33:27,270 --> 01:33:28,890 that we can focus now on this idea. 2159 01:33:28,890 --> 01:33:31,410 And I claim that this implementation of meowing 2160 01:33:31,410 --> 01:33:35,010 is sort of better because it's more compact, it does what it says, 2161 01:33:35,010 --> 01:33:38,520 and I don't care about the implementation details of "meow." 2162 01:33:38,520 --> 01:33:41,640 So this idea of abstraction, something we're going to use frequently. 2163 01:33:41,640 --> 01:33:44,767 To abstract something away is to simplify. 2164 01:33:44,767 --> 01:33:47,100 Don't think about the underlying implementation details. 2165 01:33:47,100 --> 01:33:50,130 Just care about what it does or what it's called. 2166 01:33:50,130 --> 01:33:52,590 Someone has to care about the implementation details, 2167 01:33:52,590 --> 01:33:54,330 like me 30 seconds ago. 2168 01:33:54,330 --> 01:33:56,430 But here on out, I don't need to care. 2169 01:33:56,430 --> 01:33:59,690 And so in fact, you and I are using the abstraction 2170 01:33:59,690 --> 01:34:02,940 that is Scratch because I don't know how to put a speech bubble on the screen. 2171 01:34:02,940 --> 01:34:04,773 I don't know how to create that sound, meow. 2172 01:34:04,773 --> 01:34:07,380 MIT did that, and they abstracted those pieces 2173 01:34:07,380 --> 01:34:10,440 of functionality away already for us by just giving us 2174 01:34:10,440 --> 01:34:12,280 these puzzle pieces we see here. 2175 01:34:12,280 --> 01:34:14,445 So the code will work the exact same. 2176 01:34:14,445 --> 01:34:17,330 [MEOWING] 2177 01:34:17,330 --> 01:34:21,640 But it's sort of better designed now because now I've 2178 01:34:21,640 --> 01:34:23,470 abstracted away the idea of meowing. 2179 01:34:23,470 --> 01:34:25,690 But I bet I can improve this further. 2180 01:34:25,690 --> 01:34:28,390 Can I get rid of the repeat block altogether? 2181 01:34:28,390 --> 01:34:31,510 And let me just tell the meow block how many times to meow. 2182 01:34:31,510 --> 01:34:35,170 Well, let me go down to the bottom and look at the implementation details. 2183 01:34:35,170 --> 01:34:37,270 I'm going to right-click or Control-click on this, 2184 01:34:37,270 --> 01:34:38,210 and I'm going to edit it. 2185 01:34:38,210 --> 01:34:39,290 So I'm going to make a change. 2186 01:34:39,290 --> 01:34:42,290 And I didn't do this before, but I'm going to call it "meow," as before. 2187 01:34:42,290 --> 01:34:43,780 I'm going to add an input. 2188 01:34:43,780 --> 01:34:46,240 And just so I know what it says what it does, 2189 01:34:46,240 --> 01:34:49,000 I'm going to add the word "times" here. 2190 01:34:49,000 --> 01:34:52,840 And I'm going to change this placeholder to n. 2191 01:34:52,840 --> 01:34:54,970 n for "number" is the go-to placeholder any time 2192 01:34:54,970 --> 01:34:57,230 we want to talk about a number in CS. 2193 01:34:57,230 --> 01:35:00,020 So now notice the puzzle piece looks a little different. 2194 01:35:00,020 --> 01:35:02,830 It takes an argument or a parameter called 2195 01:35:02,830 --> 01:35:05,680 n, which represents the number of times you want the thing to meow. 2196 01:35:05,680 --> 01:35:07,280 Now, that doesn't do that yet. 2197 01:35:07,280 --> 01:35:10,240 So let me go back to my other code. 2198 01:35:10,240 --> 01:35:13,210 Let me just decouple these temporarily. 2199 01:35:13,210 --> 01:35:17,950 I'm going to move my loop into my implementation of meowing. 2200 01:35:17,950 --> 01:35:21,950 But I don't want to hard code, that is literally write the number 3 anymore. 2201 01:35:21,950 --> 01:35:25,860 I'm going to grab this oval and put it there. 2202 01:35:25,860 --> 01:35:27,900 So now I've generalized the function. 2203 01:35:27,900 --> 01:35:33,860 So now it will meow any number of times, 0 on up, by executing that loop 2204 01:35:33,860 --> 01:35:35,540 and now more powerfully. 2205 01:35:35,540 --> 01:35:36,890 Out of sight, out of mind. 2206 01:35:36,890 --> 01:35:40,850 Notice that my code just became so darn simple. 2207 01:35:40,850 --> 01:35:42,650 Like, my function is called "meow." 2208 01:35:42,650 --> 01:35:44,330 It meows some number of times. 2209 01:35:44,330 --> 01:35:46,910 All I have to do is type a number there, and it just works. 2210 01:35:46,910 --> 01:35:50,660 And I don't care any more about those lower-level, so to speak, 2211 01:35:50,660 --> 01:35:52,230 implementation details. 2212 01:35:52,230 --> 01:35:53,270 So here, no surprise. 2213 01:35:53,270 --> 01:35:55,985 If I type in the number 3, zoom out, and hit Play-- 2214 01:35:55,985 --> 01:36:00,270 [MEOWING] 2215 01:36:00,270 --> 01:36:02,500 --it still works just fine. 2216 01:36:02,500 --> 01:36:05,460 So any questions on what we've just done here? 2217 01:36:05,460 --> 01:36:07,710 It's still just meowing, but that's besides the point. 2218 01:36:07,710 --> 01:36:11,340 It's this creation of our own functions, this modularity, 2219 01:36:11,340 --> 01:36:15,640 this abstraction that's going to be the idea that keeps coming back to us. 2220 01:36:15,640 --> 01:36:16,140 No? 2221 01:36:16,140 --> 01:36:16,640 All right. 2222 01:36:16,640 --> 01:36:19,050 So let's make this a little more cat-like. 2223 01:36:19,050 --> 01:36:20,980 Let me throw away all of this code. 2224 01:36:20,980 --> 01:36:22,000 And let me go ahead-- 2225 01:36:22,000 --> 01:36:25,000 oops-- let me throw away this code first and then the rest of this code. 2226 01:36:25,000 --> 01:36:28,500 And let me go ahead and give myself another green flag block. 2227 01:36:28,500 --> 01:36:32,430 And let me go ahead, and let's create a cat that allows us to pet it 2228 01:36:32,430 --> 01:36:34,530 by moving my cursor over the cat. 2229 01:36:34,530 --> 01:36:36,820 And maybe it likes that, so it'll meow when I do that. 2230 01:36:36,820 --> 01:36:42,270 So let me go under Control, and let me grab this if conditional, 2231 01:36:42,270 --> 01:36:44,910 which we talked about as a building block earlier. 2232 01:36:44,910 --> 01:36:47,310 Let me go to Sensing, and we haven't used this before. 2233 01:36:47,310 --> 01:36:50,130 But here is a weird sort of diagonal shape 2234 01:36:50,130 --> 01:36:52,440 that says touching mouse pointer question mark. 2235 01:36:52,440 --> 01:36:54,027 So that's a Boolean expression. 2236 01:36:54,027 --> 01:36:56,610 So I'm going to drag that, and it's definitely the wrong size. 2237 01:36:56,610 --> 01:36:59,070 But it is the right shape, so it will grow to fill. 2238 01:36:59,070 --> 01:37:03,820 And the question I want to ask is if the cat is touching the mouse pointer, 2239 01:37:03,820 --> 01:37:05,770 then go ahead and meow happily. 2240 01:37:05,770 --> 01:37:08,360 So let me grab the meow sound, put it in there. 2241 01:37:08,360 --> 01:37:12,970 And so I think when I click the green flag to start the program, 2242 01:37:12,970 --> 01:37:19,174 and now I let the mouse pointer touch the cat, we should hear-- 2243 01:37:19,174 --> 01:37:20,110 huh. 2244 01:37:20,110 --> 01:37:21,120 huh. 2245 01:37:21,120 --> 01:37:23,820 Doesn't seem to be working. 2246 01:37:23,820 --> 01:37:27,440 There's a bug or a mistake in this program too. 2247 01:37:27,440 --> 01:37:28,440 What did I do wrong? 2248 01:37:28,440 --> 01:37:28,940 Yeah. 2249 01:37:28,940 --> 01:37:31,090 AUDIENCE: You didn't specify the sprite [INAUDIBLE].. 2250 01:37:31,090 --> 01:37:33,130 DAVID J. MALAN: I don't need to specify the sprite explicitly 2251 01:37:33,130 --> 01:37:35,200 because a detail I didn't discuss earlier. 2252 01:37:35,200 --> 01:37:37,630 In the bottom right of the screen, notice 2253 01:37:37,630 --> 01:37:39,890 that the cat is already selected. 2254 01:37:39,890 --> 01:37:42,100 So this code relates to that cat. 2255 01:37:42,100 --> 01:37:45,340 So your instinct is good if we had two or more sprites, 2256 01:37:45,340 --> 01:37:48,045 but I just have one, so I'm covered there. 2257 01:37:48,045 --> 01:37:48,670 Other thoughts. 2258 01:37:48,670 --> 01:37:49,602 Yeah. 2259 01:37:49,602 --> 01:37:50,870 AUDIENCE: It only checks once. 2260 01:37:50,870 --> 01:37:51,980 DAVID J. MALAN: It only checks? 2261 01:37:51,980 --> 01:37:52,250 AUDIENCE: Once. 2262 01:37:52,250 --> 01:37:53,125 DAVID J. MALAN: Once. 2263 01:37:53,125 --> 01:37:54,960 So I click the green flag. 2264 01:37:54,960 --> 01:37:57,230 The computer did what I told it to do. 2265 01:37:57,230 --> 01:38:00,165 The mouse pointer was not touching the cat at that moment 2266 01:38:00,165 --> 01:38:01,790 because it was touching the green flag. 2267 01:38:01,790 --> 01:38:03,320 So, of course, it didn't meow. 2268 01:38:03,320 --> 01:38:05,360 So what maybe is the fix here? 2269 01:38:05,360 --> 01:38:06,980 What puzzle piece can we add? 2270 01:38:06,980 --> 01:38:09,290 AUDIENCE: After the green flag is [INAUDIBLE].. 2271 01:38:09,290 --> 01:38:10,140 DAVID J. MALAN: OK. 2272 01:38:10,140 --> 01:38:10,640 OK. 2273 01:38:10,640 --> 01:38:12,360 Interesting solution. 2274 01:38:12,360 --> 01:38:17,930 So let me go ahead, and under Control let me grab a-- wait one second. 2275 01:38:17,930 --> 01:38:21,360 I'm going to change the 1 to 5, and now I'm going to click the green flag. 2276 01:38:21,360 --> 01:38:22,370 So here we go. 2277 01:38:22,370 --> 01:38:28,490 1, 2, 3, 4, 5. 2278 01:38:28,490 --> 01:38:29,060 Damn it. 2279 01:38:29,060 --> 01:38:29,630 [MEOWING] 2280 01:38:29,630 --> 01:38:29,810 OK. 2281 01:38:29,810 --> 01:38:30,852 That was yours, not mine. 2282 01:38:30,852 --> 01:38:32,240 [LAUGHTER] 2283 01:38:32,240 --> 01:38:33,915 It didn't work. 2284 01:38:33,915 --> 01:38:34,790 AUDIENCE: [INAUDIBLE] 2285 01:38:34,790 --> 01:38:35,707 DAVID J. MALAN: Sorry? 2286 01:38:35,707 --> 01:38:36,703 AUDIENCE: [INAUDIBLE] 2287 01:38:36,703 --> 01:38:38,120 DAVID J. MALAN: Oh, maybe forever. 2288 01:38:38,120 --> 01:38:42,230 So your approach would work, but it's very much a hack, if you will. 2289 01:38:42,230 --> 01:38:46,700 Like, I would have to time it perfectly so that the mouse pointer is touching 2290 01:38:46,700 --> 01:38:49,040 it, or, conversely, I have to drag it there and just 2291 01:38:49,040 --> 01:38:50,540 leave it there for five seconds. 2292 01:38:50,540 --> 01:38:53,040 And that's a little weird because you don't just touch a cat 2293 01:38:53,040 --> 01:38:54,960 and then five seconds later it meows at you. 2294 01:38:54,960 --> 01:38:57,190 Like, presumably, we want it to be more interactive. 2295 01:38:57,190 --> 01:38:58,660 So I like this idea of a loop. 2296 01:38:58,660 --> 01:38:59,160 Right? 2297 01:38:59,160 --> 01:39:04,440 Why don't we just tell the cat to forever listen for the cursor 2298 01:39:04,440 --> 01:39:07,170 as by using not repeat but forever? 2299 01:39:07,170 --> 01:39:08,240 Let me move this in here. 2300 01:39:08,240 --> 01:39:11,490 So now the cat's going to be told when the green flag is clicked just forever, 2301 01:39:11,490 --> 01:39:13,073 if touching, if touching, if touching. 2302 01:39:13,073 --> 01:39:15,270 Oh, meow when actually touched. 2303 01:39:15,270 --> 01:39:19,368 So now if I zoom out and hit Play, nothing's happening. 2304 01:39:19,368 --> 01:39:21,160 I don't have to wait any number of seconds. 2305 01:39:21,160 --> 01:39:22,545 But when I do touch the cat-- 2306 01:39:22,545 --> 01:39:23,260 [MEOWING] 2307 01:39:23,260 --> 01:39:24,180 [APPLAUSE] 2308 01:39:24,180 --> 01:39:26,765 [CHUCKLES] Fan section here. 2309 01:39:26,765 --> 01:39:27,265 Thank you. 2310 01:39:27,265 --> 01:39:27,765 [MEOWING] 2311 01:39:27,765 --> 01:39:30,890 So now it's actually working quite well. 2312 01:39:30,890 --> 01:39:33,220 So there we have sort of a logical bug. 2313 01:39:33,220 --> 01:39:35,545 But it does make sense if you think about what it was 2314 01:39:35,545 --> 01:39:38,020 you told the computer to actually do. 2315 01:39:38,020 --> 01:39:39,915 Well, let's make things even more interesting 2316 01:39:39,915 --> 01:39:41,290 by using one of these extensions. 2317 01:39:41,290 --> 01:39:44,620 In this bottom left corner, this is how I got to text-to-speech earlier. 2318 01:39:44,620 --> 01:39:47,470 Let me go to Video Sensing over here too. 2319 01:39:47,470 --> 01:39:50,750 And I can actually-- there we go-- literally, the video has come on. 2320 01:39:50,750 --> 01:39:52,060 Let me go ahead and do this. 2321 01:39:52,060 --> 01:39:55,690 Get rid of this code, and let me step out of the frame. 2322 01:39:55,690 --> 01:39:58,540 When video motion is greater than-- 2323 01:39:58,540 --> 01:40:00,490 well, this is CS50, so let's just type in 50, 2324 01:40:00,490 --> 01:40:02,150 which is just a measure of motion. 2325 01:40:02,150 --> 01:40:07,370 Let me go and play sound meow. 2326 01:40:07,370 --> 01:40:07,870 OK. 2327 01:40:07,870 --> 01:40:11,720 And let me stop and restart. 2328 01:40:11,720 --> 01:40:12,220 All right. 2329 01:40:12,220 --> 01:40:13,030 So there's the cat. 2330 01:40:13,030 --> 01:40:18,270 2331 01:40:18,270 --> 01:40:19,260 [MEOWING] 2332 01:40:19,260 --> 01:40:20,040 OK. 2333 01:40:20,040 --> 01:40:20,880 It worked. 2334 01:40:20,880 --> 01:40:24,330 The cat's a little insensitive. 2335 01:40:24,330 --> 01:40:25,190 [MEOWING] 2336 01:40:25,190 --> 01:40:25,720 There we go. 2337 01:40:25,720 --> 01:40:26,720 Actually, you know what? 2338 01:40:26,720 --> 01:40:30,300 Maybe it's just-- let me put-- let's change it. 2339 01:40:30,300 --> 01:40:31,130 20. 2340 01:40:31,130 --> 01:40:31,940 Oh, my God. 2341 01:40:31,940 --> 01:40:33,480 Oh, that's OK. 2342 01:40:33,480 --> 01:40:33,980 [MEOWING] 2343 01:40:33,980 --> 01:40:34,790 There we go. 2344 01:40:34,790 --> 01:40:35,690 All right. 2345 01:40:35,690 --> 01:40:36,420 There we go. 2346 01:40:36,420 --> 01:40:40,038 So now it's a little more sensitive to the petting by using the camera. 2347 01:40:40,038 --> 01:40:41,580 Now, this is kind of a weird example. 2348 01:40:41,580 --> 01:40:43,160 And if I just start moving around crazily, like, 2349 01:40:43,160 --> 01:40:45,320 it's just going to meow incessantly, which was what was happening-- 2350 01:40:45,320 --> 01:40:46,430 [MEOWING] 2351 01:40:46,430 --> 01:40:48,222 Stop. 2352 01:40:48,222 --> 01:40:49,020 [LAUGHTER] 2353 01:40:49,020 --> 01:40:49,520 OK. 2354 01:40:49,520 --> 01:40:51,800 When in doubt, this is when you reload the page. 2355 01:40:51,800 --> 01:40:53,010 [LAUGHTER] 2356 01:40:53,010 --> 01:40:53,510 All right. 2357 01:40:53,510 --> 01:40:55,730 So now we're back to where we wanted to be. 2358 01:40:55,730 --> 01:40:58,220 But where can we now use these kinds of building blocks? 2359 01:40:58,220 --> 01:41:00,540 Like, we were doing such tiny little programs. 2360 01:41:00,540 --> 01:41:04,220 But even that we could turn into a whole game, I bet. 2361 01:41:04,220 --> 01:41:07,700 Could we get like one volunteer to come on up? 2362 01:41:07,700 --> 01:41:08,810 One volunteer? 2363 01:41:08,810 --> 01:41:10,170 Everyone's looking down. 2364 01:41:10,170 --> 01:41:10,670 OK. 2365 01:41:10,670 --> 01:41:11,180 On the end here. 2366 01:41:11,180 --> 01:41:11,722 Come on down. 2367 01:41:11,722 --> 01:41:12,290 Yeah. 2368 01:41:12,290 --> 01:41:12,790 All right. 2369 01:41:12,790 --> 01:41:14,930 Round of applause for our one brave volunteer here. 2370 01:41:14,930 --> 01:41:18,150 [APPLAUSE] 2371 01:41:18,150 --> 01:41:18,650 2372 01:41:18,650 --> 01:41:19,400 All right. 2373 01:41:19,400 --> 01:41:22,020 These Super Mario cookies are on the line for you, 2374 01:41:22,020 --> 01:41:23,160 depending on how this goes. 2375 01:41:23,160 --> 01:41:24,827 So I'm going to have you come over here. 2376 01:41:24,827 --> 01:41:28,940 And in advance on Scratch's website, we have some pre-made games, 2377 01:41:28,940 --> 01:41:32,930 one of them written by one of your predecessors, a former student, 2378 01:41:32,930 --> 01:41:36,050 that they implemented this sort of "Whac-A-Mole" game. 2379 01:41:36,050 --> 01:41:39,290 So what you're about to see is the camera turn on on you. 2380 01:41:39,290 --> 01:41:43,160 And you're going to see four moles above, below, left, and right. 2381 01:41:43,160 --> 01:41:44,720 And using only your head-- 2382 01:41:44,720 --> 01:41:47,930 up, down, left, right-- the goal is to whack a mole 2383 01:41:47,930 --> 01:41:51,860 to get a point every time your head touches one of these sprites. 2384 01:41:51,860 --> 01:41:54,740 So you're about to see things get very interesting very quickly. 2385 01:41:54,740 --> 01:41:57,050 But using these building blocks, just those simple 2386 01:41:57,050 --> 01:42:01,350 blocks but have four sprites, not four cats but four moles in this case. 2387 01:42:01,350 --> 01:42:03,955 We can actually turn these into actual games. 2388 01:42:03,955 --> 01:42:04,580 [MUSIC PLAYING] 2389 01:42:04,580 --> 01:42:06,950 So here we go. 2390 01:42:06,950 --> 01:42:08,360 Click Beginner. 2391 01:42:08,360 --> 01:42:08,900 OK. 2392 01:42:08,900 --> 01:42:10,858 And we just need you to center your head first. 2393 01:42:10,858 --> 01:42:13,808 [MUSIC PLAYING] 2394 01:42:13,808 --> 01:42:20,152 2395 01:42:20,152 --> 01:42:23,080 [INDISTINCT CHATTER] 2396 01:42:23,080 --> 01:42:24,056 2397 01:42:24,056 --> 01:42:25,032 [CHUCKLES] 2398 01:42:25,032 --> 01:42:28,448 [MUSIC PLAYING] 2399 01:42:28,448 --> 01:42:30,920 2400 01:42:30,920 --> 01:42:31,820 Nice. 2401 01:42:31,820 --> 01:42:32,630 Ten seconds. 2402 01:42:32,630 --> 01:42:36,004 [MUSIC PLAYING] 2403 01:42:36,004 --> 01:42:39,390 2404 01:42:39,390 --> 01:42:40,470 Nice. 2405 01:42:40,470 --> 01:42:42,486 Two seconds. 2406 01:42:42,486 --> 01:42:43,290 AUDIENCE: [LAUGHS] 2407 01:42:43,290 --> 01:42:43,770 DAVID J. MALAN: All right. 2408 01:42:43,770 --> 01:42:44,610 A round of applause. 2409 01:42:44,610 --> 01:42:45,906 [APPLAUSE] 2410 01:42:45,906 --> 01:42:48,100 Thank you. 2411 01:42:48,100 --> 01:42:50,380 You want to introduce yourself? 2412 01:42:50,380 --> 01:42:51,380 AUDIENCE: Hi, everybody. 2413 01:42:51,380 --> 01:42:53,890 My name is [? Vanilla. ?] I'm a first year, 2414 01:42:53,890 --> 01:42:56,955 and I'm going to be majoring in computer science and economics. 2415 01:42:56,955 --> 01:42:58,330 DAVID J. MALAN: Nice to meet you. 2416 01:42:58,330 --> 01:42:58,830 Here we go. 2417 01:42:58,830 --> 01:42:59,435 Thank you. 2418 01:42:59,435 --> 01:43:00,560 AUDIENCE: Nice to meet you. 2419 01:43:00,560 --> 01:43:01,393 [APPLAUSE, CHEERING] 2420 01:43:01,393 --> 01:43:04,210 DAVID J. MALAN: So we won't look at the code for that actual game. 2421 01:43:04,210 --> 01:43:05,740 It was written by one of your predecessors. 2422 01:43:05,740 --> 01:43:07,573 And you can see it online if you're curious. 2423 01:43:07,573 --> 01:43:10,780 But you can think about now with our functions, conditionals, 2424 01:43:10,780 --> 01:43:15,010 Boolean expressions, loops how you could kind of compose that kind of program. 2425 01:43:15,010 --> 01:43:17,770 So odds are there was a loop that was just constantly listening 2426 01:43:17,770 --> 01:43:19,690 for that kind of connectivity, or it was one 2427 01:43:19,690 --> 01:43:22,900 of those extensions that was waiting for motion to go 2428 01:43:22,900 --> 01:43:24,180 touch one of those sprites. 2429 01:43:24,180 --> 01:43:25,930 Notice that there's these numbers up here. 2430 01:43:25,930 --> 01:43:27,040 And we haven't talked about this yet. 2431 01:43:27,040 --> 01:43:30,040 But just like in math, where you can have variables x, y, and z, 2432 01:43:30,040 --> 01:43:33,220 in programming, you can create variables using other puzzle pieces 2433 01:43:33,220 --> 01:43:36,460 in Scratch that just keep track of how many seconds are left, 2434 01:43:36,460 --> 01:43:40,310 that keeps track of how many times her head hit one of the moles. 2435 01:43:40,310 --> 01:43:43,760 And so you can implement the mechanics of games using very simple building 2436 01:43:43,760 --> 01:43:44,260 blocks. 2437 01:43:44,260 --> 01:43:46,240 But how do you go about building something 2438 01:43:46,240 --> 01:43:48,600 that's more interesting and interactive like that? 2439 01:43:48,600 --> 01:43:50,760 Let me go ahead and bring up, for instance, 2440 01:43:50,760 --> 01:43:52,930 one of the very first things I wrote years ago 2441 01:43:52,930 --> 01:43:55,430 when I was in graduate school and Scratch had just come out. 2442 01:43:55,430 --> 01:43:57,380 I was taking a class at MIT's Media Lab. 2443 01:43:57,380 --> 01:44:01,520 And they invited us to beta test-- that is, try out the software before it then 2444 01:44:01,520 --> 01:44:03,140 became part of the world. 2445 01:44:03,140 --> 01:44:07,200 And the game I made was this one here. 2446 01:44:07,200 --> 01:44:10,640 Let me find the right version of "Oscartime." 2447 01:44:10,640 --> 01:44:15,673 So "Oscartime" is a game that took me tens of hours probably in the end. 2448 01:44:15,673 --> 01:44:18,590 It was a little bit addictive, but let me go ahead and full-screen it. 2449 01:44:18,590 --> 01:44:20,270 And I won't play the whole game. 2450 01:44:20,270 --> 01:44:23,995 But it looked a little something like this. 2451 01:44:23,995 --> 01:44:25,120 OSCAR: (SINGS) Oh, I love-- 2452 01:44:25,120 --> 01:44:28,220 DAVID J. MALAN: Where trash is falling from the sky. 2453 01:44:28,220 --> 01:44:30,070 And I can click on it and drag it. 2454 01:44:30,070 --> 01:44:33,430 And notice as I get close, the lid opens up like this. 2455 01:44:33,430 --> 01:44:37,450 And if I let it keep falling, it goes in, and Oscar gives me a point. 2456 01:44:37,450 --> 01:44:39,585 And I can do this again. 2457 01:44:39,585 --> 01:44:41,710 OSCAR: If you really want to see something trashy-- 2458 01:44:41,710 --> 01:44:41,860 DAVID J. MALAN: All right. 2459 01:44:41,860 --> 01:44:42,943 Here comes something else. 2460 01:44:42,943 --> 01:44:44,565 OSCAR: I have here a sneaker that-- 2461 01:44:44,565 --> 01:44:46,690 DAVID J. MALAN: So now there's two pieces of trash. 2462 01:44:46,690 --> 01:44:49,787 OSCAR: It's all full of holes, and the laces are-- 2463 01:44:49,787 --> 01:44:52,370 DAVID J. MALAN: And it just keeps going, and going, and going. 2464 01:44:52,370 --> 01:44:55,537 And if we can lower the volume for just a moment, we'll let more trash fall. 2465 01:44:55,537 --> 01:44:58,300 But to your comment earlier about one sprite or more 2466 01:44:58,300 --> 01:45:00,040 sprites, that's what we're seeing here. 2467 01:45:00,040 --> 01:45:03,190 Even though our examples thus far are just one cat, one or two puzzle 2468 01:45:03,190 --> 01:45:04,660 pieces, or a few puzzle pieces. 2469 01:45:04,660 --> 01:45:06,670 Here is, I claim, a sprite. 2470 01:45:06,670 --> 01:45:08,110 Here is another sprite. 2471 01:45:08,110 --> 01:45:09,340 Here is another sprite. 2472 01:45:09,340 --> 01:45:11,950 And by toggling among them in that bottom right-hand corner, 2473 01:45:11,950 --> 01:45:15,460 I can just associate different puzzle pieces with each of these sprites. 2474 01:45:15,460 --> 01:45:17,987 Now, I didn't start off by implementing this whole game. 2475 01:45:17,987 --> 01:45:20,570 And in just a moment, if we can raise the volume a little bit, 2476 01:45:20,570 --> 01:45:22,400 we'll see even more trash is falling. 2477 01:45:22,400 --> 01:45:23,300 So this is what-- 2478 01:45:23,300 --> 01:45:26,930 I hate this song now, like 10 plus hours listening to this song on loop 2479 01:45:26,930 --> 01:45:28,160 just to get the timing right. 2480 01:45:28,160 --> 01:45:31,040 But it brings to life all of these different sprites. 2481 01:45:31,040 --> 01:45:34,130 And if you play it again and again, it's always a little bit different 2482 01:45:34,130 --> 01:45:35,600 because I'm using some randomness. 2483 01:45:35,600 --> 01:45:38,510 So this newspaper doesn't always fall from there. 2484 01:45:38,510 --> 01:45:39,650 Sometimes it's here. 2485 01:45:39,650 --> 01:45:40,680 Sometimes it's here. 2486 01:45:40,680 --> 01:45:42,920 And so here, again, we have mechanics of a game where 2487 01:45:42,920 --> 01:45:45,770 things are being perturbed a little, randomized a little bit 2488 01:45:45,770 --> 01:45:47,772 to keep things more interesting. 2489 01:45:47,772 --> 01:45:48,605 And let me go ahead. 2490 01:45:48,605 --> 01:45:50,240 OSCAR: (SINGS) I love trash. 2491 01:45:50,240 --> 01:45:51,407 DAVID J. MALAN: There we go. 2492 01:45:51,407 --> 01:45:53,420 How. about raise a little volume? 2493 01:45:53,420 --> 01:45:54,890 One more piece of trash. 2494 01:45:54,890 --> 01:45:55,490 So a clock. 2495 01:45:55,490 --> 01:45:57,600 It just goes on forever, this kind of game. 2496 01:45:57,600 --> 01:45:59,010 But let's go ahead and consider. 2497 01:45:59,010 --> 01:46:00,060 Let me close that. 2498 01:46:00,060 --> 01:46:01,610 Let me go ahead and consider. 2499 01:46:01,610 --> 01:46:04,770 How I went about implementing that from the get-go. 2500 01:46:04,770 --> 01:46:06,920 So I will stipulate-- 2501 01:46:06,920 --> 01:46:11,090 let me open a few of these versions here-- that the very first thing I did 2502 01:46:11,090 --> 01:46:13,070 was pretty much just implement the stage. 2503 01:46:13,070 --> 01:46:13,220 Right? 2504 01:46:13,220 --> 01:46:15,262 I was kind of procrastinating, so I poked around. 2505 01:46:15,262 --> 01:46:18,390 I found the Sesame Street lamppost, and I dragged it into the world. 2506 01:46:18,390 --> 01:46:18,890 And done. 2507 01:46:18,890 --> 01:46:19,820 Version one is done. 2508 01:46:19,820 --> 01:46:23,510 It didn't do anything, but at least I had the world sort of laid out. 2509 01:46:23,510 --> 01:46:25,820 That is to say I took a baby step toward my goal. 2510 01:46:25,820 --> 01:46:27,528 Then I started thinking about, all right, 2511 01:46:27,528 --> 01:46:31,620 how do I bring the trash to life, even if it doesn't do much of anything else? 2512 01:46:31,620 --> 01:46:34,370 And so I created another sprite by clicking the appropriate button 2513 01:46:34,370 --> 01:46:35,840 in that bottom right-hand corner. 2514 01:46:35,840 --> 01:46:38,420 And I thought about, well, what do I want this trash to do? 2515 01:46:38,420 --> 01:46:40,860 I want it to just kind of fall from the sky. 2516 01:46:40,860 --> 01:46:44,690 And so what I did here was the following. 2517 01:46:44,690 --> 01:46:48,020 If I go to this trash piece here or-- actually, sorry. 2518 01:46:48,020 --> 01:46:48,780 Out of order. 2519 01:46:48,780 --> 01:46:51,860 What I actually did first was I didn't even have the trash fall. 2520 01:46:51,860 --> 01:46:55,280 If I play this game, the trash just stays there in the air. 2521 01:46:55,280 --> 01:46:57,480 But I can do this. 2522 01:46:57,480 --> 01:47:01,370 I can drag it, and as before, as I touch the other sprite, 2523 01:47:01,370 --> 01:47:03,090 I get the trash can lid to go up. 2524 01:47:03,090 --> 01:47:04,080 So how do I do that? 2525 01:47:04,080 --> 01:47:07,130 Well, let me click on Oscar down there, my first sprite. 2526 01:47:07,130 --> 01:47:10,580 And here are the puzzle pieces via which I implemented this idea. 2527 01:47:10,580 --> 01:47:13,340 I changed Oscar's costume, his appearance, 2528 01:47:13,340 --> 01:47:17,960 to be just number one, which was one of the images I imported into the program. 2529 01:47:17,960 --> 01:47:19,820 And then I forever did this. 2530 01:47:19,820 --> 01:47:22,460 If Oscar is touching the mouse pointer, then 2531 01:47:22,460 --> 01:47:26,390 change Oscar's costume to number two, otherwise change it back to one. 2532 01:47:26,390 --> 01:47:28,190 So it's super simple animation. 2533 01:47:28,190 --> 01:47:31,970 I'm just toggling between lid up, lid down, lid up, lid down, 2534 01:47:31,970 --> 01:47:33,710 but it kind of feels interactive. 2535 01:47:33,710 --> 01:47:35,810 And if I wanted to really make this pretty, 2536 01:47:35,810 --> 01:47:40,580 I could have 30 different costumes where the lid is ever so slightly higher. 2537 01:47:40,580 --> 01:47:44,120 Then it would look even more like a movie or fluid motion. 2538 01:47:44,120 --> 01:47:46,640 But this was enough to get the job done, which 2539 01:47:46,640 --> 01:47:49,700 is to say I didn't try to implement all of "Oscartime" together. 2540 01:47:49,700 --> 01:47:52,490 I just took a second baby step toward my goal. 2541 01:47:52,490 --> 01:47:54,950 And then my next version of "Oscartime" might 2542 01:47:54,950 --> 01:47:57,675 have looked a little something like this, where now the trash-- 2543 01:47:57,675 --> 01:47:58,800 there's more going on here. 2544 01:47:58,800 --> 01:48:02,300 Let's look at two of these blocks of code. 2545 01:48:02,300 --> 01:48:04,972 The first thing I did was I enabled drag mode to draggable, 2546 01:48:04,972 --> 01:48:07,430 and I had to Google to figure this out because otherwise it 2547 01:48:07,430 --> 01:48:09,890 didn't let me drag the trash while playing the game. 2548 01:48:09,890 --> 01:48:12,800 But once I figured that out, I tell the trash 2549 01:48:12,800 --> 01:48:16,700 to go to a random x-coordinate between 0 and 240 2550 01:48:16,700 --> 01:48:19,670 from left to right and then the y location 180 2551 01:48:19,670 --> 01:48:22,070 because I always want the trash falling from the sky. 2552 01:48:22,070 --> 01:48:23,270 And then what do I do? 2553 01:48:23,270 --> 01:48:27,530 I told the trash to forever change its y-coordinate, its vertical coordinate, 2554 01:48:27,530 --> 01:48:30,740 by negative 1, negative 1, negative 1, one pixel 2555 01:48:30,740 --> 01:48:34,190 at a time, which creates the illusion of it falling from the sky. 2556 01:48:34,190 --> 01:48:36,950 But I needed to do one other thing, and let me scroll up. 2557 01:48:36,950 --> 01:48:41,360 Each of your sprites can have multiple programs, multiple scripts, 2558 01:48:41,360 --> 01:48:44,070 so to speak, that are not attached to one another. 2559 01:48:44,070 --> 01:48:46,050 They will happen in parallel for you. 2560 01:48:46,050 --> 01:48:47,750 The second one is saying this. 2561 01:48:47,750 --> 01:48:52,850 Forever if the trash is touching Oscar, what should it do? 2562 01:48:52,850 --> 01:48:57,440 Go to a completely different x and y location at the very top. 2563 01:48:57,440 --> 01:48:57,950 Why? 2564 01:48:57,950 --> 01:49:01,010 Well, as soon as I drag the trash over the Oscar, 2565 01:49:01,010 --> 01:49:03,530 I want it to disappear as though it's going into the can. 2566 01:49:03,530 --> 01:49:06,830 And I then want it to reappear at the top so more trash falls. 2567 01:49:06,830 --> 01:49:08,840 So I just thought about what would it mean 2568 01:49:08,840 --> 01:49:10,910 for the trash to go into the trash can. 2569 01:49:10,910 --> 01:49:11,870 Well, who cares? 2570 01:49:11,870 --> 01:49:14,210 What really matters to the human user is that it just 2571 01:49:14,210 --> 01:49:16,980 disappears and teleports elsewhere. 2572 01:49:16,980 --> 01:49:19,620 And so that's the idea I implemented here. 2573 01:49:19,620 --> 01:49:24,960 So if you can reduce intuitive ideas to just basic building blocks like this, 2574 01:49:24,960 --> 01:49:27,440 you can start to make things much more interactive. 2575 01:49:27,440 --> 01:49:29,970 And lastly, if I look at this version here, 2576 01:49:29,970 --> 01:49:33,050 you'll see that we've combined these. 2577 01:49:33,050 --> 01:49:35,930 And so indeed, if I actually go ahead and play this now, 2578 01:49:35,930 --> 01:49:37,790 not only is it falling. 2579 01:49:37,790 --> 01:49:41,090 I can let it fall right on top of Oscar and watch it disappear. 2580 01:49:41,090 --> 01:49:44,795 But notice Oscar doesn't pop out yet because that was the fourth version 2581 01:49:44,795 --> 01:49:45,920 and then the fifth version. 2582 01:49:45,920 --> 01:49:48,650 And then I added the annoying music and so forth but sort of 2583 01:49:48,650 --> 01:49:51,600 composed this program step by step by step 2584 01:49:51,600 --> 01:49:53,193 so as to accomplish my larger goal. 2585 01:49:53,193 --> 01:49:55,610 And this is going to be true of all of the code you write, 2586 01:49:55,610 --> 01:50:00,980 be it in Scratch, or C, or Python, or in the like, trying to come up with-- 2587 01:50:00,980 --> 01:50:05,360 or rather, trying to reduce your ideas, your grand vision to just baby steps, 2588 01:50:05,360 --> 01:50:07,670 building blocks so that you start with version one, 2589 01:50:07,670 --> 01:50:10,010 and maybe you submit version 10 or 20. 2590 01:50:10,010 --> 01:50:13,190 But you don't try to implement version 10 or 20 at the get-go. 2591 01:50:13,190 --> 01:50:15,780 You take those incremental steps. 2592 01:50:15,780 --> 01:50:16,280 All right. 2593 01:50:16,280 --> 01:50:17,270 How about one other? 2594 01:50:17,270 --> 01:50:19,550 Well, let me propose this. 2595 01:50:19,550 --> 01:50:23,370 Let me go ahead and open three games that represent one 2596 01:50:23,370 --> 01:50:27,570 that your predecessors also implemented, which looks a little something 2597 01:50:27,570 --> 01:50:29,220 like this in version zero. 2598 01:50:29,220 --> 01:50:32,220 Suppose I wanted to implement a game that 2599 01:50:32,220 --> 01:50:33,900 simply has these kinds of mechanics. 2600 01:50:33,900 --> 01:50:37,050 I'm touching my arrow keys on my keyboard-- up, down, left, and right. 2601 01:50:37,050 --> 01:50:38,460 And I'm moving the Harvard logo. 2602 01:50:38,460 --> 01:50:39,610 Let me zoom in a bit. 2603 01:50:39,610 --> 01:50:42,210 So if I hit the up arrow, the Harvard shield goes up. 2604 01:50:42,210 --> 01:50:44,760 If I hit the down arrow, the shield goes down. 2605 01:50:44,760 --> 01:50:47,070 If I go all the way to the left, it goes left 2606 01:50:47,070 --> 01:50:49,548 until it hits the wall and same thing on the right. 2607 01:50:49,548 --> 01:50:51,840 So this is like the beginnings of a game or a beginning 2608 01:50:51,840 --> 01:50:53,370 of a maze, something like that. 2609 01:50:53,370 --> 01:50:55,150 Well, how might I implement this? 2610 01:50:55,150 --> 01:50:57,210 Well, let me look inside this one. 2611 01:50:57,210 --> 01:51:01,020 And there's a lot going on, but, again, I sort of took simple steps. 2612 01:51:01,020 --> 01:51:02,730 Notice that I've got three sprites-- 2613 01:51:02,730 --> 01:51:04,920 a left wall, which is just a straight line, 2614 01:51:04,920 --> 01:51:07,140 the right wall, which is a straight line. 2615 01:51:07,140 --> 01:51:10,710 And just intuitively, why did I implement those as sprites? 2616 01:51:10,710 --> 01:51:15,240 Why do they need to exist as entities themselves? 2617 01:51:15,240 --> 01:51:16,230 Yeah, in front. 2618 01:51:16,230 --> 01:51:16,530 AUDIENCE: [INAUDIBLE] 2619 01:51:16,530 --> 01:51:17,405 DAVID J. MALAN: Yeah. 2620 01:51:17,405 --> 01:51:19,033 I want it to interact with the shield. 2621 01:51:19,033 --> 01:51:21,450 So I need to be able to ask that Boolean expression, like, 2622 01:51:21,450 --> 01:51:24,940 not touching mouse pointer but touching shield, for instance, 2623 01:51:24,940 --> 01:51:26,560 a different type of yes/no question. 2624 01:51:26,560 --> 01:51:29,130 And so what is the code for the shield actually doing? 2625 01:51:29,130 --> 01:51:32,850 Well, there's a lot of duplication, and let me focus on the abstraction first. 2626 01:51:32,850 --> 01:51:35,680 Notice that I've got this one green flag clicked. 2627 01:51:35,680 --> 01:51:38,430 I want the shield to go dead center, 0 comma 0, 2628 01:51:38,430 --> 01:51:42,600 and then forever listen for the human's keyboard, and feel for the wall. 2629 01:51:42,600 --> 01:51:45,815 So I decided to implement my own pink puzzle pieces that 2630 01:51:45,815 --> 01:51:47,190 implement the two separate ideas. 2631 01:51:47,190 --> 01:51:49,450 One, just listen for the keyboard-- up, down, left, 2632 01:51:49,450 --> 01:51:50,700 right-- and then do something. 2633 01:51:50,700 --> 01:51:53,770 And then feel for walls is this idea of whenever I go up, 2634 01:51:53,770 --> 01:51:56,550 down, left, or right, if I touch a wall, I 2635 01:51:56,550 --> 01:52:00,600 need to stop doing whatever the keystrokes are telling me to do. 2636 01:52:00,600 --> 01:52:05,580 So now if we dive into those implementation details, listen and feel 2637 01:52:05,580 --> 01:52:07,930 are abstractions, custom puzzle pieces. 2638 01:52:07,930 --> 01:52:09,870 Let's look at the implementation details. 2639 01:52:09,870 --> 01:52:11,220 Well, here's the keyboard. 2640 01:52:11,220 --> 01:52:15,840 If the key arrow up is pressed, change y by 1. 2641 01:52:15,840 --> 01:52:19,495 If key down arrow is pressed, change y by negative 1. 2642 01:52:19,495 --> 01:52:21,370 And you can probably see where this is going. 2643 01:52:21,370 --> 01:52:23,310 Right arrow is x by 1. 2644 01:52:23,310 --> 01:52:25,920 Left arrow is x by negative 1, and that's 2645 01:52:25,920 --> 01:52:29,050 sort of all that's involved with up, down, left, right. 2646 01:52:29,050 --> 01:52:30,030 But wait a minute. 2647 01:52:30,030 --> 01:52:35,910 Why is there no loop in this listen for keyboard puzzle piece? 2648 01:52:35,910 --> 01:52:39,240 I needed a loop last time so it constantly works. 2649 01:52:39,240 --> 01:52:40,770 AUDIENCE: [INAUDIBLE] 2650 01:52:40,770 --> 01:52:41,770 DAVID J. MALAN: Exactly. 2651 01:52:41,770 --> 01:52:44,350 I put the loop in my main part of my program 2652 01:52:44,350 --> 01:52:48,020 up top so something is telling me to keep listening again and again. 2653 01:52:48,020 --> 01:52:50,020 So it's got to be somewhere, but it doesn't have 2654 01:52:50,020 --> 01:52:51,760 to be in the actual implementation. 2655 01:52:51,760 --> 01:52:53,950 And lastly, how about this feel for walls? 2656 01:52:53,950 --> 01:52:58,420 Well, if touching left wall, which is just another sprite, change x by 1. 2657 01:52:58,420 --> 01:53:00,880 So that is to say if I'm touching the left wall, 2658 01:53:00,880 --> 01:53:03,465 I want to bounce it back the other direction 2659 01:53:03,465 --> 01:53:04,840 and same thing on the right wall. 2660 01:53:04,840 --> 01:53:06,580 If I'm touching the right wall, I want to bounce it 2661 01:53:06,580 --> 01:53:09,670 back to the left, which effectively means that even if the human's hitting 2662 01:53:09,670 --> 01:53:11,680 the key, it's like fighting with this code, 2663 01:53:11,680 --> 01:53:14,890 but it's never going to go through the wall based on that math. 2664 01:53:14,890 --> 01:53:16,760 It's going to stop it right there. 2665 01:53:16,760 --> 01:53:17,260 All right. 2666 01:53:17,260 --> 01:53:18,760 Let's add something else to the mix. 2667 01:53:18,760 --> 01:53:21,640 Suppose I want the game to change to be a little something like this, 2668 01:53:21,640 --> 01:53:25,300 where Yale is some kind of block in between me and the exit. 2669 01:53:25,300 --> 01:53:27,140 So some dramatic race here. 2670 01:53:27,140 --> 01:53:27,640 OK. 2671 01:53:27,640 --> 01:53:30,100 I just got by, but the Yale logo doesn't seem 2672 01:53:30,100 --> 01:53:32,200 to be doing all that much except bouncing. 2673 01:53:32,200 --> 01:53:35,660 So I'm guessing there's a loop, maybe a conditional checking for those walls 2674 01:53:35,660 --> 01:53:36,160 too. 2675 01:53:36,160 --> 01:53:38,823 So let's go ahead and zoom out, see inside. 2676 01:53:38,823 --> 01:53:41,490 Let's not worry about Harvard because it's pretty much the same. 2677 01:53:41,490 --> 01:53:43,520 Let's look at the Yale puzzle pieces. 2678 01:53:43,520 --> 01:53:45,710 And sure enough, go to the middle. 2679 01:53:45,710 --> 01:53:46,880 0 comma zero. 2680 01:53:46,880 --> 01:53:50,930 Point in direction 90, so point horizontally on the grid. 2681 01:53:50,930 --> 01:53:53,870 And then if touching left wall or touching right wall-- 2682 01:53:53,870 --> 01:53:58,470 I'm kind of cheating this time, but cleverly, just spin around and do 180 2683 01:53:58,470 --> 01:54:00,198 so you effectively bounce off the wall. 2684 01:54:00,198 --> 01:54:01,490 This just tightened up my code. 2685 01:54:01,490 --> 01:54:03,490 I don't need to do the negative 1 or the plus 1. 2686 01:54:03,490 --> 01:54:07,010 I just say bounce in this form of code, otherwise just 2687 01:54:07,010 --> 01:54:08,420 constantly move one step. 2688 01:54:08,420 --> 01:54:12,080 Now, if this is a game where Yale is supposed to be better and faster, 2689 01:54:12,080 --> 01:54:13,520 well, let's change the 1 to 5. 2690 01:54:13,520 --> 01:54:15,300 Move 5 pixels at a time. 2691 01:54:15,300 --> 01:54:17,610 Let's move it 10 back and forth. 2692 01:54:17,610 --> 01:54:19,040 Let's maybe 100. 2693 01:54:19,040 --> 01:54:20,150 Uh-oh. 2694 01:54:20,150 --> 01:54:21,380 So what just happened? 2695 01:54:21,380 --> 01:54:25,310 That is a bug, which we can avoid by just not doing that. 2696 01:54:25,310 --> 01:54:27,310 But why did it break out of the wall? 2697 01:54:27,310 --> 01:54:28,310 Yeah. 2698 01:54:28,310 --> 01:54:29,600 AUDIENCE: [INAUDIBLE]. 2699 01:54:29,600 --> 01:54:30,890 At first it was [INAUDIBLE]. 2700 01:54:30,890 --> 01:54:31,890 DAVID J. MALAN: Exactly. 2701 01:54:31,890 --> 01:54:34,010 Because I'm doing 100 steps at a time, I'm 2702 01:54:34,010 --> 01:54:36,200 never actually touching the other sprite because I'm 2703 01:54:36,200 --> 01:54:38,060 sort of stepping way over it. 2704 01:54:38,060 --> 01:54:40,610 So there's never a moment where they're actually touching. 2705 01:54:40,610 --> 01:54:44,630 So previously, I was just getting lucky by doing fewer steps because it's 2706 01:54:44,630 --> 01:54:46,700 gradually going over the wall, which gives me 2707 01:54:46,700 --> 01:54:48,557 just enough time to detect as much. 2708 01:54:48,557 --> 01:54:50,390 So I would have to kind of tinker, and he'll 2709 01:54:50,390 --> 01:54:51,932 handle this a little bit differently. 2710 01:54:51,932 --> 01:54:53,790 So it's a bug if it's too fast. 2711 01:54:53,790 --> 01:54:55,730 But at least if I keep it slow and reasonable 2712 01:54:55,730 --> 01:54:59,870 the math actually does work out, so long as it starts again in the middle. 2713 01:54:59,870 --> 01:55:04,200 Well, let's do one final flourish here, whereby let's bring MIT into the mix. 2714 01:55:04,200 --> 01:55:04,700 Right? 2715 01:55:04,700 --> 01:55:06,770 They're super smart, so maybe they can kind of 2716 01:55:06,770 --> 01:55:11,390 track us and follow wherever I'm going. 2717 01:55:11,390 --> 01:55:13,140 So how might this work? 2718 01:55:13,140 --> 01:55:13,640 All right. 2719 01:55:13,640 --> 01:55:16,580 So nothing happens yet because we haven't finished composing the game. 2720 01:55:16,580 --> 01:55:17,490 And notice here-- 2721 01:55:17,490 --> 01:55:17,990 OK. 2722 01:55:17,990 --> 01:55:19,063 Now MIT is struggling. 2723 01:55:19,063 --> 01:55:21,980 It's kind of twitching there because it's going just above, and below, 2724 01:55:21,980 --> 01:55:23,100 and then above, and below. 2725 01:55:23,100 --> 01:55:24,840 So we could fix that too if we want. 2726 01:55:24,840 --> 01:55:28,080 But that's just a function of my math, one pixel at a time. 2727 01:55:28,080 --> 01:55:33,570 Let me open up this one, see inside, and click on MIT. 2728 01:55:33,570 --> 01:55:37,110 And it doesn't take much to implement MIT, it seems. 2729 01:55:37,110 --> 01:55:43,200 So go to random position, forever point towards the Harvard logo outline, 2730 01:55:43,200 --> 01:55:46,330 AKA the shield, and then move one step. 2731 01:55:46,330 --> 01:55:50,705 So if I wanted to make MIT even smarter, even faster, what do I change here? 2732 01:55:50,705 --> 01:55:51,580 AUDIENCE: [INAUDIBLE] 2733 01:55:51,580 --> 01:55:52,455 DAVID J. MALAN: Yeah. 2734 01:55:52,455 --> 01:55:56,070 Change one step to two steps to double their speed or five steps, 10 steps, 2735 01:55:56,070 --> 01:55:56,612 or 100 steps. 2736 01:55:56,612 --> 01:55:58,403 And the game is going to be over like that. 2737 01:55:58,403 --> 01:56:00,940 But that's all it takes to now make these kinds of elements. 2738 01:56:00,940 --> 01:56:03,330 So if you are a game player on your phone, or consoles, 2739 01:56:03,330 --> 01:56:06,120 or computer, or whatever, if you think about almost any game, 2740 01:56:06,120 --> 01:56:08,910 you can probably now start to think about how they implemented 2741 01:56:08,910 --> 01:56:12,210 those mechanics because it's just being reduced to functions, conditionals, 2742 01:56:12,210 --> 01:56:15,640 loops, variables, and the like in this case. 2743 01:56:15,640 --> 01:56:20,560 So let's go ahead here and have maybe one final volunteer. 2744 01:56:20,560 --> 01:56:22,480 We've got one more bag of Oreos here. 2745 01:56:22,480 --> 01:56:22,980 OK. 2746 01:56:22,980 --> 01:56:23,640 That was super fast. 2747 01:56:23,640 --> 01:56:24,750 Do you want to come on up? 2748 01:56:24,750 --> 01:56:25,250 All right. 2749 01:56:25,250 --> 01:56:25,920 Brave volunteer. 2750 01:56:25,920 --> 01:56:26,820 Come on up. 2751 01:56:26,820 --> 01:56:30,271 [APPLAUSE] 2752 01:56:30,271 --> 01:56:31,180 2753 01:56:31,180 --> 01:56:31,680 All right. 2754 01:56:31,680 --> 01:56:36,720 Let me find the full-fledged version of this that one of your predecessors 2755 01:56:36,720 --> 01:56:37,650 made. 2756 01:56:37,650 --> 01:56:40,490 And let me get the right one. 2757 01:56:40,490 --> 01:56:40,990 OK. 2758 01:56:40,990 --> 01:56:41,740 Here we go. 2759 01:56:41,740 --> 01:56:45,030 We'll see some instructions on the screen in just a moment. 2760 01:56:45,030 --> 01:56:50,460 And when we hit Play, you'll see that the mechanics are all combined now 2761 01:56:50,460 --> 01:56:51,630 into one full-fledged game. 2762 01:56:51,630 --> 01:56:54,740 But first, an introduction. 2763 01:56:54,740 --> 01:56:55,890 It's on. 2764 01:56:55,890 --> 01:56:56,750 SAM: Hi, everyone. 2765 01:56:56,750 --> 01:56:57,780 I'm Sam. 2766 01:56:57,780 --> 01:56:58,830 I live in [INAUDIBLE]. 2767 01:56:58,830 --> 01:57:00,657 I'm a freshman, and I'm from Nepal. 2768 01:57:00,657 --> 01:57:01,740 DAVID J. MALAN: All right. 2769 01:57:01,740 --> 01:57:02,655 Welcome to the stage. 2770 01:57:02,655 --> 01:57:03,155 [APPLAUSE] 2771 01:57:03,155 --> 01:57:04,287 SAM: Thank you. 2772 01:57:04,287 --> 01:57:05,370 DAVID J. MALAN: All right. 2773 01:57:05,370 --> 01:57:05,980 So here we go. 2774 01:57:05,980 --> 01:57:06,480 Yep. 2775 01:57:06,480 --> 01:57:08,010 Go ahead and click the green flag. 2776 01:57:08,010 --> 01:57:10,435 [MUSIC PLAYING] 2777 01:57:10,435 --> 01:57:14,010 [MC HAMMER, "U CAN'T TOUCH THIS"] You can't touch this. 2778 01:57:14,010 --> 01:57:17,982 DAVID J. MALAN: You see the grid is just bigger this time. 2779 01:57:17,982 --> 01:57:19,395 (SINGING) You can't touch this. 2780 01:57:19,395 --> 01:57:20,270 DAVID J. MALAN: Nice. 2781 01:57:20,270 --> 01:57:22,227 Now there's that Yale element. 2782 01:57:22,227 --> 01:57:24,080 (SINGING) You can't touch this. 2783 01:57:24,080 --> 01:57:27,770 My, my, my my music hits me so hard. 2784 01:57:27,770 --> 01:57:29,570 Makes me say, oh, my Lord. 2785 01:57:29,570 --> 01:57:32,518 Thank you for blessing me with a mind to rhyme and two hyped feet. 2786 01:57:32,518 --> 01:57:35,810 It feels good when you know you're down, a super dope homeboy from the Oaktown. 2787 01:57:35,810 --> 01:57:36,602 DAVID J. MALAN: OK. 2788 01:57:36,602 --> 01:57:38,810 Third Yale. 2789 01:57:38,810 --> 01:57:41,480 All started at slightly different positions. 2790 01:57:41,480 --> 01:57:43,035 (SINGING) I told you, homeboy. 2791 01:57:43,035 --> 01:57:43,910 You can't touch this. 2792 01:57:43,910 --> 01:57:44,660 DAVID J. MALAN: Nice. 2793 01:57:44,660 --> 01:57:45,160 All right. 2794 01:57:45,160 --> 01:57:45,830 There's MIT. 2795 01:57:45,830 --> 01:57:47,780 (SINGING) And ya know you can't touch this. 2796 01:57:47,780 --> 01:57:49,139 [CHEERING, APPLAUSE] 2797 01:57:49,139 --> 01:57:50,500 DAVID J. MALAN: Oh. 2798 01:57:50,500 --> 01:57:52,520 (SINGING) You can't touch this. 2799 01:57:52,520 --> 01:57:53,020 Yo. 2800 01:57:53,020 --> 01:57:54,245 Let me bust the funky lyrics. 2801 01:57:54,245 --> 01:57:55,495 DAVID J. MALAN: Gotta go fast. 2802 01:57:55,495 --> 01:57:58,000 2803 01:57:58,000 --> 01:57:59,930 Oh. 2804 01:57:59,930 --> 01:58:00,430 No. 2805 01:58:00,430 --> 01:58:05,030 2806 01:58:05,030 --> 01:58:07,090 Oh. 2807 01:58:07,090 --> 01:58:07,590 [CHUCKLES] 2808 01:58:07,590 --> 01:58:09,465 (SINGING) Cold on a mission, so fall on back. 2809 01:58:09,465 --> 01:58:13,690 Let them know that you're too much, and this is a beat they can't touch. 2810 01:58:13,690 --> 01:58:14,590 DAVID J. MALAN: Nice. 2811 01:58:14,590 --> 01:58:15,970 [EXCLAIMING] 2812 01:58:15,970 --> 01:58:18,270 (SINGING) You can't touch this. 2813 01:58:18,270 --> 01:58:20,482 DAVID J. MALAN: No more walls but two MITs. 2814 01:58:20,482 --> 01:58:21,690 (SINGING) Yo, sound the bell. 2815 01:58:21,690 --> 01:58:22,765 School's in, sucker. 2816 01:58:22,765 --> 01:58:24,015 DAVID J. MALAN: Princeton now. 2817 01:58:24,015 --> 01:58:25,612 (SINGING) Give me a song or rhythm. 2818 01:58:25,612 --> 01:58:27,570 Making them sweat, that's what I'm giving them. 2819 01:58:27,570 --> 01:58:31,140 Now, they know you talk about the Hammer when you're talkin' 2820 01:58:31,140 --> 01:58:32,670 'bout a show that's hyped and tight. 2821 01:58:32,670 --> 01:58:36,463 Singers are sweatin', so pass them a wipe or a tape to learn. 2822 01:58:36,463 --> 01:58:38,005 DAVID J. MALAN: Second to last level. 2823 01:58:38,005 --> 01:58:39,800 (SINGING) The chart's legit. 2824 01:58:39,800 --> 01:58:41,980 Either work hard, or you might as well quit. 2825 01:58:41,980 --> 01:58:45,540 That's word because you know you can't touch this. 2826 01:58:45,540 --> 01:58:48,265 2827 01:58:48,265 --> 01:58:49,140 You can't touch this. 2828 01:58:49,140 --> 01:58:51,870 2829 01:58:51,870 --> 01:58:52,600 Break it down. 2830 01:58:52,600 --> 01:58:53,683 DAVID J. MALAN: All right. 2831 01:58:53,683 --> 01:58:54,660 Clear. 2832 01:58:54,660 --> 01:58:55,160 There we go. 2833 01:58:55,160 --> 01:58:55,660 Nice. 2834 01:58:55,660 --> 01:58:56,310 Oh, oh. 2835 01:58:56,310 --> 01:58:59,565 2836 01:58:59,565 --> 01:59:00,960 Oh. 2837 01:59:00,960 --> 01:59:02,814 Few more lives. 2838 01:59:02,814 --> 01:59:05,590 Oh. 2839 01:59:05,590 --> 01:59:06,280 (SINGING) Stop. 2840 01:59:06,280 --> 01:59:06,700 Hammer time. 2841 01:59:06,700 --> 01:59:07,130 DAVID J. MALAN: Here we go. 2842 01:59:07,130 --> 01:59:08,110 There we go. 2843 01:59:08,110 --> 01:59:09,690 [EXCLAIMING] 2844 01:59:09,690 --> 01:59:10,190 All right. 2845 01:59:10,190 --> 01:59:12,220 Couple more tries. 2846 01:59:12,220 --> 01:59:13,260 Yes! 2847 01:59:13,260 --> 01:59:14,345 Oh, no. 2848 01:59:14,345 --> 01:59:15,997 (SINGING) This is it for a winner. 2849 01:59:15,997 --> 01:59:17,830 Dance to this, and you're gonna get thinner. 2850 01:59:17,830 --> 01:59:19,480 Now move, slide your rump. 2851 01:59:19,480 --> 01:59:20,080 DAVID J. MALAN: Starts getting stressful. 2852 01:59:20,080 --> 01:59:22,210 (SINGING) Just for a minute, let's all do the bump. 2853 01:59:22,210 --> 01:59:23,140 Bump, bump, bump. 2854 01:59:23,140 --> 01:59:24,310 Yeah. 2855 01:59:24,310 --> 01:59:27,020 You can't touch this. 2856 01:59:27,020 --> 01:59:27,890 Look, man. 2857 01:59:27,890 --> 01:59:29,358 You can't touch this. 2858 01:59:29,358 --> 01:59:30,650 You'll probably get hyped, boy. 2859 01:59:30,650 --> 01:59:31,620 DAVID J. MALAN: One more try. 2860 01:59:31,620 --> 01:59:33,087 (SINGING) You can't touch this. 2861 01:59:33,087 --> 01:59:33,670 Ring the bell. 2862 01:59:33,670 --> 01:59:34,840 School's back in. 2863 01:59:34,840 --> 01:59:35,140 DAVID J. MALAN: All right. 2864 01:59:35,140 --> 01:59:36,515 A round of applause, nonetheless. 2865 01:59:36,515 --> 01:59:37,420 [APPLAUSE] 2866 01:59:37,420 --> 01:59:38,360 Nicely done. 2867 01:59:38,360 --> 01:59:39,280 Thank you. 2868 01:59:39,280 --> 01:59:42,500 2869 01:59:42,500 --> 01:59:46,660 So as you might have noticed if your eyes started 2870 01:59:46,660 --> 01:59:48,410 to wander to the light bulbs here, there's 2871 01:59:48,410 --> 01:59:50,570 actually 64 of these light bulbs. 2872 01:59:50,570 --> 01:59:55,062 And I'm wondering if you divide 64 by 8, that's 8 bytes of light bulbs. 2873 01:59:55,062 --> 01:59:57,020 And we now have some Unicode in our vocabulary. 2874 01:59:57,020 --> 01:59:58,970 So might very well be the case that we've 2875 01:59:58,970 --> 02:00:03,360 been spelling something out on the stage here for you all of this time. 2876 02:00:03,360 --> 02:00:07,190 But before we adjourn for cake to be served in the Transept, 2877 02:00:07,190 --> 02:00:11,930 allow me to introduce some of CS50's human friends, 2878 02:00:11,930 --> 02:00:17,210 the Harvard Krokodiloes and the Radcliffe Pitches, 2879 02:00:17,210 --> 02:00:23,148 to give us this exciting ending, "This is CS50." 2880 02:00:23,148 --> 02:00:26,606 [APPLAUSE, CHEERING] 2881 02:00:26,606 --> 02:00:36,980 2882 02:00:36,980 --> 02:00:38,462 [HARMONICA NOTE] 2883 02:00:38,462 --> 02:00:41,420 2884 02:00:41,420 --> 02:00:41,920 [VOCALIZING] 2885 02:00:41,920 --> 02:00:50,820 SPEAKER: (SINGING) There's a certain someone who I'm indebted to. 2886 02:00:50,820 --> 02:01:00,080 And since the old [? BNC ?] has 50, I have this friend for you. 2887 02:01:00,080 --> 02:01:03,090 2888 02:01:03,090 --> 02:01:04,300 A two, three, four. 2889 02:01:04,300 --> 02:01:08,845 [VOCALIZING] 2890 02:01:08,845 --> 02:01:12,130 Oh, rubber ducky, you're the one. 2891 02:01:12,130 --> 02:01:14,770 You make [INAUDIBLE] so much fun. 2892 02:01:14,770 --> 02:01:18,400 Rubber ducky, I'm awfully fond of you. 2893 02:01:18,400 --> 02:01:25,030 [SCATTING] Rubber ducky, you make me smile, and you help my code compile. 2894 02:01:25,030 --> 02:01:27,100 Rubber ducky, you're my very best friend. 2895 02:01:27,100 --> 02:01:29,230 It's true. 2896 02:01:29,230 --> 02:01:33,760 When I'm at a standstill, your debugging abilities stun me. 2897 02:01:33,760 --> 02:01:40,330 When I'm at the end of my rope, you just snap, and my code's up and running. 2898 02:01:40,330 --> 02:01:45,160 Rubber ducky, you're so fine, and I'm lucky that you're mine. 2899 02:01:45,160 --> 02:01:47,320 Rubber ducky, you're my very best friend. 2900 02:01:47,320 --> 02:01:48,610 It's true. 2901 02:01:48,610 --> 02:01:49,910 You're my best friend. 2902 02:01:49,910 --> 02:01:52,750 It's true. 2903 02:01:52,750 --> 02:01:56,785 Rubber ducky, I'm awfully fond of you. 2904 02:01:56,785 --> 02:02:02,128 2905 02:02:02,128 --> 02:02:05,607 [CHEERING, APPLAUSE] 2906 02:02:05,607 --> 02:02:08,600 2907 02:02:08,600 --> 02:02:10,140 SPEAKER: Good afternoon, CS50. 2908 02:02:10,140 --> 02:02:12,890 We are the Harvard Krokodiloes, Harvard's oldest a cappella group, 2909 02:02:12,890 --> 02:02:16,160 founded way back in 1946 at the historic Hasty Pudding Club. 2910 02:02:16,160 --> 02:02:18,462 We'd love to make a big thank you to CS50 staff 2911 02:02:18,462 --> 02:02:21,170 and to David Malan for having us perform here at Sanders Theater. 2912 02:02:21,170 --> 02:02:24,800 And you enjoyed this performance, please come audition for us 2913 02:02:24,800 --> 02:02:26,856 this weekend at Farkas Hall. 2914 02:02:26,856 --> 02:02:30,328 [CHEERING, APPLAUSE] 2915 02:02:30,328 --> 02:02:36,280 2916 02:02:36,280 --> 02:02:37,730 SPEAKER: Hello, everyone. 2917 02:02:37,730 --> 02:02:40,000 We are some of the Radcliffe Pitches, and we are also 2918 02:02:40,000 --> 02:02:41,920 hosting auditions this weekend. 2919 02:02:41,920 --> 02:02:45,280 You can find more information at our Instagram, @radcliffepitches. 2920 02:02:45,280 --> 02:02:48,700 Now, let me tell you a little bit about just about a year ago 2921 02:02:48,700 --> 02:02:52,840 today, when I was sitting in your very seats on my first day of CS50 lecture. 2922 02:02:52,840 --> 02:02:55,700 And this is just about how I was feeling. 2923 02:02:55,700 --> 02:02:57,170 [HARMONICA NOTE] 2924 02:02:57,170 --> 02:03:00,110 2925 02:03:00,110 --> 02:03:03,540 [VOCALIZING] 2926 02:03:03,540 --> 02:03:07,410 2927 02:03:07,410 --> 02:03:11,700 (SINGING) It's the first day of class, and I'm brand new to code. 2928 02:03:11,700 --> 02:03:14,190 Is this for me? 2929 02:03:14,190 --> 02:03:16,200 So many people around. 2930 02:03:16,200 --> 02:03:18,750 Can I get through the workload? 2931 02:03:18,750 --> 02:03:21,660 But it's my dream. 2932 02:03:21,660 --> 02:03:25,260 I tend to stick to English, not science. 2933 02:03:25,260 --> 02:03:29,167 But my [INAUDIBLE] friends told me to try this. 2934 02:03:29,167 --> 02:03:32,250 Hey, dancing robot dog, you kind of look like you have your life together, 2935 02:03:32,250 --> 02:03:33,180 I guess. 2936 02:03:33,180 --> 02:03:35,697 I really need some advice. 2937 02:03:35,697 --> 02:03:37,530 (ALL SINGING) We know you're feeling unsure, 2938 02:03:37,530 --> 02:03:40,590 but this is really the right call. 2939 02:03:40,590 --> 02:03:44,760 In CS50, you'll meet new friends, get free food. 2940 02:03:44,760 --> 02:03:50,160 You'll be all set for this fall in CS50. 2941 02:03:50,160 --> 02:03:54,150 You have a thousand TAs who will help you. 2942 02:03:54,150 --> 02:03:58,190 You'll get cupcakes, duckies, Chinese food. 2943 02:03:58,190 --> 02:04:03,870 And you can always take this class and set aside. 2944 02:04:03,870 --> 02:04:06,880 2945 02:04:06,880 --> 02:04:08,680 SPEAKER: This is CS50. 2946 02:04:08,680 --> 02:04:10,828 Fist bump. 2947 02:04:10,828 --> 02:04:11,800 [LAUGHTER] 2948 02:04:11,800 --> 02:04:15,202 [APPLAUSE, CHEERING] 2949 02:04:15,202 --> 02:04:16,645 2950 02:04:16,645 --> 02:04:18,270 DAVID J. MALAN: Thank you to the Kroks. 2951 02:04:18,270 --> 02:04:19,380 Thank you to the Pitches. 2952 02:04:19,380 --> 02:04:20,370 Cake is now served. 2953 02:04:20,370 --> 02:04:23,490 Come on up to say hi if you'd like or meet Spot. 2954 02:04:23,490 --> 02:04:24,330 See you next time. 2955 02:04:24,330 --> 02:04:25,163 [APPLAUSE, CHEERING] 2956 02:04:25,163 --> 02:04:28,280 [MUSIC PLAYING] 2957 02:04:28,280 --> 02:04:54,000