All language subtitles for 2022_lecture0_720p_sdr-en

af Afrikaans
ak Akan
sq Albanian
am Amharic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bem Bemba
bn Bengali
bh Bihari
bs Bosnian
br Breton
bg Bulgarian
km Cambodian
ca Catalan
ceb Cebuano
chr Cherokee
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
ee Ewe
fo Faroese
tl Filipino
fi Finnish
fr French
fy Frisian
gaa Ga
gl Galician
ka Georgian
de German
el Greek
gn Guarani
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ia Interlingua
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
rw Kinyarwanda
rn Kirundi
kg Kongo
ko Korean
kri Krio (Sierra Leone)
ku Kurdish
ckb Kurdish (Soranรฎ)
ky Kyrgyz
lo Laothian
la Latin
lv Latvian
ln Lingala
loz Lozi
lg Luganda
ach Luo
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mfe Mauritian Creole
mo Moldavian
mn Mongolian
my Myanmar (Burmese)
sr-ME Montenegrin
ne Nepali
pcm Nigerian Pidgin
nso Northern Sotho
no Norwegian
nn Norwegian (Nynorsk)
oc Occitan
or Oriya
om Oromo
ps Pashto
fa Persian
pt-BR Portuguese (Brazil)
pt Portuguese (Portugal) Download
pa Punjabi
qu Quechua
ro Romanian
rm Romansh
nyn Runyakitara
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
sh Serbo-Croatian
st Sesotho
tn Setswana
crs Seychellois Creole
sn Shona
sd Sindhi
si Sinhalese
sk Slovak
sl Slovenian
so Somali
es Spanish
es-419 Spanish (Latin American)
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
tt Tatar
te Telugu
th Thai
ti Tigrinya
to Tonga
lua Tshiluba
tum Tumbuka
tr Turkish
tk Turkmen
tw Twi
ug Uighur
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
wo Wolof
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu

Original subtitles

[MUSIC PLAYING]

DAVID J. MALAN: All right.

This is CS50, Harvard University's introduction

to the intellectual enterprises of computer science

and the arts of programming.

My name is David Malan, and I actually took this course myself, back in 1996.

I was a sophomore at the time.

I was actually concentrating in government, because a year prior,

as a first year, I'd come into Harvard thinking

that I liked history and constitutional law and similar classes in high school.

And so when I got here, I rather gravitated

toward that which was familiar.

I figured, if I liked and if I were good at that particular subject

in high school, then that's presumably who I'm supposed to be here.

But it wasn't until sophomore year that I got up

the nerve to step foot in the CS50 classroom,

and even then, it was only out of curiosity.

Like I had no intention of studying computer science of even taking CS50

when I got to campus.

But people were talking about it, and there was a lot of beware.

And it was perhaps for the initiated only,

and I didn't really ultimately what computer science was.

But for me, the light bulb went off.

I found that, contrary to what I'd seen in high school,

where I saw friends of mine like programming away in the computer lab,

heads down, antisocially just doing whatever it was they were doing,

it really wasn't that, once I got to this particular class

and this particular place.

It was much more about problem solving more generally and just learning

how to express yourself in code, in different languages.

So that you can actually solve problems of interest to you.

Even if you have no intention of being a computer scientist or an engineer,

but just want to be able to solve problems,

analyze data do interesting things, in the arts, humanities, social sciences,

physical sciences, or really any other field.

And indeed, this particular path led me to computer science,

but the hope for CS50 more generally is that, indeed, you

just find your way to applying principles

that you'll learn over the coming months to whatever

field is of interest to you.

With that said, it was definitely a lot of work and not

without its frustrations for me.

But there was no better feeling than like banging your head proverbial

against the wall for some number of hours, even days, trying to fix a bug,

a mistake in your code.

And then, oh my God, the rush of emotion of accomplishment

of pride of exhaustion when you finally solve some problem that's

really been weighing on you.

It's just so incredibly gratifying but also empowering.

Because unlike a lot of fields, like computer science

was built by humans themselves.

And so if a human built this, surely, you, another human,

can understand it as well.

And so even though there's going to be some distractions along the way,

you're going to see what looks incredibly cryptic, if you've never

programmed before.

Over time and with practice, everything just starts to make more sense.

And with time and with practice, you just

get better at this particular field.

And indeed, really, the key to success in programming in general

is just to allow yourself enough time.

And so at least, thankfully, I quickly got

into the habit of starting early in the week,

for instance, when writing actual code.

Why?

Because you're going to run up against a wall.

You're not going to see some bug.

Something's not going to jump out at you, and that's fine.

That's when you call it a day, take a break, move onto something else,

and then just come back to it.

And that's what keeps programming fun for me, even all of these years later,

whether it's teaching or actually applying it.

But there's, down the road, a history of an MIT hack,

and it looked a little something like this, in yesteryear.

And there was a little sigh the MIT students, when they made this hack.

On the wall it says, getting an education from MIT

is like drinking from a fire hose, which indeed they

have connected to what should have been otherwise just a water fountain.

And that's going to be what it feels like, sometimes,

not just in computer science per se, but just an unfamiliar field.

If you're not from STEM, if you're not from CS, that's fine.

But so much of it, ultimately, is going to be absorbed by you

and going to be within your grasp by terms end.

So just keep in mind, that's very much the intent,

but you'll be amazed what you're able to create, to accomplish,

just three or so months hence.

Indeed, 2/3 of you, contrary to what you might think are assume,

have never taken a CS class before.

So it's absolutely not the case that the person to the left or the right

surely must know more than you.

Indeed, it's quite the opposite.

And as you'll see in the coming weeks, as you write your own code

and solve your own problems, what ultimately matters in this course

is not so much where you end up relative to your classmates

but where you end up relative to yourself when you began.

And it really is all about that delta, whether you've programmed

or not, just getting something out of a class like this.

And if it does take time, and if you do feel those frustrations,

but you simultaneously eventually feel that sense of accomplishment,

that just means it's all working.

And indeed, hopefully, all the more worthwhile and gratifying, ultimately,

as a result.

So what are we going to do in the coming weeks?

So here we are in week zero.

We'll soon see why computers and computer scientists start counting,

if you will, from 0.

But week 0, is one in which we explore computational thinking,

thinking like a computer, and starting to clean up your thought processes.

Getting you to think, to solve problems more methodically,

and then ultimately, translating that into code.

And some of you might recognize this environment here, a.k.a.

Scratch, coincidentally also from MIT.

You might have used it in grade school.

We'll use it today and a little bit this weekend in the course's first homework

assignment or problem set.

But not so much to play around in a way that you

might have if you did use it in yesteryears,

but to explore ideas of computer science and programming

that we're going to use and reuse every week hereafter as well.

Thereafter, we're going to transition just next week

to week one, so to speak.

Whereby, we'll introduce you to a more traditional language, a lower level

language, an older language called C. And in C, you're

going to use your keyboard, not so much your mouse and pointing and clicking,

but you're going to write code that soon is going

to look a little something like this.

And if you've programmed before, you can probably

glean what this is going to do.

If you've never programmed before, which is the case for most of you,

this too will soon make sense.

But this is the most canonical program that most any programmer ever writes

called Hello, World, and indeed, that and all

of the surrounding syntax above and below just that sentence Hello, World,

will soon make all the more sense.

You'll learn how to use industry-standard tools, so to speak.

Pictured here is something called Visual Studio code, or VS Code.

You'll use a cloud based version of it initially,

so you don't have to suffer with any technical difficulties

or headaches like that.

It'll just work right off the bat, but we'll

use that to [INAUDIBLE] others ultimately

to then explore ideas in computer science, principles that you can apply.

And we'll take a look underneath the hood,

so to speak, of your computer at your memory or RAM, Random Access Memory,

where all of the data is ultimately going to be stored.

We'll also take a look thereafter at bugs.

A bug is a mistake in a program.

Here is an actual bug in an actual computer in yesteryear,

but we'll teach you how to debug programs, find your own mistakes,

find others' mistakes, and improve that code as well.

We'll transition then to algorithms, step-by-step instructions

for solving some problems, which we'll touch on today too.

And if you picture here, this is actually

a pretty representative problem.

Odds are, you haven't had to deal with something like this,

but it's representative sorting, for instance.

If you think of each of these small bars as being a small number,

each of the bigger bars is being a bigger number,

you might wonder, well, how could you as a human sort all of these bars,

like get all the short bars over here, all the big bars over there?

Well, odds are, if you're like me, you would probably kind of eyeball it,

and if you could physically interact, you

might just start grabbing the smallest elements first,

put them over on the left.

Maybe grab the biggest elements, put them over on the right.

But what's your algorithm there?

Like how would you teach someone younger than you, who's never done that before,

how to do it?

How would you compel your Mac or PC or phone to do something like that?

You can't just wave your hand, and say, oh, figure it out.

Move things around.

You have to express yourself more methodically.

So we'll translate even ideas like this into code too.

And that's what the Googles and others of the world

are doing constantly, as they sort and organize the world's information.

We'll use metaphors along the way, if it helps.

We'll talk about your computer's memory as being like a postal address.

Like every mailbox in the world has some form of postal address, street, city,

state, country, and the like, and it turns out,

that's how your Mac, your PC, and your phone also work.

You've got a whole bunch of memory, like the picture before,

but you can think of it really as individual mailboxes.

And you can put anything you want in those mailboxes,

and you can go to a mailbox to grab information that's from it.

So at the end of the day, that's really all your computer

is doing with information.

It's just organizing it, not into mailboxes per se,

but a term you probably know called bytes, for instance, instead.

We'll talk about problems that arise even nowadays.

In fact, most of you are familiar with your Mac,

PC, even phone like spontaneously rebooting sometimes, crashing,

the little annoying spinning beach ball or hourglass icon that happens.

Like what is with that?

Well, those are just bugs in programs that humans at Apple and Google

and Microsoft and others, they screwed up, and they wrote buggy code.

And your computer, when it encounters those mistakes,

doesn't know what to do.

And so 9 times out of 10, so to speak, it just crashes or freezes

or the like, but that kind of stuff will make more sense.

So even the real world will make sense, and pictured here

are some lower level terms we'll eventually get to mid-semester.

But generally speaking, when something is going this way,

as per this arrow, and something is going this way, as per this arrow,

like that does not end well.

And that often is what happens when your computer crashes.

Someone's using memory up here, but someone else is using memory down here,

and then they're not really talking left hand and right hand.

So that is just a high level overview of some of the problems we'll encounter,

but we'll focus to on data, ultimately.

So pictured here is something fairly technical called a hash table.

It's an amalgam of something we're going to soon call an array and also

something we call a link to list.

And these are just fancy terms for describing

how you can organize information even more flexibly

than just putting individual values in mailboxes.

Like how could you build structures, like actual data structures

so to speak, two-dimensional structures at that?

And so what you're seeing here is a glimpse, as some of you

might have recognized, of some Harry Potter universe names,

but they're organized somewhat alphabetically.

And notice, that any time there's multiple people with a name that

starts with H, like Hermione, Harry, and Hagrid, well, they

can't all fit in that mailbox, if each of these squares along the left

is that same mailbox.

So you have to chain them together.

Well, you'll learn how to do that in code.

So that even if you get more data than you expect,

if your business is booming, and you're some web-based business,

how do you keep adding and adding information

to your software to actually keep up with it?

But this, again, is what code's going to soon look like, as soon as next week,

in week one, this here being C, but we'll transition in a few weeks

to a more modern, higher level language, so to speak, called Python.

Indeed, the course very deliberately, back in my day and now this,

introduces you first to C, which funny enough, many people don't

tend to program in certainly every day.

I use C, generally, September, October, November,

December, when teaching CS50 itself.

But it's everywhere, nonetheless.

In fact, even today's other languages, with which you might be familiar,

like Python and Java and yet others still, you

see this same primitive language underneath the hood,

because it's so darn fast.

And as you'll learn over the coming weeks,

it really gives you access to and an understanding of what's

going on conceptually down here.

So that thereafter, after CS50, when you're writing code,

you can think at a very high level what's actually going on.

So in fact, in just a few weeks, what looks like this in C

is going to look instead like this in Python.

And you'll better understand what's going on underneath the hood,

and odds are, after this class, you'll reach for a language,

like Python more frequently than C, but you're

going to benefit from that bottom-up understanding thereof.

Thereafter and towards term's end, we'll introduce you to a few other ideas,

like where do you put large amounts of data?

In things called databases, not things like spreadsheets, like here,

but actual databases.

We're using those same kinds of data structures,

you lay things out in an interesting way in memory.

Thereafter, we'll transition to a very familiar environment

that you and I use every day, the web.

Like the web has become rather the User Interface, or UI,

that we use everywhere, on the laptops, desktops, and even mobile devices,

nowadays.

Well, pictured here is a language called HTML.

It's not a programming language.

It's a markup language, and some of you might have made home pages

or portfolios in the past.

But you'll understand what's going on here, but more powerfully,

you'll understand how the computer sees that same kind of code,

builds up a hierarchical family tree-type structure in memory.

And then you can manipulate that tree with code

to actually add more and more information, chat messages, anything

on the screen that you like.

And finally, we'll tie all of this together

by introducing what are called frameworks and libraries,

third-party code that makes it a lot easier to solve problems of interest

to you.

And so in particular, here, this is the very first web app

that I myself made back in like 1997.

I was part of the first-year intramural sports program,

not as an athlete but as the programmer, and I was teaching myself

how to build web applications.

I only knew C and maybe a little bit of something else at the time.

But this became, for Harvard at least, the very first website

for the first-year intramural sports program,

and it wasn't just a static website with links and images and the like.

It was interactive.

You could register for sports.

We could input exactly who was in a tournament bracket or the like,

and it could actually automatically keep track of this data.

So there too, after just three months of a class like this,

you'll go from writing quite simply this week

and next Hello, World to building things like

this for whether it's web, mobile, or other platforms

as well, if you so choose.

But we'll get you off of the course's infrastructure, by the end of the term.

You won't be using any toy environments along the way.

We'll empower you, ultimately, to write code after CS50, especially if this

is the only CS class you ever take, on your own Mac or PC,

using the same software, but not the cloud-based version thereof.

But all of this software is itself free and can be used by you

powerfully after the course's own end.

But along the way, as you may know, there

is this tradition within the class, particularly in healthy times,

of a number of events that really brings people get together,

not just collaboratively and academically,

but to just solve problems and generally engage with each other as well.

Coming up first, CS50 Puzzle Day, which is meant to be not jigsaw

puzzles but logic puzzles that require no prior experience

with computer science or programming.

