All language subtitles for https___cdn.cs50.net_2022_fall_lectures_0_lang_en_lecture0.srt

af Afrikaans
sq Albanian
am Amharic
ar Arabic Download
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English Download
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:00,000 --> 00:00:02,988 2 00:00:02,988 --> 00:00:06,474 [MUSIC PLAYING] 3 00:00:06,474 --> 00:01:13,310 4 00:01:13,310 --> 00:01:15,260 DAVID J. MALAN: All right. 5 00:01:15,260 --> 00:01:19,220 This is CS50, Harvard University's introduction 6 00:01:19,220 --> 00:01:21,560 to the intellectual enterprises of computer science 7 00:01:21,560 --> 00:01:22,940 and the arts of programming. 8 00:01:22,940 --> 00:01:27,660 My name is David Malan, and I actually took this course myself, back in 1996. 9 00:01:27,660 --> 00:01:29,382 I was a sophomore at the time. 10 00:01:29,382 --> 00:01:32,090 I was actually concentrating in government, because a year prior, 11 00:01:32,090 --> 00:01:34,550 as a first year, I'd come into Harvard thinking 12 00:01:34,550 --> 00:01:40,200 that I liked history and constitutional law and similar classes in high school. 13 00:01:40,200 --> 00:01:42,320 And so when I got here, I rather gravitated 14 00:01:42,320 --> 00:01:44,180 toward that which was familiar. 15 00:01:44,180 --> 00:01:47,508 I figured, if I liked and if I were good at that particular subject 16 00:01:47,508 --> 00:01:50,300 in high school, then that's presumably who I'm supposed to be here. 17 00:01:50,300 --> 00:01:52,910 But it wasn't until sophomore year that I got up 18 00:01:52,910 --> 00:01:55,847 the nerve to step foot in the CS50 classroom, 19 00:01:55,847 --> 00:01:57,680 and even then, it was only out of curiosity. 20 00:01:57,680 --> 00:02:02,295 Like I had no intention of studying computer science of even taking CS50 21 00:02:02,295 --> 00:02:03,170 when I got to campus. 22 00:02:03,170 --> 00:02:07,400 But people were talking about it, and there was a lot of beware. 23 00:02:07,400 --> 00:02:10,070 And it was perhaps for the initiated only, 24 00:02:10,070 --> 00:02:12,560 and I didn't really ultimately what computer science was. 25 00:02:12,560 --> 00:02:15,800 But for me, the light bulb went off. 26 00:02:15,800 --> 00:02:18,260 I found that, contrary to what I'd seen in high school, 27 00:02:18,260 --> 00:02:21,230 where I saw friends of mine like programming away in the computer lab, 28 00:02:21,230 --> 00:02:24,830 heads down, antisocially just doing whatever it was they were doing, 29 00:02:24,830 --> 00:02:28,100 it really wasn't that, once I got to this particular class 30 00:02:28,100 --> 00:02:29,280 and this particular place. 31 00:02:29,280 --> 00:02:32,240 It was much more about problem solving more generally and just learning 32 00:02:32,240 --> 00:02:34,852 how to express yourself in code, in different languages. 33 00:02:34,852 --> 00:02:37,310 So that you can actually solve problems of interest to you. 34 00:02:37,310 --> 00:02:41,060 Even if you have no intention of being a computer scientist or an engineer, 35 00:02:41,060 --> 00:02:43,140 but just want to be able to solve problems, 36 00:02:43,140 --> 00:02:47,280 analyze data do interesting things, in the arts, humanities, social sciences, 37 00:02:47,280 --> 00:02:49,710 physical sciences, or really any other field. 38 00:02:49,710 --> 00:02:52,700 And indeed, this particular path led me to computer science, 39 00:02:52,700 --> 00:02:56,090 but the hope for CS50 more generally is that, indeed, you 40 00:02:56,090 --> 00:02:58,453 just find your way to applying principles 41 00:02:58,453 --> 00:03:00,620 that you'll learn over the coming months to whatever 42 00:03:00,620 --> 00:03:02,370 field is of interest to you. 43 00:03:02,370 --> 00:03:05,720 With that said, it was definitely a lot of work and not 44 00:03:05,720 --> 00:03:07,500 without its frustrations for me. 45 00:03:07,500 --> 00:03:10,940 But there was no better feeling than like banging your head proverbial 46 00:03:10,940 --> 00:03:14,180 against the wall for some number of hours, even days, trying to fix a bug, 47 00:03:14,180 --> 00:03:15,630 a mistake in your code. 48 00:03:15,630 --> 00:03:19,160 And then, oh my God, the rush of emotion of accomplishment 49 00:03:19,160 --> 00:03:22,433 of pride of exhaustion when you finally solve some problem that's 50 00:03:22,433 --> 00:03:23,600 really been weighing on you. 51 00:03:23,600 --> 00:03:26,570 It's just so incredibly gratifying but also empowering. 52 00:03:26,570 --> 00:03:28,910 Because unlike a lot of fields, like computer science 53 00:03:28,910 --> 00:03:31,200 was built by humans themselves. 54 00:03:31,200 --> 00:03:33,620 And so if a human built this, surely, you, another human, 55 00:03:33,620 --> 00:03:35,460 can understand it as well. 56 00:03:35,460 --> 00:03:38,570 And so even though there's going to be some distractions along the way, 57 00:03:38,570 --> 00:03:41,420 you're going to see what looks incredibly cryptic, if you've never 58 00:03:41,420 --> 00:03:42,440 programmed before. 59 00:03:42,440 --> 00:03:46,402 Over time and with practice, everything just starts to make more sense. 60 00:03:46,402 --> 00:03:48,110 And with time and with practice, you just 61 00:03:48,110 --> 00:03:49,950 get better at this particular field. 62 00:03:49,950 --> 00:03:53,210 And indeed, really, the key to success in programming in general 63 00:03:53,210 --> 00:03:55,530 is just to allow yourself enough time. 64 00:03:55,530 --> 00:03:57,575 And so at least, thankfully, I quickly got 65 00:03:57,575 --> 00:03:59,450 into the habit of starting early in the week, 66 00:03:59,450 --> 00:04:00,950 for instance, when writing actual code. 67 00:04:00,950 --> 00:04:01,400 Why? 68 00:04:01,400 --> 00:04:03,200 Because you're going to run up against a wall. 69 00:04:03,200 --> 00:04:04,460 You're not going to see some bug. 70 00:04:04,460 --> 00:04:06,470 Something's not going to jump out at you, and that's fine. 71 00:04:06,470 --> 00:04:09,780 That's when you call it a day, take a break, move onto something else, 72 00:04:09,780 --> 00:04:11,030 and then just come back to it. 73 00:04:11,030 --> 00:04:14,393 And that's what keeps programming fun for me, even all of these years later, 74 00:04:14,393 --> 00:04:16,310 whether it's teaching or actually applying it. 75 00:04:16,310 --> 00:04:19,753 But there's, down the road, a history of an MIT hack, 76 00:04:19,753 --> 00:04:22,170 and it looked a little something like this, in yesteryear. 77 00:04:22,170 --> 00:04:25,280 And there was a little sigh the MIT students, when they made this hack. 78 00:04:25,280 --> 00:04:27,800 On the wall it says, getting an education from MIT 79 00:04:27,800 --> 00:04:30,680 is like drinking from a fire hose, which indeed they 80 00:04:30,680 --> 00:04:33,890 have connected to what should have been otherwise just a water fountain. 81 00:04:33,890 --> 00:04:36,170 And that's going to be what it feels like, sometimes, 82 00:04:36,170 --> 00:04:39,560 not just in computer science per se, but just an unfamiliar field. 83 00:04:39,560 --> 00:04:42,740 If you're not from STEM, if you're not from CS, that's fine. 84 00:04:42,740 --> 00:04:46,370 But so much of it, ultimately, is going to be absorbed by you 85 00:04:46,370 --> 00:04:49,430 and going to be within your grasp by terms end. 86 00:04:49,430 --> 00:04:52,110 So just keep in mind, that's very much the intent, 87 00:04:52,110 --> 00:04:55,580 but you'll be amazed what you're able to create, to accomplish, 88 00:04:55,580 --> 00:04:57,440 just three or so months hence. 89 00:04:57,440 --> 00:05:01,100 Indeed, 2/3 of you, contrary to what you might think are assume, 90 00:05:01,100 --> 00:05:03,140 have never taken a CS class before. 91 00:05:03,140 --> 00:05:06,140 So it's absolutely not the case that the person to the left or the right 92 00:05:06,140 --> 00:05:07,550 surely must know more than you. 93 00:05:07,550 --> 00:05:09,462 Indeed, it's quite the opposite. 94 00:05:09,462 --> 00:05:12,170 And as you'll see in the coming weeks, as you write your own code 95 00:05:12,170 --> 00:05:14,992 and solve your own problems, what ultimately matters in this course 96 00:05:14,992 --> 00:05:17,450 is not so much where you end up relative to your classmates 97 00:05:17,450 --> 00:05:20,783 but where you end up relative to yourself when you began. 98 00:05:20,783 --> 00:05:23,450 And it really is all about that delta, whether you've programmed 99 00:05:23,450 --> 00:05:27,380 or not, just getting something out of a class like this. 100 00:05:27,380 --> 00:05:30,140 And if it does take time, and if you do feel those frustrations, 101 00:05:30,140 --> 00:05:32,973 but you simultaneously eventually feel that sense of accomplishment, 102 00:05:32,973 --> 00:05:34,520 that just means it's all working. 103 00:05:34,520 --> 00:05:38,570 And indeed, hopefully, all the more worthwhile and gratifying, ultimately, 104 00:05:38,570 --> 00:05:39,712 as a result. 105 00:05:39,712 --> 00:05:41,670 So what are we going to do in the coming weeks? 106 00:05:41,670 --> 00:05:43,550 So here we are in week zero. 107 00:05:43,550 --> 00:05:46,520 We'll soon see why computers and computer scientists start counting, 108 00:05:46,520 --> 00:05:47,480 if you will, from 0. 109 00:05:47,480 --> 00:05:51,740 But week 0, is one in which we explore computational thinking, 110 00:05:51,740 --> 00:05:54,860 thinking like a computer, and starting to clean up your thought processes. 111 00:05:54,860 --> 00:05:57,360 Getting you to think, to solve problems more methodically, 112 00:05:57,360 --> 00:05:59,360 and then ultimately, translating that into code. 113 00:05:59,360 --> 00:06:02,390 And some of you might recognize this environment here, a.k.a. 114 00:06:02,390 --> 00:06:04,520 Scratch, coincidentally also from MIT. 115 00:06:04,520 --> 00:06:06,350 You might have used it in grade school. 116 00:06:06,350 --> 00:06:09,860 We'll use it today and a little bit this weekend in the course's first homework 117 00:06:09,860 --> 00:06:11,760 assignment or problem set. 118 00:06:11,760 --> 00:06:14,040 But not so much to play around in a way that you 119 00:06:14,040 --> 00:06:15,960 might have if you did use it in yesteryears, 120 00:06:15,960 --> 00:06:18,990 but to explore ideas of computer science and programming 121 00:06:18,990 --> 00:06:22,650 that we're going to use and reuse every week hereafter as well. 122 00:06:22,650 --> 00:06:24,900 Thereafter, we're going to transition just next week 123 00:06:24,900 --> 00:06:26,800 to week one, so to speak. 124 00:06:26,800 --> 00:06:30,030 Whereby, we'll introduce you to a more traditional language, a lower level 125 00:06:30,030 --> 00:06:32,702 language, an older language called C. And in C, you're 126 00:06:32,702 --> 00:06:35,910 going to use your keyboard, not so much your mouse and pointing and clicking, 127 00:06:35,910 --> 00:06:37,680 but you're going to write code that soon is going 128 00:06:37,680 --> 00:06:39,030 to look a little something like this. 129 00:06:39,030 --> 00:06:41,040 And if you've programmed before, you can probably 130 00:06:41,040 --> 00:06:42,120 glean what this is going to do. 131 00:06:42,120 --> 00:06:45,090 If you've never programmed before, which is the case for most of you, 132 00:06:45,090 --> 00:06:47,560 this too will soon make sense. 133 00:06:47,560 --> 00:06:51,120 But this is the most canonical program that most any programmer ever writes 134 00:06:51,120 --> 00:06:54,060 called Hello, World, and indeed, that and all 135 00:06:54,060 --> 00:06:57,660 of the surrounding syntax above and below just that sentence Hello, World, 136 00:06:57,660 --> 00:06:59,430 will soon make all the more sense. 137 00:06:59,430 --> 00:07:02,250 You'll learn how to use industry-standard tools, so to speak. 138 00:07:02,250 --> 00:07:04,980 Pictured here is something called Visual Studio code, or VS Code. 139 00:07:04,980 --> 00:07:07,262 You'll use a cloud based version of it initially, 140 00:07:07,262 --> 00:07:09,720 so you don't have to suffer with any technical difficulties 141 00:07:09,720 --> 00:07:10,678 or headaches like that. 142 00:07:10,678 --> 00:07:12,900 It'll just work right off the bat, but we'll 143 00:07:12,900 --> 00:07:14,760 use that to [INAUDIBLE] others ultimately 144 00:07:14,760 --> 00:07:18,840 to then explore ideas in computer science, principles that you can apply. 145 00:07:18,840 --> 00:07:20,590 And we'll take a look underneath the hood, 146 00:07:20,590 --> 00:07:24,900 so to speak, of your computer at your memory or RAM, Random Access Memory, 147 00:07:24,900 --> 00:07:27,210 where all of the data is ultimately going to be stored. 148 00:07:27,210 --> 00:07:29,880 We'll also take a look thereafter at bugs. 149 00:07:29,880 --> 00:07:31,470 A bug is a mistake in a program. 150 00:07:31,470 --> 00:07:34,380 Here is an actual bug in an actual computer in yesteryear, 151 00:07:34,380 --> 00:07:38,190 but we'll teach you how to debug programs, find your own mistakes, 152 00:07:38,190 --> 00:07:41,040 find others' mistakes, and improve that code as well. 153 00:07:41,040 --> 00:07:44,520 We'll transition then to algorithms, step-by-step instructions 154 00:07:44,520 --> 00:07:47,340 for solving some problems, which we'll touch on today too. 155 00:07:47,340 --> 00:07:49,590 And if you picture here, this is actually 156 00:07:49,590 --> 00:07:51,120 a pretty representative problem. 157 00:07:51,120 --> 00:07:53,578 Odds are, you haven't had to deal with something like this, 158 00:07:53,578 --> 00:07:55,510 but it's representative sorting, for instance. 159 00:07:55,510 --> 00:07:58,530 If you think of each of these small bars as being a small number, 160 00:07:58,530 --> 00:08:00,810 each of the bigger bars is being a bigger number, 161 00:08:00,810 --> 00:08:05,250 you might wonder, well, how could you as a human sort all of these bars, 162 00:08:05,250 --> 00:08:08,478 like get all the short bars over here, all the big bars over there? 163 00:08:08,478 --> 00:08:11,520 Well, odds are, if you're like me, you would probably kind of eyeball it, 164 00:08:11,520 --> 00:08:13,230 and if you could physically interact, you 165 00:08:13,230 --> 00:08:15,450 might just start grabbing the smallest elements first, 166 00:08:15,450 --> 00:08:16,533 put them over on the left. 167 00:08:16,533 --> 00:08:19,330 Maybe grab the biggest elements, put them over on the right. 168 00:08:19,330 --> 00:08:20,880 But what's your algorithm there? 169 00:08:20,880 --> 00:08:24,388 Like how would you teach someone younger than you, who's never done that before, 170 00:08:24,388 --> 00:08:24,930 how to do it? 171 00:08:24,930 --> 00:08:28,740 How would you compel your Mac or PC or phone to do something like that? 172 00:08:28,740 --> 00:08:31,650 You can't just wave your hand, and say, oh, figure it out. 173 00:08:31,650 --> 00:08:32,572 Move things around. 174 00:08:32,572 --> 00:08:34,530 You have to express yourself more methodically. 175 00:08:34,530 --> 00:08:36,815 So we'll translate even ideas like this into code too. 176 00:08:36,815 --> 00:08:38,940 And that's what the Googles and others of the world 177 00:08:38,940 --> 00:08:42,780 are doing constantly, as they sort and organize the world's information. 178 00:08:42,780 --> 00:08:45,490 We'll use metaphors along the way, if it helps. 179 00:08:45,490 --> 00:08:48,990 We'll talk about your computer's memory as being like a postal address. 180 00:08:48,990 --> 00:08:53,062 Like every mailbox in the world has some form of postal address, street, city, 181 00:08:53,062 --> 00:08:55,020 state, country, and the like, and it turns out, 182 00:08:55,020 --> 00:08:57,560 that's how your Mac, your PC, and your phone also work. 183 00:08:57,560 --> 00:09:00,060 You've got a whole bunch of memory, like the picture before, 184 00:09:00,060 --> 00:09:02,730 but you can think of it really as individual mailboxes. 185 00:09:02,730 --> 00:09:05,100 And you can put anything you want in those mailboxes, 186 00:09:05,100 --> 00:09:08,725 and you can go to a mailbox to grab information that's from it. 187 00:09:08,725 --> 00:09:11,100 So at the end of the day, that's really all your computer 188 00:09:11,100 --> 00:09:12,490 is doing with information. 189 00:09:12,490 --> 00:09:15,480 It's just organizing it, not into mailboxes per se, 190 00:09:15,480 --> 00:09:18,870 but a term you probably know called bytes, for instance, instead. 191 00:09:18,870 --> 00:09:22,560 We'll talk about problems that arise even nowadays. 192 00:09:22,560 --> 00:09:24,960 In fact, most of you are familiar with your Mac, 193 00:09:24,960 --> 00:09:29,070 PC, even phone like spontaneously rebooting sometimes, crashing, 194 00:09:29,070 --> 00:09:32,520 the little annoying spinning beach ball or hourglass icon that happens. 195 00:09:32,520 --> 00:09:33,790 Like what is with that? 196 00:09:33,790 --> 00:09:36,930 Well, those are just bugs in programs that humans at Apple and Google 197 00:09:36,930 --> 00:09:40,110 and Microsoft and others, they screwed up, and they wrote buggy code. 198 00:09:40,110 --> 00:09:42,930 And your computer, when it encounters those mistakes, 199 00:09:42,930 --> 00:09:44,290 doesn't know what to do. 200 00:09:44,290 --> 00:09:47,730 And so 9 times out of 10, so to speak, it just crashes or freezes 201 00:09:47,730 --> 00:09:50,110 or the like, but that kind of stuff will make more sense. 202 00:09:50,110 --> 00:09:52,485 So even the real world will make sense, and pictured here 203 00:09:52,485 --> 00:09:55,350 are some lower level terms we'll eventually get to mid-semester. 204 00:09:55,350 --> 00:09:57,870 But generally speaking, when something is going this way, 205 00:09:57,870 --> 00:10:01,020 as per this arrow, and something is going this way, as per this arrow, 206 00:10:01,020 --> 00:10:02,440 like that does not end well. 207 00:10:02,440 --> 00:10:05,250 And that often is what happens when your computer crashes. 208 00:10:05,250 --> 00:10:08,460 Someone's using memory up here, but someone else is using memory down here, 209 00:10:08,460 --> 00:10:11,470 and then they're not really talking left hand and right hand. 210 00:10:11,470 --> 00:10:14,970 So that is just a high level overview of some of the problems we'll encounter, 211 00:10:14,970 --> 00:10:17,010 but we'll focus to on data, ultimately. 212 00:10:17,010 --> 00:10:20,530 So pictured here is something fairly technical called a hash table. 213 00:10:20,530 --> 00:10:23,735 It's an amalgam of something we're going to soon call an array and also 214 00:10:23,735 --> 00:10:25,110 something we call a link to list. 215 00:10:25,110 --> 00:10:27,330 And these are just fancy terms for describing 216 00:10:27,330 --> 00:10:31,020 how you can organize information even more flexibly 217 00:10:31,020 --> 00:10:34,440 than just putting individual values in mailboxes. 218 00:10:34,440 --> 00:10:37,900 Like how could you build structures, like actual data structures 219 00:10:37,900 --> 00:10:40,510 so to speak, two-dimensional structures at that? 220 00:10:40,510 --> 00:10:43,230 And so what you're seeing here is a glimpse, as some of you 221 00:10:43,230 --> 00:10:45,720 might have recognized, of some Harry Potter universe names, 222 00:10:45,720 --> 00:10:48,040 but they're organized somewhat alphabetically. 223 00:10:48,040 --> 00:10:50,790 And notice, that any time there's multiple people with a name that 224 00:10:50,790 --> 00:10:53,940 starts with H, like Hermione, Harry, and Hagrid, well, they 225 00:10:53,940 --> 00:10:57,270 can't all fit in that mailbox, if each of these squares along the left 226 00:10:57,270 --> 00:10:58,440 is that same mailbox. 227 00:10:58,440 --> 00:11:00,330 So you have to chain them together. 228 00:11:00,330 --> 00:11:02,490 Well, you'll learn how to do that in code. 229 00:11:02,490 --> 00:11:04,773 So that even if you get more data than you expect, 230 00:11:04,773 --> 00:11:07,440 if your business is booming, and you're some web-based business, 231 00:11:07,440 --> 00:11:09,810 how do you keep adding and adding information 232 00:11:09,810 --> 00:11:12,790 to your software to actually keep up with it? 233 00:11:12,790 --> 00:11:16,480 But this, again, is what code's going to soon look like, as soon as next week, 234 00:11:16,480 --> 00:11:20,500 in week one, this here being C, but we'll transition in a few weeks 235 00:11:20,500 --> 00:11:25,190 to a more modern, higher level language, so to speak, called Python. 236 00:11:25,190 --> 00:11:27,940 Indeed, the course very deliberately, back in my day and now this, 237 00:11:27,940 --> 00:11:31,540 introduces you first to C, which funny enough, many people don't 238 00:11:31,540 --> 00:11:33,520 tend to program in certainly every day. 239 00:11:33,520 --> 00:11:36,980 I use C, generally, September, October, November, 240 00:11:36,980 --> 00:11:38,590 December, when teaching CS50 itself. 241 00:11:38,590 --> 00:11:40,540 But it's everywhere, nonetheless. 242 00:11:40,540 --> 00:11:43,870 In fact, even today's other languages, with which you might be familiar, 243 00:11:43,870 --> 00:11:48,190 like Python and Java and yet others still, you 244 00:11:48,190 --> 00:11:50,800 see this same primitive language underneath the hood, 245 00:11:50,800 --> 00:11:52,360 because it's so darn fast. 246 00:11:52,360 --> 00:11:54,110 And as you'll learn over the coming weeks, 247 00:11:54,110 --> 00:11:57,310 it really gives you access to and an understanding of what's 248 00:11:57,310 --> 00:11:59,180 going on conceptually down here. 249 00:11:59,180 --> 00:12:01,900 So that thereafter, after CS50, when you're writing code, 250 00:12:01,900 --> 00:12:05,180 you can think at a very high level what's actually going on. 251 00:12:05,180 --> 00:12:08,710 So in fact, in just a few weeks, what looks like this in C 252 00:12:08,710 --> 00:12:11,170 is going to look instead like this in Python. 253 00:12:11,170 --> 00:12:13,930 And you'll better understand what's going on underneath the hood, 254 00:12:13,930 --> 00:12:16,540 and odds are, after this class, you'll reach for a language, 255 00:12:16,540 --> 00:12:19,540 like Python more frequently than C, but you're 256 00:12:19,540 --> 00:12:22,750 going to benefit from that bottom-up understanding thereof. 257 00:12:22,750 --> 00:12:26,680 Thereafter and towards term's end, we'll introduce you to a few other ideas, 258 00:12:26,680 --> 00:12:28,630 like where do you put large amounts of data? 259 00:12:28,630 --> 00:12:31,660 In things called databases, not things like spreadsheets, like here, 260 00:12:31,660 --> 00:12:32,690 but actual databases. 261 00:12:32,690 --> 00:12:34,690 We're using those same kinds of data structures, 262 00:12:34,690 --> 00:12:37,300 you lay things out in an interesting way in memory. 263 00:12:37,300 --> 00:12:40,000 Thereafter, we'll transition to a very familiar environment 264 00:12:40,000 --> 00:12:42,010 that you and I use every day, the web. 265 00:12:42,010 --> 00:12:45,010 Like the web has become rather the User Interface, or UI, 266 00:12:45,010 --> 00:12:48,970 that we use everywhere, on the laptops, desktops, and even mobile devices, 267 00:12:48,970 --> 00:12:49,690 nowadays. 268 00:12:49,690 --> 00:12:52,360 Well, pictured here is a language called HTML. 269 00:12:52,360 --> 00:12:53,693 It's not a programming language. 270 00:12:53,693 --> 00:12:56,443 It's a markup language, and some of you might have made home pages 271 00:12:56,443 --> 00:12:57,550 or portfolios in the past. 272 00:12:57,550 --> 00:13:01,270 But you'll understand what's going on here, but more powerfully, 273 00:13:01,270 --> 00:13:04,510 you'll understand how the computer sees that same kind of code, 274 00:13:04,510 --> 00:13:08,930 builds up a hierarchical family tree-type structure in memory. 275 00:13:08,930 --> 00:13:11,530 And then you can manipulate that tree with code 276 00:13:11,530 --> 00:13:14,800 to actually add more and more information, chat messages, anything 277 00:13:14,800 --> 00:13:16,150 on the screen that you like. 278 00:13:16,150 --> 00:13:19,000 And finally, we'll tie all of this together 279 00:13:19,000 --> 00:13:22,360 by introducing what are called frameworks and libraries, 280 00:13:22,360 --> 00:13:26,410 third-party code that makes it a lot easier to solve problems of interest 281 00:13:26,410 --> 00:13:27,140 to you. 282 00:13:27,140 --> 00:13:30,250 And so in particular, here, this is the very first web app 283 00:13:30,250 --> 00:13:33,820 that I myself made back in like 1997. 284 00:13:33,820 --> 00:13:36,910 I was part of the first-year intramural sports program, 285 00:13:36,910 --> 00:13:39,850 not as an athlete but as the programmer, and I was teaching myself 286 00:13:39,850 --> 00:13:41,380 how to build web applications. 287 00:13:41,380 --> 00:13:44,410 I only knew C and maybe a little bit of something else at the time. 288 00:13:44,410 --> 00:13:47,320 But this became, for Harvard at least, the very first website 289 00:13:47,320 --> 00:13:50,020 for the first-year intramural sports program, 290 00:13:50,020 --> 00:13:53,290 and it wasn't just a static website with links and images and the like. 291 00:13:53,290 --> 00:13:54,190 It was interactive. 292 00:13:54,190 --> 00:13:55,570 You could register for sports. 293 00:13:55,570 --> 00:13:58,750 We could input exactly who was in a tournament bracket or the like, 294 00:13:58,750 --> 00:14:01,340 and it could actually automatically keep track of this data. 295 00:14:01,340 --> 00:14:04,420 So there too, after just three months of a class like this, 296 00:14:04,420 --> 00:14:06,490 you'll go from writing quite simply this week 297 00:14:06,490 --> 00:14:08,950 and next Hello, World to building things like 298 00:14:08,950 --> 00:14:12,430 this for whether it's web, mobile, or other platforms 299 00:14:12,430 --> 00:14:13,822 as well, if you so choose. 300 00:14:13,822 --> 00:14:17,030 But we'll get you off of the course's infrastructure, by the end of the term. 301 00:14:17,030 --> 00:14:19,570 You won't be using any toy environments along the way. 302 00:14:19,570 --> 00:14:23,350 We'll empower you, ultimately, to write code after CS50, especially if this 303 00:14:23,350 --> 00:14:27,272 is the only CS class you ever take, on your own Mac or PC, 304 00:14:27,272 --> 00:14:29,980 using the same software, but not the cloud-based version thereof. 305 00:14:29,980 --> 00:14:34,060 But all of this software is itself free and can be used by you 306 00:14:34,060 --> 00:14:37,010 powerfully after the course's own end. 307 00:14:37,010 --> 00:14:40,760 But along the way, as you may know, there 308 00:14:40,760 --> 00:14:43,660 is this tradition within the class, particularly in healthy times, 309 00:14:43,660 --> 00:14:46,210 of a number of events that really brings people get together, 310 00:14:46,210 --> 00:14:48,040 not just collaboratively and academically, 311 00:14:48,040 --> 00:14:52,120 but to just solve problems and generally engage with each other as well. 312 00:14:52,120 --> 00:14:55,660 Coming up first, CS50 Puzzle Day, which is meant to be not jigsaw 313 00:14:55,660 --> 00:14:58,900 puzzles but logic puzzles that require no prior experience 314 00:14:58,900 --> 00:15:00,460 with computer science or programming. 315 00:15:00,460 --> 00:15:04,300 But it's just an opportunity to quietly work on a packet of puzzles 316 00:15:04,300 --> 00:15:07,270 with some number of friends for prizes and more. 317 00:15:07,270 --> 00:15:10,510 Later in the semester, once you tackle your final projects, 318 00:15:10,510 --> 00:15:13,810 the capstone of the course, where we don't give you a homework to write, 319 00:15:13,810 --> 00:15:15,910 you yourself come up with something to build. 320 00:15:15,910 --> 00:15:20,320 We'll get together generally around 7:00 PM in the evening, 321 00:15:20,320 --> 00:15:23,260 wrap up around 7:00 AM, if you so choose. 322 00:15:23,260 --> 00:15:26,080 And it's an evening, a 12-hour opportunity to collaborate with 323 00:15:26,080 --> 00:15:30,250 classmates on your very own final project, in a large space on campus, 324 00:15:30,250 --> 00:15:31,090 that ends-- 325 00:15:31,090 --> 00:15:33,340 if you're awake with us-- at 5:00 AM. 326 00:15:33,340 --> 00:15:37,330 We can hop on some CS50 shuttles and go down the road for some pancakes at IHOP 327 00:15:37,330 --> 00:15:38,710 around 6:00. 328 00:15:38,710 --> 00:15:43,090 Of course-- of course, this is 6:00, 7:00 AM at that point, 329 00:15:43,090 --> 00:15:45,640 but it's an opportunity finally to lead into what's 330 00:15:45,640 --> 00:15:49,800 called the CS50 fair, which is an end of semester celebration, an exhibition, 331 00:15:49,800 --> 00:15:52,300 of everything that you'll accomplish over the coming months. 332 00:15:52,300 --> 00:15:56,200 And in fact, pictured here are some of your predecessors in healthy times. 333 00:15:56,200 --> 00:15:59,200 The CS50 fair allows you to come with your laptop or phone 334 00:15:59,200 --> 00:16:02,320 and exhibits of students, faculty, and staff across campus 335 00:16:02,320 --> 00:16:04,420 put together something in person and on video 336 00:16:04,420 --> 00:16:07,733 that people can delight in seeing, as you exhibit what it is you created 337 00:16:07,733 --> 00:16:10,150 and what you learned over the course of the several weeks. 338 00:16:10,150 --> 00:16:14,880 And ultimately, a chance to just share and inspire others as well. 339 00:16:14,880 --> 00:16:17,600 And you'll all walk home, ultimately, with your own I took 340 00:16:17,600 --> 00:16:20,820 CS50 T-shirts saying as much as well. 341 00:16:20,820 --> 00:16:23,820 So with that high level overview of the course, 342 00:16:23,820 --> 00:16:27,890 I propose that we begin to take a look at what computer science itself is 343 00:16:27,890 --> 00:16:31,010 and what it is we're going to be doing over the next several weeks 344 00:16:31,010 --> 00:16:32,780 at this lower level [INAUDIBLE] too. 345 00:16:32,780 --> 00:16:34,130 So what is computer science? 346 00:16:34,130 --> 00:16:34,630 Right? 347 00:16:34,630 --> 00:16:38,240 If you're maybe like me or new people like my friends in high school, 348 00:16:38,240 --> 00:16:40,310 you probably assume that it means programming. 349 00:16:40,310 --> 00:16:44,040 And that's absolutely a big part of it for a lot of people, because with code, 350 00:16:44,040 --> 00:16:46,770 you can write, you can express ideas, and solve actual problems, 351 00:16:46,770 --> 00:16:48,110 especially involving data. 352 00:16:48,110 --> 00:16:52,100 But computer science itself is really the study of information, if you will. 353 00:16:52,100 --> 00:16:55,170 How do you represent it, and how do you actually process it? 354 00:16:55,170 --> 00:16:57,290 And in that sense, computational thinking 355 00:16:57,290 --> 00:17:02,090 is just the application of ideas from computer science, a course like this, 356 00:17:02,090 --> 00:17:05,880 to problems of interest to you, again, in the arts, humanities, sciences, 357 00:17:05,880 --> 00:17:09,089 social sciences, whatever the domain of interest is to you. 358 00:17:09,089 --> 00:17:13,040 So with that, if computer science is all about information and with it 359 00:17:13,040 --> 00:17:16,770 the solving of problems, well, what does it actually mean to solve a problem? 360 00:17:16,770 --> 00:17:20,992 Let's see if we can't propose a model into which all of the lessons learned 361 00:17:20,992 --> 00:17:21,950 will ultimately follow. 362 00:17:21,950 --> 00:17:25,188 And I'd propose that this is problem solving. 363 00:17:25,188 --> 00:17:27,980 You've got some input, which is like the problem you want to solve. 364 00:17:27,980 --> 00:17:29,070 The goal is to solve it. 365 00:17:29,070 --> 00:17:31,400 So that's the so-called output, and then somewhere 366 00:17:31,400 --> 00:17:34,970 in here, the proverbial black box, is some kind of secret sauce 367 00:17:34,970 --> 00:17:36,233 that gets the work done. 368 00:17:36,233 --> 00:17:38,900 And in the coming months, we'll have to decide, well, how are we 369 00:17:38,900 --> 00:17:42,440 going to represent these inputs and outputs, and really, how do we code up? 370 00:17:42,440 --> 00:17:46,490 How do we write solutions for what it is that's solving the problem of interest 371 00:17:46,490 --> 00:17:47,310 to us? 372 00:17:47,310 --> 00:17:50,900 So when it comes to representation of information, like there's a lot of ways 373 00:17:50,900 --> 00:17:51,560 we can do this. 374 00:17:51,560 --> 00:17:53,477 And for instance, if the problem at hand quite 375 00:17:53,477 --> 00:17:56,180 simply is to take attendance at the beginning of class, 376 00:17:56,180 --> 00:17:59,340 on the first day of school, well, how could we go about doing this? 377 00:17:59,340 --> 00:18:02,480 Well, we could actually use a system called unary. 378 00:18:02,480 --> 00:18:03,420 Well, what is that? 379 00:18:03,420 --> 00:18:08,300 Well, that's a fancy way of saying 1, 2, 3, 4, 5, maybe 6, 7, 8, 9, 10. 380 00:18:08,300 --> 00:18:10,130 And I can use my digits-- 381 00:18:10,130 --> 00:18:13,298 pun intended-- on my fingers to actually count everyone up. 382 00:18:13,298 --> 00:18:16,340 And eventually, you need toes and whatnots, if you have to count so high. 383 00:18:16,340 --> 00:18:19,310 But unary is a very simple system of using 384 00:18:19,310 --> 00:18:22,872 a single symbol, a human finger in this case, to just solve some problem, 385 00:18:22,872 --> 00:18:24,830 like counting the number of people in the room. 386 00:18:24,830 --> 00:18:27,950 Let's make this slightly more technical for a moment, a little more mathy. 387 00:18:27,950 --> 00:18:31,280 That's just called base-1, where the base under which you're operating 388 00:18:31,280 --> 00:18:34,700 has one digit in it, like literally a human finger, and maybe 389 00:18:34,700 --> 00:18:36,920 multiple such fingers, if you need to count higher. 390 00:18:36,920 --> 00:18:39,890 But of course, most of you, if not all of you, 391 00:18:39,890 --> 00:18:44,680 generally, vaguely know that computers use something other than unary-- 392 00:18:44,680 --> 00:18:47,180 and even you and I probably don't use this that often-- they 393 00:18:47,180 --> 00:18:50,430 use what language or alphabet instead. 394 00:18:50,430 --> 00:18:50,930 Yeah. 395 00:18:50,930 --> 00:18:55,980 So binary, so binary is indeed the system that computers somehow use. 396 00:18:55,980 --> 00:19:00,410 So in this case, bi implying two, and so computers have two digits, 397 00:19:00,410 --> 00:19:01,760 it turns out, at their disposal. 398 00:19:01,760 --> 00:19:04,680 And in fact, if you've ever heard the technical term bit, 399 00:19:04,680 --> 00:19:07,490 which is like a smaller version of a byte-- more on that soon. 400 00:19:07,490 --> 00:19:10,882 Well, a binary digit is the origin of that term "Bit," 401 00:19:10,882 --> 00:19:14,090 because if you get rid of some of the letters, and are left from binary digit 402 00:19:14,090 --> 00:19:15,965 with just B-I-T, thus is a bit. 403 00:19:15,965 --> 00:19:17,990 A bit is just a 0 and 1. 404 00:19:17,990 --> 00:19:20,750 It's two more digits than you might have on your own finger, 405 00:19:20,750 --> 00:19:23,030 and of course, it's fewer though than you and I have. 406 00:19:23,030 --> 00:19:25,820 You and I typically use, as humans, the decimal system. 407 00:19:25,820 --> 00:19:29,390 Dec meaning 10, because you and I generally use 0 through 9. 408 00:19:29,390 --> 00:19:30,800 So on the one hand-- 409 00:19:30,800 --> 00:19:32,930 another pun intended-- you've got unary. 410 00:19:32,930 --> 00:19:34,640 Computers use binary. 411 00:19:34,640 --> 00:19:37,760 We humans generally think and talk in terms of decimal. 412 00:19:37,760 --> 00:19:40,370 But at the end of the day, these are fundamentally 413 00:19:40,370 --> 00:19:42,320 going to be the same thing, which is to say 414 00:19:42,320 --> 00:19:44,090 that it's all pretty accessible to us. 415 00:19:44,090 --> 00:19:47,610 Even if you're not a computer person, I daresay you're about to be. 416 00:19:47,610 --> 00:19:48,620 So what is a bit? 417 00:19:48,620 --> 00:19:51,590 Well, a bit then is a 0 or a 1. 418 00:19:51,590 --> 00:19:53,570 That is a so-called binary digit. 419 00:19:53,570 --> 00:19:56,090 But how do computers only speak in binary? 420 00:19:56,090 --> 00:19:59,360 How do they solve problems, represent information, using only binary? 421 00:19:59,360 --> 00:20:02,750 Well, at the end of the day, if they want to represent 0 and 1, 422 00:20:02,750 --> 00:20:05,300 we need to do so physically somehow. 423 00:20:05,300 --> 00:20:10,190 And I daresay that maybe the simplest way to think about a bit, a 0 or a 1, 424 00:20:10,190 --> 00:20:11,310 is like a light bulb. 425 00:20:11,310 --> 00:20:15,020 And so by human convention, let's just assume that if you were a computer, 426 00:20:15,020 --> 00:20:17,060 be it a laptop, desktop, phone, or the like, 427 00:20:17,060 --> 00:20:20,030 and you want to represent the number 0, you 428 00:20:20,030 --> 00:20:22,770 know what, you just keep the light switch off. 429 00:20:22,770 --> 00:20:24,290 You keep a light bulb off. 430 00:20:24,290 --> 00:20:26,210 If by contrast, you're that same computer, 431 00:20:26,210 --> 00:20:28,160 and you want to represent the number 1, you 432 00:20:28,160 --> 00:20:30,990 take that same switch, that same light bulb, and just turn it on. 433 00:20:30,990 --> 00:20:34,400 So a light bulb that's on represents a 1, and a light bulb that's off 434 00:20:34,400 --> 00:20:35,840 represents a 0. 435 00:20:35,840 --> 00:20:37,928 So why is this relevant to computers? 436 00:20:37,928 --> 00:20:40,970 Well, at the end of the day, you and I are charging our laptops or phones 437 00:20:40,970 --> 00:20:41,340 at night. 438 00:20:41,340 --> 00:20:44,390 So there's some physical resource being replenished there, whether you're 439 00:20:44,390 --> 00:20:46,020 on battery or some power cord. 440 00:20:46,020 --> 00:20:48,990 And so inside of a computer are just thousands, 441 00:20:48,990 --> 00:20:51,433 millions of tiny little switches, nowadays. 442 00:20:51,433 --> 00:20:53,600 You can think of them metaphorically as light bulbs, 443 00:20:53,600 --> 00:20:55,430 but they don't actually shine light. 444 00:20:55,430 --> 00:20:57,740 But there are tiny, tiny little switches, 445 00:20:57,740 --> 00:21:01,430 and those switches, if you've ever heard the term, are just called transistors. 446 00:21:01,430 --> 00:21:04,520 So like computers have millions of transistors that can either be flipped 447 00:21:04,520 --> 00:21:08,390 on to represent 1's or flipped off to represent 0's. 448 00:21:08,390 --> 00:21:12,440 And from that very simple mechanism, electricity is there, 449 00:21:12,440 --> 00:21:15,110 or it's not, a 1 or a 0. 450 00:21:15,110 --> 00:21:19,070 Computers can actually count, obviously, from 0 to 1, 451 00:21:19,070 --> 00:21:23,160 but it turns out, even higher, if they use a little more electricity as well. 452 00:21:23,160 --> 00:21:24,420 So how might I do this? 453 00:21:24,420 --> 00:21:27,740 Well, let me go ahead and propose that I just grab one of our own light bulbs 454 00:21:27,740 --> 00:21:28,500 here on stage. 455 00:21:28,500 --> 00:21:29,210 This one is off. 456 00:21:29,210 --> 00:21:32,060 So for instance, if this were miniaturized inside of your Mac, PC, 457 00:21:32,060 --> 00:21:34,517 or phone, this would be a transistor, and indeed, here's 458 00:21:34,517 --> 00:21:35,850 the little switch on the bottom. 459 00:21:35,850 --> 00:21:39,320 And if your computer wants to represent a 0, it just leaves the switch off, 460 00:21:39,320 --> 00:21:40,910 and the light is not shining. 461 00:21:40,910 --> 00:21:43,670 If you want to represent a 1, well now, I've counted as high 462 00:21:43,670 --> 00:21:45,193 as 1, because the switch is now on. 463 00:21:45,193 --> 00:21:46,610 I've grabbed a little electricity. 464 00:21:46,610 --> 00:21:48,540 I'm holding on to it inside of the computer, 465 00:21:48,540 --> 00:21:50,598 and so now I see that this is a 1. 466 00:21:50,598 --> 00:21:53,390 All right, but unfortunately, with just one switch, one light bulb, 467 00:21:53,390 --> 00:21:56,630 I can only count from 0 to 1. 468 00:21:56,630 --> 00:21:59,475 How do I count out higher, might you think, intuitively? 469 00:21:59,475 --> 00:22:00,350 AUDIENCE: [INAUDIBLE] 470 00:22:00,350 --> 00:22:01,070 DAVID J. MALAN: Say it again. 471 00:22:01,070 --> 00:22:01,430 AUDIENCE: More lightbulbs. 472 00:22:01,430 --> 00:22:02,900 DAVID J. MALAN: Yeah, so more light bulbs. 473 00:22:02,900 --> 00:22:03,650 So let me do this. 474 00:22:03,650 --> 00:22:07,760 Let me just grab something to put these on, so I can use a few of them 475 00:22:07,760 --> 00:22:08,270 at a time. 476 00:22:08,270 --> 00:22:11,720 And let me propose that here, instead of having just one light bulb, 477 00:22:11,720 --> 00:22:14,150 let me give myself maybe three in total. 478 00:22:14,150 --> 00:22:17,748 So all of them are initially off, and if you think of this in miniature form, 479 00:22:17,748 --> 00:22:20,540 in your mind's eye, this is like a computer with three transistors. 480 00:22:20,540 --> 00:22:24,860 Three switches representing now the number you and I know as 0. 481 00:22:24,860 --> 00:22:25,490 Why? 482 00:22:25,490 --> 00:22:27,150 They're just all off. 483 00:22:27,150 --> 00:22:30,450 So how does a computer go about representing the number 1? 484 00:22:30,450 --> 00:22:33,230 Well, it turns on one of these light bulbs. 485 00:22:33,230 --> 00:22:35,600 And how does the computer represent the number 2? 486 00:22:35,600 --> 00:22:39,900 Well, you might think, if I may, you just turn on a second light bulb. 487 00:22:39,900 --> 00:22:42,290 And if you might think, how does a computer represent 3? 488 00:22:42,290 --> 00:22:44,250 You just turn on the third light bulb. 489 00:22:44,250 --> 00:22:47,150 And so as such, with three bits, a computer 490 00:22:47,150 --> 00:22:51,020 would seem to be able to count from 0 on up to 1, 2, 3. 491 00:22:51,020 --> 00:22:53,480 But it turns out, if I'm a little smarter here, 492 00:22:53,480 --> 00:22:55,760 I can actually count higher than that. 493 00:22:55,760 --> 00:22:56,310 Why? 494 00:22:56,310 --> 00:22:59,060 Well, I'm just considering the combination of bulbs being on here. 495 00:22:59,060 --> 00:23:00,435 What if I do something like this? 496 00:23:00,435 --> 00:23:04,160 This is still 0, I will claim, but what if I propose now that this 497 00:23:04,160 --> 00:23:06,800 will be how a computer represents 1-- 498 00:23:06,800 --> 00:23:08,840 on, off, off. 499 00:23:08,840 --> 00:23:12,680 This, though, will be how the computer represents 2. 500 00:23:12,680 --> 00:23:14,360 Notice, I didn't turn on the same two. 501 00:23:14,360 --> 00:23:16,430 I'm just turning on the one in the middle. 502 00:23:16,430 --> 00:23:19,820 This I now claim will be how a computer represents 3. 503 00:23:19,820 --> 00:23:22,190 This is going to be-- in just a second-- 504 00:23:22,190 --> 00:23:26,450 how a computer represents the number we know as 4, 505 00:23:26,450 --> 00:23:28,550 and yet, I'm still only using three bulbs. 506 00:23:28,550 --> 00:23:32,600 This is going to be the number the computer represents as 5. 507 00:23:32,600 --> 00:23:36,530 This is going to be how the computer represents the number 6, 508 00:23:36,530 --> 00:23:39,030 and then lastly, it turns out, with three light bulbs, 509 00:23:39,030 --> 00:23:42,380 if you're smart about it, you can count it seems as high as 7. 510 00:23:42,380 --> 00:23:46,220 Now, even if you lost track of what I was turning on and why, 511 00:23:46,220 --> 00:23:49,070 I claim there were eight different patterns, from all of them 512 00:23:49,070 --> 00:23:50,470 off to all of them on. 513 00:23:50,470 --> 00:23:52,220 But notice that I started to permute them. 514 00:23:52,220 --> 00:23:55,220 I took into account which ones were on and which ones were off. 515 00:23:55,220 --> 00:23:59,600 Why, though, do these represent the numbers we know as 0 through 7? 516 00:23:59,600 --> 00:24:02,503 Well, let me go ahead, and maybe let's do this. 517 00:24:02,503 --> 00:24:04,670 Instead of just considering there to be light bulbs, 518 00:24:04,670 --> 00:24:09,650 let's assign some special significance to each of them, based on where it is. 519 00:24:09,650 --> 00:24:15,350 And maybe for this, could we get maybe three volunteers, three volunteer? 520 00:24:15,350 --> 00:24:16,438 OK. 521 00:24:16,438 --> 00:24:17,480 You're being volunteered. 522 00:24:17,480 --> 00:24:17,690 OK. 523 00:24:17,690 --> 00:24:18,210 Come on up. 524 00:24:18,210 --> 00:24:19,610 If you want to go over to the stage there. 525 00:24:19,610 --> 00:24:19,760 Yeah. 526 00:24:19,760 --> 00:24:22,350 You want to come on up as well, and over here as well. 527 00:24:22,350 --> 00:24:24,530 So there are some stairs on either end. 528 00:24:24,530 --> 00:24:27,440 Maybe a round of applause for our first volunteers of term. 529 00:24:27,440 --> 00:24:30,842 [APPLAUSE] 530 00:24:30,842 --> 00:24:34,050 531 00:24:34,050 --> 00:24:34,550 All right. 532 00:24:34,550 --> 00:24:37,670 So you want to be our number 1, and if you want to go ahead and stand 533 00:24:37,670 --> 00:24:38,633 roughly right here. 534 00:24:38,633 --> 00:24:40,175 How about do you want to be number 2? 535 00:24:40,175 --> 00:24:41,330 AUDIENCE: Yeah. 536 00:24:41,330 --> 00:24:43,970 DAVID J. MALAN: Come on over right to the right of here, 537 00:24:43,970 --> 00:24:46,090 and you'll be number 4, it turns out. 538 00:24:46,090 --> 00:24:48,320 If you want to come over here, on this end, 539 00:24:48,320 --> 00:24:52,460 let's give you all a moment to introduce yourselves briefly to your classmates, 540 00:24:52,460 --> 00:24:53,120 if you'd like. 541 00:24:53,120 --> 00:24:53,662 AUDIENCE: Hi. 542 00:24:53,662 --> 00:24:54,350 I'm Ellie. 543 00:24:54,350 --> 00:24:56,120 I'm a senior. 544 00:24:56,120 --> 00:24:57,440 DAVID J. MALAN: Nice to meet. 545 00:24:57,440 --> 00:24:59,840 AUDIENCE: I'm [? Rayhanna, ?] and I'm a first year. 546 00:24:59,840 --> 00:25:00,978 DAVID J. MALAN: Welcome. 547 00:25:00,978 --> 00:25:01,520 AUDIENCE: Hi. 548 00:25:01,520 --> 00:25:03,850 I'm Joseph, and I am a first year. 549 00:25:03,850 --> 00:25:04,850 DAVID J. MALAN: Welcome. 550 00:25:04,850 --> 00:25:05,350 All right. 551 00:25:05,350 --> 00:25:07,250 So so glad to have all three of you up here. 552 00:25:07,250 --> 00:25:07,940 Thank you. 553 00:25:07,940 --> 00:25:10,940 [APPLAUSE] 554 00:25:10,940 --> 00:25:14,470 Let me propose now that we'd like you three 555 00:25:14,470 --> 00:25:16,480 to represent how about the number 0. 556 00:25:16,480 --> 00:25:19,930 And I claim now that if each of you now represents a switch, 557 00:25:19,930 --> 00:25:21,790 you have fancier light bulbs now. 558 00:25:21,790 --> 00:25:22,400 One is a 1. 559 00:25:22,400 --> 00:25:22,900 One is a 2. 560 00:25:22,900 --> 00:25:25,150 One is a 4, but each of you is still just has a switch 561 00:25:25,150 --> 00:25:27,340 on the bottom, in fact, of your plastic devices. 562 00:25:27,340 --> 00:25:30,520 I claim these three volunteers are representing the number 0. 563 00:25:30,520 --> 00:25:34,240 Let me ask you all now, how might you represent the number 1? 564 00:25:34,240 --> 00:25:36,240 How should you cooperate here? 565 00:25:36,240 --> 00:25:36,740 OK. 566 00:25:36,740 --> 00:25:39,337 So we would have on, off, off, which I think 567 00:25:39,337 --> 00:25:41,170 matches what I did with my three light bulbs 568 00:25:41,170 --> 00:25:43,087 as well, if you want to go and turn yours off. 569 00:25:43,087 --> 00:25:46,910 How might you three represent the number 2? 570 00:25:46,910 --> 00:25:50,420 OK, so off, on, off now, from right to left. 571 00:25:50,420 --> 00:25:54,020 How would you three represent the number 3? 572 00:25:54,020 --> 00:25:57,043 Ah, so that's why my two light bulbs went on at the end. 573 00:25:57,043 --> 00:25:58,835 How would you three represent the number 4? 574 00:25:58,835 --> 00:26:02,620 575 00:26:02,620 --> 00:26:03,120 Perfect. 576 00:26:03,120 --> 00:26:10,357 Number 5, number 6, and number 7? 577 00:26:10,357 --> 00:26:11,690 All right, and give us one more. 578 00:26:11,690 --> 00:26:14,184 How would you represent 8? 579 00:26:14,184 --> 00:26:15,000 AUDIENCE: We can't. 580 00:26:15,000 --> 00:26:15,320 DAVID J. MALAN: OK. 581 00:26:15,320 --> 00:26:16,190 You can't. 582 00:26:16,190 --> 00:26:20,250 How about then one more volunteer, one more volunteer? 583 00:26:20,250 --> 00:26:20,750 OK. 584 00:26:20,750 --> 00:26:21,470 Come on up. 585 00:26:21,470 --> 00:26:25,350 586 00:26:25,350 --> 00:26:25,850 All right. 587 00:26:25,850 --> 00:26:26,617 What's your name? 588 00:26:26,617 --> 00:26:27,950 AUDIENCE: My name is [? Moin. ?] 589 00:26:27,950 --> 00:26:28,610 DAVID J. MALAN: If you want to say it into there. 590 00:26:28,610 --> 00:26:29,390 AUDIENCE: My name is [? Moin. ?] 591 00:26:29,390 --> 00:26:30,260 DAVID J. MALAN: All right, [? and Moin, ?] you're 592 00:26:30,260 --> 00:26:33,590 going to be number 8, and if now you all-- actually, let's make this 593 00:26:33,590 --> 00:26:37,430 how would you represent number 8, all collectively, as 4 bits 594 00:26:37,430 --> 00:26:40,150 or for switches? 595 00:26:40,150 --> 00:26:42,340 OK, 8, and now lastly, give me 15. 596 00:26:42,340 --> 00:26:46,380 597 00:26:46,380 --> 00:26:49,835 Everyone's awkwardly doing arithmetic in their head, oh, using unary. 598 00:26:49,835 --> 00:26:52,940 599 00:26:52,940 --> 00:26:53,440 Yeah. 600 00:26:53,440 --> 00:26:55,150 Is that everyone-- 601 00:26:55,150 --> 00:26:55,720 Yes. 602 00:26:55,720 --> 00:26:56,290 OK. 603 00:26:56,290 --> 00:26:57,670 Round of applause. 604 00:26:57,670 --> 00:26:58,180 OK. 605 00:26:58,180 --> 00:27:00,610 Thank you all. 606 00:27:00,610 --> 00:27:03,730 If you want to leave your numbers over here, 607 00:27:03,730 --> 00:27:07,107 we have a CS50 stress ball for you, but thank you for volunteering. 608 00:27:07,107 --> 00:27:09,440 You can turn those numbers off and leave them over here. 609 00:27:09,440 --> 00:27:11,500 So thank you. 610 00:27:11,500 --> 00:27:19,160 So how do we go about-- how do we go from there to creating these patterns? 611 00:27:19,160 --> 00:27:24,340 Well, even though we still had three bits, initially, and three switches, 612 00:27:24,340 --> 00:27:28,720 later four bits and four switches, ultimately, we still 613 00:27:28,720 --> 00:27:32,860 used the same approach fundamentally to actually representing information. 614 00:27:32,860 --> 00:27:35,020 And now why were they those patterns, and why 615 00:27:35,020 --> 00:27:38,150 did I very deliberately have our volunteers line up in that way? 616 00:27:38,150 --> 00:27:40,960 Well, I wanted them using base-2, a.k.a. 617 00:27:40,960 --> 00:27:44,140 binary, but with binary there comes certain rules. 618 00:27:44,140 --> 00:27:46,420 And even if you're not familiar with binary 619 00:27:46,420 --> 00:27:49,510 beyond that it exists and relates somehow to computers, 620 00:27:49,510 --> 00:27:52,330 it's actually pretty much identical to the system you and I use 621 00:27:52,330 --> 00:27:54,790 every day, known as base 10, a.k.a. 622 00:27:54,790 --> 00:27:55,520 decimal. 623 00:27:55,520 --> 00:27:58,900 So let's consider, if you will, by rewinding to primary school for just 624 00:27:58,900 --> 00:28:00,370 a moment, like how decimal works. 625 00:28:00,370 --> 00:28:03,820 And you'll see that even if you're not a computer person, you actually are. 626 00:28:03,820 --> 00:28:06,410 You just have to tweak your mental model ever so slightly. 627 00:28:06,410 --> 00:28:10,330 So here is the number that you're probably viewing as 123, 628 00:28:10,330 --> 00:28:11,510 but why is that? 629 00:28:11,510 --> 00:28:13,240 Well, it's not really 123. 630 00:28:13,240 --> 00:28:19,990 This is just a pattern of three symbols on the screen, 1, 2, 3, and your mind 631 00:28:19,990 --> 00:28:23,967 is rapidly assigning mathematical meaning to them, 123, but why is that? 632 00:28:23,967 --> 00:28:26,550 Well, if you're like me, you probably learned back in the day, 633 00:28:26,550 --> 00:28:29,800 when you have a three-digit number like, this the rightmost number 634 00:28:29,800 --> 00:28:32,800 is in the 1's place, the middle digit is the 10's place, 635 00:28:32,800 --> 00:28:35,870 the leftmost digit is in the 100's place, and why is that relevant? 636 00:28:35,870 --> 00:28:39,580 Well, if you then quickly do some mental math, as you and I just do instantly 637 00:28:39,580 --> 00:28:44,170 nowadays, that just means 100 times 1 plus 10 times 2 plus 1 times 638 00:28:44,170 --> 00:28:50,500 3, of course, 100 plus 20 plus 3 gives us the number you and I know as 123. 639 00:28:50,500 --> 00:28:55,630 But beyond that, how do we get to just two digits instead of as many as 9 640 00:28:55,630 --> 00:28:56,900 in the decimal system? 641 00:28:56,900 --> 00:28:58,150 Well, let's generalize this. 642 00:28:58,150 --> 00:29:00,610 In the decimal system, you and I know, if we've 643 00:29:00,610 --> 00:29:03,220 got three digits represented by these hashes here, 644 00:29:03,220 --> 00:29:05,920 yes, it's the 1's place, 10's place, 100's place, 645 00:29:05,920 --> 00:29:09,860 and if we keep going 1,000's, 10,000's, and so forth, but why is that? 646 00:29:09,860 --> 00:29:12,580 Well, base terminology is now a little more germane. 647 00:29:12,580 --> 00:29:17,420 That's technically the 10 to the 0th column, the 10 to the 1, 10 to the 2. 648 00:29:17,420 --> 00:29:20,650 So these are powers of 10, where 10 is your base. 649 00:29:20,650 --> 00:29:23,482 Computers just simplify things a little bit, 650 00:29:23,482 --> 00:29:25,190 because computers, at the end of the day, 651 00:29:25,190 --> 00:29:27,520 only have access to electricity, on or off. 652 00:29:27,520 --> 00:29:31,330 They don't have access to 10 different types of electricity, just 2, 653 00:29:31,330 --> 00:29:32,780 on or off, if you will. 654 00:29:32,780 --> 00:29:34,640 Well, they just use a different base. 655 00:29:34,640 --> 00:29:37,900 And the rightmost digit would be in the so-called 2 to the 0ths. 656 00:29:37,900 --> 00:29:39,850 Then the middle digit is 2 to the 1. 657 00:29:39,850 --> 00:29:41,830 The left most is 2 to the 2, a.k.a. 658 00:29:41,830 --> 00:29:45,520 1's place, 2's place, 4's place, and as we kept going, 8, 659 00:29:45,520 --> 00:29:49,990 and if we keep going, 16, 32, 64, 128, and so forth, 660 00:29:49,990 --> 00:29:51,920 but the idea is fundamentally the same. 661 00:29:51,920 --> 00:29:55,270 So why is this how the computer represents 662 00:29:55,270 --> 00:29:56,770 the number you and I know is 0? 663 00:29:56,770 --> 00:30:01,900 Well, off, off, off, from right to left or in this case left to right, 664 00:30:01,900 --> 00:30:02,750 is just 0. 665 00:30:02,750 --> 00:30:03,250 Why? 666 00:30:03,250 --> 00:30:08,320 Because that's 4 times 0 plus 2 times 0 plus 1 times 0 is, of course, 0. 667 00:30:08,320 --> 00:30:12,400 This is why 001 represents 1. 668 00:30:12,400 --> 00:30:20,320 This is why 010 represents 2 and 3 and 4 and 5 and 6 and 7 on up. 669 00:30:20,320 --> 00:30:23,500 And why did we need a 4th bit to represent 8? 670 00:30:23,500 --> 00:30:26,570 Well, we kind of needed to carry the 1, so to speak, 671 00:30:26,570 --> 00:30:29,740 using our familiar human terminology. 672 00:30:29,740 --> 00:30:33,280 But for that we need a 4th bit, another transistor, and this 673 00:30:33,280 --> 00:30:34,630 now represents the number 8. 674 00:30:34,630 --> 00:30:39,070 And that's why we ended with on-- from left to right-- off, off, off. 675 00:30:39,070 --> 00:30:42,760 So I keep saying on and off, or the light bulb is on or off, 676 00:30:42,760 --> 00:30:45,310 but really, I just mean 1 or 0. 677 00:30:45,310 --> 00:30:48,700 And so computers and we humans think of things digitally 678 00:30:48,700 --> 00:30:50,860 as just being 0's and 1's, but mechanically, 679 00:30:50,860 --> 00:30:52,860 you can think of it indeed is these light bulbs. 680 00:30:52,860 --> 00:30:54,220 Now, a bit is not very useful. 681 00:30:54,220 --> 00:30:56,300 Even 3 bits, 4 bits, not that useful. 682 00:30:56,300 --> 00:30:58,780 You can count to 7 or 15, generally speaking, 683 00:30:58,780 --> 00:31:01,240 bytes are a more useful unit of measure. 684 00:31:01,240 --> 00:31:04,190 And anyone familiar how many bits is in a byte? 685 00:31:04,190 --> 00:31:04,690 Yeah. 686 00:31:04,690 --> 00:31:06,310 So 8 bits are in a byte. 687 00:31:06,310 --> 00:31:08,557 You can think of it as an octet equivalently. 688 00:31:08,557 --> 00:31:11,140 In some contexts, there are nuances there, but think of a byte 689 00:31:11,140 --> 00:31:14,200 as just being 8 bits, and that's just a more useful measure. 690 00:31:14,200 --> 00:31:15,890 So what does this mean in real terms? 691 00:31:15,890 --> 00:31:21,430 So if you've ever downloaded like a music file or a photograph or a video, 692 00:31:21,430 --> 00:31:22,990 those are measured in bytes. 693 00:31:22,990 --> 00:31:25,150 Probably not small numbers of bytes, probably 694 00:31:25,150 --> 00:31:28,630 kilobytes for thousands of bytes, megabytes for millions of bytes, 695 00:31:28,630 --> 00:31:32,290 gigabytes for billions of bytes, especially for video. 696 00:31:32,290 --> 00:31:35,470 That just means you have a lot of patterns 697 00:31:35,470 --> 00:31:39,670 of 8 bits, some combination of 0's and 1's on your computer's hard drive. 698 00:31:39,670 --> 00:31:44,830 Here then, with a byte of bits, 8 bits, is how a computer would typically 699 00:31:44,830 --> 00:31:46,330 represent the number 0. 700 00:31:46,330 --> 00:31:49,570 And if that same computer uses all 8 of its bits, 701 00:31:49,570 --> 00:31:52,570 its full byte, to change it to 1-- 702 00:31:52,570 --> 00:31:54,850 anyone who's quick with math or have seen this before, 703 00:31:54,850 --> 00:31:58,247 how high can a computer count with 8 bits or 1? 704 00:31:58,247 --> 00:31:59,080 [INTERPOSING VOICES] 705 00:31:59,080 --> 00:32:00,400 Yeah, 255. 706 00:32:00,400 --> 00:32:00,902 Why is that? 707 00:32:00,902 --> 00:32:03,610 Well, we're not going to turn this into a constant math exercise. 708 00:32:03,610 --> 00:32:05,402 Indeed, after today, we're not really going 709 00:32:05,402 --> 00:32:08,230 to think about or talk about bits at this low level. 710 00:32:08,230 --> 00:32:14,560 But this is the 1's place, 2's, 4's, 8s, 16, 32, 64, 128, 711 00:32:14,560 --> 00:32:19,520 and if I do all of that math from left to right, that indeed gives me 255. 712 00:32:19,520 --> 00:32:22,210 It ignores how we might represent negative numbers, but perhaps 713 00:32:22,210 --> 00:32:24,160 more on those some other day. 714 00:32:24,160 --> 00:32:25,960 But computers, of course, do so much more 715 00:32:25,960 --> 00:32:28,810 than numbers and math and all this low level stuff. 716 00:32:28,810 --> 00:32:32,150 We send text messages, write documents, emails, and the like. 717 00:32:32,150 --> 00:32:36,220 So how might a computer represent something like the letter A? 718 00:32:36,220 --> 00:32:38,980 I claim, at the end of the day, your Mac, your PC, 719 00:32:38,980 --> 00:32:42,430 your phone just has lots of transistors, lots of switches 720 00:32:42,430 --> 00:32:46,210 that it can use in units of 8, in units of bytes. 721 00:32:46,210 --> 00:32:49,900 How, though, if it's already using those patterns of 0's and 1's 722 00:32:49,900 --> 00:32:53,380 apparently to represent numbers from 0 on up, 723 00:32:53,380 --> 00:32:58,440 how do you go about representing letters of the alphabet, might you think? 724 00:32:58,440 --> 00:32:59,230 Yeah? 725 00:32:59,230 --> 00:32:59,730 OK. 726 00:32:59,730 --> 00:33:01,800 So we could assign a number to every letter. 727 00:33:01,800 --> 00:33:01,920 OK. 728 00:33:01,920 --> 00:33:03,810 So let me just conjecture, well, let's just 729 00:33:03,810 --> 00:33:08,760 call A 0, for simplicity, B 1, C 2, and now let me play devil's advocate. 730 00:33:08,760 --> 00:33:13,500 OK, how do I now represent 0 or 1 or 2? 731 00:33:13,500 --> 00:33:16,080 Well, we've maybe created a problem for ourselves, 732 00:33:16,080 --> 00:33:19,050 if now we have to steal some numbers to represent letters. 733 00:33:19,050 --> 00:33:21,060 We kind of have to pick a lane, but there's a solution to that 734 00:33:21,060 --> 00:33:21,870 too that we'll see. 735 00:33:21,870 --> 00:33:25,710 And it turns out the world is not quite as simple as A being 0. 736 00:33:25,710 --> 00:33:29,100 A typically is represented, by computers everywhere, phones everywhere, 737 00:33:29,100 --> 00:33:32,640 with the number 65, the decimal number 65. 738 00:33:32,640 --> 00:33:36,690 Using 8 bits, if we turn some of the 0's to 1's, let me just stipulate, 739 00:33:36,690 --> 00:33:41,220 you can represent the letter A using 8 bits, by turning certain ones on 740 00:33:41,220 --> 00:33:45,240 and certain ones off, but we will try not to focus on that binary level 741 00:33:45,240 --> 00:33:46,000 too much. 742 00:33:46,000 --> 00:33:49,740 So if A is 65, it turns out that B is going to be 66, 743 00:33:49,740 --> 00:33:54,060 and C is going to be 67, and so forth, and so where does that get us? 744 00:33:54,060 --> 00:33:59,130 Well, it turns out there's a whole system that maps numbers to letters. 745 00:33:59,130 --> 00:34:02,010 And here, as I alluded to verbally a moment ago, 746 00:34:02,010 --> 00:34:05,130 is the pattern of 0's and 1's via which you'd represent 65. 747 00:34:05,130 --> 00:34:07,770 And just quick check here, we won't constantly 748 00:34:07,770 --> 00:34:13,770 do math 1's place, that's easy, 2's, 4's, 8's, 16's, 32's, 64's place. 749 00:34:13,770 --> 00:34:17,969 So 64 plus 1 gives us 65. 750 00:34:17,969 --> 00:34:21,540 So once I do that, how do I get to all of the others? 751 00:34:21,540 --> 00:34:25,020 Well, it turns out a bunch of Americans years ago came up with this 752 00:34:25,020 --> 00:34:28,889 ASCII, the American Standard Code for Information Interchange. 753 00:34:28,889 --> 00:34:30,344 Now, what does that mean? 754 00:34:30,344 --> 00:34:32,969 Well, it's just an acronym describing what really you proposed, 755 00:34:32,969 --> 00:34:37,620 a mapping between numbers and letters, not quite as simple as 0, 1, 2. 756 00:34:37,620 --> 00:34:40,980 Starts at 65, 66, 67 for capital letters, 757 00:34:40,980 --> 00:34:45,610 but here are most of the letters in use today, at least with this system. 758 00:34:45,610 --> 00:34:47,969 So this is just a big chart from online, and you'll 759 00:34:47,969 --> 00:34:52,800 see in the middle of this chart, here, here's my 65, A. Here's my 66, 760 00:34:52,800 --> 00:34:58,750 B, C, and let's see, 72 is H, 73 is I, and so forth. 761 00:34:58,750 --> 00:35:01,890 So there's a mapping, at least for English, between all of these numbers 762 00:35:01,890 --> 00:35:03,160 and all of these letters. 763 00:35:03,160 --> 00:35:07,080 And if we focus here, those are the beginning of our uppercase alphabet. 764 00:35:07,080 --> 00:35:11,670 So suppose then that today, tomorrow, you receive a text message 765 00:35:11,670 --> 00:35:15,630 from someone, and underneath the hood, now that you're a computer person, 766 00:35:15,630 --> 00:35:19,110 you figure out a way to see what pattern of 0's and 1's was sent. 767 00:35:19,110 --> 00:35:21,300 In this case, it's wireless as opposed to wired, 768 00:35:21,300 --> 00:35:23,147 but it's still some pattern of 0's and 1's. 769 00:35:23,147 --> 00:35:25,230 And your phone is turning some switches of its own 770 00:35:25,230 --> 00:35:27,900 on and off to represent that message from a friend. 771 00:35:27,900 --> 00:35:30,630 Suppose that the three patterns you received 772 00:35:30,630 --> 00:35:33,360 were these three bytes, from left to right, 773 00:35:33,360 --> 00:35:35,430 spelling out a three-letter word. 774 00:35:35,430 --> 00:35:38,880 Well, if we do out the math, 1's place, 2's place, and so forth-- 775 00:35:38,880 --> 00:35:40,060 I'll spoil it for you. 776 00:35:40,060 --> 00:35:45,420 Suppose that you received a text message that doesn't literally say 72, 73, 33, 777 00:35:45,420 --> 00:35:49,410 but you've received a pattern of 8 plus 8 plus 8, 24 bits 778 00:35:49,410 --> 00:35:54,510 that if you do out the math represent the decimal number 72, 73, 33. 779 00:35:54,510 --> 00:35:57,270 Anyone recall what message you might have received 780 00:35:57,270 --> 00:35:58,980 from the green and white charts? 781 00:35:58,980 --> 00:35:59,970 Yeah? 782 00:35:59,970 --> 00:36:00,930 AUDIENCE: Hi. 783 00:36:00,930 --> 00:36:02,010 DAVID J. MALAN: Hi. 784 00:36:02,010 --> 00:36:08,370 Yes, hi is the message, but 72, 73 gives us H and I. What's 33? 785 00:36:08,370 --> 00:36:10,560 Any guesses to 33? 786 00:36:10,560 --> 00:36:12,100 Yeah, over here. 787 00:36:12,100 --> 00:36:12,600 Yeah. 788 00:36:12,600 --> 00:36:13,770 So it's an exclamation point. 789 00:36:13,770 --> 00:36:14,650 How would you know that? 790 00:36:14,650 --> 00:36:17,025 Well, you really do need some kind of cheat sheet, a.k.a. 791 00:36:17,025 --> 00:36:18,010 ASCII in this case. 792 00:36:18,010 --> 00:36:20,802 And if we look elsewhere-- let me highlight the left of the chart-- 793 00:36:20,802 --> 00:36:24,490 you can see that next to 33 in decimal is indeed the exclamation point. 794 00:36:24,490 --> 00:36:27,120 So back in the day, a bunch of humans got in a room, 795 00:36:27,120 --> 00:36:31,200 decided that, hey, when we start building PCs and later Macs and phones, 796 00:36:31,200 --> 00:36:35,550 we all just have to agree on this form of representation of letters 797 00:36:35,550 --> 00:36:38,110 of the English alphabet, in this case. 798 00:36:38,110 --> 00:36:39,810 We just need to agree on this mapping. 799 00:36:39,810 --> 00:36:42,910 But somewhat curiously, notice this. 800 00:36:42,910 --> 00:36:46,380 It turns out that, once you paint yourself into this corner 801 00:36:46,380 --> 00:36:51,210 and start using 65 for A, 66 for B, well, 802 00:36:51,210 --> 00:36:54,660 how do you represent 65 the number and 66 the number, 803 00:36:54,660 --> 00:36:57,690 if you want to do math or use Excel or something like that? 804 00:36:57,690 --> 00:37:01,380 Does anyone see the solution, perhaps? 805 00:37:01,380 --> 00:37:06,070 How do you represent the number 1 in ASCII? 806 00:37:06,070 --> 00:37:07,528 Yeah, in the middle? 807 00:37:07,528 --> 00:37:09,065 AUDIENCE: [INAUDIBLE]. 808 00:37:09,065 --> 00:37:09,940 DAVID J. MALAN: Yeah. 809 00:37:09,940 --> 00:37:12,955 So this is getting a little maybe inception or something, 810 00:37:12,955 --> 00:37:15,080 but you could represent numbers with other numbers. 811 00:37:15,080 --> 00:37:16,830 And so if you want to represent the number 812 00:37:16,830 --> 00:37:19,450 you and I know as 1, like when you type it on your keyboard, 813 00:37:19,450 --> 00:37:23,230 turns out the computer stores that as the decimal number 49. 814 00:37:23,230 --> 00:37:27,070 If you hit 2 on your keyboard, the computer is not storing 2, per se. 815 00:37:27,070 --> 00:37:29,230 It's storing the decimal number 50. 816 00:37:29,230 --> 00:37:33,940 Now, thankfully, the paradox stops there. 817 00:37:33,940 --> 00:37:36,340 We just have a mapping now of numbers to numbers. 818 00:37:36,340 --> 00:37:37,780 But really, at the end of the day-- and you're 819 00:37:37,780 --> 00:37:40,822 going to learn this when we start writing code in that other language, C, 820 00:37:40,822 --> 00:37:43,720 next week-- it's just context-dependent, at the end of the day. 821 00:37:43,720 --> 00:37:47,380 Inside of your Mac, PC, and phone, there's just all of these permutations 822 00:37:47,380 --> 00:37:49,720 of bits, all of these patterns of 0's and 1's. 823 00:37:49,720 --> 00:37:53,650 And generally speaking, when you open up a text message that you've received 824 00:37:53,650 --> 00:37:55,252 from someone, it's 0's and 1's. 825 00:37:55,252 --> 00:37:58,210 But obviously, if it's a text message, the whole point of text messages 826 00:37:58,210 --> 00:38:01,660 is to send text, and so those patterns of 0's and 1's, by default, 827 00:38:01,660 --> 00:38:04,862 will typically be interpreted as letters of the alphabet. 828 00:38:04,862 --> 00:38:06,070 So you won't see 0's and 1's. 829 00:38:06,070 --> 00:38:07,320 You won't see decimal numbers. 830 00:38:07,320 --> 00:38:10,090 You'll see the English message that your friend intended. 831 00:38:10,090 --> 00:38:13,390 By contrast, if you open up something like Excel, 832 00:38:13,390 --> 00:38:19,660 that same pattern 0's zeros and 1's might indeed work out to be 72, 73, 33. 833 00:38:19,660 --> 00:38:23,530 You might see cells in your spreadsheet with literally those three numbers. 834 00:38:23,530 --> 00:38:24,040 Why? 835 00:38:24,040 --> 00:38:26,248 Because spreadsheets are all about numbers and number 836 00:38:26,248 --> 00:38:28,210 crunching and math, in many cases. 837 00:38:28,210 --> 00:38:31,420 If by contrast, you open up Photoshop and try 838 00:38:31,420 --> 00:38:36,820 to look at that same pattern of 0's and 1's, it's not going to be 72, 73, 33. 839 00:38:36,820 --> 00:38:38,530 It's not going to be 0's and 1's. 840 00:38:38,530 --> 00:38:39,670 It's not going to be hi. 841 00:38:39,670 --> 00:38:42,100 It's going to be some color of the rainbow. 842 00:38:42,100 --> 00:38:44,530 You're going to use those patterns of 0's and 1's, it 843 00:38:44,530 --> 00:38:46,810 turns out too, to represent colors. 844 00:38:46,810 --> 00:38:50,470 And indeed, so long as you and I just agree, as humans long 845 00:38:50,470 --> 00:38:53,830 have, what these patterns are going to be, all of our systems, 846 00:38:53,830 --> 00:38:56,560 many of our systems nowadays are indeed interoperable. 847 00:38:56,560 --> 00:38:59,590 But I'm being very biased here, and indeed, the A and ASCII 848 00:38:59,590 --> 00:39:01,330 is very American-centric. 849 00:39:01,330 --> 00:39:03,940 What do you not see in this chart? 850 00:39:03,940 --> 00:39:06,100 If you speak any other language than English, 851 00:39:06,100 --> 00:39:09,400 odds are, you're not seeing characters you know and love and need 852 00:39:09,400 --> 00:39:11,620 every day to type or send messages. 853 00:39:11,620 --> 00:39:13,480 Well, there's a huge character set that's 854 00:39:13,480 --> 00:39:15,962 not supported here, whether it's accented characters 855 00:39:15,962 --> 00:39:17,170 and a lot of Asian alphabets. 856 00:39:17,170 --> 00:39:20,420 You have many more symbols than can fit even on this screen here. 857 00:39:20,420 --> 00:39:24,010 And so humans kind of painted themselves into a corner, early on, or really, 858 00:39:24,010 --> 00:39:24,970 Americans did. 859 00:39:24,970 --> 00:39:27,820 But on a typical keyboard, US English keyboard, yeah, you 860 00:39:27,820 --> 00:39:31,450 have A's and B's and C's, uppercase and lowercase, 861 00:39:31,450 --> 00:39:33,880 but you also have accented characters here. 862 00:39:33,880 --> 00:39:37,900 And nowadays, not sure if this is maybe necessary, but nowadays, 863 00:39:37,900 --> 00:39:41,090 you have other characters on your keyboard, like these. 864 00:39:41,090 --> 00:39:43,780 And these are a playful incarnation of what's actually 865 00:39:43,780 --> 00:39:45,730 a technical solution to this problem. 866 00:39:45,730 --> 00:39:50,397 If I claim for the moment that ASCII historically used 7 bits to represent 867 00:39:50,397 --> 00:39:52,480 letters-- and let's just round that up to a byte-- 868 00:39:52,480 --> 00:39:57,730 8 bits to represent letters, ASCII can represent as many as 255, 869 00:39:57,730 --> 00:40:00,520 or really 256, total characters. 870 00:40:00,520 --> 00:40:01,550 Why 256? 871 00:40:01,550 --> 00:40:04,840 Well, if you have them all 0, that's 0, and the highest number 872 00:40:04,840 --> 00:40:07,070 I claimed a moment ago was 255. 873 00:40:07,070 --> 00:40:09,160 So that's 256 total possibilities. 874 00:40:09,160 --> 00:40:10,360 That's not many letters. 875 00:40:10,360 --> 00:40:13,730 It's fine for English, but not a lot of human languages. 876 00:40:13,730 --> 00:40:16,210 So what might the intuitive solution be, if you 877 00:40:16,210 --> 00:40:21,460 want to represent accented characters, Asian characters, emoji, even 878 00:40:21,460 --> 00:40:25,360 like these, which are just keys on a keyboard nowadays? 879 00:40:25,360 --> 00:40:28,610 What's the intuitive solution, if a byte's too few? 880 00:40:28,610 --> 00:40:29,110 Yeah? 881 00:40:29,110 --> 00:40:30,320 AUDIENCE: Add another digit. 882 00:40:30,320 --> 00:40:30,710 DAVID J. MALAN: Yeah. 883 00:40:30,710 --> 00:40:31,610 So add another digit. 884 00:40:31,610 --> 00:40:34,850 Just like we had a 4th volunteer come on up to give us a 4th bid, 885 00:40:34,850 --> 00:40:37,640 let's just throw hardware at the problem and use a few more bits. 886 00:40:37,640 --> 00:40:41,925 So maybe instead of 1 byte, let's use 2, or heck, let's use 3 or 4 bytes. 887 00:40:41,925 --> 00:40:43,800 Even though it's getting a little expensive-- 888 00:40:43,800 --> 00:40:47,000 we're going from 8 to 16 to 24 or 32 bits-- 889 00:40:47,000 --> 00:40:49,047 that's how computers do things, these days. 890 00:40:49,047 --> 00:40:52,130 And thankfully, we have so much memory inside of our computers and phones, 891 00:40:52,130 --> 00:40:54,710 we can certainly spare a few to represent these things. 892 00:40:54,710 --> 00:40:58,400 And the solution then to ASCII is what we'll call Unicode. 893 00:40:58,400 --> 00:41:04,730 So Unicode is also just a mapping of numbers to letters 894 00:41:04,730 --> 00:41:06,380 but in many different languages. 895 00:41:06,380 --> 00:41:08,450 And indeed, the Unicode Consortium is a bunch 896 00:41:08,450 --> 00:41:12,200 of people from all different companies-- 897 00:41:12,200 --> 00:41:16,610 a lot of different companies and countries and cultures whose mission, 898 00:41:16,610 --> 00:41:22,460 as an organization, is to capture digitally all forms of human language 899 00:41:22,460 --> 00:41:23,070 in this case. 900 00:41:23,070 --> 00:41:26,360 And to ensure that especially smaller demographics of humans speaking 901 00:41:26,360 --> 00:41:29,960 lesser-known languages are nonetheless represented and preserved digitally 902 00:41:29,960 --> 00:41:32,600 using some mapping of these 0's and 1's. 903 00:41:32,600 --> 00:41:36,590 It turns out, though, if you start using 32 bits, as many as 32 bits, 904 00:41:36,590 --> 00:41:42,020 to represent characters on a keyboard, that's 4 billion possible permutations 905 00:41:42,020 --> 00:41:42,830 of 0's and 1's. 906 00:41:42,830 --> 00:41:45,538 That's way more than we need for most human languages. 907 00:41:45,538 --> 00:41:48,830 So there's a little bit of room in there for some of those more playful things, 908 00:41:48,830 --> 00:41:49,850 like those emoji. 909 00:41:49,850 --> 00:41:52,760 So for instance, suppose you got a text message with this pattern 910 00:41:52,760 --> 00:41:55,040 of 0's and 1's. 911 00:41:55,040 --> 00:41:57,950 Or if we do out the math, suppose you receive a text message 912 00:41:57,950 --> 00:42:03,080 that, if you do out the math in decimal, is 4,036,991,106. 913 00:42:03,080 --> 00:42:07,110 Anyone know what emoji you're looking at? 914 00:42:07,110 --> 00:42:11,033 It would be weird if you do, but what is this? 915 00:42:11,033 --> 00:42:12,950 Well, it turns out that, as of this past year, 916 00:42:12,950 --> 00:42:16,990 this is the most popular emoji to be sent by many measures, 917 00:42:16,990 --> 00:42:18,970 Face with Tears of Joy. 918 00:42:18,970 --> 00:42:22,540 So that is the pattern that a bunch of humans in the Unicode Consortium 919 00:42:22,540 --> 00:42:24,070 decided would represent this. 920 00:42:24,070 --> 00:42:27,430 But you'll notice, many of you might have iPhones, some of you 921 00:42:27,430 --> 00:42:30,280 might have Android devices too, and sometimes, these 922 00:42:30,280 --> 00:42:31,810 don't actually look quite the same. 923 00:42:31,810 --> 00:42:36,850 This happens to be the current version of Face with Tears of Joy on iOS. 924 00:42:36,850 --> 00:42:40,150 On Android, it tends to look a little something more like this, 925 00:42:40,150 --> 00:42:42,550 and here is kind of a curiosity. 926 00:42:42,550 --> 00:42:45,850 Even though you and I look at these things and they look like images, 927 00:42:45,850 --> 00:42:46,840 they're not images. 928 00:42:46,840 --> 00:42:50,470 They're characters, at least as we've defined them now in Unicode. 929 00:42:50,470 --> 00:42:56,350 And iOS and Android and Windows and Facebook and other companies and apps, 930 00:42:56,350 --> 00:42:59,325 nowadays, really just have different fonts, if you will. 931 00:42:59,325 --> 00:43:01,450 So just like fonts with English and other languages 932 00:43:01,450 --> 00:43:04,690 can give you different characters with serifs or not, 933 00:43:04,690 --> 00:43:07,958 emoji are themselves, yes, drawings that someone made, 934 00:43:07,958 --> 00:43:09,250 but they're really just a font. 935 00:43:09,250 --> 00:43:13,120 And so that same pattern of 0's and 1's might just render slightly differently 936 00:43:13,120 --> 00:43:14,830 on someone's phone or another. 937 00:43:14,830 --> 00:43:17,950 If you've ever gotten like an icon on your phone that's broken, 938 00:43:17,950 --> 00:43:21,610 and you've been sent an emoji, but it's like a square or something arbitrary 939 00:43:21,610 --> 00:43:24,700 and not sensible, it might just mean that you have not 940 00:43:24,700 --> 00:43:27,070 updated to the latest version of iOS or Android, 941 00:43:27,070 --> 00:43:29,710 which just updates the font of supported emoji. 942 00:43:29,710 --> 00:43:32,290 Because those folks at Unicode, pretty much every year 943 00:43:32,290 --> 00:43:36,838 nowadays, are adding more and more emoji to that particular character set. 944 00:43:36,838 --> 00:43:39,880 Now, I went down the rabbit hole of figuring out the other day just which 945 00:43:39,880 --> 00:43:41,710 are the most popular emoji these days. 946 00:43:41,710 --> 00:43:47,120 On Twitter specifically, this past year, the most popular emoji, by contrast, 947 00:43:47,120 --> 00:43:49,390 was Loudly Crying Face. 948 00:43:49,390 --> 00:43:52,780 I don't know if that says more about 2021 or about Twitter, 949 00:43:52,780 --> 00:43:55,780 but you'll see different trends, certainly, in how these are used. 950 00:43:55,780 --> 00:44:00,400 But even humans themselves didn't necessarily think two steps ahead, 951 00:44:00,400 --> 00:44:03,790 and now a lot of the emoji are the default yellow color. 952 00:44:03,790 --> 00:44:06,630 But there's a lot of emoji that aren't these cartoon characters, 953 00:44:06,630 --> 00:44:09,130 but they're meant to represent humans in various professions 954 00:44:09,130 --> 00:44:10,690 or gestures or the like. 955 00:44:10,690 --> 00:44:14,830 And nowadays too, you've probably noticed on your phone and Macs and PCs, 956 00:44:14,830 --> 00:44:18,190 there are different skin tones that you can assign to certain emojis. 957 00:44:18,190 --> 00:44:21,190 If it's supported by the company and by Unicode, 958 00:44:21,190 --> 00:44:23,858 you can actually touch and hold on a certain emoji, 959 00:44:23,858 --> 00:44:25,900 and then you can choose the appropriate skin tone 960 00:44:25,900 --> 00:44:27,483 to represent yourself or someone else. 961 00:44:27,483 --> 00:44:29,440 And that then modifies the display. 962 00:44:29,440 --> 00:44:31,210 Well, let's just think for a moment here, 963 00:44:31,210 --> 00:44:33,910 how did Apple and Google and Microsoft and others 964 00:44:33,910 --> 00:44:38,650 go about implementing support for emoji with different skin tones? 965 00:44:38,650 --> 00:44:41,000 How could you do this? 966 00:44:41,000 --> 00:44:44,563 If you want to represent some smiling emoji but in five, 967 00:44:44,563 --> 00:44:47,230 in this case, different skin tones, you could come up with what? 968 00:44:47,230 --> 00:44:50,740 Five different patterns that are identical, structurally, 969 00:44:50,740 --> 00:44:53,950 except for the skin tone used in places in that image. 970 00:44:53,950 --> 00:44:58,360 But that's a little inefficient to just do copy, paste, paste, paste, paste, 971 00:44:58,360 --> 00:45:00,890 and change the color in Photoshop, if you will. 972 00:45:00,890 --> 00:45:05,020 That's going to use more bits, more information than you might need to. 973 00:45:05,020 --> 00:45:07,575 How else, if you now start to think a little bit more 974 00:45:07,575 --> 00:45:10,450 like a computer scientist, if at the end of the day, all you have are 975 00:45:10,450 --> 00:45:14,180 0's and 1's, how else could you implement skin tones, might you think? 976 00:45:14,180 --> 00:45:14,680 Yeah? 977 00:45:14,680 --> 00:45:15,298 AUDIENCE: RGB. 978 00:45:15,298 --> 00:45:16,090 DAVID J. MALAN: OK. 979 00:45:16,090 --> 00:45:18,190 So RGB, we'll come to that in just a moment. 980 00:45:18,190 --> 00:45:19,630 That stands for Red, Green, Blue. 981 00:45:19,630 --> 00:45:20,590 That's one way. 982 00:45:20,590 --> 00:45:23,590 In this case, though, I'm seeking an alternative 983 00:45:23,590 --> 00:45:28,390 to just using five different patterns of 0's and 1's to represent the same emoji 984 00:45:28,390 --> 00:45:29,720 but different skin tones. 985 00:45:29,720 --> 00:45:30,620 So not quite RGB. 986 00:45:30,620 --> 00:45:31,120 Yeah? 987 00:45:31,120 --> 00:45:32,278 AUDIENCE: [INAUDIBLE] 988 00:45:32,278 --> 00:45:33,070 DAVID J. MALAN: OK. 989 00:45:33,070 --> 00:45:37,660 So store one copy of the emoji and then store different variants of the color 990 00:45:37,660 --> 00:45:39,410 that you want to assign to that emoji. 991 00:45:39,410 --> 00:45:39,910 Yeah. 992 00:45:39,910 --> 00:45:42,452 So this is actually an example of-- do you want to elaborate? 993 00:45:42,452 --> 00:45:43,858 AUDIENCE: You could use a loop. 994 00:45:43,858 --> 00:45:44,650 DAVID J. MALAN: OK. 995 00:45:44,650 --> 00:45:46,900 So you can use a loop to actually output these things. 996 00:45:46,900 --> 00:45:47,942 More on that in a moment. 997 00:45:47,942 --> 00:45:49,990 Let me go down this road for just a moment. 998 00:45:49,990 --> 00:45:54,335 This would be in some sense a better design, if you will, but why? 999 00:45:54,335 --> 00:45:54,835 Yeah? 1000 00:45:54,835 --> 00:45:55,798 AUDIENCE: A filter? 1001 00:45:55,798 --> 00:45:56,590 DAVID J. MALAN: OK. 1002 00:45:56,590 --> 00:45:58,780 So filter, if we think of in the Instagram sense. 1003 00:45:58,780 --> 00:46:01,885 You can change the color of something, and that could be related here too. 1004 00:46:01,885 --> 00:46:03,967 AUDIENCE: Could it be another font [INAUDIBLE] 1005 00:46:03,967 --> 00:46:05,300 DAVID J. MALAN: Oh, interesting. 1006 00:46:05,300 --> 00:46:07,410 So maybe it could be just a completely different font. 1007 00:46:07,410 --> 00:46:09,380 And you have five different fonts that are almost identical, 1008 00:46:09,380 --> 00:46:12,800 except for the various interpretations of skin tone for those same emoji. 1009 00:46:12,800 --> 00:46:13,550 Let me spoil. 1010 00:46:13,550 --> 00:46:15,680 I think if we go down this one particular road, 1011 00:46:15,680 --> 00:46:20,210 the way the Unicode folks decided to do this some years ago where 1012 00:46:20,210 --> 00:46:25,130 the first byte or bytes that you receive via text or email 1013 00:46:25,130 --> 00:46:28,520 just represent like the structure of the emoji, the default yellow version, 1014 00:46:28,520 --> 00:46:29,060 thereof. 1015 00:46:29,060 --> 00:46:32,540 But if it's immediately followed by a certain pattern of bits 1016 00:46:32,540 --> 00:46:34,970 that these humans standardize to represent 1017 00:46:34,970 --> 00:46:39,170 each of these different shades of skin tone, then the phone, the Mac, 1018 00:46:39,170 --> 00:46:42,920 the PC will change that default color, yellow in most cases, 1019 00:46:42,920 --> 00:46:45,290 to whatever the more apt human tone is. 1020 00:46:45,290 --> 00:46:49,970 So you just use twice as many bits, but you don't use five times as many bits. 1021 00:46:49,970 --> 00:46:50,720 So what do I mean? 1022 00:46:50,720 --> 00:46:54,890 You don't have five completely distinct patterns, per se. 1023 00:46:54,890 --> 00:46:59,720 For each of these possible variants, you have a representation 1024 00:46:59,720 --> 00:47:03,710 of just the emoji itself, structurally, and then 1025 00:47:03,710 --> 00:47:07,920 reusable patterns for those five skin tones. 1026 00:47:07,920 --> 00:47:11,570 Unfortunately, that wasn't quite versatile enough for other features 1027 00:47:11,570 --> 00:47:13,850 that were in the pipeline, and nowadays too, 1028 00:47:13,850 --> 00:47:16,100 and there's a double meaning now to representation. 1029 00:47:16,100 --> 00:47:20,900 Emojis intended to focus on certain professions, and early on too, 1030 00:47:20,900 --> 00:47:24,150 were certain professions associated with certain genders and vice versa. 1031 00:47:24,150 --> 00:47:26,612 And you couldn't necessarily be one gender or another, 1032 00:47:26,612 --> 00:47:28,070 in a certain profession or another. 1033 00:47:28,070 --> 00:47:30,230 There were these combinatorics that just weren't possible. 1034 00:47:30,230 --> 00:47:31,970 But nowadays, as you might have seen, you 1035 00:47:31,970 --> 00:47:33,920 can have couples in love for instance that 1036 00:47:33,920 --> 00:47:37,200 actually look a little more like three emojis, but just kind of combined 1037 00:47:37,200 --> 00:47:37,700 into one. 1038 00:47:37,700 --> 00:47:39,980 And indeed, this is just one key press on your phone, 1039 00:47:39,980 --> 00:47:43,550 and you can combine different emoji on the left and then the right 1040 00:47:43,550 --> 00:47:45,390 with the emoji in the middle. 1041 00:47:45,390 --> 00:47:47,480 And so it turns out how computers nowadays 1042 00:47:47,480 --> 00:47:52,940 represent these patterns are one set of bits for the character on the left, 1043 00:47:52,940 --> 00:47:54,920 one set of bits for a character on the right, 1044 00:47:54,920 --> 00:47:58,080 one set of bits for whatever emoji you want in the middle. 1045 00:47:58,080 --> 00:48:02,450 And then you assemble more complicated compositions of emoji 1046 00:48:02,450 --> 00:48:06,350 by just reusing those same patterns and bits and bits. 1047 00:48:06,350 --> 00:48:10,160 The Unicode folks don't have to come up with a whole new representation 1048 00:48:10,160 --> 00:48:12,620 for some very specific incarnation. 1049 00:48:12,620 --> 00:48:15,080 They can create one for person, for male, 1050 00:48:15,080 --> 00:48:18,110 for, female for other characters that you might want to display, 1051 00:48:18,110 --> 00:48:21,390 and reuse those same patterns of 0's and 1's. 1052 00:48:21,390 --> 00:48:23,632 And so here, you see the imperfection, of or lack 1053 00:48:23,632 --> 00:48:26,090 of foresight, of humans for building a system early on that 1054 00:48:26,090 --> 00:48:29,390 was entirely American-centric, no characters, emoji, or the like, 1055 00:48:29,390 --> 00:48:30,500 that's evolved too. 1056 00:48:30,500 --> 00:48:33,800 And so that's an important detail in computing, nowadays. 1057 00:48:33,800 --> 00:48:36,020 It too is evolving, and the languages you're 1058 00:48:36,020 --> 00:48:39,780 about to learn in the coming days, those too are evolving as well. 1059 00:48:39,780 --> 00:48:42,980 And new features are getting added, and even programming languages have 1060 00:48:42,980 --> 00:48:43,942 version numbers. 1061 00:48:43,942 --> 00:48:46,400 You might have a different version of an app on your phone. 1062 00:48:46,400 --> 00:48:49,770 Programming languages too have different versions as well. 1063 00:48:49,770 --> 00:48:51,830 Questions then thus far on how information 1064 00:48:51,830 --> 00:48:56,900 is represented using ASCII or Unicode or anything in between? 1065 00:48:56,900 --> 00:48:57,440 Yeah? 1066 00:48:57,440 --> 00:48:59,383 AUDIENCE: [INAUDIBLE] 1067 00:48:59,383 --> 00:49:00,800 DAVID J. MALAN: Oh, good question. 1068 00:49:00,800 --> 00:49:04,240 So to recap, why can't you just-- 1069 00:49:04,240 --> 00:49:07,390 well, let me summarize that as why can't you 1070 00:49:07,390 --> 00:49:10,843 similarly use different patterns to change the context of what 1071 00:49:10,843 --> 00:49:12,760 these patterns of bits represent, whether it's 1072 00:49:12,760 --> 00:49:14,950 a number or a letter or a graphic? 1073 00:49:14,950 --> 00:49:17,920 In actuality, that's kind of what's happening underneath the hood. 1074 00:49:17,920 --> 00:49:21,220 It's not standardized in quite the same way, but starting next week, 1075 00:49:21,220 --> 00:49:24,670 when we transition from scratch to C, you'll learn about types, data types. 1076 00:49:24,670 --> 00:49:27,970 Where the onus initially is going to be on you, the programmer, 1077 00:49:27,970 --> 00:49:30,850 to tell the program whether or not this pattern of bits 1078 00:49:30,850 --> 00:49:33,820 should be interpreted as a number or as a letter 1079 00:49:33,820 --> 00:49:35,642 or as a color or something else. 1080 00:49:35,642 --> 00:49:37,850 Nowadays, though, and toward the end of the semester, 1081 00:49:37,850 --> 00:49:41,170 you'll use languages, like Python, where the computer just figures it out 1082 00:49:41,170 --> 00:49:45,950 for you by context, which makes it even easier and faster to program as well. 1083 00:49:45,950 --> 00:49:50,580 Other questions on Unicode, ASCII or the like? 1084 00:49:50,580 --> 00:49:51,080 All right. 1085 00:49:51,080 --> 00:49:53,330 Well, how about just a few other forms of information? 1086 00:49:53,330 --> 00:49:55,250 RGB was called out earlier, Red, Green, Blue. 1087 00:49:55,250 --> 00:49:57,410 How do images get represented in computers? 1088 00:49:57,410 --> 00:50:01,000 Well, in fact, it's typically an assembly of some amount of red, 1089 00:50:01,000 --> 00:50:02,750 some amount of green, some amount of blue, 1090 00:50:02,750 --> 00:50:04,340 but there are other representations. 1091 00:50:04,340 --> 00:50:06,423 If you're a graphic designer, you might know them, 1092 00:50:06,423 --> 00:50:08,000 but RGB is still pretty common. 1093 00:50:08,000 --> 00:50:08,970 What does this mean? 1094 00:50:08,970 --> 00:50:12,560 This means to represent every dot on your phone or every dot 1095 00:50:12,560 --> 00:50:15,470 on your TV or your laptop or desktop, there 1096 00:50:15,470 --> 00:50:18,395 is a number representing how much red that dot should show, 1097 00:50:18,395 --> 00:50:21,020 a number representing how much green, and a number representing 1098 00:50:21,020 --> 00:50:24,690 how much blue it should show, red, green, blue, respectively. 1099 00:50:24,690 --> 00:50:27,980 So for instance, if a dot on your screen were 1100 00:50:27,980 --> 00:50:33,410 using these three numbers, these three values or bytes, 72, 73, 33, 1101 00:50:33,410 --> 00:50:37,250 in a text message or email, that would be interpreted as I claimed "High." 1102 00:50:37,250 --> 00:50:40,160 But in Photoshop or in some graphical program, 1103 00:50:40,160 --> 00:50:43,670 that same pattern would be interpreted as let's 1104 00:50:43,670 --> 00:50:46,610 call it a medium amount of red, a medium amount of green, 1105 00:50:46,610 --> 00:50:47,840 and a little bit of blue. 1106 00:50:47,840 --> 00:50:49,250 And why medium and little? 1107 00:50:49,250 --> 00:50:53,120 Turns out, each of these are bytes, the smallest value you can have in a byte 1108 00:50:53,120 --> 00:50:54,110 we said is 0. 1109 00:50:54,110 --> 00:50:56,558 The largest value you can have a byte is 255, 1110 00:50:56,558 --> 00:50:58,100 so I'm just kind of spitballing here. 1111 00:50:58,100 --> 00:51:01,700 This is like medium, medium, and a low amount of red, green, blue, 1112 00:51:01,700 --> 00:51:02,660 specifically. 1113 00:51:02,660 --> 00:51:07,640 Those three colors, like wavelengths of light, are combined in such a way 1114 00:51:07,640 --> 00:51:11,690 that you would have this dot on the screen, a sort of murky shade 1115 00:51:11,690 --> 00:51:12,890 of yellow or brown. 1116 00:51:12,890 --> 00:51:16,910 That is how a computer would store precisely that color, 1117 00:51:16,910 --> 00:51:18,470 and in fact, we've seen this color. 1118 00:51:18,470 --> 00:51:22,010 When you type in Face with Tears of Joy, generally, on your screen, 1119 00:51:22,010 --> 00:51:23,930 it looks like this, typically much smaller. 1120 00:51:23,930 --> 00:51:27,980 But let's zoom in, or let's Zoom in a little more. 1121 00:51:27,980 --> 00:51:30,212 What are you starting to see, if you know the term? 1122 00:51:30,212 --> 00:51:30,920 AUDIENCE: Pixels. 1123 00:51:30,920 --> 00:51:33,212 DAVID J. MALAN: So pixels, it's getting very pixelated. 1124 00:51:33,212 --> 00:51:36,510 A pixel is just a dot on the screen, and if you really zoom in on it, 1125 00:51:36,510 --> 00:51:40,520 you can literally see all of the dots that compose an emoji, 1126 00:51:40,520 --> 00:51:43,940 in this case on iOS, in the font that Apple is using to represent this 1127 00:51:43,940 --> 00:51:45,750 particular pattern of 0's and 0's. 1128 00:51:45,750 --> 00:51:49,400 So one of those yellow dots-- and there's many of them all kind of blend 1129 00:51:49,400 --> 00:51:50,330 together here-- 1130 00:51:50,330 --> 00:51:53,780 each dot on the screen I claim is 3 bytes. 1131 00:51:53,780 --> 00:51:55,700 How much red, green, blue for this dot? 1132 00:51:55,700 --> 00:51:57,350 How much red green blue for this dot? 1133 00:51:57,350 --> 00:51:58,700 How much red green blue for this dot? 1134 00:51:58,700 --> 00:52:01,575 And you'll notice too, that when it gets to be sort of brownish here, 1135 00:52:01,575 --> 00:52:02,720 the dots really stand out. 1136 00:52:02,720 --> 00:52:05,480 The 3 values, the 3 bytes, a.k.a. 1137 00:52:05,480 --> 00:52:08,160 24 bits, are just slightly different. 1138 00:52:08,160 --> 00:52:11,570 And so underneath the hood, this is why images, photographs 1139 00:52:11,570 --> 00:52:14,930 that you take or gif that you download, get so darn big, 1140 00:52:14,930 --> 00:52:19,850 potentially, because you have a number representing every dot on the screen. 1141 00:52:19,850 --> 00:52:22,970 Well, if this I claim is indeed how images are typically 1142 00:52:22,970 --> 00:52:25,340 represented, using pattern of bits that are 1143 00:52:25,340 --> 00:52:29,630 assigned to some amount of red, green, or blue, how do you get video? 1144 00:52:29,630 --> 00:52:34,820 What is a video, if at the end of the day, all we have are 0's and 1's? 1145 00:52:34,820 --> 00:52:36,500 What's a video, perhaps? 1146 00:52:36,500 --> 00:52:37,610 Yeah? 1147 00:52:37,610 --> 00:52:39,420 Let's go here, way in back. 1148 00:52:39,420 --> 00:52:39,920 Yeah. 1149 00:52:39,920 --> 00:52:42,155 Pixels really changing values over time. 1150 00:52:42,155 --> 00:52:44,780 and do you want to confirm or deny, the hand that went up here? 1151 00:52:44,780 --> 00:52:45,380 AUDIENCE: [INAUDIBLE] 1152 00:52:45,380 --> 00:52:47,422 DAVID J. MALAN: Yeah, or equivalently, a sequence 1153 00:52:47,422 --> 00:52:49,828 of images that, over time, are changing on the screen. 1154 00:52:49,828 --> 00:52:51,620 So both of those are valid interpretations, 1155 00:52:51,620 --> 00:52:55,010 and just for fun, if you grew up with these picture books, 1156 00:52:55,010 --> 00:52:57,540 you might remember a little something like this. 1157 00:52:57,540 --> 00:52:59,191 if we could dim the lights? 1158 00:52:59,191 --> 00:53:02,628 [MUSIC PLAYING] 1159 00:53:02,628 --> 00:53:19,925 1160 00:53:19,925 --> 00:53:22,340 So that's the old school analog way to implement 1161 00:53:22,340 --> 00:53:27,320 a video, in the sense that that artist wrote out like hundreds of pieces 1162 00:53:27,320 --> 00:53:31,250 of paper, with almost identical images, but where the ink from their pencil 1163 00:53:31,250 --> 00:53:33,015 or pen was slightly moving. 1164 00:53:33,015 --> 00:53:35,390 And if you digitize that, such that each of those strokes 1165 00:53:35,390 --> 00:53:38,300 are represented with dots instead, that's really what you're seeing 1166 00:53:38,300 --> 00:53:41,220 is a sequence of all of these images flying across the screen. 1167 00:53:41,220 --> 00:53:44,180 And if we dive into the real world, if you've ever watched a film, 1168 00:53:44,180 --> 00:53:48,320 a Hollywood movie is typically 24 FPS, Frames Per Second. 1169 00:53:48,320 --> 00:53:53,030 That really means you're seeing 24 images per second, or on TV or in soap 1170 00:53:53,030 --> 00:53:55,370 operas, it's often 30 frames per second. 1171 00:53:55,370 --> 00:53:57,210 That makes things look a little more smooth. 1172 00:53:57,210 --> 00:53:59,750 So it's not actual motion picture, if you will. 1173 00:53:59,750 --> 00:54:02,480 It's sequences of pictures, and your brain and mind 1174 00:54:02,480 --> 00:54:05,900 are interpolating that, oh, this is smooth movement, even though we're just 1175 00:54:05,900 --> 00:54:07,985 seeing a lot of pictures really fast. 1176 00:54:07,985 --> 00:54:10,610 Now, that gets really big, and we'll talk later in the semester 1177 00:54:10,610 --> 00:54:13,700 how you can compress information, so that you're not using way 1178 00:54:13,700 --> 00:54:15,200 more bits than you actually need to. 1179 00:54:15,200 --> 00:54:17,330 And there's fancy algorithms that folks have developed, 1180 00:54:17,330 --> 00:54:19,850 but at the end of the day, that's really all a video might 1181 00:54:19,850 --> 00:54:21,590 be is a sequence of images. 1182 00:54:21,590 --> 00:54:23,870 Conversely, if you want to represent the music that 1183 00:54:23,870 --> 00:54:27,410 accompanies that or something else, if any of you play an instrument 1184 00:54:27,410 --> 00:54:30,978 and can read sheet music, how could you digitize this? 1185 00:54:30,978 --> 00:54:31,520 [PIANO MUSIC] 1186 00:54:31,520 --> 00:54:35,330 Like how could you represent musical notes in a computer? 1187 00:54:35,330 --> 00:54:37,850 You and I hear them when we play files, but what's 1188 00:54:37,850 --> 00:54:41,210 really going on underneath the hood? 1189 00:54:41,210 --> 00:54:44,760 Any musicians, piano players? 1190 00:54:44,760 --> 00:54:45,260 Anyone? 1191 00:54:45,260 --> 00:54:45,760 Yeah? 1192 00:54:45,760 --> 00:54:47,150 AUDIENCE: Hertz value? 1193 00:54:47,150 --> 00:54:49,590 DAVID J. MALAN: OK, so Hertz value, so some frequency. 1194 00:54:49,590 --> 00:54:52,528 So sound is some frequency, and it's kind of hitting your eardrum. 1195 00:54:52,528 --> 00:54:55,320 And that's what makes it sound low or high or somewhere in between. 1196 00:54:55,320 --> 00:54:58,460 So maybe we could assign, just like there's letters A through G here, 1197 00:54:58,460 --> 00:55:00,860 maybe we could assign specific frequency values, which 1198 00:55:00,860 --> 00:55:02,480 are just going to be numbers measured in something 1199 00:55:02,480 --> 00:55:04,010 called Hertz, something per second. 1200 00:55:04,010 --> 00:55:06,843 And maybe we could have a few other numbers for each of these notes, 1201 00:55:06,843 --> 00:55:08,780 not just the note or the frequency. 1202 00:55:08,780 --> 00:55:12,350 Maybe, we could represent the loudness of it, like how hard 1203 00:55:12,350 --> 00:55:14,900 or how softly a human might equivalently press it. 1204 00:55:14,900 --> 00:55:17,630 Maybe a third number, like duration, like how long 1205 00:55:17,630 --> 00:55:19,380 is there finger on the keyboard? 1206 00:55:19,380 --> 00:55:22,790 So you can imagine quantifying something like music that in the real world 1207 00:55:22,790 --> 00:55:25,400 is perfectly continuous as something more discrete, 1208 00:55:25,400 --> 00:55:29,450 by representing each note over time as just some sequence of values. 1209 00:55:29,450 --> 00:55:32,510 And there's so many different ways to do this, MIDI, if you've heard, 1210 00:55:32,510 --> 00:55:34,680 mp3's, AAC. 1211 00:55:34,680 --> 00:55:37,670 Almost all of the file extensions you see on your Mac or PC, 1212 00:55:37,670 --> 00:55:40,280 if you see them at all, ultimately just mean 1213 00:55:40,280 --> 00:55:43,170 there's a different form of representation for, in this case, 1214 00:55:43,170 --> 00:55:45,290 something like sound. 1215 00:55:45,290 --> 00:55:48,860 So let me just stipulate, there are these and many more 1216 00:55:48,860 --> 00:55:51,950 ways to represent inputs and outputs, and thankfully, humans 1217 00:55:51,950 --> 00:55:53,300 have standardized a lot of this. 1218 00:55:53,300 --> 00:55:55,580 They don't always agree, and this is why we 1219 00:55:55,580 --> 00:55:57,920 have different file formats for Apple numbers 1220 00:55:57,920 --> 00:55:59,840 and Microsoft Excel and Google Spreadsheets 1221 00:55:59,840 --> 00:56:02,100 and stupid incompatibilities like that. 1222 00:56:02,100 --> 00:56:04,190 But generally speaking, humans have standardized 1223 00:56:04,190 --> 00:56:07,670 how we represent the inputs and outputs to and from problems. 1224 00:56:07,670 --> 00:56:10,370 But let's now focus on this Black box, so to speak, 1225 00:56:10,370 --> 00:56:12,590 in the middle, this abstraction. 1226 00:56:12,590 --> 00:56:15,020 So abstraction is technically a term that you'll 1227 00:56:15,020 --> 00:56:16,820 see all over the place in computer science, 1228 00:56:16,820 --> 00:56:18,695 and really, problem solving, that just refers 1229 00:56:18,695 --> 00:56:23,630 to the simplification of something, so that you don't focus on the lower 1230 00:56:23,630 --> 00:56:25,310 level implementation details. 1231 00:56:25,310 --> 00:56:29,880 You really just focus on the high level goals or the process itself. 1232 00:56:29,880 --> 00:56:32,570 Therefore, your car, if you have a license 1233 00:56:32,570 --> 00:56:35,660 and have driven or have been in a car, a car, so far as you're concerned, 1234 00:56:35,660 --> 00:56:36,830 is probably an abstraction. 1235 00:56:36,830 --> 00:56:38,997 Most of us, if you're like me, probably don't really 1236 00:56:38,997 --> 00:56:42,290 know or care how the engine works and all the parts that are moving. 1237 00:56:42,290 --> 00:56:44,570 To you, it's just a way of getting from point A 1238 00:56:44,570 --> 00:56:47,570 to point B. It's an abstraction, but someone, hopefully the mechanic, 1239 00:56:47,570 --> 00:56:50,510 does know those lower level implementation details. 1240 00:56:50,510 --> 00:56:53,030 If you had to understand how a car works every time you 1241 00:56:53,030 --> 00:56:55,220 want to go to school or to the store, it's probably 1242 00:56:55,220 --> 00:56:56,700 going to be a pretty slow process. 1243 00:56:56,700 --> 00:57:00,590 You just want to think and operate at this higher level of abstraction, 1244 00:57:00,590 --> 00:57:04,350 and we're going to do this all the time when writing code and solving problems. 1245 00:57:04,350 --> 00:57:07,940 So what then is in this black box, this abstraction at the moment? 1246 00:57:07,940 --> 00:57:10,100 Well, generally, it's what a computer scientist 1247 00:57:10,100 --> 00:57:14,180 would call an algorithm, step-by-step instructions for solving some problem. 1248 00:57:14,180 --> 00:57:16,940 Now, let's consider the implementation details, 1249 00:57:16,940 --> 00:57:20,150 that is to say how you might solve certain problems, 1250 00:57:20,150 --> 00:57:24,230 and let's take a old school example but in modern form. 1251 00:57:24,230 --> 00:57:27,970 This icon, if you have an iPhone, is, of course for your contacts application. 1252 00:57:27,970 --> 00:57:30,470 And if you've got a whole bunch of family members or friends 1253 00:57:30,470 --> 00:57:32,420 or colleagues in your phonebook, you have 1254 00:57:32,420 --> 00:57:35,330 some kind of contacts pictured here, and it's alphabetized typically 1255 00:57:35,330 --> 00:57:36,800 by first name and last name. 1256 00:57:36,800 --> 00:57:38,510 And odds are, you and I are in the habit, 1257 00:57:38,510 --> 00:57:41,690 if they're not already a favorite, of like clicking on Search 1258 00:57:41,690 --> 00:57:42,950 and then using autocomplete. 1259 00:57:42,950 --> 00:57:45,140 And what happens when you start typing autocomplete? 1260 00:57:45,140 --> 00:57:48,710 Well if you type in the letter H, you'll see only, presumably, 1261 00:57:48,710 --> 00:57:50,640 Hagrid, Harry, Hermione, and so forth. 1262 00:57:50,640 --> 00:57:54,350 If you type in H-A that shows you only Hagrid and Harry, 1263 00:57:54,350 --> 00:57:56,280 and it all happens super fast. 1264 00:57:56,280 --> 00:57:57,720 So how is that happening? 1265 00:57:57,720 --> 00:58:02,600 Well, typically, you could just start at the top and look to the bottom, 1266 00:58:02,600 --> 00:58:06,110 searching for all of the H's or all of the H-A's, but for larger data 1267 00:58:06,110 --> 00:58:07,490 sets that's going to get slow. 1268 00:58:07,490 --> 00:58:10,130 For the Googles of the world, that's going to get really slow. 1269 00:58:10,130 --> 00:58:13,580 And even on our phones when you have hundreds, thousands of contacts, 1270 00:58:13,580 --> 00:58:17,210 eventually, even that kind of approach, that algorithm step by step 1271 00:58:17,210 --> 00:58:18,300 it might be slow. 1272 00:58:18,300 --> 00:58:21,050 So how might we go about searching for someone in a phonebook 1273 00:58:21,050 --> 00:58:24,230 like this, like say John Harvard? 1274 00:58:24,230 --> 00:58:26,720 Well, here's an old school incarnation of this, 1275 00:58:26,720 --> 00:58:29,630 and odds are, you might not have had occasion to even physically 1276 00:58:29,630 --> 00:58:30,910 use this thing, nowadays. 1277 00:58:30,910 --> 00:58:32,660 And in fact, this is a bit of a white lie, 1278 00:58:32,660 --> 00:58:34,535 because this is the yellow pages, which means 1279 00:58:34,535 --> 00:58:36,950 this is a book of companies not people. 1280 00:58:36,950 --> 00:58:40,370 But this is all you can find, and at that, it's even hard to find this. 1281 00:58:40,370 --> 00:58:43,770 But this is the same thing in analog form, physical form. 1282 00:58:43,770 --> 00:58:47,310 So if I wanted to search for someone like John Harvard, how could I do that? 1283 00:58:47,310 --> 00:58:49,580 Well, I could start on page 1, and I could 1284 00:58:49,580 --> 00:58:55,345 start searching for page 2, page 3, page 4, page 5. 1285 00:58:55,345 --> 00:58:57,470 A little hard to do physically, especially since no 1286 00:58:57,470 --> 00:58:59,345 one's used this phone book in a lot of years. 1287 00:58:59,345 --> 00:59:06,260 But is this algorithm correct, turning page by page, very inelegantly? 1288 00:59:06,260 --> 00:59:06,980 Is this correct? 1289 00:59:06,980 --> 00:59:09,690 Will I find John Harvard, if he's in here? 1290 00:59:09,690 --> 00:59:10,190 All right. 1291 00:59:10,190 --> 00:59:11,030 So yes. 1292 00:59:11,030 --> 00:59:14,240 This is a little stupidly tedious, because if there's like 1,000 pages, 1293 00:59:14,240 --> 00:59:16,870 he might be a few hundred pages into this, but it's correct. 1294 00:59:16,870 --> 00:59:20,120 At some point, I will find him, and if he's on the page, I'll be able to call. 1295 00:59:20,120 --> 00:59:20,620 Why? 1296 00:59:20,620 --> 00:59:22,950 Because presumably, the names are alphabetized in here, 1297 00:59:22,950 --> 00:59:24,608 and there's no cheat sheet on the edge. 1298 00:59:24,608 --> 00:59:27,650 So I have to search for John Harvard from left to right, searching for H, 1299 00:59:27,650 --> 00:59:29,150 if it's alphabetized by last name. 1300 00:59:29,150 --> 00:59:30,740 Well, what would be marginally better? 1301 00:59:30,740 --> 00:59:32,240 Well, how about two pages at a time? 1302 00:59:32,240 --> 00:59:34,160 It's hard to do with a 20-year-old phone book, 1303 00:59:34,160 --> 00:59:41,150 where the pages are grown together, but 2, 4, 6, 8, 10, 12. 1304 00:59:41,150 --> 00:59:42,605 This algorithm, is this correct? 1305 00:59:42,605 --> 00:59:43,465 AUDIENCE: No. 1306 00:59:43,465 --> 00:59:44,150 DAVID J. MALAN: All right, so no. 1307 00:59:44,150 --> 00:59:44,780 Why? 1308 00:59:44,780 --> 00:59:46,280 AUDIENCE: You're skipping pages. 1309 00:59:46,280 --> 00:59:46,610 DAVID J. MALAN: Yeah. 1310 00:59:46,610 --> 00:59:48,060 So I'm skipping every other page. 1311 00:59:48,060 --> 00:59:53,480 So if I don't consider that, and I find myself in like the I section or the J 1312 00:59:53,480 --> 00:59:56,120 section, well, I might accidentally conclude, 1313 00:59:56,120 --> 00:59:59,755 nope, I haven't found John Harvard yet, just because I skipped him, because it 1314 00:59:59,755 --> 01:00:01,130 was sandwiched between two pages. 1315 01:00:01,130 --> 01:00:04,700 Now, I can fix this, I think, if I do hit the I section, 1316 01:00:04,700 --> 01:00:08,100 well, let me just double back one page, just in case he was in that last page. 1317 01:00:08,100 --> 01:00:12,277 So it's recoverable, but it's almost twice as fast, minus that hiccup there. 1318 01:00:12,277 --> 01:00:14,360 But what most of us would do, and what your phones 1319 01:00:14,360 --> 01:00:16,395 are doing, albeit digitally, is they open up 1320 01:00:16,395 --> 01:00:18,020 roughly to the middle of the phonebook. 1321 01:00:18,020 --> 01:00:21,747 And they look down, and they say, oh, I'm in roughly the M section. 1322 01:00:21,747 --> 01:00:24,080 So I'm roughly halfway through the 1,000-page phonebook. 1323 01:00:24,080 --> 01:00:26,510 But what do I now know about John Harvard? 1324 01:00:26,510 --> 01:00:29,820 Where is he, to my left or to my right? 1325 01:00:29,820 --> 01:00:30,320 All right. 1326 01:00:30,320 --> 01:00:32,810 So alphabetically, he's presumably to my left, 1327 01:00:32,810 --> 01:00:37,340 and so here I can, both metaphorically and physically, 1328 01:00:37,340 --> 01:00:39,950 tear the problem in half. 1329 01:00:39,950 --> 01:00:41,330 You don't need to be impressed. 1330 01:00:41,330 --> 01:00:43,280 It's really easy down the spine that way, 1331 01:00:43,280 --> 01:00:46,460 but I know that John Harvard is to the left here. 1332 01:00:46,460 --> 01:00:51,500 But now I can throw, unnecessarily dramatically, half and page one out 1333 01:00:51,500 --> 01:00:53,810 of the way, and what do I now know? 1334 01:00:53,810 --> 01:00:55,910 I've gone from 1,000 pages to like 500. 1335 01:00:55,910 --> 01:00:57,602 I can repeat roughly the same algorithm. 1336 01:00:57,602 --> 01:01:00,560 Go to the half of this, and so this time, I went back a little too far. 1337 01:01:00,560 --> 01:01:03,150 I'm in now the E section. 1338 01:01:03,150 --> 01:01:04,040 So what do I know? 1339 01:01:04,040 --> 01:01:07,490 Is John Harvard to my left or to my right? 1340 01:01:07,490 --> 01:01:09,950 To my right, so I can, again, tear the problem in half. 1341 01:01:09,950 --> 01:01:12,800 Throw this half away, and now I'm really flying. 1342 01:01:12,800 --> 01:01:17,180 I'm doing it verbally slowly, but that went from 1,000 pages to 500 1343 01:01:17,180 --> 01:01:18,380 to now 250. 1344 01:01:18,380 --> 01:01:20,960 And now I can do it again, 125. 1345 01:01:20,960 --> 01:01:25,160 I do it again, roughly like 67, and keep doing it again and again and again, 1346 01:01:25,160 --> 01:01:29,840 until I get left with, hopefully, just one single page or in this case 1347 01:01:29,840 --> 01:01:32,210 an ad for, ironically, a mechanic. 1348 01:01:32,210 --> 01:01:36,620 OK, so what is the implication for our performance? 1349 01:01:36,620 --> 01:01:39,590 Well, let's just do this sort of in the abstract, if you will, 1350 01:01:39,590 --> 01:01:43,250 if that first algorithm were to be plotted just quickly on a chart 1351 01:01:43,250 --> 01:01:44,340 without even numbers. 1352 01:01:44,340 --> 01:01:47,340 Here's my x-axis, size of problem on the x-axis. 1353 01:01:47,340 --> 01:01:49,760 So the bigger the problem, the farther out that way. 1354 01:01:49,760 --> 01:01:51,200 Time to solve the problem. 1355 01:01:51,200 --> 01:01:55,530 The higher you go up on the y-axis, the more time you're taking to solve it. 1356 01:01:55,530 --> 01:01:58,190 How would we draw the running time, the amount of time 1357 01:01:58,190 --> 01:01:59,850 taken to run that first algorithm? 1358 01:01:59,850 --> 01:02:01,010 Well, it's going to be a straight line. 1359 01:02:01,010 --> 01:02:01,520 Why? 1360 01:02:01,520 --> 01:02:03,485 Because if you add one more page next year 1361 01:02:03,485 --> 01:02:05,360 because more people move to Cambridge, you're 1362 01:02:05,360 --> 01:02:07,790 going to add one more page turn potentially, so 1363 01:02:07,790 --> 01:02:09,790 one more second, one more unit of time. 1364 01:02:09,790 --> 01:02:10,790 So it's a straight line. 1365 01:02:10,790 --> 01:02:12,207 And we'll abstract it away as "n." 1366 01:02:12,207 --> 01:02:15,560 If there's n pages in the phone book, the slope of this line 1367 01:02:15,560 --> 01:02:16,640 is essentially n. 1368 01:02:16,640 --> 01:02:20,180 The second algorithm, wherein I was doing two pages at a time, 1369 01:02:20,180 --> 01:02:22,970 was twice as fast, but it's still a straight line. 1370 01:02:22,970 --> 01:02:25,190 And in fact, let me just draw some dotted lines here. 1371 01:02:25,190 --> 01:02:28,310 If the phone book is this big, with my first algorithm, 1372 01:02:28,310 --> 01:02:32,990 it might take this many units of time, this many steps, this many page turns. 1373 01:02:32,990 --> 01:02:37,430 But with that second algorithm, notice that the intersection is much lower 1374 01:02:37,430 --> 01:02:39,260 on the yellow line than on the red. 1375 01:02:39,260 --> 01:02:42,170 So n over 2 means there's half as many pages here, 1376 01:02:42,170 --> 01:02:43,517 if n is the number of pages. 1377 01:02:43,517 --> 01:02:45,350 So indeed, that algorithm-- the second one-- 1378 01:02:45,350 --> 01:02:49,530 is twice as fast minus the little hiccup that I have to double back one page. 1379 01:02:49,530 --> 01:02:53,000 But that's not a big deal if I'm still doing things twice as fast. 1380 01:02:53,000 --> 01:02:55,340 But the third algorithm looks fundamentally different. 1381 01:02:55,340 --> 01:02:56,300 It looks like this. 1382 01:02:56,300 --> 01:02:58,970 Logarithms, if you recall from high school or prior-- 1383 01:02:58,970 --> 01:03:00,320 if you don't, that's fine too. 1384 01:03:00,320 --> 01:03:03,900 It's just a fundamentally different function, a different shape. 1385 01:03:03,900 --> 01:03:05,870 And notice that the green line is going up 1386 01:03:05,870 --> 01:03:11,060 and up and up but a much slower rate of increase, which means crazy things 1387 01:03:11,060 --> 01:03:11,720 are possible. 1388 01:03:11,720 --> 01:03:14,270 If two towns in Massachusetts, like Cambridge and Allston, 1389 01:03:14,270 --> 01:03:18,560 across the river, merge next year, for instance, in terms of their phone book, 1390 01:03:18,560 --> 01:03:20,890 they're phone book just got twice as big. 1391 01:03:20,890 --> 01:03:23,740 For the first algorithm, that's going to take me twice as many steps 1392 01:03:23,740 --> 01:03:24,550 to go through. 1393 01:03:24,550 --> 01:03:28,390 The second algorithm, almost it's going to take me 50% more steps 1394 01:03:28,390 --> 01:03:29,780 to go through, two at a time. 1395 01:03:29,780 --> 01:03:33,010 But the third algorithm, that I ended with, tearing things again and again, 1396 01:03:33,010 --> 01:03:36,190 dividing and conquering, if you will, in half and in half and in half, 1397 01:03:36,190 --> 01:03:38,650 how many more steps will my third algorithm 1398 01:03:38,650 --> 01:03:42,965 take if Cambridge and Allston merge into a phone book that's twice as big? 1399 01:03:42,965 --> 01:03:43,840 AUDIENCE: Four steps. 1400 01:03:43,840 --> 01:03:45,590 DAVID J. MALAN: Just one more step, right? 1401 01:03:45,590 --> 01:03:46,160 No big deal. 1402 01:03:46,160 --> 01:03:48,243 You just take a really big bite out of the problem 1403 01:03:48,243 --> 01:03:50,960 once you decide if John Harvard is to the left or to the right. 1404 01:03:50,960 --> 01:03:53,470 And so you've made much faster progress. 1405 01:03:53,470 --> 01:03:56,800 And so this, in essence, is what your computer, your phone 1406 01:03:56,800 --> 01:04:00,730 is probably doing underneath the hood when searching for Harry or Hermione 1407 01:04:00,730 --> 01:04:04,090 or Hagrid or anyone else because it's that much faster, 1408 01:04:04,090 --> 01:04:05,590 especially when you have large data. 1409 01:04:05,590 --> 01:04:07,632 If you don't have that many contacts, it probably 1410 01:04:07,632 --> 01:04:11,318 doesn't matter if you search from top to bottom or more 1411 01:04:11,318 --> 01:04:13,360 in the form of this divide-and-conquer algorithm. 1412 01:04:13,360 --> 01:04:16,600 But if you're the Googles of the world or you're analyzing large data sets, 1413 01:04:16,600 --> 01:04:18,920 indeed, this is going to add up quite quickly. 1414 01:04:18,920 --> 01:04:20,420 So where do we go with this? 1415 01:04:20,420 --> 01:04:23,140 Well, we're going to introduce next something called pseudocode. 1416 01:04:23,140 --> 01:04:25,630 How can I translate what I did verbally there, 1417 01:04:25,630 --> 01:04:27,673 sort of intuitively, to actual code? 1418 01:04:27,673 --> 01:04:28,840 Well, this won't be Scratch. 1419 01:04:28,840 --> 01:04:30,830 This won't be C or Python just yet. 1420 01:04:30,830 --> 01:04:32,840 It's just going to be an English-like syntax. 1421 01:04:32,840 --> 01:04:35,530 And this is how many programmers would start solving a problem. 1422 01:04:35,530 --> 01:04:38,763 They don't start typing out code in C or Python or the like. 1423 01:04:38,763 --> 01:04:40,930 They use English or whatever their human language is 1424 01:04:40,930 --> 01:04:43,210 to jot down an outline for their ideas. 1425 01:04:43,210 --> 01:04:45,700 My first step, really, was picking up the phone book. 1426 01:04:45,700 --> 01:04:48,790 My second step was opening to the middle of the phone book. 1427 01:04:48,790 --> 01:04:52,570 My third step was somewhat different-- look at the page, because why? 1428 01:04:52,570 --> 01:04:57,670 My fourth step was if person I'm looking for is on the page, I then do what? 1429 01:04:57,670 --> 01:05:00,820 It never happened in my example, but I call the person. 1430 01:05:00,820 --> 01:05:01,960 So I'm done. 1431 01:05:01,960 --> 01:05:04,750 Else if the person is earlier in the book 1432 01:05:04,750 --> 01:05:08,830 alphabetically, as John Harvard was in the case of my H, then 1433 01:05:08,830 --> 01:05:12,460 I should search to the middle of the left of the phone book. 1434 01:05:12,460 --> 01:05:15,800 And then I should go back to step three. 1435 01:05:15,800 --> 01:05:18,820 Step 3 is look at the page, thereby repeating the same process 1436 01:05:18,820 --> 01:05:19,540 again and again. 1437 01:05:19,540 --> 01:05:22,960 Step 9, though, might be else if the person is later in the book, 1438 01:05:22,960 --> 01:05:25,960 then let's go ahead and open to the middle of the right half of the book 1439 01:05:25,960 --> 01:05:29,050 and then go back to line 3. 1440 01:05:29,050 --> 01:05:32,350 Else there's a fourth scenario we should probably consider, 1441 01:05:32,350 --> 01:05:36,520 lest my search process freeze or crash or give me one of those spinning beach 1442 01:05:36,520 --> 01:05:37,750 balls with a bug. 1443 01:05:37,750 --> 01:05:38,470 Yeah-- 1444 01:05:38,470 --> 01:05:39,580 AUDIENCE: [INAUDIBLE] 1445 01:05:39,580 --> 01:05:41,620 DAVID J. MALAN: Yeah, what if John Harvard isn't in the phone book? 1446 01:05:41,620 --> 01:05:44,438 I'd prefer that my algorithm, my phone not just reboot or freeze. 1447 01:05:44,438 --> 01:05:46,480 I should handle that with some kind of catch all. 1448 01:05:46,480 --> 01:05:49,420 Else, so to speak, let's just quit the program. 1449 01:05:49,420 --> 01:05:54,340 So there's well-defined behavior for every possible scenario of the four. 1450 01:05:54,340 --> 01:05:56,470 Now, let's call out a few of these salient terms. 1451 01:05:56,470 --> 01:05:58,390 It turns out, if I highlight in yellow here, 1452 01:05:58,390 --> 01:06:00,620 there's a pattern to what I've been doing here. 1453 01:06:00,620 --> 01:06:02,050 These are all of my English verbs. 1454 01:06:02,050 --> 01:06:05,410 And in a moment, we're going to start calling those verbs "functions." 1455 01:06:05,410 --> 01:06:09,280 When you program or write code and you want the program or the computer 1456 01:06:09,280 --> 01:06:11,980 to do something for you, some action or verb, 1457 01:06:11,980 --> 01:06:14,020 we're going to refer to those actions or verbs 1458 01:06:14,020 --> 01:06:16,510 as these things called "functions," like those here. 1459 01:06:16,510 --> 01:06:18,640 By contrast, I've just highlighted, instead, 1460 01:06:18,640 --> 01:06:20,950 my "if," my "else if," my "else if," and "else." 1461 01:06:20,950 --> 01:06:22,990 This is going to represent what we're going 1462 01:06:22,990 --> 01:06:26,590 to start calling a "conditional," a proverbial fork in the road where 1463 01:06:26,590 --> 01:06:29,860 you can either go this way or that way, do this thing or this other thing. 1464 01:06:29,860 --> 01:06:32,320 And you're going to decide which of those things 1465 01:06:32,320 --> 01:06:35,740 to do based on what I've now highlighted here, which are going 1466 01:06:35,740 --> 01:06:38,230 to be called "Boolean expressions"-- 1467 01:06:38,230 --> 01:06:41,260 Boole, referring to a mathematician, last name Boole. 1468 01:06:41,260 --> 01:06:47,140 A Boolean expression is just a question with a yes/no, a true/false, a 1 or a 0 1469 01:06:47,140 --> 01:06:47,980 answer, if you will. 1470 01:06:47,980 --> 01:06:51,790 And it governs whether you do this thing or this thing or this thing or that. 1471 01:06:51,790 --> 01:06:54,440 The indentation, in this case, is important. 1472 01:06:54,440 --> 01:06:59,020 The fact that I've indented line 5 implies, by convention in programming, 1473 01:06:59,020 --> 01:07:03,610 that I should only do line 5 if the answer to line 4 is a yes or a true, 1474 01:07:03,610 --> 01:07:06,410 and same for these other indented lines as well. 1475 01:07:06,410 --> 01:07:09,492 And the last characteristic here is this here. 1476 01:07:09,492 --> 01:07:11,200 Someone called this out earlier, in fact. 1477 01:07:11,200 --> 01:07:15,580 These lines, 8 and 11, are now highlighted and represent what? 1478 01:07:15,580 --> 01:07:18,790 What might we call these in code if you've done-- 1479 01:07:18,790 --> 01:07:21,340 yeah, so these are loops, some kind of cycles 1480 01:07:21,340 --> 01:07:24,820 that result in my doing the same thing again and again, 1481 01:07:24,820 --> 01:07:28,240 but there's a key detail with this algorithm in pseudocode. 1482 01:07:28,240 --> 01:07:31,200 Even though it's telling me to go back to line 3, 1483 01:07:31,200 --> 01:07:34,750 why is this algorithm eventually going to stop? 1484 01:07:34,750 --> 01:07:37,600 Why do I not constantly keep looking for John Harvard 1485 01:07:37,600 --> 01:07:43,010 forever by nature of these loops telling me to keep going back to line 3? 1486 01:07:43,010 --> 01:07:43,580 Good. 1487 01:07:43,580 --> 01:07:48,590 Eventually, he'll be on the page or, to your point earlier, he won't be at all 1488 01:07:48,590 --> 01:07:51,260 and we're out of pages, and so we just quit. 1489 01:07:51,260 --> 01:07:54,050 And that's the key about going to the left half or the right half. 1490 01:07:54,050 --> 01:07:56,430 It doesn't matter if you do the same thing again and again. 1491 01:07:56,430 --> 01:07:58,847 You're not going to get stuck in a so-called infinite loop 1492 01:07:58,847 --> 01:08:02,750 so long as you keep dividing the problem and shrinking it into something 1493 01:08:02,750 --> 01:08:03,890 smaller, smaller, smaller. 1494 01:08:03,890 --> 01:08:06,570 Eventually, there's going to be no problem left to solve. 1495 01:08:06,570 --> 01:08:09,110 So even if you don't think of yourself as a computer person, 1496 01:08:09,110 --> 01:08:12,140 even if you've never written code, what you'll find in the coming days 1497 01:08:12,140 --> 01:08:15,920 is that these ideas that we've just kind of harnessed from real life 1498 01:08:15,920 --> 01:08:18,080 are at your fingertips already. 1499 01:08:18,080 --> 01:08:20,090 And a lot of the process of learning to code 1500 01:08:20,090 --> 01:08:22,819 is just going to be some bumps in the road 1501 01:08:22,819 --> 01:08:25,880 because you can't quite see the new syntax in a familiar way. 1502 01:08:25,880 --> 01:08:28,005 But you'll find that the ideas, in fact, are 1503 01:08:28,005 --> 01:08:30,380 going to be more familiar than you might otherwise think. 1504 01:08:30,380 --> 01:08:32,540 And so we'll see in a bit-- and we'll take a break 1505 01:08:32,540 --> 01:08:35,000 in a moment to take a breather-- that you 1506 01:08:35,000 --> 01:08:38,240 will see these same ideas in a moment in the context of Scratch, 1507 01:08:38,240 --> 01:08:40,850 an actual programming language via which we'll drag and drop 1508 01:08:40,850 --> 01:08:42,743 puzzle pieces to make actual code work. 1509 01:08:42,743 --> 01:08:44,660 We'll see some variants of these ideas, things 1510 01:08:44,660 --> 01:08:47,040 called "arguments" and "return values" and "variables." 1511 01:08:47,040 --> 01:08:50,660 But we'll ultimately convert it into this somehow. 1512 01:08:50,660 --> 01:08:53,689 Anyone want to wager what this program will 1513 01:08:53,689 --> 01:08:56,810 do if fed to your Mac or PC or phone? 1514 01:08:56,810 --> 01:08:59,976 Here's just a massive pattern of zeros and ones. 1515 01:08:59,976 --> 01:09:01,200 AUDIENCE: [INAUDIBLE] 1516 01:09:01,200 --> 01:09:04,158 DAVID J. MALAN: It will indeed say, rather disappointingly, apparently, 1517 01:09:04,158 --> 01:09:05,370 just, "Hello, world." 1518 01:09:05,370 --> 01:09:11,250 And indeed, baked into all of these 0's and 1's are not just the H-E-L-L-O, 1519 01:09:11,250 --> 01:09:15,750 but also the verbs, the action of printing something to the screen. 1520 01:09:15,750 --> 01:09:18,555 And there's other stuff too so that the program knows how to start 1521 01:09:18,555 --> 01:09:20,430 and how to stop, a lot of stuff that we won't 1522 01:09:20,430 --> 01:09:23,370 have to worry about, that whoever designed the computer or the language 1523 01:09:23,370 --> 01:09:23,870 did. 1524 01:09:23,870 --> 01:09:25,830 But at the end of the day, you're never going 1525 01:09:25,830 --> 01:09:28,050 to be writing the 0's and 1's yourselves, 1526 01:09:28,050 --> 01:09:31,319 though our ancestors, once upon a time, did in some form. 1527 01:09:31,319 --> 01:09:35,189 We'll be using a much higher-level language, like this in C, 1528 01:09:35,189 --> 01:09:39,189 or better yet, in just a moment, like in Scratch, like this. 1529 01:09:39,189 --> 01:09:42,600 And indeed, this is why today we focus on and begin 1530 01:09:42,600 --> 01:09:45,160 with Scratch, this graphical programming language, 1531 01:09:45,160 --> 01:09:49,140 so we have a way of expressing ourselves with functions, conditionals, loops, 1532 01:09:49,140 --> 01:09:52,852 and more, but in a way that doesn't have stupid parentheses and curly braces 1533 01:09:52,852 --> 01:09:54,810 and all of these visual distractions in the way 1534 01:09:54,810 --> 01:09:57,720 and will translate that thereafter to this lower-level language. 1535 01:09:57,720 --> 01:09:59,027 But for now, that was a lot. 1536 01:09:59,027 --> 01:10:00,360 That was definitely a fire hose. 1537 01:10:00,360 --> 01:10:01,990 Let's go ahead and take a 10-minute break. 1538 01:10:01,990 --> 01:10:03,365 Feel free to get up or stay here. 1539 01:10:03,365 --> 01:10:06,755 And we'll resume in a bit with some actual code. 1540 01:10:06,755 --> 01:10:07,422 [VIDEO PLAYBACK] 1541 01:10:07,422 --> 01:10:11,374 [MUSIC - THE WEATHER GIRLS, "IT'S RAINING MEN"] [MUSIC PLAYING] 1542 01:10:11,374 --> 01:10:13,844 [THUNDER RUMBLING] 1543 01:10:13,844 --> 01:10:35,505 1544 01:10:35,505 --> 01:10:36,130 - (SINGING) Hi. 1545 01:10:36,130 --> 01:10:37,000 Hi. 1546 01:10:37,000 --> 01:10:41,491 We're your Weather Girls, and have we got news for you. 1547 01:10:41,491 --> 01:10:42,485 You better listen. 1548 01:10:42,485 --> 01:10:45,540 Get ready, all you lonely girls. 1549 01:10:45,540 --> 01:10:47,940 And leave those umbrellas at home. 1550 01:10:47,940 --> 01:10:49,217 All right. 1551 01:10:49,217 --> 01:10:51,140 Humidity is rising. 1552 01:10:51,140 --> 01:10:52,912 Hmm, rising. 1553 01:10:52,912 --> 01:10:54,460 Barometer's getting low. 1554 01:10:54,460 --> 01:10:56,034 How low, girl? 1555 01:10:56,034 --> 01:10:58,280 According to all sources-- 1556 01:10:58,280 --> 01:11:01,600 what sources, now-- the street's the place to go. 1557 01:11:01,600 --> 01:11:02,880 We better hurry up. 1558 01:11:02,880 --> 01:11:09,147 'Cause tonight, for the first time, just about half-past 10:00-- 1559 01:11:09,147 --> 01:11:13,736 half-past 10:00-- for the first time in history, 1560 01:11:13,736 --> 01:11:18,100 it's going to start raining men-- start raining men! 1561 01:11:18,100 --> 01:11:21,650 It's raining men, hallelujah! 1562 01:11:21,650 --> 01:11:25,780 It's raining men, amen! 1563 01:11:25,780 --> 01:11:27,505 I'm going to go out. 1564 01:11:27,505 --> 01:11:33,920 I'm going to let myself get absolutely soaking wet! 1565 01:11:33,920 --> 01:11:37,045 It's raining men, hallelujah! 1566 01:11:37,045 --> 01:11:38,795 DAVID J. MALAN: [CHUCKLES] All right, so-- 1567 01:11:38,795 --> 01:11:39,378 [END PLAYBACK] 1568 01:11:39,378 --> 01:11:41,400 [APPLAUSE] 1569 01:11:41,400 --> 01:11:43,720 1570 01:11:43,720 --> 01:11:47,560 So this then is Scratch, a graphical programming language from our friends 1571 01:11:47,560 --> 01:11:49,897 down the road at MIT's Media Lab that indeed some of you 1572 01:11:49,897 --> 01:11:51,730 might have used in grade school or the like, 1573 01:11:51,730 --> 01:11:53,800 for playing and writing code and the like, 1574 01:11:53,800 --> 01:11:57,820 but you maybe didn't necessarily think about how some of these primitives 1575 01:11:57,820 --> 01:11:58,630 ultimately worked. 1576 01:11:58,630 --> 01:12:01,600 And in fact, everything you've done-- if you've used Scratch before-- 1577 01:12:01,600 --> 01:12:05,245 and everything you'll see today is going to apply to all of the weeks to come, 1578 01:12:05,245 --> 01:12:07,120 as we explore these things called "functions" 1579 01:12:07,120 --> 01:12:09,820 and "loops" and "conditionals," "Boolean expressions" and more. 1580 01:12:09,820 --> 01:12:12,940 With Scratch, because it's so graphical and animated-congruent, 1581 01:12:12,940 --> 01:12:17,080 can you create animations, like this one, interactive art, and software 1582 01:12:17,080 --> 01:12:17,860 more generally. 1583 01:12:17,860 --> 01:12:20,170 But you'll do so by dragging and dropping 1584 01:12:20,170 --> 01:12:23,990 puzzle pieces that only lock together if it makes logical sense to do so. 1585 01:12:23,990 --> 01:12:26,770 And you won't have to deal with, in this first week of class, 1586 01:12:26,770 --> 01:12:30,400 is curly braces, parentheses, all of the weird symbology 1587 01:12:30,400 --> 01:12:33,460 that you might recall seeing, when we just wanted to say, "Hello, world." 1588 01:12:33,460 --> 01:12:35,980 Now, this particular program, "Raining Men," 1589 01:12:35,980 --> 01:12:39,340 was written by a former CS50 teaching fellow, Andrew Berry, 1590 01:12:39,340 --> 01:12:41,860 who's actually now the general manager of the Cleveland 1591 01:12:41,860 --> 01:12:43,730 Browns, the American football team. 1592 01:12:43,730 --> 01:12:45,820 And so these are just some of the programs 1593 01:12:45,820 --> 01:12:48,400 that some of your predecessors in the class have created. 1594 01:12:48,400 --> 01:12:51,670 And you'll see, in the remainder of class here, a couple of others 1595 01:12:51,670 --> 01:12:56,170 as well, and more in the course's first assignment, namely, problem set zero. 1596 01:12:56,170 --> 01:12:57,470 So how do we get there? 1597 01:12:57,470 --> 01:13:00,040 Well, first a quick tour of what it is we're going to do. 1598 01:13:00,040 --> 01:13:03,523 This, in Scratch, is perhaps the simplest program you can write. 1599 01:13:03,523 --> 01:13:06,565 And even if you've never seen Scratch or any programming language before, 1600 01:13:06,565 --> 01:13:09,970 you can probably guess that this just says, on the screen somehow, 1601 01:13:09,970 --> 01:13:10,940 "Hello, World." 1602 01:13:10,940 --> 01:13:14,470 But what you don't have to do is type esoteric commands and weird syntax, 1603 01:13:14,470 --> 01:13:16,720 those curly braces and parentheses I keep alluding to. 1604 01:13:16,720 --> 01:13:18,970 You just drag this yellow puzzle piece. 1605 01:13:18,970 --> 01:13:20,530 You drag this purple puzzle piece. 1606 01:13:20,530 --> 01:13:22,810 Let them magnetically lock together, so to speak. 1607 01:13:22,810 --> 01:13:24,430 Click a button and boom. 1608 01:13:24,430 --> 01:13:27,010 With those same building blocks and several others, 1609 01:13:27,010 --> 01:13:31,010 can you make exactly the sorts of things that Andrew brought to life as well. 1610 01:13:31,010 --> 01:13:32,740 So here's what we're about to see. 1611 01:13:32,740 --> 01:13:38,500 At Scratch.MIT.edu is a cloud-based programming environment on MIT servers. 1612 01:13:38,500 --> 01:13:41,380 You can also download it offline on your own Mac or PC. 1613 01:13:41,380 --> 01:13:43,870 And it gives you an interface like this. 1614 01:13:43,870 --> 01:13:47,770 On the left-hand side of the screen, you'll see a blocks palette. 1615 01:13:47,770 --> 01:13:51,100 These puzzle pieces, a.k.a. blocks, come in different colors 1616 01:13:51,100 --> 01:13:52,540 which rather categorize them. 1617 01:13:52,540 --> 01:13:54,730 So pictured here, for instance, in blue, are 1618 01:13:54,730 --> 01:13:57,040 a whole bunch of motion-related blocks. 1619 01:13:57,040 --> 01:14:00,100 So Andrew used a whole bunch of those to have the singer and the men 1620 01:14:00,100 --> 01:14:02,950 moving around on the screen in synchronicity 1621 01:14:02,950 --> 01:14:05,110 with the song that was playing in the background. 1622 01:14:05,110 --> 01:14:09,310 Meanwhile, in the middle of this interface is going to be the code area. 1623 01:14:09,310 --> 01:14:12,100 And this is where Andrew, and soon you, will drag and drop 1624 01:14:12,100 --> 01:14:14,450 some of those puzzle pieces and other colors as well 1625 01:14:14,450 --> 01:14:17,560 and lock them together to get your character-- soon 1626 01:14:17,560 --> 01:14:20,110 to be invented-- to do something on the screen. 1627 01:14:20,110 --> 01:14:23,380 Indeed, at the bottom right here, will you see, ultimately, 1628 01:14:23,380 --> 01:14:26,260 a sprite area, where a sprite is a technical term 1629 01:14:26,260 --> 01:14:29,650 for like a character in a video game or a programming environment like this. 1630 01:14:29,650 --> 01:14:34,645 By default, historically, Scratch is the cat, the mascot, if you will, 1631 01:14:34,645 --> 01:14:36,020 for this programming environment. 1632 01:14:36,020 --> 01:14:38,110 And so here we see, by default, just one sprite 1633 01:14:38,110 --> 01:14:42,490 selected because on the top right of the screen is the stage for that sprite. 1634 01:14:42,490 --> 01:14:45,310 And you can click and zoom in to make it full screen. 1635 01:14:45,310 --> 01:14:47,350 But this is the world in which Scratch-- 1636 01:14:47,350 --> 01:14:49,120 by default, the cat-- will live. 1637 01:14:49,120 --> 01:14:52,960 But you can change Scratch's costume so that it looks like a singer or the man 1638 01:14:52,960 --> 01:14:55,185 falling from the sky or the like or anything else, 1639 01:14:55,185 --> 01:14:58,060 either creating the art yourself or importing some of the things that 1640 01:14:58,060 --> 01:15:00,260 come with it or elsewhere online. 1641 01:15:00,260 --> 01:15:03,640 So what is this world that Scratch rather lives in? 1642 01:15:03,640 --> 01:15:06,610 Well, generally speaking, we won't have to care too much about numbers 1643 01:15:06,610 --> 01:15:09,820 because we'll be able to ask questions, like interactive ones, 1644 01:15:09,820 --> 01:15:12,040 like is Scratch the cat, or any character 1645 01:15:12,040 --> 01:15:15,520 otherwise, touching the edge of the screen, touching something else? 1646 01:15:15,520 --> 01:15:20,560 But Scratch does exist in this two-dimensional coordinate-system 1647 01:15:20,560 --> 01:15:21,080 world. 1648 01:15:21,080 --> 01:15:24,010 So when the cat or any character is dead center in the middle, 1649 01:15:24,010 --> 01:15:27,700 that would be xy location 0,0, if you will. 1650 01:15:27,700 --> 01:15:32,990 Meanwhile, over here is 240 pixels, or dots, all the way to the right. 1651 01:15:32,990 --> 01:15:37,700 So this would be 240,0, where y is 0 because it's right on that midline. 1652 01:15:37,700 --> 01:15:39,460 So it's neither up or below. 1653 01:15:39,460 --> 01:15:43,330 Over here to the left, of course, would be -240 and 0. 1654 01:15:43,330 --> 01:15:45,910 Above the cat would be x equals 0, because it's 1655 01:15:45,910 --> 01:15:48,880 right on that vertical midline, and 180. 1656 01:15:48,880 --> 01:15:52,152 And then down here, as you might guess, would be 0, negative 180. 1657 01:15:52,152 --> 01:15:53,860 Generally speaking, we don't have to care 1658 01:15:53,860 --> 01:15:55,733 about those precise pixel coordinates. 1659 01:15:55,733 --> 01:15:58,900 But it's helpful, ultimately, if you do want the cat to move up, down, left, 1660 01:15:58,900 --> 01:15:59,400 or right. 1661 01:15:59,400 --> 01:16:03,130 Having some sense of direction according to the x-axis and y-axis 1662 01:16:03,130 --> 01:16:06,010 as well can help you express your ideas, ultimately. 1663 01:16:06,010 --> 01:16:08,680 So what might some of those ideas be? 1664 01:16:08,680 --> 01:16:09,950 Well, let's do this. 1665 01:16:09,950 --> 01:16:15,340 I'm going to go ahead and create, on Scratch.MIT.edu, just 1666 01:16:15,340 --> 01:16:18,293 an empty screen like this one here. 1667 01:16:18,293 --> 01:16:19,960 And so this is the exact same interface. 1668 01:16:19,960 --> 01:16:24,490 But now I'm in my browser, full screen, so that I can start writing some code. 1669 01:16:24,490 --> 01:16:27,222 And let's get that cat to say something actually on the screen. 1670 01:16:27,222 --> 01:16:28,930 Now, this takes a little bit of practice. 1671 01:16:28,930 --> 01:16:32,200 But honestly, just by scrolling through these puzzle pieces can 1672 01:16:32,200 --> 01:16:35,830 you quickly get a sense of what's possible, not just categorically, 1673 01:16:35,830 --> 01:16:36,538 but specifically. 1674 01:16:36,538 --> 01:16:39,163 And I'll jump around because I've done this, of course, before. 1675 01:16:39,163 --> 01:16:41,410 But I'm going to go to events, in yellow, first. 1676 01:16:41,410 --> 01:16:44,080 And I'm going to drag and drop this first block, called 1677 01:16:44,080 --> 01:16:45,475 when Green Flag clicked. 1678 01:16:45,475 --> 01:16:48,100 And I've zoomed in there just to make it a little more legible. 1679 01:16:48,100 --> 01:16:50,380 And notice that the shape of this Green Flag 1680 01:16:50,380 --> 01:16:54,070 just so happens to mirror this Green Flag here 1681 01:16:54,070 --> 01:16:57,070 at top, next to this red Stop Sign, of sorts. 1682 01:16:57,070 --> 01:16:59,800 And the Green Flag is going to mean go and the red Stop Sign 1683 01:16:59,800 --> 01:17:02,320 is going to mean stop, to start or stop our program. 1684 01:17:02,320 --> 01:17:05,320 Next week, you're going to be writing a textual command at your keyboard 1685 01:17:05,320 --> 01:17:06,560 to do the exact same idea. 1686 01:17:06,560 --> 01:17:07,790 But for now, it's a button. 1687 01:17:07,790 --> 01:17:10,667 So when Green Flag clicked, what do I want Scratch to do? 1688 01:17:10,667 --> 01:17:13,750 Well, how about we have Scratch just initially say something like, "Hello, 1689 01:17:13,750 --> 01:17:16,960 world," which indeed, historically, is the first program 1690 01:17:16,960 --> 01:17:18,790 that most any programmer might write. 1691 01:17:18,790 --> 01:17:22,090 So anything related to what the cat looks like it's doing 1692 01:17:22,090 --> 01:17:24,490 is actually going to be under looks, here in purple. 1693 01:17:24,490 --> 01:17:27,100 So I'm going to drag over Say "hello." 1694 01:17:27,100 --> 01:17:30,820 And you'll notice something curious and different about this purple block. 1695 01:17:30,820 --> 01:17:33,400 It says, of course, "Say" in purple. 1696 01:17:33,400 --> 01:17:37,450 But then there's this white oval and some text that, by default, is "hello" 1697 01:17:37,450 --> 01:17:40,180 because MIT just decided that, by default, the placeholder will 1698 01:17:40,180 --> 01:17:40,810 be "hello." 1699 01:17:40,810 --> 01:17:42,940 But anytime you see this white oval, it's 1700 01:17:42,940 --> 01:17:48,790 an opportunity to provide an input into the function called Say. 1701 01:17:48,790 --> 01:17:50,980 And so here I'm borrowing terminology from before. 1702 01:17:50,980 --> 01:17:54,280 Problem solving, again, is all about inputs producing outputs. 1703 01:17:54,280 --> 01:17:56,045 And in between there is some algorithm. 1704 01:17:56,045 --> 01:17:58,420 In a moment, we're going to start referring to algorithms 1705 01:17:58,420 --> 01:18:00,470 quite frequently as "functions." 1706 01:18:00,470 --> 01:18:00,970 Why? 1707 01:18:00,970 --> 01:18:03,350 Because it's the implementation of some algorithm. 1708 01:18:03,350 --> 01:18:06,640 So let me override the default with, "Hello, world." 1709 01:18:06,640 --> 01:18:07,690 I'll zoom out. 1710 01:18:07,690 --> 01:18:11,260 And now if I go to the top right of the screen and click the Green Flag, 1711 01:18:11,260 --> 01:18:15,310 we'll see, hopefully, my very first program in code. 1712 01:18:15,310 --> 01:18:17,190 Now, it wasn't a huge lift, right? 1713 01:18:17,190 --> 01:18:19,690 It only was a matter of dragging and dropping puzzle pieces. 1714 01:18:19,690 --> 01:18:21,070 But what has now happened? 1715 01:18:21,070 --> 01:18:23,530 Well, it turns out that two things have happened. 1716 01:18:23,530 --> 01:18:26,710 When I, the human, clicked on that Green Flag, 1717 01:18:26,710 --> 01:18:29,570 I triggered, what we're going to start calling now, an "event." 1718 01:18:29,570 --> 01:18:32,800 An event is generally something graphical or interactive that 1719 01:18:32,800 --> 01:18:34,580 just happens in a computer program. 1720 01:18:34,580 --> 01:18:37,600 You and I trigger events on our phones all day long. 1721 01:18:37,600 --> 01:18:41,260 Whenever you tap or drag or long press or pinch 1722 01:18:41,260 --> 01:18:44,110 or any of those gestures in vogue nowadays on phones, 1723 01:18:44,110 --> 01:18:45,460 you are triggering events. 1724 01:18:45,460 --> 01:18:47,680 And people at Apple and Google and elsewhere 1725 01:18:47,680 --> 01:18:50,320 have written code that listen for those events 1726 01:18:50,320 --> 01:18:52,880 and do something when that event happens. 1727 01:18:52,880 --> 01:18:54,010 That's what I just did. 1728 01:18:54,010 --> 01:18:56,560 When Green Flag is clicked, I want something 1729 01:18:56,560 --> 01:19:01,150 to happen, namely, I want this purple function, this verb, this action called 1730 01:19:01,150 --> 01:19:02,910 Say, to do something. 1731 01:19:02,910 --> 01:19:03,910 What do I want it to do? 1732 01:19:03,910 --> 01:19:05,590 I want it to say what this input is. 1733 01:19:05,590 --> 01:19:07,900 And I'm going to introduce another vocabulary term. 1734 01:19:07,900 --> 01:19:11,350 The white ovals here are, yes, inputs, very generically. 1735 01:19:11,350 --> 01:19:13,660 But in a programmer's terminology, they're 1736 01:19:13,660 --> 01:19:16,080 called "arguments," otherwise known as "parameters." 1737 01:19:16,080 --> 01:19:17,830 And that just means an input to a function 1738 01:19:17,830 --> 01:19:20,050 that modifies its behavior in some way. 1739 01:19:20,050 --> 01:19:22,253 When I click Stop, that's just another event. 1740 01:19:22,253 --> 01:19:23,920 And that one is just built into Scratch. 1741 01:19:23,920 --> 01:19:26,740 Scratch knows that when you click the green Stop Sign, 1742 01:19:26,740 --> 01:19:28,490 everything should just stop automatically. 1743 01:19:28,490 --> 01:19:30,950 I don't have to write code to support that feature. 1744 01:19:30,950 --> 01:19:33,470 So that's all fine and good, "Hello, world." 1745 01:19:33,470 --> 01:19:36,880 But if I keep doing stop and start and stop and start, 1746 01:19:36,880 --> 01:19:39,130 it's going to do the same thing again and again. 1747 01:19:39,130 --> 01:19:41,650 And it's really not that interesting, at the end of the day, 1748 01:19:41,650 --> 01:19:45,350 maybe gratifying once, but it'd be nice if this were a little more interactive. 1749 01:19:45,350 --> 01:19:48,140 So it turns out that we can do that too. 1750 01:19:48,140 --> 01:19:50,450 But we need a different mental model instead. 1751 01:19:50,450 --> 01:19:53,740 So in this case here, when we think about this function, 1752 01:19:53,740 --> 01:19:56,230 Say, in this input, "Hello, world," this actually 1753 01:19:56,230 --> 01:19:58,300 maps pretty cleanly to this model earlier, 1754 01:19:58,300 --> 01:20:01,870 that I propose is problem solving, is computer science, if you will. 1755 01:20:01,870 --> 01:20:05,770 The input to the current problem is going to be in white here, 1756 01:20:05,770 --> 01:20:06,760 "Hello, world." 1757 01:20:06,760 --> 01:20:10,300 The algorithm is the "say" algorithm. 1758 01:20:10,300 --> 01:20:13,420 Now, I don't know how MIT got it to print out the little, pretty speech 1759 01:20:13,420 --> 01:20:14,330 bubble on the screen. 1760 01:20:14,330 --> 01:20:17,770 But they wrote those underlying low-level implementation details. 1761 01:20:17,770 --> 01:20:21,130 And they gave me and you a purple function, called Say, 1762 01:20:21,130 --> 01:20:22,630 that just does that for you. 1763 01:20:22,630 --> 01:20:24,670 You and I don't have to reinvent that wheel. 1764 01:20:24,670 --> 01:20:28,580 The output of Say is another technical term, now, called a "side effect." 1765 01:20:28,580 --> 01:20:31,570 A side effect is usually something visual that happens, 1766 01:20:31,570 --> 01:20:34,008 like as a side effect of you calling a function. 1767 01:20:34,008 --> 01:20:35,800 And so the side effect here is that the cat 1768 01:20:35,800 --> 01:20:39,800 has this speech bubble magically appear, inside of which is "Hello, world." 1769 01:20:39,800 --> 01:20:41,200 So we have an input. 1770 01:20:41,200 --> 01:20:42,370 We have an output. 1771 01:20:42,370 --> 01:20:43,540 We have an algorithm. 1772 01:20:43,540 --> 01:20:46,910 But now we're talking about these ideas in the context of programming. 1773 01:20:46,910 --> 01:20:49,420 So now the input is an "argument." 1774 01:20:49,420 --> 01:20:51,400 The algorithm is a "function." 1775 01:20:51,400 --> 01:20:53,840 And the output, in this case, is a "side effect"-- 1776 01:20:53,840 --> 01:20:55,840 terminology that you'll just hear more and more. 1777 01:20:55,840 --> 01:20:59,200 And it'll eventually sink in, but not to worry if the terminology doesn't 1778 01:20:59,200 --> 01:21:00,800 come naturally early on. 1779 01:21:00,800 --> 01:21:03,890 So what more might I do with this? 1780 01:21:03,890 --> 01:21:07,077 Let me go back to Scratch here and make this maybe perhaps more interactive 1781 01:21:07,077 --> 01:21:09,910 and actually get the cat to say something a little more dynamically. 1782 01:21:09,910 --> 01:21:11,740 So instead of "Hello, world," why don't we 1783 01:21:11,740 --> 01:21:15,050 get him to say hello to me or to you or anyone else? 1784 01:21:15,050 --> 01:21:16,010 So let me do this. 1785 01:21:16,010 --> 01:21:18,970 Let me go under, say-- 1786 01:21:18,970 --> 01:21:20,200 let me get rid of this first. 1787 01:21:20,200 --> 01:21:22,090 And you'll notice this neat trick. 1788 01:21:22,090 --> 01:21:25,090 As soon as you start dragging on a block, if it gets close to it, 1789 01:21:25,090 --> 01:21:28,480 it kind of goes gray, and it can be magnetically snapped together. 1790 01:21:28,480 --> 01:21:30,220 You don't have to do it very precisely. 1791 01:21:30,220 --> 01:21:32,345 Conversely, if I want to get rid of a puzzle piece, 1792 01:21:32,345 --> 01:21:35,800 I can just drag it anywhere on the left, let go, and that deletes it. 1793 01:21:35,800 --> 01:21:38,500 Or you can Right-click or Control-click and a little menu 1794 01:21:38,500 --> 01:21:39,902 will let you delete it as well. 1795 01:21:39,902 --> 01:21:41,110 Well, let me do this instead. 1796 01:21:41,110 --> 01:21:44,310 Under Sensing, which I know is there because I've done this before, 1797 01:21:44,310 --> 01:21:48,180 are a whole bunch of things related to Sensing, whereby the cat can kind 1798 01:21:48,180 --> 01:21:50,700 of feel out its world, in some sense. 1799 01:21:50,700 --> 01:21:54,360 It can do things like ask this question, "Am I touching the mouse pointer?"-- 1800 01:21:54,360 --> 01:21:55,620 like the user's cursor. 1801 01:21:55,620 --> 01:21:59,010 "Am I touching a specific color that you can override to be anything you want?" 1802 01:21:59,010 --> 01:22:02,500 "Is the distance to the mouse pointer some specific value?" 1803 01:22:02,500 --> 01:22:05,940 But for now, I'm going to focus on this, this blue puzzle piece that 1804 01:22:05,940 --> 01:22:09,570 asks a question, which itself is this white oval that I can apparently 1805 01:22:09,570 --> 01:22:12,030 change, and then it's going to wait for a response. 1806 01:22:12,030 --> 01:22:14,443 But this puzzle piece is a little different. 1807 01:22:14,443 --> 01:22:15,360 It's a little special. 1808 01:22:15,360 --> 01:22:16,590 It comes with a freebie. 1809 01:22:16,590 --> 01:22:19,690 It comes with what we're going to call, technically, a "return value." 1810 01:22:19,690 --> 01:22:22,590 So some functions don't just do something on the screen. 1811 01:22:22,590 --> 01:22:25,620 They hand you back, so to speak, a value that you 1812 01:22:25,620 --> 01:22:27,570 can do anything that you want with. 1813 01:22:27,570 --> 01:22:29,820 Nothing happens immediately unless you do something 1814 01:22:29,820 --> 01:22:31,750 with that so-called return value. 1815 01:22:31,750 --> 01:22:35,633 So let me go ahead and drag this thing over here, ask, "What's your name?" 1816 01:22:35,633 --> 01:22:37,050 And I'll use the default question. 1817 01:22:37,050 --> 01:22:38,675 That seems a reasonable place to start. 1818 01:22:38,675 --> 01:22:41,970 I'm not going to override that default. And now let me go ahead and zoom out. 1819 01:22:41,970 --> 01:22:43,890 Let me go back to Looks. 1820 01:22:43,890 --> 01:22:46,320 Let me go to Say. 1821 01:22:46,320 --> 01:22:48,850 And let me just form the English sentence I want. 1822 01:22:48,850 --> 01:22:53,730 So let me zoom in here and type in "hello," maybe comma, space. 1823 01:22:53,730 --> 01:22:56,580 I could do "David," but that's obviously not right 1824 01:22:56,580 --> 01:22:58,830 because I'm asking for a name, and then I'm like, 1825 01:22:58,830 --> 01:23:00,270 in advance, hard-coding my name. 1826 01:23:00,270 --> 01:23:01,228 That's not what I want. 1827 01:23:01,228 --> 01:23:02,610 I just want, "hello," comma. 1828 01:23:02,610 --> 01:23:06,180 And now let me zoom out and grab one more Say block. 1829 01:23:06,180 --> 01:23:07,500 Let me maybe Say here. 1830 01:23:07,500 --> 01:23:09,180 OK, I don't want to say, "Hello, hello." 1831 01:23:09,180 --> 01:23:11,722 I don't want to just type in my own name because, again, then 1832 01:23:11,722 --> 01:23:14,230 what's the point of asking the user for their name? 1833 01:23:14,230 --> 01:23:15,300 But notice this. 1834 01:23:15,300 --> 01:23:19,950 If I go back to the sensing block, this is where that oval that's blue, 1835 01:23:19,950 --> 01:23:22,080 called Answer, is useful. 1836 01:23:22,080 --> 01:23:25,280 This will be the so-called "return value" of that function. 1837 01:23:25,280 --> 01:23:27,780 So I'm just going to go ahead and do this and drag and drop. 1838 01:23:27,780 --> 01:23:30,600 Even though it's not the right size, it is the right shape. 1839 01:23:30,600 --> 01:23:32,670 And so Scratch will be smart about it and grow 1840 01:23:32,670 --> 01:23:34,620 to fill that puzzle piece for you. 1841 01:23:34,620 --> 01:23:35,820 Let me zoom out now. 1842 01:23:35,820 --> 01:23:37,607 And now let me click the Green Flag. 1843 01:23:37,607 --> 01:23:40,440 You'll see that Scratch is indeed prompting me with a speech bubble, 1844 01:23:40,440 --> 01:23:41,232 "What's your name?" 1845 01:23:41,232 --> 01:23:44,320 Notice the little text box below the cat is asking, what's your name? 1846 01:23:44,320 --> 01:23:46,590 So I'm going to type in D-A-V-I-D and hit Enter. 1847 01:23:46,590 --> 01:23:48,120 Or I can click the blue check. 1848 01:23:48,120 --> 01:23:50,310 Enter. 1849 01:23:50,310 --> 01:23:51,802 OK, it's a little weird. 1850 01:23:51,802 --> 01:23:53,760 I wanted him to say, "hello," not just my name. 1851 01:23:53,760 --> 01:23:55,020 So let me Stop. 1852 01:23:55,020 --> 01:23:56,190 Let me start it again. 1853 01:23:56,190 --> 01:23:57,648 All right, hello, what's your name? 1854 01:23:57,648 --> 01:24:00,230 D-A-V-I-D. Enter. 1855 01:24:00,230 --> 01:24:02,490 Huh-- kind of rude. 1856 01:24:02,490 --> 01:24:04,890 Why is there this bug? 1857 01:24:04,890 --> 01:24:07,920 Like, I wanted to say, "Hello, David," not just "David." 1858 01:24:07,920 --> 01:24:11,550 And yet twice it has failed to do so. 1859 01:24:11,550 --> 01:24:12,560 Yeah-- 1860 01:24:12,560 --> 01:24:13,577 AUDIENCE: [INAUDIBLE] 1861 01:24:13,577 --> 01:24:16,160 DAVID J. MALAN: Yeah, the computer's processing my directions, 1862 01:24:16,160 --> 01:24:17,658 my actions, really quickly. 1863 01:24:17,658 --> 01:24:18,950 And so it actually is doing it. 1864 01:24:18,950 --> 01:24:20,510 It's just, you and I, in the room, are just way 1865 01:24:20,510 --> 01:24:23,220 too slow to notice that it said-- (QUICKLY) "Hello, David." 1866 01:24:23,220 --> 01:24:25,470 It just seems to have just said, "David." 1867 01:24:25,470 --> 01:24:26,910 So all right, how can I fix this? 1868 01:24:26,910 --> 01:24:28,640 Well, here's where you start to poke around and think 1869 01:24:28,640 --> 01:24:29,940 about how you might solve this. 1870 01:24:29,940 --> 01:24:31,100 Let me go back under Looks. 1871 01:24:31,100 --> 01:24:33,330 Maybe there's a smarter way to do this. 1872 01:24:33,330 --> 01:24:34,520 Maybe I could do-- 1873 01:24:34,520 --> 01:24:35,540 OK, I could do this. 1874 01:24:35,540 --> 01:24:37,490 How about instead of just Say "hello," there's 1875 01:24:37,490 --> 01:24:41,060 apparently another puzzle piece where I can time it so I can maybe slow things 1876 01:24:41,060 --> 01:24:42,150 down a little bit. 1877 01:24:42,150 --> 01:24:43,110 So let me do this. 1878 01:24:43,110 --> 01:24:45,810 Let me throw away all of this. 1879 01:24:45,810 --> 01:24:49,140 Let me drag a Say "hello" for 2 seconds. 1880 01:24:49,140 --> 01:24:51,870 Let me drag another Say "hello" for 2 seconds. 1881 01:24:51,870 --> 01:24:54,500 Let me change the first one to, indeed, "hello" comma. 1882 01:24:54,500 --> 01:24:57,530 And then let me go back to Sensing. 1883 01:24:57,530 --> 01:25:00,460 Let me grab that same answer because I threw it away a second ago, 1884 01:25:00,460 --> 01:25:01,460 and I'll just change it. 1885 01:25:01,460 --> 01:25:02,960 I don't even have to delete "hello." 1886 01:25:02,960 --> 01:25:04,740 I can just overwrite it like this. 1887 01:25:04,740 --> 01:25:08,360 So now I think we'll kind of pump the brakes and see things more slowly. 1888 01:25:08,360 --> 01:25:09,620 Let me Stop. 1889 01:25:09,620 --> 01:25:10,550 Let me start. 1890 01:25:10,550 --> 01:25:12,050 D-A-V-I-D, Enter. 1891 01:25:12,050 --> 01:25:14,600 Hello, David. 1892 01:25:14,600 --> 01:25:18,120 OK, so it's better, like it seems to be working. 1893 01:25:18,120 --> 01:25:21,255 I think your hypothesis was right, just looks kind of stupid, right? 1894 01:25:21,255 --> 01:25:22,880 Like, the fact that it's saying Hello-- 1895 01:25:22,880 --> 01:25:24,170 [PAUSE] 1896 01:25:24,170 --> 01:25:25,640 --David, like we can do better. 1897 01:25:25,640 --> 01:25:29,000 And like, literally every piece of software on your phone or Mac or PC 1898 01:25:29,000 --> 01:25:29,930 is better than that. 1899 01:25:29,930 --> 01:25:33,750 It adds words together in the user interfaces you and I are familiar with. 1900 01:25:33,750 --> 01:25:35,480 So let's go a little more fishing here. 1901 01:25:35,480 --> 01:25:36,950 Let me throw away these. 1902 01:25:36,950 --> 01:25:39,860 Let me go back to Looks and just get the simpler Say. 1903 01:25:39,860 --> 01:25:44,060 I want this to say, "Hello" comma name, where name 1904 01:25:44,060 --> 01:25:45,720 comes from that Answer return value. 1905 01:25:45,720 --> 01:25:46,740 So how can I do this? 1906 01:25:46,740 --> 01:25:49,440 Well, let me go under Operations, which we haven't been before. 1907 01:25:49,440 --> 01:25:50,732 There's a lot of stuff in here. 1908 01:25:50,732 --> 01:25:53,720 Some of it's mathematically related, adding, subtracting, and so forth. 1909 01:25:53,720 --> 01:25:56,280 You can generate random numbers which might be useful. 1910 01:25:56,280 --> 01:25:59,810 And if I keep scrolling down, there's this Join "apple" and "banana." 1911 01:25:59,810 --> 01:26:01,280 But that's just placeholder text. 1912 01:26:01,280 --> 01:26:04,837 You can join one piece of text with another piece of text, 1913 01:26:04,837 --> 01:26:06,170 by default "apple" and "banana." 1914 01:26:06,170 --> 01:26:08,480 But let's change it to "hello" and my name. 1915 01:26:08,480 --> 01:26:11,120 So this, too, wrong size but right shape. 1916 01:26:11,120 --> 01:26:13,190 So let me let it snap into place. 1917 01:26:13,190 --> 01:26:15,920 Let me go ahead now and do "hello" comma. 1918 01:26:15,920 --> 01:26:20,840 And now I think I just want to go grab that Answer return value. 1919 01:26:20,840 --> 01:26:23,780 Let me drag the same oval as before, clobber-- 1920 01:26:23,780 --> 01:26:25,280 that is, overwrite-- banana. 1921 01:26:25,280 --> 01:26:28,430 So now I'm kind of composing functions. 1922 01:26:28,430 --> 01:26:31,700 The output of one function, Join, is going 1923 01:26:31,700 --> 01:26:33,972 to be the input of another function, Say. 1924 01:26:33,972 --> 01:26:36,680 So let's see what happens now that they're kind of stacked on top 1925 01:26:36,680 --> 01:26:38,660 of each other or nested, so to speak. 1926 01:26:38,660 --> 01:26:42,440 Click the Green Flag, D-A-V-I-D. Enter. 1927 01:26:42,440 --> 01:26:43,357 "Hello, David." 1928 01:26:43,357 --> 01:26:44,690 All right, that was pretty fast. 1929 01:26:44,690 --> 01:26:45,680 Let's just do it once more. 1930 01:26:45,680 --> 01:26:46,310 Stop. 1931 01:26:46,310 --> 01:26:47,270 Start. 1932 01:26:47,270 --> 01:26:49,545 Here we go, D-A-V-I-D. Enter. 1933 01:26:49,545 --> 01:26:50,045 OK. 1934 01:26:50,045 --> 01:26:52,650 All right, it's not the most exciting program in the world. 1935 01:26:52,650 --> 01:26:53,750 But it's more correct. 1936 01:26:53,750 --> 01:26:56,090 It's better designed just because that's what you would kind of expect 1937 01:26:56,090 --> 01:26:59,450 the software to do and not be some kind of lame user interface that's just 1938 01:26:59,450 --> 01:27:02,540 inserting random delays to just make it kind of work, like that's 1939 01:27:02,540 --> 01:27:03,962 a workaround, a hack, if you will. 1940 01:27:03,962 --> 01:27:06,170 But there's some cool things you can do with Scratch. 1941 01:27:06,170 --> 01:27:08,030 And we won't really go down the rabbit hole 1942 01:27:08,030 --> 01:27:10,940 of all of the fun and family-friendly features that it has. 1943 01:27:10,940 --> 01:27:12,810 But there is one that's kind of cool here. 1944 01:27:12,810 --> 01:27:16,550 Let me go into the Extensions button at the bottom left of my screen. 1945 01:27:16,550 --> 01:27:17,720 And this one's kind of cool. 1946 01:27:17,720 --> 01:27:19,575 Let me go to Text to Speech. 1947 01:27:19,575 --> 01:27:22,700 And you'll notice that this one requires internet because it's cloud based. 1948 01:27:22,700 --> 01:27:27,715 But this just gave me some new puzzle pieces in a new category, 1949 01:27:27,715 --> 01:27:28,340 Text to Speech. 1950 01:27:28,340 --> 01:27:30,710 And these green ones do exactly what they say. 1951 01:27:30,710 --> 01:27:31,860 So let me do this. 1952 01:27:31,860 --> 01:27:33,120 Let me zoom out again. 1953 01:27:33,120 --> 01:27:34,543 Let me keep the Join block. 1954 01:27:34,543 --> 01:27:36,710 And I'm just going to temporarily toss it over here. 1955 01:27:36,710 --> 01:27:39,252 It's not going to delete itself because I didn't drag it over 1956 01:27:39,252 --> 01:27:40,070 to the other side. 1957 01:27:40,070 --> 01:27:42,800 But I'm going to get rid of the Say block, in purple. 1958 01:27:42,800 --> 01:27:47,570 I'm going to do the Speak block here, in green, and let it snap into place. 1959 01:27:47,570 --> 01:27:50,990 And then I'm going to drag and drop this onto the input to Speak. 1960 01:27:50,990 --> 01:27:54,290 And now, perhaps a little more adorably, let's try this. 1961 01:27:54,290 --> 01:27:56,270 Green Flag, what's your name? 1962 01:27:56,270 --> 01:27:57,710 D-A-V-I-D. Enter. 1963 01:27:57,710 --> 01:27:58,460 And-- 1964 01:27:58,460 --> 01:28:00,578 COMPUTER: Hello, David. 1965 01:28:00,578 --> 01:28:01,370 DAVID J. MALAN: OK. 1966 01:28:01,370 --> 01:28:02,370 [LAUGHTER] 1967 01:28:02,370 --> 01:28:03,890 It's a little robotic. 1968 01:28:03,890 --> 01:28:05,917 But at least now it has synthesized speech. 1969 01:28:05,917 --> 01:28:08,750 And I've kind of got my own, like, Siri or Google Assistant or Alexa 1970 01:28:08,750 --> 01:28:12,020 thing going on here now, where it's now recognized whatever text 1971 01:28:12,020 --> 01:28:13,550 it is, and it's played it. 1972 01:28:13,550 --> 01:28:17,480 Well, let's make this an actual cat that doesn't talk in that weird human voice. 1973 01:28:17,480 --> 01:28:19,610 Let me go ahead and get rid of most of this stuff. 1974 01:28:19,610 --> 01:28:22,730 And let's get the cat to actually meow, like a cat tends to. 1975 01:28:22,730 --> 01:28:24,650 And let me go under the Sounds block. 1976 01:28:24,650 --> 01:28:28,343 Now MIT gives you a few sounds for free because it's designed around a cat, 1977 01:28:28,343 --> 01:28:30,260 by default. And I'm going to go ahead and grab 1978 01:28:30,260 --> 01:28:33,080 this one, Play Sound Meow until done. 1979 01:28:33,080 --> 01:28:36,860 And now-- and we heard a teaser for this earlier in the crowd-- 1980 01:28:36,860 --> 01:28:38,982 [MEOW] 1981 01:28:38,982 --> 01:28:40,440 It's a little piercing, admittedly. 1982 01:28:40,440 --> 01:28:42,460 Maybe we can lower the volume a little bit there. 1983 01:28:42,460 --> 01:28:45,710 But notice, if I want the cat to meow a second time, I'll just click it again. 1984 01:28:45,710 --> 01:28:46,905 [MEOW] 1985 01:28:46,905 --> 01:28:48,690 OK, and over there, too, I hear-- 1986 01:28:48,690 --> 01:28:50,320 [MEOW] 1987 01:28:50,320 --> 01:28:50,820 OK. 1988 01:28:50,820 --> 01:28:51,320 [MEOW] 1989 01:28:51,320 --> 01:28:53,500 All right, so it's kind of cute now, right? 1990 01:28:53,500 --> 01:28:54,960 So it's just meow-- 1991 01:28:54,960 --> 01:28:56,610 OK, yes, echo, echo. 1992 01:28:56,610 --> 01:28:59,767 So it's meowing now every time I hit the Green Flag. 1993 01:28:59,767 --> 01:29:02,100 Now, that's great, but even a kid is probably going to-- 1994 01:29:02,100 --> 01:29:02,730 [MEOW] 1995 01:29:02,730 --> 01:29:03,780 --like would prefer that it-- 1996 01:29:03,780 --> 01:29:03,840 [MEOW] 1997 01:29:03,840 --> 01:29:06,790 --just meow, perhaps, like again and again, without having to keep-- 1998 01:29:06,790 --> 01:29:07,290 [MEOW] 1999 01:29:07,290 --> 01:29:08,165 --hitting the button. 2000 01:29:08,165 --> 01:29:09,880 So how might we do this? 2001 01:29:09,880 --> 01:29:13,470 All right, well, if I want it to meow multiple times, why don't I just, like, 2002 01:29:13,470 --> 01:29:16,570 grab it another time and another time? 2003 01:29:16,570 --> 01:29:19,350 Alternatively, you can Right-click or Control-click a puzzle piece 2004 01:29:19,350 --> 01:29:21,725 and just duplicate it from a little menu that drops down. 2005 01:29:21,725 --> 01:29:22,920 So here we go, three meows. 2006 01:29:22,920 --> 01:29:25,090 [MEOWING] 2007 01:29:25,090 --> 01:29:25,960 2008 01:29:25,960 --> 01:29:27,730 All right, that's not really a happy cat. 2009 01:29:27,730 --> 01:29:29,200 It sounds maybe hungry. 2010 01:29:29,200 --> 01:29:31,240 So can we slow that down? 2011 01:29:31,240 --> 01:29:32,380 Well, maybe. 2012 01:29:32,380 --> 01:29:34,630 In fact, if I poke around, let me go under Control. 2013 01:29:34,630 --> 01:29:36,850 It looks like there's a Wait block. 2014 01:29:36,850 --> 01:29:40,630 Wait 1 Second, by default. And notice, Scratch will be pretty accommodating. 2015 01:29:40,630 --> 01:29:44,410 If you just hover in between blocks, it will grow to fill that too. 2016 01:29:44,410 --> 01:29:47,095 So I could change it to 1 or 2 or anything, seconds. 2017 01:29:47,095 --> 01:29:48,970 I'll just leave it at the default for now, 1. 2018 01:29:48,970 --> 01:29:50,680 And now I'll go ahead and do this. 2019 01:29:50,680 --> 01:29:52,838 [MEOWING] 2020 01:29:52,838 --> 01:29:55,580 2021 01:29:55,580 --> 01:29:58,790 OK, so cuter and less hungry and just more friendly. 2022 01:29:58,790 --> 01:30:00,740 But this isn't the best design. 2023 01:30:00,740 --> 01:30:01,460 It is correct. 2024 01:30:01,460 --> 01:30:02,960 And let's use that as a term of art. 2025 01:30:02,960 --> 01:30:05,720 Correct means the code does what you want it to do. 2026 01:30:05,720 --> 01:30:08,090 I want the cat to meow three times slowly. 2027 01:30:08,090 --> 01:30:08,720 And it did. 2028 01:30:08,720 --> 01:30:10,370 So I'd wager this is correct. 2029 01:30:10,370 --> 01:30:12,380 But it's not the best design. 2030 01:30:12,380 --> 01:30:14,810 And this is where things get more subjective, right? 2031 01:30:14,810 --> 01:30:18,630 Like, you could write accurate sentences in an essay for an English class, 2032 01:30:18,630 --> 01:30:20,663 but otherwise, it's just completely a mess. 2033 01:30:20,663 --> 01:30:23,580 Like, your arguments here and there, and you don't say anything wrong, 2034 01:30:23,580 --> 01:30:24,830 but you don't say it well. 2035 01:30:24,830 --> 01:30:28,110 In the context of code, we can do better than this. 2036 01:30:28,110 --> 01:30:31,340 And Copy/Paste or repeating yourself again and again tends 2037 01:30:31,340 --> 01:30:32,340 to be bad practice. 2038 01:30:32,340 --> 01:30:32,840 Why? 2039 01:30:32,840 --> 01:30:37,188 Suppose that you want to change the Wait to 2 seconds instead of 1. 2040 01:30:37,188 --> 01:30:38,480 It's admittedly not a big deal. 2041 01:30:38,480 --> 01:30:40,400 Fine, I click there, I change it to 2. 2042 01:30:40,400 --> 01:30:41,990 I click there, I change it to 2. 2043 01:30:41,990 --> 01:30:43,820 But what if you meow 5 times, 10 times? 2044 01:30:43,820 --> 01:30:46,858 Now I have to change the Wait, like, in 5, 10 different places. 2045 01:30:46,858 --> 01:30:47,900 Like, that's just stupid. 2046 01:30:47,900 --> 01:30:51,395 It's taking unnecessary human time, and you're going to screw up eventually, 2047 01:30:51,395 --> 01:30:53,270 especially if your program is getting longer. 2048 01:30:53,270 --> 01:30:54,740 You're going to miss one of the inputs. 2049 01:30:54,740 --> 01:30:56,365 You're going to leave the number wrong. 2050 01:30:56,365 --> 01:30:57,080 And that's a bug. 2051 01:30:57,080 --> 01:30:59,030 So just based on what you've seen already 2052 01:30:59,030 --> 01:31:01,760 or if you've program before, which a few of you have, 2053 01:31:01,760 --> 01:31:04,050 what's the term of art here that will solve this? 2054 01:31:04,050 --> 01:31:06,095 How can we design this better? 2055 01:31:06,095 --> 01:31:07,230 AUDIENCE: [INAUDIBLE] 2056 01:31:07,230 --> 01:31:08,563 DAVID J. MALAN: I heard it here. 2057 01:31:08,563 --> 01:31:12,110 Yeah, so a loop-- a loop, some kind of cycle that says, do that again. 2058 01:31:12,110 --> 01:31:15,140 Do that again-- not infinitely many times, necessarily, 2059 01:31:15,140 --> 01:31:16,430 but some finite number. 2060 01:31:16,430 --> 01:31:18,740 Well, you can perhaps see a spoiler on the screen. 2061 01:31:18,740 --> 01:31:22,760 Under the same orange Control category is a Repeat block. 2062 01:31:22,760 --> 01:31:24,320 And by default, it's proposing 10. 2063 01:31:24,320 --> 01:31:25,440 But we can change that. 2064 01:31:25,440 --> 01:31:26,280 So let me do this. 2065 01:31:26,280 --> 01:31:29,930 I'm going to throw away most of this Copy/Paste as redundant. 2066 01:31:29,930 --> 01:31:33,470 I'm going to detach this temporarily just to make room for something else. 2067 01:31:33,470 --> 01:31:37,590 And I'm going to drag a Repeat block over here and let that snap into place. 2068 01:31:37,590 --> 01:31:40,340 And I'm going to change it for now, just to be 3, for consistency. 2069 01:31:40,340 --> 01:31:42,715 And this is the correct shape even though it's too small, 2070 01:31:42,715 --> 01:31:44,660 but Scratch will accommodate that for us. 2071 01:31:44,660 --> 01:31:50,370 And now-- same output but arguably better designed. 2072 01:31:50,370 --> 01:31:50,870 Why? 2073 01:31:50,870 --> 01:31:53,953 Because if I want to change the number of meows, I change it in one place, 2074 01:31:53,953 --> 01:31:55,040 no Copy/Paste messiness. 2075 01:31:55,040 --> 01:31:56,867 If I want to change the waiting, one place. 2076 01:31:56,867 --> 01:31:59,450 I don't have to change it in multiple places and not screw up. 2077 01:31:59,450 --> 01:32:00,920 So let me hit the Green Flag. 2078 01:32:00,920 --> 01:32:03,405 [MEOWING] 2079 01:32:03,405 --> 01:32:05,890 2080 01:32:05,890 --> 01:32:06,940 All right, so-- nice. 2081 01:32:06,940 --> 01:32:11,140 Now, it would have been nice if MIT had just given us a meow block that 2082 01:32:11,140 --> 01:32:12,970 just automates all of this for us. 2083 01:32:12,970 --> 01:32:15,910 Let me wager, they gave us the low-level implementation details. 2084 01:32:15,910 --> 01:32:18,400 They gave us the Play Sound Meow. 2085 01:32:18,400 --> 01:32:21,100 But I had to implement a decent number of blocks 2086 01:32:21,100 --> 01:32:23,120 just to get a cat to meow again and again. 2087 01:32:23,120 --> 01:32:26,350 I feel like we should have gotten that for free from MIT. 2088 01:32:26,350 --> 01:32:30,100 Well, they don't have to be the only ones that invent blocks for us to use. 2089 01:32:30,100 --> 01:32:33,920 You can write your own functions, your own verbs or actions. 2090 01:32:33,920 --> 01:32:35,180 So how can we do this? 2091 01:32:35,180 --> 01:32:39,640 Let's make our own puzzle piece, called Meow, that uses this code 2092 01:32:39,640 --> 01:32:42,650 but creates it in such a way that it's reusable elsewhere. 2093 01:32:42,650 --> 01:32:43,420 So let me do this. 2094 01:32:43,420 --> 01:32:46,660 Under my blocks in pink here, I'm going to go ahead and click, 2095 01:32:46,660 --> 01:32:48,310 literally, Make a Block. 2096 01:32:48,310 --> 01:32:51,100 Now, here's an interface by which I can give the block a name. 2097 01:32:51,100 --> 01:32:53,410 M-E-O-W will be the name of this block. 2098 01:32:53,410 --> 01:32:55,810 And I'm just going to go ahead and quickly click OK. 2099 01:32:55,810 --> 01:32:58,780 That just gives me a very generic, pink puzzle piece 2100 01:32:58,780 --> 01:33:01,390 that starts with the word Define because scratch 2101 01:33:01,390 --> 01:33:04,750 is asking me to define, that is, implement or create, 2102 01:33:04,750 --> 01:33:06,717 this new puzzle piece for me. 2103 01:33:06,717 --> 01:33:08,050 Well, what does it mean to Meow? 2104 01:33:08,050 --> 01:33:12,770 I'm going to claim that it means to do these two steps, to play the sound meow 2105 01:33:12,770 --> 01:33:14,890 and then just wait for 1 second. 2106 01:33:14,890 --> 01:33:18,520 But what's powerful about this idea is look at this up top. 2107 01:33:18,520 --> 01:33:21,970 Now that I've made a block, it exists in Scratch. 2108 01:33:21,970 --> 01:33:23,710 MIT didn't need to create this for me. 2109 01:33:23,710 --> 01:33:27,190 I created it for myself and even you, if we end up sharing code. 2110 01:33:27,190 --> 01:33:30,320 So I can now drag Meow up in here. 2111 01:33:30,320 --> 01:33:33,910 And what's nice about Meow is that itself is, yes, a function, 2112 01:33:33,910 --> 01:33:35,680 but it's also an abstraction. 2113 01:33:35,680 --> 01:33:40,060 Like, never again do I or even you need to worry or care about what 2114 01:33:40,060 --> 01:33:42,340 it means to meow or implement it. 2115 01:33:42,340 --> 01:33:43,930 I can sort of drag it out of the way. 2116 01:33:43,930 --> 01:33:45,790 I didn't delete it-- drag it out of the way. 2117 01:33:45,790 --> 01:33:46,970 Out of sight, out of mind. 2118 01:33:46,970 --> 01:33:47,470 Why? 2119 01:33:47,470 --> 01:33:49,945 Because my code is now even better designed, in some sense, 2120 01:33:49,945 --> 01:33:51,070 because it's more readable. 2121 01:33:51,070 --> 01:33:51,910 What is it doing? 2122 01:33:51,910 --> 01:33:55,000 When the Green Flag is clicked, repeat 3 times Meow. 2123 01:33:55,000 --> 01:33:56,305 It just says what it means. 2124 01:33:56,305 --> 01:33:58,180 And so it's a lot easier to read it, and it's 2125 01:33:58,180 --> 01:33:59,930 a lot easier to think about it, especially 2126 01:33:59,930 --> 01:34:03,040 if you're using Meow in other projects too. 2127 01:34:03,040 --> 01:34:05,380 Now, let me go ahead and click Play. 2128 01:34:05,380 --> 01:34:06,280 [MEOW] 2129 01:34:06,280 --> 01:34:07,200 Same thing. 2130 01:34:07,200 --> 01:34:07,700 [MEOW] 2131 01:34:07,700 --> 01:34:09,282 So it's not really fundamentally any different. 2132 01:34:09,282 --> 01:34:09,830 [MEOW] 2133 01:34:09,830 --> 01:34:13,840 But I can make this custom puzzle piece, this own function of mine, Meow, 2134 01:34:13,840 --> 01:34:15,010 even more powerful. 2135 01:34:15,010 --> 01:34:18,520 Let me kind of rewind a bit and go to my Meow puzzle piece. 2136 01:34:18,520 --> 01:34:21,658 And I am going to Control-click or Right-click on my pink puzzle piece. 2137 01:34:21,658 --> 01:34:22,700 And I'm going to edit it. 2138 01:34:22,700 --> 01:34:25,210 So I kind of regret making Meow so simple. 2139 01:34:25,210 --> 01:34:28,660 Wouldn't it be nice if Meow took an input, a.k.a. 2140 01:34:28,660 --> 01:34:31,960 an argument, that tells Meow how many times to meow. 2141 01:34:31,960 --> 01:34:34,300 Then I can get rid of that loop and just tell 2142 01:34:34,300 --> 01:34:36,530 Meow how many meows I actually want. 2143 01:34:36,530 --> 01:34:40,390 So I'm going to click on another button here called, literally, Add an Input. 2144 01:34:40,390 --> 01:34:42,085 And it's going to have placeholder here. 2145 01:34:42,085 --> 01:34:43,960 So I'm just going to put a placeholder there. 2146 01:34:43,960 --> 01:34:47,880 I keep using "n" for number, which is a go to in computer scientist terms. 2147 01:34:47,880 --> 01:34:50,380 And I'm going to add some descriptive text just so that it's 2148 01:34:50,380 --> 01:34:52,030 a little more self-explanatory. 2149 01:34:52,030 --> 01:34:54,070 I'm just going to say Meow n Times. 2150 01:34:54,070 --> 01:34:55,510 But there's only one oval. 2151 01:34:55,510 --> 01:34:57,700 Times is just going to be explanatory text. 2152 01:34:57,700 --> 01:34:59,290 And now notice what has happened. 2153 01:34:59,290 --> 01:35:02,800 Now my puzzle piece takes an input, a.k.a. 2154 01:35:02,800 --> 01:35:06,580 an argument, that will tell that function to meow some number of times. 2155 01:35:06,580 --> 01:35:08,440 But it's not just going to work magically. 2156 01:35:08,440 --> 01:35:11,110 I need to implement that lower level detail. 2157 01:35:11,110 --> 01:35:12,700 So let me zoom out. 2158 01:35:12,700 --> 01:35:14,918 I have to remind myself what this function was. 2159 01:35:14,918 --> 01:35:16,960 So I'm going to drag it higher up just so they're 2160 01:35:16,960 --> 01:35:18,550 on the screen at the same time. 2161 01:35:18,550 --> 01:35:22,090 I'm going to go ahead now and temporarily move this over here. 2162 01:35:22,090 --> 01:35:24,190 I'm going to temporarily detach this over here. 2163 01:35:24,190 --> 01:35:24,700 Why? 2164 01:35:24,700 --> 01:35:30,130 Because what I thing I want to do is move my loop into the function itself, 2165 01:35:30,130 --> 01:35:33,760 move the Play and the Wait into the loop. 2166 01:35:33,760 --> 01:35:35,470 But I don't want a hardcode 3. 2167 01:35:35,470 --> 01:35:39,760 Notice that n here is its own oval I can drag a copy of n 2168 01:35:39,760 --> 01:35:41,390 and just let it go there. 2169 01:35:41,390 --> 01:35:45,700 So now I have a new version of Meow that takes an argument, n, 2170 01:35:45,700 --> 01:35:48,170 that tells Meow how many times to meow. 2171 01:35:48,170 --> 01:35:51,125 And now let me, again, drag this out of sight, out of mind, 2172 01:35:51,125 --> 01:35:52,750 because who cares how I implemented it? 2173 01:35:52,750 --> 01:35:54,880 Once it's implemented, it's sort of done. 2174 01:35:54,880 --> 01:35:58,070 Now my program is even better designed, in some sense. 2175 01:35:58,070 --> 01:35:58,570 Why? 2176 01:35:58,570 --> 01:36:01,120 Because now it really just says what it means. 2177 01:36:01,120 --> 01:36:01,840 There's no loop. 2178 01:36:01,840 --> 01:36:04,360 There's no repeat, no implementation details. 2179 01:36:04,360 --> 01:36:07,060 When Green Flag Clicked, Meow 3 Times. 2180 01:36:07,060 --> 01:36:10,840 And so functions indeed let you implement algorithms, 2181 01:36:10,840 --> 01:36:13,070 like they're just code that do something for you. 2182 01:36:13,070 --> 01:36:14,930 But they're also themselves abstractions. 2183 01:36:14,930 --> 01:36:15,430 Why? 2184 01:36:15,430 --> 01:36:17,660 Because once a function exists, it has a name. 2185 01:36:17,660 --> 01:36:19,580 And you can think about it in that term. 2186 01:36:19,580 --> 01:36:21,610 And you can use it by its name. 2187 01:36:21,610 --> 01:36:25,940 You don't have to care or remember how the function itself was built, 2188 01:36:25,940 --> 01:36:27,730 whether it's by you or even MIT. 2189 01:36:27,730 --> 01:36:29,480 So again, here I'll click the Green Flag. 2190 01:36:29,480 --> 01:36:30,313 It's the same thing. 2191 01:36:30,313 --> 01:36:32,292 [MEOWING] 2192 01:36:32,292 --> 01:36:35,130 2193 01:36:35,130 --> 01:36:38,250 So still correct, but better and better designed. 2194 01:36:38,250 --> 01:36:41,090 And so any time, here and out, with Scratch, or soon C, 2195 01:36:41,090 --> 01:36:43,790 and eventually Python, when you find yourself doing anything 2196 01:36:43,790 --> 01:36:47,828 resembling Copy/Paste or again and again grabbing the same code, probably 2197 01:36:47,828 --> 01:36:49,370 an opportunity to say, wait a minute. 2198 01:36:49,370 --> 01:36:52,490 Let me refactor this, so to speak, that is, rip out 2199 01:36:52,490 --> 01:36:54,697 the code that seems to be repeated again and again 2200 01:36:54,697 --> 01:36:57,530 and put it in its own function so you can give it a descriptive name 2201 01:36:57,530 --> 01:36:59,580 and use and reuse it. 2202 01:36:59,580 --> 01:37:04,880 Any questions just yet on now saying or these loops or these functions 2203 01:37:04,880 --> 01:37:06,590 that we're using? 2204 01:37:06,590 --> 01:37:07,130 Yeah-- 2205 01:37:07,130 --> 01:37:09,883 AUDIENCE: [INAUDIBLE] 2206 01:37:09,883 --> 01:37:12,300 DAVID J. MALAN: How did I make it so it meows three times? 2207 01:37:12,300 --> 01:37:15,060 So I originally only had a puzzle piece called Meow. 2208 01:37:15,060 --> 01:37:16,770 And I decided to improve it. 2209 01:37:16,770 --> 01:37:20,000 So I held down Control and I Right-clicked or Control-clicked 2210 01:37:20,000 --> 01:37:22,070 on the pink puzzle piece at top left. 2211 01:37:22,070 --> 01:37:23,120 And I clicked Edit. 2212 01:37:23,120 --> 01:37:25,070 And that brought back the original interface 2213 01:37:25,070 --> 01:37:28,790 that lets me add some arguments to the puzzle piece itself. 2214 01:37:28,790 --> 01:37:31,250 And I clicked Add an Input on the left here. 2215 01:37:31,250 --> 01:37:34,260 And then I clicked on Add a Label over here. 2216 01:37:34,260 --> 01:37:36,960 So that just lets you customize it even further. 2217 01:37:36,960 --> 01:37:38,490 All right, so we've done this. 2218 01:37:38,490 --> 01:37:41,900 Let's add one of those other primitives too to do something optionally. 2219 01:37:41,900 --> 01:37:46,400 So how about we make the cat meow only if it's being petted by a human, 2220 01:37:46,400 --> 01:37:50,540 as by moving the mouse to hover over the cat, like a human would pet a cat? 2221 01:37:50,540 --> 01:37:55,110 Well, let me go ahead and throw away the meowing for now. 2222 01:37:55,110 --> 01:37:57,083 And let me simplify it by just using a sound. 2223 01:37:57,083 --> 01:37:58,500 I'm going to go ahead and do this. 2224 01:37:58,500 --> 01:38:02,030 I'm going to go ahead and have a Control block that 2225 01:38:02,030 --> 01:38:06,560 says If, because I want to implement the idea of if the cursor is touching 2226 01:38:06,560 --> 01:38:08,930 the cat, then play sound meow. 2227 01:38:08,930 --> 01:38:10,710 Or I could use my same pink puzzle piece. 2228 01:38:10,710 --> 01:38:14,150 But I'm going to throw that away and focus only now on the sounds. 2229 01:38:14,150 --> 01:38:15,840 And I'm going to do this. 2230 01:38:15,840 --> 01:38:19,598 If touching mouse pointer-- so I need to sense something about the world. 2231 01:38:19,598 --> 01:38:20,640 And we saw this earlier-- 2232 01:38:20,640 --> 01:38:22,500 so If Touching Mouse Pointer. 2233 01:38:22,500 --> 01:38:24,810 So notice this shape here, way too big. 2234 01:38:24,810 --> 01:38:25,920 But it is the right shape. 2235 01:38:25,920 --> 01:38:29,210 So if I hover just right, it'll snap into place. 2236 01:38:29,210 --> 01:38:33,410 And this now, in blue, is my Boolean expression, a yes/no question, 2237 01:38:33,410 --> 01:38:34,850 true false. 2238 01:38:34,850 --> 01:38:36,860 "If" is a conditional. 2239 01:38:36,860 --> 01:38:38,100 And what do I want to do? 2240 01:38:38,100 --> 01:38:42,290 Well, if the cat is touching the mouse pointer, 2241 01:38:42,290 --> 01:38:44,970 I want to go ahead and play sound meow until done. 2242 01:38:44,970 --> 01:38:46,080 So let's do this. 2243 01:38:46,080 --> 01:38:48,808 I'm going to hit Green Flag, click. 2244 01:38:48,808 --> 01:38:51,350 Now nothing's happened yet because it's a conditional, right? 2245 01:38:51,350 --> 01:38:53,808 It's only supposed to do something if I'm touching the cat. 2246 01:38:53,808 --> 01:38:55,550 Let me move the cursor over to the cat. 2247 01:38:55,550 --> 01:38:59,365 And-- wait for it. 2248 01:38:59,365 --> 01:39:02,330 Hmm-- another bug. 2249 01:39:02,330 --> 01:39:06,200 Why is the cat not meowing even though I very explicitly 2250 01:39:06,200 --> 01:39:09,020 said, If Touching Mouse Pointer, Meow? 2251 01:39:09,020 --> 01:39:10,295 Yeah, in the middle-- 2252 01:39:10,295 --> 01:39:11,893 AUDIENCE: [INAUDIBLE] 2253 01:39:11,893 --> 01:39:14,060 DAVID J. MALAN: Yeah, this is-- again, my computer's 2254 01:39:14,060 --> 01:39:15,440 just so darn fast, like yours. 2255 01:39:15,440 --> 01:39:17,317 I click the Green Flag, it asks the question, 2256 01:39:17,317 --> 01:39:18,650 am I touching the mouse pointer? 2257 01:39:18,650 --> 01:39:21,350 Well, no, because my cursor was up there, not touching the cat. 2258 01:39:21,350 --> 01:39:22,370 It's too late. 2259 01:39:22,370 --> 01:39:23,570 The cat's out of the bag. 2260 01:39:23,570 --> 01:39:28,490 And so we have to instead solve this by some other means. 2261 01:39:28,490 --> 01:39:29,940 How can we fix this? 2262 01:39:29,940 --> 01:39:31,470 How do we fix that sort of race? 2263 01:39:31,470 --> 01:39:31,970 Yeah-- 2264 01:39:31,970 --> 01:39:32,690 AUDIENCE: [INAUDIBLE] 2265 01:39:32,690 --> 01:39:34,648 DAVID J. MALAN: Yeah, so why don't we just keep 2266 01:39:34,648 --> 01:39:38,570 asking the question until I eventually am or am not actually petting the cat? 2267 01:39:38,570 --> 01:39:40,610 So let me detach this temporarily. 2268 01:39:40,610 --> 01:39:42,050 Let me go under Control. 2269 01:39:42,050 --> 01:39:45,098 Let me go under-- instead of repeat some finite number of times, 2270 01:39:45,098 --> 01:39:46,140 let's just do it forever. 2271 01:39:46,140 --> 01:39:49,070 So sometimes loops that do work forever are a good thing. 2272 01:39:49,070 --> 01:39:51,140 The clock on your phone, that's in a loop 2273 01:39:51,140 --> 01:39:53,510 forever because you want it to always tell time and not 2274 01:39:53,510 --> 01:39:54,720 stop at the end of the day. 2275 01:39:54,720 --> 01:39:58,913 So sometimes you do want code to loop forever, as in this case. 2276 01:39:58,913 --> 01:40:00,830 So let me go ahead and drag and drop it there. 2277 01:40:00,830 --> 01:40:02,750 Let me, again, click the Green Flag. 2278 01:40:02,750 --> 01:40:03,900 Nothing's happening yet. 2279 01:40:03,900 --> 01:40:06,300 But notice, the program is still running. 2280 01:40:06,300 --> 01:40:10,700 And so if I move my cursor, move my cursor, move my cursor, and-- 2281 01:40:10,700 --> 01:40:12,880 [MEOWING] 2282 01:40:12,880 --> 01:40:14,550 OK, so maybe we could add some Waiting. 2283 01:40:14,550 --> 01:40:17,750 But the cat does not want to be pet, in this case. 2284 01:40:17,750 --> 01:40:20,220 But it's indeed conditional. 2285 01:40:20,220 --> 01:40:22,380 So there we have an incarnation in Scratch 2286 01:40:22,380 --> 01:40:24,290 of doing something conditionally. 2287 01:40:24,290 --> 01:40:26,790 Now, we can make this really cool, really fast, if you will. 2288 01:40:26,790 --> 01:40:28,440 Let me stop this version. 2289 01:40:28,440 --> 01:40:31,270 Let me go ahead and do this. 2290 01:40:31,270 --> 01:40:33,270 Let me go ahead and throw all of this away. 2291 01:40:33,270 --> 01:40:36,210 Let me go into my little Extensions bucket over here. 2292 01:40:36,210 --> 01:40:40,020 And let me do Video Sensing, since most laptops or phones these days have 2293 01:40:40,020 --> 01:40:40,620 cameras. 2294 01:40:40,620 --> 01:40:44,190 And there, indeed, I am, with Sanders behind me. 2295 01:40:44,190 --> 01:40:45,780 And let me do this. 2296 01:40:45,780 --> 01:40:48,900 When Video Motion-- and let me get out of the way. 2297 01:40:48,900 --> 01:40:51,820 When Video Motion is Greater Than some value. 2298 01:40:51,820 --> 01:40:55,920 So 10 is the default. This is just a number that measures how much motion 2299 01:40:55,920 --> 01:40:56,670 there is or isn't. 2300 01:40:56,670 --> 01:40:58,290 So small number is like no motion. 2301 01:40:58,290 --> 01:40:59,920 Big number is lots of motion. 2302 01:40:59,920 --> 01:41:03,120 So I'm going to choose 50, somewhat arbitrarily here-- so 50. 2303 01:41:03,120 --> 01:41:05,370 This is not normal to program off to the side. 2304 01:41:05,370 --> 01:41:08,130 But I'm now going to say this. 2305 01:41:08,130 --> 01:41:14,460 When Video Motion is 50, go ahead and Play Sound Meow like this. 2306 01:41:14,460 --> 01:41:16,170 So the cat is still in that world. 2307 01:41:16,170 --> 01:41:18,970 I'm going to stop the program and rerun it. 2308 01:41:18,970 --> 01:41:21,090 So here we go, Green Flag. 2309 01:41:21,090 --> 01:41:24,780 And now here comes-- all right, this is a little creepy, 2310 01:41:24,780 --> 01:41:27,120 the way I'm petting the cat, but-- 2311 01:41:27,120 --> 01:41:30,640 and-- [SIGH] 2312 01:41:30,640 --> 01:41:31,600 2313 01:41:31,600 --> 01:41:32,940 [MEOWING] 2314 01:41:32,940 --> 01:41:33,440 OK. 2315 01:41:33,440 --> 01:41:35,750 [LAUGHTER] 2316 01:41:35,750 --> 01:41:36,290 There we go. 2317 01:41:36,290 --> 01:41:37,910 OK, so 50 was too big of a number. 2318 01:41:37,910 --> 01:41:39,500 I have to pet the cat faster. 2319 01:41:39,500 --> 01:41:41,925 [MEOWING] 2320 01:41:41,925 --> 01:41:42,900 2321 01:41:42,900 --> 01:41:44,940 Whereas this, if-- 2322 01:41:44,940 --> 01:41:46,410 I don't know-- 2323 01:41:46,410 --> 01:41:48,330 [LAUGHTER] 2324 01:41:48,330 --> 01:41:49,924 Yeah, so-- 2325 01:41:49,924 --> 01:41:50,710 [MEOW] 2326 01:41:50,710 --> 01:41:53,618 OK, so you can make things even more interactive in this way 2327 01:41:53,618 --> 01:41:55,410 by just assembling different puzzle pieces. 2328 01:41:55,410 --> 01:41:58,050 And honestly, there are so many different puzzle pieces in here. 2329 01:41:58,050 --> 01:42:00,610 We're not going to even scratch the surface of a lot of them. 2330 01:42:00,610 --> 01:42:02,940 But they generally just do what they say. 2331 01:42:02,940 --> 01:42:06,480 And indeed, when you see on the screen here this pallet 2332 01:42:06,480 --> 01:42:09,330 of puzzle pieces, really a lot of programming, especially early on, 2333 01:42:09,330 --> 01:42:12,970 when learning a language, is just trying different things and try and fail. 2334 01:42:12,970 --> 01:42:17,070 And if it doesn't work quite right, look for an alternative solution 2335 01:42:17,070 --> 01:42:20,000 there too, as even I just had to do a moment ago. 2336 01:42:20,000 --> 01:42:23,250 Well, let's go ahead and use, actually, how about another example of something 2337 01:42:23,250 --> 01:42:24,720 a predecessor of yours made? 2338 01:42:24,720 --> 01:42:28,830 Let me go ahead and grab a program I opened in advance here called 2339 01:42:28,830 --> 01:42:32,520 Whack-A-Mole Might we get a brave volunteer to come up, 2340 01:42:32,520 --> 01:42:38,895 who is willing to whack a mole with their head, virtually? 2341 01:42:38,895 --> 01:42:40,770 Maybe-- OK, let's see, how about in way back? 2342 01:42:40,770 --> 01:42:42,300 You want to come on down? 2343 01:42:42,300 --> 01:42:45,327 All right, come on down. 2344 01:42:45,327 --> 01:42:47,160 Sure, a round of applause for our volunteer. 2345 01:42:47,160 --> 01:42:49,382 [APPLAUSE] 2346 01:42:49,382 --> 01:42:52,130 2347 01:42:52,130 --> 01:42:56,835 All right, so here we have-- 2348 01:42:56,835 --> 01:42:59,930 2349 01:42:59,930 --> 01:43:01,178 come on down. 2350 01:43:01,178 --> 01:43:01,970 AUDIENCE: Hi there. 2351 01:43:01,970 --> 01:43:02,720 DAVID J. MALAN: What's your name? 2352 01:43:02,720 --> 01:43:03,320 AUDIENCE: I'm Josh. 2353 01:43:03,320 --> 01:43:05,695 DAVID J. MALAN: Oh, actually, say it into the microphone. 2354 01:43:05,695 --> 01:43:06,950 AUDIENCE: Hi, I'm Josh. 2355 01:43:06,950 --> 01:43:07,670 DAVID J. MALAN: OK, nice. 2356 01:43:07,670 --> 01:43:08,240 Welcome, Josh. 2357 01:43:08,240 --> 01:43:08,782 Come on over. 2358 01:43:08,782 --> 01:43:10,850 [APPLAUSE] 2359 01:43:10,850 --> 01:43:12,892 All right, so same idea here-- 2360 01:43:12,892 --> 01:43:13,850 I'll take the mic back. 2361 01:43:13,850 --> 01:43:15,230 You'll have to stand in front of the camera. 2362 01:43:15,230 --> 01:43:18,105 In just a moment, you're going to have to position your head in a box 2363 01:43:18,105 --> 01:43:20,150 that your classmate from yesteryear created. 2364 01:43:20,150 --> 01:43:22,340 [MUSIC PLAYING] 2365 01:43:22,340 --> 01:43:22,840 2366 01:43:22,840 --> 01:43:24,490 And we'll start with Beginner. 2367 01:43:24,490 --> 01:43:25,180 AUDIENCE: OK. 2368 01:43:25,180 --> 01:43:28,166 DAVID J. MALAN: So line your head up in the box in a moment. 2369 01:43:28,166 --> 01:43:29,142 AUDIENCE: All right. 2370 01:43:29,142 --> 01:43:37,438 2371 01:43:37,438 --> 01:43:39,878 [LAUGHTER] 2372 01:43:39,878 --> 01:43:43,800 2373 01:43:43,800 --> 01:43:45,390 DAVID J. MALAN: Nice. 2374 01:43:45,390 --> 01:43:46,155 12 seconds. 2375 01:43:46,155 --> 01:43:52,500 2376 01:43:52,500 --> 01:43:53,790 5 seconds. 2377 01:43:53,790 --> 01:43:55,710 Notice the score's up to 18 already. 2378 01:43:55,710 --> 01:43:58,410 Pretty good. 2379 01:43:58,410 --> 01:44:00,990 All right, a round of applause for Josh, if we could. 2380 01:44:00,990 --> 01:44:03,440 [APPLAUSE] 2381 01:44:03,440 --> 01:44:06,380 2382 01:44:06,380 --> 01:44:09,020 So notice how using some fairly simple primitives, 2383 01:44:09,020 --> 01:44:11,330 things do get interesting pretty fast. 2384 01:44:11,330 --> 01:44:12,560 And how was that implemented? 2385 01:44:12,560 --> 01:44:14,560 Well, there were probably at least four sprites. 2386 01:44:14,560 --> 01:44:16,222 So you're not confined to just one cat. 2387 01:44:16,222 --> 01:44:18,930 You can create more and more sprites, change what they look like. 2388 01:44:18,930 --> 01:44:20,930 So they actually look like a mole, in this case. 2389 01:44:20,930 --> 01:44:23,990 There's probably some conditionals in there, some loops for 30 seconds. 2390 01:44:23,990 --> 01:44:27,200 That's checking if Josh's head's movement is exceeding 2391 01:44:27,200 --> 01:44:29,210 some value over this way or over this way, 2392 01:44:29,210 --> 01:44:31,550 then increment something called a variable. 2393 01:44:31,550 --> 01:44:32,450 We'll see those too. 2394 01:44:32,450 --> 01:44:34,490 Just like in algebra you might have x and y 2395 01:44:34,490 --> 01:44:37,700 and z, storing values like numbers, so can computer programs, 2396 01:44:37,700 --> 01:44:42,350 have variables called x or y or z, or more descriptively called Score, 2397 01:44:42,350 --> 01:44:44,810 as in this case at top right, or another variable 2398 01:44:44,810 --> 01:44:47,780 called Countdown, typically one word in code, but in this case 2399 01:44:47,780 --> 01:44:49,632 two words, that just store some value. 2400 01:44:49,632 --> 01:44:51,590 So there's probably some math going on in there 2401 01:44:51,590 --> 01:44:55,040 whereby the author of this program just is incrementing, that is, 2402 01:44:55,040 --> 01:44:59,060 adding 1 and 1 every time it detected that a mole had been whacked, 2403 01:44:59,060 --> 01:45:00,570 in this case, with movement. 2404 01:45:00,570 --> 01:45:04,910 So back in the day, I, myself, actually implemented my very first program 2405 01:45:04,910 --> 01:45:08,180 in Scratch when I was a graduate student, actually, at MIT-- 2406 01:45:08,180 --> 01:45:11,290 cross-registered at MIT, taking a class from MIT's Media Lab, 2407 01:45:11,290 --> 01:45:14,540 specifically, the lifelong kindergarten group, which is the group that created 2408 01:45:14,540 --> 01:45:15,500 Scratch, itself. 2409 01:45:15,500 --> 01:45:19,580 And the program I wrote all those years ago and still 2410 01:45:19,580 --> 01:45:22,040 rather cling to is a little something here 2411 01:45:22,040 --> 01:45:26,620 called Oscartime, that I thought I'd play just a quick excerpt of myself 2412 01:45:26,620 --> 01:45:27,120 here. 2413 01:45:27,120 --> 01:45:30,530 So in this case, consider, as the music starts playing, 2414 01:45:30,530 --> 01:45:33,800 how this program, which is much more sophisticated, certainly, 2415 01:45:33,800 --> 01:45:38,060 than the earliest "Say hello" examples we just did might also be implemented. 2416 01:45:38,060 --> 01:45:40,745 Let me go ahead now and click the Green Flag. 2417 01:45:40,745 --> 01:45:44,950 [MUSIC - OSCAR THE GROUCH, "I LOVE TRASH"] 2418 01:45:44,950 --> 01:45:46,973 OSCAR THE GROUCH: (SINGING) Oh, I love trash. 2419 01:45:46,973 --> 01:45:50,140 DAVID J. MALAN: OK, so some trash is moving, presumably in some kind of loop 2420 01:45:50,140 --> 01:45:51,970 from the top. 2421 01:45:51,970 --> 01:45:56,440 If I'm touching the mouse cursor, it follows me. 2422 01:45:56,440 --> 01:45:59,920 If I hover over the trash can, it responds. 2423 01:45:59,920 --> 01:46:04,600 If I let go, in some kind of loop, Oscar pops out, 2424 01:46:04,600 --> 01:46:06,910 creates a variable with the current score. 2425 01:46:06,910 --> 01:46:07,900 And it happens again. 2426 01:46:07,900 --> 01:46:09,983 OSCAR THE GROUCH: (SINGING) It's awful, the holes. 2427 01:46:09,983 --> 01:46:11,950 And the laces are torn. 2428 01:46:11,950 --> 01:46:16,030 A gift from my mother the day I was born. 2429 01:46:16,030 --> 01:46:20,050 I love it because it's trash. 2430 01:46:20,050 --> 01:46:21,070 Oh, I-- 2431 01:46:21,070 --> 01:46:24,050 DAVID J. MALAN: It's pretty easy at first but-- 2432 01:46:24,050 --> 01:46:26,410 OSCAR THE GROUCH: (SINGING) --anything dirty or dingy-- 2433 01:46:26,410 --> 01:46:28,980 DAVID J. MALAN: So I don't need to keep playing this up 2434 01:46:28,980 --> 01:46:30,230 on stage in front of everyone. 2435 01:46:30,230 --> 01:46:32,950 So my score is already now up to some 6 or so. 2436 01:46:32,950 --> 01:46:35,900 But in a moment, too, you'll see that it's going to escalate. 2437 01:46:35,900 --> 01:46:38,080 So I'm taking into account some time apparently. 2438 01:46:38,080 --> 01:46:38,980 So now-- 2439 01:46:38,980 --> 01:46:42,343 OSCAR THE GROUCH: (SINGING) I have here some newspaper, 13 months old. 2440 01:46:42,343 --> 01:46:45,010 DAVID J. MALAN: So more and more sprites are suddenly appearing. 2441 01:46:45,010 --> 01:46:46,540 And notice, that each time they're appearing 2442 01:46:46,540 --> 01:46:48,040 from a different part of the screen. 2443 01:46:48,040 --> 01:46:49,840 That's an illusion, perhaps, too, that-- 2444 01:46:49,840 --> 01:46:52,270 pick a random number between x and y. 2445 01:46:52,270 --> 01:46:54,490 So you can actually pick some range of values 2446 01:46:54,490 --> 01:46:56,032 to have the game constantly changing. 2447 01:46:56,032 --> 01:46:58,073 And indeed, I'm going to go ahead and click Stop, 2448 01:46:58,073 --> 01:47:00,860 since I spent like eight hours plus, years ago, making this. 2449 01:47:00,860 --> 01:47:02,602 And I can never listen to the song again, 2450 01:47:02,602 --> 01:47:04,810 not that I should be anyway at this point in my life. 2451 01:47:04,810 --> 01:47:09,670 But this song is synchronized then with a lot of the actions that's happening. 2452 01:47:09,670 --> 01:47:12,130 And ultimately, there's just a lot of building blocks. 2453 01:47:12,130 --> 01:47:15,610 But I didn't sit down and implement Oscartime, as I called it, all at once. 2454 01:47:15,610 --> 01:47:17,500 I really did take baby steps, so to speak. 2455 01:47:17,500 --> 01:47:21,970 And I figured out, well, how could I decompose this vision I had at the time 2456 01:47:21,970 --> 01:47:24,220 to create this game ultimately? 2457 01:47:24,220 --> 01:47:26,470 And how do I bite off maybe the easiest parts first? 2458 01:47:26,470 --> 01:47:29,912 And honestly, the first thing I did was I found this image, and I just dragged 2459 01:47:29,912 --> 01:47:31,120 and dropped it into Scratch-- 2460 01:47:31,120 --> 01:47:33,580 OK, done-- like, lamppost is installed. 2461 01:47:33,580 --> 01:47:34,575 It doesn't do anything. 2462 01:47:34,575 --> 01:47:35,450 It's not interactive. 2463 01:47:35,450 --> 01:47:37,995 But I at least set the stage, so to speak, for the program. 2464 01:47:37,995 --> 01:47:39,370 Then what else might I have done? 2465 01:47:39,370 --> 01:47:40,640 Well, let me do this. 2466 01:47:40,640 --> 01:47:44,290 Let me go ahead and open up in another editor here 2467 01:47:44,290 --> 01:47:48,980 an early incarnation of Oscartime by doing this. 2468 01:47:48,980 --> 01:47:51,220 Let me go into Oscartime here. 2469 01:47:51,220 --> 01:47:52,510 Let me full screen this. 2470 01:47:52,510 --> 01:47:54,190 And here you have-- 2471 01:47:54,190 --> 01:47:56,080 let me hide the trash for just a moment-- 2472 01:47:56,080 --> 01:48:00,010 is what I might call the second version of my program, wherein, 2473 01:48:00,010 --> 01:48:03,220 at the top right of the stage here, I had the lamppost, which I just 2474 01:48:03,220 --> 01:48:06,267 dragged and dropped and got going, but then I added an actual sprite. 2475 01:48:06,267 --> 01:48:09,100 And it has to be a sprite if you want it to do things interactively. 2476 01:48:09,100 --> 01:48:10,420 The lamppost-- not a sprite. 2477 01:48:10,420 --> 01:48:13,240 It's just an image a costume, if you will, for the whole 2478 01:48:13,240 --> 01:48:14,680 stage itself, a backdrop. 2479 01:48:14,680 --> 01:48:16,780 But this thing is indeed a sprite because it 2480 01:48:16,780 --> 01:48:20,240 needs to respond to code and events, like dragging and dropping. 2481 01:48:20,240 --> 01:48:23,960 So what might I have done early on with that code? 2482 01:48:23,960 --> 01:48:26,350 Well, maybe the first version would have been 2483 01:48:26,350 --> 01:48:30,250 something like this, whereby my very first version of Oscartime 2484 01:48:30,250 --> 01:48:32,170 might have said something like, oh, this. 2485 01:48:32,170 --> 01:48:35,500 How about, let me control the program as before-- or, rather, events. 2486 01:48:35,500 --> 01:48:38,630 When the Green Flag is clicked, what do I want to do? 2487 01:48:38,630 --> 01:48:43,600 Well, I want to go ahead and forever do something like this. 2488 01:48:43,600 --> 01:48:46,687 Forever-- so I want the lid to open up if I touch it. 2489 01:48:46,687 --> 01:48:49,270 So if the cursor gets near the lid, I want the lid to open up. 2490 01:48:49,270 --> 01:48:51,340 And then if I move away, I want it to close. 2491 01:48:51,340 --> 01:48:52,640 So how can I do that? 2492 01:48:52,640 --> 01:48:56,080 I want an If, but I just don't want one question, I really want two, 2493 01:48:56,080 --> 01:48:59,200 a fork in the road that goes left or right, so to speak. 2494 01:48:59,200 --> 01:49:02,830 And let me grab this puzzle piece here, as I did long ago. 2495 01:49:02,830 --> 01:49:04,690 So notice, it grows to fill. 2496 01:49:04,690 --> 01:49:06,430 What's the question I want to ask? 2497 01:49:06,430 --> 01:49:08,680 Well, under Sensing, I'm going to go ahead here 2498 01:49:08,680 --> 01:49:12,670 and say If this trashcan is Touching the Mouse Pointer-- 2499 01:49:12,670 --> 01:49:13,863 what do I want to do? 2500 01:49:13,863 --> 01:49:16,030 Well, I want to change what the trashcan looks like. 2501 01:49:16,030 --> 01:49:17,740 And this part, I did in advance of class. 2502 01:49:17,740 --> 01:49:21,040 If you go up here to Costumes, this is where all the graphical stuff happens. 2503 01:49:21,040 --> 01:49:25,720 And you'll see that I imported a whole bunch of different costumes 2504 01:49:25,720 --> 01:49:29,080 that effectively, much like a video, when you play them quickly, 2505 01:49:29,080 --> 01:49:31,423 creates the illusion of movement, some animation. 2506 01:49:31,423 --> 01:49:33,340 But it's really just dot, dot, dot, dot, dot-- 2507 01:49:33,340 --> 01:49:35,320 different images showing on the screen. 2508 01:49:35,320 --> 01:49:39,250 Well, some of these costumes are called like Oscar1, Oscar2. 2509 01:49:39,250 --> 01:49:40,810 Oscar1 is closed. 2510 01:49:40,810 --> 01:49:42,070 Oscar2 is open. 2511 01:49:42,070 --> 01:49:43,730 So let's just deal with those first. 2512 01:49:43,730 --> 01:49:48,100 So if I'm touching the mouse pointer, let me go under-- how about Looks? 2513 01:49:48,100 --> 01:49:50,680 And we didn't use this before, but there's this block, 2514 01:49:50,680 --> 01:49:52,870 Switch Costume to Something Else. 2515 01:49:52,870 --> 01:49:55,150 I'm going to drag and drop this inside of the If. 2516 01:49:55,150 --> 01:49:57,070 And notice it's a little bit indented. 2517 01:49:57,070 --> 01:50:00,730 I'm going to change it not to Oscar8, but Oscar2. 2518 01:50:00,730 --> 01:50:03,340 Otherwise, If Not Touching the Mouse Pointer-- 2519 01:50:03,340 --> 01:50:05,890 this is the other direction in the fork in the road-- 2520 01:50:05,890 --> 01:50:10,840 let's go ahead and switch the costume back to what I described as Oscar1. 2521 01:50:10,840 --> 01:50:12,400 So let me run this program. 2522 01:50:12,400 --> 01:50:14,900 And not much of interest is happening yet. 2523 01:50:14,900 --> 01:50:18,550 But notice, if I move the cursor up, down-- 2524 01:50:18,550 --> 01:50:20,030 but how is that working? 2525 01:50:20,030 --> 01:50:22,940 It's just changing the costume that's being overlaid on the sprite. 2526 01:50:22,940 --> 01:50:24,790 So it looks like interactivity, but you are really 2527 01:50:24,790 --> 01:50:25,998 just changing the aesthetics. 2528 01:50:25,998 --> 01:50:29,135 And we humans are just kind of assuming, oh, it's opening up. 2529 01:50:29,135 --> 01:50:30,760 Well, no, it's just changing a costume. 2530 01:50:30,760 --> 01:50:31,802 So here's the difference. 2531 01:50:31,802 --> 01:50:34,210 The high-level abstraction-- trashcan opening. 2532 01:50:34,210 --> 01:50:36,850 The lower-level implementation detail-- costume 2533 01:50:36,850 --> 01:50:38,500 changing, creating that illusion. 2534 01:50:38,500 --> 01:50:41,680 And if I want it to look prettier, I could just have many other costumes 2535 01:50:41,680 --> 01:50:45,220 and go boom, boom, boom, boom, boom to create more frames per second, 2536 01:50:45,220 --> 01:50:46,130 if you will. 2537 01:50:46,130 --> 01:50:48,820 So I need to do one other thing. 2538 01:50:48,820 --> 01:50:51,130 Maybe if I accidentally leave the trashcan open, 2539 01:50:51,130 --> 01:50:52,750 let me make one change here. 2540 01:50:52,750 --> 01:50:54,730 Let me make sure that the very first thing 2541 01:50:54,730 --> 01:50:58,360 I do when the Green Flag is clicked, is always start with the trashcan 2542 01:50:58,360 --> 01:51:01,810 closed because otherwise, you might accidentally leave it open. 2543 01:51:01,810 --> 01:51:03,590 So this gets me into some default state. 2544 01:51:03,590 --> 01:51:08,133 So now it's always closed until I manually hover over it instead. 2545 01:51:08,133 --> 01:51:09,550 Well, what might I have done next? 2546 01:51:09,550 --> 01:51:13,587 Well, if I wanted to introduce something like the trash, I need a second sprite. 2547 01:51:13,587 --> 01:51:15,670 And here, in advance, I grabbed the image already. 2548 01:51:15,670 --> 01:51:18,310 Let me pretend that this never happened. 2549 01:51:18,310 --> 01:51:20,260 Let me drag this away here. 2550 01:51:20,260 --> 01:51:24,033 And now I have nothing in my code area for this piece of trash. 2551 01:51:24,033 --> 01:51:25,200 But it is the second sprite. 2552 01:51:25,200 --> 01:51:27,900 And all I did was I clicked on the little cat plus icon here, 2553 01:51:27,900 --> 01:51:29,190 created a second sprite. 2554 01:51:29,190 --> 01:51:30,330 I named it trash. 2555 01:51:30,330 --> 01:51:32,250 I added a costume for it. 2556 01:51:32,250 --> 01:51:34,170 Sort of the aesthetic stuff, I did in advance. 2557 01:51:34,170 --> 01:51:36,360 But here I'll do now the code. 2558 01:51:36,360 --> 01:51:37,720 How do I want to do this? 2559 01:51:37,720 --> 01:51:42,160 Well, how about when the Green Flag is clicked, for the trash can, 2560 01:51:42,160 --> 01:51:45,090 I want the trash can in parallel to do-- 2561 01:51:45,090 --> 01:51:48,190 I want the trash, the piece of trash, to do its own thing. 2562 01:51:48,190 --> 01:51:52,500 So what I want it to do is maybe let's do Motion, how about? 2563 01:51:52,500 --> 01:51:54,240 And let's go to a specific coordinate. 2564 01:51:54,240 --> 01:51:55,750 Now, there's a lot of options here. 2565 01:51:55,750 --> 01:52:00,870 There's Turning, Go to a Random Position, Go to x,y, Glide, 2566 01:52:00,870 --> 01:52:01,740 more elegantly. 2567 01:52:01,740 --> 01:52:03,990 There's a lot of different ways to implement movement. 2568 01:52:03,990 --> 01:52:06,310 I just want it to go to a very specific location first. 2569 01:52:06,310 --> 01:52:09,000 So I'm just going to go to x,y first. 2570 01:52:09,000 --> 01:52:13,350 And I'm going to say x, how about, will be-- 2571 01:52:13,350 --> 01:52:14,470 let's not hardcode this. 2572 01:52:14,470 --> 01:52:18,120 Let's just have it be-- well, let's do it at 0, initially, and then 240. 2573 01:52:18,120 --> 01:52:21,360 So-- whoops-- let's do 0,240 so that this piece of trash 2574 01:52:21,360 --> 01:52:23,410 always starts at the top middle of the screen. 2575 01:52:23,410 --> 01:52:26,160 If you think back to that coordinate system, 0,0 is in the middle. 2576 01:52:26,160 --> 01:52:28,230 240 is straight above it. 2577 01:52:28,230 --> 01:52:31,150 All right, now, after I do that, what do I want to do? 2578 01:52:31,150 --> 01:52:34,980 Well, how about I control this thing by forever falling. 2579 01:52:34,980 --> 01:52:36,427 Now, how do I make the trash move? 2580 01:52:36,427 --> 01:52:38,010 We haven't seen this puzzle piece yet. 2581 01:52:38,010 --> 01:52:42,390 But under Motion, the very first thing is called Move Some Number of Steps. 2582 01:52:42,390 --> 01:52:43,380 By default, it's 10. 2583 01:52:43,380 --> 01:52:44,880 But we'll do it more simply. 2584 01:52:44,880 --> 01:52:47,790 Let me go ahead and move-- 2585 01:52:47,790 --> 01:52:48,660 oh, sorry. 2586 01:52:48,660 --> 01:52:52,350 Move is going to move it in whatever direction it's facing. 2587 01:52:52,350 --> 01:52:53,753 I only want it to move down. 2588 01:52:53,753 --> 01:52:56,670 So here, even I'm getting confused as to how many different ways there 2589 01:52:56,670 --> 01:52:57,540 are to do things. 2590 01:52:57,540 --> 01:52:59,680 What I thing I want to do is this. 2591 01:52:59,680 --> 01:53:03,670 Let me only change my y-axis as follows. 2592 01:53:03,670 --> 01:53:06,060 So here's another puzzle piece called Change y. 2593 01:53:06,060 --> 01:53:07,680 So again, y is the vertical. 2594 01:53:07,680 --> 01:53:11,400 So let me just change y by one pixel downward 2595 01:53:11,400 --> 01:53:14,170 at a time, so -1 one pixel at a time. 2596 01:53:14,170 --> 01:53:15,540 So it's kind of slow. 2597 01:53:15,540 --> 01:53:17,010 And I think now-- 2598 01:53:17,010 --> 01:53:17,890 I think that's it. 2599 01:53:17,890 --> 01:53:18,990 Let me hit Stop. 2600 01:53:18,990 --> 01:53:21,700 Notice that my trashcan is still going to be interactive. 2601 01:53:21,700 --> 01:53:23,370 I haven't changed or deleted that code. 2602 01:53:23,370 --> 01:53:26,850 I've just added now code for my piece of trash. 2603 01:53:26,850 --> 01:53:30,120 If I click the Green Flag, notice that-- 2604 01:53:30,120 --> 01:53:32,920 after I enable it-- let me start that again. 2605 01:53:32,920 --> 01:53:34,320 I had it hidden for before class. 2606 01:53:34,320 --> 01:53:35,403 But let me enable it now-- 2607 01:53:35,403 --> 01:53:40,080 Green Flag, notice it starts dead center, at x equals 0, y equals 240, 2608 01:53:40,080 --> 01:53:42,750 and it's dropping one pixel at a time. 2609 01:53:42,750 --> 01:53:46,470 If that seems a little boring, we can change it to -10 pixels at a time 2610 01:53:46,470 --> 01:53:47,530 and, boom, it's done. 2611 01:53:47,530 --> 01:53:49,780 So that's how you might change the speed of a program. 2612 01:53:49,780 --> 01:53:51,750 But I'm going to leave it more simply as -1. 2613 01:53:51,750 --> 01:53:54,708 And honestly, it would be nice if it doesn't always start from the top. 2614 01:53:54,708 --> 01:53:57,083 Otherwise, this game is not going to be very interactive. 2615 01:53:57,083 --> 01:54:00,580 I'm literally going to be grabbing the trash from the same place every time. 2616 01:54:00,580 --> 01:54:03,250 So why don't I, instead, Stop this. 2617 01:54:03,250 --> 01:54:06,550 Let me go under Operators, and let's pick a random number. 2618 01:54:06,550 --> 01:54:08,370 So let me change the hardcoded-- 2619 01:54:08,370 --> 01:54:12,210 the manually inputted-- 0, and let's make x be somewhere between 0, 2620 01:54:12,210 --> 01:54:15,660 so in the middle and all the way over to-- 2621 01:54:15,660 --> 01:54:18,000 what was it-- oh, I got my numbers wrong-- 2622 01:54:18,000 --> 01:54:20,970 240 and my y will be 180. 2623 01:54:20,970 --> 01:54:23,560 Sorry, I got my x and my y confused. 2624 01:54:23,560 --> 01:54:25,420 So let me play this again. 2625 01:54:25,420 --> 01:54:27,645 And now we have a game that's more like games 2626 01:54:27,645 --> 01:54:29,520 you might have played growing up or even now, 2627 01:54:29,520 --> 01:54:30,978 like there's some randomness to it. 2628 01:54:30,978 --> 01:54:33,660 So the CPU, so to speak, is doing something more interesting. 2629 01:54:33,660 --> 01:54:34,570 Let me run it again. 2630 01:54:34,570 --> 01:54:35,820 Now it's a little to the left. 2631 01:54:35,820 --> 01:54:36,600 Let me run it again. 2632 01:54:36,600 --> 01:54:38,058 Now it's a little more to the left. 2633 01:54:38,058 --> 01:54:39,630 Again-- now it's back to the right. 2634 01:54:39,630 --> 01:54:41,640 So randomness just makes games more interesting. 2635 01:54:41,640 --> 01:54:44,130 And this is why when you play any video game, if different things are 2636 01:54:44,130 --> 01:54:46,172 happening, there's probably just some randomness. 2637 01:54:46,172 --> 01:54:48,360 And it's quantized as just a simple number. 2638 01:54:48,360 --> 01:54:52,050 Now, I think I just need one final flourish here, if I may. 2639 01:54:52,050 --> 01:54:54,060 Let me go ahead and add this. 2640 01:54:54,060 --> 01:54:57,570 How about Events-- or rather-- 2641 01:54:57,570 --> 01:54:58,380 yes, Events. 2642 01:54:58,380 --> 01:55:02,700 When Green Flag is clicked, I can do multiple things within the same sprite. 2643 01:55:02,700 --> 01:55:05,190 They don't all have to be attached to the same one. 2644 01:55:05,190 --> 01:55:10,110 Let me go ahead and forever go ahead and do something else. 2645 01:55:10,110 --> 01:55:13,470 How about, Whenever the Trash is-- 2646 01:55:13,470 --> 01:55:17,500 how about-- Touching the Trash Can-- 2647 01:55:17,500 --> 01:55:20,850 so Forever If-- let's see, I need a Sensing block. 2648 01:55:20,850 --> 01:55:24,000 So how about, Is Touching-- 2649 01:55:24,000 --> 01:55:28,530 not the Mouse Pointer, this time, but Touching Oscar himself there. 2650 01:55:28,530 --> 01:55:30,810 Now let's see what happens. 2651 01:55:30,810 --> 01:55:33,750 All right, so let's go ahead and click the Green Flag. 2652 01:55:33,750 --> 01:55:37,560 Now I go down over here and let go. 2653 01:55:37,560 --> 01:55:41,340 OK, I kind of want it to go into the trash can. 2654 01:55:41,340 --> 01:55:43,620 How do I make it go into the trash can? 2655 01:55:43,620 --> 01:55:47,610 How can we take this high-level idea, put trash into the trash can, 2656 01:55:47,610 --> 01:55:49,950 and make it seem to disappear? 2657 01:55:49,950 --> 01:55:51,520 Logically, what could we do? 2658 01:55:51,520 --> 01:55:52,370 Yeah-- 2659 01:55:52,370 --> 01:55:53,245 AUDIENCE: [INAUDIBLE] 2660 01:55:53,245 --> 01:55:56,037 DAVID J. MALAN: OK, so when it touches it, let's have it disappear. 2661 01:55:56,037 --> 01:55:56,910 So I could hide it. 2662 01:55:56,910 --> 01:55:59,490 Or honestly, if the game is going to be ongoing, like it was, 2663 01:55:59,490 --> 01:56:01,980 letting me drop more and more trash, let me just 2664 01:56:01,980 --> 01:56:04,380 have it go ahead and pick a new random location. 2665 01:56:04,380 --> 01:56:05,560 So let me do this. 2666 01:56:05,560 --> 01:56:09,073 Let me go ahead and Copy this puzzle piece up here and Duplicate. 2667 01:56:09,073 --> 01:56:10,740 And I don't want the whole thing, sorry. 2668 01:56:10,740 --> 01:56:12,400 Let me get rid of this. 2669 01:56:12,400 --> 01:56:13,540 Let me just do this. 2670 01:56:13,540 --> 01:56:16,720 Let me go back to some random location at the top. 2671 01:56:16,720 --> 01:56:17,940 So now notice what happens. 2672 01:56:17,940 --> 01:56:19,950 If I click and drag on it-- here it goes-- 2673 01:56:19,950 --> 01:56:23,730 and I let go, it looks like it's going into the trash can 2674 01:56:23,730 --> 01:56:26,318 because it snaps back up to some random location. 2675 01:56:26,318 --> 01:56:29,610 Now, the only thing I'm not doing really is keeping track of any kind of score. 2676 01:56:29,610 --> 01:56:33,150 And it turns out, if I full screen this, it's not going to be draggable, 2677 01:56:33,150 --> 01:56:33,940 by default. 2678 01:56:33,940 --> 01:56:35,940 So just as a corner case, so to speak, something 2679 01:56:35,940 --> 01:56:40,860 that you might trip over otherwise, let me go ahead and under, let's 2680 01:56:40,860 --> 01:56:45,960 see, Sensing, it turns out I also need this for the piece of trash. 2681 01:56:45,960 --> 01:56:49,500 There's this way of setting, in Scratch, a sprite 2682 01:56:49,500 --> 01:56:51,540 to be draggable or not draggable. 2683 01:56:51,540 --> 01:56:53,490 I need to explicitly make it draggable so 2684 01:56:53,490 --> 01:56:55,560 that when I do full screen this thing now, 2685 01:56:55,560 --> 01:56:58,320 it still remains draggable and someone like myself 2686 01:56:58,320 --> 01:57:00,240 can play it again and again. 2687 01:57:00,240 --> 01:57:03,120 Well, how about we supplement this with one final flourish? 2688 01:57:03,120 --> 01:57:06,010 Why don't we keep track now of the user score? 2689 01:57:06,010 --> 01:57:10,560 So how about, when the user actually drags the piece of trash 2690 01:57:10,560 --> 01:57:13,020 to the trash can, let me go under Variables here, 2691 01:57:13,020 --> 01:57:16,590 where, in advance, I've already made myself a variable called Score. 2692 01:57:16,590 --> 01:57:20,100 I could have called it x or y or z or ABC, but that's not very descriptive. 2693 01:57:20,100 --> 01:57:23,070 In programming, you typically give things a more descriptive English, 2694 01:57:23,070 --> 01:57:24,450 or some other language, name. 2695 01:57:24,450 --> 01:57:26,200 So I called this one Score. 2696 01:57:26,200 --> 01:57:28,710 So how do I want to do this in my Score? 2697 01:57:28,710 --> 01:57:31,890 Well, let me go ahead and initially set this game 2698 01:57:31,890 --> 01:57:35,880 score to 0 at the very top of one of these scripts-- 2699 01:57:35,880 --> 01:57:37,470 one of these programs up here. 2700 01:57:37,470 --> 01:57:42,570 And then any time my piece of trash is touching 2701 01:57:42,570 --> 01:57:49,630 Oscar, let's not just jump to the top, let's change the score by 1 up here. 2702 01:57:49,630 --> 01:57:52,680 So now notice, If Touching Oscar, Change the Score-- that is, 2703 01:57:52,680 --> 01:57:54,000 Add 1 to the Score-- 2704 01:57:54,000 --> 01:57:55,920 and then Pick a new Random location. 2705 01:57:55,920 --> 01:57:58,290 And now Green Flag-- 2706 01:57:58,290 --> 01:57:59,520 let's do this slowly. 2707 01:57:59,520 --> 01:58:00,540 Here it goes. 2708 01:58:00,540 --> 01:58:01,590 The trashcan opens. 2709 01:58:01,590 --> 01:58:02,520 I let go. 2710 01:58:02,520 --> 01:58:06,660 And now notice, at the top left of my program, notice the score is now 2. 2711 01:58:06,660 --> 01:58:10,140 Notice the score, if I do this again, is about to become 3. 2712 01:58:10,140 --> 01:58:12,870 And so here we have building blocks, literally, 2713 01:58:12,870 --> 01:58:15,910 of making this program better and better and better. 2714 01:58:15,910 --> 01:58:20,610 And so, indeed, that's how you generally approach solving any problem with code, 2715 01:58:20,610 --> 01:58:22,530 be it in Scratch or C or Python or some other. 2716 01:58:22,530 --> 01:58:24,975 You take this vision you might have or some vision 2717 01:58:24,975 --> 01:58:26,850 you've been assigned in a homework assignment 2718 01:58:26,850 --> 01:58:29,490 and try to break it down into these constituent parts 2719 01:58:29,490 --> 01:58:31,530 and just pluck off the easy ones first. 2720 01:58:31,530 --> 01:58:33,390 Put the lamp post there first, and at least 2721 01:58:33,390 --> 01:58:34,980 feel like you're making some progress. 2722 01:58:34,980 --> 01:58:37,188 Then pluck off something like the trash can, and just 2723 01:58:37,188 --> 01:58:38,457 make it do a little thing. 2724 01:58:38,457 --> 01:58:40,540 And it doesn't have to be in some same order here. 2725 01:58:40,540 --> 01:58:42,750 I could have done this in a million different ways. 2726 01:58:42,750 --> 01:58:46,410 But figure out what the small pieces are that, ultimately, 2727 01:58:46,410 --> 01:58:50,760 like a few of the problems we've solved today, assemble into a greater solution 2728 01:58:50,760 --> 01:58:52,380 there too. 2729 01:58:52,380 --> 01:58:56,410 So that you have now a mental model for these types of blocks and others, 2730 01:58:56,410 --> 01:58:58,470 let's return for a moment to this. 2731 01:58:58,470 --> 01:59:02,100 We saw a moment ago that when I started saying, "Hello, David," 2732 01:59:02,100 --> 01:59:06,670 and nesting those puzzle pieces, we had a whole different paradigm altogether. 2733 01:59:06,670 --> 01:59:10,630 My input for that second version of, "Hello, world," was to now pass in, 2734 01:59:10,630 --> 01:59:12,300 for instance, "What's Your Name?" 2735 01:59:12,300 --> 01:59:15,000 into my function, called Ask. 2736 01:59:15,000 --> 01:59:17,610 That gave me not a side effect, but what I called, 2737 01:59:17,610 --> 01:59:21,690 again, a return value, called Answer, by default, in Scratch. 2738 01:59:21,690 --> 01:59:25,710 And now notice and recall, when I had that same output 2739 01:59:25,710 --> 01:59:31,260 become the input to my next block, it looked a little something like this-- 2740 01:59:31,260 --> 01:59:32,100 Say. 2741 01:59:32,100 --> 01:59:36,240 So how does this type of block and this nesting, this stacking of blocks, 2742 01:59:36,240 --> 01:59:37,710 fit into the same mental model? 2743 01:59:37,710 --> 01:59:42,660 Well, same idea-- my input for that part of the story is now taking in not one 2744 01:59:42,660 --> 01:59:43,790 input but two-- 2745 01:59:43,790 --> 01:59:47,190 two arguments-- "hello" and the answer from before. 2746 01:59:47,190 --> 01:59:50,010 The function, in this case, is that new block called Join. 2747 01:59:50,010 --> 01:59:53,640 The output thereof is, "Hello, David," which itself became-- 2748 01:59:53,640 --> 01:59:55,170 if we sort of animate this-- 2749 01:59:55,170 --> 02:00:00,840 the input to my final function, which indeed was still Say. 2750 02:00:00,840 --> 02:00:03,150 And this is only to say-- no pun intended-- 2751 02:00:03,150 --> 02:00:06,570 that almost everything that you do with these puzzle pieces, 2752 02:00:06,570 --> 02:00:09,605 be it in the context of Oscartime or the mole whacking 2753 02:00:09,605 --> 02:00:11,730 or even just something simple like, "Hello, world," 2754 02:00:11,730 --> 02:00:16,320 will ultimately fit into that relatively simple mental model there. 2755 02:00:16,320 --> 02:00:20,220 Now, I thought we'd end by taking a look at just a couple of final examples. 2756 02:00:20,220 --> 02:00:22,950 These ones, too, made by some of your predecessors. 2757 02:00:22,950 --> 02:00:26,010 And for this, I thought we would not write code together, 2758 02:00:26,010 --> 02:00:27,760 but read it instead. 2759 02:00:27,760 --> 02:00:30,960 And so allow me to open up one other example here 2760 02:00:30,960 --> 02:00:34,770 that will show us a few different versions of a program 2761 02:00:34,770 --> 02:00:36,720 that a predecessor made. 2762 02:00:36,720 --> 02:00:38,340 Give me just a moment here. 2763 02:00:38,340 --> 02:00:42,960 And we'll see how we might build up to something even more interactive. 2764 02:00:42,960 --> 02:00:44,940 And in just a moment, we'll see something 2765 02:00:44,940 --> 02:00:51,090 they called Ivy's Hardest Game, focused here on these particular mechanics. 2766 02:00:51,090 --> 02:00:55,110 So here is version 0, so to speak, of this program, wherein 2767 02:00:55,110 --> 02:00:58,560 the goal was to create a game where you have to get out of some kind of maze. 2768 02:00:58,560 --> 02:01:01,800 And you have to get out, in this case, the Harvard crest from this maze. 2769 02:01:01,800 --> 02:01:04,170 Let me go ahead and just hit Play on this Green Flag 2770 02:01:04,170 --> 02:01:08,040 so you can see what the first building block for this program might have been. 2771 02:01:08,040 --> 02:01:12,990 Notice that my hand here is actually on the Arrow keys on my keyboard. 2772 02:01:12,990 --> 02:01:16,800 And it seems that by moving up, down, left, or right, 2773 02:01:16,800 --> 02:01:20,432 this little crest on the screen responds in exactly that way. 2774 02:01:20,432 --> 02:01:22,140 Now, let's hypothesize for just a moment. 2775 02:01:22,140 --> 02:01:24,900 Even though we've not done anything quite like this before, 2776 02:01:24,900 --> 02:01:27,260 how might this code be implemented? 2777 02:01:27,260 --> 02:01:30,740 How do you get a sprite, be it a cat or a crest, 2778 02:01:30,740 --> 02:01:34,220 to respond to keys on a keyboard-- might you think intuitively? 2779 02:01:34,220 --> 02:01:34,730 Yeah-- 2780 02:01:34,730 --> 02:01:36,983 AUDIENCE: [INAUDIBLE] 2781 02:01:36,983 --> 02:01:38,900 DAVID J. MALAN: Yeah, there could be something 2782 02:01:38,900 --> 02:01:40,410 sensing what key you're pressing on. 2783 02:01:40,410 --> 02:01:42,230 And if you do it again in forever a loop, 2784 02:01:42,230 --> 02:01:44,600 you'll just constantly be listening for keystrokes. 2785 02:01:44,600 --> 02:01:47,240 And this is how, like, every piece of software nowadays works. 2786 02:01:47,240 --> 02:01:49,910 It's constantly waiting for your phone to be tapped 2787 02:01:49,910 --> 02:01:51,690 or something to be typed on the screen. 2788 02:01:51,690 --> 02:01:55,400 So let me go ahead and look inside of this existing program here. 2789 02:01:55,400 --> 02:01:57,890 And there's more going on, but we'll take a quick glance 2790 02:01:57,890 --> 02:01:59,730 what's actually going on. 2791 02:01:59,730 --> 02:02:02,000 Well, up here at top left, notice, we just 2792 02:02:02,000 --> 02:02:04,850 have Go To x Equals 0 and y Equals 0. 2793 02:02:04,850 --> 02:02:07,850 That means put the Harvard crest dead center in the middle of the stage. 2794 02:02:07,850 --> 02:02:10,460 Then we have Forever two functions that we 2795 02:02:10,460 --> 02:02:13,130 made in advance as custom functions-- 2796 02:02:13,130 --> 02:02:15,500 Listen for Keyboard, Feel for Walls. 2797 02:02:15,500 --> 02:02:17,190 So it's doing two things at once. 2798 02:02:17,190 --> 02:02:19,403 It's forever listening for the keyboard-- up, 2799 02:02:19,403 --> 02:02:21,320 down, left, right-- and feeling for the walls, 2800 02:02:21,320 --> 02:02:23,278 in the sense that if I get too far to the left, 2801 02:02:23,278 --> 02:02:26,010 I don't want it to keep moving past that black wall. 2802 02:02:26,010 --> 02:02:28,520 And if it moves too far to the right, I don't want it to blow through that wall 2803 02:02:28,520 --> 02:02:29,060 either. 2804 02:02:29,060 --> 02:02:32,300 So it's going to do two things constantly, listening for keyboard 2805 02:02:32,300 --> 02:02:34,250 and feeling for walls, so to speak. 2806 02:02:34,250 --> 02:02:35,870 And how are those implemented? 2807 02:02:35,870 --> 02:02:37,190 Well, this one's a bit long. 2808 02:02:37,190 --> 02:02:40,080 But on the left here is Listen for Keyboard. 2809 02:02:40,080 --> 02:02:43,760 So this pink puzzle piece, Listen for Keyboard, 2810 02:02:43,760 --> 02:02:47,420 first checks If the Key Up Arrow is Pressed, question mark, 2811 02:02:47,420 --> 02:02:50,570 Boolean expression in a conditional, Change y By 1. 2812 02:02:50,570 --> 02:02:52,040 That means, move it up 1. 2813 02:02:52,040 --> 02:02:56,840 Else If the Key Down Arrow is Pressed, then Change y by -1, 2814 02:02:56,840 --> 02:02:59,540 and similar for Left Arrow, similar for Right Arrow. 2815 02:02:59,540 --> 02:03:02,660 And even though there's not a loop in this pink function, 2816 02:03:02,660 --> 02:03:04,310 there is where I'm using it. 2817 02:03:04,310 --> 02:03:06,860 So it's constantly being asked again and again. 2818 02:03:06,860 --> 02:03:08,420 How about feeling for walls? 2819 02:03:08,420 --> 02:03:10,010 Well, over here to the right-- 2820 02:03:10,010 --> 02:03:13,970 it's a little cut off-- but here you have, If Touching Left Wall, 2821 02:03:13,970 --> 02:03:15,260 Change x by 1. 2822 02:03:15,260 --> 02:03:17,200 So if you hit the wall, it's too late. 2823 02:03:17,200 --> 02:03:18,950 You're kind of blowing through it already. 2824 02:03:18,950 --> 02:03:23,000 So I want to move it back one pixel so it's no longer touching that wall. 2825 02:03:23,000 --> 02:03:26,670 Similarly, if it's touching the right wall, I want to back it up one pixel 2826 02:03:26,670 --> 02:03:28,220 so it's no longer touching that wall. 2827 02:03:28,220 --> 02:03:31,070 So it's kind of like bouncing off ever so slightly so that it 2828 02:03:31,070 --> 02:03:33,110 doesn't slip through that actual wall. 2829 02:03:33,110 --> 02:03:34,340 And what are those walls? 2830 02:03:34,340 --> 02:03:38,870 Well, notice down here, it's just a simple sprite with a black line 2831 02:03:38,870 --> 02:03:41,790 that I've oriented vertically instead of horizontally. 2832 02:03:41,790 --> 02:03:45,230 And that's just so that I can ask questions of these other two sprites. 2833 02:03:45,230 --> 02:03:47,570 Now, that gives me that form of interactivity. 2834 02:03:47,570 --> 02:03:49,200 What more can I now do? 2835 02:03:49,200 --> 02:03:52,410 Well, what if we make things a little more interactive here? 2836 02:03:52,410 --> 02:03:55,640 Let me go ahead and see inside version 1 our second. 2837 02:03:55,640 --> 02:03:58,860 And let me propose what's going to happen here. 2838 02:03:58,860 --> 02:04:02,600 Well, how might we add a little something like Yale into the mix? 2839 02:04:02,600 --> 02:04:07,460 Well, what's Yale going to do when I hit the Green Flag now based on this code? 2840 02:04:07,460 --> 02:04:09,920 Any hunches? 2841 02:04:09,920 --> 02:04:13,250 Here is the code for my Yale sprite. 2842 02:04:13,250 --> 02:04:13,820 Yeah-- 2843 02:04:13,820 --> 02:04:14,570 AUDIENCE: [INAUDIBLE] 2844 02:04:14,570 --> 02:04:15,650 DAVID J. MALAN: Yeah, it's kind of going to be 2845 02:04:15,650 --> 02:04:18,203 an adversarially by blocking my path, theoretically, 2846 02:04:18,203 --> 02:04:19,370 if I keep writing more code. 2847 02:04:19,370 --> 02:04:20,030 So why? 2848 02:04:20,030 --> 02:04:22,160 It too goes to the middle of the screen. 2849 02:04:22,160 --> 02:04:23,940 It points in direction 90 degrees. 2850 02:04:23,940 --> 02:04:26,520 So similarly, there's a whole degree system as well. 2851 02:04:26,520 --> 02:04:27,710 And it forever asks this. 2852 02:04:27,710 --> 02:04:29,750 If Touching the Left Wall Or-- 2853 02:04:29,750 --> 02:04:30,920 notice the green block-- 2854 02:04:30,920 --> 02:04:33,900 Touching the Right Wall, then just Turn around 180 Degrees. 2855 02:04:33,900 --> 02:04:35,900 And indeed, if you think this through logically, 2856 02:04:35,900 --> 02:04:38,570 that just means you're bouncing this way and this way 2857 02:04:38,570 --> 02:04:42,860 by just flipping yourself around 180 degrees for just this Yale sprite. 2858 02:04:42,860 --> 02:04:46,550 So if I go ahead and zoom in on this and click the Green Flag, 2859 02:04:46,550 --> 02:04:48,350 I can still move up and down. 2860 02:04:48,350 --> 02:04:52,170 But Yale is just kind of doing this all day long, back and forth 2861 02:04:52,170 --> 02:04:53,490 and back and forth, forever. 2862 02:04:53,490 --> 02:04:55,710 Nothing bad happens if I try to go through it. 2863 02:04:55,710 --> 02:04:58,010 But we could add that, certainly, to the mix. 2864 02:04:58,010 --> 02:05:01,760 In fact, let's add one final feature before we play this particular game. 2865 02:05:01,760 --> 02:05:06,320 And let me go ahead and open up the final version of these building blocks 2866 02:05:06,320 --> 02:05:08,640 that adds MIT to the mix. 2867 02:05:08,640 --> 02:05:10,940 So here is MIT. 2868 02:05:10,940 --> 02:05:13,182 Someone want to explain what this code does? 2869 02:05:13,182 --> 02:05:14,390 And this is what we're doing. 2870 02:05:14,390 --> 02:05:15,470 This itself is a skill. 2871 02:05:15,470 --> 02:05:17,810 Reading someone else's code and understanding it 2872 02:05:17,810 --> 02:05:20,640 is half of the part of programming besides writing. 2873 02:05:20,640 --> 02:05:21,140 Yeah-- 2874 02:05:21,140 --> 02:05:22,015 AUDIENCE: [INAUDIBLE] 2875 02:05:22,015 --> 02:05:24,960 DAVID J. MALAN: Yeah, it's chasing down the Harvard logo outline. 2876 02:05:24,960 --> 02:05:26,870 So this is apparently the name of the costume 2877 02:05:26,870 --> 02:05:30,050 that this student made, Harvard logo outline. 2878 02:05:30,050 --> 02:05:32,600 And apparently, it goes to a random position first. 2879 02:05:32,600 --> 02:05:34,700 But then it forever points to Harvard. 2880 02:05:34,700 --> 02:05:36,830 So no matter where I'm moving it, up, down, left, 2881 02:05:36,830 --> 02:05:39,413 or right, MIT is being a little more strategic than Yale, 2882 02:05:39,413 --> 02:05:40,830 bouncing back and forth like this. 2883 02:05:40,830 --> 02:05:43,440 So let's go ahead and play this one in full screen. 2884 02:05:43,440 --> 02:05:45,540 And here we have a Green Flag. 2885 02:05:45,540 --> 02:05:50,750 So if I move up, MIT, rather strategically, 2886 02:05:50,750 --> 02:05:53,210 is following me no matter where I go. 2887 02:05:53,210 --> 02:05:55,190 All right, so still, nothing bad happens. 2888 02:05:55,190 --> 02:05:56,940 But now it's struggling, right? 2889 02:05:56,940 --> 02:05:58,190 It's going up, down, up, down. 2890 02:05:58,190 --> 02:06:00,950 It's trying to follow me even though I'm not moving. 2891 02:06:00,950 --> 02:06:02,630 So we need some final flourishes. 2892 02:06:02,630 --> 02:06:06,740 And so I think, for this, we need perhaps one final volunteer. 2893 02:06:06,740 --> 02:06:09,830 After this, cake awaits for everyone outside, 2894 02:06:09,830 --> 02:06:11,990 as is an end of first lecture CS50 tradition. 2895 02:06:11,990 --> 02:06:14,840 Would you like to come up and be our volunteer? 2896 02:06:14,840 --> 02:06:17,230 [APPLAUSE] 2897 02:06:17,230 --> 02:06:23,450 2898 02:06:23,450 --> 02:06:24,040 All right. 2899 02:06:24,040 --> 02:06:28,330 And so this will be the actual version but written by one of your predecessors 2900 02:06:28,330 --> 02:06:30,040 that I'll full screen here. 2901 02:06:30,040 --> 02:06:33,040 It's going to stitch together all of these same primitives and more, 2902 02:06:33,040 --> 02:06:36,430 but add the notion of scores and lives so that there's actually 2903 02:06:36,430 --> 02:06:41,260 a goal, which in this case is to move the Harvard crest to constantly pursue 2904 02:06:41,260 --> 02:06:44,650 the character on the right-hand side so that your sprite touches that one. 2905 02:06:44,650 --> 02:06:46,533 Would you like to introduce yourself? 2906 02:06:46,533 --> 02:06:47,950 AUDIENCE: Hi, my name is Mohammed. 2907 02:06:47,950 --> 02:06:49,000 DAVID J. MALAN: All right, wonderful. 2908 02:06:49,000 --> 02:06:49,630 Welcome aboard. 2909 02:06:49,630 --> 02:06:51,910 And here we come with some instructions and final 2910 02:06:51,910 --> 02:06:56,048 flourish if we want to keep the lights up but perhaps increase the music. 2911 02:06:56,048 --> 02:06:58,236 [MUSIC PLAYING] 2912 02:06:58,236 --> 02:06:58,736 2913 02:06:58,736 --> 02:07:00,486 [MUSIC - MC HAMMER, "U CAN'T TOUCH THIS"] 2914 02:07:00,486 --> 02:07:02,150 MC HAMMER: (SINGING) You can't this. 2915 02:07:02,150 --> 02:07:03,025 You can't touch this. 2916 02:07:03,025 --> 02:07:05,567 DAVID J. MALAN: Notice he is using the up, down, left, right. 2917 02:07:05,567 --> 02:07:07,320 But there's many more walls now. 2918 02:07:07,320 --> 02:07:08,730 First level's pretty easy. 2919 02:07:08,730 --> 02:07:13,560 But now Yale's in the mix, bouncing back and forth. 2920 02:07:13,560 --> 02:07:15,420 Again, pretty easy. 2921 02:07:15,420 --> 02:07:22,290 Now there's two Yale's at slightly different positions. 2922 02:07:22,290 --> 02:07:23,730 MIT is coming soon. 2923 02:07:23,730 --> 02:07:25,432 But first, we have three Yales. 2924 02:07:25,432 --> 02:07:26,640 MC HAMMER: (SINGING) As such. 2925 02:07:26,640 --> 02:07:28,542 And this is a beat, uh, you can't touch. 2926 02:07:28,542 --> 02:07:29,625 DAVID J. MALAN: Very nice. 2927 02:07:29,625 --> 02:07:30,125 [APPLAUSE] 2928 02:07:30,125 --> 02:07:33,100 MC HAMMER: (SINGING) I told you, homeboy, you can't touch this. 2929 02:07:33,100 --> 02:07:36,820 Yeah, that's how it look when you know you can't touch this. 2930 02:07:36,820 --> 02:07:40,798 Look at my eyes, man, you can't touch this. 2931 02:07:40,798 --> 02:07:43,090 Yo, let me bust the funky lyrics. you can't touch this. 2932 02:07:43,090 --> 02:07:45,171 Fresh new kicks and pants, you got to like that. 2933 02:07:45,171 --> 02:07:46,504 Now, you know you want to dance. 2934 02:07:46,504 --> 02:07:48,570 So move out of your seat and get a fly-- 2935 02:07:48,570 --> 02:07:49,290 DAVID J. MALAN: You got to go quick. 2936 02:07:49,290 --> 02:07:51,623 MC HAMMER: (SINGING) Catch this beat while it's rolling. 2937 02:07:51,623 --> 02:07:52,130 Hold on. 2938 02:07:52,130 --> 02:07:55,490 Pump a little bit, and let them know what's going on, like that, like that. 2939 02:07:55,490 --> 02:07:57,056 Cold on a mission, so fall on back. 2940 02:07:57,056 --> 02:08:02,800 Let them know that you're too much and this a beat, uh, they can't touch. 2941 02:08:02,800 --> 02:08:03,627 Yo, I told you. 2942 02:08:03,627 --> 02:08:04,502 You can't touch this. 2943 02:08:04,502 --> 02:08:06,882 [APPLAUSE] 2944 02:08:06,882 --> 02:08:08,790 2945 02:08:08,790 --> 02:08:09,810 Yo, sound the bell. 2946 02:08:09,810 --> 02:08:10,975 School's in, sucker. 2947 02:08:10,975 --> 02:08:11,850 You can't touch this. 2948 02:08:11,850 --> 02:08:13,432 Give me a song, a rhythm. 2949 02:08:13,432 --> 02:08:15,390 Making them sweat, that's what I'm giving them. 2950 02:08:15,390 --> 02:08:17,892 Now they know, you talk about the Hammer, 2951 02:08:17,892 --> 02:08:20,810 you talking about a show that's hyped and tight. 2952 02:08:20,810 --> 02:08:24,018 Singers are sweating, so pass them a wipe or a tape to learn. 2953 02:08:24,018 --> 02:08:25,060 What's it going to take-- 2954 02:08:25,060 --> 02:08:27,040 DAVID J. MALAN: Second-to-last level. 2955 02:08:27,040 --> 02:08:28,165 MC HAMMER: (SINGING) Legit. 2956 02:08:28,165 --> 02:08:30,065 Either work hard or you might as well quit. 2957 02:08:30,065 --> 02:08:31,410 That's word because you know-- 2958 02:08:31,410 --> 02:08:32,535 DAVID J. MALAN: Last level. 2959 02:08:32,535 --> 02:08:35,652 MC HAMMER: (SINGING) You can't touch this. 2960 02:08:35,652 --> 02:08:37,124 DAVID J. MALAN: Hey! 2961 02:08:37,124 --> 02:08:37,624 [LAUGHS] 2962 02:08:37,624 --> 02:08:39,710 [APPLAUSE] 2963 02:08:39,710 --> 02:08:40,210 Congrats. 2964 02:08:40,210 --> 02:08:45,170 2965 02:08:45,170 --> 02:08:47,570 All right, that's it for CS50. 2966 02:08:47,570 --> 02:08:48,410 Welcome. 2967 02:08:48,410 --> 02:08:49,820 Cake is now served. 2968 02:08:49,820 --> 02:08:51,950 We'll see you next time. 2969 02:08:51,950 --> 02:08:53,450 [PROJECTOR CLICKING] 2970 02:08:53,450 --> 02:08:56,800 [MUSIC PLAYING] 2971 02:08:56,800 --> 02:09:29,000243811

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.