All language subtitles for نفس الملف الاجليزى بتاع الترجمه
Afrikaans
Akan
Albanian
Amharic
Arabic
Armenian
Azerbaijani
Basque
Belarusian
Bemba
Bengali
Bihari
Bosnian
Breton
Bulgarian
Cambodian
Catalan
Cebuano
Cherokee
Chichewa
Chinese (Simplified)
Chinese (Traditional)
Corsican
Croatian
Czech
Danish
Dutch
English
Esperanto
Estonian
Ewe
Faroese
Filipino
Finnish
French
Frisian
Ga
Galician
Georgian
German
Greek
Guarani
Gujarati
Haitian Creole
Hausa
Hawaiian
Hebrew
Hindi
Hmong
Hungarian
Icelandic
Igbo
Indonesian
Interlingua
Irish
Italian
Japanese
Javanese
Kannada
Kazakh
Kinyarwanda
Kirundi
Kongo
Korean
Krio (Sierra Leone)
Kurdish
Kurdish (Soranî)
Kyrgyz
Laothian
Latin
Latvian
Lingala
Lithuanian
Lozi
Luganda
Luo
Luxembourgish
Macedonian
Malagasy
Malay
Malayalam
Maltese
Maori
Marathi
Mauritian Creole
Moldavian
Mongolian
Myanmar (Burmese)
Montenegrin
Nepali
Nigerian Pidgin
Northern Sotho
Norwegian
Norwegian (Nynorsk)
Occitan
Oriya
Oromo
Pashto
Persian
Polish
Portuguese (Brazil)
Portuguese (Portugal)
Punjabi
Quechua
Romanian
Romansh
Runyakitara
Russian
Samoan
Scots Gaelic
Serbian
Serbo-Croatian
Sesotho
Setswana
Seychellois Creole
Shona
Sindhi
Sinhalese
Slovak
Slovenian
Somali
Spanish
Spanish (Latin American)
Sundanese
Swahili
Swedish
Tajik
Tamil
Tatar
Telugu
Thai
Tigrinya
Tonga
Tshiluba
Tumbuka
Turkish
Turkmen
Twi
Uighur
Ukrainian
Urdu
Uzbek
Vietnamese
Welsh
Wolof
Xhosa
Yiddish
Yoruba
Zulu
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
0
00:00:00,000 --> 00:01:17,581
1
00:01:17,581 --> 00:01:18,501
2
00:01:18,501 --> 00:01:22,981
DAVID MALAN: All right, this is CS50, Harvard University's introduction
3
00:01:22,981 --> 00:01:25,291
to the intellectual enterprises of computer science
4
00:01:25,291 --> 00:01:29,041
and the art of programming, back here on campus in beautiful Sanders Theatre
5
00:01:29,041 --> 00:01:31,111
for the first time in quite a while.
6
00:01:31,111 --> 00:01:33,701
So welcome to the class.
7
00:01:33,701 --> 00:01:35,081
My name is David--
8
00:01:35,081 --> 00:01:35,847
OK.
9
00:01:35,847 --> 00:01:39,249
[CHEERING AND APPLAUSE]
10
00:01:44,601 --> 00:01:46,011
So my name is David Malan.
11
00:01:46,011 --> 00:01:49,611
And I took this class myself some time ago, but almost didn't.
12
00:01:49,611 --> 00:01:52,821
It was sophomore fall and I was sitting in on the class.
13
00:01:52,821 --> 00:01:55,131
And I was a little curious but, eh, it didn't really
14
00:01:55,131 --> 00:01:57,208
feel like the field for me.
15
00:01:57,208 --> 00:01:59,541
I was definitely a computer person, but computer science
16
00:01:59,541 --> 00:02:01,014
felt like something altogether.
17
00:02:01,014 --> 00:02:02,931
And I only got up the nerve to take the class,
18
00:02:02,931 --> 00:02:05,571
ultimately, because the professor at the time, Brian Kernighan,
19
00:02:05,571 --> 00:02:08,301
allowed me to take the class pass/fail, initially.
20
00:02:08,301 --> 00:02:10,191
And that is what made all the difference.
21
00:02:10,191 --> 00:02:12,681
I quickly found that computer science is not just
22
00:02:12,681 --> 00:02:15,501
about programming and working in isolation on your computer.
23
00:02:15,501 --> 00:02:18,091
It's really about problem solving more generally.
24
00:02:18,091 --> 00:02:20,781
And there was something about homework, frankly,
25
00:02:20,781 --> 00:02:24,171
that was, like, actually fun for perhaps the first time in, what, 19 years.
26
00:02:24,171 --> 00:02:26,696
And there was something about this ability
27
00:02:26,696 --> 00:02:28,821
that I discovered, along with all of my classmates,
28
00:02:28,821 --> 00:02:33,073
to actually create something and bring a computer to life to solve a problem,
29
00:02:33,073 --> 00:02:35,781
and sort of bring to bear something that I'd been using every day
30
00:02:35,781 --> 00:02:38,961
but didn't really know how to harness, that's been gratifying ever since,
31
00:02:38,961 --> 00:02:40,851
and definitely challenging and frustrating.
32
00:02:40,851 --> 00:02:43,453
Like, to this day, all these years later,
33
00:02:43,453 --> 00:02:46,161
you're going to run up against mistakes, otherwise known as bugs,
34
00:02:46,161 --> 00:02:47,811
in programming, that just drive you nuts.
35
00:02:47,811 --> 00:02:49,311
And you feel like you've hit a wall.
36
00:02:49,311 --> 00:02:51,651
But the trick really is to give it enough time,
37
00:02:51,651 --> 00:02:53,881
to take a step back, take a break when you need to.
38
00:02:53,881 --> 00:02:57,141
And there's nothing better, I daresay, than that sense of gratification
39
00:02:57,141 --> 00:02:58,869
and pride, really, when you get something
40
00:02:58,869 --> 00:03:01,161
to work, and in a class like this, present, ultimately,
41
00:03:01,161 --> 00:03:04,791
at term's end, something like your very own final project.
42
00:03:04,791 --> 00:03:08,251
Now, this isn't to say that I took to it 100% perfectly.
43
00:03:08,251 --> 00:03:13,461
In fact, just this past week, I looked in my old CS50 binder, which I still
44
00:03:13,461 --> 00:03:15,981
have from some 25 years ago, and took a photo
45
00:03:15,981 --> 00:03:20,661
of what was apparently the very first program that I wrote and submitted,
46
00:03:20,661 --> 00:03:22,971
and quickly received minus 2 points on.
47
00:03:22,971 --> 00:03:26,151
But this is a program that we'll soon see in the coming days that
48
00:03:26,151 --> 00:03:30,441
does something quite simply like print "Hello, CS50," in this case,
49
00:03:30,441 --> 00:03:31,109
to the screen.
50
00:03:31,109 --> 00:03:32,901
And to be fair, I technically hadn't really
51
00:03:32,901 --> 00:03:35,181
followed the directions, which is why I lost those couple of points.
52
00:03:35,181 --> 00:03:38,503
But if you just look at this, especially if you've never programmed before,
53
00:03:38,503 --> 00:03:40,461
you might have heard about programming language
54
00:03:40,461 --> 00:03:42,419
but you've never typed something like this out,
55
00:03:42,419 --> 00:03:44,181
undoubtedly it's going to look cryptic.
56
00:03:44,181 --> 00:03:46,221
But unlike human languages, frankly, which
57
00:03:46,221 --> 00:03:50,181
were a lot more sophisticated, a lot more vocabulary, a lot more
58
00:03:50,181 --> 00:03:54,321
grammatical rules, programming, once you start to wrap your mind around what
59
00:03:54,321 --> 00:03:57,434
it is and how it works and what these various languages are, it's so easy,
60
00:03:57,434 --> 00:03:59,601
you'll see, after a few months of a class like this,
61
00:03:59,601 --> 00:04:01,701
to start teaching yourself, subsequently,
62
00:04:01,701 --> 00:04:05,431
other languages, as they may come, in the coming years as well.
63
00:04:05,431 --> 00:04:08,751
So what ultimately matters in this particular course
64
00:04:08,751 --> 00:04:11,391
is not so much where you end up relative to your classmates
65
00:04:11,391 --> 00:04:14,601
but where you end up relative to yourself when you began.
66
00:04:14,601 --> 00:04:16,081
And indeed, you'll begin today.
67
00:04:16,081 --> 00:04:19,611
And the only experience that matters ultimately in this class is your own.
68
00:04:19,611 --> 00:04:21,741
And so, consider where you are today.
69
00:04:21,741 --> 00:04:24,231
Consider, perhaps, just how cryptic something like that
70
00:04:24,231 --> 00:04:25,551
looked a few seconds ago.
71
00:04:25,551 --> 00:04:28,881
And take comfort in knowing just some months from now all of that
72
00:04:28,881 --> 00:04:31,109
will be within your own grasp.
73
00:04:31,109 --> 00:04:34,401
And if you're thinking that, OK, surely the person in front of me, to the left,
74
00:04:34,401 --> 00:04:38,121
to the right, behind me, knows more than me, that's statistically not the case.
75
00:04:38,121 --> 00:04:42,801
2/3 of CS50 students have never taken a CS course before, which is to say,
76
00:04:42,801 --> 00:04:47,431
you're in very good company throughout this whole term.
77
00:04:47,431 --> 00:04:49,521
So then, what is computer science?
78
00:04:49,521 --> 00:04:51,141
I claim that it's problem solving.
79
00:04:51,141 --> 00:04:53,421
And the upside of that is that problem solving is
80
00:04:53,421 --> 00:04:55,731
something we sort of do all the time.
81
00:04:55,731 --> 00:04:58,534
But a computer science class, learning to program,
82
00:04:58,534 --> 00:05:00,201
I think kind of cleans up your thoughts.
83
00:05:00,201 --> 00:05:03,741
It helps you learn how to think more methodically, more carefully, more
84
00:05:03,741 --> 00:05:05,331
correctly, more precisely.
85
00:05:05,331 --> 00:05:07,164
Because, honestly, the computer is not going
86
00:05:07,164 --> 00:05:10,371
to do what you want unless you are correct and precise and methodical.
87
00:05:10,371 --> 00:05:12,596
And so, as such, there's these fringe benefits
88
00:05:12,596 --> 00:05:15,471
of just learning to think like a computer scientist and a programmer.
89
00:05:15,471 --> 00:05:18,261
And it doesn't take all that much to start doing so.
90
00:05:18,261 --> 00:05:21,921
This, for instance, is perhaps the simplest picture of computer science,
91
00:05:21,921 --> 00:05:23,841
sure, but really problem solving in general.
92
00:05:23,841 --> 00:05:27,171
Problems are all about taking input, like the problem you want to solve.
93
00:05:27,171 --> 00:05:29,061
You want to get the solution, a.k.a.
94
00:05:29,061 --> 00:05:29,751
output.
95
00:05:29,751 --> 00:05:32,451
And so, something interesting has got to be happening in here,
96
00:05:32,451 --> 00:05:35,941
in here, when you're trying to get from those inputs to outputs.
97
00:05:35,941 --> 00:05:38,511
Now, in the world of computers specifically,
98
00:05:38,511 --> 00:05:42,381
we need to decide in advance how we represent these inputs and outputs.
99
00:05:42,381 --> 00:05:46,424
We all just need to decide, whether it's Macs or PCs or phones or something
100
00:05:46,424 --> 00:05:49,341
else, that we're all going to speak some common language, irrespective
101
00:05:49,341 --> 00:05:51,541
of our human languages as well.
102
00:05:51,541 --> 00:05:55,251
And you may very well know that computers tend to speak only
103
00:05:55,251 --> 00:05:59,441
what language, so to speak?
104
00:05:59,441 --> 00:06:01,931
Assembly, one, but binary, two, might be your go-to.
105
00:06:01,931 --> 00:06:05,021
And binary, by implying two, means that the world of computers
106
00:06:05,021 --> 00:06:08,681
has just two digits at its disposal, 0 and 1.
107
00:06:08,681 --> 00:06:12,761
And indeed, we humans have many more than that, certainly not just zeros
108
00:06:12,761 --> 00:06:13,391
and ones alone.
109
00:06:13,391 --> 00:06:15,821
But a computer indeed only has zeros and ones.
110
00:06:15,821 --> 00:06:18,041
And yet, somehow they can do so much.
111
00:06:18,041 --> 00:06:20,411
They can crunch numbers in Excel, send text messages,
112
00:06:20,411 --> 00:06:23,781
create images and artwork and movies and more.
113
00:06:23,781 --> 00:06:27,491
And so, how do you get from something as simple as a few zeros, a few ones,
114
00:06:27,491 --> 00:06:29,621
to all of the stuff that we're doing today
115
00:06:29,621 --> 00:06:31,571
in our pockets and laptops and desktops?
116
00:06:31,571 --> 00:06:34,271
Well, it turns out that we can start quite simply.
117
00:06:34,271 --> 00:06:38,171
If a computer were to want to do something as simple as count, well,
118
00:06:38,171 --> 00:06:38,891
what could it do?
119
00:06:38,891 --> 00:06:41,891
Well, in our human world, we might count doing this,
120
00:06:41,891 --> 00:06:46,479
like 1, 2, 3, 4, 5, using so-called unitary notation, literally the digits
121
00:06:46,479 --> 00:06:49,271
on your fingers where one finger represents one person in the room,
122
00:06:49,271 --> 00:06:51,221
if I'm, for instance, taking attendance.
123
00:06:51,221 --> 00:06:55,301
Now, we humans would typically actually count 1, 2, 3, 4, 5, 6.
124
00:06:55,301 --> 00:06:58,181
And we'd go past just those five digits and count much higher,
125
00:06:58,181 --> 00:06:59,651
using zeros through nines.
126
00:06:59,651 --> 00:07:02,571
But computers, somehow, only have these zeros and ones.
127
00:07:02,571 --> 00:07:05,891
So if a computer only somehow speaks binary, zeros and ones,
128
00:07:05,891 --> 00:07:08,881
how does it even count past the number 1?
129
00:07:08,881 --> 00:07:11,441
Well, here are 3 zeros, of course.
130
00:07:11,441 --> 00:07:14,951
And if you translate this number in binary, 000,
131
00:07:14,951 --> 00:07:18,851
to a more familiar number in decimal, we would just call this zero.
132
00:07:18,851 --> 00:07:19,721
Enough said.
133
00:07:19,721 --> 00:07:22,571
If we were to represent, with a computer, the number 1,
134
00:07:22,571 --> 00:07:25,631
it would actually be 001, which, not surprisingly,
135
00:07:25,631 --> 00:07:28,691
is exactly the same as we might do in our human world,
136
00:07:28,691 --> 00:07:32,201
but we might not bother writing out the two zeros at the beginning.
137
00:07:32,201 --> 00:07:34,871
But a computer, now, if it wants to count as high as two,
138
00:07:34,871 --> 00:07:36,401
it doesn't have the digit 2.
139
00:07:36,401 --> 00:07:39,131
And so it has to use a different pattern of zeros and ones.
140
00:07:39,131 --> 00:07:41,321
And that happens to be 010.
141
00:07:41,321 --> 00:07:43,511
So this is not 10 with a zero in front of it.
142
00:07:43,511 --> 00:07:45,981
It's indeed zero one zero in the context of binary.
143
00:07:45,981 --> 00:07:48,101
And if we want to count higher now than two,
144
00:07:48,101 --> 00:07:52,241
we're going to have to tweak these zeros and ones further to get 3.
145
00:07:52,241 --> 00:07:56,711
And then if we want 4 or 5 or 6 or 7, we're
146
00:07:56,711 --> 00:07:59,621
just kind of toggling these zeros and ones, a.k.a.
147
00:07:59,621 --> 00:08:04,108
bits, for binary digits that represent, via these different patterns,
148
00:08:04,108 --> 00:08:06,191
different numbers that you and I, as humans, know,
149
00:08:06,191 --> 00:08:09,431
of course, as the so-called decimal system, 0 through 9,
150
00:08:09,431 --> 00:08:13,091
dec implying 10, 10 digits, those zeros through nine.
151
00:08:13,091 --> 00:08:15,461
So why that particular pattern?
152
00:08:15,461 --> 00:08:17,381
And why these particular zeros and ones?
153
00:08:17,381 --> 00:08:20,711
Well, it turns out that representing one thing or the other
154
00:08:20,711 --> 00:08:23,061
is just really simple for a computer.
155
00:08:23,061 --> 00:08:23,561
Why?
156
00:08:23,561 --> 00:08:25,811
At the end of the day, they're powered by electricity.
157
00:08:25,811 --> 00:08:28,781
And it's a really simple thing to just either store some electricity
158
00:08:28,781 --> 00:08:30,491
or don't store some electricity.
159
00:08:30,491 --> 00:08:33,611
Like, that's as simple as the world can get, on or off.
160
00:08:33,611 --> 00:08:35,811
1 or 0, so to speak.
161
00:08:35,811 --> 00:08:38,521
So, in fact, inside of a computer, a phone, anything
162
00:08:38,521 --> 00:08:40,271
these days that's electronic, pretty much,
163
00:08:40,271 --> 00:08:43,463
is some number of switches, otherwise known as transistors.
164
00:08:43,463 --> 00:08:44,171
And they're tiny.
165
00:08:44,171 --> 00:08:47,553
You've got thousands, millions of them in your Mac or PC or phone these days.
166
00:08:47,553 --> 00:08:50,511
And these are just tiny little switches that can get turned on and off.
167
00:08:50,511 --> 00:08:53,171
And by turning those things on and off in patterns,
168
00:08:53,171 --> 00:08:56,974
a computer can count from 0 on up to 7, and even higher than that.
169
00:08:56,974 --> 00:08:59,891
And so these switches, really, you can think of being as like switches
170
00:08:59,891 --> 00:09:00,391
like this.
171
00:09:00,391 --> 00:09:02,683
Let me just borrow one of our little stage lights here.
172
00:09:02,683 --> 00:09:03,671
Here's a light bulb.
173
00:09:03,671 --> 00:09:04,961
It's currently off.
174
00:09:04,961 --> 00:09:07,391
And so, I could just think of this as representing,
175
00:09:07,391 --> 00:09:10,811
in my laptop, a transistor, a switch, representing 0.
176
00:09:10,811 --> 00:09:15,821
But if I allow some electricity to flow, now I, in fact, have a 1.
177
00:09:15,821 --> 00:09:17,431
Well, how do I count higher than 1?
178
00:09:17,431 --> 00:09:19,041
I, of course, need another light bulb.
179
00:09:19,041 --> 00:09:21,231
So let me grab another one here.
180
00:09:21,231 --> 00:09:26,051
And if I put it in that same kind of pattern, I don't want to just do this.
181
00:09:26,051 --> 00:09:29,841
That's sort of the old finger counting way of unary, just 1, 2.
182
00:09:29,841 --> 00:09:31,841
I want to actually take into account the pattern
183
00:09:31,841 --> 00:09:33,381
of these things being on and off.
184
00:09:33,381 --> 00:09:39,431
So if this was one a moment ago, what I think I did earlier was I turned it off
185
00:09:39,431 --> 00:09:43,361
and let the next one over be on, a.k.a.
186
00:09:43,361 --> 00:09:44,771
010.
187
00:09:44,771 --> 00:09:47,811
And let me get us a third bit, if you will.
188
00:09:47,811 --> 00:09:49,301
And that feels like enough.
189
00:09:49,301 --> 00:09:53,140
Here is that same pattern now, starting at the beginning with 3.
190
00:09:53,140 --> 00:09:55,541
So here is 000.
191
00:09:55,541 --> 00:09:58,421
Here is 001.
192
00:09:58,421 --> 00:10:05,471
Here is 010, a.k.a., in our human world of decimal, 2.
193
00:10:05,471 --> 00:10:07,871
And then we could, of course, keep counting further.
194
00:10:07,871 --> 00:10:10,641
This now would be 3 and dot dot dot.
195
00:10:10,641 --> 00:10:13,571
If this other bulb now goes on, and that switch is turned
196
00:10:13,571 --> 00:10:16,061
and all three stay on-- this, again, was what number?
197
00:10:16,061 --> 00:10:16,736
AUDIENCE: Seven.
198
00:10:16,736 --> 00:10:18,281
DAVID MALAN: OK, so, seven.
199
00:10:18,281 --> 00:10:22,511
So it's just as simple, relatively, as that, if you will.
200
00:10:22,511 --> 00:10:26,681
But how is it that these patterns came to be?
201
00:10:26,681 --> 00:10:29,506
Well, these patterns actually follow something very familiar.
202
00:10:29,506 --> 00:10:31,631
You and I don't really think about it at this level
203
00:10:31,631 --> 00:10:35,501
anymore because we've probably been doing math and numbers since grade
204
00:10:35,501 --> 00:10:36,971
school or whatnot.
205
00:10:36,971 --> 00:10:41,861
But if we consider something in decimal, like the number 123,
206
00:10:41,861 --> 00:10:43,001
I immediately jump to that.
207
00:10:43,001 --> 00:10:45,671
This looks like 123 in decimal.
208
00:10:45,671 --> 00:10:46,361
But why?
209
00:10:46,361 --> 00:10:50,501
It's really just three symbols, a 1, a 2 with a bit of curve, a 3
210
00:10:50,501 --> 00:10:52,991
with a couple of curves, that you and I now instinctively
211
00:10:52,991 --> 00:10:54,851
just assign meaning to.
212
00:10:54,851 --> 00:10:59,701
But if we do rewind a few years, that is one hundred twenty-three
213
00:10:59,701 --> 00:11:03,181
because you're assigning meaning to each of these columns.
214
00:11:03,181 --> 00:11:06,031
The 3 is in the so-called ones place.
215
00:11:06,031 --> 00:11:09,631
The 2 is in the so-called tens place.
216
00:11:09,631 --> 00:11:12,541
And the 1 is in the so-called hundreds place.
217
00:11:12,541 --> 00:11:14,551
And then the math ensues quickly in your head.
218
00:11:14,551 --> 00:11:20,011
This is technically 100 times 1, plus 10 times 2, plus 1 times 3, a.k.a.
219
00:11:20,011 --> 00:11:21,691
100 plus 20 plus 3.
220
00:11:21,691 --> 00:11:27,091
And there we get the sort of mathematical notion we know as 123.
221
00:11:27,091 --> 00:11:31,271
Well, nicely enough, in binary, it's actually the same thing.
222
00:11:31,271 --> 00:11:33,721
It's just these columns mean a little something different.
223
00:11:33,721 --> 00:11:37,711
If you use three digits in decimal, and you have the ones place,
224
00:11:37,711 --> 00:11:42,031
the tens place, and the hundreds place, well, why was that 1, 10, and 100?
225
00:11:42,031 --> 00:11:43,931
They're technically just powers of 10.
226
00:11:43,931 --> 00:11:46,321
So 10 to the 0, 10 to the 1, 10 to the 2.
227
00:11:46,321 --> 00:11:47,221
Why 10?
228
00:11:47,221 --> 00:11:49,141
Decimal system, "dec" meaning 10.
229
00:11:49,141 --> 00:11:51,541
You have 8 and 10 digits, 0 through 9.
230
00:11:51,541 --> 00:11:54,091
In the binary system, if you're going to use three digits,
231
00:11:54,091 --> 00:11:57,611
just change the bases if you're using only zeros and ones.
232
00:11:57,611 --> 00:12:01,831
So now it's powers of 2, 2 to the 0, 2 to the 1, 2 to the 2, a.k.a.
233
00:12:01,831 --> 00:12:04,601
1 and 2 and 4, respectively.
234
00:12:04,601 --> 00:12:08,821
And if you keep going, it's going to be 8s column, 16s column, 32, 64,
235
00:12:08,821 --> 00:12:10,211
and so forth.
236
00:12:10,211 --> 00:12:12,961
So, why did we get these patterns that we did?
237
00:12:12,961 --> 00:12:18,991
Here's your 000 because it's 4 times 0, 2 times 0, 1 times 0, obviously 0.
238
00:12:18,991 --> 00:12:22,171
This is why we got the decimal number 1 in binary.
239
00:12:22,171 --> 00:12:26,041
This is why we got the number 2 in binary, because it's 4 times
240
00:12:26,041 --> 00:12:33,751
0, plus 2 times 1, plus 1 times 0, and now 3, and now 4, and now 5, and now 6,
241
00:12:33,751 --> 00:12:34,531
and now 7.
242
00:12:34,531 --> 00:12:38,073
And, of course, if you wanted to count as high as 8, to be clear,
243
00:12:38,073 --> 00:12:39,031
what do you have to do?
244
00:12:39,031 --> 00:12:41,531
What does a computer need to do to count even higher than 7?
245
00:12:41,531 --> 00:12:42,513
AUDIENCE: Add a bit.
246
00:12:42,513 --> 00:12:43,581
DAVID MALAN: Add a bit.
247
00:12:43,581 --> 00:12:45,231
Add another light bulb, another switch.
248
00:12:45,231 --> 00:12:47,511
And, indeed, computers have standardized just how
249
00:12:47,511 --> 00:12:49,941
many zeros and ones, or bits or switches,
250
00:12:49,941 --> 00:12:51,721
they throw at these kinds of problems.
251
00:12:51,721 --> 00:12:56,001
And, in fact, most computers would typically use at least eight at a time.
252
00:12:56,001 --> 00:12:58,671
And even if you're only counting as high as three or seven,
253
00:12:58,671 --> 00:13:01,131
you would still use eight and have a whole bunch of zeros.
254
00:13:01,131 --> 00:13:04,251
But that's OK, because the computers these days certainly
255
00:13:04,251 --> 00:13:08,001
have so many more, thousands, millions of transistors and switches
256
00:13:08,001 --> 00:13:10,621
that that's quite OK.
257
00:13:10,621 --> 00:13:14,371
All right, so, with that said, if we can now count as high as seven
258
00:13:14,371 --> 00:13:16,861
or, frankly, as high as we want, that only
259
00:13:16,861 --> 00:13:19,471
seems to make computers useful for things like Excel,
260
00:13:19,471 --> 00:13:20,731
like number crunching.
261
00:13:20,731 --> 00:13:22,981
But computers, of course, let you send text messages,
262
00:13:22,981 --> 00:13:24,941
write documents, and so much more.
263
00:13:24,941 --> 00:13:28,231
So how would a computer represent something like a letter,
264
00:13:28,231 --> 00:13:32,561
like the letter A of the English alphabet, if, at the end of the day,
265
00:13:32,561 --> 00:13:35,379
all they have is switches?
266
00:13:35,379 --> 00:13:35,921
Any thoughts?
267
00:13:35,921 --> 00:13:36,421
Yeah.
268
00:13:36,421 --> 00:13:38,661
AUDIENCE: You can represent letters in numbers.
269
00:13:38,661 --> 00:13:41,271
DAVID MALAN: OK, so we could represent letters using numbers.
270
00:13:41,271 --> 00:13:42,704
OK, so what's a proposal?
271
00:13:42,704 --> 00:13:44,121
What number should represent what?
272
00:13:44,121 --> 00:13:47,921
AUDIENCE: Say if you were starting at the beginning of the alphabet,
273
00:13:47,921 --> 00:13:51,446
you could say 1 is A, 2 is B, 3 is C.
274
00:13:51,446 --> 00:13:52,321
DAVID MALAN: Perfect.
275
00:13:52,321 --> 00:13:55,331
Yeah, we just all have to agree somehow that one number is
276
00:13:55,331 --> 00:13:56,581
going to represent one letter.
277
00:13:56,581 --> 00:14:01,191
So 1 is A, 2 is B, 3 is C, Z is 26, and so forth.
278
00:14:01,191 --> 00:14:03,691
Maybe we can even take into account uppercase and lowercase.
279
00:14:03,691 --> 00:14:06,931
We just have to agree and sort of write it down in some global standard.
280
00:14:06,931 --> 00:14:09,161
And humans, indeed, did just that.
281
00:14:09,161 --> 00:14:10,711
They didn't use 1, 2, 3.
282
00:14:10,711 --> 00:14:12,811
It turns out they started a little higher up.
283
00:14:12,811 --> 00:14:16,831
Capital A has been standardized as the number 65.
284
00:14:16,831 --> 00:14:20,281
And capital B has been standardized as the number 66.
285
00:14:20,281 --> 00:14:23,071
And you can kind of imagine how it goes up from there.
286
00:14:23,071 --> 00:14:25,951
And that's because whatever you're representing,
287
00:14:25,951 --> 00:14:30,161
ultimately, can only be stored, at the end of the day, as zeros and ones.
288
00:14:30,161 --> 00:14:33,811
And so, some humans in a room before, decided that capital A shall be 65,
289
00:14:33,811 --> 00:14:37,801
or, really, this pattern of zeros and ones inside of every computer
290
00:14:37,801 --> 00:14:41,491
in the world, 01000001.
291
00:14:41,491 --> 00:14:45,181
So if that pattern of zeros and ones ever appears in a computer,
292
00:14:45,181 --> 00:14:50,611
it might be interpreted then as indeed a capital letter A, eight of those bits
293
00:14:50,611 --> 00:14:51,511
at a time.
294
00:14:51,511 --> 00:14:55,891
But I worry, just to be clear, we might have now created a problem.
295
00:14:55,891 --> 00:14:58,381
It might seem, if I play this naively, that, OK,
296
00:14:58,381 --> 00:15:01,561
how do I now actually do math with the number 65?
297
00:15:01,561 --> 00:15:06,271
If now Excel displays 65 is an A, let alone Bs and Cs.
298
00:15:06,271 --> 00:15:09,931
So how might a computer do as you've proposed,
299
00:15:09,931 --> 00:15:14,576
have this mapping from numbers to letters, but still support numbers?
300
00:15:14,576 --> 00:15:16,201
It feels like we've given something up.
301
00:15:16,201 --> 00:15:16,701
Yeah?
302
00:15:16,701 --> 00:15:18,963
AUDIENCE: By having a prefix for letters?
303
00:15:18,963 --> 00:15:20,296
DAVID MALAN: By having a prefix?
304
00:15:20,296 --> 00:15:21,587
AUDIENCE: You could have prefixes and suffixes.
305
00:15:21,587 --> 00:15:24,341
DAVID MALAN: OK, so we could perhaps have some kind of prefix,
306
00:15:24,341 --> 00:15:25,931
like some pattern of zeros and ones--
307
00:15:25,931 --> 00:15:28,901
I like this-- that indicates to the computer
308
00:15:28,901 --> 00:15:31,571
here comes another pattern that represents a letter.
309
00:15:31,571 --> 00:15:35,621
Here comes another pattern that represents a number or a letter.
310
00:15:35,621 --> 00:15:36,251
So, not bad.
311
00:15:36,251 --> 00:15:37,071
I like that.
312
00:15:37,071 --> 00:15:38,321
Other thoughts?
313
00:15:38,321 --> 00:15:41,181
How might a computer distinguish these two?
314
00:15:41,181 --> 00:15:41,681
Yeah.
315
00:15:41,681 --> 00:15:44,061
AUDIENCE: Have a different file format, so,
316
00:15:44,061 --> 00:15:48,821
like, odd text or just check the graphic or--
317
00:15:48,821 --> 00:15:50,541
DAVID MALAN: Indeed, and that's spot-on.
318
00:15:50,541 --> 00:15:53,481
Nothing wrong with what you suggested, but the world generally does just that.
319
00:15:53,481 --> 00:15:56,314
The reason we have all of these different file formats in the world,
320
00:15:56,314 --> 00:16:01,221
like JPEG and GIF and PNGs and Word documents, .docx,
321
00:16:01,221 --> 00:16:04,971
and Excel files and so forth, is because a bunch of humans got in a room
322
00:16:04,971 --> 00:16:08,481
and decided, well, in the context of this type of file, or really,
323
00:16:08,481 --> 00:16:11,301
more specifically, in the context of this type of program,
324
00:16:11,301 --> 00:16:14,841
Excel versus Photoshop versus Google Docs or the like,
325
00:16:14,841 --> 00:16:19,251
we shall interpret any patterns of zeros and ones as being maybe numbers
326
00:16:19,251 --> 00:16:23,751
for Excel, maybe letters in, like, a text messaging program or Google Docs,
327
00:16:23,751 --> 00:16:27,171
or maybe even colors of the rainbow in something like Photoshop and more.
328
00:16:27,171 --> 00:16:28,311
So it's context dependent.
329
00:16:28,311 --> 00:16:31,191
And we'll see, when we ourselves start programming,
330
00:16:31,191 --> 00:16:33,171
you the programmer will ultimately provide
331
00:16:33,171 --> 00:16:38,371
some hints to the computer that tells the computer, interpret it as follows.
332
00:16:38,371 --> 00:16:41,331
So, similar in spirit to that, but not quite a standardized with these
333
00:16:41,331 --> 00:16:41,961
prefixes.
334
00:16:41,961 --> 00:16:45,351
So this system here actually has a name ASCII, the American Standard
335
00:16:45,351 --> 00:16:47,121
Code for Information Interchange.
336
00:16:47,121 --> 00:16:49,461
And indeed, it began here in the US, and that's
337
00:16:49,461 --> 00:16:52,251
why it's actually a little biased toward A's through Z's
338
00:16:52,251 --> 00:16:54,001
and a bit of punctuation as well.
339
00:16:54,001 --> 00:16:55,621
And that quickly became a problem.
340
00:16:55,621 --> 00:16:59,481
But if we start simply now, in English, the mapping
341
00:16:59,481 --> 00:17:01,561
itself is fairly straightforward.
342
00:17:01,561 --> 00:17:05,991
So if A is 65, B it 66, and dot dot dot, suppose
343
00:17:05,991 --> 00:17:08,721
that you received a text message, an email, from a friend,
344
00:17:08,721 --> 00:17:11,781
and underneath the hood, so to speak, if you kind of
345
00:17:11,781 --> 00:17:15,441
looked inside the computer, what you technically received in this text
346
00:17:15,441 --> 00:17:20,781
or this email happened to be the numbers 72, 73, 33,
347
00:17:20,781 --> 00:17:23,511
or, really, the underlying pattern of zeros and ones.
348
00:17:23,511 --> 00:17:29,077
What might your friend have sent you as a message, if it's 72, 73, 33?
349
00:17:29,077 --> 00:17:30,913
AUDIENCE: Hey.
350
00:17:30,913 --> 00:17:31,621
DAVID MALAN: Hey?
351
00:17:31,621 --> 00:17:31,981
Close.
352
00:17:31,981 --> 00:17:32,641
AUDIENCE: Hi.
353
00:17:32,641 --> 00:17:33,481
DAVID MALAN: Hi.
354
00:17:33,481 --> 00:17:34,481
It's, indeed, hi.
355
00:17:34,481 --> 00:17:34,981
Why?
356
00:17:34,981 --> 00:17:39,481
Well, apparently, according to this little cheat sheet, H is 72, I is 73.
357
00:17:39,481 --> 00:17:42,121
It's not obvious from this chart what the 33 is,
358
00:17:42,121 --> 00:17:44,221
but indeed, this pattern represents "hi."
359
00:17:44,221 --> 00:17:46,474
And anyone want to guess, or if you know, what 33 is?
360
00:17:46,474 --> 00:17:47,641
AUDIENCE: Exclamation point.
361
00:17:47,641 --> 00:17:48,721
DAVID MALAN: Exclamation point.
362
00:17:48,721 --> 00:17:51,263
And this is, frankly, not the kind of thing most people know.
363
00:17:51,263 --> 00:17:54,941
But it's easily accessible by a nice user-friendly chart like this.
364
00:17:54,941 --> 00:17:56,371
So this is an ASCII chart.
365
00:17:56,371 --> 00:17:59,131
When I said that we just need to write down this mapping earlier,
366
00:17:59,131 --> 00:18:00,211
this is what people did.
367
00:18:00,211 --> 00:18:02,003
They wrote it down in a book or in a chart.
368
00:18:02,003 --> 00:18:06,661
And, for instance, here is our 72 for H, here is our 73 for I,
369
00:18:06,661 --> 00:18:10,561
and here is our 33 for exclamation point.
370
00:18:10,561 --> 00:18:13,891
And computers, Macs, PCs, iPhones, Android devices,
371
00:18:13,891 --> 00:18:16,421
just know this mapping by heart, if you will.
372
00:18:16,421 --> 00:18:19,151
They've been designed to understand those letters.
373
00:18:19,151 --> 00:18:20,821
So here, I might have received "hi."
374
00:18:20,821 --> 00:18:24,450
Technically, what I've received is these patterns of zeros and ones.
375
00:18:24,450 --> 00:18:27,660
But it's important to note that when you get these patterns of zeros and ones
376
00:18:27,660 --> 00:18:30,721
in any format, be it email or text or a file,
377
00:18:30,721 --> 00:18:33,361
they do tend to come in standard lengths,
378
00:18:33,361 --> 00:18:37,051
with a certain number of zeros and ones altogether.
379
00:18:37,051 --> 00:18:39,900
And this happens to be 8 plus 8, plus 8.
380
00:18:39,900 --> 00:18:43,261
So just to get the message "hi, exclamation point,"
381
00:18:43,261 --> 00:18:47,701
you would have received at least, it would seem, some 24 bits.
382
00:18:47,701 --> 00:18:51,031
But frankly, bits are so tiny, literally and mathematically,
383
00:18:51,031 --> 00:18:53,761
that we don't tend to think or talk, generally, in terms of bits.
384
00:18:53,761 --> 00:18:56,071
You're probably more familiar with bytes.
385
00:18:56,071 --> 00:19:00,181
B-Y-T-E-S is a byte, is a byte, is a byte.
386
00:19:00,181 --> 00:19:02,041
A byte is just 8 bits.
387
00:19:02,041 --> 00:19:05,074
And even those, frankly, aren't that useful if we do out the math.
388
00:19:05,074 --> 00:19:06,991
How high can you count if you have eight bits?
389
00:19:06,991 --> 00:19:08,621
Anyone know?
390
00:19:08,621 --> 00:19:10,831
Say it again?
391
00:19:10,831 --> 00:19:11,971
Higher than that.
392
00:19:11,971 --> 00:19:15,271
Unless you want to go negative, that's fine.
393
00:19:15,271 --> 00:19:17,851
256, technically 255.
394
00:19:17,851 --> 00:19:21,331
Long story short, if we actually got into the weeds of all of these zeros
395
00:19:21,331 --> 00:19:26,761
and ones, and we figured out what 11111111 mathematically adds up
396
00:19:26,761 --> 00:19:30,271
to in decimal, it would indeed be 255, or less
397
00:19:30,271 --> 00:19:32,981
if you want to represent negative numbers as well.
398
00:19:32,981 --> 00:19:36,841
So this is useful because now we can speak, not just in terms of bytes
399
00:19:36,841 --> 00:19:39,511
but, if the files are bigger, kilobytes is thousands of bytes,
400
00:19:39,511 --> 00:19:43,291
megabytes is millions of bytes, gigabytes is billions of bytes,
401
00:19:43,291 --> 00:19:46,781
terabytes are trillions of bytes, and so forth.
402
00:19:46,781 --> 00:19:53,221
We have a vocabulary for these increasingly large quantities of data.
403
00:19:53,221 --> 00:19:57,051
The problem is that, if you're using ASCII and, therefore, eight bits or one
404
00:19:57,051 --> 00:20:00,501
byte per character, and originally, only seven, you
405
00:20:00,501 --> 00:20:03,091
can only represent 255 characters.
406
00:20:03,091 --> 00:20:06,681
And that's actually 256 total characters, including zero.
407
00:20:06,681 --> 00:20:10,491
And that's fine if you're using literally English, in this case,
408
00:20:10,491 --> 00:20:11,841
plus a bunch of punctuation.
409
00:20:11,841 --> 00:20:14,781
But there's many human languages in the world
410
00:20:14,781 --> 00:20:18,111
that need many more symbols and, therefore, many more bits.
411
00:20:18,111 --> 00:20:20,991
So, thankfully, the world decided that we'll indeed
412
00:20:20,991 --> 00:20:24,141
support not just the US English keyboard, but all
413
00:20:24,141 --> 00:20:27,201
of the accented characters that you might want for some languages.
414
00:20:27,201 --> 00:20:30,441
And heck, if we use enough bits, zeros and ones,
415
00:20:30,441 --> 00:20:34,431
not only can we represent all human languages in written form,
416
00:20:34,431 --> 00:20:36,351
as well as some emotions along the way, we
417
00:20:36,351 --> 00:20:39,321
can capture the latter with these things called emojis.
418
00:20:39,321 --> 00:20:41,931
And indeed, these are very much in vogue these days.
419
00:20:41,931 --> 00:20:45,651
You probably send and/or receive many of these things any given day.
420
00:20:45,651 --> 00:20:49,221
These are just characters, like letters of an alphabet, patterns
421
00:20:49,221 --> 00:20:53,271
of zeros and ones that you're receiving, that the world has also standardized.
422
00:20:53,271 --> 00:20:55,391
For instance, there are certain emojis that
423
00:20:55,391 --> 00:20:57,421
are represented with certain patterns of bits.
424
00:20:57,421 --> 00:21:00,771
And when you receive them, your phone, your laptop, your desktop,
425
00:21:00,771 --> 00:21:02,701
displays them as such.
426
00:21:02,701 --> 00:21:05,481
And this newer standard is called Unicode.
427
00:21:05,481 --> 00:21:07,971
So it's a superset of what we called ASCII.
428
00:21:07,971 --> 00:21:12,651
And Unicode is just a mapping of many more numbers to many more letters
429
00:21:12,651 --> 00:21:15,021
or characters, more generally, that might
430
00:21:15,021 --> 00:21:17,841
use eight bits for backwards compatibility
431
00:21:17,841 --> 00:21:22,521
with the old way of doing things with ASCII, but they might also use 16 bits.
432
00:21:22,521 --> 00:21:24,381
And if you have 16 bits, you can actually
433
00:21:24,381 --> 00:21:27,414
represent more than 65,000 possible letters.
434
00:21:27,414 --> 00:21:28,581
And that's getting up there.
435
00:21:28,581 --> 00:21:34,041
And heck, Unicode might even use 32 bits to represent letters and numbers
436
00:21:34,041 --> 00:21:35,931
and punctuation symbols and emojis.
437
00:21:35,931 --> 00:21:39,111
And that would give you up to 4 billion possibilities.
438
00:21:39,111 --> 00:21:42,681
And, I daresay, one of the reasons we see so many emojis these days is we
439
00:21:42,681 --> 00:21:43,761
have so much room.
440
00:21:43,761 --> 00:21:46,761
I mean, we've got room for billions more, literally.
441
00:21:46,761 --> 00:21:48,981
So, in fact, just as a little bit of trivia,
442
00:21:48,981 --> 00:21:54,201
has anyone ever received this decimal number, or if you prefer binary now,
443
00:21:54,201 --> 00:21:58,671
has anyone ever received this pattern of zeros and ones on your phone,
444
00:21:58,671 --> 00:22:01,771
in a text or an email, perhaps this past year?
445
00:22:01,771 --> 00:22:06,651
Well, if you actually look this up, this esoteric sequence of zeros and ones
446
00:22:06,651 --> 00:22:09,831
happens to represent face with medical mask.
447
00:22:09,831 --> 00:22:13,641
And notice that if you've got an iPhone or an Android device,
448
00:22:13,641 --> 00:22:15,991
you might be seeing different things.
449
00:22:15,991 --> 00:22:19,281
In fact, this is the Android version of this, most recently.
450
00:22:19,281 --> 00:22:21,921
This is the iOS version of it, most recently.
451
00:22:21,921 --> 00:22:24,591
And there's bunches of other interpretations by other companies
452
00:22:24,591 --> 00:22:25,741
as well.
453
00:22:25,741 --> 00:22:28,431
So Unicode, as a consortium, if you will,
454
00:22:28,431 --> 00:22:31,561
has standardized the descriptions of what these things are.
455
00:22:31,561 --> 00:22:35,091
But the companies themselves, manufacturers out there,
456
00:22:35,091 --> 00:22:37,701
have generally interpreted it as you see fit.
457
00:22:37,701 --> 00:22:41,031
And this can lead to some human miscommunications.
458
00:22:41,031 --> 00:22:44,571
In fact, for like, literally, embarrassingly, like a year or two,
459
00:22:44,571 --> 00:22:47,481
I started being in the habit of using the emoji that kind of looks
460
00:22:47,481 --> 00:22:50,521
like this because I thought it was like woo, happy face, or whatever.
461
00:22:50,521 --> 00:22:52,461
I didn't realize this is the emoji for hug
462
00:22:52,461 --> 00:22:57,051
because whatever device I was using sort of looks like this, not like this.
463
00:22:57,051 --> 00:22:59,871
And that's because of their interpretation of the data.
464
00:22:59,871 --> 00:23:04,251
This has happened too when what was a gun became a water
465
00:23:04,251 --> 00:23:06,291
pistol in some manufacturers' eyes.
466
00:23:06,291 --> 00:23:10,671
And so it's an interesting dichotomy between what information we all
467
00:23:10,671 --> 00:23:15,201
want to represent and how we choose, ultimately, to represent it.
468
00:23:15,201 --> 00:23:18,591
Questions, then, on these representations of formats,
469
00:23:18,591 --> 00:23:21,721
be it numbers or letters, or soon more.
470
00:23:21,721 --> 00:23:22,221
Yeah?
471
00:23:22,221 --> 00:23:24,841
AUDIENCE: Why is decimal popular for a computer
472
00:23:24,841 --> 00:23:27,439
if binary is the basis for everything?
473
00:23:27,439 --> 00:23:29,231
DAVID MALAN: Sorry, why is what so popular?
474
00:23:29,231 --> 00:23:32,011
AUDIENCE: Why is the decimal popular if binary is the fundamental--
475
00:23:32,011 --> 00:23:34,601
DAVID MALAN: Yeah, so we'll come back to this in a few weeks, in fact.
476
00:23:34,601 --> 00:23:36,511
There are other ways to represent numbers.
477
00:23:36,511 --> 00:23:37,621
Binary is one.
478
00:23:37,621 --> 00:23:38,701
Decimal is another.
479
00:23:38,701 --> 00:23:39,871
Unary is another.
480
00:23:39,871 --> 00:23:45,181
And hexadecimal is yet a fourth that uses 16 total digits, literally 0
481
00:23:45,181 --> 00:23:48,241
through 9 plus A, B, C, D, E, F. And somehow,
482
00:23:48,241 --> 00:23:51,301
you can similarly count even higher with those.
483
00:23:51,301 --> 00:23:53,821
We'll see in a few weeks why this is compelling.
484
00:23:53,821 --> 00:23:57,481
But hexadecimal, long story short, uses four bits per digit.
485
00:23:57,481 --> 00:24:00,991
And so, four bits, if you have two digits in hex, that gives you eight.
486
00:24:00,991 --> 00:24:03,511
And it's just a very convenient unit of measure.
487
00:24:03,511 --> 00:24:06,841
And it's also human convention in the world of files and other things.
488
00:24:06,841 --> 00:24:08,574
But we'll come back to that soon.
489
00:24:08,574 --> 00:24:09,241
Other questions?
490
00:24:09,241 --> 00:24:12,624
AUDIENCE: Do the lights on the stage supposedly say that--
491
00:24:12,624 --> 00:24:15,291
DAVID MALAN: Do the lights on the stage supposedly say anything?
492
00:24:15,291 --> 00:24:19,011
Well, if we had thought in advance to use maybe 64 light bulbs,
493
00:24:19,011 --> 00:24:24,351
that would seem to give us 8 total bytes on stage, 8 times 8,
494
00:24:24,351 --> 00:24:25,461
giving us just that.
495
00:24:25,461 --> 00:24:26,721
Maybe.
496
00:24:26,721 --> 00:24:27,871
Good question.
497
00:24:27,871 --> 00:24:31,147
Other questions on 0's and 1's?
498
00:24:31,147 --> 00:24:33,831
It's a little bright in here.
499
00:24:33,831 --> 00:24:34,761
No?
500
00:24:34,761 --> 00:24:37,611
Oh, yes?
501
00:24:37,611 --> 00:24:41,631
Where everyone's pointing somewhere specific.
502
00:24:41,631 --> 00:24:42,271
There we go.
503
00:24:42,271 --> 00:24:42,861
Sorry.
504
00:24:42,861 --> 00:24:44,091
Very bright in this corner.
505
00:24:44,091 --> 00:24:47,563
AUDIENCE: I was just going to ask about the 255 bits,
506
00:24:47,563 --> 00:24:49,047
like with the maximum characters.
507
00:24:49,047 --> 00:24:49,547
[INAUDIBLE]
508
00:24:49,547 --> 00:24:52,255
DAVID MALAN: Ah, sure, and we'll come back to this, in some form,
509
00:24:52,255 --> 00:24:54,831
in the coming days too, at a slower pace too,
510
00:24:54,831 --> 00:24:58,774
we have, with eight bits, two possible values for the first
511
00:24:58,774 --> 00:25:01,191
and then two for the next, two for the next, and so forth.
512
00:25:01,191 --> 00:25:02,831
So that's 2 times 2 times 2.
513
00:25:02,831 --> 00:25:04,931
That's 2 to the eighth power total, which
514
00:25:04,931 --> 00:25:09,431
means you can have 256 total possible patterns of zeros and ones.
515
00:25:09,431 --> 00:25:13,281
But as we'll see soon computer scientists, programmers,
516
00:25:13,281 --> 00:25:17,951
software often starts counting at 0 by convention and if you use one of those
517
00:25:17,951 --> 00:25:23,681
patterns, 00000000 to represent the decimal number we know is zero,
518
00:25:23,681 --> 00:25:29,531
you only have 255 other patterns left to count as high as therefore 255.
519
00:25:29,531 --> 00:25:30,411
That's all.
520
00:25:30,411 --> 00:25:32,121
Good question.
521
00:25:32,121 --> 00:25:37,121
All right, so what then might we have besides these emojis and letters
522
00:25:37,121 --> 00:25:37,691
and numbers?
523
00:25:37,691 --> 00:25:40,151
Well, we of course have things like colors and programs
524
00:25:40,151 --> 00:25:42,383
like Photoshop and pictures and photos.
525
00:25:42,383 --> 00:25:43,841
Well let me ask the question again.
526
00:25:43,841 --> 00:25:47,051
How might a computer, do you think, knowing what you know now, represents
527
00:25:47,051 --> 00:25:48,701
something like a color?
528
00:25:48,701 --> 00:25:52,211
Like what are our options if all we've got are zeros and ones and switches?
529
00:25:52,211 --> 00:25:53,058
Yeah?
530
00:25:53,058 --> 00:25:54,521
AUDIENCE: RGB
531
00:25:54,521 --> 00:25:56,171
DAVID MALAN: RGB.
532
00:25:56,171 --> 00:25:59,771
RGB indeed is this acronym that represents some amount of red
533
00:25:59,771 --> 00:26:02,291
and some amount of green and blue and indeed computers
534
00:26:02,291 --> 00:26:05,081
can represent colors by just doing that.
535
00:26:05,081 --> 00:26:06,593
Remembering, for instance, this dot.
536
00:26:06,593 --> 00:26:09,551
This yellow dot on the screen that might be part of any of those emojis
537
00:26:09,551 --> 00:26:12,311
these days, well that's some amount of red, some amount of green,
538
00:26:12,311 --> 00:26:13,144
some amount of blue.
539
00:26:13,144 --> 00:26:15,041
And if you sort of mix those colors together,
540
00:26:15,041 --> 00:26:16,781
you can indeed get a very specific one.
541
00:26:16,781 --> 00:26:19,361
And we'll see you in just a moment just that.
542
00:26:19,361 --> 00:26:24,108
So indeed earlier on, humans only used seven bits total.
543
00:26:24,108 --> 00:26:27,191
And it was only once they decided, well, let's add an eighth bit that they
544
00:26:27,191 --> 00:26:29,801
got extended ASCII and that was initially in part
545
00:26:29,801 --> 00:26:33,641
a solution to the same problem of not having enough room, if you will,
546
00:26:33,641 --> 00:26:37,948
in those patterns of zeros and ones to represent all of the characters
547
00:26:37,948 --> 00:26:38,781
that you might want.
548
00:26:38,781 --> 00:26:43,031
But even that wasn't enough and that's why we've now gone up to 16 and 32
549
00:26:43,031 --> 00:26:44,591
and long past 7.
550
00:26:44,591 --> 00:26:49,661
So if we come back now to this one particular color.
551
00:26:49,661 --> 00:26:52,031
RGB was proposed as a scheme, but how might this work?
552
00:26:52,031 --> 00:26:53,981
Well, consider for instance this.
553
00:26:53,981 --> 00:26:58,361
If we do indeed decide as a group to represent any color of the rainbow
554
00:26:58,361 --> 00:27:01,121
with some mixture of some red, some green, and some blue,
555
00:27:01,121 --> 00:27:06,011
we have to decide how to represent the amount of red and green and blue.
556
00:27:06,011 --> 00:27:09,731
Well, it turns out if all we have are zeros and ones, ergo numbers,
557
00:27:09,731 --> 00:27:11,051
let's do just that.
558
00:27:11,051 --> 00:27:17,201
For instance, suppose a computer we're using, these three numbers 72, 73, 33,
559
00:27:17,201 --> 00:27:20,171
no longer in the context of an email or a text message,
560
00:27:20,171 --> 00:27:24,401
but now in the context of something like Photoshop, a program for editing
561
00:27:24,401 --> 00:27:28,031
and creating graphical files, maybe this first number
562
00:27:28,031 --> 00:27:32,841
could be interpreted as representing some amount of red, green, and blue,
563
00:27:32,841 --> 00:27:33,388
respectively.
564
00:27:33,388 --> 00:27:34,721
And that's exactly what happens.
565
00:27:34,721 --> 00:27:38,441
You can think of the first digit as red, second as green, third as blue.
566
00:27:38,441 --> 00:27:42,731
And so ultimately when you combine that amount of red, that amount of green,
567
00:27:42,731 --> 00:27:46,931
that amount of blue, it turns out it's going to resemble the shade of yellow.
568
00:27:46,931 --> 00:27:50,741
And indeed, you can come up with a numbers between 0 and 255
569
00:27:50,741 --> 00:27:54,161
for each of those colors to mix any other color that you might want.
570
00:27:54,161 --> 00:27:56,031
And you can actually see this in practice.
571
00:27:56,031 --> 00:27:59,231
Even though our screens, admittedly, are getting really good
572
00:27:59,231 --> 00:28:03,439
on our phones and laptops such that you barely see the dots, they are there.
573
00:28:03,439 --> 00:28:05,231
You might have heard the term pixel before.
574
00:28:05,231 --> 00:28:07,361
Pixel's just a dot on the screen and you've
575
00:28:07,361 --> 00:28:10,961
got thousands, millions of them these days horizontally and vertically.
576
00:28:10,961 --> 00:28:13,901
If I take even this emoji, which again happens
577
00:28:13,901 --> 00:28:18,911
to be one company's interpretation of a face with medical mask
578
00:28:18,911 --> 00:28:21,251
and zoom in a bit, maybe zoom in a bit more,
579
00:28:21,251 --> 00:28:23,591
you can actually start to see these pixels.
580
00:28:23,591 --> 00:28:26,261
Things get pixelated because what you're seeing
581
00:28:26,261 --> 00:28:29,981
is each of the individual dots that compose this particular image.
582
00:28:29,981 --> 00:28:32,381
And apparently each of these individual dots
583
00:28:32,381 --> 00:28:37,661
are probably using 24 bits, eight bits for red, eight bits for green, eight
584
00:28:37,661 --> 00:28:40,001
bits for blue, in some pattern.
585
00:28:40,001 --> 00:28:43,991
This program or some other like Photoshop is interpreting one pattern
586
00:28:43,991 --> 00:28:48,971
and it's white or yellow or black or some brown in between.
587
00:28:48,971 --> 00:28:52,571
So if you look sort of awkwardly, but up close to your phone or your laptop
588
00:28:52,571 --> 00:28:56,373
or maybe your TV, you can see exactly this, too.
589
00:28:56,373 --> 00:28:58,331
All right, well, what about things that we also
590
00:28:58,331 --> 00:28:59,956
watch every day on YouTube or the like?
591
00:28:59,956 --> 00:29:01,241
Things like videos.
592
00:29:01,241 --> 00:29:03,251
How would a computer, knowing what we know now,
593
00:29:03,251 --> 00:29:05,246
represent something like a video?
594
00:29:07,781 --> 00:29:10,631
How might you represent a video using only zeros and ones?
595
00:29:10,631 --> 00:29:11,461
Yeah?
596
00:29:11,461 --> 00:29:15,961
AUDIENCE: As we can see here, they represent images, right?
597
00:29:15,961 --> 00:29:20,461
[INAUDIBLE] sounds of the 0 and 1s as well.
598
00:29:20,461 --> 00:29:23,461
[INAUDIBLE]
599
00:29:23,461 --> 00:29:24,741
DAVID MALAN: Yeah, exactly.
600
00:29:24,741 --> 00:29:28,111
To summarize, what video really adds is just some notion of time.
601
00:29:28,111 --> 00:29:30,831
It's not just one image, it's not just one letter or a number,
602
00:29:30,831 --> 00:29:34,611
it's presumably some kind of sequence because time is passing.
603
00:29:34,611 --> 00:29:38,481
So with a whole bunch of images, maybe 24 maybe 30 per second,
604
00:29:38,481 --> 00:29:41,181
if you fly them by the human's eyes, we can
605
00:29:41,181 --> 00:29:43,941
interpret them using our eyes and brain that there is now
606
00:29:43,941 --> 00:29:46,131
movement and therefore video.
607
00:29:46,131 --> 00:29:48,741
Similarly with audio or music.
608
00:29:48,741 --> 00:29:52,911
If we just came up with some convention for representing those same notes
609
00:29:52,911 --> 00:29:56,061
on a musical instrument, could we have the computer synthesize them, too?
610
00:29:56,061 --> 00:29:57,853
And this might be actually pretty familiar.
611
00:29:57,853 --> 00:30:02,601
Let me pull up a quick video here, which happens to be an old school
612
00:30:02,601 --> 00:30:04,011
version of the same idea.
613
00:30:04,011 --> 00:30:05,691
You might remember from childhood.
614
00:30:05,691 --> 00:30:09,683
[MUSIC PLAYING]
615
00:30:13,675 --> 00:30:17,168
[CLICKING]
616
00:30:27,661 --> 00:30:31,561
So granted that particular video is an actual video
617
00:30:31,561 --> 00:30:35,011
of a paper-based animation, but indeed, that's really all you need,
618
00:30:35,011 --> 00:30:38,971
is some sequence of these images, which themselves of course
619
00:30:38,971 --> 00:30:43,021
are just zeros and ones because they're just this grid of these pixels or dots.
620
00:30:43,021 --> 00:30:46,704
Now something like musical notes like these, those of you who are musicians
621
00:30:46,704 --> 00:30:48,871
might just naturally play these on physical devices,
622
00:30:48,871 --> 00:30:51,901
but computers can certainly represent those sounds, too.
623
00:30:51,901 --> 00:30:54,751
For instance, a popular format for audio is
624
00:30:54,751 --> 00:30:57,481
called MIDI and MIDI might just represent
625
00:30:57,481 --> 00:31:01,801
each note that you saw a moment ago essentially as a sequence of numbers.
626
00:31:01,801 --> 00:31:05,191
But more generally, you might think about music as having notes,
627
00:31:05,191 --> 00:31:08,101
for instance, A through G, maybe some flats and some sharps,
628
00:31:08,101 --> 00:31:11,701
you might have the duration like how long is the note being heard or played
629
00:31:11,701 --> 00:31:13,741
on a piano or some other device, and then
630
00:31:13,741 --> 00:31:16,471
just the volume like how hard does a human in the real world
631
00:31:16,471 --> 00:31:19,381
press down on that key and therefore how loud is that sound?
632
00:31:19,381 --> 00:31:24,271
It would seem that just remembering little details like that quantitatively
633
00:31:24,271 --> 00:31:29,791
we can then represent really all of these otherwise analog human realities.
634
00:31:29,791 --> 00:31:33,121
So that then is really a laundry list of ways
635
00:31:33,121 --> 00:31:35,251
that we can just represent information.
636
00:31:35,251 --> 00:31:38,014
Again, computers or digital have all of these different formats,
637
00:31:38,014 --> 00:31:40,681
but at the end of the day and as fancy as those devices in years
638
00:31:40,681 --> 00:31:44,461
are, it's just zeros and ones, tiny little switches or light bulbs,
639
00:31:44,461 --> 00:31:47,641
if you will, represented in some way and it's up to the software
640
00:31:47,641 --> 00:31:50,641
that you and I and others write to use those zeros
641
00:31:50,641 --> 00:31:54,121
and ones in ways we want to get the computers to do something
642
00:31:54,121 --> 00:31:55,561
more powerfully.
643
00:31:55,561 --> 00:31:59,881
Questions, then, on this representation of information, which I daresay
644
00:31:59,881 --> 00:32:03,511
is ultimately what problem solving is all about, taking in information
645
00:32:03,511 --> 00:32:08,291
and producing new via some process in between.
646
00:32:08,291 --> 00:32:11,621
Any questions there?
647
00:32:11,621 --> 00:32:12,771
Yeah, in back.
648
00:32:12,771 --> 00:32:16,699
AUDIENCE: Yeah, so we talked about how different file formats kind of allow
649
00:32:16,699 --> 00:32:18,663
you to interpret information.
650
00:32:18,663 --> 00:32:23,573
How does a file format like .mp4 discriminate between audio and video
651
00:32:23,573 --> 00:32:25,046
within itself as a value?
652
00:32:25,046 --> 00:32:26,671
DAVID MALAN: So a really good question.
653
00:32:26,671 --> 00:32:28,621
There are many other file formats out there.
654
00:32:28,621 --> 00:32:31,431
You allude to MP4 for video and more generally the use
655
00:32:31,431 --> 00:32:34,041
are these things called codecs and containers.
656
00:32:34,041 --> 00:32:37,611
It's not quite as simple when using larger files, for instance,
657
00:32:37,611 --> 00:32:41,149
in more modern formats that a video is just a sequence of images,
658
00:32:41,149 --> 00:32:41,691
for instance.
659
00:32:41,691 --> 00:32:42,261
Why?
660
00:32:42,261 --> 00:32:45,861
If you stored that many images for like a Hollywood movie,
661
00:32:45,861 --> 00:32:50,131
like 24 or 30 of them per second, that's a huge number of images.
662
00:32:50,131 --> 00:32:52,461
And if you've ever taken photos on your phone,
663
00:32:52,461 --> 00:32:56,481
you might know how many megabytes or larger even individual photographs
664
00:32:56,481 --> 00:32:57,081
might be.
665
00:32:57,081 --> 00:33:00,471
So humans have developed over the years a fancier software
666
00:33:00,471 --> 00:33:05,181
that uses much more math to represent the same information more minimally
667
00:33:05,181 --> 00:33:07,941
just using somehow shorter patterns of zeros and ones
668
00:33:07,941 --> 00:33:10,531
than are most simplistic representation here.
669
00:33:10,531 --> 00:33:12,861
And they use what might be called compression.
670
00:33:12,861 --> 00:33:15,261
If you've ever used a zip file or something else,
671
00:33:15,261 --> 00:33:17,871
somehow your computer is using fewer zeros and ones
672
00:33:17,871 --> 00:33:19,761
to represent the same amount of information,
673
00:33:19,761 --> 00:33:22,223
ideally without losing any information.
674
00:33:22,223 --> 00:33:25,431
In the world of multimedia, which we'll touch on a little bit in a few weeks,
675
00:33:25,431 --> 00:33:29,031
there are both lossy and lossless formats out there.
676
00:33:29,031 --> 00:33:32,661
Lossless means you lose no information whatsoever.
677
00:33:32,661 --> 00:33:38,061
But more commonly as you're alluding to one is lossy compression, L-O-S-S-Y,
678
00:33:38,061 --> 00:33:40,851
where you're actually throwing away some amount of quality.
679
00:33:40,851 --> 00:33:43,293
You're getting some amount of pixelation that might not
680
00:33:43,293 --> 00:33:46,251
look perfect to the human, but heck it's a lot cheaper and a lot easier
681
00:33:46,251 --> 00:33:47,241
to distribute.
682
00:33:47,241 --> 00:33:50,391
And in the world of multimedia, you have containers like QuickTime
683
00:33:50,391 --> 00:33:53,181
and other MPEG containers that can combine
684
00:33:53,181 --> 00:33:57,261
different formats of video, different formats of audio in one file,
685
00:33:57,261 --> 00:33:59,541
but there, too, do designers have discretion.
686
00:33:59,541 --> 00:34:01,611
So more in a few weeks, too.
687
00:34:01,611 --> 00:34:05,011
Other questions, then, on information here as well?
688
00:34:05,011 --> 00:34:05,511
Yeah?
689
00:34:05,511 --> 00:34:08,223
AUDIENCE: So I know computers used to be very big
690
00:34:08,223 --> 00:34:10,211
and taking up like a whole room and stuff.
691
00:34:10,211 --> 00:34:14,245
Is the reason they've gotten smaller because we can store
692
00:34:14,245 --> 00:34:16,526
this information piecemeal or what?
693
00:34:16,526 --> 00:34:17,401
DAVID MALAN: Exactly.
694
00:34:17,401 --> 00:34:20,359
I mean, back in the day you might have heard of the expression a vacuum
695
00:34:20,359 --> 00:34:23,041
tube, which is like some physically large device that
696
00:34:23,041 --> 00:34:25,981
might have only stored some 0 or 1.
697
00:34:25,981 --> 00:34:28,621
Yes, it is the miniaturization of hardware these days
698
00:34:28,621 --> 00:34:33,421
that has allowed us to store as many and many more zeros and ones much more
699
00:34:33,421 --> 00:34:34,361
closely together.
700
00:34:34,361 --> 00:34:36,284
And as we've built more fancy machines that
701
00:34:36,284 --> 00:34:38,701
can sort of design this hardware at an even smaller scale,
702
00:34:38,701 --> 00:34:41,231
we're just packing more and more into these devices.
703
00:34:41,231 --> 00:34:42,541
But there, too, is a trade off.
704
00:34:42,541 --> 00:34:45,811
For instance, you might know by using your phone or your laptop
705
00:34:45,811 --> 00:34:48,511
for quite a while, maybe on your lap, starts to get warm.
706
00:34:48,511 --> 00:34:50,641
So there are these literal physical side effects
707
00:34:50,641 --> 00:34:53,071
of this where now some of our devices run hot.
708
00:34:53,071 --> 00:34:55,951
This is why like a data center in the real world
709
00:34:55,951 --> 00:34:58,291
might need more air conditioning than a typical place,
710
00:34:58,291 --> 00:35:01,413
because there are these physical artifacts as well.
711
00:35:01,413 --> 00:35:04,621
In fact, if you'd like to see one of the earliest computers from decades ago,
712
00:35:04,621 --> 00:35:08,011
across the river here in now Allston in the new engineering building
713
00:35:08,011 --> 00:35:13,321
is the Harvard Mark 1 computer that will give you a much better mental model
714
00:35:13,321 --> 00:35:14,681
of just that.
715
00:35:14,681 --> 00:35:17,191
Well if we come back now to this first picture
716
00:35:17,191 --> 00:35:19,861
being computer science or really problem solving,
717
00:35:19,861 --> 00:35:21,811
I daresay we have more than enough ways now
718
00:35:21,811 --> 00:35:25,891
to represent information, input and output, so long as we all just agree
719
00:35:25,891 --> 00:35:28,951
on something and thankfully all of those before us have given us
720
00:35:28,951 --> 00:35:30,661
things like ASCII and Unicode.
721
00:35:30,661 --> 00:35:33,851
Not to mention MP4s, word documents, and the like.
722
00:35:33,851 --> 00:35:37,951
But what's inside of this proverbial black box into which these inputs are
723
00:35:37,951 --> 00:35:39,698
going in the outputs are coming?
724
00:35:39,698 --> 00:35:42,240
Well that's where we get this term you might have heard, too.
725
00:35:42,240 --> 00:35:47,371
An algorithm, which is just step-by-step instructions for solving some problem
726
00:35:47,371 --> 00:35:50,641
incarnated in the world of computers by software.
727
00:35:50,641 --> 00:35:53,611
When you write software aka programs, you
728
00:35:53,611 --> 00:35:58,800
are implementing one or more algorithms, one or more sets of instructions
729
00:35:58,800 --> 00:36:02,081
for solving some problem, and maybe you're using this language or that,
730
00:36:02,081 --> 00:36:04,123
but at the end of the day, no matter the language
731
00:36:04,123 --> 00:36:07,111
you use the computer is going to represent what you type
732
00:36:07,111 --> 00:36:10,470
using just zeros and ones.
733
00:36:10,470 --> 00:36:12,961
So what might be a representative algorithm?
734
00:36:12,961 --> 00:36:15,331
Nowadays you might use your phone quite a bit
735
00:36:15,331 --> 00:36:18,181
to make calls or send texts or emails and therefore you
736
00:36:18,181 --> 00:36:20,701
have a whole bunch of contacts in your address book.
737
00:36:20,701 --> 00:36:22,951
Nowadays, of course, this is very digital,
738
00:36:22,951 --> 00:36:26,041
but whether on iOS or Android or the like,
739
00:36:26,041 --> 00:36:28,711
you might have a whole bunch of names, first name
740
00:36:28,711 --> 00:36:31,643
and/or last, as well as numbers and emails and the like.
741
00:36:31,643 --> 00:36:34,351
You might be in the habit of like scrolling through on your phone
742
00:36:34,351 --> 00:36:37,891
all of those names to find the person you want to call.
743
00:36:37,891 --> 00:36:41,701
It's probably sorted alphabetically by first name or last name, A through Z,
744
00:36:41,701 --> 00:36:44,131
or some other symbol.
745
00:36:44,131 --> 00:36:49,464
This is frankly quite the same as we used to do back in my day, CS50,
746
00:36:49,464 --> 00:36:50,881
when we just used a physical book.
747
00:36:50,881 --> 00:36:52,714
In this physical book might be a whole bunch
748
00:36:52,714 --> 00:36:54,871
of names alphabetically sorted from left to right
749
00:36:54,871 --> 00:36:57,041
corresponding to a whole bunch of numbers.
750
00:36:57,041 --> 00:36:59,701
So suppose that in this old Harvard phone book
751
00:36:59,701 --> 00:37:01,861
we want to search for John Harvard.
752
00:37:01,861 --> 00:37:04,141
We might of course start quite simply at the beginning
753
00:37:04,141 --> 00:37:08,771
here, looking at one page at a time, and this is an algorithm.
754
00:37:08,771 --> 00:37:13,021
This is like literally step-by-step looking for the solution
755
00:37:13,021 --> 00:37:14,191
to this problem.
756
00:37:14,191 --> 00:37:16,411
In that sense, if John Harvard's in the phone book,
757
00:37:16,411 --> 00:37:20,364
is this algorithm page-by-page correct, would you say?
758
00:37:20,364 --> 00:37:21,113
AUDIENCE: Yes.
759
00:37:21,113 --> 00:37:21,821
DAVID MALAN: Yes.
760
00:37:21,821 --> 00:37:23,741
Like if John Harvard's in the phone book,
761
00:37:23,741 --> 00:37:27,341
obviously I'm eventually going to get to him, so that's what we mean by correct.
762
00:37:27,341 --> 00:37:28,841
Is it efficient?
763
00:37:28,841 --> 00:37:31,041
Is it well designed, would you say?
764
00:37:31,041 --> 00:37:31,541
No.
765
00:37:31,541 --> 00:37:34,691
I mean this is going to take forever even just to get to the Js or the Hs,
766
00:37:34,691 --> 00:37:35,891
depending how this thing's sorted.
767
00:37:35,891 --> 00:37:37,631
All right, well let me go a little faster.
768
00:37:37,631 --> 00:37:39,131
I'll start like two pages at a time.
769
00:37:39,131 --> 00:37:43,751
2, 4, 6, 8, 10, 12, and so forth.
770
00:37:43,751 --> 00:37:46,421
Sounds faster, is faster, is it correct?
771
00:37:46,421 --> 00:37:47,111
AUDIENCE: No.
772
00:37:47,111 --> 00:37:49,121
DAVID MALAN: OK, why is it not correct?
773
00:37:49,121 --> 00:37:49,936
Yeah?
774
00:37:49,936 --> 00:37:51,744
AUDIENCE: So if you're starting on page 1,
775
00:37:51,744 --> 00:37:54,786
you're only going odd number of pages, so if it's on an even number page,
776
00:37:54,786 --> 00:37:55,456
you'll miss it.
777
00:37:55,456 --> 00:37:56,331
DAVID MALAN: Exactly.
778
00:37:56,331 --> 00:37:58,998
If I start on an odd number of pages and I'm going two at a time
779
00:37:58,998 --> 00:38:00,931
I might miss pages in between.
780
00:38:00,931 --> 00:38:03,193
And if I therefore conclude when I get to the back
781
00:38:03,193 --> 00:38:05,901
of the book there was no John Harvard, I might have just errored.
782
00:38:05,901 --> 00:38:08,151
This would be again one of these bugs.
783
00:38:08,151 --> 00:38:11,961
But if I try a little harder, I feel like there's a solution.
784
00:38:11,961 --> 00:38:14,251
We don't have to completely throw out this algorithm.
785
00:38:14,251 --> 00:38:16,941
I think we can probably go roughly twice as fast still.
786
00:38:16,941 --> 00:38:19,701
But what should we do instead to fix this?
787
00:38:19,701 --> 00:38:21,503
Yeah, in back.
788
00:38:21,503 --> 00:38:24,975
AUDIENCE: [INAUDIBLE]
789
00:38:31,561 --> 00:38:32,311
DAVID MALAN: Nice.
790
00:38:32,311 --> 00:38:35,686
So I think what many of us, most of us, if we even use this technology any more
791
00:38:35,686 --> 00:38:38,311
these days, we might go roughly to the middle of the phone book
792
00:38:38,311 --> 00:38:39,603
just to kind of get us started.
793
00:38:39,603 --> 00:38:43,051
And now I'm looking down, I'm looking for J, assuming first name, J Harvard,
794
00:38:43,051 --> 00:38:45,761
and it looks like I'm in the M section.
795
00:38:45,761 --> 00:38:48,459
So just to be clear, what should I do next?
796
00:38:48,459 --> 00:38:52,363
AUDIENCE: [INAUDIBLE]
797
00:38:54,358 --> 00:38:56,441
DAVID MALAN: OK, and presumably it is John Harvard
798
00:38:56,441 --> 00:38:57,649
would be to the left of this.
799
00:38:57,649 --> 00:39:00,631
So here's an opportunity to figuratively and literally tear
800
00:39:00,631 --> 00:39:05,161
this particular problem in half, throw half of the problem away.
801
00:39:05,161 --> 00:39:07,681
It's actually pretty easy if you just do it that way.
802
00:39:07,681 --> 00:39:09,491
The hard way is this way.
803
00:39:09,491 --> 00:39:13,841
But I've now just decreased the size of this problem really in half.
804
00:39:13,841 --> 00:39:17,941
So if I started with 1,000 pages of phone numbers and names, now
805
00:39:17,941 --> 00:39:19,291
I'm down to 500.
806
00:39:19,291 --> 00:39:21,301
And already we haven't found John Harvard,
807
00:39:21,301 --> 00:39:23,451
but that's a big bite out of this problem.
808
00:39:23,451 --> 00:39:27,039
I do think it's correct because if J is to the left of M, of course,
809
00:39:27,039 --> 00:39:28,831
he's definitely not going to be over there.
810
00:39:28,831 --> 00:39:32,851
I think if I repeat this again dividing and conquering, if you will,
811
00:39:32,851 --> 00:39:34,771
here I might have gone a little too far.
812
00:39:34,771 --> 00:39:36,281
Now I'm in like the E section.
813
00:39:36,281 --> 00:39:40,831
So let me tear the problem in half again, throw another 250 pages away,
814
00:39:40,831 --> 00:39:43,801
and again repeat, dividing and dividing and conquering
815
00:39:43,801 --> 00:39:47,251
until finally, presumably, I end up with just one page of a phone
816
00:39:47,251 --> 00:39:50,791
book on which John Harvard's name either is or is not,
817
00:39:50,791 --> 00:39:54,101
but because of the algorithm you proposed, step by step,
818
00:39:54,101 --> 00:39:57,251
I know that he's not in anything I discarded.
819
00:39:57,251 --> 00:40:00,901
So traumatic is that might have been made out
820
00:40:00,901 --> 00:40:04,416
to be, it's actually just harnessing pretty good human intuition.
821
00:40:04,416 --> 00:40:06,541
Indeed, this is what programming is all about, too.
822
00:40:06,541 --> 00:40:09,391
It's not about learning a completely new world,
823
00:40:09,391 --> 00:40:13,051
but really just how to harness intuition and ideas that you might already
824
00:40:13,051 --> 00:40:16,081
have and take naturally but learning how to express
825
00:40:16,081 --> 00:40:18,601
them now more succinctly, more precisely,
826
00:40:18,601 --> 00:40:21,851
using things called programming languages.
827
00:40:21,851 --> 00:40:27,031
Why is an algorithm like that if I found John Harvard better than, ultimately,
828
00:40:27,031 --> 00:40:29,521
just doing the first one or even the second
829
00:40:29,521 --> 00:40:32,641
and maybe doubling back to check those even pages?
830
00:40:32,641 --> 00:40:34,531
Well let's just look at little charts here.
831
00:40:34,531 --> 00:40:36,991
Again, we don't have to get into the nuances of numbers,
832
00:40:36,991 --> 00:40:40,201
but if we've got like a chart here, xy plot, on the x-axis
833
00:40:40,201 --> 00:40:42,131
here I claim as the size of the problem.
834
00:40:42,131 --> 00:40:45,141
So measured in the numbers of pages in the phone book.
835
00:40:45,141 --> 00:40:48,751
So the farther you go out here, the more pages are in the phone book.
836
00:40:48,751 --> 00:40:51,341
And here we have time to solve on the y-axis.
837
00:40:51,341 --> 00:40:54,031
So the higher you go up, the more time it's
838
00:40:54,031 --> 00:40:56,801
going to be taking to solve that particular problem.
839
00:40:56,801 --> 00:41:00,451
So let's just arbitrarily say that the first algorithm, involving
840
00:41:00,451 --> 00:41:04,211
like n pages, might be represented graphically like this.
841
00:41:04,211 --> 00:41:06,631
No matter the slope, it's a straight line
842
00:41:06,631 --> 00:41:09,061
because there's presumably a one to one relationship
843
00:41:09,061 --> 00:41:13,141
between numbers of pages and number of seconds or number of page turns.
844
00:41:13,141 --> 00:41:13,651
Why?
845
00:41:13,651 --> 00:41:15,991
If the phone company adds another page next year
846
00:41:15,991 --> 00:41:18,001
because some new people move to town, that's
847
00:41:18,001 --> 00:41:19,861
going to require one additional page for me.
848
00:41:19,861 --> 00:41:21,811
One to one.
849
00:41:21,811 --> 00:41:25,501
If, though, we use the second algorithm, flawed though it was,
850
00:41:25,501 --> 00:41:29,131
unless we double back a little bit to fix someone being in between,
851
00:41:29,131 --> 00:41:31,981
that's too going to be a straight line, but it's
852
00:41:31,981 --> 00:41:35,521
going to be a different slope because now there's a 2 to 1 or a 1 to 2
853
00:41:35,521 --> 00:41:38,951
relationship because I'm going to pages at a time.
854
00:41:38,951 --> 00:41:43,681
So if the phone company adds another page or another two pages,
855
00:41:43,681 --> 00:41:45,708
that still only just one more step.
856
00:41:45,708 --> 00:41:47,791
You can see the difference if I kind of draw this.
857
00:41:47,791 --> 00:41:50,911
If this is the phone book in question, this number of pages,
858
00:41:50,911 --> 00:41:53,611
it might take this many seconds on the yellow line
859
00:41:53,611 --> 00:41:57,361
to represent or to find someone like John Harvard.
860
00:41:57,361 --> 00:42:00,121
But of course on the first algorithm, the red line,
861
00:42:00,121 --> 00:42:02,461
it's literally going to take twice as many steps.
862
00:42:02,461 --> 00:42:05,011
And what do the n here mean? n is the go-to variable
863
00:42:05,011 --> 00:42:08,951
for computer scientist or programmer just generically representing a number.
864
00:42:08,951 --> 00:42:11,371
So if the number of pages in the phone book is n,
865
00:42:11,371 --> 00:42:14,281
the number of steps the second algorithm would have taken
866
00:42:14,281 --> 00:42:16,966
would be in the worst case n over 2.
867
00:42:16,966 --> 00:42:18,971
Half as many because you're going twice as fast.
868
00:42:18,971 --> 00:42:23,311
But the third algorithm, actually if you recall your logarithms,
869
00:42:23,311 --> 00:42:25,021
looks a little something like this.
870
00:42:25,021 --> 00:42:27,451
There's a fundamentally different relationship
871
00:42:27,451 --> 00:42:30,961
between the size of the problem and the amount of time required to solve it
872
00:42:30,961 --> 00:42:32,851
that technically is log-based, too, again,
873
00:42:32,851 --> 00:42:35,611
but it's really the shape that's different.
874
00:42:35,611 --> 00:42:39,031
The implication there is that if, for instance, Cambridge and Allston,
875
00:42:39,031 --> 00:42:41,611
two different towns here in Massachusetts, merge next year
876
00:42:41,611 --> 00:42:44,671
and there's just one phone book that's twice as big,
877
00:42:44,671 --> 00:42:47,371
no big deal for that third and final algorithm.
878
00:42:47,371 --> 00:42:47,881
Why?
879
00:42:47,881 --> 00:42:50,641
You just tear the problem one more time in half,
880
00:42:50,641 --> 00:42:54,061
taking one more byte, that's it, not another 1,000
881
00:42:54,061 --> 00:42:56,461
bytes just to get to the solution.
882
00:42:56,461 --> 00:42:59,021
Put another way, you can walk it way, way,
883
00:42:59,021 --> 00:43:02,221
way out here to a much bigger phone book and ultimately
884
00:43:02,221 --> 00:43:05,251
that green line is barely going to have budged.
885
00:43:05,251 --> 00:43:08,581
So this then is just a way of now formalizing and thinking
886
00:43:08,581 --> 00:43:15,101
about what the performance or quality of these algorithms might be.
887
00:43:15,101 --> 00:43:18,771
Before we now make one more formalization of the algorithm itself,
888
00:43:18,771 --> 00:43:24,821
any questions then on this notion of efficiency or now performance of ideas?
889
00:43:24,821 --> 00:43:25,321
Yeah.
890
00:43:25,321 --> 00:43:28,893
AUDIENCE: How many phone books have you got?
891
00:43:28,893 --> 00:43:31,351
DAVID MALAN: (LAUGHING) A lot of phone books over the years
892
00:43:31,351 --> 00:43:34,741
and if you or your parents have any more still somewhere we could definitely
893
00:43:34,741 --> 00:43:37,201
use them because they're hard to find.
894
00:43:37,201 --> 00:43:38,341
Other questions?
895
00:43:38,341 --> 00:43:40,271
But thanks.
896
00:43:40,271 --> 00:43:42,471
Other questions here, too?
897
00:43:42,471 --> 00:43:42,971
No.
898
00:43:42,971 --> 00:43:44,681
Oh, was that a murmur?
899
00:43:44,681 --> 00:43:45,708
Yes, over here.
900
00:43:45,708 --> 00:43:48,041
AUDIENCE: You could get Harry Potter as a guest speaker.
901
00:43:48,041 --> 00:43:49,174
DAVID MALAN: Sorry, say again.
902
00:43:49,174 --> 00:43:51,481
AUDIENCE: You could get Harry Potter as a guest speaker.
903
00:43:51,481 --> 00:43:52,501
DAVID MALAN: (LAUGHING) Oh, yeah.
904
00:43:52,501 --> 00:43:53,001
Hopefully.
905
00:43:53,001 --> 00:43:56,081
Then we'd have a little something more to use here.
906
00:43:56,081 --> 00:44:01,441
So now if we want to formalize further what it is we just did,
907
00:44:01,441 --> 00:44:03,061
we can go ahead and introduce this.
908
00:44:03,061 --> 00:44:06,028
A form of code aka pseudocode.
909
00:44:06,028 --> 00:44:08,611
Pseudocode is not a specific language, it's not like something
910
00:44:08,611 --> 00:44:11,551
we're about to start coding in, it's just a way of expressing yourself
911
00:44:11,551 --> 00:44:14,071
in English or any human language succinctly
912
00:44:14,071 --> 00:44:18,031
correctly toward an end of getting your idea for an algorithm across.
913
00:44:18,031 --> 00:44:20,401
So for instance, here might be how we could
914
00:44:20,401 --> 00:44:24,031
formalize the code, the pseudocode for that same algorithm.
915
00:44:24,031 --> 00:44:26,911
Step one was pick up the phone book, as I did.
916
00:44:26,911 --> 00:44:29,641
Step two might be open to the middle of the phone book,
917
00:44:29,641 --> 00:44:31,441
as you proposed that we do first.
918
00:44:31,441 --> 00:44:34,621
Step three was probably to look down at the pages, I did.
919
00:44:34,621 --> 00:44:37,231
And step four gets a little more interesting
920
00:44:37,231 --> 00:44:40,471
because I had to quickly make a decision and ask myself a question.
921
00:44:40,471 --> 00:44:44,221
If person is on page, then I should probably just
922
00:44:44,221 --> 00:44:45,951
go ahead and call that person.
923
00:44:45,951 --> 00:44:48,451
But that probably wasn't the case at least for John Harvard,
924
00:44:48,451 --> 00:44:50,551
and I opened the M section.
925
00:44:50,551 --> 00:44:52,651
So there's this other question I should now
926
00:44:52,651 --> 00:44:55,291
ask else if the person is earlier in the book,
927
00:44:55,291 --> 00:44:58,711
then I should tear the problem in half as I did but go left, so
928
00:44:58,711 --> 00:45:02,821
to speak, and then not just open to the middle of the left half of the book,
929
00:45:02,821 --> 00:45:06,001
but really just go back to step three, repeat myself.
930
00:45:06,001 --> 00:45:06,601
Why?
931
00:45:06,601 --> 00:45:10,351
Because I can just repeat what I just did, but with a smaller problem
932
00:45:10,351 --> 00:45:11,711
having taken this big bite.
933
00:45:11,711 --> 00:45:14,453
But, if the person was later in the book,
934
00:45:14,453 --> 00:45:17,161
as might have happened with a different person than John Harvard,
935
00:45:17,161 --> 00:45:19,786
then I should open to the middle of the right half of the book,
936
00:45:19,786 --> 00:45:21,776
again go back to line three, but again, I'm
937
00:45:21,776 --> 00:45:24,151
not going to get sucked doing something forever like this
938
00:45:24,151 --> 00:45:27,221
because I keep shrinking the size of the problem.
939
00:45:27,221 --> 00:45:29,131
Lastly, the only possible scenario that's
940
00:45:29,131 --> 00:45:32,606
left, if John Harvard is not on the page and he's not to the left
941
00:45:32,606 --> 00:45:34,981
and he's not to the right, what should our conclusion be?
942
00:45:34,981 --> 00:45:36,023
AUDIENCE: He's not there.
943
00:45:36,023 --> 00:45:37,189
DAVID MALAN: He's not there.
944
00:45:37,189 --> 00:45:38,091
He's not listed.
945
00:45:38,091 --> 00:45:40,941
So we need to quit in some other form.
946
00:45:40,941 --> 00:45:44,451
Now as an aside, it's kind of deliberate that I buried that last question
947
00:45:44,451 --> 00:45:48,721
at the end because this is what happens all too often in programming,
948
00:45:48,721 --> 00:45:50,691
whether you're new at it or professional,
949
00:45:50,691 --> 00:45:54,901
just not considering all possible cases, corner cases if you will,
950
00:45:54,901 --> 00:45:58,401
that might not happen that often, but if you don't anticipate them
951
00:45:58,401 --> 00:46:01,251
in your own code, pseudocode or otherwise,
952
00:46:01,251 --> 00:46:03,801
this is when and why programs might crash
953
00:46:03,801 --> 00:46:06,811
or you might say stupid little spinning beach balls or hourglasses
954
00:46:06,811 --> 00:46:08,061
or your computer might reboot.
955
00:46:08,061 --> 00:46:08,631
Why?
956
00:46:08,631 --> 00:46:11,481
It's doing something sort of unpredictable
957
00:46:11,481 --> 00:46:15,111
if a human, maybe myself, didn't anticipate this.
958
00:46:15,111 --> 00:46:18,201
Like what does this program do if John Harvard is not in the phone book
959
00:46:18,201 --> 00:46:20,809
if I had omitted lines 12 and 13?
960
00:46:20,809 --> 00:46:21,351
I don't know.
961
00:46:21,351 --> 00:46:23,351
Maybe it would behave differently on a Mac or PC
962
00:46:23,351 --> 00:46:26,031
because it's sort of undefined behavior.
963
00:46:26,031 --> 00:46:29,211
These are the kinds of omissions that frankly you're invariably
964
00:46:29,211 --> 00:46:31,341
going to make, bugs you're going to introduce,
965
00:46:31,341 --> 00:46:35,451
mistakes you're going to make early on, and me, too, 25 years later.
966
00:46:35,451 --> 00:46:38,811
But you'll get better at thinking about those corner cases
967
00:46:38,811 --> 00:46:41,731
and handling anything that can possibly go wrong and as a result,
968
00:46:41,731 --> 00:46:44,631
your code will be all the better for it.
969
00:46:44,631 --> 00:46:47,963
Now the problem ultimately with learning how to program,
970
00:46:47,963 --> 00:46:49,671
especially if you've never had experience
971
00:46:49,671 --> 00:46:54,111
or even if you do but you learned one language only,
972
00:46:54,111 --> 00:46:57,831
is that they all look a little cryptic at first glance.
973
00:46:57,831 --> 00:46:59,961
But they do share certain commonalities.
974
00:46:59,961 --> 00:47:02,841
In fact, we'll use this pseudocode to define those first.
975
00:47:02,841 --> 00:47:05,061
Highlighted in yellow here are what henceforth
976
00:47:05,061 --> 00:47:07,221
we're going to start calling functions.
977
00:47:07,221 --> 00:47:10,341
Lots of different programming languages exist, but most of them
978
00:47:10,341 --> 00:47:13,521
have what we might call functions, which are actions
979
00:47:13,521 --> 00:47:16,498
or verbs that solve some smaller problem.
980
00:47:16,498 --> 00:47:18,831
That is to say, you might use a whole bunch of functions
981
00:47:18,831 --> 00:47:22,941
to solve a bigger problem because each function tends to do
982
00:47:22,941 --> 00:47:25,551
something very specific or precise.
983
00:47:25,551 --> 00:47:29,841
These then in English might be translated in code, actual computer
984
00:47:29,841 --> 00:47:32,061
code, to these things called functions.
985
00:47:32,061 --> 00:47:35,631
Highlighted in yellow now are what we might call conditionals.
986
00:47:35,631 --> 00:47:38,451
Conditionals are things that you do conditionally
987
00:47:38,451 --> 00:47:40,143
based on the answer to some question.
988
00:47:40,143 --> 00:47:42,351
You can think of them kind of like forks in the road.
989
00:47:42,351 --> 00:47:45,051
Do you go left or go right or some other direction
990
00:47:45,051 --> 00:47:47,509
based on the answer to some question?
991
00:47:47,509 --> 00:47:48,801
Well, what are those questions?
992
00:47:48,801 --> 00:47:52,881
Highlighted now in yellow or what we would call Boolean expressions, named
993
00:47:52,881 --> 00:47:57,771
after a mathematician last name Bool, that simply have yes no answers.
994
00:47:57,771 --> 00:48:03,831
Or, if you prefer, true or false answers or, heck, if you prefer 1 or 0 answers.
995
00:48:03,831 --> 00:48:07,011
We just need to distinguish one scenario from another.
996
00:48:07,011 --> 00:48:09,801
The last thing manifests in this pseudocode
997
00:48:09,801 --> 00:48:12,441
is what I might highlight now and call loops.
998
00:48:12,441 --> 00:48:16,221
Some kind of cycle, some kind of directive that tells us to do something
999
00:48:16,221 --> 00:48:21,561
again and again so that I don't need a 1,000-line program to search
1000
00:48:21,561 --> 00:48:25,731
a 1,000-page phone book, I can get away with a 13-line program but sort
1001
00:48:25,731 --> 00:48:30,861
of repeat myself inherently in order to solve some problem until I get to that
1002
00:48:30,861 --> 00:48:31,921
last step.
1003
00:48:31,921 --> 00:48:34,281
So this then is what we might call pseudocode
1004
00:48:34,281 --> 00:48:37,851
and indeed there are other characteristics
1005
00:48:37,851 --> 00:48:41,241
of programs that we'll touch on before long, things like arguments and return
1006
00:48:41,241 --> 00:48:46,441
values, variables, and more, but unfortunately in most languages,
1007
00:48:46,441 --> 00:48:49,071
including some we will very deliberately use in this class
1008
00:48:49,071 --> 00:48:52,461
and that everyone in the real world these days still uses,
1009
00:48:52,461 --> 00:48:54,901
its programs tend to look like this.
1010
00:48:54,901 --> 00:48:57,561
This for instance, is a distillation of that very first program
1011
00:48:57,561 --> 00:49:02,511
I wrote in 1996 in CS50 itself just to print something on the screen.
1012
00:49:02,511 --> 00:49:07,431
In fact, this version here just tries to print quote unquote, "Hello, world."
1013
00:49:07,431 --> 00:49:10,431
Which is, dare say, the most canonical first thing that most
1014
00:49:10,431 --> 00:49:14,301
any programmer ever gets a computer to say just because,
1015
00:49:14,301 --> 00:49:15,601
but look at this mess.
1016
00:49:15,601 --> 00:49:18,621
I mean, there's a hash symbol, these angled brackets, parentheses,
1017
00:49:18,621 --> 00:49:22,461
words like int, curly braces, quotes, parentheses, semicolons, and back
1018
00:49:22,461 --> 00:49:23,121
slashes.
1019
00:49:23,121 --> 00:49:26,721
I mean there's more overhead and more syntax and clutter
1020
00:49:26,721 --> 00:49:28,641
than there is an actual idea.
1021
00:49:28,641 --> 00:49:32,781
Now that's not to say that you won't be able to understand this before long,
1022
00:49:32,781 --> 00:49:36,141
because honestly there's not that many patterns, indeed programming languages
1023
00:49:36,141 --> 00:49:40,401
have typically a much smaller vocabulary than any actual human language,
1024
00:49:40,401 --> 00:49:43,281
but at first it might indeed look quite cryptic.
1025
00:49:43,281 --> 00:49:47,061
But you can perhaps infer I have no idea what these other lines do yet,
1026
00:49:47,061 --> 00:49:50,871
but "Hello, world." is presumably quote unquote what
1027
00:49:50,871 --> 00:49:52,561
will be printed on the screen.
1028
00:49:52,561 --> 00:49:55,581
But what we'll do today, after a short break,
1029
00:49:55,581 --> 00:49:57,681
and set the stage for next week is introduce
1030
00:49:57,681 --> 00:50:00,036
these exact same ideas in just a bit using Scratch,
1031
00:50:00,036 --> 00:50:01,911
something that you yourselves might have used
1032
00:50:01,911 --> 00:50:05,331
when you're quite younger but without the same vocabulary applied
1033
00:50:05,331 --> 00:50:06,741
to those ideas.
1034
00:50:06,741 --> 00:50:11,121
The upside of what we'll soon do using Scratch, this graphical programming
1035
00:50:11,121 --> 00:50:14,661
language from our friends down the road at MIT, it'll let us today
1036
00:50:14,661 --> 00:50:19,191
start to drag and drop things that look like puzzle pieces that interlock
1037
00:50:19,191 --> 00:50:21,171
together if it makes logical sense to do so,
1038
00:50:21,171 --> 00:50:24,411
but without the distraction of hashes, parentheses,
1039
00:50:24,411 --> 00:50:27,111
curly braces, angle brackets, semicolons, and things
1040
00:50:27,111 --> 00:50:29,011
that are quite beside the point.
1041
00:50:29,011 --> 00:50:31,501
But for now, let's go ahead and take a 10 minute break here
1042
00:50:31,501 --> 00:50:33,801
and when we resume, we will start programming.
1043
00:50:33,801 --> 00:50:37,261
So this on the screen is a language called
1044
00:50:37,261 --> 00:50:40,621
C something that will dive into next week and thankfully
1045
00:50:40,621 --> 00:50:43,681
this now on the screen is another language called Python
1046
00:50:43,681 --> 00:50:46,621
that we'll also take a look at in a few weeks before long along
1047
00:50:46,621 --> 00:50:48,391
with other languages along the way.
1048
00:50:48,391 --> 00:50:52,341
Today though, and for this first week, week zero, so to speak,
1049
00:50:52,341 --> 00:50:54,091
we use Scratch because again it will allow
1050
00:50:54,091 --> 00:50:56,671
us to explore some of those programming fundamentals
1051
00:50:56,671 --> 00:51:01,171
that will be in C and in Python and in JavaScript and other languages, too,
1052
00:51:01,171 --> 00:51:05,221
but in a way where we don't have to worry about the distractions of syntax.
1053
00:51:05,221 --> 00:51:08,051
So the world of Scratch looks like this.
1054
00:51:08,051 --> 00:51:10,771
It's a web-based or downloadable programming environment
1055
00:51:10,771 --> 00:51:13,621
that has this layout here by default. On the left here
1056
00:51:13,621 --> 00:51:17,701
we'll soon see is a palette of puzzle pieces, programming blocks that
1057
00:51:17,701 --> 00:51:20,221
represent all of those ideas we just discussed.
1058
00:51:20,221 --> 00:51:22,771
And by dragging and dropping these puzzle pieces
1059
00:51:22,771 --> 00:51:26,881
or blocks over this big area and connecting them together,
1060
00:51:26,881 --> 00:51:28,951
if it makes logical sense to do so, we'll
1061
00:51:28,951 --> 00:51:31,231
start programming in this environment.
1062
00:51:31,231 --> 00:51:34,261
The environment allows you to have multiple sprites, so to speak.
1063
00:51:34,261 --> 00:51:36,811
Multiple characters, things like a cat or anything
1064
00:51:36,811 --> 00:51:41,011
else, and those sprites exist in this rectangular world
1065
00:51:41,011 --> 00:51:44,221
up here that you can full screen to make bigger and this here by default
1066
00:51:44,221 --> 00:51:48,901
is Scratch, who can move up, down, left, right and do many more things, too.
1067
00:51:48,901 --> 00:51:51,991
Within its Scratch's world you can think of it
1068
00:51:51,991 --> 00:51:55,951
as perhaps a familiar coordinate system with Xs and Ys
1069
00:51:55,951 --> 00:51:59,701
which is helpful only when it comes time to position things on the screen.
1070
00:51:59,701 --> 00:52:04,981
Right now Scratch is at the default, 0,0, where x equals 0 and y equals 0.
1071
00:52:04,981 --> 00:52:08,761
If you were to move the cat way up to the top, x would stay zero,
1072
00:52:08,761 --> 00:52:10,591
y would be positive 180.
1073
00:52:10,591 --> 00:52:13,351
If you move the cat all the way to the bottom, x would stay zero,
1074
00:52:13,351 --> 00:52:15,641
but y would now be negative 180.
1075
00:52:15,641 --> 00:52:20,161
And if you went left, x would become negative 240 but y would stay 0,
1076
00:52:20,161 --> 00:52:24,391
or to the right x would be 240 and y would stay zero.
1077
00:52:24,391 --> 00:52:28,291
So those numbers generally don't so much matter because you can just
1078
00:52:28,291 --> 00:52:30,871
move relatively in this world up, down, left, right,
1079
00:52:30,871 --> 00:52:33,931
but when it comes time to precisely position
1080
00:52:33,931 --> 00:52:36,301
some of these sprites or other imagery, it'll
1081
00:52:36,301 --> 00:52:39,751
be helpful just to have that mental model off up, down, left, and right.
1082
00:52:39,751 --> 00:52:42,851
Well let's go ahead and make perhaps the simplest of programs here.
1083
00:52:42,851 --> 00:52:45,751
I'm going to switch over to the same programming environment
1084
00:52:45,751 --> 00:52:48,671
now for a tour of the left hand side.
1085
00:52:48,671 --> 00:52:53,611
So by default selected here are the category in blue motion,
1086
00:52:53,611 --> 00:52:57,151
which has a whole bunch of puzzle pieces or blocks that relate to motion.
1087
00:52:57,151 --> 00:52:59,701
And whereas Scratch as a graphical language
1088
00:52:59,701 --> 00:53:03,388
categorizes things by the type of things that these pieces do,
1089
00:53:03,388 --> 00:53:05,221
we'll see that throughout this whole palette
1090
00:53:05,221 --> 00:53:08,161
we'll have functions and variables and conditionals
1091
00:53:08,161 --> 00:53:11,351
and Boolean expressions and more each in a different color and shape.
1092
00:53:11,351 --> 00:53:14,881
So for instance, moving 10 steps or turning one way or the other
1093
00:53:14,881 --> 00:53:18,391
would be functions categorized here as things like motion.
1094
00:53:18,391 --> 00:53:21,958
Under looks in purple, you might have speech bubbles
1095
00:53:21,958 --> 00:53:23,791
that you can create by dragging and dropping
1096
00:53:23,791 --> 00:53:27,061
these that might say "hello" or whatever for some number of seconds.
1097
00:53:27,061 --> 00:53:31,021
Or you could switch costumes, change the cat to look like a dog or a bird
1098
00:53:31,021 --> 00:53:33,181
or anything else in between.
1099
00:53:33,181 --> 00:53:34,021
Sounds, too.
1100
00:53:34,021 --> 00:53:37,711
You can play sounds like "meow" or anything you might import or record,
1101
00:53:37,711 --> 00:53:38,701
yourself.
1102
00:53:38,701 --> 00:53:41,971
Then there's these things Scratch calls events and the most important of these
1103
00:53:41,971 --> 00:53:43,891
is the first, when green flag clicked.
1104
00:53:43,891 --> 00:53:46,921
Because if we look over to the right of Scratch's world here,
1105
00:53:46,921 --> 00:53:50,371
this rectangular region has this green flag and red stop
1106
00:53:50,371 --> 00:53:53,581
sign up above, one of which is for Play one of which is for Stop
1107
00:53:53,581 --> 00:53:57,211
and so that's going to allow us to start and stop our actual programs
1108
00:53:57,211 --> 00:54:00,541
when that green flag is initially clicked.
1109
00:54:00,541 --> 00:54:04,561
But you can listen for other types of events when the spacebar is pressed
1110
00:54:04,561 --> 00:54:08,611
or something else, when this sprite is clicked or something else.
1111
00:54:08,611 --> 00:54:12,271
Here you already see like a programmer's incarnation of things
1112
00:54:12,271 --> 00:54:15,151
you and I take for granted like every day now on our phones.
1113
00:54:15,151 --> 00:54:19,091
Any time you tap an icon or drag your finger or hit a button on the side.
1114
00:54:19,091 --> 00:54:21,251
These are what a programmer would call events,
1115
00:54:21,251 --> 00:54:24,151
things that happen and are often triggered by us
1116
00:54:24,151 --> 00:54:28,171
humans and things that a program be it in Scratch or Python
1117
00:54:28,171 --> 00:54:31,981
or C or anything else can listen for and respond to.
1118
00:54:31,981 --> 00:54:34,681
Indeed, that's why when you tap the phone icon on your phone,
1119
00:54:34,681 --> 00:54:37,141
the phone application starts up because someone
1120
00:54:37,141 --> 00:54:41,341
wrote software that's listening for a finger press on that particular icon.
1121
00:54:41,341 --> 00:54:43,411
So Scratch has these same things, too.
1122
00:54:43,411 --> 00:54:46,291
Under Control in orange, you can see that we
1123
00:54:46,291 --> 00:54:48,421
can wait for one second or repeat something
1124
00:54:48,421 --> 00:54:50,371
some number of times, 10 by default, but we
1125
00:54:50,371 --> 00:54:53,501
can change anything in these white circles to anything else.
1126
00:54:53,501 --> 00:54:55,411
There's another puzzle piece here forever,
1127
00:54:55,411 --> 00:54:58,291
which implies some kind of loop where we can do something again and again.
1128
00:54:58,291 --> 00:54:59,761
Even though it seems a little tight, there's
1129
00:54:59,761 --> 00:55:01,831
not much room to fit something there, Scratch
1130
00:55:01,831 --> 00:55:03,706
is going to have these things grow and shrink
1131
00:55:03,706 --> 00:55:06,694
however we want to fill similarly shaped pieces.
1132
00:55:06,694 --> 00:55:07,861
Here are those conditionals.
1133
00:55:07,861 --> 00:55:12,761
If something is true or false, then do this next thing.
1134
00:55:12,761 --> 00:55:15,541
And that's how we can put in this little trapezoid-like shape.
1135
00:55:15,541 --> 00:55:19,471
Some form of Boolean expression, a question with a yes/no, true/false,
1136
00:55:19,471 --> 00:55:22,831
or one/zero answer and decide whether to do something or not.
1137
00:55:22,831 --> 00:55:25,141
You can combine these things, too.
1138
00:55:25,141 --> 00:55:28,606
If something is true, do this, else do this other thing.
1139
00:55:28,606 --> 00:55:30,481
And you can even tuck one inside of the other
1140
00:55:30,481 --> 00:55:34,021
if you want to ask three or four or more questions.
1141
00:55:34,021 --> 00:55:35,711
Sensing, too, is going to be a thing.
1142
00:55:35,711 --> 00:55:40,571
You can ask questions aka Boolean expressions like is the sprite touching
1143
00:55:40,571 --> 00:55:42,861
the mouse pointer, the arrow on the screen?
1144
00:55:42,861 --> 00:55:45,501
So that you can start to interact with these programs.
1145
00:55:45,501 --> 00:55:47,999
What is the distance between a sprite and a mouse pointer?
1146
00:55:47,999 --> 00:55:50,291
You can do simple calculations just to figure out maybe
1147
00:55:50,291 --> 00:55:52,841
if the enemy is getting close to the cat.
1148
00:55:52,841 --> 00:55:56,351
Under Operator some lower level stuff like math, but also the ability
1149
00:55:56,351 --> 00:55:58,551
to pick random numbers, which for a game is great
1150
00:55:58,551 --> 00:56:00,551
because then you can kind of vary the difficulty
1151
00:56:00,551 --> 00:56:03,009
or what's happening in a game without the same game playing
1152
00:56:03,009 --> 00:56:04,691
the same way every time.
1153
00:56:04,691 --> 00:56:06,251
And you can combine ideas.
1154
00:56:06,251 --> 00:56:10,221
Something and something must be true in order to make that kind of decision
1155
00:56:10,221 --> 00:56:10,721
before.
1156
00:56:10,721 --> 00:56:12,941
Or we can even join two words together.
1157
00:56:12,941 --> 00:56:15,881
Says apple and banana by default, but you can type in or drag and drop
1158
00:56:15,881 --> 00:56:19,691
whatever you want there to combine multiple words into full,
1159
00:56:19,691 --> 00:56:21,281
larger sentences.
1160
00:56:21,281 --> 00:56:25,061
Then lastly down here, there's in orange things called variables.
1161
00:56:25,061 --> 00:56:27,611
In math we've obviously got x and y and whatnot.
1162
00:56:27,611 --> 00:56:29,621
In programming we'll have the same ability
1163
00:56:29,621 --> 00:56:35,711
to store in these named symbols, x or y, values that we care about.
1164
00:56:35,711 --> 00:56:39,401
Numbers or letters or words or colors or anything, ultimately.
1165
00:56:39,401 --> 00:56:42,671
But in programming you'll see that it's much more conventional not to just
1166
00:56:42,671 --> 00:56:46,091
use simple letters like x and y and z, but to actually
1167
00:56:46,091 --> 00:56:52,991
give variables full singular or plural words to describe what they are.
1168
00:56:52,991 --> 00:56:56,831
Then lastly, if this isn't enough color blocks for you,
1169
00:56:56,831 --> 00:56:58,661
you can create your own blocks.
1170
00:56:58,661 --> 00:57:01,751
Indeed, this is going to be a programming principle we'll apply today
1171
00:57:01,751 --> 00:57:05,621
and with the first problem set whereby once you start to assemble these puzzle
1172
00:57:05,621 --> 00:57:10,361
pieces and you realize, oh, would have been nice if those several pieces could
1173
00:57:10,361 --> 00:57:13,691
have just been replaced by one had MIT thought to give me that
1174
00:57:13,691 --> 00:57:16,991
one puzzle piece, you yourself can make your own blocks
1175
00:57:16,991 --> 00:57:19,811
by connecting these all together, giving them a name, and boom,
1176
00:57:19,811 --> 00:57:21,951
a new puzzle piece will exist.
1177
00:57:21,951 --> 00:57:24,281
So let's do the simplest, most canonical programs
1178
00:57:24,281 --> 00:57:26,231
here, starting up with control, and I'm going
1179
00:57:26,231 --> 00:57:30,581
to click and drag and drop this thing here when green flag clicked.
1180
00:57:30,581 --> 00:57:33,808
Then I'm going to grab one more, for instance under Looks,
1181
00:57:33,808 --> 00:57:35,891
and under Looks I'm going to go ahead and just say
1182
00:57:35,891 --> 00:57:40,601
something like initially not just Hello but the more canonical
1183
00:57:40,601 --> 00:57:42,251
Hello comma world.
1184
00:57:42,251 --> 00:57:44,951
Now you might guess that in this programming environment,
1185
00:57:44,951 --> 00:57:48,311
I can go over here now and click the green flag and voila,
1186
00:57:48,311 --> 00:57:49,791
Hello comma world.
1187
00:57:49,791 --> 00:57:51,706
So that's my first program and obviously much
1188
00:57:51,706 --> 00:57:54,581
more user friendly than typing out the much more cryptic text that we
1189
00:57:54,581 --> 00:57:57,741
saw on the screen that you, too, will type out next week.
1190
00:57:57,741 --> 00:58:00,981
But for now, we'll just focus on these ideas, in this case, a function.
1191
00:58:00,981 --> 00:58:02,591
So what it is that just happened?
1192
00:58:02,591 --> 00:58:05,091
This purple block here is Say, that's the function,
1193
00:58:05,091 --> 00:58:09,791
and it seems to take some form of input in the white oval, specifically Hello
1194
00:58:09,791 --> 00:58:10,696
comma world.
1195
00:58:10,696 --> 00:58:12,821
Well this actually fits the paradigm that we looked
1196
00:58:12,821 --> 00:58:15,146
at earlier of just inputs and outputs.
1197
00:58:15,146 --> 00:58:18,041
So if I may, if you consider what this puzzle piece is doing,
1198
00:58:18,041 --> 00:58:19,751
it actually fits this model.
1199
00:58:19,751 --> 00:58:23,711
The input in this case is going to be Hello comma world in white.
1200
00:58:23,711 --> 00:58:28,046
The algorithm is going to be implemented as a function by MIT called Say
1201
00:58:28,046 --> 00:58:30,671
and the output of that is going to be some kind of side effect,
1202
00:58:30,671 --> 00:58:33,971
like the cat and the speech bubble are saying Hello, world.
1203
00:58:33,971 --> 00:58:36,461
So already even that simple drag and drop
1204
00:58:36,461 --> 00:58:40,041
mimics exactly this relatively simple mental model.
1205
00:58:40,041 --> 00:58:41,451
So let's take things further.
1206
00:58:41,451 --> 00:58:44,623
Let's go ahead now and make the program a little more interactive so
1207
00:58:44,623 --> 00:58:47,081
that it says something like Hello, David, or Hello, Carter,
1208
00:58:47,081 --> 00:58:49,301
or Hello to you specifically.
1209
00:58:49,301 --> 00:58:51,256
And for this, I'm going to go under Sensing.
1210
00:58:51,256 --> 00:58:54,131
And you might have to poke around to find these things the first time
1211
00:58:54,131 --> 00:58:57,173
around, but I've done this a few times so I kind of know where things are
1212
00:58:57,173 --> 00:58:58,001
and what color.
1213
00:58:58,001 --> 00:58:59,561
There's this function here.
1214
00:58:59,561 --> 00:59:01,453
Ask what's your name, but that's in white,
1215
00:59:01,453 --> 00:59:03,161
so we can change the question to anything
1216
00:59:03,161 --> 00:59:07,631
we want, and it's going to wait for the human to type in their answer.
1217
00:59:07,631 --> 00:59:10,211
This function called Ask is a little different
1218
00:59:10,211 --> 00:59:14,021
from the Say block, which just had this side effect of printing a speech
1219
00:59:14,021 --> 00:59:15,161
bubble to the screen.
1220
00:59:15,161 --> 00:59:19,781
The ask function is even more powerful in that after it asks the human to type
1221
00:59:19,781 --> 00:59:20,531
something in.
1222
00:59:20,531 --> 00:59:23,531
This function is going to hand you back what
1223
00:59:23,531 --> 00:59:27,791
they typed in in the form of what's called a return value, which
1224
00:59:27,791 --> 00:59:30,641
is stored ultimately and by default this thing called Answer.
1225
00:59:30,641 --> 00:59:33,313
This little blue oval here called Answer is again
1226
00:59:33,313 --> 00:59:35,021
one of these variables that in math would
1227
00:59:35,021 --> 00:59:38,529
be called just x or y but in programming we're saying what it does.
1228
00:59:38,529 --> 00:59:40,071
So I'm going to go ahead and do this.
1229
00:59:40,071 --> 00:59:41,904
Let me go ahead and drag and drop this block
1230
00:59:41,904 --> 00:59:44,331
and I want to ask the question before saying anything,
1231
00:59:44,331 --> 00:59:46,331
but you'll notice that Scratch is smart and it's
1232
00:59:46,331 --> 00:59:48,341
going to realize I want to insert something in between
1233
00:59:48,341 --> 00:59:50,299
and it's just going to move things up and down.
1234
00:59:50,299 --> 00:59:53,231
I'm going to let go and ask the default question, what's your name?
1235
00:59:53,231 --> 00:59:56,471
And now if I want to go ahead and say hello, David or Carter,
1236
00:59:56,471 --> 00:59:58,841
let's just do Hello comma, because I obviously
1237
00:59:58,841 --> 01:00:01,521
don't know when I'm writing the program who's going to use it.
1238
01:00:01,521 --> 01:00:07,841
So let me now grab another looks block up here, say something again, and now
1239
01:00:07,841 --> 01:00:11,981
let me go back to Sensing and now grab the return value, represented
1240
01:00:11,981 --> 01:00:15,311
by this other puzzle piece, and let me just drag and drop it here.
1241
01:00:15,311 --> 01:00:18,161
Notice it's the same shape, even if it's not quite the same size.
1242
01:00:18,161 --> 01:00:20,351
Things will grow or shrink as needed.
1243
01:00:20,351 --> 01:00:22,421
All right, so let's now zoom out.
1244
01:00:22,421 --> 01:00:25,331
Let me go and stop the old version because I don't want to say Hello,
1245
01:00:25,331 --> 01:00:25,991
world anymore.
1246
01:00:25,991 --> 01:00:28,451
Let me hit the green flag and what's my name?
1247
01:00:28,451 --> 01:00:29,351
All right, David.
1248
01:00:29,351 --> 01:00:31,103
Enter.
1249
01:00:31,103 --> 01:00:32,039
Huh.
1250
01:00:32,039 --> 01:00:34,581
All right, maybe I just wasn't paying close enough attention.
1251
01:00:34,581 --> 01:00:35,841
Let me try it again.
1252
01:00:35,841 --> 01:00:39,061
Green flag, D-A-V-I-D, Enter.
1253
01:00:39,061 --> 01:00:41,981
This seems like a bug.
1254
01:00:41,981 --> 01:00:46,001
What's the bug or mistake might you think?
1255
01:00:46,001 --> 01:00:46,851
Yeah?
1256
01:00:46,851 --> 01:00:50,071
AUDIENCE: Do you need to somehow add them together in the same text box?
1257
01:00:50,071 --> 01:00:53,461
DAVID MALAN: Yeah, we kind of want to combine them in the same text box.
1258
01:00:53,461 --> 01:00:56,641
And it's technically a bug because this just looks kind of stupid.
1259
01:00:56,641 --> 01:00:59,611
It's just saying David after I asked for my name.
1260
01:00:59,611 --> 01:01:02,671
I'd like it to say maybe Hello then David,
1261
01:01:02,671 --> 01:01:05,161
but it's just blowing past the Hello and printing David.
1262
01:01:05,161 --> 01:01:07,481
But let's put our finger on why this is happening.
1263
01:01:07,481 --> 01:01:10,891
You're right for the solution, but what's the actual fundamental problem?
1264
01:01:10,891 --> 01:01:11,928
In back.
1265
01:01:11,928 --> 01:01:15,407
AUDIENCE: So it says hello, but it gets to that last step
1266
01:01:15,407 --> 01:01:16,626
so quickly you can't see it.
1267
01:01:16,626 --> 01:01:17,501
DAVID MALAN: Perfect.
1268
01:01:17,501 --> 01:01:20,141
I mean, computers are really darn fast these days.
1269
01:01:20,141 --> 01:01:23,051
It is saying Hello, all of us are just too slow in this room
1270
01:01:23,051 --> 01:01:27,441
to even see it because it's then saying David on the screen so fast as well.
1271
01:01:27,441 --> 01:01:30,143
So there's a couple of solutions here, and yours is spot on,
1272
01:01:30,143 --> 01:01:32,351
but just to poke around, you'll see the first example
1273
01:01:32,351 --> 01:01:35,831
of how many ways in programming be it Scratch or C or Python or anything
1274
01:01:35,831 --> 01:01:38,141
else, that there are going to be to solve problems?
1275
01:01:38,141 --> 01:01:40,121
We'll teach you over the course of these weeks,
1276
01:01:40,121 --> 01:01:43,361
sometimes some ways are better relatively than others,
1277
01:01:43,361 --> 01:01:46,511
but rarely is there a best way necessarily,
1278
01:01:46,511 --> 01:01:48,428
because again reasonable people will disagree.
1279
01:01:48,428 --> 01:01:50,636
And what we'll try to teach you over the coming weeks
1280
01:01:50,636 --> 01:01:52,811
is how to kind of think through those nuances.
1281
01:01:52,811 --> 01:01:54,958
And it's not going to be obvious at first glance,
1282
01:01:54,958 --> 01:01:57,041
but the more programs you write, the more feedback
1283
01:01:57,041 --> 01:01:59,651
you get, the more bugs that you introduce,
1284
01:01:59,651 --> 01:02:03,561
the more you'll get your footing with exactly this kind of problem solving.
1285
01:02:03,561 --> 01:02:05,831
So let me try this in a couple of ways.
1286
01:02:05,831 --> 01:02:08,321
Up here would be one solution to the problem.
1287
01:02:08,321 --> 01:02:12,986
MIT anticipated this kind of issue, especially with first-time programmers,
1288
01:02:12,986 --> 01:02:14,861
and I could just use a puzzle piece that says
1289
01:02:14,861 --> 01:02:17,471
say the following for two seconds or one second
1290
01:02:17,471 --> 01:02:20,081
or whatever, then do the same with the next word
1291
01:02:20,081 --> 01:02:22,811
and it might be kind of a bit of a pause,
1292
01:02:22,811 --> 01:02:27,311
Hello, one second, two seconds, David, one second, two seconds, but at least
1293
01:02:27,311 --> 01:02:29,461
it would look a little more grammatically correct.
1294
01:02:29,461 --> 01:02:31,961
But I can do it a little more elegantly, as you've proposed.
1295
01:02:31,961 --> 01:02:34,086
Let me go ahead and throw away one of these blocks,
1296
01:02:34,086 --> 01:02:36,881
and you can just drag and let go and it'll delete itself.
1297
01:02:36,881 --> 01:02:42,911
Let me go down to Operators because this Join block here is the right shape.
1298
01:02:42,911 --> 01:02:46,421
So even if you're not sure what goes where, just focus on the shapes first.
1299
01:02:46,421 --> 01:02:48,671
Let me drag this over here.
1300
01:02:48,671 --> 01:02:50,001
It grew to fill that.
1301
01:02:50,001 --> 01:02:52,871
Let me go ahead and say hello comma space.
1302
01:02:52,871 --> 01:02:55,031
Now it could just say by default Hello, banana,
1303
01:02:55,031 --> 01:03:00,401
but let me go back to Sensing, Drag answer,
1304
01:03:00,401 --> 01:03:02,201
and that's going to drag and drop there.
1305
01:03:02,201 --> 01:03:06,861
So now notice we're sort of stacking or nesting one block on another
1306
01:03:06,861 --> 01:03:10,721
so that the output of one becomes the input to another, but that's OK here.
1307
01:03:10,721 --> 01:03:14,724
Let me go ahead and zoom out, hit Stop, and hit Play.
1308
01:03:14,724 --> 01:03:15,891
All right, what's your name?
1309
01:03:15,891 --> 01:03:18,251
D-A-V-I-D, Enter, and voila.
1310
01:03:18,251 --> 01:03:21,471
Now it's presumably as we first intended.
1311
01:03:21,471 --> 01:03:22,059
[APPLAUSE]
1312
01:03:22,059 --> 01:03:23,101
(LAUGHING) Oh, thank you.
1313
01:03:28,101 --> 01:03:28,761
Thank you.
1314
01:03:28,761 --> 01:03:30,511
No minus 2 this time.
1315
01:03:30,511 --> 01:03:35,428
So consider that even with this additional example,
1316
01:03:35,428 --> 01:03:38,511
it still fits the same mental model, but in a little more interesting way.
1317
01:03:38,511 --> 01:03:41,661
Here's that new function Ask something and wait.
1318
01:03:41,661 --> 01:03:45,171
And notice that in this case too there's an input, otherwise known
1319
01:03:45,171 --> 01:03:48,321
henceforth as an argument or a parameter, programming
1320
01:03:48,321 --> 01:03:51,381
speak for just an input in the context of a function.
1321
01:03:51,381 --> 01:03:54,531
If we use our drawing as before to represent this thing here,
1322
01:03:54,531 --> 01:03:58,761
we'll see that the input now is going to be quote unquote "What's your name?"
1323
01:03:58,761 --> 01:04:02,781
The algorithm is going to be implemented by way of this new puzzle piece,
1324
01:04:02,781 --> 01:04:06,081
the function called Ask, and the output of that thing this time
1325
01:04:06,081 --> 01:04:08,811
is not going to be the cat saying anything yet,
1326
01:04:08,811 --> 01:04:12,421
but rather it's going to be the actual answer.
1327
01:04:12,421 --> 01:04:15,831
So instead of the visual side effect of the speech bubble appearing,
1328
01:04:15,831 --> 01:04:18,321
now nothing visible is happening yet.
1329
01:04:18,321 --> 01:04:22,371
Thanks to this function it's sort of handing me back like a scrap of paper
1330
01:04:22,371 --> 01:04:28,401
with whatever I typed in written on it so I can reuse D-A-V-I-D one or more
1331
01:04:28,401 --> 01:04:30,651
times even like I did.
1332
01:04:30,651 --> 01:04:32,751
Now what did I then do with that value?
1333
01:04:32,751 --> 01:04:37,521
Well consider that with the subsequent function
1334
01:04:37,521 --> 01:04:40,981
we had this Say block, too, combined with a join.
1335
01:04:40,981 --> 01:04:44,481
So we have this variable called Answer, we're joining it
1336
01:04:44,481 --> 01:04:46,903
with that first argument, Hello.
1337
01:04:46,903 --> 01:04:48,861
So already we see that some functions like Join
1338
01:04:48,861 --> 01:04:52,701
can take not one but two arguments, or inputs, and that's fine.
1339
01:04:52,701 --> 01:04:57,591
The output of Join is presumably going to be Hello, David or Hello, Carter
1340
01:04:57,591 --> 01:04:59,871
or whatever the human typed in.
1341
01:04:59,871 --> 01:05:04,281
That output notice is essentially becoming the input to another function,
1342
01:05:04,281 --> 01:05:06,651
Say, just because we've kind of stacked things
1343
01:05:06,651 --> 01:05:08,551
or nested them on top of one another.
1344
01:05:08,551 --> 01:05:12,981
But methodically, it's really the same idea.
1345
01:05:12,981 --> 01:05:17,601
The input now are two things, Hello comma and the return value
1346
01:05:17,601 --> 01:05:20,001
from the previous Ask function.
1347
01:05:20,001 --> 01:05:23,931
The function now is going to be Join, the output is going to be Hello, David.
1348
01:05:23,931 --> 01:05:25,761
But that Hello, David output is now going
1349
01:05:25,761 --> 01:05:30,201
to become the input to another function, namely that first block called Say,
1350
01:05:30,201 --> 01:05:34,311
and that's then going to have the side effect of printing out Hello, David
1351
01:05:34,311 --> 01:05:35,371
on the screen.
1352
01:05:35,371 --> 01:05:39,111
So again as sort of sophisticated as ours as yours as others programs
1353
01:05:39,111 --> 01:05:41,931
are going to get, they really do fit this very simple mental model
1354
01:05:41,931 --> 01:05:45,441
of inputs and outputs and you just have to learn to recognize the vocabulary
1355
01:05:45,441 --> 01:05:49,731
and to know what kinds of puzzle pieces or concepts ultimately to apply.
1356
01:05:49,731 --> 01:05:52,351
But you can ultimately really kind of spice these things up.
1357
01:05:52,351 --> 01:05:54,021
Let me go back to my program here that just is
1358
01:05:54,021 --> 01:05:55,611
using the speech bubble at the moment.
1359
01:05:55,611 --> 01:05:58,791
Scratch's inside has some pretty fancy interactive features, too.
1360
01:05:58,791 --> 01:06:01,671
I click the Extensions button in the bottom left corner.
1361
01:06:01,671 --> 01:06:05,948
And let me go ahead and choose the Text to Speech extension.
1362
01:06:05,948 --> 01:06:08,781
This is using a Cloud service, so if you have an internet connection
1363
01:06:08,781 --> 01:06:11,841
it can actually talk to the Cloud or a third party service,
1364
01:06:11,841 --> 01:06:15,111
and this one is going to give me a few new green puzzle pieces, namely
1365
01:06:15,111 --> 01:06:17,871
the ability to speak something from my speakers
1366
01:06:17,871 --> 01:06:19,791
instead of just saying it textually.
1367
01:06:19,791 --> 01:06:21,274
So let me go ahead and drag this.
1368
01:06:21,274 --> 01:06:24,441
Now notice I don't have to interlock them if I'm just kind of playing around
1369
01:06:24,441 --> 01:06:25,671
and I want to move some things around.
1370
01:06:25,671 --> 01:06:27,981
I just want to use this as like a canvas temporarily.
1371
01:06:27,981 --> 01:06:30,841
Let me go ahead and steal the Join from here,
1372
01:06:30,841 --> 01:06:34,281
put it there, let me throw away the Say block by just moving it
1373
01:06:34,281 --> 01:06:37,341
left and letting go, and now let me join this in
1374
01:06:37,341 --> 01:06:41,281
so I've now changed my program to be a little more interesting.
1375
01:06:41,281 --> 01:06:43,041
So now let me stop the old version.
1376
01:06:43,041 --> 01:06:44,631
Let me start the new.
1377
01:06:44,631 --> 01:06:45,411
What's your name?
1378
01:06:45,411 --> 01:06:46,311
Type in David.
1379
01:06:46,311 --> 01:06:47,421
And voila:
1380
01:06:47,421 --> 01:06:48,396
PROGRAM: Hello, banana.
1381
01:06:51,066 --> 01:06:52,941
DAVID MALAN: (LAUGHING) OK, minus 2 for real.
1382
01:06:52,941 --> 01:06:59,961
All right, so what I accidentally threw away there, intentionally
1383
01:06:59,961 --> 01:07:02,871
for instructional purposes, was the actual answer
1384
01:07:02,871 --> 01:07:05,361
that came back from the ask block.
1385
01:07:05,361 --> 01:07:06,321
That's embarrassing.
1386
01:07:06,321 --> 01:07:10,293
So now if I play this again, let's click the green icon.
1387
01:07:10,293 --> 01:07:11,001
What's your name?
1388
01:07:11,001 --> 01:07:11,541
David.
1389
01:07:11,541 --> 01:07:13,011
And now:
1390
01:07:13,011 --> 01:07:14,099
PROGRAM: Hello, David.
1391
01:07:14,099 --> 01:07:15,141
DAVID MALAN: There we go.
1392
01:07:15,141 --> 01:07:16,521
Hello, David.
1393
01:07:16,521 --> 01:07:18,116
All right, thank you.
1394
01:07:18,116 --> 01:07:22,971
[APPLAUSE]
1395
01:07:22,971 --> 01:07:27,181
OK, so we have these functions then in place, but what more can we do?
1396
01:07:27,181 --> 01:07:30,141
Well what about those conditionals and loops and other constructs?
1397
01:07:30,141 --> 01:07:32,511
How can we bring these programs to life so it's not just
1398
01:07:32,511 --> 01:07:34,651
clicking a button and voila, something's happening?
1399
01:07:34,651 --> 01:07:36,951
Let's go ahead and make this now even more interactive.
1400
01:07:36,951 --> 01:07:39,201
Let me go ahead and throw away most of these pieces
1401
01:07:39,201 --> 01:07:42,171
and let me just spice things up with some more audio under Sound.
1402
01:07:42,171 --> 01:07:44,871
I'm going to go to Play Sound Meow until done.
1403
01:07:44,871 --> 01:07:46,281
Here we go, green flag.
1404
01:07:46,281 --> 01:07:47,951
[MEOW]
1405
01:07:47,951 --> 01:07:51,221
OK, it's a little loud, but it did exactly do what it said.
1406
01:07:51,221 --> 01:07:52,595
Let's hear it again.
1407
01:07:52,595 --> 01:07:53,991
[QUIETER MEOW]
1408
01:07:53,991 --> 01:07:54,491
OK.
1409
01:07:54,491 --> 01:07:56,191
It's kind of an underwhelming program eventually
1410
01:07:56,191 --> 01:07:59,251
since you'd like to think that the cat would just meow on its own, but.
1411
01:07:59,251 --> 01:07:59,641
[MEOW]
1412
01:07:59,641 --> 01:08:01,058
I have to keep hitting the button.
1413
01:08:01,058 --> 01:08:04,086
Well this seems like an opportunity for doing something again and again.
1414
01:08:04,086 --> 01:08:06,211
So all right, well if I wanted to meow, meow, meow,
1415
01:08:06,211 --> 01:08:09,871
let me just grab a few of these, or you can even right click or Control click
1416
01:08:09,871 --> 01:08:12,061
and you can Copy Paste even in code here.
1417
01:08:12,061 --> 01:08:13,706
Let me play this now.
1418
01:08:13,706 --> 01:08:15,931
[THREE MEOWS]
1419
01:08:15,931 --> 01:08:17,928
All right, so now like it's not really emoting
1420
01:08:17,928 --> 01:08:19,261
happiness in quite the same way.
1421
01:08:19,261 --> 01:08:20,521
It might be hungry or upset.
1422
01:08:20,521 --> 01:08:22,121
So let's slow it down.
1423
01:08:22,121 --> 01:08:25,181
Let me go to Control, wait one second in between,
1424
01:08:25,181 --> 01:08:28,561
which might be a little less worrisome.
1425
01:08:28,561 --> 01:08:29,581
Here we go, Play.
1426
01:08:29,581 --> 01:08:34,151
[THREE SLOWER MEOWS]
1427
01:08:34,151 --> 01:08:39,011
OK, so if my goal was to make the cat meow three times,
1428
01:08:39,011 --> 01:08:42,701
I dare say this code or algorithm is correct.
1429
01:08:42,701 --> 01:08:45,641
But let's now critique its design.
1430
01:08:45,641 --> 01:08:47,381
Is this well-designed?
1431
01:08:47,381 --> 01:08:50,481
And if not, why not?
1432
01:08:50,481 --> 01:08:51,871
What are your thoughts here?
1433
01:08:51,871 --> 01:08:54,201
Yeah?
1434
01:08:54,201 --> 01:08:59,753
AUDIENCE: You could use the forever or a repeat to make it more--
1435
01:08:59,753 --> 01:09:01,211
DAVID MALAN: Yeah, so yeah, agreed.
1436
01:09:01,211 --> 01:09:04,001
I could use forever or repeat, but let me push a little harder.
1437
01:09:04,001 --> 01:09:04,691
But why?
1438
01:09:04,691 --> 01:09:08,771
Like this works, I'm kind of done with the assignments, what's bad about it?
1439
01:09:08,771 --> 01:09:10,581
AUDIENCE: There's too much repetition.
1440
01:09:10,581 --> 01:09:12,831
DAVID MALAN: Yeah, there's too much repetition, right?
1441
01:09:12,831 --> 01:09:15,291
If I wanted to change the sound that the cat is making
1442
01:09:15,291 --> 01:09:18,741
to a different variant of meow or have it bark instead like a dog,
1443
01:09:18,741 --> 01:09:21,051
I could change it from the dropdown here apparently,
1444
01:09:21,051 --> 01:09:24,051
but then I'd have to change it here and then I'd have to change it here,
1445
01:09:24,051 --> 01:09:26,811
and God, if this were even longer that just gets tedious quickly
1446
01:09:26,811 --> 01:09:28,731
and you're probably increasing the probability
1447
01:09:28,731 --> 01:09:29,781
that you're going to screw up and you're going
1448
01:09:29,781 --> 01:09:32,772
to miss one of the dropdowns or something stupid and introduce a bug.
1449
01:09:32,772 --> 01:09:35,480
Or, if you wanted to change the number of seconds you're waiting,
1450
01:09:35,480 --> 01:09:37,851
you've got to change it in two, maybe even more places.
1451
01:09:37,851 --> 01:09:40,281
Again, you're just creating risk for yourself
1452
01:09:40,281 --> 01:09:41,851
and potential bugs in the program.
1453
01:09:41,851 --> 01:09:45,741
So I do like the repeat or the forever idea so that I don't repeat myself.
1454
01:09:45,741 --> 01:09:48,501
And indeed, what I alluded to being possible,
1455
01:09:48,501 --> 01:09:51,351
copy pasting earlier, doesn't mean it's a good thing.
1456
01:09:51,351 --> 01:09:53,121
And in code, generally speaking, when you
1457
01:09:53,121 --> 01:09:56,541
start to copy and paste puzzle pieces or text next week,
1458
01:09:56,541 --> 01:09:59,610
you're probably not doing something quite well.
1459
01:09:59,610 --> 01:10:03,381
So let me go ahead and throw away most of these to get rid of the duplication,
1460
01:10:03,381 --> 01:10:06,381
keeping just two of the blocks that I care about.
1461
01:10:06,381 --> 01:10:10,581
Let me grab the Repeat block for now, let me move this inside of the Repeat
1462
01:10:10,581 --> 01:10:13,641
block, it's going to grow to fit it, let me reconnect all this
1463
01:10:13,641 --> 01:10:17,150
and change the 10 just to a 3, and now, Play.
1464
01:10:17,150 --> 01:10:22,301
[THREE SLOW MEOWS]
1465
01:10:22,301 --> 01:10:23,360
So, better.
1466
01:10:23,360 --> 01:10:24,321
It's the same thing.
1467
01:10:24,321 --> 01:10:26,238
It's still correct, but now I've set the stage
1468
01:10:26,238 --> 01:10:29,741
to let the cat meow, for instance, four times by changing one thing,
1469
01:10:29,741 --> 01:10:33,131
40 times by changing one thing, or it could just use the Forever block
1470
01:10:33,131 --> 01:10:35,860
and just walk away and it will meow forever instead.
1471
01:10:35,860 --> 01:10:37,931
If that's your goal, that would be better.
1472
01:10:37,931 --> 01:10:40,270
A better design but still correct.
1473
01:10:40,270 --> 01:10:41,020
But you know what?
1474
01:10:41,020 --> 01:10:42,971
Now that I have a program that's designed
1475
01:10:42,971 --> 01:10:46,331
to have a cat meow, wow like why?
1476
01:10:46,331 --> 01:10:49,060
I mean, MIT invented Scratch, Scratch as a cat,
1477
01:10:49,060 --> 01:10:51,071
why is there no puzzle piece called Meow?
1478
01:10:51,071 --> 01:10:52,781
This feels like a missed opportunity.
1479
01:10:52,781 --> 01:10:55,451
Now to be fair, they gave us all the building blocks
1480
01:10:55,451 --> 01:10:58,732
with which we could implement that idea, but a principle of programming
1481
01:10:58,732 --> 01:11:00,940
and really computer science is to leverage what we're
1482
01:11:00,940 --> 01:11:03,190
going to now start calling Abstraction.
1483
01:11:03,190 --> 01:11:07,181
We have step-by-step instructions here, the Repeat, the Play,
1484
01:11:07,181 --> 01:11:09,701
and the Wait that collectively implements this idea
1485
01:11:09,701 --> 01:11:11,471
that we humans would call meowing.
1486
01:11:11,471 --> 01:11:14,531
Wouldn't it be nice to abstract away those several puzzle
1487
01:11:14,531 --> 01:11:18,401
pieces into just one that literally just says what it does, meow?
1488
01:11:18,401 --> 01:11:20,981
Well here's where we can make our own blocks.
1489
01:11:20,981 --> 01:11:25,031
Let me go over here to Scratch under the pink block category
1490
01:11:25,031 --> 01:11:28,633
here and let me click Make a Block.
1491
01:11:28,633 --> 01:11:30,341
Here I see a slightly different interface
1492
01:11:30,341 --> 01:11:33,191
where I can choose a name for it and I'm going to call it Meow.
1493
01:11:33,191 --> 01:11:33,941
I'm going to keep it simple.
1494
01:11:33,941 --> 01:11:34,441
That's it.
1495
01:11:34,441 --> 01:11:35,981
No inputs to meow yet.
1496
01:11:35,981 --> 01:11:37,881
I'm just going to click OK.
1497
01:11:37,881 --> 01:11:40,901
Now I'm just going to clean this up a bit here.
1498
01:11:40,901 --> 01:11:44,721
Let me drag and drop Play Sound and Wait over here.
1499
01:11:44,721 --> 01:11:45,731
And you know what?
1500
01:11:45,731 --> 01:11:48,551
I'm just going to drag this way down here, way down
1501
01:11:48,551 --> 01:11:50,891
here because now that I'm done implementing Meow,
1502
01:11:50,891 --> 01:11:53,751
I'm going to literally abstract it away, sort of out of sight,
1503
01:11:53,751 --> 01:11:58,001
out of mind, because now notice at top left there is a new pink puzzle
1504
01:11:58,001 --> 01:11:59,411
piece called Meow.
1505
01:11:59,411 --> 01:12:04,241
So at this point, I'd argue it doesn't really matter how Meow is implemented.
1506
01:12:04,241 --> 01:12:07,721
Frankly, I don't know how Ask or Say was implemented by MIT.
1507
01:12:07,721 --> 01:12:09,911
They abstracted those things away for us.
1508
01:12:09,911 --> 01:12:12,821
Now I have a brand new puzzle piece that just says what it is.
1509
01:12:12,821 --> 01:12:17,141
And this is now still correct, but arguably better design.
1510
01:12:17,141 --> 01:12:17,741
Why?
1511
01:12:17,741 --> 01:12:20,141
Because it's just more readable to me, to you,
1512
01:12:20,141 --> 01:12:22,391
it's more maintainable when you look at your code
1513
01:12:22,391 --> 01:12:24,941
a year from now for the first time because you're sort of finally looking
1514
01:12:24,941 --> 01:12:26,649
back at the very first program you wrote.
1515
01:12:26,649 --> 01:12:28,241
It says what it does.
1516
01:12:28,241 --> 01:12:31,931
The function itself has semantics, which conveys what's going on.
1517
01:12:31,931 --> 01:12:34,661
If you really care about how Meow is implemented,
1518
01:12:34,661 --> 01:12:37,631
you could scroll down and start to tinker with the underlying
1519
01:12:37,631 --> 01:12:42,401
implementation details, but otherwise you don't need to care anymore.
1520
01:12:42,401 --> 01:12:45,911
Now I feel like there's an even additional opportunity
1521
01:12:45,911 --> 01:12:50,411
here for abstraction and to factor out some of this functionality.
1522
01:12:50,411 --> 01:12:53,861
It's kind of lame that I have this Repeat block that
1523
01:12:53,861 --> 01:12:57,211
lets me call the Meow function, so to speak, use the Meow function
1524
01:12:57,211 --> 01:12:58,271
three times.
1525
01:12:58,271 --> 01:13:01,181
Wouldn't it be nice if I could just call them Meow function,
1526
01:13:01,181 --> 01:13:05,561
aka use the Meow function, and pass it in input that tells the puzzle
1527
01:13:05,561 --> 01:13:07,811
piece how many times I want it to meow?
1528
01:13:07,811 --> 01:13:10,671
Well let me go ahead and zoom out and scroll down.
1529
01:13:10,671 --> 01:13:14,261
Let me right click or Control click on the pink piece here and choose Edit,
1530
01:13:14,261 --> 01:13:17,651
or I could just start from scratch, no pun intended, with a new one.
1531
01:13:17,651 --> 01:13:21,491
Now here, rather than just give this thing a name Meow, let me go ahead
1532
01:13:21,491 --> 01:13:23,501
and add an input here.
1533
01:13:23,501 --> 01:13:25,781
I'm going to go ahead and type in, for instance, n,
1534
01:13:25,781 --> 01:13:28,841
for number of times to meow, and just to make
1535
01:13:28,841 --> 01:13:31,206
this even more user friendly and self descriptive,
1536
01:13:31,206 --> 01:13:33,581
I'm going to add a label, which has no functional impact,
1537
01:13:33,581 --> 01:13:35,771
it's just an aesthetic, and I'm just going
1538
01:13:35,771 --> 01:13:38,441
to say Times, just to make it read more like English
1539
01:13:38,441 --> 01:13:40,901
in this case that tells me what the puzzle piece does.
1540
01:13:40,901 --> 01:13:42,381
Now I'm going to click OK.
1541
01:13:42,381 --> 01:13:44,901
And now I need to refine this a little bit.
1542
01:13:44,901 --> 01:13:51,181
Let me go ahead and grab under Control a repeat block,
1543
01:13:51,181 --> 01:13:54,881
let me move the Play, Sound, and Wait, into the repeat block.
1544
01:13:54,881 --> 01:13:57,421
I don't want 10 and I also don't want 3 here.
1545
01:13:57,421 --> 01:14:02,581
What I want now is this n that is my actual variable that Scratch
1546
01:14:02,581 --> 01:14:05,971
is creating for me that represents whatever input the human programmer
1547
01:14:05,971 --> 01:14:06,726
provides.
1548
01:14:06,726 --> 01:14:08,101
Notice that snaps right in place.
1549
01:14:08,101 --> 01:14:12,151
Let me connect this and now voila, I have an even fancier version of Meow
1550
01:14:12,151 --> 01:14:13,651
that is parameterized.
1551
01:14:13,651 --> 01:14:17,579
It takes input that affects its behavior accordingly.
1552
01:14:17,579 --> 01:14:20,371
Now I'm going to scroll back up, because out of sight, out of mind,
1553
01:14:20,371 --> 01:14:21,721
I just care that Meow exists.
1554
01:14:21,721 --> 01:14:25,261
Now I can tighten up my code, so to speak, use even fewer lines
1555
01:14:25,261 --> 01:14:28,441
to do the same thing by throwing away the Repeat block,
1556
01:14:28,441 --> 01:14:32,791
reconnecting this new puzzle piece here that takes an input like 3 and voila,
1557
01:14:32,791 --> 01:14:34,921
now we're really programming, right?
1558
01:14:34,921 --> 01:14:37,261
We've not made any forward progress functionally.
1559
01:14:37,261 --> 01:14:39,571
The thing just mouse three times.
1560
01:14:39,571 --> 01:14:41,761
But it's a better design.
1561
01:14:41,761 --> 01:14:44,071
As you program more and more, these are the kinds
1562
01:14:44,071 --> 01:14:46,561
of instincts still start to acquire so that one,
1563
01:14:46,561 --> 01:14:49,411
you can start to take a big assignment, a big problem set, something
1564
01:14:49,411 --> 01:14:53,071
for homework even, that feels kind of overwhelming at first, like, oh my God
1565
01:14:53,071 --> 01:14:54,241
where do I even begin?
1566
01:14:54,241 --> 01:14:58,141
But if you start to identify what are the subproblems of a bigger problem?
1567
01:14:58,141 --> 01:15:00,091
Then you can start making progress.
1568
01:15:00,091 --> 01:15:04,771
I do this to this day where if I have to tackle some programming-related project
1569
01:15:04,771 --> 01:15:08,821
it's so easy to drag my feet and ugh, it's going to take forever to start,
1570
01:15:08,821 --> 01:15:11,521
until I just start writing down like a to do list
1571
01:15:11,521 --> 01:15:14,191
and I start to modularize the program and say, all right, well
1572
01:15:14,191 --> 01:15:15,301
what do I want this thing to do?
1573
01:15:15,301 --> 01:15:15,751
Meowing.
1574
01:15:15,751 --> 01:15:16,381
What's that mean?
1575
01:15:16,381 --> 01:15:18,381
I've got to have it say something on the screen.
1576
01:15:18,381 --> 01:15:20,851
All right, I need to have it say something on the screen
1577
01:15:20,851 --> 01:15:21,781
some number of times.
1578
01:15:21,781 --> 01:15:25,121
Like literally a mental or written checklist, or pseudocode code,
1579
01:15:25,121 --> 01:15:28,321
if you will, in English on a piece of paper or text file,
1580
01:15:28,321 --> 01:15:30,511
and then you can decide, OK, the first thing I
1581
01:15:30,511 --> 01:15:33,491
need to do for homework to solve this real world problem,
1582
01:15:33,491 --> 01:15:34,861
I just need a Meow function.
1583
01:15:34,861 --> 01:15:36,961
I need to use a bunch of other code, too,
1584
01:15:36,961 --> 01:15:39,361
but I need to create a Meow function and boom,
1585
01:15:39,361 --> 01:15:43,141
now you have a piece of the problem solved not unlike we did with the phone
1586
01:15:43,141 --> 01:15:47,551
book there, but in this case, we'll have presumably other problems to solve.
1587
01:15:47,551 --> 01:15:49,211
All right, so what more can we do?
1588
01:15:49,211 --> 01:15:51,693
Let's add a few more pieces to the puzzle here.
1589
01:15:51,693 --> 01:15:53,401
Let's actually interact with the cat now.
1590
01:15:53,401 --> 01:15:56,731
Let me go ahead and now when the green flag is clicked, let me go ahead
1591
01:15:56,731 --> 01:15:59,521
and ask a question using an event here.
1592
01:15:59,521 --> 01:16:03,781
Let me go ahead and say, let's see, I want
1593
01:16:03,781 --> 01:16:07,031
to do something like implement the notion of petting the cat.
1594
01:16:07,031 --> 01:16:12,541
So if the cursor is touching the cat like here, something like this,
1595
01:16:12,541 --> 01:16:15,173
it'd be cute if the cat meows like you're petting a cat.
1596
01:16:15,173 --> 01:16:17,881
So I'm going to ask the question, when the green flag is clicked,
1597
01:16:17,881 --> 01:16:21,071
if let's see I think I need Sensing.
1598
01:16:21,071 --> 01:16:23,461
So if touching mouse pointer, this is way too big
1599
01:16:23,461 --> 01:16:25,591
but again the shape is fine, so there goes.
1600
01:16:25,591 --> 01:16:26,431
Grew to fill.
1601
01:16:26,431 --> 01:16:28,981
And then if it's touching the mouse pointer,
1602
01:16:28,981 --> 01:16:32,461
that is if the cat to whom this script or this program,
1603
01:16:32,461 --> 01:16:35,731
any time I attach puzzle pieces MIT calls them a script
1604
01:16:35,731 --> 01:16:39,931
or like a program, if you will, let me go ahead then and choose a sound
1605
01:16:39,931 --> 01:16:42,919
and say play sound meow until done.
1606
01:16:42,919 --> 01:16:44,461
All right, so here it is to be clear.
1607
01:16:44,461 --> 01:16:46,591
When the green flag is clicked, ask the question,
1608
01:16:46,591 --> 01:16:50,881
if the cat is touching the mouse pointer then place sound meow.
1609
01:16:50,881 --> 01:16:51,421
Here we go.
1610
01:16:51,421 --> 01:16:53,434
Play.
1611
01:16:53,434 --> 01:16:56,191
[SILENCE]
1612
01:16:56,191 --> 01:16:58,051
All right, let's try again.
1613
01:16:58,051 --> 01:16:58,741
Play.
1614
01:16:58,741 --> 01:17:01,071
[SILENCE]
1615
01:17:01,071 --> 01:17:02,281
Huh.
1616
01:17:02,281 --> 01:17:07,051
I'm worried it's not Scratch's fault. Feels like mine.
1617
01:17:07,051 --> 01:17:10,251
What's the bug here?
1618
01:17:10,251 --> 01:17:12,081
Why doesn't this work?
1619
01:17:12,081 --> 01:17:14,931
Yeah, in back, who just turned.
1620
01:17:14,931 --> 01:17:18,787
AUDIENCE: [INAUDIBLE]
1621
01:17:20,636 --> 01:17:23,511
DAVID MALAN: Yeah, the problem is the moment I click that green flag,
1622
01:17:23,511 --> 01:17:26,961
Scratch asks the question, is the cat touching the mouse pointer?
1623
01:17:26,961 --> 01:17:29,961
And obviously it's not because the cursor was like up there a moment ago
1624
01:17:29,961 --> 01:17:31,131
and it's not down there.
1625
01:17:31,131 --> 01:17:34,071
It's fine if I move the cursor down there, but too late.
1626
01:17:34,071 --> 01:17:35,841
The program already asked the question.
1627
01:17:35,841 --> 01:17:39,511
The answer was no or false or zero, however you want to think about it,
1628
01:17:39,511 --> 01:17:40,891
so no sound was played.
1629
01:17:40,891 --> 01:17:43,041
So what might be the solution here be?
1630
01:17:43,041 --> 01:17:45,591
I could move my cursor quickly, but that feels
1631
01:17:45,591 --> 01:17:47,601
like never going to work out right.
1632
01:17:47,601 --> 01:17:49,641
Other solutions here?
1633
01:17:49,641 --> 01:17:50,751
Yeah, in way back?
1634
01:17:50,751 --> 01:17:53,221
Could you use the forever loop?
1635
01:17:53,221 --> 01:17:54,041
The Forever loop.
1636
01:17:54,041 --> 01:17:57,301
So I could indeed use this Forever loop because if I want my program
1637
01:17:57,301 --> 01:18:00,781
to just constantly listen to me, well let's literally do something forever,
1638
01:18:00,781 --> 01:18:02,851
or at least forever as long as the program is
1639
01:18:02,851 --> 01:18:05,018
running until I explicitly hit Stop.
1640
01:18:05,018 --> 01:18:05,851
So let me grab that.
1641
01:18:05,851 --> 01:18:09,181
Let me go to Control, let me grab the Forever block,
1642
01:18:09,181 --> 01:18:12,961
let me move the If inside of this Forever block, reconnect this,
1643
01:18:12,961 --> 01:18:16,651
go back up here, click the green flag, and now nothing's happened yet,
1644
01:18:16,651 --> 01:18:18,421
but let me try moving my cursor now.
1645
01:18:18,421 --> 01:18:19,921
[MEOW]
1646
01:18:19,921 --> 01:18:20,521
Oh.
1647
01:18:20,521 --> 01:18:21,421
So now.
1648
01:18:21,421 --> 01:18:22,021
[MEOW]
1649
01:18:22,021 --> 01:18:23,081
That's kind of cute.
1650
01:18:23,081 --> 01:18:24,998
So now the cat is actually responding and it's
1651
01:18:24,998 --> 01:18:27,541
going to keep doing this again and again.
1652
01:18:27,541 --> 01:18:31,351
So now we have this idea of taking these different ideas, these different puzzle
1653
01:18:31,351 --> 01:18:34,201
pieces, assembling them into something more complicated.
1654
01:18:34,201 --> 01:18:36,321
I could definitely put a name to this.
1655
01:18:36,321 --> 01:18:38,071
I could create a custom block, but for now
1656
01:18:38,071 --> 01:18:40,774
let's just consider what kind of more interactivity we can do.
1657
01:18:40,774 --> 01:18:41,941
Let me go ahead and do this.
1658
01:18:41,941 --> 01:18:45,631
By again grabbing a, when green flag clicked,
1659
01:18:45,631 --> 01:18:48,704
let me go ahead and click the video sensing,
1660
01:18:48,704 --> 01:18:51,121
and I'm going to rotate the laptop because otherwise we're
1661
01:18:51,121 --> 01:18:54,163
going to get a little inception thing here where the camera is picking up
1662
01:18:54,163 --> 01:18:55,171
the camera is up there.
1663
01:18:55,171 --> 01:18:58,681
So I'm going to go reveal to you what's inside the lectern
1664
01:18:58,681 --> 01:19:02,611
here while we rotate this.
1665
01:19:02,611 --> 01:19:07,681
Now that we have a non video backdrop, I'm going to say this.
1666
01:19:07,681 --> 01:19:09,811
Instead of the green flag clicked, actually, I'm
1667
01:19:09,811 --> 01:19:13,471
going to say when the video motion is greater than some arbitrary
1668
01:19:13,471 --> 01:19:19,933
measurement of motion, I'm going to go ahead and play sound meow until done.
1669
01:19:19,933 --> 01:19:21,641
And then I'm going to get out of the way.
1670
01:19:21,641 --> 01:19:23,211
So here's the cat.
1671
01:19:23,211 --> 01:19:26,041
We'll put them on top of there.
1672
01:19:26,041 --> 01:19:27,171
[MEOW]
1673
01:19:27,171 --> 01:19:28,491
OK.
1674
01:19:28,491 --> 01:19:30,159
All right, and here we go.
1675
01:19:30,159 --> 01:19:33,151
[MEOW]
1676
01:19:33,151 --> 01:19:35,871
So my hand is moving faster than 50 something or other,
1677
01:19:35,871 --> 01:19:37,721
whatever the unit of measure is.
1678
01:19:37,721 --> 01:19:39,039
[MEOW]
1679
01:19:39,039 --> 01:19:39,581
AUDIENCE: Aw.
1680
01:19:39,581 --> 01:19:40,998
DAVID MALAN: (LAUGHING) Thank you.
1681
01:19:40,998 --> 01:19:43,661
So now we have an even more interactive version.
1682
01:19:43,661 --> 01:19:44,781
[MEOW]
1683
01:19:44,781 --> 01:19:48,421
But I think if I sort of slowly.
1684
01:19:48,421 --> 01:19:50,461
[LAUGHING]
1685
01:19:50,461 --> 01:19:51,481
(LAUGHING) Right?
1686
01:19:51,481 --> 01:19:56,271
It's completely creepy, but I'm not like exceeding the threshold--
1687
01:19:56,271 --> 01:19:57,061
[MEOW]
1688
01:19:57,061 --> 01:19:59,861
Until finally my hand moves as fast as that.
1689
01:19:59,861 --> 01:20:02,041
And so here actually is an opportunity to show you
1690
01:20:02,041 --> 01:20:03,961
something a former student did.
1691
01:20:03,961 --> 01:20:05,231
Let me go ahead here and--
1692
01:20:05,231 --> 01:20:05,731
[MEOW TWICE]
1693
01:20:05,731 --> 01:20:08,201
OK, got to stop this.
1694
01:20:08,201 --> 01:20:11,091
Let me go ahead and zoom out of this in just a moment.
1695
01:20:11,091 --> 01:20:11,591
[MEOW]
1696
01:20:11,591 --> 01:20:12,631
If someone would be--
1697
01:20:12,631 --> 01:20:13,311
[LAUGHING]
1698
01:20:13,311 --> 01:20:15,061
(LAUGHING) If someone would be comfortable
1699
01:20:15,061 --> 01:20:17,571
coming up not only masked but also on camera on the internet
1700
01:20:17,571 --> 01:20:21,451
I thought we'd play one of your former classmate's projects here up on stage.
1701
01:20:21,451 --> 01:20:24,101
Would anyone like to volunteer here and be up on stage?
1702
01:20:24,101 --> 01:20:24,601
Who's that?
1703
01:20:24,601 --> 01:20:25,101
Yeah.
1704
01:20:25,101 --> 01:20:25,651
Come on down.
1705
01:20:25,651 --> 01:20:26,401
What's your name?
1706
01:20:26,401 --> 01:20:27,361
AUDIENCE: Sahar.
1707
01:20:27,361 --> 01:20:28,201
DAVID MALAN: Sahar.
1708
01:20:28,201 --> 01:20:29,711
All right, come on down.
1709
01:20:29,711 --> 01:20:31,681
Let me get it set up for you here.
1710
01:20:31,681 --> 01:20:32,653
[MEOW]
1711
01:20:32,653 --> 01:20:37,999
[APPLAUSE]
1712
01:20:37,999 --> 01:20:42,881
[MEOW]
1713
01:20:42,881 --> 01:20:45,941
All right, let me go ahead and full screen this here.
1714
01:20:45,941 --> 01:20:50,341
So this is whack-a-mole by one of your firmer predecessors.
1715
01:20:50,341 --> 01:20:53,371
It's going to use the camera focusing on your head, which will have
1716
01:20:53,371 --> 01:20:55,028
to position inside of this rectangle.
1717
01:20:55,028 --> 01:20:57,361
Have you ever played the whack-a-mole game at an arcade?
1718
01:20:57,361 --> 01:20:57,931
AUDIENCE: Yeah.
1719
01:20:57,931 --> 01:20:58,171
DAVID MALAN: OK.
1720
01:20:58,171 --> 01:21:00,318
So for those who haven't, these little moles pop up
1721
01:21:00,318 --> 01:21:02,401
and with a very fuzzy hammer you sort of hit down.
1722
01:21:02,401 --> 01:21:04,193
You though, if you don't mind, you're going
1723
01:21:04,193 --> 01:21:06,821
to use your head to do this virtually.
1724
01:21:06,821 --> 01:21:11,821
So let's line up your head with this red rectangle, if you could,
1725
01:21:11,821 --> 01:21:12,721
we'll do beginner.
1726
01:21:12,721 --> 01:21:14,251
[MUSIC PLAYING]
1727
01:21:14,251 --> 01:21:15,461
All right, here we go.
1728
01:21:15,461 --> 01:21:17,221
Sahar.
1729
01:21:17,221 --> 01:21:18,691
Give it a moment.
1730
01:21:18,691 --> 01:21:19,921
OK, come a little closer.
1731
01:21:19,921 --> 01:21:20,911
[DINGING]
1732
01:21:20,911 --> 01:21:23,101
And now hit the moles with your head.
1733
01:21:23,101 --> 01:21:24,541
[DING]
1734
01:21:24,541 --> 01:21:25,826
There we go, one point.
1735
01:21:25,826 --> 01:21:26,326
[DING]
1736
01:21:26,326 --> 01:21:28,813
One point.
1737
01:21:28,813 --> 01:21:30,711
[DINGING]
1738
01:21:30,711 --> 01:21:32,721
Nice.
1739
01:21:32,721 --> 01:21:33,801
15 seconds to go.
1740
01:21:33,801 --> 01:21:34,411
There we go.
1741
01:21:34,411 --> 01:21:34,911
Oh yeah.
1742
01:21:34,911 --> 01:21:36,911
One point.
1743
01:21:36,911 --> 01:21:38,911
[LAUGHING]
1744
01:21:38,911 --> 01:21:40,396
[DINGING]
1745
01:21:40,396 --> 01:21:42,171
Six seconds.
1746
01:21:42,171 --> 01:21:43,619
AUDIENCE: Oh no.
1747
01:21:43,619 --> 01:21:44,661
DAVID MALAN: There we go.
1748
01:21:44,661 --> 01:21:45,381
Quick!
1749
01:21:45,381 --> 01:21:47,631
[DINGING]
1750
01:21:47,631 --> 01:21:49,551
All right, a round of applause for Sahar.
1751
01:21:49,551 --> 01:21:50,828
Thank you.
1752
01:21:50,828 --> 01:21:54,804
[APPLAUSE]
1753
01:21:57,301 --> 01:21:59,433
So beyond having a little bit of fun here,
1754
01:21:59,433 --> 01:22:01,141
the goal was to demonstrate that by using
1755
01:22:01,141 --> 01:22:04,591
some fairly simple, primitive, some basic building blocks
1756
01:22:04,591 --> 01:22:06,961
but assembling them in a fun way with some music, maybe
1757
01:22:06,961 --> 01:22:10,481
some new costumes or artwork, you can really bring programs to life.
1758
01:22:10,481 --> 01:22:13,541
But at the end of the day, the only puzzle pieces really involved
1759
01:22:13,541 --> 01:22:16,291
were ones like the ones I just dragged and dropped and a few more,
1760
01:22:16,291 --> 01:22:18,011
because there were clearly lots of moles.
1761
01:22:18,011 --> 01:22:21,991
So the student probably created a few different sprites, not a single cap,
1762
01:22:21,991 --> 01:22:23,408
but at least four different moles.
1763
01:22:23,408 --> 01:22:26,158
They had like some kind of graphic on the screen that showed Sahar
1764
01:22:26,158 --> 01:22:27,301
where to position her head.
1765
01:22:27,301 --> 01:22:29,791
There were some kind of timer, maybe a variable
1766
01:22:29,791 --> 01:22:32,376
that every second was counting down.
1767
01:22:32,376 --> 01:22:35,251
So you can imagine taking what looks like a pretty impressive project
1768
01:22:35,251 --> 01:22:37,261
at first glance, and perhaps overwhelming
1769
01:22:37,261 --> 01:22:40,681
to solve yourself, but just think about what are the basic building blocks?
1770
01:22:40,681 --> 01:22:45,061
And pluck off one piece of the puzzle, so to speak, at a time.
1771
01:22:45,061 --> 01:22:47,801
So indeed if we rewind a little bit.
1772
01:22:47,801 --> 01:22:50,581
Let me go ahead here and introduce a program
1773
01:22:50,581 --> 01:22:53,221
that I myself made back in graduate school
1774
01:22:53,221 --> 01:22:55,781
when Scratch was first being developed by MIT.
1775
01:22:55,781 --> 01:22:59,101
Let me go ahead and open here, give me just one second,
1776
01:22:59,101 --> 01:23:03,331
something that I called back in the day Oscar Time that
1777
01:23:03,331 --> 01:23:05,461
looks a little something like this.
1778
01:23:05,461 --> 01:23:07,291
If I fullscreen it and hit Play.
1779
01:23:07,291 --> 01:23:10,866
[MUSIC - SESAME STREET, "I LOVE TRASH"]
1780
01:23:10,866 --> 01:23:12,741
OSCAR THE GROUCH: (SINGING) Oh, I love trash.
1781
01:23:12,741 --> 01:23:15,158
DAVID MALAN: So you'll notice a piece of trash is falling.
1782
01:23:15,158 --> 01:23:18,631
I can click on it and drag and as I get close and close to the trash can notice
1783
01:23:18,631 --> 01:23:20,631
OSCAR THE GROUCH: (SINGING) Anything ragged or--
1784
01:23:20,631 --> 01:23:22,521
DAVID MALAN: It wants to go in, it seems.
1785
01:23:22,521 --> 01:23:23,601
And if I let go--
1786
01:23:23,601 --> 01:23:25,101
OSCAR THE GROUCH: (SINGING) Yes, I--
1787
01:23:25,101 --> 01:23:26,844
DAVID MALAN: One point.
1788
01:23:26,844 --> 01:23:27,636
Here comes another.
1789
01:23:27,636 --> 01:23:29,301
OSCAR THE GROUCH: (SINGING) If you really want to see something trashy--
1790
01:23:29,301 --> 01:23:30,441
DAVID MALAN: I'll do the same, two points.
1791
01:23:30,441 --> 01:23:32,841
OSCAR THE GROUCH: (SINGING) I have here a sneaker that's tattered and worn--
1792
01:23:32,841 --> 01:23:34,521
DAVID MALAN: There's a sneaker falling from the sky,
1793
01:23:34,521 --> 01:23:35,989
so another sprite of some sort.
1794
01:23:35,989 --> 01:23:37,947
OSCAR THE GROUCH: (SINGING) The laces are torn.
1795
01:23:37,947 --> 01:23:39,771
A gift from my mother--
1796
01:23:39,771 --> 01:23:41,991
DAVID MALAN: I can also get just a little lazy
1797
01:23:41,991 --> 01:23:45,934
and just let them fall into the trash themself if I want to.
1798
01:23:45,934 --> 01:23:48,351
So you can see it doesn't have to do with my mouse cursor,
1799
01:23:48,351 --> 01:23:50,971
it has to do apparently with the distance here.
1800
01:23:50,971 --> 01:23:52,431
Let's listen a little further.
1801
01:23:52,431 --> 01:23:56,001
I think some additional trash is about to make its appearance.
1802
01:23:56,001 --> 01:23:59,571
Presumably there's some kind of variable that's keeping track of this score.
1803
01:23:59,571 --> 01:24:01,071
OSCAR THE GROUCH: (SINGING) I love--
1804
01:24:01,071 --> 01:24:03,404
DAVID MALAN: OK, let's see what the last chorus here is.
1805
01:24:03,404 --> 01:24:05,421
OSCAR THE GROUCH: (SINGING) Rotten stuff.
1806
01:24:05,421 --> 01:24:08,511
I have here some newspaper, crusty and
1807
01:24:08,511 --> 01:24:10,491
DAVID MALAN: OK, and thus he continues.
1808
01:24:10,491 --> 01:24:13,401
And the song actually goes on and on and on
1809
01:24:13,401 --> 01:24:16,071
and I do not have fond memories of implementing this and hearing
1810
01:24:16,071 --> 01:24:19,101
this song for like 10 straight hours, but it's
1811
01:24:19,101 --> 01:24:22,756
a good example to just consider how was this program composed?
1812
01:24:22,756 --> 01:24:25,131
How did I go about implementing it the first time around?
1813
01:24:25,131 --> 01:24:27,456
And let me go ahead and open up some programs now
1814
01:24:27,456 --> 01:24:29,331
that I wrote in advance just so that we could
1815
01:24:29,331 --> 01:24:31,611
see how these things are assembled.
1816
01:24:31,611 --> 01:24:35,031
Honestly, the first thing I probably did was probably
1817
01:24:35,031 --> 01:24:37,431
to do something a little like this.
1818
01:24:37,431 --> 01:24:39,861
Here is just a version of the program where
1819
01:24:39,861 --> 01:24:42,561
I set out to solve just one problem first
1820
01:24:42,561 --> 01:24:44,821
of planting a lamp post in the program.
1821
01:24:44,821 --> 01:24:45,321
Right?
1822
01:24:45,321 --> 01:24:47,091
I kind of had a vision of what I wanted.
1823
01:24:47,091 --> 01:24:48,681
You know, it evolved over time, certainly,
1824
01:24:48,681 --> 01:24:50,121
but I knew I wanted trash to fall, I wanted
1825
01:24:50,121 --> 01:24:51,829
a cute little Oscar the Grouch to pop out
1826
01:24:51,829 --> 01:24:54,741
of the trashcan, and some other stuff, but wow that's a lot
1827
01:24:54,741 --> 01:24:56,391
to just tackle all at once.
1828
01:24:56,391 --> 01:24:59,271
I'm going to start easy, download a picture of a lamp post,
1829
01:24:59,271 --> 01:25:03,651
and then drag and drop it into the stage as a costume and boom, that's
1830
01:25:03,651 --> 01:25:04,671
version one.
1831
01:25:04,671 --> 01:25:06,441
It doesn't functionally do anything.
1832
01:25:06,441 --> 01:25:09,531
I mean, literally that's the code that I wrote to do this.
1833
01:25:09,531 --> 01:25:11,691
All I did was use like the Backdrops feature
1834
01:25:11,691 --> 01:25:13,741
and drag and drop and move things around,
1835
01:25:13,741 --> 01:25:16,881
but it got me to version one of my program.
1836
01:25:16,881 --> 01:25:18,711
Then what might version two be?
1837
01:25:18,711 --> 01:25:21,291
Well I considered what piece of functionality
1838
01:25:21,291 --> 01:25:24,783
frankly might be the easiest to pluck off next and the trash can.
1839
01:25:24,783 --> 01:25:26,991
That seems like a pretty core piece of functionality.
1840
01:25:26,991 --> 01:25:29,251
It just needs to sit there most of the time.
1841
01:25:29,251 --> 01:25:32,631
So the next thing I probably did was to open up,
1842
01:25:32,631 --> 01:25:38,301
for instance, the trash can version here that looks a little something now
1843
01:25:38,301 --> 01:25:38,814
like this.
1844
01:25:38,814 --> 01:25:40,731
So this time I'll show you what's inside here.
1845
01:25:40,731 --> 01:25:43,101
There is some code, but not much.
1846
01:25:43,101 --> 01:25:47,121
Notice at bottom right I change the default cat to a picture of a trashcan,
1847
01:25:47,121 --> 01:25:50,151
instead, but it's the same principle that I can control.
1848
01:25:50,151 --> 01:25:52,821
And then over here I added this code.
1849
01:25:52,821 --> 01:25:55,731
When the green flag is clicked, switch the costume
1850
01:25:55,731 --> 01:25:57,811
to something I arbitrarily called Oscar 1.
1851
01:25:57,811 --> 01:25:59,571
So I found a couple of different pictures
1852
01:25:59,571 --> 01:26:02,691
of a trash can, one that looks closed, one that looks partly open,
1853
01:26:02,691 --> 01:26:04,851
and eventually one that has Oscar coming out,
1854
01:26:04,851 --> 01:26:06,511
and I just gave them different names.
1855
01:26:06,511 --> 01:26:09,681
So I said Switch to Oscar 1, which is the closed one by default,
1856
01:26:09,681 --> 01:26:13,491
then forever do the following: if touching the mouse pointer,
1857
01:26:13,491 --> 01:26:18,411
then switch the costume to Oscar 2, else switch to Oscar 1.
1858
01:26:18,411 --> 01:26:22,011
That is to say, I just wanted to implement this idea of the can opening
1859
01:26:22,011 --> 01:26:24,831
and closing, even if it's not exactly what I wanted ultimately,
1860
01:26:24,831 --> 01:26:26,881
I just wanted to make some forward progress.
1861
01:26:26,881 --> 01:26:32,641
So here, when I run this program by clicking Play, notice what happens.
1862
01:26:32,641 --> 01:26:36,141
Nothing yet, but if I get closer to the trash can,
1863
01:26:36,141 --> 01:26:40,011
it indeed pops open because it's forever listening
1864
01:26:40,011 --> 01:26:43,201
for whether the sprite, the trash can in this case,
1865
01:26:43,201 --> 01:26:44,451
is touching the mouse pointer.
1866
01:26:44,451 --> 01:26:45,141
And that's it.
1867
01:26:45,141 --> 01:26:48,201
That was version 2, if you will.
1868
01:26:48,201 --> 01:26:51,351
If I went in now and added the lamp post and compose the program together,
1869
01:26:51,351 --> 01:26:52,851
now we're starting to make progress.
1870
01:26:52,851 --> 01:26:53,061
Right?
1871
01:26:53,061 --> 01:26:55,641
Now it would look a little something more like the program
1872
01:26:55,641 --> 01:26:57,831
I intended ultimately to create.
1873
01:26:57,831 --> 01:27:00,661
What piece did I probably bite off after that?
1874
01:27:00,661 --> 01:27:02,931
Well, I think what I did is I probably decided
1875
01:27:02,931 --> 01:27:06,441
let me implement one of the pieces of trash, not the shoe in the newspaper
1876
01:27:06,441 --> 01:27:07,051
all at once.
1877
01:27:07,051 --> 01:27:10,581
Let's just get one piece of trash working correctly first.
1878
01:27:10,581 --> 01:27:12,981
So let me go ahead and open this one.
1879
01:27:12,981 --> 01:27:16,551
And again, all of these examples will be available on the course's website
1880
01:27:16,551 --> 01:27:18,741
so you can see all of these examples, too.
1881
01:27:18,741 --> 01:27:21,141
It's not terribly long, I just implement it in advance
1882
01:27:21,141 --> 01:27:23,511
so we could flip through kind of quickly.
1883
01:27:23,511 --> 01:27:25,041
Here's what I did here.
1884
01:27:25,041 --> 01:27:28,851
On the right hand side, I turned my sprite into a piece of trash
1885
01:27:28,851 --> 01:27:31,471
this time instead of a cat, instead of a trash can,
1886
01:27:31,471 --> 01:27:36,831
and I also created, with Carter's help, a second sprite, this one a floor.
1887
01:27:36,831 --> 01:27:39,891
It's literally just a black line because I just wanted initially
1888
01:27:39,891 --> 01:27:42,321
to have some notion of a floor so I could detect
1889
01:27:42,321 --> 01:27:44,841
if the trash is touching the floor.
1890
01:27:44,841 --> 01:27:48,111
Now without seeing the code yet, just hearing that description,
1891
01:27:48,111 --> 01:27:53,001
why might I have wanted the second sprite and this black line for a floor
1892
01:27:53,001 --> 01:27:55,448
with the trash intending to fall from the sky?
1893
01:27:55,448 --> 01:27:56,781
What might I have been thinking?
1894
01:27:56,781 --> 01:27:58,741
Like what problem might I be trying to solve?
1895
01:27:58,741 --> 01:27:58,971
Yeah?
1896
01:27:58,971 --> 01:28:01,431
AUDIENCE: You don't want the first sprite to go through it.
1897
01:28:01,431 --> 01:28:04,389
DAVID MALAN: Yeah, you don't want the first sprite to start at the top,
1898
01:28:04,389 --> 01:28:06,981
go through, and then boom, you completely lose it.
1899
01:28:06,981 --> 01:28:09,633
That would not be a very useful thing.
1900
01:28:09,633 --> 01:28:12,591
Or it would seem to maybe eat up more and more of the computer's memory
1901
01:28:12,591 --> 01:28:15,261
if the trash is just endlessly falling and I can't grab it.
1902
01:28:15,261 --> 01:28:17,031
It might be a little traumatic if you tried to get it
1903
01:28:17,031 --> 01:28:19,573
and you can't pull it back out and you can't fix the program.
1904
01:28:19,573 --> 01:28:21,249
So I just wanted the thing to stop.
1905
01:28:21,249 --> 01:28:22,791
So how might I have implemented this?
1906
01:28:22,791 --> 01:28:24,441
Let's look at the code at left.
1907
01:28:24,441 --> 01:28:29,061
Here I have a bit of randomness, like I proposed earlier exists.
1908
01:28:29,061 --> 01:28:31,941
There's this blue function called Go To x,
1909
01:28:31,941 --> 01:28:35,751
y that lets me move a sprite to any position,
1910
01:28:35,751 --> 01:28:40,431
up, down, left, right, I picked a random x location, either here or over here,
1911
01:28:40,431 --> 01:28:45,171
negative 240 to positive 240, and then a y value of 180, which is the top.
1912
01:28:45,171 --> 01:28:46,921
This just makes the game more interesting.
1913
01:28:46,921 --> 01:28:51,111
It's kind of lame pretty quickly if the trash always falls from the same spot.
1914
01:28:51,111 --> 01:28:54,351
Here's this a little bit of randomness, like most any game would have,
1915
01:28:54,351 --> 01:28:55,821
that spices things up.
1916
01:28:55,821 --> 01:28:59,394
So now if I click the green flag, you'll see that it just falls,
1917
01:28:59,394 --> 01:29:01,311
nothing interesting is going to happen, but it
1918
01:29:01,311 --> 01:29:05,751
does stop when it touches the black line because notice what we did here.
1919
01:29:05,751 --> 01:29:10,521
I'm forever asking the question if the distance of the sprite, the trash,
1920
01:29:10,521 --> 01:29:14,251
is to the floor is greater than zero, that's fine.
1921
01:29:14,251 --> 01:29:17,061
Change the y location by negative 3.
1922
01:29:17,061 --> 01:29:21,561
So move it down 3 pixels, down 3 pixels, until the distance to the floor
1923
01:29:21,561 --> 01:29:25,401
is not greater than zero, it is zero or even negative, at which point
1924
01:29:25,401 --> 01:29:27,128
it should just stop moving altogether.
1925
01:29:27,128 --> 01:29:29,211
There's other ways we could have implemented this,
1926
01:29:29,211 --> 01:29:31,431
but this felt like a nice, clean way that logically, just
1927
01:29:31,431 --> 01:29:32,223
made it make sense.
1928
01:29:32,223 --> 01:29:36,411
OK, now I got some trash falling, I got a trash can that opens and closes,
1929
01:29:36,411 --> 01:29:40,911
I have a lamp post, now I'm a good three steps into the program.
1930
01:29:40,911 --> 01:29:42,111
We're making progress.
1931
01:29:42,111 --> 01:29:45,111
If we consider one or two final pieces, something
1932
01:29:45,111 --> 01:29:50,271
like the dragging of the trash, let me go ahead and open up this version 2.
1933
01:29:50,271 --> 01:29:53,871
Dragging the trash requires a different type of question.
1934
01:29:53,871 --> 01:29:55,071
Let me zoom in here.
1935
01:29:55,071 --> 01:29:56,821
Here's the piece of trash.
1936
01:29:56,821 --> 01:29:59,601
I only need one sprite, no floor here because I just
1937
01:29:59,601 --> 01:30:02,421
want the human to move it up, down, left, right and the human's
1938
01:30:02,421 --> 01:30:05,451
not going to physically be able to move it outside of the world.
1939
01:30:05,451 --> 01:30:09,181
If we zoom in on this code, the way we've solved this is as follows.
1940
01:30:09,181 --> 01:30:13,371
We're using that And conjunction that we glimpsed earlier because when
1941
01:30:13,371 --> 01:30:17,001
the green flag is clicked, we're forever asking this question or really
1942
01:30:17,001 --> 01:30:20,271
these questions, plural, if the mouse is down
1943
01:30:20,271 --> 01:30:25,911
and the trash is touching the mouse pointer, that's equivalent
1944
01:30:25,911 --> 01:30:28,221
logically to clicking on the trash.
1945
01:30:28,221 --> 01:30:31,531
Go ahead and move the trash to the mouse pointer.
1946
01:30:31,531 --> 01:30:33,591
So again it takes this very familiar idea
1947
01:30:33,591 --> 01:30:36,711
that you and I take for granted every day on Macs and PCs of clicking
1948
01:30:36,711 --> 01:30:37,971
and dragging and dropping.
1949
01:30:37,971 --> 01:30:39,321
How is that implemented?
1950
01:30:39,321 --> 01:30:43,521
Well Mac OS or Windows are probably asking a question.
1951
01:30:43,521 --> 01:30:48,021
For every icon, is the mouse down and is the icon touching the mouse?
1952
01:30:48,021 --> 01:30:52,161
If so, go to the location of the mouse forever
1953
01:30:52,161 --> 01:30:54,261
while the mouse button is clicked down.
1954
01:30:54,261 --> 01:30:56,421
So how does this work in reality now?
1955
01:30:56,421 --> 01:30:58,671
Let me go ahead and click on the Play.
1956
01:30:58,671 --> 01:31:02,731
Nothing happens at first, but if I click on it, I can move it up,
1957
01:31:02,731 --> 01:31:04,071
down, left, right.
1958
01:31:04,071 --> 01:31:05,821
It doesn't move thereafter.
1959
01:31:05,821 --> 01:31:09,571
So I now need to kind of combine this idea of dragging with falling,
1960
01:31:09,571 --> 01:31:12,304
but I bet I could just start to use just one single program.
1961
01:31:12,304 --> 01:31:14,721
Right now I'm using separate ones to show different ideas,
1962
01:31:14,721 --> 01:31:17,871
but now that's another bite out of the problem.
1963
01:31:17,871 --> 01:31:20,728
If we do one last one, something like the scorekeeping
1964
01:31:20,728 --> 01:31:23,811
is interesting, because recall that every time we dragged a piece of trash
1965
01:31:23,811 --> 01:31:27,361
into the can, Oscar popped out and told us the current score.
1966
01:31:27,361 --> 01:31:31,941
So let me go ahead and find this one, Oscar variables,
1967
01:31:31,941 --> 01:31:33,921
and let me zoom in on this one.
1968
01:31:33,921 --> 01:31:37,124
This one is longer because we combined all of these elements.
1969
01:31:37,124 --> 01:31:40,041
So this is the kind of thing that if you looked at first glance, like,
1970
01:31:40,041 --> 01:31:42,561
I have no idea how I would have implemented this
1971
01:31:42,561 --> 01:31:44,841
from nothing, from scratch literally.
1972
01:31:44,841 --> 01:31:49,191
But again, if you take your vision and componenitize it
1973
01:31:49,191 --> 01:31:51,291
into these smaller, bite-sized problems, you
1974
01:31:51,291 --> 01:31:53,721
could take these baby steps, so to speak, and then
1975
01:31:53,721 --> 01:31:55,291
solve everything collectively.
1976
01:31:55,291 --> 01:31:58,461
So what's new here is this bottom one.
1977
01:31:58,461 --> 01:32:03,111
Forever do the following: if the trash is touching
1978
01:32:03,111 --> 01:32:06,561
Oscar, the other sprite that we've now added to the program,
1979
01:32:06,561 --> 01:32:08,541
change the score by 1.
1980
01:32:08,541 --> 01:32:10,551
This is an orange and indeed if we poke around
1981
01:32:10,551 --> 01:32:15,111
we'll see that orange is a variable, like an x or y but with a better name,
1982
01:32:15,111 --> 01:32:19,101
changing it means to add 1 or if it's negative subtract 1.
1983
01:32:19,101 --> 01:32:24,171
Then go ahead and have the trash go to pick random.
1984
01:32:24,171 --> 01:32:25,791
What is this all about?
1985
01:32:25,791 --> 01:32:29,641
Well, let me show you what it's doing and then we can infer backwards.
1986
01:32:29,641 --> 01:32:31,041
Let me go ahead and hit Play.
1987
01:32:31,041 --> 01:32:34,191
All right, it's falling, I'm clicking and dragging it, I'm moving it over,
1988
01:32:34,191 --> 01:32:35,474
and I'm letting go.
1989
01:32:35,474 --> 01:32:36,891
All right, let me do it once more.
1990
01:32:36,891 --> 01:32:39,531
Letting go, let me stop.
1991
01:32:39,531 --> 01:32:46,071
Why do I have this function at the end called Go To x and y randomly?
1992
01:32:46,071 --> 01:32:48,741
Like what problem is this solving here?
1993
01:32:48,741 --> 01:32:50,833
Yeah, in way back.
1994
01:32:50,833 --> 01:32:54,270
AUDIENCE: Just the same track teleported to the top
1995
01:32:54,270 --> 01:32:56,086
after you put it in the trash can.
1996
01:32:56,086 --> 01:32:57,211
DAVID MALAN: Yeah, exactly.
1997
01:32:57,211 --> 01:33:00,003
Even though the human perceives this as like a lot of trash falling
1998
01:33:00,003 --> 01:33:01,971
from the sky, it's actually the same piece
1999
01:33:01,971 --> 01:33:04,851
of trash, just kind of being magically moved back to the top
2000
01:33:04,851 --> 01:33:06,351
as though it's a new one.
2001
01:33:06,351 --> 01:33:09,231
There, too, you have this idea of reusable code.
2002
01:33:09,231 --> 01:33:12,861
If you were constantly copying and pasting your pieces of trash
2003
01:33:12,861 --> 01:33:15,891
and creating 20 pieces of trash, 30 pieces of trash, just because you
2004
01:33:15,891 --> 01:33:19,521
want the game to have that many levels, probably doing something wrong.
2005
01:33:19,521 --> 01:33:22,611
Reuse the code that you wrote, reuse the sprites that you wrote,
2006
01:33:22,611 --> 01:33:27,381
and that would give you not just correctness, but also a better design.
2007
01:33:27,381 --> 01:33:30,366
Well let's take a look at one final set of building blocks
2008
01:33:30,366 --> 01:33:32,241
that we can compose ultimately into something
2009
01:33:32,241 --> 01:33:34,711
particularly interactive as follows.
2010
01:33:34,711 --> 01:33:36,621
Let me go ahead and zoom out here and let
2011
01:33:36,621 --> 01:33:41,271
me propose that we implement something like some kind of maze-based game.
2012
01:33:41,271 --> 01:33:42,691
Let me go ahead here.
2013
01:33:42,691 --> 01:33:46,011
So I want to implement some maze-based game that
2014
01:33:46,011 --> 01:33:47,761
looks at first glance like this.
2015
01:33:47,761 --> 01:33:48,436
Let me hit Play.
2016
01:33:48,436 --> 01:33:50,811
It's not a very fun game yet, but here's a little Harvard
2017
01:33:50,811 --> 01:33:54,891
shield, a couple of black lines, this time vertical instead of horizontal,
2018
01:33:54,891 --> 01:33:56,931
but notice you can't quite see my hand here,
2019
01:33:56,931 --> 01:34:01,649
but I'm using my arrow keys to go down, to go up, to go left, to go right,
2020
01:34:01,649 --> 01:34:04,191
but if I keep going right, right, right, right, right, right,
2021
01:34:04,191 --> 01:34:05,541
right it's not going anywhere.
2022
01:34:05,541 --> 01:34:08,021
And left, left, left, left, left, left, left, left, left, left, left, left,
2023
01:34:08,021 --> 01:34:09,441
left it eventually stops.
2024
01:34:09,441 --> 01:34:13,941
So before we look at the code, how might this be working?
2025
01:34:13,941 --> 01:34:17,691
What kinds of scripts, collections of puzzle pieces,
2026
01:34:17,691 --> 01:34:20,191
might collectively help us implement this?
2027
01:34:20,191 --> 01:34:21,231
What do you think?
2028
01:34:21,231 --> 01:34:25,071
AUDIENCE: [INAUDIBLE]
2029
01:34:29,246 --> 01:34:30,371
DAVID MALAN: Perfect, yeah.
2030
01:34:30,371 --> 01:34:33,539
There's probably some question being asked, if touching the black line,
2031
01:34:33,539 --> 01:34:35,831
and it happens to be a couple of sprites, each of which
2032
01:34:35,831 --> 01:34:39,081
is just literally a vertical black line we're probably asking a question like,
2033
01:34:39,081 --> 01:34:40,151
are you touching it?
2034
01:34:40,151 --> 01:34:43,151
Is the distance to it zero or close to zero?
2035
01:34:43,151 --> 01:34:48,831
And if so, we just ignore the left or the right arrow at that point.
2036
01:34:48,831 --> 01:34:49,571
So that works.
2037
01:34:49,571 --> 01:34:51,641
But otherwise, if we're not touching a wall,
2038
01:34:51,641 --> 01:34:55,181
what are we probably doing instead forever here?
2039
01:34:55,181 --> 01:34:57,521
How is the movement working presumably?
2040
01:34:57,521 --> 01:34:59,531
Yeah and back.
2041
01:34:59,531 --> 01:35:01,321
Oh are you scratching?
2042
01:35:01,321 --> 01:35:02,341
OK, sure.
2043
01:35:02,341 --> 01:35:03,433
Let's go on.
2044
01:35:03,433 --> 01:35:06,391
AUDIENCE: [INAUDIBLE]
2045
01:35:06,391 --> 01:35:08,265
DAVID MALAN: Sorry, say a little louder.
2046
01:35:08,265 --> 01:35:11,499
AUDIENCE: Presumably it's continually looking for you to hit the arrow keys
2047
01:35:11,499 --> 01:35:12,891
and then moving when you do.
2048
01:35:12,891 --> 01:35:13,766
DAVID MALAN: Exactly.
2049
01:35:13,766 --> 01:35:17,631
It's continually, forever listening for the arrow keys up, down, left, right,
2050
01:35:17,631 --> 01:35:19,971
and if the up arrow is pressed, we're probably
2051
01:35:19,971 --> 01:35:22,501
changing the y by a positive value.
2052
01:35:22,501 --> 01:35:25,101
If the down arrow is pressed, we're going down by y,
2053
01:35:25,101 --> 01:35:26,791
and left and right accordingly.
2054
01:35:26,791 --> 01:35:28,371
So let's actually take a quick look.
2055
01:35:28,371 --> 01:35:31,701
If I zoom out here and take a look at the code that implements this,
2056
01:35:31,701 --> 01:35:34,256
there's a lot going on at first glance, but let's see.
2057
01:35:34,256 --> 01:35:36,381
First of all, let me drag some stuff out of the way
2058
01:35:36,381 --> 01:35:38,541
because it's kind of overwhelming at first glance,
2059
01:35:38,541 --> 01:35:41,991
especially if you, for instance, were poking around online as for problem set
2060
01:35:41,991 --> 01:35:44,634
0 just to get inspiration, most projects out there
2061
01:35:44,634 --> 01:35:46,551
are going to look overwhelming at first glance
2062
01:35:46,551 --> 01:35:49,021
until you start to wrap your mind around what's going on.
2063
01:35:49,021 --> 01:35:52,281
But in this case, we've implemented some abstractions
2064
01:35:52,281 --> 01:35:55,431
from the get go to explain to ourselves and to anyone else looking
2065
01:35:55,431 --> 01:35:57,381
at the code what's going on.
2066
01:35:57,381 --> 01:36:01,801
This is that program with the two black lines and the Harvard shield going up,
2067
01:36:01,801 --> 01:36:02,781
down, left, and right.
2068
01:36:02,781 --> 01:36:06,501
It initially puts the shield in the middle, 0,0, then
2069
01:36:06,501 --> 01:36:09,951
forever listens for keyboard, as I think you were describing,
2070
01:36:09,951 --> 01:36:13,161
and it feels for the walls, as I think you were describing.
2071
01:36:13,161 --> 01:36:14,721
Now how is that implemented?
2072
01:36:14,721 --> 01:36:15,561
Don't know yet.
2073
01:36:15,561 --> 01:36:19,101
These are custom blocks we created as abstractions to kind of hide
2074
01:36:19,101 --> 01:36:21,351
those implementation details because honestly that's
2075
01:36:21,351 --> 01:36:22,831
all I need to know right now.
2076
01:36:22,831 --> 01:36:25,551
But, as aspiring programmers, if we're curious now,
2077
01:36:25,551 --> 01:36:28,161
let's scroll down to the actual implementation
2078
01:36:28,161 --> 01:36:29,961
of listening for keyboard.
2079
01:36:29,961 --> 01:36:32,401
This is the one on the left and it is a little long,
2080
01:36:32,401 --> 01:36:35,161
but it's a lot of similar structure.
2081
01:36:35,161 --> 01:36:40,071
We're doing the following, if the up arrow is pressed, then change y by 1.
2082
01:36:40,071 --> 01:36:40,731
Go up.
2083
01:36:40,731 --> 01:36:44,301
If the down arrow is pressed, then change y by negative 1.
2084
01:36:44,301 --> 01:36:45,041
Go down.
2085
01:36:45,041 --> 01:36:48,061
Right arrow, left arrow, and that's it.
2086
01:36:48,061 --> 01:36:50,691
So it just assembles all of those ideas, combines it
2087
01:36:50,691 --> 01:36:53,151
into one new block just because it's kind of overwhelming,
2088
01:36:53,151 --> 01:36:55,381
let's just implement it once and tuck it away.
2089
01:36:55,381 --> 01:36:59,421
And if we scroll now over to the Feel for Walls function,
2090
01:36:59,421 --> 01:37:02,781
this now is asking the question as hypothesized,
2091
01:37:02,781 --> 01:37:07,701
if I'm touching the left wall, change my x value by 1, sort of move away from it
2092
01:37:07,701 --> 01:37:08,421
a little bit.
2093
01:37:08,421 --> 01:37:11,361
If I'm touching the right wall, then move x by negative 1
2094
01:37:11,361 --> 01:37:13,293
to move a little bit away from it.
2095
01:37:13,293 --> 01:37:14,751
So it kind of bounces off the wall.
2096
01:37:14,751 --> 01:37:20,151
Just in case it slightly went over, we keep the crest within those two walls.
2097
01:37:20,151 --> 01:37:23,931
All right, then a couple of more pieces here to introduce.
2098
01:37:23,931 --> 01:37:27,141
What if we want to actually add some kind of adversary or opponent
2099
01:37:27,141 --> 01:37:28,011
to this game?
2100
01:37:28,011 --> 01:37:34,731
Well, let me go ahead to maybe this one here where the adversary in this game
2101
01:37:34,731 --> 01:37:38,159
might, for instance, be designed to be bouncing to stand in your way.
2102
01:37:38,159 --> 01:37:41,451
This is like a maze and you're trying to get the Harvard shield from the bottom
2103
01:37:41,451 --> 01:37:42,511
to the top or vice versa.
2104
01:37:42,511 --> 01:37:47,061
Uh oh, Yale is in the way and it seems to be automatically bouncing
2105
01:37:47,061 --> 01:37:48,241
back and forth here.
2106
01:37:48,241 --> 01:37:49,491
Well, let me ask someone else.
2107
01:37:49,491 --> 01:37:50,151
Hypothesize.
2108
01:37:50,151 --> 01:37:51,951
How is this working?
2109
01:37:51,951 --> 01:37:54,081
This is an idea you have, this as an idea you see.
2110
01:37:54,081 --> 01:37:59,191
Let's reverse engineer in your head how it works.
2111
01:37:59,191 --> 01:38:00,391
How might this be working?
2112
01:38:00,391 --> 01:38:01,636
Yeah, in back.
2113
01:38:01,636 --> 01:38:05,356
AUDIENCE: If the Yale symbol is touching a right wall or left wall,
2114
01:38:05,356 --> 01:38:07,339
then have it bounce.
2115
01:38:07,339 --> 01:38:09,131
DAVID MALAN: Yeah, so if the Yale symbol is
2116
01:38:09,131 --> 01:38:11,831
touching the left wall or the right wall, we somehow have it bounce.
2117
01:38:11,831 --> 01:38:14,456
And indeed we'll see there's a puzzle piece that can do exactly
2118
01:38:14,456 --> 01:38:16,766
that technically off the edge, as we'll see,
2119
01:38:16,766 --> 01:38:18,391
but there's another way we can do this.
2120
01:38:18,391 --> 01:38:19,451
Let's look at the code.
2121
01:38:19,451 --> 01:38:21,971
The way we ourselves can implement exactly
2122
01:38:21,971 --> 01:38:24,711
that idea bounce is just with a little bit of logic.
2123
01:38:24,711 --> 01:38:27,281
So here's what this version of the program is doing.
2124
01:38:27,281 --> 01:38:31,421
It's moving Yale by default to 0,0 just to arbitrarily put it somewhere,
2125
01:38:31,421 --> 01:38:35,951
pointing it direction 90 degrees, which means just horizontally, essentially,
2126
01:38:35,951 --> 01:38:39,191
and then it's forever doing this: if touching the left wall
2127
01:38:39,191 --> 01:38:43,151
or touching the right wall, here's our translation of bounce.
2128
01:38:43,151 --> 01:38:44,653
We're just turning 180 degrees.
2129
01:38:44,653 --> 01:38:46,361
And the nice thing about that is we don't
2130
01:38:46,361 --> 01:38:49,069
have to worry if we're going from right to left or left to right.
2131
01:38:49,069 --> 01:38:52,181
180 degrees is going to work on both of the walls.
2132
01:38:52,181 --> 01:38:54,011
And that's it.
2133
01:38:54,011 --> 01:38:57,371
After we do that, we just move one step, one pixel, at a time
2134
01:38:57,371 --> 01:39:00,851
but we're doing it forever so something is happening continually
2135
01:39:00,851 --> 01:39:03,341
and the Yale icon is bouncing back and forth.
2136
01:39:03,341 --> 01:39:06,251
Well one final piece here, what if now we
2137
01:39:06,251 --> 01:39:12,411
want another adversary, a more advanced adversary down the road for instance,
2138
01:39:12,411 --> 01:39:17,531
to go and follow us wherever we are such that this time
2139
01:39:17,531 --> 01:39:23,861
we want the other sprite to not just bounce back and forth,
2140
01:39:23,861 --> 01:39:28,301
but literally follow us no matter where we go.
2141
01:39:28,301 --> 01:39:31,811
How might this be implemented on the screen?
2142
01:39:31,811 --> 01:39:34,241
I bet it's another forever block, but what's inside?
2143
01:39:34,241 --> 01:39:38,321
AUDIENCE: So forever get the location of the of the Harvard shield
2144
01:39:38,321 --> 01:39:39,544
and move one step towards it.
2145
01:39:39,544 --> 01:39:42,461
DAVID MALAN: Yeah, forever point at the location of the Harvard shield
2146
01:39:42,461 --> 01:39:43,841
and go one step toward it.
2147
01:39:43,841 --> 01:39:48,041
This is just going to go on forever if I just give up, at least in this version.
2148
01:39:48,041 --> 01:39:51,251
Notice it's sort of twitching back and forth because it goes one
2149
01:39:51,251 --> 01:39:52,901
pixel then one pixel then one pixel.
2150
01:39:52,901 --> 01:39:54,611
It's sort of in a frantic state here.
2151
01:39:54,611 --> 01:39:58,121
We haven't finished the game yet, but if we see inside, we'll see exactly that.
2152
01:39:58,121 --> 01:40:00,821
It didn't take much to implement this simple idea.
2153
01:40:00,821 --> 01:40:03,611
Go to a random position just to make it kind of fair,
2154
01:40:03,611 --> 01:40:06,441
initially, then forever point towards Harvard,
2155
01:40:06,441 --> 01:40:09,761
which is what we called the Harvard crest sprite, move one step.
2156
01:40:09,761 --> 01:40:12,401
Suppose we now wanted to make a more advanced level.
2157
01:40:12,401 --> 01:40:15,311
What's a minor change I could logically make to this code just
2158
01:40:15,311 --> 01:40:17,738
to make MIT even better at this?
2159
01:40:17,738 --> 01:40:19,571
AUDIENCE: Change the number of steps to two.
2160
01:40:19,571 --> 01:40:21,011
DAVID MALAN: All right, change the number of steps to two.
2161
01:40:21,011 --> 01:40:22,091
So let's try that.
2162
01:40:22,091 --> 01:40:24,071
So now they got twice as fast.
2163
01:40:24,071 --> 01:40:26,451
Let me go ahead and just get this out of the way.
2164
01:40:26,451 --> 01:40:29,541
Oops, let me make it a fair fight.
2165
01:40:29,541 --> 01:40:31,011
Green flag.
2166
01:40:31,011 --> 01:40:34,231
All right, I unfortunately am still moving one pixel at a time,
2167
01:40:34,231 --> 01:40:35,781
so this isn't going to end well.
2168
01:40:35,781 --> 01:40:36,921
It caught up to me.
2169
01:40:36,921 --> 01:40:42,931
And if we're really aggressive and do something like 20 steps at a time,
2170
01:40:42,931 --> 01:40:44,631
click the green flag.
2171
01:40:44,631 --> 01:40:49,071
Jesus, OK, so that's how you might then make your levels progressively
2172
01:40:49,071 --> 01:40:50,461
harder and harder.
2173
01:40:50,461 --> 01:40:53,394
So it's not an accident that we chose these particular examples
2174
01:40:53,394 --> 01:40:56,061
here involving these particular schools because we have one more
2175
01:40:56,061 --> 01:40:58,381
demonstration we thought we'd introduce today
2176
01:40:58,381 --> 01:41:02,721
if we could get one other volunteer to come up and play
2177
01:41:02,721 --> 01:41:07,101
what was called by one of your predecessors Ivy's Hardest Game.
2178
01:41:07,101 --> 01:41:08,361
Let's see, you in the middle.
2179
01:41:08,361 --> 01:41:09,444
Do you want to come on up?
2180
01:41:09,444 --> 01:41:10,364
What's your name?
2181
01:41:10,364 --> 01:41:11,114
AUDIENCE: Celeste.
2182
01:41:11,114 --> 01:41:12,072
DAVID MALAN: Say again?
2183
01:41:12,072 --> 01:41:12,861
AUDIENCE: Celeste.
2184
01:41:12,861 --> 01:41:14,694
DAVID MALAN: Come a little closer, actually.
2185
01:41:14,694 --> 01:41:17,141
Sorry, hard to hear here.
2186
01:41:17,141 --> 01:41:19,767
All right, round of applause here if we could, too.
2187
01:41:19,767 --> 01:41:23,099
[APPLAUSE]
2188
01:41:25,937 --> 01:41:27,187
OK, sorry, what was your name?
2189
01:41:27,187 --> 01:41:27,901
AUDIENCE: Celeste.
2190
01:41:27,901 --> 01:41:28,426
DAVID MALAN: Ceweste
2191
01:41:28,426 --> 01:41:28,791
AUDIENCE: Celeste.
2192
01:41:28,791 --> 01:41:29,171
DAVID MALAN: Celeste.
2193
01:41:29,171 --> 01:41:29,921
AUDIENCE: Yes.
2194
01:41:29,921 --> 01:41:30,621
DAVID MALAN: Come on over.
2195
01:41:30,621 --> 01:41:31,721
Nice to meet you, too.
2196
01:41:31,721 --> 01:41:35,381
So here we have on this other screen Ivy's Hardest Game
2197
01:41:35,381 --> 01:41:37,451
written by a former CS50 student.
2198
01:41:37,451 --> 01:41:40,151
I think you'll see that it combines these same principles.
2199
01:41:40,151 --> 01:41:42,641
The maze is clearly a little more advanced.
2200
01:41:42,641 --> 01:41:47,021
The goal at hand is to initially move the Harvard crest to the sprite all
2201
01:41:47,021 --> 01:41:49,808
the way on the right so that you catch up to him in this case,
2202
01:41:49,808 --> 01:41:51,641
but you'll see that there's different levels
2203
01:41:51,641 --> 01:41:54,051
and different levels of sophistication.
2204
01:41:54,051 --> 01:41:57,521
So if you're up for it, you can use just these arrow keys up, down, left, right.
2205
01:41:57,521 --> 01:42:00,221
You'll be controlling the Harvard sprite and if we
2206
01:42:00,221 --> 01:42:04,991
could raise the volume just a little bit, we'll make this our final example.
2207
01:42:04,991 --> 01:42:07,121
Here we go, clicking the green flag.
2208
01:42:07,121 --> 01:42:10,831
[MUSIC PLAYING]
2209
01:42:10,831 --> 01:42:12,301
Feeling ready?
2210
01:42:12,301 --> 01:42:12,911
AUDIENCE: Yep.
2211
01:42:12,911 --> 01:42:14,145
DAVID MALAN: Spacebar.
2212
01:42:14,145 --> 01:42:15,895
[MUSIC - MC HAMMER, "U CAN'T TOUCH THIS"]
2213
01:42:15,895 --> 01:42:17,801
MC HAMMER: (SINGING) Can't touch this.
2214
01:42:17,801 --> 01:42:21,366
You can't touch this.
2215
01:42:21,366 --> 01:42:22,621
You can't touch this.
2216
01:42:25,213 --> 01:42:27,891
Can't touch this.
2217
01:42:27,891 --> 01:42:29,333
My, my, my, my music--
2218
01:42:29,333 --> 01:42:30,291
DAVID MALAN: Excellent.
2219
01:42:30,291 --> 01:42:31,501
MC HAMMER: (SINGING) so hard.
2220
01:42:31,501 --> 01:42:33,251
Makes me want to say, oh my Lord.
2221
01:42:33,251 --> 01:42:34,741
Thank you for blessing me--
2222
01:42:34,741 --> 01:42:36,221
DAVID MALAN: Two Yales now.
2223
01:42:36,221 --> 01:42:38,863
MC HAMMER: (SINGING) Feels good when you know you're down.
2224
01:42:38,863 --> 01:42:40,029
A super dope homeboy--
2225
01:42:40,029 --> 01:42:40,571
AUDIENCE: Oh!
2226
01:42:40,571 --> 01:42:41,891
DAVID MALAN: Oh!
2227
01:42:41,891 --> 01:42:43,051
Keep going.
2228
01:42:43,051 --> 01:42:45,221
MC HAMMER: (SINGING) You can't touch this.
2229
01:42:45,221 --> 01:42:46,571
I told you, homeboy.
2230
01:42:46,571 --> 01:42:48,559
Can't touch this.
2231
01:42:48,559 --> 01:42:49,601
Yeah, that's how living--
2232
01:42:49,601 --> 01:42:50,559
DAVID MALAN: All right.
2233
01:42:50,559 --> 01:42:52,491
MC HAMMER: (SINGING) Can't touch this.
2234
01:42:52,491 --> 01:42:53,607
Look at my eyes, man.
2235
01:42:53,607 --> 01:42:56,319
You can't touch this.
2236
01:42:56,319 --> 01:42:57,901
You let me bust the funky lyrics.
2237
01:42:57,901 --> 01:42:58,776
You can't touch this.
2238
01:42:58,776 --> 01:43:00,014
Fresh new kicks and pants.
2239
01:43:00,014 --> 01:43:02,181
You got it like that and you know you want to dance.
2240
01:43:02,181 --> 01:43:06,003
So move out of your seat and get a fly girl and catch this beat.
2241
01:43:06,003 --> 01:43:06,503
[LAUGHING]
2242
01:43:06,503 --> 01:43:07,634
Hold on.
2243
01:43:07,634 --> 01:43:10,983
Pump a little bit and let them know what's going on like that, like that.
2244
01:43:10,983 --> 01:43:12,441
Cold on a mission, so fall on back.
2245
01:43:12,441 --> 01:43:13,733
Let them know that you're too--
2246
01:43:13,733 --> 01:43:14,816
DAVID MALAN: There you go.
2247
01:43:14,816 --> 01:43:15,951
There you go.
2248
01:43:15,951 --> 01:43:19,079
[APPLAUSE]
2249
01:43:19,079 --> 01:43:21,499
MC HAMMER: (SINGING) Can't touch this.
2250
01:43:21,499 --> 01:43:22,951
Why you standing there, man?
2251
01:43:22,951 --> 01:43:24,341
You can't touch this.
2252
01:43:24,341 --> 01:43:25,421
Yo, sound the bell.
2253
01:43:25,421 --> 01:43:26,753
School's in, sucker.
2254
01:43:26,753 --> 01:43:27,461
Can't touch this.
2255
01:43:27,461 --> 01:43:31,016
Give me a song or rhythm, making them sweat that's what give them.
2256
01:43:31,016 --> 01:43:32,201
[CHEERING]
2257
01:43:32,201 --> 01:43:32,921
They know.
2258
01:43:32,921 --> 01:43:35,254
You talking the Hammer when you're talking about a show.
2259
01:43:35,254 --> 01:43:36,451
That's hyped and tight.
2260
01:43:36,451 --> 01:43:39,301
Singers are sweating so them a wipe or a tame to learn.
2261
01:43:39,301 --> 01:43:40,811
DAVID MALAN: Second to last level.
2262
01:43:40,811 --> 01:43:41,311
Oh!
2263
01:43:41,311 --> 01:43:43,151
MC HAMMER: (SINGING) That chart's legit.
2264
01:43:43,151 --> 01:43:45,901
Either work hard or you might as well quit.
2265
01:43:45,901 --> 01:43:47,601
That word because you know--
2266
01:43:47,601 --> 01:43:48,391
DAVID MALAN: Oh!
2267
01:43:48,391 --> 01:43:50,161
Keep going, keep going!
2268
01:43:50,161 --> 01:43:50,791
Yes!
2269
01:43:50,791 --> 01:43:53,091
MC HAMMER: (SINGING) You can't touch this.
2270
01:43:53,091 --> 01:43:55,113
DAVID MALAN: You're almost there.
2271
01:43:55,113 --> 01:43:56,571
MC HAMMER: (SINGING) Break it down.
2272
01:43:56,571 --> 01:43:57,654
DAVID MALAN: There you go.
2273
01:43:57,654 --> 01:43:59,081
Go, go, go!
2274
01:43:59,081 --> 01:44:00,131
Oh.
2275
01:44:00,131 --> 01:44:00,671
One more.
2276
01:44:03,491 --> 01:44:03,991
Yes!
2277
01:44:03,991 --> 01:44:04,965
[CHEERING]
2278
01:44:04,965 --> 01:44:05,939
There you go.
2279
01:44:08,861 --> 01:44:10,967
MC HAMMER: (SINGING) Stop, Hammer time.
2280
01:44:10,967 --> 01:44:12,579
"Go with the flow," it is said.
2281
01:44:12,579 --> 01:44:14,871
If you can't groove to this, then you're probably dead.
2282
01:44:14,871 --> 01:44:16,941
So wave your hands in the air, bust a few moves,
2283
01:44:16,941 --> 01:44:17,841
run your fingers through your hair.
2284
01:44:17,841 --> 01:44:18,341
This is it.
2285
01:44:18,341 --> 01:44:19,321
For a winner.
2286
01:44:19,321 --> 01:44:21,751
Dance to this and you're going to get thinner.
2287
01:44:21,751 --> 01:44:23,351
Now move, slide your rump.
2288
01:44:23,351 --> 01:44:26,005
Just for a minute let's all do the bump.
2289
01:44:26,005 --> 01:44:26,977
[CHEERING]
2290
01:44:26,977 --> 01:44:27,949
DAVID MALAN: Yes!
2291
01:44:27,949 --> 01:44:29,407
[APPLAUSE]
2292
01:44:29,407 --> 01:44:30,379
Congratulations.
2293
01:44:36,101 --> 01:44:38,106
All right, that's it for CS50.
2294
01:44:38,106 --> 01:44:38,981
Welcome to the class.
2295
01:44:38,981 --> 01:44:41,501
We'll see you next time.
2296
01:44:41,501 --> 01:44:44,851
[MUSIC PLAYING]
190155
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.