But it's just an opportunity to quietly work on a packet of puzzles

with some number of friends for prizes and more.

Later in the semester, once you tackle your final projects,

the capstone of the course, where we don't give you a homework to write,

you yourself come up with something to build.

We'll get together generally around 7:00 PM in the evening,

wrap up around 7:00 AM, if you so choose.

And it's an evening, a 12-hour opportunity to collaborate with

classmates on your very own final project, in a large space on campus,

that ends--

if you're awake with us-- at 5:00 AM.

We can hop on some CS50 shuttles and go down the road for some pancakes at IHOP

around 6:00.

Of course-- of course, this is 6:00, 7:00 AM at that point,

but it's an opportunity finally to lead into what's

called the CS50 fair, which is an end of semester celebration, an exhibition,

of everything that you'll accomplish over the coming months.

And in fact, pictured here are some of your predecessors in healthy times.

The CS50 fair allows you to come with your laptop or phone

and exhibits of students, faculty, and staff across campus

put together something in person and on video

that people can delight in seeing, as you exhibit what it is you created

and what you learned over the course of the several weeks.

And ultimately, a chance to just share and inspire others as well.

And you'll all walk home, ultimately, with your own I took

CS50 T-shirts saying as much as well.

So with that high level overview of the course,

I propose that we begin to take a look at what computer science itself is

and what it is we're going to be doing over the next several weeks

at this lower level [INAUDIBLE] too.

So what is computer science?

Right?

If you're maybe like me or new people like my friends in high school,

you probably assume that it means programming.

And that's absolutely a big part of it for a lot of people, because with code,

you can write, you can express ideas, and solve actual problems,

especially involving data.

But computer science itself is really the study of information, if you will.

How do you represent it, and how do you actually process it?

And in that sense, computational thinking

is just the application of ideas from computer science, a course like this,

to problems of interest to you, again, in the arts, humanities, sciences,

social sciences, whatever the domain of interest is to you.

So with that, if computer science is all about information and with it

the solving of problems, well, what does it actually mean to solve a problem?

Let's see if we can't propose a model into which all of the lessons learned

will ultimately follow.

And I'd propose that this is problem solving.

You've got some input, which is like the problem you want to solve.

The goal is to solve it.

So that's the so-called output, and then somewhere

in here, the proverbial black box, is some kind of secret sauce

that gets the work done.

And in the coming months, we'll have to decide, well, how are we

going to represent these inputs and outputs, and really, how do we code up?

How do we write solutions for what it is that's solving the problem of interest

to us?

So when it comes to representation of information, like there's a lot of ways

we can do this.

And for instance, if the problem at hand quite

simply is to take attendance at the beginning of class,

on the first day of school, well, how could we go about doing this?

Well, we could actually use a system called unary.

Well, what is that?

Well, that's a fancy way of saying 1, 2, 3, 4, 5, maybe 6, 7, 8, 9, 10.

And I can use my digits--

pun intended-- on my fingers to actually count everyone up.

And eventually, you need toes and whatnots, if you have to count so high.

But unary is a very simple system of using

a single symbol, a human finger in this case, to just solve some problem,

like counting the number of people in the room.

Let's make this slightly more technical for a moment, a little more mathy.

That's just called base-1, where the base under which you're operating

has one digit in it, like literally a human finger, and maybe

multiple such fingers, if you need to count higher.

But of course, most of you, if not all of you,

generally, vaguely know that computers use something other than unary--

and even you and I probably don't use this that often-- they

use what language or alphabet instead.

Yeah.

So binary, so binary is indeed the system that computers somehow use.

So in this case, bi implying two, and so computers have two digits,

it turns out, at their disposal.

And in fact, if you've ever heard the technical term bit,

which is like a smaller version of a byte-- more on that soon.

Well, a binary digit is the origin of that term "Bit,"

because if you get rid of some of the letters, and are left from binary digit

with just B-I-T, thus is a bit.

A bit is just a 0 and 1.

It's two more digits than you might have on your own finger,

and of course, it's fewer though than you and I have.

You and I typically use, as humans, the decimal system.

Dec meaning 10, because you and I generally use 0 through 9.

So on the one hand--

another pun intended-- you've got unary.

Computers use binary.

We humans generally think and talk in terms of decimal.

But at the end of the day, these are fundamentally

going to be the same thing, which is to say

that it's all pretty accessible to us.

Even if you're not a computer person, I daresay you're about to be.

So what is a bit?

Well, a bit then is a 0 or a 1.

That is a so-called binary digit.

But how do computers only speak in binary?

How do they solve problems, represent information, using only binary?

Well, at the end of the day, if they want to represent 0 and 1,

we need to do so physically somehow.

And I daresay that maybe the simplest way to think about a bit, a 0 or a 1,

is like a light bulb.

And so by human convention, let's just assume that if you were a computer,

be it a laptop, desktop, phone, or the like,

and you want to represent the number 0, you

know what, you just keep the light switch off.

You keep a light bulb off.

If by contrast, you're that same computer,

and you want to represent the number 1, you

take that same switch, that same light bulb, and just turn it on.

So a light bulb that's on represents a 1, and a light bulb that's off

represents a 0.

So why is this relevant to computers?

Well, at the end of the day, you and I are charging our laptops or phones

at night.

So there's some physical resource being replenished there, whether you're

on battery or some power cord.

And so inside of a computer are just thousands,

millions of tiny little switches, nowadays.

You can think of them metaphorically as light bulbs,

but they don't actually shine light.

But there are tiny, tiny little switches,

and those switches, if you've ever heard the term, are just called transistors.

So like computers have millions of transistors that can either be flipped

on to represent 1's or flipped off to represent 0's.

And from that very simple mechanism, electricity is there,

or it's not, a 1 or a 0.

Computers can actually count, obviously, from 0 to 1,

but it turns out, even higher, if they use a little more electricity as well.

So how might I do this?

Well, let me go ahead and propose that I just grab one of our own light bulbs

here on stage.

This one is off.

So for instance, if this were miniaturized inside of your Mac, PC,

or phone, this would be a transistor, and indeed, here's

the little switch on the bottom.

And if your computer wants to represent a 0, it just leaves the switch off,

and the light is not shining.

If you want to represent a 1, well now, I've counted as high

as 1, because the switch is now on.

I've grabbed a little electricity.

I'm holding on to it inside of the computer,

and so now I see that this is a 1.

All right, but unfortunately, with just one switch, one light bulb,

I can only count from 0 to 1.

How do I count out higher, might you think, intuitively?

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Say it again.

AUDIENCE: More lightbulbs.

DAVID J. MALAN: Yeah, so more light bulbs.

So let me do this.

Let me just grab something to put these on, so I can use a few of them

at a time.

And let me propose that here, instead of having just one light bulb,

let me give myself maybe three in total.

So all of them are initially off, and if you think of this in miniature form,

in your mind's eye, this is like a computer with three transistors.

Three switches representing now the number you and I know as 0.

Why?

They're just all off.

So how does a computer go about representing the number 1?

Well, it turns on one of these light bulbs.

And how does the computer represent the number 2?

Well, you might think, if I may, you just turn on a second light bulb.

And if you might think, how does a computer represent 3?

You just turn on the third light bulb.

And so as such, with three bits, a computer

would seem to be able to count from 0 on up to 1, 2, 3.

But it turns out, if I'm a little smarter here,

I can actually count higher than that.

Why?

Well, I'm just considering the combination of bulbs being on here.

What if I do something like this?

This is still 0, I will claim, but what if I propose now that this

will be how a computer represents 1--

on, off, off.

This, though, will be how the computer represents 2.

Notice, I didn't turn on the same two.

I'm just turning on the one in the middle.

This I now claim will be how a computer represents 3.

This is going to be-- in just a second--

how a computer represents the number we know as 4,

and yet, I'm still only using three bulbs.

This is going to be the number the computer represents as 5.

This is going to be how the computer represents the number 6,

and then lastly, it turns out, with three light bulbs,

if you're smart about it, you can count it seems as high as 7.

Now, even if you lost track of what I was turning on and why,

I claim there were eight different patterns, from all of them

off to all of them on.

But notice that I started to permute them.

I took into account which ones were on and which ones were off.

Why, though, do these represent the numbers we know as 0 through 7?

Well, let me go ahead, and maybe let's do this.

Instead of just considering there to be light bulbs,

let's assign some special significance to each of them, based on where it is.

And maybe for this, could we get maybe three volunteers, three volunteer?

OK.

You're being volunteered.

OK.

Come on up.

If you want to go over to the stage there.

Yeah.

You want to come on up as well, and over here as well.

So there are some stairs on either end.

Maybe a round of applause for our first volunteers of term.

[APPLAUSE]

All right.

So you want to be our number 1, and if you want to go ahead and stand

roughly right here.

How about do you want to be number 2?

AUDIENCE: Yeah.

DAVID J. MALAN: Come on over right to the right of here,

and you'll be number 4, it turns out.

If you want to come over here, on this end,

let's give you all a moment to introduce yourselves briefly to your classmates,

if you'd like.

AUDIENCE: Hi.

I'm Ellie.

I'm a senior.

DAVID J. MALAN: Nice to meet.

AUDIENCE: I'm [? Rayhanna, ?] and I'm a first year.

DAVID J. MALAN: Welcome.

AUDIENCE: Hi.

I'm Joseph, and I am a first year.

DAVID J. MALAN: Welcome.

All right.

So so glad to have all three of you up here.

Thank you.

[APPLAUSE]

Let me propose now that we'd like you three

to represent how about the number 0.

And I claim now that if each of you now represents a switch,

you have fancier light bulbs now.

One is a 1.

One is a 2.

One is a 4, but each of you is still just has a switch

on the bottom, in fact, of your plastic devices.

I claim these three volunteers are representing the number 0.

Let me ask you all now, how might you represent the number 1?

How should you cooperate here?

OK.

So we would have on, off, off, which I think

matches what I did with my three light bulbs

as well, if you want to go and turn yours off.

How might you three represent the number 2?

OK, so off, on, off now, from right to left.

How would you three represent the number 3?

Ah, so that's why my two light bulbs went on at the end.

How would you three represent the number 4?

Perfect.

Number 5, number 6, and number 7?

All right, and give us one more.

How would you represent 8?

AUDIENCE: We can't.

DAVID J. MALAN: OK.

You can't.

How about then one more volunteer, one more volunteer?

OK.

Come on up.

All right.

What's your name?

AUDIENCE: My name is [? Moin. ?]

DAVID J. MALAN: If you want to say it into there.

AUDIENCE: My name is [? Moin. ?]

DAVID J. MALAN: All right, [? and Moin, ?] you're

going to be number 8, and if now you all-- actually, let's make this

how would you represent number 8, all collectively, as 4 bits

or for switches?

OK, 8, and now lastly, give me 15.

Everyone's awkwardly doing arithmetic in their head, oh, using unary.

Yeah.

Is that everyone--

Yes.

OK.

Round of applause.

OK.

Thank you all.

If you want to leave your numbers over here,

we have a CS50 stress ball for you, but thank you for volunteering.

You can turn those numbers off and leave them over here.

So thank you.

So how do we go about-- how do we go from there to creating these patterns?

Well, even though we still had three bits, initially, and three switches,

later four bits and four switches, ultimately, we still

used the same approach fundamentally to actually representing information.

And now why were they those patterns, and why

did I very deliberately have our volunteers line up in that way?

Well, I wanted them using base-2, a.k.a.

binary, but with binary there comes certain rules.

And even if you're not familiar with binary

beyond that it exists and relates somehow to computers,

it's actually pretty much identical to the system you and I use

every day, known as base 10, a.k.a.

decimal.

So let's consider, if you will, by rewinding to primary school for just

a moment, like how decimal works.

And you'll see that even if you're not a computer person, you actually are.

You just have to tweak your mental model ever so slightly.

So here is the number that you're probably viewing as 123,

but why is that?

Well, it's not really 123.

This is just a pattern of three symbols on the screen, 1, 2, 3, and your mind

is rapidly assigning mathematical meaning to them, 123, but why is that?

Well, if you're like me, you probably learned back in the day,

when you have a three-digit number like, this the rightmost number

is in the 1's place, the middle digit is the 10's place,

the leftmost digit is in the 100's place, and why is that relevant?

Well, if you then quickly do some mental math, as you and I just do instantly

nowadays, that just means 100 times 1 plus 10 times 2 plus 1 times

3, of course, 100 plus 20 plus 3 gives us the number you and I know as 123.

But beyond that, how do we get to just two digits instead of as many as 9

in the decimal system?

Well, let's generalize this.

In the decimal system, you and I know, if we've

got three digits represented by these hashes here,

yes, it's the 1's place, 10's place, 100's place,

and if we keep going 1,000's, 10,000's, and so forth, but why is that?

Well, base terminology is now a little more germane.

That's technically the 10 to the 0th column, the 10 to the 1, 10 to the 2.

So these are powers of 10, where 10 is your base.

Computers just simplify things a little bit,

because computers, at the end of the day,

only have access to electricity, on or off.

They don't have access to 10 different types of electricity, just 2,

on or off, if you will.

Well, they just use a different base.

And the rightmost digit would be in the so-called 2 to the 0ths.

Then the middle digit is 2 to the 1.

The left most is 2 to the 2, a.k.a.

1's place, 2's place, 4's place, and as we kept going, 8,

and if we keep going, 16, 32, 64, 128, and so forth,

but the idea is fundamentally the same.

So why is this how the computer represents

the number you and I know is 0?

Well, off, off, off, from right to left or in this case left to right,

is just 0.

Why?

Because that's 4 times 0 plus 2 times 0 plus 1 times 0 is, of course, 0.

This is why 001 represents 1.

This is why 010 represents 2 and 3 and 4 and 5 and 6 and 7 on up.

And why did we need a 4th bit to represent 8?

Well, we kind of needed to carry the 1, so to speak,

using our familiar human terminology.

But for that we need a 4th bit, another transistor, and this

now represents the number 8.

And that's why we ended with on-- from left to right-- off, off, off.

So I keep saying on and off, or the light bulb is on or off,

but really, I just mean 1 or 0.

And so computers and we humans think of things digitally

as just being 0's and 1's, but mechanically,

you can think of it indeed is these light bulbs.

Now, a bit is not very useful.

Even 3 bits, 4 bits, not that useful.

You can count to 7 or 15, generally speaking,

bytes are a more useful unit of measure.

And anyone familiar how many bits is in a byte?

Yeah.

So 8 bits are in a byte.

You can think of it as an octet equivalently.

In some contexts, there are nuances there, but think of a byte

as just being 8 bits, and that's just a more useful measure.

