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