So what does this mean in real terms?

So if you've ever downloaded like a music file or a photograph or a video,

those are measured in bytes.

Probably not small numbers of bytes, probably

kilobytes for thousands of bytes, megabytes for millions of bytes,

gigabytes for billions of bytes, especially for video.

That just means you have a lot of patterns

of 8 bits, some combination of 0's and 1's on your computer's hard drive.

Here then, with a byte of bits, 8 bits, is how a computer would typically

represent the number 0.

And if that same computer uses all 8 of its bits,

its full byte, to change it to 1--

anyone who's quick with math or have seen this before,

how high can a computer count with 8 bits or 1?

[INTERPOSING VOICES]

Yeah, 255.

Why is that?

Well, we're not going to turn this into a constant math exercise.

Indeed, after today, we're not really going

to think about or talk about bits at this low level.

But this is the 1's place, 2's, 4's, 8s, 16, 32, 64, 128,

and if I do all of that math from left to right, that indeed gives me 255.

It ignores how we might represent negative numbers, but perhaps

more on those some other day.

But computers, of course, do so much more

than numbers and math and all this low level stuff.

We send text messages, write documents, emails, and the like.

So how might a computer represent something like the letter A?

I claim, at the end of the day, your Mac, your PC,

your phone just has lots of transistors, lots of switches

that it can use in units of 8, in units of bytes.

How, though, if it's already using those patterns of 0's and 1's

apparently to represent numbers from 0 on up,

how do you go about representing letters of the alphabet, might you think?

Yeah?

OK.

So we could assign a number to every letter.

OK.

So let me just conjecture, well, let's just

call A 0, for simplicity, B 1, C 2, and now let me play devil's advocate.

OK, how do I now represent 0 or 1 or 2?

Well, we've maybe created a problem for ourselves,

if now we have to steal some numbers to represent letters.

We kind of have to pick a lane, but there's a solution to that

too that we'll see.

And it turns out the world is not quite as simple as A being 0.

A typically is represented, by computers everywhere, phones everywhere,

with the number 65, the decimal number 65.

Using 8 bits, if we turn some of the 0's to 1's, let me just stipulate,

you can represent the letter A using 8 bits, by turning certain ones on

and certain ones off, but we will try not to focus on that binary level

too much.

So if A is 65, it turns out that B is going to be 66,

and C is going to be 67, and so forth, and so where does that get us?

Well, it turns out there's a whole system that maps numbers to letters.

And here, as I alluded to verbally a moment ago,

is the pattern of 0's and 1's via which you'd represent 65.

And just quick check here, we won't constantly

do math 1's place, that's easy, 2's, 4's, 8's, 16's, 32's, 64's place.

So 64 plus 1 gives us 65.

So once I do that, how do I get to all of the others?

Well, it turns out a bunch of Americans years ago came up with this

ASCII, the American Standard Code for Information Interchange.

Now, what does that mean?

Well, it's just an acronym describing what really you proposed,

a mapping between numbers and letters, not quite as simple as 0, 1, 2.

Starts at 65, 66, 67 for capital letters,

but here are most of the letters in use today, at least with this system.

So this is just a big chart from online, and you'll

see in the middle of this chart, here, here's my 65, A. Here's my 66,

B, C, and let's see, 72 is H, 73 is I, and so forth.

So there's a mapping, at least for English, between all of these numbers

and all of these letters.

And if we focus here, those are the beginning of our uppercase alphabet.

So suppose then that today, tomorrow, you receive a text message

from someone, and underneath the hood, now that you're a computer person,

you figure out a way to see what pattern of 0's and 1's was sent.

In this case, it's wireless as opposed to wired,

but it's still some pattern of 0's and 1's.

And your phone is turning some switches of its own

on and off to represent that message from a friend.

Suppose that the three patterns you received

were these three bytes, from left to right,

spelling out a three-letter word.

Well, if we do out the math, 1's place, 2's place, and so forth--

I'll spoil it for you.

Suppose that you received a text message that doesn't literally say 72, 73, 33,

but you've received a pattern of 8 plus 8 plus 8, 24 bits

that if you do out the math represent the decimal number 72, 73, 33.

Anyone recall what message you might have received

from the green and white charts?

Yeah?

AUDIENCE: Hi.

DAVID J. MALAN: Hi.

Yes, hi is the message, but 72, 73 gives us H and I. What's 33?

Any guesses to 33?

Yeah, over here.

Yeah.

So it's an exclamation point.

How would you know that?

Well, you really do need some kind of cheat sheet, a.k.a.

ASCII in this case.

And if we look elsewhere-- let me highlight the left of the chart--

you can see that next to 33 in decimal is indeed the exclamation point.

So back in the day, a bunch of humans got in a room,

decided that, hey, when we start building PCs and later Macs and phones,

we all just have to agree on this form of representation of letters

of the English alphabet, in this case.

We just need to agree on this mapping.

But somewhat curiously, notice this.

It turns out that, once you paint yourself into this corner

and start using 65 for A, 66 for B, well,

how do you represent 65 the number and 66 the number,

if you want to do math or use Excel or something like that?

Does anyone see the solution, perhaps?

How do you represent the number 1 in ASCII?

Yeah, in the middle?

AUDIENCE: [INAUDIBLE].

DAVID J. MALAN: Yeah.

So this is getting a little maybe inception or something,

but you could represent numbers with other numbers.

And so if you want to represent the number

you and I know as 1, like when you type it on your keyboard,

turns out the computer stores that as the decimal number 49.

If you hit 2 on your keyboard, the computer is not storing 2, per se.

It's storing the decimal number 50.

Now, thankfully, the paradox stops there.

We just have a mapping now of numbers to numbers.

But really, at the end of the day-- and you're

going to learn this when we start writing code in that other language, C,

next week-- it's just context-dependent, at the end of the day.

Inside of your Mac, PC, and phone, there's just all of these permutations

of bits, all of these patterns of 0's and 1's.

And generally speaking, when you open up a text message that you've received

from someone, it's 0's and 1's.

But obviously, if it's a text message, the whole point of text messages

is to send text, and so those patterns of 0's and 1's, by default,

will typically be interpreted as letters of the alphabet.

So you won't see 0's and 1's.

You won't see decimal numbers.

You'll see the English message that your friend intended.

By contrast, if you open up something like Excel,

that same pattern 0's zeros and 1's might indeed work out to be 72, 73, 33.

You might see cells in your spreadsheet with literally those three numbers.

Why?

Because spreadsheets are all about numbers and number

crunching and math, in many cases.

If by contrast, you open up Photoshop and try

to look at that same pattern of 0's and 1's, it's not going to be 72, 73, 33.

It's not going to be 0's and 1's.

It's not going to be hi.

It's going to be some color of the rainbow.

You're going to use those patterns of 0's and 1's, it

turns out too, to represent colors.

And indeed, so long as you and I just agree, as humans long

have, what these patterns are going to be, all of our systems,

many of our systems nowadays are indeed interoperable.

But I'm being very biased here, and indeed, the A and ASCII

is very American-centric.

What do you not see in this chart?

If you speak any other language than English,

odds are, you're not seeing characters you know and love and need

every day to type or send messages.

Well, there's a huge character set that's

not supported here, whether it's accented characters

and a lot of Asian alphabets.

You have many more symbols than can fit even on this screen here.

And so humans kind of painted themselves into a corner, early on, or really,

Americans did.

But on a typical keyboard, US English keyboard, yeah, you

have A's and B's and C's, uppercase and lowercase,

but you also have accented characters here.

And nowadays, not sure if this is maybe necessary, but nowadays,

you have other characters on your keyboard, like these.

And these are a playful incarnation of what's actually

a technical solution to this problem.

If I claim for the moment that ASCII historically used 7 bits to represent

letters-- and let's just round that up to a byte--

8 bits to represent letters, ASCII can represent as many as 255,

or really 256, total characters.

Why 256?

Well, if you have them all 0, that's 0, and the highest number

I claimed a moment ago was 255.

So that's 256 total possibilities.

That's not many letters.

It's fine for English, but not a lot of human languages.

So what might the intuitive solution be, if you

want to represent accented characters, Asian characters, emoji, even

like these, which are just keys on a keyboard nowadays?

What's the intuitive solution, if a byte's too few?

Yeah?

AUDIENCE: Add another digit.

DAVID J. MALAN: Yeah.

So add another digit.

Just like we had a 4th volunteer come on up to give us a 4th bid,

let's just throw hardware at the problem and use a few more bits.

So maybe instead of 1 byte, let's use 2, or heck, let's use 3 or 4 bytes.

Even though it's getting a little expensive--

we're going from 8 to 16 to 24 or 32 bits--

that's how computers do things, these days.

And thankfully, we have so much memory inside of our computers and phones,

we can certainly spare a few to represent these things.

And the solution then to ASCII is what we'll call Unicode.

So Unicode is also just a mapping of numbers to letters

but in many different languages.

And indeed, the Unicode Consortium is a bunch

of people from all different companies--

a lot of different companies and countries and cultures whose mission,

as an organization, is to capture digitally all forms of human language

in this case.

And to ensure that especially smaller demographics of humans speaking

lesser-known languages are nonetheless represented and preserved digitally

using some mapping of these 0's and 1's.

It turns out, though, if you start using 32 bits, as many as 32 bits,

to represent characters on a keyboard, that's 4 billion possible permutations

of 0's and 1's.

That's way more than we need for most human languages.

So there's a little bit of room in there for some of those more playful things,

like those emoji.

So for instance, suppose you got a text message with this pattern

of 0's and 1's.

Or if we do out the math, suppose you receive a text message

that, if you do out the math in decimal, is 4,036,991,106.

Anyone know what emoji you're looking at?

It would be weird if you do, but what is this?

Well, it turns out that, as of this past year,

this is the most popular emoji to be sent by many measures,

Face with Tears of Joy.

So that is the pattern that a bunch of humans in the Unicode Consortium

decided would represent this.

But you'll notice, many of you might have iPhones, some of you

might have Android devices too, and sometimes, these

don't actually look quite the same.

This happens to be the current version of Face with Tears of Joy on iOS.

On Android, it tends to look a little something more like this,

and here is kind of a curiosity.

Even though you and I look at these things and they look like images,

they're not images.

They're characters, at least as we've defined them now in Unicode.

And iOS and Android and Windows and Facebook and other companies and apps,

nowadays, really just have different fonts, if you will.

So just like fonts with English and other languages

can give you different characters with serifs or not,

emoji are themselves, yes, drawings that someone made,

but they're really just a font.

And so that same pattern of 0's and 1's might just render slightly differently

on someone's phone or another.

If you've ever gotten like an icon on your phone that's broken,

and you've been sent an emoji, but it's like a square or something arbitrary

and not sensible, it might just mean that you have not

updated to the latest version of iOS or Android,

which just updates the font of supported emoji.

Because those folks at Unicode, pretty much every year

nowadays, are adding more and more emoji to that particular character set.

Now, I went down the rabbit hole of figuring out the other day just which

are the most popular emoji these days.

On Twitter specifically, this past year, the most popular emoji, by contrast,

was Loudly Crying Face.

I don't know if that says more about 2021 or about Twitter,

but you'll see different trends, certainly, in how these are used.

But even humans themselves didn't necessarily think two steps ahead,

and now a lot of the emoji are the default yellow color.

But there's a lot of emoji that aren't these cartoon characters,

but they're meant to represent humans in various professions

or gestures or the like.

And nowadays too, you've probably noticed on your phone and Macs and PCs,

there are different skin tones that you can assign to certain emojis.

If it's supported by the company and by Unicode,

you can actually touch and hold on a certain emoji,

and then you can choose the appropriate skin tone

to represent yourself or someone else.

And that then modifies the display.

Well, let's just think for a moment here,

how did Apple and Google and Microsoft and others

go about implementing support for emoji with different skin tones?

How could you do this?

If you want to represent some smiling emoji but in five,

in this case, different skin tones, you could come up with what?

Five different patterns that are identical, structurally,

except for the skin tone used in places in that image.

But that's a little inefficient to just do copy, paste, paste, paste, paste,

and change the color in Photoshop, if you will.

That's going to use more bits, more information than you might need to.

How else, if you now start to think a little bit more

like a computer scientist, if at the end of the day, all you have are

0's and 1's, how else could you implement skin tones, might you think?

Yeah?

AUDIENCE: RGB.

DAVID J. MALAN: OK.

So RGB, we'll come to that in just a moment.

That stands for Red, Green, Blue.

That's one way.

In this case, though, I'm seeking an alternative

to just using five different patterns of 0's and 1's to represent the same emoji

but different skin tones.

So not quite RGB.

Yeah?

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: OK.

So store one copy of the emoji and then store different variants of the color

that you want to assign to that emoji.

Yeah.

So this is actually an example of-- do you want to elaborate?

AUDIENCE: You could use a loop.

DAVID J. MALAN: OK.

So you can use a loop to actually output these things.

More on that in a moment.

Let me go down this road for just a moment.

This would be in some sense a better design, if you will, but why?

Yeah?

AUDIENCE: A filter?

DAVID J. MALAN: OK.

So filter, if we think of in the Instagram sense.

You can change the color of something, and that could be related here too.

AUDIENCE: Could it be another font [INAUDIBLE]

DAVID J. MALAN: Oh, interesting.

So maybe it could be just a completely different font.

And you have five different fonts that are almost identical,

except for the various interpretations of skin tone for those same emoji.

Let me spoil.

I think if we go down this one particular road,

the way the Unicode folks decided to do this some years ago where

the first byte or bytes that you receive via text or email

just represent like the structure of the emoji, the default yellow version,

thereof.

But if it's immediately followed by a certain pattern of bits

that these humans standardize to represent

each of these different shades of skin tone, then the phone, the Mac,

the PC will change that default color, yellow in most cases,

to whatever the more apt human tone is.

So you just use twice as many bits, but you don't use five times as many bits.

So what do I mean?

You don't have five completely distinct patterns, per se.

For each of these possible variants, you have a representation

of just the emoji itself, structurally, and then

reusable patterns for those five skin tones.

Unfortunately, that wasn't quite versatile enough for other features

that were in the pipeline, and nowadays too,

and there's a double meaning now to representation.

Emojis intended to focus on certain professions, and early on too,

were certain professions associated with certain genders and vice versa.

And you couldn't necessarily be one gender or another,

in a certain profession or another.

There were these combinatorics that just weren't possible.

But nowadays, as you might have seen, you

can have couples in love for instance that

actually look a little more like three emojis, but just kind of combined

into one.

And indeed, this is just one key press on your phone,

and you can combine different emoji on the left and then the right

with the emoji in the middle.

And so it turns out how computers nowadays

represent these patterns are one set of bits for the character on the left,

one set of bits for a character on the right,

one set of bits for whatever emoji you want in the middle.

And then you assemble more complicated compositions of emoji

by just reusing those same patterns and bits and bits.

The Unicode folks don't have to come up with a whole new representation

for some very specific incarnation.

They can create one for person, for male,

for, female for other characters that you might want to display,

and reuse those same patterns of 0's and 1's.

And so here, you see the imperfection, of or lack

of foresight, of humans for building a system early on that

was entirely American-centric, no characters, emoji, or the like,

that's evolved too.

And so that's an important detail in computing, nowadays.

It too is evolving, and the languages you're

about to learn in the coming days, those too are evolving as well.

And new features are getting added, and even programming languages have

version numbers.

You might have a different version of an app on your phone.

Programming languages too have different versions as well.

Questions then thus far on how information

is represented using ASCII or Unicode or anything in between?

Yeah?

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Oh, good question.

So to recap, why can't you just--

well, let me summarize that as why can't you

similarly use different patterns to change the context of what

these patterns of bits represent, whether it's

a number or a letter or a graphic?

In actuality, that's kind of what's happening underneath the hood.

It's not standardized in quite the same way, but starting next week,

when we transition from scratch to C, you'll learn about types, data types.

Where the onus initially is going to be on you, the programmer,

to tell the program whether or not this pattern of bits

should be interpreted as a number or as a letter

or as a color or something else.

Nowadays, though, and toward the end of the semester,

you'll use languages, like Python, where the computer just figures it out

for you by context, which makes it even easier and faster to program as well.

Other questions on Unicode, ASCII or the like?

All right.

Well, how about just a few other forms of information?

RGB was called out earlier, Red, Green, Blue.

How do images get represented in computers?

Well, in fact, it's typically an assembly of some amount of red,

some amount of green, some amount of blue,

but there are other representations.

If you're a graphic designer, you might know them,

but RGB is still pretty common.

What does this mean?

This means to represent every dot on your phone or every dot

on your TV or your laptop or desktop, there

is a number representing how much red that dot should show,

a number representing how much green, and a number representing

how much blue it should show, red, green, blue, respectively.

So for instance, if a dot on your screen were

using these three numbers, these three values or bytes, 72, 73, 33,

in a text message or email, that would be interpreted as I claimed "High."

But in Photoshop or in some graphical program,

that same pattern would be interpreted as let's

call it a medium amount of red, a medium amount of green,

and a little bit of blue.

And why medium and little?

Turns out, each of these are bytes, the smallest value you can have in a byte

we said is 0.

The largest value you can have a byte is 255,

so I'm just kind of spitballing here.

This is like medium, medium, and a low amount of red, green, blue,

specifically.

Those three colors, like wavelengths of light, are combined in such a way

that you would have this dot on the screen, a sort of murky shade

of yellow or brown.

That is how a computer would store precisely that color,

and in fact, we've seen this color.

When you type in Face with Tears of Joy, generally, on your screen,

it looks like this, typically much smaller.

But let's zoom in, or let's Zoom in a little more.

What are you starting to see, if you know the term?

AUDIENCE: Pixels.

DAVID J. MALAN: So pixels, it's getting very pixelated.

A pixel is just a dot on the screen, and if you really zoom in on it,

you can literally see all of the dots that compose an emoji,

in this case on iOS, in the font that Apple is using to represent this

particular pattern of 0's and 0's.

So one of those yellow dots-- and there's many of them all kind of blend

together here--

each dot on the screen I claim is 3 bytes.

How much red, green, blue for this dot?

How much red green blue for this dot?

How much red green blue for this dot?

And you'll notice too, that when it gets to be sort of brownish here,

the dots really stand out.

The 3 values, the 3 bytes, a.k.a.

24 bits, are just slightly different.

And so underneath the hood, this is why images, photographs

that you take or gif that you download, get so darn big,

potentially, because you have a number representing every dot on the screen.

Well, if this I claim is indeed how images are typically

represented, using pattern of bits that are

assigned to some amount of red, green, or blue, how do you get video?

What is a video, if at the end of the day, all we have are 0's and 1's?

What's a video, perhaps?

Yeah?

Let's go here, way in back.

Yeah.

Pixels really changing values over time.

and do you want to confirm or deny, the hand that went up here?

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, or equivalently, a sequence

of images that, over time, are changing on the screen.

So both of those are valid interpretations,

and just for fun, if you grew up with these picture books,

you might remember a little something like this.

if we could dim the lights?

[MUSIC PLAYING]

So that's the old school analog way to implement

a video, in the sense that that artist wrote out like hundreds of pieces

of paper, with almost identical images, but where the ink from their pencil

or pen was slightly moving.

And if you digitize that, such that each of those strokes

are represented with dots instead, that's really what you're seeing

is a sequence of all of these images flying across the screen.

And if we dive into the real world, if you've ever watched a film,

a Hollywood movie is typically 24 FPS, Frames Per Second.

That really means you're seeing 24 images per second, or on TV or in soap

operas, it's often 30 frames per second.

That makes things look a little more smooth.

So it's not actual motion picture, if you will.

It's sequences of pictures, and your brain and mind

are interpolating that, oh, this is smooth movement, even though we're just

seeing a lot of pictures really fast.

Now, that gets really big, and we'll talk later in the semester

how you can compress information, so that you're not using way

more bits than you actually need to.

And there's fancy algorithms that folks have developed,

but at the end of the day, that's really all a video might

be is a sequence of images.

Conversely, if you want to represent the music that

accompanies that or something else, if any of you play an instrument

and can read sheet music, how could you digitize this?

[PIANO MUSIC]

Like how could you represent musical notes in a computer?

You and I hear them when we play files, but what's

really going on underneath the hood?

Any musicians, piano players?

Anyone?

Yeah?

AUDIENCE: Hertz value?

DAVID J. MALAN: OK, so Hertz value, so some frequency.

So sound is some frequency, and it's kind of hitting your eardrum.

And that's what makes it sound low or high or somewhere in between.

So maybe we could assign, just like there's letters A through G here,

maybe we could assign specific frequency values, which

are just going to be numbers measured in something

called Hertz, something per second.

And maybe we could have a few other numbers for each of these notes,

not just the note or the frequency.

Maybe, we could represent the loudness of it, like how hard

or how softly a human might equivalently press it.

Maybe a third number, like duration, like how long

is there finger on the keyboard?

So you can imagine quantifying something like music that in the real world

is perfectly continuous as something more discrete,

by representing each note over time as just some sequence of values.

And there's so many different ways to do this, MIDI, if you've heard,

mp3's, AAC.

Almost all of the file extensions you see on your Mac or PC,

if you see them at all, ultimately just mean

there's a different form of representation for, in this case,

something like sound.

So let me just stipulate, there are these and many more

ways to represent inputs and outputs, and thankfully, humans

have standardized a lot of this.

They don't always agree, and this is why we

have different file formats for Apple numbers

and Microsoft Excel and Google Spreadsheets

and stupid incompatibilities like that.

But generally speaking, humans have standardized

how we represent the inputs and outputs to and from problems.

But let's now focus on this Black box, so to speak,

in the middle, this abstraction.

So abstraction is technically a term that you'll

see all over the place in computer science,

and really, problem solving, that just refers

to the simplification of something, so that you don't focus on the lower

level implementation details.

You really just focus on the high level goals or the process itself.

Therefore, your car, if you have a license

and have driven or have been in a car, a car, so far as you're concerned,

is probably an abstraction.

Most of us, if you're like me, probably don't really

know or care how the engine works and all the parts that are moving.

To you, it's just a way of getting from point A

to point B. It's an abstraction, but someone, hopefully the mechanic,

does know those lower level implementation details.

If you had to understand how a car works every time you

want to go to school or to the store, it's probably

going to be a pretty slow process.

You just want to think and operate at this higher level of abstraction,

and we're going to do this all the time when writing code and solving problems.

So what then is in this black box, this abstraction at the moment?

Well, generally, it's what a computer scientist

would call an algorithm, step-by-step instructions for solving some problem.

Now, let's consider the implementation details,

that is to say how you might solve certain problems,

and let's take a old school example but in modern form.

This icon, if you have an iPhone, is, of course for your contacts application.

And if you've got a whole bunch of family members or friends

or colleagues in your phonebook, you have

some kind of contacts pictured here, and it's alphabetized typically

by first name and last name.

And odds are, you and I are in the habit,

if they're not already a favorite, of like clicking on Search

and then using autocomplete.

And what happens when you start typing autocomplete?

Well if you type in the letter H, you'll see only, presumably,

Hagrid, Harry, Hermione, and so forth.

If you type in H-A that shows you only Hagrid and Harry,

and it all happens super fast.

So how is that happening?

Well, typically, you could just start at the top and look to the bottom,

searching for all of the H's or all of the H-A's, but for larger data

sets that's going to get slow.

For the Googles of the world, that's going to get really slow.

And even on our phones when you have hundreds, thousands of contacts,

eventually, even that kind of approach, that algorithm step by step

it might be slow.

So how might we go about searching for someone in a phonebook

like this, like say John Harvard?

Well, here's an old school incarnation of this,

and odds are, you might not have had occasion to even physically

use this thing, nowadays.

And in fact, this is a bit of a white lie,

because this is the yellow pages, which means

this is a book of companies not people.

But this is all you can find, and at that, it's even hard to find this.

But this is the same thing in analog form, physical form.

So if I wanted to search for someone like John Harvard, how could I do that?

Well, I could start on page 1, and I could

start searching for page 2, page 3, page 4, page 5.

A little hard to do physically, especially since no

one's used this phone book in a lot of years.

But is this algorithm correct, turning page by page, very inelegantly?

Is this correct?

Will I find John Harvard, if he's in here?

All right.

So yes.

This is a little stupidly tedious, because if there's like 1,000 pages,

he might be a few hundred pages into this, but it's correct.

At some point, I will find him, and if he's on the page, I'll be able to call.

Why?

Because presumably, the names are alphabetized in here,

and there's no cheat sheet on the edge.

So I have to search for John Harvard from left to right, searching for H,

if it's alphabetized by last name.

Well, what would be marginally better?

Well, how about two pages at a time?

It's hard to do with a 20-year-old phone book,

where the pages are grown together, but 2, 4, 6, 8, 10, 12.

This algorithm, is this correct?

AUDIENCE: No.

DAVID J. MALAN: All right, so no.

Why?

AUDIENCE: You're skipping pages.

DAVID J. MALAN: Yeah.

So I'm skipping every other page.

So if I don't consider that, and I find myself in like the I section or the J

section, well, I might accidentally conclude,

nope, I haven't found John Harvard yet, just because I skipped him, because it

was sandwiched between two pages.

Now, I can fix this, I think, if I do hit the I section,

well, let me just double back one page, just in case he was in that last page.

So it's recoverable, but it's almost twice as fast, minus that hiccup there.

But what most of us would do, and what your phones

are doing, albeit digitally, is they open up

roughly to the middle of the phonebook.

And they look down, and they say, oh, I'm in roughly the M section.

So I'm roughly halfway through the 1,000-page phonebook.

But what do I now know about John Harvard?

Where is he, to my left or to my right?

All right.

So alphabetically, he's presumably to my left,

and so here I can, both metaphorically and physically,

tear the problem in half.

You don't need to be impressed.

It's really easy down the spine that way,

but I know that John Harvard is to the left here.

But now I can throw, unnecessarily dramatically, half and page one out

of the way, and what do I now know?

I've gone from 1,000 pages to like 500.

I can repeat roughly the same algorithm.

Go to the half of this, and so this time, I went back a little too far.

I'm in now the E section.

So what do I know?

Is John Harvard to my left or to my right?

To my right, so I can, again, tear the problem in half.

Throw this half away, and now I'm really flying.

I'm doing it verbally slowly, but that went from 1,000 pages to 500

to now 250.

And now I can do it again, 125.

I do it again, roughly like 67, and keep doing it again and again and again,

until I get left with, hopefully, just one single page or in this case

an ad for, ironically, a mechanic.

OK, so what is the implication for our performance?

Well, let's just do this sort of in the abstract, if you will,

if that first algorithm were to be plotted just quickly on a chart

without even numbers.

Here's my x-axis, size of problem on the x-axis.

So the bigger the problem, the farther out that way.

Time to solve the problem.

The higher you go up on the y-axis, the more time you're taking to solve it.

How would we draw the running time, the amount of time

taken to run that first algorithm?

Well, it's going to be a straight line.

Why?

Because if you add one more page next year

because more people move to Cambridge, you're

going to add one more page turn potentially, so

one more second, one more unit of time.

So it's a straight line.

And we'll abstract it away as "n."

If there's n pages in the phone book, the slope of this line

is essentially n.

The second algorithm, wherein I was doing two pages at a time,

was twice as fast, but it's still a straight line.

And in fact, let me just draw some dotted lines here.

If the phone book is this big, with my first algorithm,

it might take this many units of time, this many steps, this many page turns.

But with that second algorithm, notice that the intersection is much lower

on the yellow line than on the red.

So n over 2 means there's half as many pages here,

if n is the number of pages.

So indeed, that algorithm-- the second one--

is twice as fast minus the little hiccup that I have to double back one page.

But that's not a big deal if I'm still doing things twice as fast.

But the third algorithm looks fundamentally different.

It looks like this.

Logarithms, if you recall from high school or prior--

if you don't, that's fine too.

It's just a fundamentally different function, a different shape.

And notice that the green line is going up

and up and up but a much slower rate of increase, which means crazy things

are possible.

If two towns in Massachusetts, like Cambridge and Allston,

across the river, merge next year, for instance, in terms of their phone book,

they're phone book just got twice as big.

For the first algorithm, that's going to take me twice as many steps

to go through.

The second algorithm, almost it's going to take me 50% more steps

to go through, two at a time.

But the third algorithm, that I ended with, tearing things again and again,

dividing and conquering, if you will, in half and in half and in half,

how many more steps will my third algorithm

take if Cambridge and Allston merge into a phone book that's twice as big?

AUDIENCE: Four steps.

DAVID J. MALAN: Just one more step, right?

No big deal.

You just take a really big bite out of the problem

once you decide if John Harvard is to the left or to the right.

And so you've made much faster progress.

And so this, in essence, is what your computer, your phone

is probably doing underneath the hood when searching for Harry or Hermione

or Hagrid or anyone else because it's that much faster,

especially when you have large data.

If you don't have that many contacts, it probably

doesn't matter if you search from top to bottom or more

in the form of this divide-and-conquer algorithm.

But if you're the Googles of the world or you're analyzing large data sets,

indeed, this is going to add up quite quickly.

So where do we go with this?

Well, we're going to introduce next something called pseudocode.

How can I translate what I did verbally there,

sort of intuitively, to actual code?

Well, this won't be Scratch.

This won't be C or Python just yet.

It's just going to be an English-like syntax.

And this is how many programmers would start solving a problem.

They don't start typing out code in C or Python or the like.

They use English or whatever their human language is

to jot down an outline for their ideas.

My first step, really, was picking up the phone book.

My second step was opening to the middle of the phone book.

My third step was somewhat different-- look at the page, because why?

My fourth step was if person I'm looking for is on the page, I then do what?

It never happened in my example, but I call the person.

So I'm done.

Else if the person is earlier in the book

alphabetically, as John Harvard was in the case of my H, then

I should search to the middle of the left of the phone book.

And then I should go back to step three.

Step 3 is look at the page, thereby repeating the same process

again and again.

Step 9, though, might be else if the person is later in the book,

then let's go ahead and open to the middle of the right half of the book

and then go back to line 3.

Else there's a fourth scenario we should probably consider,

lest my search process freeze or crash or give me one of those spinning beach

balls with a bug.

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, what if John Harvard isn't in the phone book?

I'd prefer that my algorithm, my phone not just reboot or freeze.

I should handle that with some kind of catch all.

Else, so to speak, let's just quit the program.

So there's well-defined behavior for every possible scenario of the four.

Now, let's call out a few of these salient terms.

It turns out, if I highlight in yellow here,

there's a pattern to what I've been doing here.

These are all of my English verbs.

And in a moment, we're going to start calling those verbs "functions."

When you program or write code and you want the program or the computer

to do something for you, some action or verb,

we're going to refer to those actions or verbs

as these things called "functions," like those here.

By contrast, I've just highlighted, instead,

my "if," my "else if," my "else if," and "else."

This is going to represent what we're going

to start calling a "conditional," a proverbial fork in the road where

you can either go this way or that way, do this thing or this other thing.

And you're going to decide which of those things

to do based on what I've now highlighted here, which are going

to be called "Boolean expressions"--

Boole, referring to a mathematician, last name Boole.

A Boolean expression is just a question with a yes/no, a true/false, a 1 or a 0

answer, if you will.

And it governs whether you do this thing or this thing or this thing or that.

The indentation, in this case, is important.

The fact that I've indented line 5 implies, by convention in programming,

that I should only do line 5 if the answer to line 4 is a yes or a true,

and same for these other indented lines as well.

And the last characteristic here is this here.

Someone called this out earlier, in fact.

These lines, 8 and 11, are now highlighted and represent what?

What might we call these in code if you've done--

yeah, so these are loops, some kind of cycles

that result in my doing the same thing again and again,

but there's a key detail with this algorithm in pseudocode.

Even though it's telling me to go back to line 3,

why is this algorithm eventually going to stop?

Why do I not constantly keep looking for John Harvard

forever by nature of these loops telling me to keep going back to line 3?

Good.

Eventually, he'll be on the page or, to your point earlier, he won't be at all

and we're out of pages, and so we just quit.

And that's the key about going to the left half or the right half.

It doesn't matter if you do the same thing again and again.

You're not going to get stuck in a so-called infinite loop

so long as you keep dividing the problem and shrinking it into something

smaller, smaller, smaller.

Eventually, there's going to be no problem left to solve.

So even if you don't think of yourself as a computer person,

even if you've never written code, what you'll find in the coming days

is that these ideas that we've just kind of harnessed from real life

are at your fingertips already.

And a lot of the process of learning to code

is just going to be some bumps in the road

because you can't quite see the new syntax in a familiar way.

But you'll find that the ideas, in fact, are

going to be more familiar than you might otherwise think.

And so we'll see in a bit-- and we'll take a break

in a moment to take a breather-- that you

will see these same ideas in a moment in the context of Scratch,

an actual programming language via which we'll drag and drop

puzzle pieces to make actual code work.

We'll see some variants of these ideas, things

called "arguments" and "return values" and "variables."

But we'll ultimately convert it into this somehow.

Anyone want to wager what this program will

do if fed to your Mac or PC or phone?

Here's just a massive pattern of zeros and ones.

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: It will indeed say, rather disappointingly, apparently,

just, "Hello, world."

And indeed, baked into all of these 0's and 1's are not just the H-E-L-L-O,

but also the verbs, the action of printing something to the screen.

And there's other stuff too so that the program knows how to start

and how to stop, a lot of stuff that we won't

have to worry about, that whoever designed the computer or the language

did.

But at the end of the day, you're never going

to be writing the 0's and 1's yourselves,

though our ancestors, once upon a time, did in some form.

We'll be using a much higher-level language, like this in C,

or better yet, in just a moment, like in Scratch, like this.

And indeed, this is why today we focus on and begin

with Scratch, this graphical programming language,

so we have a way of expressing ourselves with functions, conditionals, loops,

and more, but in a way that doesn't have stupid parentheses and curly braces

and all of these visual distractions in the way

and will translate that thereafter to this lower-level language.

But for now, that was a lot.

That was definitely a fire hose.

Let's go ahead and take a 10-minute break.

Feel free to get up or stay here.

And we'll resume in a bit with some actual code.

[VIDEO PLAYBACK]

[MUSIC - THE WEATHER GIRLS, "IT'S RAINING MEN"] [MUSIC PLAYING]

[THUNDER RUMBLING]

- (SINGING) Hi.

Hi.

We're your Weather Girls, and have we got news for you.

You better listen.

Get ready, all you lonely girls.

And leave those umbrellas at home.

All right.

Humidity is rising.

Hmm, rising.

Barometer's getting low.

How low, girl?

According to all sources--

what sources, now-- the street's the place to go.

We better hurry up.

'Cause tonight, for the first time, just about half-past 10:00--

half-past 10:00-- for the first time in history,

it's going to start raining men-- start raining men!

It's raining men, hallelujah!

It's raining men, amen!

I'm going to go out.

I'm going to let myself get absolutely soaking wet!

It's raining men, hallelujah!

DAVID J. MALAN: [CHUCKLES] All right, so--

[END PLAYBACK]

[APPLAUSE]

So this then is Scratch, a graphical programming language from our friends

down the road at MIT's Media Lab that indeed some of you

might have used in grade school or the like,

for playing and writing code and the like,

but you maybe didn't necessarily think about how some of these primitives

ultimately worked.

And in fact, everything you've done-- if you've used Scratch before--

and everything you'll see today is going to apply to all of the weeks to come,

as we explore these things called "functions"

and "loops" and "conditionals," "Boolean expressions" and more.

With Scratch, because it's so graphical and animated-congruent,

can you create animations, like this one, interactive art, and software

more generally.

But you'll do so by dragging and dropping

puzzle pieces that only lock together if it makes logical sense to do so.

And you won't have to deal with, in this first week of class,

is curly braces, parentheses, all of the weird symbology

that you might recall seeing, when we just wanted to say, "Hello, world."

Now, this particular program, "Raining Men,"

was written by a former CS50 teaching fellow, Andrew Berry,

who's actually now the general manager of the Cleveland

Browns, the American football team.

And so these are just some of the programs

that some of your predecessors in the class have created.

And you'll see, in the remainder of class here, a couple of others

as well, and more in the course's first assignment, namely, problem set zero.

So how do we get there?

Well, first a quick tour of what it is we're going to do.

This, in Scratch, is perhaps the simplest program you can write.

And even if you've never seen Scratch or any programming language before,

you can probably guess that this just says, on the screen somehow,

"Hello, World."

But what you don't have to do is type esoteric commands and weird syntax,

those curly braces and parentheses I keep alluding to.

You just drag this yellow puzzle piece.

You drag this purple puzzle piece.

Let them magnetically lock together, so to speak.

Click a button and boom.

With those same building blocks and several others,

can you make exactly the sorts of things that Andrew brought to life as well.

So here's what we're about to see.

At Scratch.MIT.edu is a cloud-based programming environment on MIT servers.

You can also download it offline on your own Mac or PC.

And it gives you an interface like this.

On the left-hand side of the screen, you'll see a blocks palette.

These puzzle pieces, a.k.a. blocks, come in different colors

which rather categorize them.

So pictured here, for instance, in blue, are

a whole bunch of motion-related blocks.

So Andrew used a whole bunch of those to have the singer and the men

moving around on the screen in synchronicity

with the song that was playing in the background.

Meanwhile, in the middle of this interface is going to be the code area.

And this is where Andrew, and soon you, will drag and drop

some of those puzzle pieces and other colors as well

and lock them together to get your character-- soon

to be invented-- to do something on the screen.

Indeed, at the bottom right here, will you see, ultimately,

a sprite area, where a sprite is a technical term

for like a character in a video game or a programming environment like this.

By default, historically, Scratch is the cat, the mascot, if you will,

for this programming environment.

And so here we see, by default, just one sprite

selected because on the top right of the screen is the stage for that sprite.

And you can click and zoom in to make it full screen.

But this is the world in which Scratch--

by default, the cat-- will live.

But you can change Scratch's costume so that it looks like a singer or the man

falling from the sky or the like or anything else,

either creating the art yourself or importing some of the things that

come with it or elsewhere online.

So what is this world that Scratch rather lives in?

Well, generally speaking, we won't have to care too much about numbers

because we'll be able to ask questions, like interactive ones,

like is Scratch the cat, or any character

otherwise, touching the edge of the screen, touching something else?

But Scratch does exist in this two-dimensional coordinate-system

world.

So when the cat or any character is dead center in the middle,

that would be xy location 0,0, if you will.

Meanwhile, over here is 240 pixels, or dots, all the way to the right.

So this would be 240,0, where y is 0 because it's right on that midline.

So it's neither up or below.

Over here to the left, of course, would be -240 and 0.

Above the cat would be x equals 0, because it's

right on that vertical midline, and 180.

And then down here, as you might guess, would be 0, negative 180.

Generally speaking, we don't have to care

about those precise pixel coordinates.

But it's helpful, ultimately, if you do want the cat to move up, down, left,

or right.

Having some sense of direction according to the x-axis and y-axis

as well can help you express your ideas, ultimately.

So what might some of those ideas be?

Well, let's do this.

I'm going to go ahead and create, on Scratch.MIT.edu, just

an empty screen like this one here.

And so this is the exact same interface.

But now I'm in my browser, full screen, so that I can start writing some code.

And let's get that cat to say something actually on the screen.

Now, this takes a little bit of practice.

But honestly, just by scrolling through these puzzle pieces can

you quickly get a sense of what's possible, not just categorically,

but specifically.

And I'll jump around because I've done this, of course, before.

But I'm going to go to events, in yellow, first.

And I'm going to drag and drop this first block, called

when Green Flag clicked.

And I've zoomed in there just to make it a little more legible.

And notice that the shape of this Green Flag

just so happens to mirror this Green Flag here

at top, next to this red Stop Sign, of sorts.

And the Green Flag is going to mean go and the red Stop Sign

is going to mean stop, to start or stop our program.

Next week, you're going to be writing a textual command at your keyboard

to do the exact same idea.

But for now, it's a button.

So when Green Flag clicked, what do I want Scratch to do?

Well, how about we have Scratch just initially say something like, "Hello,

world," which indeed, historically, is the first program

that most any programmer might write.

So anything related to what the cat looks like it's doing

is actually going to be under looks, here in purple.

So I'm going to drag over Say "hello."

And you'll notice something curious and different about this purple block.

It says, of course, "Say" in purple.

But then there's this white oval and some text that, by default, is "hello"

because MIT just decided that, by default, the placeholder will

be "hello."

But anytime you see this white oval, it's

an opportunity to provide an input into the function called Say.

And so here I'm borrowing terminology from before.

Problem solving, again, is all about inputs producing outputs.

And in between there is some algorithm.

In a moment, we're going to start referring to algorithms

quite frequently as "functions."

Why?

Because it's the implementation of some algorithm.

So let me override the default with, "Hello, world."

I'll zoom out.

And now if I go to the top right of the screen and click the Green Flag,

we'll see, hopefully, my very first program in code.

Now, it wasn't a huge lift, right?

It only was a matter of dragging and dropping puzzle pieces.

But what has now happened?

Well, it turns out that two things have happened.

When I, the human, clicked on that Green Flag,

I triggered, what we're going to start calling now, an "event."

An event is generally something graphical or interactive that

just happens in a computer program.

You and I trigger events on our phones all day long.

Whenever you tap or drag or long press or pinch

or any of those gestures in vogue nowadays on phones,

you are triggering events.

And people at Apple and Google and elsewhere

have written code that listen for those events

and do something when that event happens.

That's what I just did.

When Green Flag is clicked, I want something

to happen, namely, I want this purple function, this verb, this action called

Say, to do something.

What do I want it to do?

I want it to say what this input is.

And I'm going to introduce another vocabulary term.

The white ovals here are, yes, inputs, very generically.

But in a programmer's terminology, they're

called "arguments," otherwise known as "parameters."

And that just means an input to a function

that modifies its behavior in some way.

When I click Stop, that's just another event.

And that one is just built into Scratch.

Scratch knows that when you click the green Stop Sign,

everything should just stop automatically.

I don't have to write code to support that feature.

So that's all fine and good, "Hello, world."

But if I keep doing stop and start and stop and start,

it's going to do the same thing again and again.

And it's really not that interesting, at the end of the day,

maybe gratifying once, but it'd be nice if this were a little more interactive.

So it turns out that we can do that too.

But we need a different mental model instead.

So in this case here, when we think about this function,

Say, in this input, "Hello, world," this actually

maps pretty cleanly to this model earlier,

that I propose is problem solving, is computer science, if you will.

The input to the current problem is going to be in white here,

"Hello, world."

The algorithm is the "say" algorithm.

Now, I don't know how MIT got it to print out the little, pretty speech

bubble on the screen.

But they wrote those underlying low-level implementation details.

And they gave me and you a purple function, called Say,

that just does that for you.

You and I don't have to reinvent that wheel.

The output of Say is another technical term, now, called a "side effect."

A side effect is usually something visual that happens,

like as a side effect of you calling a function.

And so the side effect here is that the cat

has this speech bubble magically appear, inside of which is "Hello, world."

So we have an input.

We have an output.

We have an algorithm.

But now we're talking about these ideas in the context of programming.

So now the input is an "argument."

The algorithm is a "function."

And the output, in this case, is a "side effect"--

terminology that you'll just hear more and more.

And it'll eventually sink in, but not to worry if the terminology doesn't

come naturally early on.

So what more might I do with this?

Let me go back to Scratch here and make this maybe perhaps more interactive

and actually get the cat to say something a little more dynamically.

So instead of "Hello, world," why don't we

get him to say hello to me or to you or anyone else?

So let me do this.

Let me go under, say--

let me get rid of this first.

And you'll notice this neat trick.

As soon as you start dragging on a block, if it gets close to it,

it kind of goes gray, and it can be magnetically snapped together.

You don't have to do it very precisely.

Conversely, if I want to get rid of a puzzle piece,

I can just drag it anywhere on the left, let go, and that deletes it.

Or you can Right-click or Control-click and a little menu

will let you delete it as well.

Well, let me do this instead.

Under Sensing, which I know is there because I've done this before,

are a whole bunch of things related to Sensing, whereby the cat can kind

of feel out its world, in some sense.

It can do things like ask this question, "Am I touching the mouse pointer?"--

like the user's cursor.

"Am I touching a specific color that you can override to be anything you want?"

"Is the distance to the mouse pointer some specific value?"

But for now, I'm going to focus on this, this blue puzzle piece that

asks a question, which itself is this white oval that I can apparently

change, and then it's going to wait for a response.

But this puzzle piece is a little different.

It's a little special.

It comes with a freebie.

It comes with what we're going to call, technically, a "return value."

So some functions don't just do something on the screen.

They hand you back, so to speak, a value that you

can do anything that you want with.

Nothing happens immediately unless you do something

with that so-called return value.

So let me go ahead and drag this thing over here, ask, "What's your name?"

And I'll use the default question.

That seems a reasonable place to start.

I'm not going to override that default. And now let me go ahead and zoom out.

Let me go back to Looks.

Let me go to Say.

And let me just form the English sentence I want.

So let me zoom in here and type in "hello," maybe comma, space.

I could do "David," but that's obviously not right

because I'm asking for a name, and then I'm like,

in advance, hard-coding my name.

That's not what I want.

I just want, "hello," comma.

And now let me zoom out and grab one more Say block.

Let me maybe Say here.

OK, I don't want to say, "Hello, hello."

I don't want to just type in my own name because, again, then

what's the point of asking the user for their name?

But notice this.

If I go back to the sensing block, this is where that oval that's blue,

called Answer, is useful.

This will be the so-called "return value" of that function.

So I'm just going to go ahead and do this and drag and drop.

Even though it's not the right size, it is the right shape.

And so Scratch will be smart about it and grow

to fill that puzzle piece for you.

Let me zoom out now.

And now let me click the Green Flag.

You'll see that Scratch is indeed prompting me with a speech bubble,

"What's your name?"

Notice the little text box below the cat is asking, what's your name?

So I'm going to type in D-A-V-I-D and hit Enter.

Or I can click the blue check.

Enter.

OK, it's a little weird.

I wanted him to say, "hello," not just my name.

So let me Stop.

Let me start it again.

All right, hello, what's your name?

D-A-V-I-D. Enter.

Huh-- kind of rude.

Why is there this bug?

Like, I wanted to say, "Hello, David," not just "David."

And yet twice it has failed to do so.

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, the computer's processing my directions,

my actions, really quickly.

And so it actually is doing it.

It's just, you and I, in the room, are just way

too slow to notice that it said-- (QUICKLY) "Hello, David."

It just seems to have just said, "David."

So all right, how can I fix this?

Well, here's where you start to poke around and think

about how you might solve this.

Let me go back under Looks.

Maybe there's a smarter way to do this.

Maybe I could do--

OK, I could do this.

How about instead of just Say "hello," there's

apparently another puzzle piece where I can time it so I can maybe slow things

down a little bit.

So let me do this.

Let me throw away all of this.

Let me drag a Say "hello" for 2 seconds.

Let me drag another Say "hello" for 2 seconds.

Let me change the first one to, indeed, "hello" comma.

And then let me go back to Sensing.

Let me grab that same answer because I threw it away a second ago,

and I'll just change it.

I don't even have to delete "hello."

I can just overwrite it like this.

So now I think we'll kind of pump the brakes and see things more slowly.

Let me Stop.

Let me start.

D-A-V-I-D, Enter.

Hello, David.

OK, so it's better, like it seems to be working.

I think your hypothesis was right, just looks kind of stupid, right?

Like, the fact that it's saying Hello--

[PAUSE]

--David, like we can do better.

And like, literally every piece of software on your phone or Mac or PC

is better than that.

It adds words together in the user interfaces you and I are familiar with.

So let's go a little more fishing here.

Let me throw away these.

Let me go back to Looks and just get the simpler Say.

I want this to say, "Hello" comma name, where name

comes from that Answer return value.

So how can I do this?

Well, let me go under Operations, which we haven't been before.

There's a lot of stuff in here.

Some of it's mathematically related, adding, subtracting, and so forth.

You can generate random numbers which might be useful.

And if I keep scrolling down, there's this Join "apple" and "banana."

But that's just placeholder text.

You can join one piece of text with another piece of text,

by default "apple" and "banana."

But let's change it to "hello" and my name.

So this, too, wrong size but right shape.

So let me let it snap into place.

Let me go ahead now and do "hello" comma.

And now I think I just want to go grab that Answer return value.

Let me drag the same oval as before, clobber--

that is, overwrite-- banana.

So now I'm kind of composing functions.

The output of one function, Join, is going

to be the input of another function, Say.

So let's see what happens now that they're kind of stacked on top

of each other or nested, so to speak.

Click the Green Flag, D-A-V-I-D. Enter.

"Hello, David."

All right, that was pretty fast.

Let's just do it once more.

Stop.

Start.

Here we go, D-A-V-I-D. Enter.

OK.

All right, it's not the most exciting program in the world.

But it's more correct.

It's better designed just because that's what you would kind of expect

the software to do and not be some kind of lame user interface that's just

inserting random delays to just make it kind of work, like that's

a workaround, a hack, if you will.

But there's some cool things you can do with Scratch.

And we won't really go down the rabbit hole

of all of the fun and family-friendly features that it has.

But there is one that's kind of cool here.

Let me go into the Extensions button at the bottom left of my screen.

And this one's kind of cool.

Let me go to Text to Speech.

And you'll notice that this one requires internet because it's cloud based.

But this just gave me some new puzzle pieces in a new category,

Text to Speech.

And these green ones do exactly what they say.

So let me do this.

Let me zoom out again.

Let me keep the Join block.

And I'm just going to temporarily toss it over here.

It's not going to delete itself because I didn't drag it over

to the other side.

But I'm going to get rid of the Say block, in purple.

I'm going to do the Speak block here, in green, and let it snap into place.

And then I'm going to drag and drop this onto the input to Speak.

And now, perhaps a little more adorably, let's try this.

Green Flag, what's your name?

D-A-V-I-D. Enter.

And--

COMPUTER: Hello, David.

DAVID J. MALAN: OK.

[LAUGHTER]

It's a little robotic.

But at least now it has synthesized speech.

And I've kind of got my own, like, Siri or Google Assistant or Alexa

thing going on here now, where it's now recognized whatever text

it is, and it's played it.

Well, let's make this an actual cat that doesn't talk in that weird human voice.

Let me go ahead and get rid of most of this stuff.

And let's get the cat to actually meow, like a cat tends to.

And let me go under the Sounds block.

Now MIT gives you a few sounds for free because it's designed around a cat,

by default. And I'm going to go ahead and grab

this one, Play Sound Meow until done.

And now-- and we heard a teaser for this earlier in the crowd--

[MEOW]

It's a little piercing, admittedly.

Maybe we can lower the volume a little bit there.

But notice, if I want the cat to meow a second time, I'll just click it again.

[MEOW]

OK, and over there, too, I hear--

[MEOW]

OK.

[MEOW]

All right, so it's kind of cute now, right?

So it's just meow--

OK, yes, echo, echo.

So it's meowing now every time I hit the Green Flag.

Now, that's great, but even a kid is probably going to--

[MEOW]

--like would prefer that it--

[MEOW]

--just meow, perhaps, like again and again, without having to keep--

[MEOW]

--hitting the button.

So how might we do this?

All right, well, if I want it to meow multiple times, why don't I just, like,

grab it another time and another time?

Alternatively, you can Right-click or Control-click a puzzle piece

and just duplicate it from a little menu that drops down.

So here we go, three meows.

[MEOWING]

All right, that's not really a happy cat.

It sounds maybe hungry.

So can we slow that down?

Well, maybe.

In fact, if I poke around, let me go under Control.

It looks like there's a Wait block.

Wait 1 Second, by default. And notice, Scratch will be pretty accommodating.

If you just hover in between blocks, it will grow to fill that too.

So I could change it to 1 or 2 or anything, seconds.

I'll just leave it at the default for now, 1.

And now I'll go ahead and do this.

[MEOWING]

OK, so cuter and less hungry and just more friendly.

But this isn't the best design.

It is correct.

And let's use that as a term of art.

Correct means the code does what you want it to do.

I want the cat to meow three times slowly.

And it did.

So I'd wager this is correct.

But it's not the best design.

And this is where things get more subjective, right?

Like, you could write accurate sentences in an essay for an English class,

but otherwise, it's just completely a mess.

Like, your arguments here and there, and you don't say anything wrong,

but you don't say it well.

In the context of code, we can do better than this.

And Copy/Paste or repeating yourself again and again tends

to be bad practice.

Why?

Suppose that you want to change the Wait to 2 seconds instead of 1.

It's admittedly not a big deal.

Fine, I click there, I change it to 2.

I click there, I change it to 2.

But what if you meow 5 times, 10 times?

Now I have to change the Wait, like, in 5, 10 different places.

Like, that's just stupid.

It's taking unnecessary human time, and you're going to screw up eventually,

especially if your program is getting longer.

You're going to miss one of the inputs.

You're going to leave the number wrong.

And that's a bug.

So just based on what you've seen already

or if you've program before, which a few of you have,

what's the term of art here that will solve this?

How can we design this better?

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: I heard it here.

Yeah, so a loop-- a loop, some kind of cycle that says, do that again.

Do that again-- not infinitely many times, necessarily,

but some finite number.

Well, you can perhaps see a spoiler on the screen.

Under the same orange Control category is a Repeat block.

And by default, it's proposing 10.

But we can change that.

So let me do this.

I'm going to throw away most of this Copy/Paste as redundant.

I'm going to detach this temporarily just to make room for something else.

And I'm going to drag a Repeat block over here and let that snap into place.

And I'm going to change it for now, just to be 3, for consistency.

And this is the correct shape even though it's too small,

but Scratch will accommodate that for us.

And now-- same output but arguably better designed.

Why?

Because if I want to change the number of meows, I change it in one place,

no Copy/Paste messiness.

If I want to change the waiting, one place.

I don't have to change it in multiple places and not screw up.

So let me hit the Green Flag.

[MEOWING]

All right, so-- nice.

Now, it would have been nice if MIT had just given us a meow block that

just automates all of this for us.

Let me wager, they gave us the low-level implementation details.

They gave us the Play Sound Meow.

But I had to implement a decent number of blocks

just to get a cat to meow again and again.

I feel like we should have gotten that for free from MIT.

Well, they don't have to be the only ones that invent blocks for us to use.

You can write your own functions, your own verbs or actions.

So how can we do this?

Let's make our own puzzle piece, called Meow, that uses this code

but creates it in such a way that it's reusable elsewhere.

So let me do this.

Under my blocks in pink here, I'm going to go ahead and click,

literally, Make a Block.

Now, here's an interface by which I can give the block a name.

M-E-O-W will be the name of this block.

And I'm just going to go ahead and quickly click OK.

That just gives me a very generic, pink puzzle piece

that starts with the word Define because scratch

is asking me to define, that is, implement or create,

this new puzzle piece for me.

Well, what does it mean to Meow?

I'm going to claim that it means to do these two steps, to play the sound meow

and then just wait for 1 second.

But what's powerful about this idea is look at this up top.

Now that I've made a block, it exists in Scratch.

MIT didn't need to create this for me.

I created it for myself and even you, if we end up sharing code.

So I can now drag Meow up in here.

And what's nice about Meow is that itself is, yes, a function,

but it's also an abstraction.

Like, never again do I or even you need to worry or care about what

it means to meow or implement it.

I can sort of drag it out of the way.

I didn't delete it-- drag it out of the way.

Out of sight, out of mind.

Why?

Because my code is now even better designed, in some sense,

because it's more readable.

What is it doing?

When the Green Flag is clicked, repeat 3 times Meow.

It just says what it means.

And so it's a lot easier to read it, and it's

a lot easier to think about it, especially

if you're using Meow in other projects too.

Now, let me go ahead and click Play.

[MEOW]

Same thing.

[MEOW]

So it's not really fundamentally any different.

[MEOW]

But I can make this custom puzzle piece, this own function of mine, Meow,

even more powerful.

Let me kind of rewind a bit and go to my Meow puzzle piece.

And I am going to Control-click or Right-click on my pink puzzle piece.

And I'm going to edit it.

So I kind of regret making Meow so simple.

Wouldn't it be nice if Meow took an input, a.k.a.

an argument, that tells Meow how many times to meow.

Then I can get rid of that loop and just tell

Meow how many meows I actually want.

So I'm going to click on another button here called, literally, Add an Input.

And it's going to have placeholder here.

So I'm just going to put a placeholder there.

I keep using "n" for number, which is a go to in computer scientist terms.

And I'm going to add some descriptive text just so that it's

a little more self-explanatory.

I'm just going to say Meow n Times.

But there's only one oval.

Times is just going to be explanatory text.

And now notice what has happened.

Now my puzzle piece takes an input, a.k.a.

an argument, that will tell that function to meow some number of times.

But it's not just going to work magically.

I need to implement that lower level detail.

So let me zoom out.

I have to remind myself what this function was.

So I'm going to drag it higher up just so they're

on the screen at the same time.

I'm going to go ahead now and temporarily move this over here.

I'm going to temporarily detach this over here.

Why?

Because what I thing I want to do is move my loop into the function itself,

move the Play and the Wait into the loop.

But I don't want a hardcode 3.

Notice that n here is its own oval I can drag a copy of n

and just let it go there.

So now I have a new version of Meow that takes an argument, n,

that tells Meow how many times to meow.

And now let me, again, drag this out of sight, out of mind,

because who cares how I implemented it?

Once it's implemented, it's sort of done.

Now my program is even better designed, in some sense.

Why?

Because now it really just says what it means.

There's no loop.

There's no repeat, no implementation details.

When Green Flag Clicked, Meow 3 Times.

And so functions indeed let you implement algorithms,

like they're just code that do something for you.

But they're also themselves abstractions.

Why?

Because once a function exists, it has a name.

And you can think about it in that term.

And you can use it by its name.

You don't have to care or remember how the function itself was built,

whether it's by you or even MIT.

So again, here I'll click the Green Flag.

It's the same thing.

[MEOWING]

So still correct, but better and better designed.

And so any time, here and out, with Scratch, or soon C,

and eventually Python, when you find yourself doing anything

resembling Copy/Paste or again and again grabbing the same code, probably

an opportunity to say, wait a minute.

Let me refactor this, so to speak, that is, rip out

the code that seems to be repeated again and again

and put it in its own function so you can give it a descriptive name

and use and reuse it.

Any questions just yet on now saying or these loops or these functions

that we're using?

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: How did I make it so it meows three times?

So I originally only had a puzzle piece called Meow.

And I decided to improve it.

So I held down Control and I Right-clicked or Control-clicked

on the pink puzzle piece at top left.

And I clicked Edit.

And that brought back the original interface

that lets me add some arguments to the puzzle piece itself.

And I clicked Add an Input on the left here.

And then I clicked on Add a Label over here.

So that just lets you customize it even further.

All right, so we've done this.

Let's add one of those other primitives too to do something optionally.

So how about we make the cat meow only if it's being petted by a human,

as by moving the mouse to hover over the cat, like a human would pet a cat?

Well, let me go ahead and throw away the meowing for now.

And let me simplify it by just using a sound.

I'm going to go ahead and do this.

I'm going to go ahead and have a Control block that

says If, because I want to implement the idea of if the cursor is touching

the cat, then play sound meow.

Or I could use my same pink puzzle piece.

But I'm going to throw that away and focus only now on the sounds.

And I'm going to do this.

If touching mouse pointer-- so I need to sense something about the world.

And we saw this earlier--

so If Touching Mouse Pointer.

So notice this shape here, way too big.

But it is the right shape.

So if I hover just right, it'll snap into place.

And this now, in blue, is my Boolean expression, a yes/no question,

true false.

"If" is a conditional.

And what do I want to do?

Well, if the cat is touching the mouse pointer,

I want to go ahead and play sound meow until done.

So let's do this.

I'm going to hit Green Flag, click.

Now nothing's happened yet because it's a conditional, right?

It's only supposed to do something if I'm touching the cat.

Let me move the cursor over to the cat.

And-- wait for it.

Hmm-- another bug.

Why is the cat not meowing even though I very explicitly

said, If Touching Mouse Pointer, Meow?

Yeah, in the middle--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, this is-- again, my computer's

just so darn fast, like yours.

I click the Green Flag, it asks the question,

am I touching the mouse pointer?

Well, no, because my cursor was up there, not touching the cat.

It's too late.

The cat's out of the bag.

And so we have to instead solve this by some other means.

How can we fix this?

How do we fix that sort of race?

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, so why don't we just keep

asking the question until I eventually am or am not actually petting the cat?

So let me detach this temporarily.

Let me go under Control.

Let me go under-- instead of repeat some finite number of times,

let's just do it forever.

So sometimes loops that do work forever are a good thing.

The clock on your phone, that's in a loop

forever because you want it to always tell time and not

stop at the end of the day.

So sometimes you do want code to loop forever, as in this case.

So let me go ahead and drag and drop it there.

Let me, again, click the Green Flag.

Nothing's happening yet.

But notice, the program is still running.

And so if I move my cursor, move my cursor, move my cursor, and--

[MEOWING]

OK, so maybe we could add some Waiting.

But the cat does not want to be pet, in this case.

But it's indeed conditional.

So there we have an incarnation in Scratch

of doing something conditionally.

Now, we can make this really cool, really fast, if you will.

Let me stop this version.

Let me go ahead and do this.

Let me go ahead and throw all of this away.

Let me go into my little Extensions bucket over here.

And let me do Video Sensing, since most laptops or phones these days have

cameras.

And there, indeed, I am, with Sanders behind me.

And let me do this.

When Video Motion-- and let me get out of the way.

When Video Motion is Greater Than some value.

So 10 is the default. This is just a number that measures how much motion

there is or isn't.

So small number is like no motion.

Big number is lots of motion.

So I'm going to choose 50, somewhat arbitrarily here-- so 50.

This is not normal to program off to the side.

But I'm now going to say this.

When Video Motion is 50, go ahead and Play Sound Meow like this.

So the cat is still in that world.

I'm going to stop the program and rerun it.

So here we go, Green Flag.

And now here comes-- all right, this is a little creepy,

the way I'm petting the cat, but--

and-- [SIGH]

[MEOWING]

OK.

[LAUGHTER]

There we go.

OK, so 50 was too big of a number.

I have to pet the cat faster.

[MEOWING]

Whereas this, if--

I don't know--

[LAUGHTER]

Yeah, so--

[MEOW]

OK, so you can make things even more interactive in this way

by just assembling different puzzle pieces.

And honestly, there are so many different puzzle pieces in here.

We're not going to even scratch the surface of a lot of them.

But they generally just do what they say.

And indeed, when you see on the screen here this pallet

of puzzle pieces, really a lot of programming, especially early on,

when learning a language, is just trying different things and try and fail.

And if it doesn't work quite right, look for an alternative solution

there too, as even I just had to do a moment ago.

Well, let's go ahead and use, actually, how about another example of something

a predecessor of yours made?

Let me go ahead and grab a program I opened in advance here called

Whack-A-Mole Might we get a brave volunteer to come up,

who is willing to whack a mole with their head, virtually?

Maybe-- OK, let's see, how about in way back?

You want to come on down?

All right, come on down.

Sure, a round of applause for our volunteer.

[APPLAUSE]

All right, so here we have--

come on down.

AUDIENCE: Hi there.

DAVID J. MALAN: What's your name?

AUDIENCE: I'm Josh.

DAVID J. MALAN: Oh, actually, say it into the microphone.

AUDIENCE: Hi, I'm Josh.

DAVID J. MALAN: OK, nice.

Welcome, Josh.

Come on over.

[APPLAUSE]

All right, so same idea here--

I'll take the mic back.

You'll have to stand in front of the camera.

In just a moment, you're going to have to position your head in a box

that your classmate from yesteryear created.

[MUSIC PLAYING]

And we'll start with Beginner.

AUDIENCE: OK.

DAVID J. MALAN: So line your head up in the box in a moment.

AUDIENCE: All right.

[LAUGHTER]

DAVID J. MALAN: Nice.

12 seconds.

5 seconds.

Notice the score's up to 18 already.

Pretty good.

All right, a round of applause for Josh, if we could.

[APPLAUSE]

So notice how using some fairly simple primitives,

things do get interesting pretty fast.

And how was that implemented?

Well, there were probably at least four sprites.

So you're not confined to just one cat.

You can create more and more sprites, change what they look like.

So they actually look like a mole, in this case.

There's probably some conditionals in there, some loops for 30 seconds.

That's checking if Josh's head's movement is exceeding

some value over this way or over this way,

then increment something called a variable.

We'll see those too.

Just like in algebra you might have x and y

and z, storing values like numbers, so can computer programs,

have variables called x or y or z, or more descriptively called Score,

as in this case at top right, or another variable

called Countdown, typically one word in code, but in this case

two words, that just store some value.

So there's probably some math going on in there

whereby the author of this program just is incrementing, that is,

adding 1 and 1 every time it detected that a mole had been whacked,

in this case, with movement.

So back in the day, I, myself, actually implemented my very first program

in Scratch when I was a graduate student, actually, at MIT--

cross-registered at MIT, taking a class from MIT's Media Lab,

specifically, the lifelong kindergarten group, which is the group that created

Scratch, itself.

And the program I wrote all those years ago and still

rather cling to is a little something here

called Oscartime, that I thought I'd play just a quick excerpt of myself

here.

So in this case, consider, as the music starts playing,

how this program, which is much more sophisticated, certainly,

than the earliest "Say hello" examples we just did might also be implemented.

Let me go ahead now and click the Green Flag.

[MUSIC - OSCAR THE GROUCH, "I LOVE TRASH"]

OSCAR THE GROUCH: (SINGING) Oh, I love trash.

DAVID J. MALAN: OK, so some trash is moving, presumably in some kind of loop

from the top.

If I'm touching the mouse cursor, it follows me.

If I hover over the trash can, it responds.

If I let go, in some kind of loop, Oscar pops out,

creates a variable with the current score.

And it happens again.

OSCAR THE GROUCH: (SINGING) It's awful, the holes.

And the laces are torn.

A gift from my mother the day I was born.

I love it because it's trash.

Oh, I--

DAVID J. MALAN: It's pretty easy at first but--

OSCAR THE GROUCH: (SINGING) --anything dirty or dingy--

DAVID J. MALAN: So I don't need to keep playing this up

on stage in front of everyone.

So my score is already now up to some 6 or so.

But in a moment, too, you'll see that it's going to escalate.

So I'm taking into account some time apparently.

So now--

OSCAR THE GROUCH: (SINGING) I have here some newspaper, 13 months old.

DAVID J. MALAN: So more and more sprites are suddenly appearing.

And notice, that each time they're appearing

from a different part of the screen.

That's an illusion, perhaps, too, that--

pick a random number between x and y.

So you can actually pick some range of values

to have the game constantly changing.

And indeed, I'm going to go ahead and click Stop,

since I spent like eight hours plus, years ago, making this.

And I can never listen to the song again,

not that I should be anyway at this point in my life.

But this song is synchronized then with a lot of the actions that's happening.

And ultimately, there's just a lot of building blocks.

But I didn't sit down and implement Oscartime, as I called it, all at once.

I really did take baby steps, so to speak.

And I figured out, well, how could I decompose this vision I had at the time

to create this game ultimately?

And how do I bite off maybe the easiest parts first?

And honestly, the first thing I did was I found this image, and I just dragged

and dropped it into Scratch--

OK, done-- like, lamppost is installed.

It doesn't do anything.

It's not interactive.

But I at least set the stage, so to speak, for the program.

Then what else might I have done?

Well, let me do this.

Let me go ahead and open up in another editor here

an early incarnation of Oscartime by doing this.

Let me go into Oscartime here.

Let me full screen this.

And here you have--

let me hide the trash for just a moment--

is what I might call the second version of my program, wherein,

at the top right of the stage here, I had the lamppost, which I just

dragged and dropped and got going, but then I added an actual sprite.

And it has to be a sprite if you want it to do things interactively.

The lamppost-- not a sprite.

It's just an image a costume, if you will, for the whole

stage itself, a backdrop.

But this thing is indeed a sprite because it

needs to respond to code and events, like dragging and dropping.

So what might I have done early on with that code?

Well, maybe the first version would have been

something like this, whereby my very first version of Oscartime

might have said something like, oh, this.

How about, let me control the program as before-- or, rather, events.

When the Green Flag is clicked, what do I want to do?

Well, I want to go ahead and forever do something like this.

Forever-- so I want the lid to open up if I touch it.

So if the cursor gets near the lid, I want the lid to open up.

And then if I move away, I want it to close.

So how can I do that?

I want an If, but I just don't want one question, I really want two,

a fork in the road that goes left or right, so to speak.

And let me grab this puzzle piece here, as I did long ago.

So notice, it grows to fill.

What's the question I want to ask?

Well, under Sensing, I'm going to go ahead here

and say If this trashcan is Touching the Mouse Pointer--

what do I want to do?

Well, I want to change what the trashcan looks like.

And this part, I did in advance of class.

If you go up here to Costumes, this is where all the graphical stuff happens.

And you'll see that I imported a whole bunch of different costumes

that effectively, much like a video, when you play them quickly,

creates the illusion of movement, some animation.

But it's really just dot, dot, dot, dot, dot--

different images showing on the screen.

Well, some of these costumes are called like Oscar1, Oscar2.

Oscar1 is closed.

Oscar2 is open.

So let's just deal with those first.

So if I'm touching the mouse pointer, let me go under-- how about Looks?

And we didn't use this before, but there's this block,

Switch Costume to Something Else.

I'm going to drag and drop this inside of the If.

And notice it's a little bit indented.

I'm going to change it not to Oscar8, but Oscar2.

Otherwise, If Not Touching the Mouse Pointer--

this is the other direction in the fork in the road--

let's go ahead and switch the costume back to what I described as Oscar1.

So let me run this program.

And not much of interest is happening yet.

But notice, if I move the cursor up, down--

but how is that working?

It's just changing the costume that's being overlaid on the sprite.

So it looks like interactivity, but you are really

just changing the aesthetics.

And we humans are just kind of assuming, oh, it's opening up.

Well, no, it's just changing a costume.

So here's the difference.

The high-level abstraction-- trashcan opening.

The lower-level implementation detail-- costume

changing, creating that illusion.

And if I want it to look prettier, I could just have many other costumes

and go boom, boom, boom, boom, boom to create more frames per second,

if you will.

So I need to do one other thing.

Maybe if I accidentally leave the trashcan open,

let me make one change here.

Let me make sure that the very first thing

I do when the Green Flag is clicked, is always start with the trashcan

closed because otherwise, you might accidentally leave it open.

So this gets me into some default state.

So now it's always closed until I manually hover over it instead.

Well, what might I have done next?

Well, if I wanted to introduce something like the trash, I need a second sprite.

And here, in advance, I grabbed the image already.

Let me pretend that this never happened.

Let me drag this away here.

And now I have nothing in my code area for this piece of trash.

But it is the second sprite.

And all I did was I clicked on the little cat plus icon here,

created a second sprite.

I named it trash.

I added a costume for it.

Sort of the aesthetic stuff, I did in advance.

But here I'll do now the code.

How do I want to do this?

Well, how about when the Green Flag is clicked, for the trash can,

I want the trash can in parallel to do--

I want the trash, the piece of trash, to do its own thing.

So what I want it to do is maybe let's do Motion, how about?

And let's go to a specific coordinate.

Now, there's a lot of options here.

There's Turning, Go to a Random Position, Go to x,y, Glide,

more elegantly.

There's a lot of different ways to implement movement.

I just want it to go to a very specific location first.

So I'm just going to go to x,y first.

And I'm going to say x, how about, will be--

let's not hardcode this.

Let's just have it be-- well, let's do it at 0, initially, and then 240.

So-- whoops-- let's do 0,240 so that this piece of trash

always starts at the top middle of the screen.

If you think back to that coordinate system, 0,0 is in the middle.

240 is straight above it.

All right, now, after I do that, what do I want to do?

Well, how about I control this thing by forever falling.

Now, how do I make the trash move?

We haven't seen this puzzle piece yet.

But under Motion, the very first thing is called Move Some Number of Steps.

By default, it's 10.

But we'll do it more simply.

Let me go ahead and move--

oh, sorry.

Move is going to move it in whatever direction it's facing.

I only want it to move down.

So here, even I'm getting confused as to how many different ways there

are to do things.

What I thing I want to do is this.

Let me only change my y-axis as follows.

So here's another puzzle piece called Change y.

So again, y is the vertical.

So let me just change y by one pixel downward

at a time, so -1 one pixel at a time.

So it's kind of slow.

And I think now--

I think that's it.

Let me hit Stop.

Notice that my trashcan is still going to be interactive.

I haven't changed or deleted that code.

I've just added now code for my piece of trash.

If I click the Green Flag, notice that--

after I enable it-- let me start that again.

I had it hidden for before class.

But let me enable it now--

Green Flag, notice it starts dead center, at x equals 0, y equals 240,

and it's dropping one pixel at a time.

If that seems a little boring, we can change it to -10 pixels at a time

and, boom, it's done.

So that's how you might change the speed of a program.

But I'm going to leave it more simply as -1.

And honestly, it would be nice if it doesn't always start from the top.

Otherwise, this game is not going to be very interactive.

I'm literally going to be grabbing the trash from the same place every time.

So why don't I, instead, Stop this.

Let me go under Operators, and let's pick a random number.

So let me change the hardcoded--

the manually inputted-- 0, and let's make x be somewhere between 0,

so in the middle and all the way over to--

what was it-- oh, I got my numbers wrong--

240 and my y will be 180.

Sorry, I got my x and my y confused.

So let me play this again.

And now we have a game that's more like games

you might have played growing up or even now,

like there's some randomness to it.

So the CPU, so to speak, is doing something more interesting.

Let me run it again.

Now it's a little to the left.

Let me run it again.

Now it's a little more to the left.

Again-- now it's back to the right.

So randomness just makes games more interesting.

And this is why when you play any video game, if different things are

happening, there's probably just some randomness.

And it's quantized as just a simple number.

Now, I think I just need one final flourish here, if I may.

Let me go ahead and add this.

How about Events-- or rather--

yes, Events.

When Green Flag is clicked, I can do multiple things within the same sprite.

They don't all have to be attached to the same one.

Let me go ahead and forever go ahead and do something else.

How about, Whenever the Trash is--

how about-- Touching the Trash Can--

so Forever If-- let's see, I need a Sensing block.

So how about, Is Touching--

not the Mouse Pointer, this time, but Touching Oscar himself there.

Now let's see what happens.

All right, so let's go ahead and click the Green Flag.

Now I go down over here and let go.

OK, I kind of want it to go into the trash can.

How do I make it go into the trash can?

How can we take this high-level idea, put trash into the trash can,

and make it seem to disappear?

Logically, what could we do?

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: OK, so when it touches it, let's have it disappear.

So I could hide it.

Or honestly, if the game is going to be ongoing, like it was,

letting me drop more and more trash, let me just

have it go ahead and pick a new random location.

So let me do this.

Let me go ahead and Copy this puzzle piece up here and Duplicate.

And I don't want the whole thing, sorry.

Let me get rid of this.

Let me just do this.

Let me go back to some random location at the top.

So now notice what happens.

If I click and drag on it-- here it goes--

and I let go, it looks like it's going into the trash can

because it snaps back up to some random location.

Now, the only thing I'm not doing really is keeping track of any kind of score.

And it turns out, if I full screen this, it's not going to be draggable,

by default.

So just as a corner case, so to speak, something

that you might trip over otherwise, let me go ahead and under, let's

see, Sensing, it turns out I also need this for the piece of trash.

There's this way of setting, in Scratch, a sprite

to be draggable or not draggable.

I need to explicitly make it draggable so

that when I do full screen this thing now,

it still remains draggable and someone like myself

can play it again and again.

Well, how about we supplement this with one final flourish?

Why don't we keep track now of the user score?

So how about, when the user actually drags the piece of trash

to the trash can, let me go under Variables here,

where, in advance, I've already made myself a variable called Score.

I could have called it x or y or z or ABC, but that's not very descriptive.

In programming, you typically give things a more descriptive English,

or some other language, name.

So I called this one Score.

So how do I want to do this in my Score?

Well, let me go ahead and initially set this game

score to 0 at the very top of one of these scripts--

one of these programs up here.

And then any time my piece of trash is touching

Oscar, let's not just jump to the top, let's change the score by 1 up here.

So now notice, If Touching Oscar, Change the Score-- that is,

Add 1 to the Score--

and then Pick a new Random location.

And now Green Flag--

let's do this slowly.

Here it goes.

The trashcan opens.

I let go.

And now notice, at the top left of my program, notice the score is now 2.

Notice the score, if I do this again, is about to become 3.

And so here we have building blocks, literally,

of making this program better and better and better.

And so, indeed, that's how you generally approach solving any problem with code,

be it in Scratch or C or Python or some other.

You take this vision you might have or some vision

you've been assigned in a homework assignment

and try to break it down into these constituent parts

and just pluck off the easy ones first.

Put the lamp post there first, and at least

feel like you're making some progress.

Then pluck off something like the trash can, and just

make it do a little thing.

And it doesn't have to be in some same order here.

I could have done this in a million different ways.

But figure out what the small pieces are that, ultimately,

like a few of the problems we've solved today, assemble into a greater solution

there too.

So that you have now a mental model for these types of blocks and others,

let's return for a moment to this.

We saw a moment ago that when I started saying, "Hello, David,"

and nesting those puzzle pieces, we had a whole different paradigm altogether.

My input for that second version of, "Hello, world," was to now pass in,

for instance, "What's Your Name?"

into my function, called Ask.

That gave me not a side effect, but what I called,

again, a return value, called Answer, by default, in Scratch.

And now notice and recall, when I had that same output

become the input to my next block, it looked a little something like this--

Say.

So how does this type of block and this nesting, this stacking of blocks,

fit into the same mental model?

Well, same idea-- my input for that part of the story is now taking in not one

input but two--

two arguments-- "hello" and the answer from before.

The function, in this case, is that new block called Join.

The output thereof is, "Hello, David," which itself became--

if we sort of animate this--

the input to my final function, which indeed was still Say.

And this is only to say-- no pun intended--

that almost everything that you do with these puzzle pieces,

be it in the context of Oscartime or the mole whacking

or even just something simple like, "Hello, world,"

will ultimately fit into that relatively simple mental model there.

Now, I thought we'd end by taking a look at just a couple of final examples.

These ones, too, made by some of your predecessors.

And for this, I thought we would not write code together,

but read it instead.

And so allow me to open up one other example here

that will show us a few different versions of a program

that a predecessor made.

Give me just a moment here.

And we'll see how we might build up to something even more interactive.

And in just a moment, we'll see something

they called Ivy's Hardest Game, focused here on these particular mechanics.

So here is version 0, so to speak, of this program, wherein

the goal was to create a game where you have to get out of some kind of maze.

And you have to get out, in this case, the Harvard crest from this maze.

Let me go ahead and just hit Play on this Green Flag

so you can see what the first building block for this program might have been.

Notice that my hand here is actually on the Arrow keys on my keyboard.

And it seems that by moving up, down, left, or right,

this little crest on the screen responds in exactly that way.

Now, let's hypothesize for just a moment.

Even though we've not done anything quite like this before,

how might this code be implemented?

How do you get a sprite, be it a cat or a crest,

to respond to keys on a keyboard-- might you think intuitively?

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, there could be something

sensing what key you're pressing on.

And if you do it again in forever a loop,

you'll just constantly be listening for keystrokes.

And this is how, like, every piece of software nowadays works.

It's constantly waiting for your phone to be tapped

or something to be typed on the screen.

So let me go ahead and look inside of this existing program here.

And there's more going on, but we'll take a quick glance

what's actually going on.

Well, up here at top left, notice, we just

have Go To x Equals 0 and y Equals 0.

That means put the Harvard crest dead center in the middle of the stage.

Then we have Forever two functions that we

made in advance as custom functions--

Listen for Keyboard, Feel for Walls.

So it's doing two things at once.

It's forever listening for the keyboard-- up,

down, left, right-- and feeling for the walls,

in the sense that if I get too far to the left,

I don't want it to keep moving past that black wall.

And if it moves too far to the right, I don't want it to blow through that wall

either.

So it's going to do two things constantly, listening for keyboard

and feeling for walls, so to speak.

And how are those implemented?

Well, this one's a bit long.

But on the left here is Listen for Keyboard.

So this pink puzzle piece, Listen for Keyboard,

first checks If the Key Up Arrow is Pressed, question mark,

Boolean expression in a conditional, Change y By 1.

That means, move it up 1.

Else If the Key Down Arrow is Pressed, then Change y by -1,

and similar for Left Arrow, similar for Right Arrow.

And even though there's not a loop in this pink function,

there is where I'm using it.

So it's constantly being asked again and again.

How about feeling for walls?

Well, over here to the right--

it's a little cut off-- but here you have, If Touching Left Wall,

Change x by 1.

So if you hit the wall, it's too late.

You're kind of blowing through it already.

So I want to move it back one pixel so it's no longer touching that wall.

Similarly, if it's touching the right wall, I want to back it up one pixel

so it's no longer touching that wall.

So it's kind of like bouncing off ever so slightly so that it

doesn't slip through that actual wall.

And what are those walls?

Well, notice down here, it's just a simple sprite with a black line

that I've oriented vertically instead of horizontally.

And that's just so that I can ask questions of these other two sprites.

Now, that gives me that form of interactivity.

What more can I now do?

Well, what if we make things a little more interactive here?

Let me go ahead and see inside version 1 our second.

And let me propose what's going to happen here.

Well, how might we add a little something like Yale into the mix?

Well, what's Yale going to do when I hit the Green Flag now based on this code?

Any hunches?

Here is the code for my Yale sprite.

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, it's kind of going to be

an adversarially by blocking my path, theoretically,

if I keep writing more code.

So why?

It too goes to the middle of the screen.

It points in direction 90 degrees.

So similarly, there's a whole degree system as well.

And it forever asks this.

If Touching the Left Wall Or--

notice the green block--

Touching the Right Wall, then just Turn around 180 Degrees.

And indeed, if you think this through logically,

that just means you're bouncing this way and this way

by just flipping yourself around 180 degrees for just this Yale sprite.

So if I go ahead and zoom in on this and click the Green Flag,

I can still move up and down.

But Yale is just kind of doing this all day long, back and forth

and back and forth, forever.

Nothing bad happens if I try to go through it.

But we could add that, certainly, to the mix.

In fact, let's add one final feature before we play this particular game.

And let me go ahead and open up the final version of these building blocks

that adds MIT to the mix.

So here is MIT.

Someone want to explain what this code does?

And this is what we're doing.

This itself is a skill.

Reading someone else's code and understanding it

is half of the part of programming besides writing.

Yeah--

AUDIENCE: [INAUDIBLE]

DAVID J. MALAN: Yeah, it's chasing down the Harvard logo outline.

So this is apparently the name of the costume

that this student made, Harvard logo outline.

And apparently, it goes to a random position first.

But then it forever points to Harvard.

So no matter where I'm moving it, up, down, left,

or right, MIT is being a little more strategic than Yale,

bouncing back and forth like this.

So let's go ahead and play this one in full screen.

And here we have a Green Flag.

So if I move up, MIT, rather strategically,

is following me no matter where I go.

All right, so still, nothing bad happens.

But now it's struggling, right?

It's going up, down, up, down.

It's trying to follow me even though I'm not moving.

So we need some final flourishes.

And so I think, for this, we need perhaps one final volunteer.

After this, cake awaits for everyone outside,

as is an end of first lecture CS50 tradition.

Would you like to come up and be our volunteer?

[APPLAUSE]

All right.

And so this will be the actual version but written by one of your predecessors

that I'll full screen here.

It's going to stitch together all of these same primitives and more,

but add the notion of scores and lives so that there's actually

a goal, which in this case is to move the Harvard crest to constantly pursue

the character on the right-hand side so that your sprite touches that one.

Would you like to introduce yourself?

AUDIENCE: Hi, my name is Mohammed.

DAVID J. MALAN: All right, wonderful.

Welcome aboard.

And here we come with some instructions and final

flourish if we want to keep the lights up but perhaps increase the music.

[MUSIC PLAYING]

[MUSIC - MC HAMMER, "U CAN'T TOUCH THIS"]

MC HAMMER: (SINGING) You can't this.

You can't touch this.

DAVID J. MALAN: Notice he is using the up, down, left, right.

But there's many more walls now.

First level's pretty easy.

But now Yale's in the mix, bouncing back and forth.

Again, pretty easy.

Now there's two Yale's at slightly different positions.

MIT is coming soon.

But first, we have three Yales.

MC HAMMER: (SINGING) As such.

And this is a beat, uh, you can't touch.

DAVID J. MALAN: Very nice.

[APPLAUSE]

MC HAMMER: (SINGING) I told you, homeboy, you can't touch this.

Yeah, that's how it look when you know you can't touch this.

Look at my eyes, man, you can't touch this.

Yo, let me bust the funky lyrics. you can't touch this.

Fresh new kicks and pants, you got to like that.

Now, you know you want to dance.

So move out of your seat and get a fly--

DAVID J. MALAN: You got to go quick.

MC HAMMER: (SINGING) Catch this beat while it's rolling.

Hold on.

Pump a little bit, and let them know what's going on, like that, like that.

Cold on a mission, so fall on back.

Let them know that you're too much and this a beat, uh, they can't touch.

Yo, I told you.

You can't touch this.

[APPLAUSE]

Yo, sound the bell.

School's in, sucker.

You can't touch this.

Give me a song, a rhythm.

Making them sweat, that's what I'm giving them.

Now they know, you talk about the Hammer,

you talking about a show that's hyped and tight.

Singers are sweating, so pass them a wipe or a tape to learn.

What's it going to take--

DAVID J. MALAN: Second-to-last level.

MC HAMMER: (SINGING) Legit.

Either work hard or you might as well quit.

That's word because you know--

DAVID J. MALAN: Last level.

MC HAMMER: (SINGING) You can't touch this.

DAVID J. MALAN: Hey!

[LAUGHS]

[APPLAUSE]

Congrats.

All right, that's it for CS50.

Welcome.

Cake is now served.

We'll see you next time.

[PROJECTOR CLICKING]

[MUSIC PLAYING]

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