WEBVTT
00:00:00.000 --> 00:00:18.090
35C3 preroll music
00:00:18.090 --> 00:00:20.899
Herald Angel: Do you remember some days
ago, where you sit together with your
00:00:20.899 --> 00:00:26.680
loved ones and you had to fix their
computers? And told them how things work –
00:00:26.680 --> 00:00:31.519
and why they are working the strange way
they are working? Imagine you have to do
00:00:31.519 --> 00:00:35.970
this for teaching them how to program and
give them the passion and the love that
00:00:35.970 --> 00:00:41.960
you have for programming! So please let's
give Mike Sperber a great applause for his
00:00:41.960 --> 00:00:45.540
talk "How to Teach Programming to Our
Loved Ones".
00:00:45.540 --> 00:00:52.205
Applause
00:00:52.205 --> 00:00:53.330
Mike Sperber: Thanks so much for that
00:00:53.330 --> 00:01:00.220
introduction. Let's switch slides back.
Speaking of passion. So if you're teaching
00:01:00.220 --> 00:01:05.009
programming, that's a great ego booster,
right? You know that. If your audience is
00:01:05.009 --> 00:01:09.890
large enough or if you've got super gifted
children – like you probably all do – then
00:01:09.890 --> 00:01:13.270
you know, you could teach them just about
anything and they will say, they will tell
00:01:13.270 --> 00:01:16.600
you and they will give you feedback
telling you how wonderful that was. So for
00:01:16.600 --> 00:01:21.119
example I like functional programming, so
that's a lambda which stands for
00:01:21.119 --> 00:01:25.579
functional programming. And you know
whenever I teach that to a sufficiently
00:01:25.579 --> 00:01:31.020
large audience somebody typically looking
like that would come up to me and tell me:
00:01:31.020 --> 00:01:34.929
"Oh this lambda stuff, this functional
programming stuff that's the most
00:01:34.929 --> 00:01:41.689
wonderfullest thing I've ever heard. And
you're a great teacher." And so in the
00:01:41.689 --> 00:01:45.109
introduction it said something about a
couple of days. So I think I've been
00:01:45.109 --> 00:01:51.060
teaching for 30 years now; in various
contexts: to high school students, to
00:01:51.060 --> 00:01:55.179
university students, to kids, to
humanities majors, to computer science
00:01:55.179 --> 00:02:01.529
majors, to computer science minors, in
professional training to co-workers. But
00:02:01.529 --> 00:02:06.029
if I take the totality of my teaching
experience, most of that overall looking
00:02:06.029 --> 00:02:10.090
back was a failure. And I want to talk
about those failures more about the
00:02:10.090 --> 00:02:15.990
successes that come from the passion. So
if you look at initiatives that aim at
00:02:15.990 --> 00:02:20.510
fostering programming skills among
children for example, they always talk
00:02:20.510 --> 00:02:26.310
about getting people excited and sort of
exciting their passion for programming.
00:02:26.310 --> 00:02:29.590
And you hear politicians talk like that a
lot, too. We need to get young people into
00:02:29.590 --> 00:02:34.250
technology because that is the future. I'm
not sure about that personally, but it
00:02:34.250 --> 00:02:38.130
always seems to end up in classrooms that
look like this: That typically have a
00:02:38.130 --> 00:02:44.060
bunch of robots in there, sold by some
company. And that are supposed to, because
00:02:44.060 --> 00:02:48.380
robots are for some reason inherently
interesting. They're supposed to get kids
00:02:48.380 --> 00:02:52.261
or whomever interested in programming,
excited about programming. And that's all
00:02:52.261 --> 00:02:57.320
good and well. Also I think there's this
underlying assumption that only if we
00:02:57.320 --> 00:03:01.880
would get people excited and interested in
programming, they would sort of acquire
00:03:01.880 --> 00:03:06.850
the required skills by themselves and some
process of trial and error or osmosis or
00:03:06.850 --> 00:03:10.930
something like that. And I think the most
prominent project that propagated that
00:03:10.930 --> 00:03:14.960
notion – some of you may remember – was
this One Laptop Per Child initiative a
00:03:14.960 --> 00:03:18.360
couple of years ago. And you don't … I
haven't seen many of those at this
00:03:18.360 --> 00:03:24.120
conference. And the reason for that is
that the educational concepts around One
00:03:24.120 --> 00:03:27.940
Laptop Per Child were based on this idea
of – I think – what's called
00:03:27.940 --> 00:03:32.040
constructivism. This idea that only if you
give children enough material and access
00:03:32.040 --> 00:03:36.470
to whatever the Internet and teaching
materials, then they will all figure it
00:03:36.470 --> 00:03:40.350
all out themselves and they will figure
out how to build programs by themselves.
00:03:40.350 --> 00:03:44.240
And I think one of the underlying problems
– I mean there were many problems with
00:03:44.240 --> 00:03:48.430
OLPC. But one of the problems was
certainly that just this approach to
00:03:48.430 --> 00:03:53.530
didactics and pedagogy doesn't work
particularly well. And you find variations
00:03:53.530 --> 00:03:57.540
of that pretty much every year. There's an
educational initiative built on this
00:03:57.540 --> 00:04:02.319
notion of inspiring – you know – passion
for programming. You know, last year you
00:04:02.319 --> 00:04:08.530
would hear about a project called Bob
which essentially is about programming a
00:04:08.530 --> 00:04:11.670
little robot-like device, that has
blinking lights and things like that. And
00:04:11.670 --> 00:04:16.709
it's certainly very interesting and you
program it by – I think you can see that
00:04:16.709 --> 00:04:22.510
here – you program it by essentially
downloading already … someone already
00:04:22.510 --> 00:04:26.320
programmed some C++ code for you, and you
take some line in the middle and change it
00:04:26.320 --> 00:04:30.100
to change the blinking through frequency
or something like that. And again all that
00:04:30.100 --> 00:04:33.720
is good and well; and I don't want to
denigrate that, but it's all good and well
00:04:33.720 --> 00:04:39.150
for inspiring passion. But all of these
projects have in common is that they are
00:04:39.150 --> 00:04:44.090
not really about teaching the methodology
of programming. And so this is, you know,
00:04:44.090 --> 00:04:46.680
this is what this talk is about and it's
probably going to be the most boring talk
00:04:46.680 --> 00:04:54.320
you've ever heard. If you want to inspire
passion for programming and for computers,
00:04:54.320 --> 00:04:57.420
there's lots of projects right outside
this door – specifically today on the
00:04:57.420 --> 00:05:01.620
Junghackertag – that will tell you how to
do that. The problem is that if you want
00:05:01.620 --> 00:05:05.580
to transition from these projects to
actually serious substantial programming
00:05:05.580 --> 00:05:10.430
projects that your learners want to
undertake by themselves … and if you look
00:05:10.430 --> 00:05:15.020
closely enough, you will find that a lot
of people get frustrated by that
00:05:15.020 --> 00:05:19.430
experience of writing more complex
programs. And even if they do not get
00:05:19.430 --> 00:05:24.900
frustrated, their code often ends up
looking like that on the right hand side.
00:05:24.900 --> 00:05:30.160
And so of course this entire conference is
in the spirit of tinkering and building
00:05:30.160 --> 00:05:34.370
things by trial and error; and you see a
lot of things that look like this. But,
00:05:34.370 --> 00:05:38.900
you know, in the upcoming IOT apocalypse
maybe we want to have a little bit
00:05:38.900 --> 00:05:44.169
slightly more methodical approach. So the
problem is really that most didactic
00:05:44.169 --> 00:05:48.820
approaches to programming do not work very
well. For the longest time I really didn't
00:05:48.820 --> 00:05:52.760
have a good explanation as to why that was
and why maybe the stuff that I was doing
00:05:52.760 --> 00:05:57.260
or that I learned how to do over the years
worked better. And so finally I found a
00:05:57.260 --> 00:06:02.880
great book that confirms some of my
biases, that I read just the day before
00:06:02.880 --> 00:06:08.220
yesterday – as I was preparing this talk.
And it has a couple of … It's written by a
00:06:08.220 --> 00:06:14.740
cognitive scientist – Daniel Willingham –
and he lists a couple of principles that
00:06:14.740 --> 00:06:19.260
are active when students learn, right? And
I think one of the things that's really
00:06:19.260 --> 00:06:24.490
important is that we all have this
idealistic notion that everybody loves to
00:06:24.490 --> 00:06:28.570
learn, right? But in fact learning is
quite a difficult activity and it's quite
00:06:28.570 --> 00:06:33.780
straining. And – so even though people are
curious about things and they love to look
00:06:33.780 --> 00:06:37.350
at things and they like to have successful
learning experiences – if that learning
00:06:37.350 --> 00:06:42.650
experience means they have to think hard,
then at least some people shun those same
00:06:42.650 --> 00:06:48.801
experiences. Another problem is … so and
that's of course a problem when you
00:06:48.801 --> 00:06:52.690
transition from a primitive programming
environment, like Scratch or Bob or
00:06:52.690 --> 00:06:57.050
something, to more complicated things that
you can easily get frustrated, and then
00:06:57.050 --> 00:07:02.600
shun away from the learning experiences
that are required to take the next step.
00:07:02.600 --> 00:07:05.270
Another one that I found interesting is –
so these are just all the cognitive
00:07:05.270 --> 00:07:09.940
principles in that book – so it's kind of
very textual and boring, but I liked it so
00:07:09.940 --> 00:07:14.530
much. So it says: "Factual knowledge
precedes skill." But if you think, so what
00:07:14.530 --> 00:07:19.560
it means is really that you need to have …
that if you want to learn a particular
00:07:19.560 --> 00:07:23.140
skill, you need to associate that with
factual knowledge. But if you think about
00:07:23.140 --> 00:07:27.120
the factual knowledge that is associated
with programming, then a lot of the
00:07:27.120 --> 00:07:31.229
principles underlying our everyday
programming skills are usually unnamed.
00:07:31.229 --> 00:07:35.090
And they're not really put in specific
words, and so they're not in the form of
00:07:35.090 --> 00:07:38.750
factual knowledge. And which is why a lot
of people have trouble with the skill
00:07:38.750 --> 00:07:44.510
part. I love this bit which says: "Memory
is the residue of thought." Which is that
00:07:44.510 --> 00:07:47.381
we don't always remember the things that
we should be remembering, but that we
00:07:47.381 --> 00:07:51.240
remember things that we spend a lot of
thought on. And that means in particular
00:07:51.240 --> 00:07:54.470
for educational initiatives that are
centered around robots – or something
00:07:54.470 --> 00:07:58.810
that's really … that is supposed to take
over the passion part of programming but
00:07:58.810 --> 00:08:02.610
not really central to the activity of
programming – people tend to think about
00:08:02.610 --> 00:08:06.330
the robots: They tend to think about the
motors and actuators and things like that;
00:08:06.330 --> 00:08:10.060
and those are worthy skills in and of
themselves, but they don't contribute much
00:08:10.060 --> 00:08:14.580
to the actual skill of programming. I
remember asking a proponent of such an
00:08:14.580 --> 00:08:18.750
educational initiative a number of years
back, you know what is it? What is the
00:08:18.750 --> 00:08:23.030
skill that students take away from your
robot class? And he said "well, after that
00:08:23.030 --> 00:08:26.440
class where they spend all their free time
for a semester or a year, they really know
00:08:26.440 --> 00:08:34.820
what pi is. And I don't know for me that
is not enough. So another thing is that …
00:08:34.820 --> 00:08:39.080
maybe that doesn't go so much towards
computer science or programming experience
00:08:39.080 --> 00:08:44.320
but also to the way that we do math
education: Is we understand new things in
00:08:44.320 --> 00:08:48.820
the context of things we already know. In
particular we find it easier to understand
00:08:48.820 --> 00:08:56.190
concrete things. And I think both in math
and computer science a lot of explanations
00:08:56.190 --> 00:09:00.240
are in the form of explaining some
abstract thing rather than showing how to
00:09:00.240 --> 00:09:04.440
do a concrete thing. And so we'll get
back. So this is going to be a major point
00:09:04.440 --> 00:09:09.960
later on. Something that didn't really
need saying in that book: "Proficiency
00:09:09.960 --> 00:09:12.880
requires practice." If you want to get
better at programming, you'll need to
00:09:12.880 --> 00:09:17.010
practice it with the goal of getting
better at it. So in the classroom or in a
00:09:17.010 --> 00:09:22.260
teaching environment you really need to
create situations that foster successful
00:09:22.260 --> 00:09:27.180
practice, the successful solution of
problems. So that, you know, this natural
00:09:27.180 --> 00:09:32.130
curious part in the beginning. So student,
so people generally derive a dopamine rush
00:09:32.130 --> 00:09:37.450
from successfully solving problems. So we
really need to put … we really need to put
00:09:37.450 --> 00:09:41.740
our students in a situation where they can
successfully solve problems – that are not
00:09:41.740 --> 00:09:45.210
too hard and also not too easy, because if
they're too easy, the dopamine rush will
00:09:45.210 --> 00:09:51.550
not be big enough. Here's a trap I think
that most people who teach programming
00:09:51.550 --> 00:09:54.430
know about is that "cognition is
fundamentally different early and late in
00:09:54.430 --> 00:09:57.950
training". And if you're here, most people
in this room are late in training. So
00:09:57.950 --> 00:10:02.220
we've been in touch with computers for a
long time, so our cognitive processes when
00:10:02.220 --> 00:10:05.550
we think about programming are different
than the cognitive processes of beginning
00:10:05.550 --> 00:10:10.070
students. Sometimes that's also called the
curse of knowledge. So just because we
00:10:10.070 --> 00:10:14.350
find some piece of material inspiring or
interesting – or some technique of
00:10:14.350 --> 00:10:18.410
explaining something very persuasive –
that does not mean that our students find
00:10:18.410 --> 00:10:23.070
it similarly persuasive and find it
similarly easy to follow along our
00:10:23.070 --> 00:10:28.020
teaching. If you're teaching big
classrooms I think there's being have been
00:10:28.020 --> 00:10:33.620
a big push towards individualistic
learning. And of course that's wonderful.
00:10:33.620 --> 00:10:38.120
On the other hand our children tend to be
quite alike in their style of learning.
00:10:38.120 --> 00:10:42.209
And so I'm not going be talking about that
much that very much today but there's
00:10:42.209 --> 00:10:46.500
still great value in having a classroom
with several students that are all being
00:10:46.500 --> 00:10:53.960
taught the same thing. Not a subject today
but I could also … that that also has been
00:10:53.960 --> 00:10:58.860
confirmed by my experience. Generally,
some people think that you know some
00:10:58.860 --> 00:11:01.760
people are good at math and some people
are bad at math. You know girls are always
00:11:01.760 --> 00:11:05.959
bad at math for some reason and it turns
out that this is … Well first of all it's
00:11:05.959 --> 00:11:10.580
not true. And even if you feel you're bad
at something then usually what we call
00:11:10.580 --> 00:11:15.440
intelligence can be changed through
sustained hard work. I think you know 10
00:11:15.440 --> 00:11:20.030
or 20 years ago a lot of people believed
in IQ that an innate ability to learn
00:11:20.030 --> 00:11:24.880
things. But it turns out that that most of
the effects of IQ on your ability do
00:11:24.880 --> 00:11:28.740
things well are quite indirect and through
the environment rather than through some
00:11:28.740 --> 00:11:34.740
structure in your brain that you were born
with. And so that's something that you
00:11:34.740 --> 00:11:39.510
really learn when you do 30 years of
teaching is really that your teaching can
00:11:39.510 --> 00:11:43.779
improve over time. But in order to improve
you really must get feedback and you must
00:11:43.779 --> 00:11:48.890
practice it and get feedback the same way
that the skill itself must be practiced.
00:11:48.890 --> 00:11:53.710
And that sometimes gets you feedback that
is surprising sometimes and also it's
00:11:53.710 --> 00:11:58.649
often quite quite painful because
sometimes you get the feedback that you're
00:11:58.649 --> 00:12:04.339
teaching just did not work. So really, I
want to aim a programming education at a
00:12:04.339 --> 00:12:08.850
diverse audience and not just I mean if
you look at the Robot class if you're
00:12:08.850 --> 00:12:12.560
student population that ends up being in
that robot class is really as diverse as
00:12:12.560 --> 00:12:16.670
you like it as you'd like it to be. I
think often that is not the case. So the
00:12:16.670 --> 00:12:19.709
stuff that I'm going to talk about and
then I'm going to talk about has been
00:12:19.709 --> 00:12:23.600
applied not always by me but to children,
to high school students, to university
00:12:23.600 --> 00:12:28.410
students, professional developers and
works quite well. And what it is based on
00:12:28.410 --> 00:12:33.660
is a set of systematic methods and I'll
try to show you in great and painstaking
00:12:33.660 --> 00:12:40.200
detail what that means. And so here are
some references that you can look at. In
00:12:40.200 --> 00:12:44.350
particular we built on the work of the PLT
group in the U .S. led by Matthias
00:12:44.350 --> 00:12:47.610
Felleisen, who have a great book out now.
I'll give you a reference to that later.
00:12:47.610 --> 00:12:53.410
There is a there's a significant project
for teaching high school students in the
00:12:53.410 --> 00:12:56.140
U.S. and there's also a project that I'm
involved with what's called which is
00:12:56.140 --> 00:13:00.660
called "Dein Programm", which tries to be
sort of the little German sister of that
00:13:00.660 --> 00:13:08.730
stuff. So one aspect that's important to
this method of teaching is that all the
00:13:08.730 --> 00:13:13.670
tools that we use are geared towards
learners in particular that means that
00:13:13.670 --> 00:13:17.180
there is a specific programming
environment that was made specifically for
00:13:17.180 --> 00:13:23.100
learners rather than your Emacs or VI or
whatever your favorite thing is that you
00:13:23.100 --> 00:13:27.430
want to, that you want to inflict on your
learners. I don't think you should. I'm an
00:13:27.430 --> 00:13:33.980
Emacs person myself. So also what it means
is that we have … that we use specific
00:13:33.980 --> 00:13:38.080
programming languages that are derived
from real programming languages but that
00:13:38.080 --> 00:13:44.251
have been modified to be especially
suitable for learners. And also then we
00:13:44.251 --> 00:13:50.160
have something called the design recipes
which are a set of methods for systematic
00:13:50.160 --> 00:13:55.230
program construction that try to provide
this factual basis for the methodology of
00:13:55.230 --> 00:13:58.860
programming. And so there's programming
environment … All of this stuff by the way
00:13:58.860 --> 00:14:04.899
can be downloaded for free. And so there's
a great system called racket developed by
00:14:04.899 --> 00:14:08.920
the PLT group but there's a tiny corner in
there that I'm going to refer to today
00:14:08.920 --> 00:14:12.960
which is great for many things but it was
originally designed and still is great for
00:14:12.960 --> 00:14:22.740
teaching so. So let me try to switch to
that. I hope that works out. This moment
00:14:22.740 --> 00:14:30.830
always scares me. So here is the system
called Doctor racket and you can see it
00:14:30.830 --> 00:14:35.399
has not very many buttons it does not look
like Eclipse or Visual Studio or something
00:14:35.399 --> 00:14:38.660
like that does not look like a
professional programming environment. And
00:14:38.660 --> 00:14:43.740
the way this works is I'm going to try to
show you how it works is in the upper part
00:14:43.740 --> 00:14:47.360
of that window there's just the program
that's a text editor with a couple of
00:14:47.360 --> 00:14:51.800
special features - not very many. And down
here is the REPL, which you can use to
00:14:51.800 --> 00:14:55.930
interact with the program that you've
written. I'm not gonna use that very much.
00:14:55.930 --> 00:15:00.600
But what you can do in the REPL - in the
beginning at least - is you can just type
00:15:00.600 --> 00:15:04.910
something and it will give you … it will
then immediately tell you the result of
00:15:04.910 --> 00:15:10.560
the evaluation of what you typed in. And
now you have to remember … This is gonna
00:15:10.560 --> 00:15:15.650
be alien and strange to you. But the way
this works is these languages are based on
00:15:15.650 --> 00:15:20.440
Lisp. So they use round parentheses a lot
and specifically when … always when you
00:15:20.440 --> 00:15:23.209
want to put something together they have
around parentheses and they have the
00:15:23.209 --> 00:15:26.760
operator in front and - especially if
you've been programming for a long time -
00:15:26.760 --> 00:15:30.300
you think "Oh no, this is … Never gonna
get used to that!" but I can promise you,
00:15:30.300 --> 00:15:35.930
your children will have a very easy time
dealing with this. So you could go and say
00:15:35.930 --> 00:15:39.889
you know you could just type a number and
it will give you the result. You would
00:15:39.889 --> 00:15:48.200
type a string, you know, "Mike". It will
give you the result. It … you could go and
00:15:48.200 --> 00:15:52.930
you could you know, you could combine
numbers, right, by adding them together.
00:15:52.930 --> 00:15:57.480
You could let's do away with that. Looks
like this. So that's what it what it looks
00:15:57.480 --> 00:16:00.970
like a compound expression has always
parens around it and the operator in
00:16:00.970 --> 00:16:04.960
front. So you don't really say you know
this number plus that number you say the
00:16:04.960 --> 00:16:11.550
sum of those two numbers. OK. And so gives
me the result of that. What's kind of fun
00:16:11.550 --> 00:16:15.980
if you're a C programmer or Java
programmer this is kind of fun, but
00:16:15.980 --> 00:16:23.899
children love this for some reason I know.
So what you can also do is the same way
00:16:23.899 --> 00:16:28.279
that you're used to having numbers and
strings and whatever and booleans be
00:16:28.279 --> 00:16:33.329
values. Pictures are also values so that
sometimes helps when you're trying to drum
00:16:33.329 --> 00:16:37.250
up that little piece of motivation that
you need. So you could do like a rectangle
00:16:37.250 --> 00:16:44.829
that is solid blue and that's a value. And
whatever whenever there is a value you can
00:16:44.829 --> 00:16:51.270
write a program that binds that value to a
name by writing "define". So you could do
00:16:51.270 --> 00:16:57.980
something really exciting like this. You
would define "pi" for something. We could
00:16:57.980 --> 00:17:03.940
run that program and then we could put top
pi here but we could also do you know "r"
00:17:03.940 --> 00:17:13.740
that rectangle and whatever 50 solid red
and we can run that program. And here's
00:17:13.740 --> 00:17:20.060
that rectangle. What's maybe more
interesting is that we can maybe do
00:17:20.060 --> 00:17:25.599
another rectangle that's solid blue and
you can also see here's the same principle
00:17:25.599 --> 00:17:29.880
at work right. Parentheses around the
define so "define" says it's a definition
00:17:29.880 --> 00:17:33.980
and the rectangle is just a call to a
function that comes with Dr. Racket and
00:17:33.980 --> 00:17:40.320
it's also in front. And so I could do
that. Now I have "r" I have "f2" and I
00:17:40.320 --> 00:17:43.990
could also do things, things like you know
there's for example a function that takes
00:17:43.990 --> 00:17:49.830
two pictures and puts them beside each
other so there's a little jumping ahead a
00:17:49.830 --> 00:17:52.750
little bit there's a little algebra of
pictures in here that you can use to
00:17:52.750 --> 00:17:56.180
program video games for example later in
the class if that's something that you
00:17:56.180 --> 00:18:03.799
want to do. So this is not entirely
without motivational examples. So there's
00:18:03.799 --> 00:18:14.059
that. Yeah. Let's see how far we can go
from there. OK. So but getting away from
00:18:14.059 --> 00:18:21.200
those motivational examples. In German we
are very big on traffic rules. Right.
00:18:21.200 --> 00:18:24.530
Straßenverkehrsordnung. So there are many
rules, right, and we'll try to model that.
00:18:24.530 --> 00:18:28.580
This is going to make this the most boring
talk you've ever heard. So we're gonna
00:18:28.580 --> 00:18:34.480
categorise German traffic violations. So
in particular there's two kinds of traffic
00:18:34.480 --> 00:18:38.660
violations. There's red light violations
where it's important where they happen and
00:18:38.660 --> 00:18:43.110
it's also important what the duration is.
How long after the light has turned red
00:18:43.110 --> 00:18:48.370
passes before you actually cross the
intersection or the red light. And then
00:18:48.370 --> 00:18:52.140
there's a speeding violation where you
also have a place and you just have how
00:18:52.140 --> 00:18:56.150
many kilometres per hour did you go over
the limit. And we want to write functions
00:18:56.150 --> 00:19:00.850
and I'll tell you how to do that for
yielding the place of a violation and
00:19:00.850 --> 00:19:07.250
classifying a violation as serious or not.
And for that purpose we're going to do …
00:19:07.250 --> 00:19:12.580
use something called the design recipe or
rather as there's we're going to use
00:19:12.580 --> 00:19:15.919
several design design recipes and first of
all there's an overall design recipes,
00:19:15.919 --> 00:19:20.540
which says how you write a function. And
please don't fall asleep. There's one,
00:19:20.540 --> 00:19:24.760
two, three, four, five, six, eight, eight
steps to this. And we always ask our
00:19:24.760 --> 00:19:30.010
students to always go through those eight
steps and you think: this is off. I mean I
00:19:30.010 --> 00:19:33.940
hope you do right. You feel this is this
already looks like the most boringest, you
00:19:33.940 --> 00:19:37.910
know, exposition to programming ever. This
is like the German bureaucracy approach to
00:19:37.910 --> 00:19:45.799
teaching how to program. On the other
hand, so, but, you know, it works. That is
00:19:45.799 --> 00:19:50.919
the point. Specifically each of those
steps is something that is small enough so
00:19:50.919 --> 00:19:54.230
that students can usually successfully do
it. And if you can reward it with credit
00:19:54.230 --> 00:19:58.840
or candy or whatever then you know
students will be motivated to get to the
00:19:58.840 --> 00:20:03.910
next step. You know if you've ever taught
unsuccessfully and probably most of you
00:20:03.910 --> 00:20:08.169
have always taught successfully but what
always happened to me is then when my
00:20:08.169 --> 00:20:14.049
teaching would be unsuccessful my students
would be staring at a blank screen. Right.
00:20:14.049 --> 00:20:17.320
And that would give them this problem and
I felt this problem was really solvable
00:20:17.320 --> 00:20:22.539
and they would give up before typing the
first key. Right. They wouldn't know where
00:20:22.539 --> 00:20:26.510
to begin because there's usually most
approaches to teaching how to program are
00:20:26.510 --> 00:20:31.120
example based. They give you some example.
You know, here's that program solves that
00:20:31.120 --> 00:20:34.240
problem. How here's a different problem,
now solve that. And you already saw how
00:20:34.240 --> 00:20:39.669
that's done. And that process usually or
often does not work. And so this fixed
00:20:39.669 --> 00:20:44.020
sequence of steps gets students over that
hump and I'm gonna try to explain that
00:20:44.020 --> 00:20:47.320
really in painstaking detail because the
books don't really do justice to a how
00:20:47.320 --> 00:20:52.570
bureaucratic and painstaking it is. So you
all have the benefit of that. So there's
00:20:52.570 --> 00:20:55.990
always these eight steps and then there's
more instructions that come with each of
00:20:55.990 --> 00:21:01.600
those steps. Right. But these instructions
are eminently learnable and that's the
00:21:01.600 --> 00:21:07.890
important aspect here. So in particular.
So I'm gonna, sort of, jump in right
00:21:07.890 --> 00:21:20.120
ahead. Oops, oops. Ah. You see something
that I don't see. There we go. So if you
00:21:20.120 --> 00:21:26.890
look at this problem statement. So let me
go back one more. So it says the first
00:21:26.890 --> 00:21:30.000
thing that you do is well you draw a short
description of a function we already have
00:21:30.000 --> 00:21:33.850
two short descriptions of the functions
you know find the place of a traffic
00:21:33.850 --> 00:21:37.120
violation and find out if it's serious or
not. And then it says please conduct a
00:21:37.120 --> 00:21:43.390
data analysis and data analysis means that
you look at the entities in your problem
00:21:43.390 --> 00:21:48.350
and and analyze them. And here it says
while this is all about traffic
00:21:48.350 --> 00:21:52.720
violations. And it says something of the
sort. That there's for example a red light
00:21:52.720 --> 00:21:57.180
violation. And it says that red light
violation has place and duration and that
00:21:57.180 --> 00:22:01.730
duration is in seconds. So one thing that
you can do is you can look at the wording
00:22:01.730 --> 00:22:05.929
of how that data is described and if you
discover wording that says you know this
00:22:05.929 --> 00:22:11.520
thing consists of these pieces. Right. Or
this thing has several different
00:22:11.520 --> 00:22:18.419
properties. This is a phenomenon that we
call compound data and that has a special
00:22:18.419 --> 00:22:27.690
design recipe that PowerPoint somehow
threw away. See OK it comes up again. So
00:22:27.690 --> 00:22:32.340
it says well you recognize compound data
by a description of your data that uses
00:22:32.340 --> 00:22:36.880
words like "consists of" or "has". And
then you write a data definition of that
00:22:36.880 --> 00:22:41.510
form and I will show you how that works.
Then, something really trivial comes you
00:22:41.510 --> 00:22:44.480
count the ingredients and you write a
what's called a record definition that's
00:22:44.480 --> 00:22:49.620
actual code and then you ensure that the
counts match and these are instructions in
00:22:49.620 --> 00:22:57.059
the textbook. Right. And students learn to
memorize those instructions and you all
00:22:57.059 --> 00:23:04.020
going asleep. You know you're all falling
asleep. Sorry about that. So let's see
00:23:04.020 --> 00:23:09.620
where is the right window. Here's the
right window. So that's what we were
00:23:09.620 --> 00:23:16.380
doing. Right. I'm going to leave that here
for your entertainment. It says well a red
00:23:16.380 --> 00:23:22.810
light violation… So excited, I need to
talk. And we said it has this formulation
00:23:22.810 --> 00:23:26.789
that says "has". We're just going to write
it down in a slightly more systematic way.
00:23:26.789 --> 00:23:34.169
So, it has a place and it has a duration
in seconds. Right. And that's just a piece
00:23:34.169 --> 00:23:39.730
of natural language and those semicolons,
they make this a comment. OK. So we didn't
00:23:39.730 --> 00:23:44.250
do much except writing each component of
our compound data in a separate line. And
00:23:44.250 --> 00:23:47.090
then it said - I can't really display it
at the same time - then it said, write a
00:23:47.090 --> 00:23:52.750
record definition and a record definition
has this form. It is, it really it looks a
00:23:52.750 --> 00:24:01.230
little tedious. But it's actually quite
valuable. So it says we're talking about
00:24:01.230 --> 00:24:06.270
red light violations so we give our thing
a name. So that's called "red-light-
00:24:06.270 --> 00:24:12.770
violation" then we will need to create
"red-light-violation" objects. So we will
00:24:12.770 --> 00:24:15.679
need a constructor so I'm going to write
down the name of that constructor.
00:24:15.679 --> 00:24:19.820
Eventually we will need to distinguish red
light violations from other things. So I'm
00:24:19.820 --> 00:24:24.231
going to write something it's a predicate
that we'll use a little later and then we
00:24:24.231 --> 00:24:28.770
have two parts. And I can't emphasize
enough how important it is that you sort
00:24:28.770 --> 00:24:31.961
of remember: two. Right? It has two parts,
because it says that there's a place and a
00:24:31.961 --> 00:24:37.820
duration in seconds and we write the names
of things that will extract those pieces.
00:24:37.820 --> 00:24:42.980
So we go here it says "red-light-
violation-place" and "red-light-violation-
00:24:42.980 --> 00:24:50.419
duration". Or we could, let's call it
seconds, so we always know what that is.
00:24:50.419 --> 00:24:59.120
And now what that does is when I run it is
well it doesn't do anything. But what we
00:24:59.120 --> 00:25:05.570
can do is. We can now create objects that
represent red light violations. And so
00:25:05.570 --> 00:25:10.530
what we could do is… Well let me first
show you how it's done. We do "make-red-
00:25:10.530 --> 00:25:16.130
light-violation". You know there's one in
Borg. Somebody who, you know, had a red
00:25:16.130 --> 00:25:20.190
light violation for four seconds in Borg.
Right. And then it will display a record
00:25:20.190 --> 00:25:28.590
value that shows what the parts are that
we had. And so I can copy this up here and
00:25:28.590 --> 00:25:37.190
call it and make an example out of that.
And so like this. So now we have "rv1"
00:25:37.190 --> 00:25:43.770
here. So this is what's called a
constructor and this constructor when we
00:25:43.770 --> 00:25:48.500
call it creates this object and this
object really creates data that is
00:25:48.500 --> 00:25:52.620
associated with information. So that's an
important aspect to explain. And so
00:25:52.620 --> 00:25:58.440
usually we ask students and I can't I'm
not writing this down to explain it to you
00:25:58.440 --> 00:26:04.110
I'm writing it down to show to you what to
expect from students. And so you go "Oh",
00:26:04.110 --> 00:26:21.030
make them do it. So this is a red light
violation in Borg, 4 seconds. So it seems
00:26:21.030 --> 00:26:28.659
really trivial to you but it's important
to really … to link the program to the
00:26:28.659 --> 00:26:36.459
problem domain that we're in, right. So we
have a minor red light violation here.
00:26:42.259 --> 00:26:50.820
Am I spelling this right? Anyway, so here
we go. And one way to talk about this new
00:26:50.820 --> 00:26:54.299
function that we created "make-red-light-
violation" is writing down something that
00:26:54.299 --> 00:27:00.350
we call a signature. It looks like, sort
of like a type signature but isn't quite.
00:27:00.350 --> 00:27:04.020
That's something that we did specifically
for teaching. So you do "make-red-light-
00:27:04.020 --> 00:27:12.340
violation" and remember in math you would
sometimes write f Doppelpunkt, f colon to
00:27:12.340 --> 00:27:16.020
denote a type. And here we just put the
colon in front. So it says "make-red-
00:27:16.020 --> 00:27:20.530
light-violation". Well it takes a string,
that says what the places is, it takes
00:27:20.530 --> 00:27:25.450
some rational number, that says how long
it went, how long the red light violation
00:27:25.450 --> 00:27:36.039
was over the limit, and it creates a red
light violation object. So that's not
00:27:36.039 --> 00:27:43.000
gonna do much, unless, well let me let me
show you something. If I wrote something
00:27:43.000 --> 00:27:58.790
else here I wrote a number here.
Something… Where'd it go? So it's, so it
00:27:58.790 --> 00:28:02.429
says it gives an error message here. And
it's I think it's due to this full screen
00:28:02.429 --> 00:28:18.090
mode for some reason. Let me see if we can
do this again. No, not quite. OK, now we
00:28:18.090 --> 00:28:23.150
know what it is so. So. Yeah it was. So,
when you. Unfortunately it is in German so
00:28:23.150 --> 00:28:26.080
I hope some of you read German I'll try to
translate it says well this program still
00:28:26.080 --> 00:28:30.570
has to be tested but it says there was a…
It says here "Signaturverletzung", which
00:28:30.570 --> 00:28:38.039
means signature violation. And it says I
got five in this line here. And really, so
00:28:38.039 --> 00:28:44.010
this is the five. Oops, right here in this
line. And it violated the signature here.
00:28:44.010 --> 00:28:47.279
So it gives you… So the system. That's one
aspect of what makes the system
00:28:47.279 --> 00:28:52.771
specifically designed for learners is that
it gives you very specific feedback as you
00:28:52.771 --> 00:29:02.909
run the program. OK. So let's do away with
this. Let's get this down here. So now one
00:29:02.909 --> 00:29:06.370
of the challenges or one of the problems
in the problem statement was to write a
00:29:06.370 --> 00:29:11.779
function that determines whether a red
light violation is serious or not. And so
00:29:11.779 --> 00:29:15.830
when we do that, it said, well, you put a
short description in front. And so here's
00:29:15.830 --> 00:29:19.929
a short description. And there's lots of
religious wars about how many comments you
00:29:19.929 --> 00:29:24.409
should put in a program but to our
learners we say put one line not more not
00:29:24.409 --> 00:29:29.760
less in front of every function. And
that's usually about the right level. So
00:29:29.760 --> 00:29:37.500
is a red light violation serious? So the
next thing is. Well if you remember that
00:29:37.500 --> 00:29:41.270
slide it says, well, if you're writing a
function, if you're implementing a piece
00:29:41.270 --> 00:29:43.429
of functionality, that always ends up
being a function in functional
00:29:43.429 --> 00:29:47.270
programming, you write a signature for
that function that talks about what goes
00:29:47.270 --> 00:29:53.070
in and out of that function. So in this
case. Well we have to make up a name for
00:29:53.070 --> 00:30:02.460
that. So it practically writes itself here
and so we just put so in this language you
00:30:02.460 --> 00:30:05.360
can put a question mark in the middle of a
name and you can also put hyphens in the
00:30:05.360 --> 00:30:10.950
middle of a name. And what we want is we
want a red light violation to go in and we
00:30:10.950 --> 00:30:16.390
want a boolean to come out that says
whether that violation was serious or not.
00:30:16.390 --> 00:30:20.340
So those are already steps in that design
recipe that you saw. And so if you're in a
00:30:20.340 --> 00:30:23.710
classroom situation or whatever you can
give credit for each immediate step and
00:30:23.710 --> 00:30:29.029
you should, because those are already
those are all small successes in your
00:30:29.029 --> 00:30:33.390
programming endeavor. So the next thing
that you should do is, you should write
00:30:33.390 --> 00:30:39.140
examples or tests. Those are almost the
same thing here. And so, fortunately we
00:30:39.140 --> 00:30:43.080
already have examples of red light
violations. So we just have to write down
00:30:43.080 --> 00:30:49.370
how we expect our function to behave with
respect to those examples. So there's
00:30:49.370 --> 00:30:53.970
something called "check-expect" and I hope
you recognize that principle that we're,
00:30:53.970 --> 00:30:59.610
that things are always named in the front.
So we could say "red-light-violation-
00:30:59.610 --> 00:31:03.960
serious?". With children you might want to
pick shorter names if they can't type that
00:31:03.960 --> 00:31:12.090
fast yet, but with grown ups this works.
So the first one is four seconds over, so
00:31:12.090 --> 00:31:17.750
that's pretty serious. So we expect that
to be true and that "#t" means true. And
00:31:17.750 --> 00:31:29.900
so. And you. And the other one is half a
second over and that's not so serious
00:31:29.900 --> 00:31:35.289
under German law. That's fine. OK. So the
next step. So now we've written. So let me
00:31:35.289 --> 00:31:40.320
let me label those things right. This is
the short description. This is the
00:31:40.320 --> 00:31:47.390
signature. These are the tests. And now
you write something called the skeleton
00:31:47.390 --> 00:31:50.900
and the skeleton is just you start writing
the function but you already have some
00:31:50.900 --> 00:31:53.720
information about that function you know
the name of that function and you know how
00:31:53.720 --> 00:32:08.150
many things come in and out. So you write
- oops typo here - so and, well, this is a
00:32:08.150 --> 00:32:11.640
functional language so somebody always has
to write lambda somewhere. So when we make
00:32:11.640 --> 00:32:15.010
a function in these languages we always
write lambda. So we want to make a
00:32:15.010 --> 00:32:19.370
function that accepts one thing and that
is a red light violation a red light and
00:32:19.370 --> 00:32:27.520
we'll just call it "rlv" and we'll just
put three dots here. So the three dots I
00:32:27.520 --> 00:32:31.179
don't mean to say we're gonna fill in the
rest later. It means in class when I do
00:32:31.179 --> 00:32:35.850
this I actually type three dots and in
class especially at the beginning we
00:32:35.850 --> 00:32:39.960
actually ask our students to type the
three dots because this is the skeleton.
00:32:39.960 --> 00:32:47.120
This already gives you credit and it's,
you know since this is so easy to do, it
00:32:47.120 --> 00:32:52.480
really means that there's, you're not
staring at a white piece of paper and
00:32:52.480 --> 00:32:57.289
maybe you feel encouraged to do that next
step. Now the next step says you have to
00:32:57.289 --> 00:33:01.320
fill in what's called a template. And
those are elements of the function that
00:33:01.320 --> 00:33:07.270
you're writing that derive from the data
that goes in and sometimes from the data
00:33:07.270 --> 00:33:11.420
that goes out. In this case the data that
goes in is one of those red light
00:33:11.420 --> 00:33:15.341
violation objects and that red light
violation object if you may remember is a
00:33:15.341 --> 00:33:19.159
compound object it has two pieces. And
whenever you write a function that accepts
00:33:19.159 --> 00:33:23.570
compound data with two pieces you probably
need to look at those pieces. So, what you
00:33:23.570 --> 00:33:31.179
do is, you write you have to write
something that will tell you what those
00:33:31.179 --> 00:33:38.350
pieces are and remember. So I haven't
actually told you how that works. But
00:33:38.350 --> 00:33:42.600
remember here was the record definition,
up here, and it told us and we have a
00:33:42.600 --> 00:33:46.559
signature there that tells us how to
construct a red light violation object.
00:33:46.559 --> 00:33:50.710
And so what we also need is we need a way
to get the components out of a red light
00:33:50.710 --> 00:33:54.420
violation object. So we need what's called
selectors or assessors. And those are the
00:33:54.420 --> 00:33:58.850
things in parentheses here and here and
you can also describe them with
00:33:58.850 --> 00:34:06.690
signatures. And strangely enough so and
here a red light violation thing goes in
00:34:06.690 --> 00:34:20.889
and a string comes out. And in this case,
a red light violation goes in and a - what
00:34:20.889 --> 00:34:24.498
do we say - a rational comes out. So those
are of course… Those signature
00:34:24.498 --> 00:34:27.119
declarations are redundant. You don't have
to put them in there. Redundant with a
00:34:27.119 --> 00:34:29.840
constructor declaration and you're
going asleep, you're going asleep
00:34:29.840 --> 00:34:30.900
anymore... Even
00:34:30.900 --> 00:34:35.109
more probably than you were. But I had an
epiphany in class where I would only write
00:34:35.109 --> 00:34:39.800
the constructor signature and the students
would ask me to also write the excessive
00:34:39.800 --> 00:34:46.018
signatures. And so they made me even more
bureaucratic than I was already by then I
00:34:46.018 --> 00:34:50.690
already was by nature. So now here what we
do is we want to get access to the
00:34:50.690 --> 00:34:58.650
different parts. So we write "red-light-
violation-place" of "rlv". So that's one
00:34:58.650 --> 00:35:05.609
piece. "-violation-seconds" of "rlv".
That's the second part. And those are
00:35:05.609 --> 00:35:08.579
building blocks. So really if you're
really strict about it you might have
00:35:08.579 --> 00:35:16.829
people type three dots in here also. So
these just say, these are building blocks
00:35:16.829 --> 00:35:20.559
for your function. And so you think about
how those parts contribute to the answer
00:35:20.559 --> 00:35:25.270
to your questions. The question was is the
red light cycle violation serious or not.
00:35:25.270 --> 00:35:29.119
Then you can think about. Well is the
place relevant whether it was serious or
00:35:29.119 --> 00:35:33.119
not. And in Germany I think it's not. But
it is relevant how many seconds you went
00:35:33.119 --> 00:35:39.349
over. So, you then have– then you go
through this conscious act of: you've
00:35:39.349 --> 00:35:43.670
written it down but now you delete it
again because you've done a little bit of
00:35:43.670 --> 00:35:51.279
thinking. And you go and, well, then you
look up– I look this up on the Internet.
00:35:51.279 --> 00:35:56.039
If it's over one second then – or if it's
one second or over – then it's serious,
00:35:56.039 --> 00:36:03.359
and then you delete all the ellipses and
make sure all the parentheses close and
00:36:03.359 --> 00:36:10.209
then you run the program. And here's still
the signature violation that we need to
00:36:10.209 --> 00:36:21.099
fix. So it says here again there's a
little German sentence because these
00:36:21.099 --> 00:36:24.869
languages were designed for Germans and it
says: both tests were successful, because
00:36:24.869 --> 00:36:31.030
we wrote two test cases here. OK. So this
bureaucratic approach just goes on and on.
00:36:31.030 --> 00:36:38.430
So I'm just going to go through the second
iteration more quickly. So it said you
00:36:38.430 --> 00:36:45.099
know what did it say. It said, it said
this. We also have a speeding violation.
00:36:45.099 --> 00:36:50.710
So let's go through the motions of that: a
speeding violation has– again, it also has
00:36:50.710 --> 00:36:59.099
a place and it has, you know, how many
kilometers per hour over. And we write a
00:36:59.099 --> 00:37:01.429
record definition
00:37:22.299 --> 00:37:25.869
something like this, and we could do,
you know, two speeding
00:37:25.869 --> 00:37:31.509
vio- so now we have a data definition that
says: oh we've got two components, we've
00:37:31.509 --> 00:37:36.640
got a record definition that needs to
match that. You all think this is trivial
00:37:36.640 --> 00:37:40.719
but with compound data our students often
have trouble. So it serves you well to
00:37:40.719 --> 00:37:45.069
remind them that there's two pieces, and
those two pieces need to be selectors in
00:37:45.069 --> 00:37:52.269
the record definition. So we have speeding
violation one, speeding violation on Main
00:37:52.269 --> 00:37:59.890
Street. You know what, 20 kilometers over,
and we have another one, you know low
00:37:59.890 --> 00:38:13.469
street or whatever, that is 25 kilometers
over. So that is two examples right. And
00:38:13.469 --> 00:38:23.769
we have one on low street, 25 kilometers
per hour over limit. So once again the
00:38:23.769 --> 00:38:30.999
speeding violation constructor has a
little signature that says well a natural
00:38:30.999 --> 00:38:39.619
number goes in, speeding violation object
comes out. And so we go through those same
00:38:39.619 --> 00:38:43.460
notions. I need two things in order to
demonstrate one more thing. So then again
00:38:43.460 --> 00:38:59.480
the question was: When is a speeding
violation serious? And of course a
00:38:59.480 --> 00:39:08.089
speeding violation goes in and a boolean
comes out. And so we will write two tests.
00:39:08.089 --> 00:39:11.829
So speeding violation in Germany is
serious when it's 21 kilometres an hour
00:39:11.829 --> 00:39:15.309
over the limit, or over that. Right. And
it gets progressively more serious after
00:39:15.309 --> 00:39:22.269
that. So. So the first one is not too
serious. We'll not get you any points in
00:39:22.269 --> 00:39:38.210
Flensburg. But the second one is. And once
again we go right, speeding violation
00:39:38.210 --> 00:39:50.100
serious, we write the skeleton. So then we
write the skeleton, then we fill in the
00:39:50.100 --> 00:39:57.029
gaps and says we really should be writing
calls to the accessors. So we have the
00:39:57.029 --> 00:40:03.739
place of the speeding violation and we
have the kilometers over of the speeding
00:40:03.739 --> 00:40:10.299
violations. And then we think a little bit
and then we realize: oh the place does not
00:40:10.299 --> 00:40:14.589
matter. So I'm skipping. Of course this
all goes on usually over a longer period
00:40:14.589 --> 00:40:19.949
of time that you're teaching. I'm going
I'm going pretty fast here. So we do away
00:40:19.949 --> 00:40:28.300
with that and we go well this really if
this is over 21 then that's bad. Okay. So
00:40:28.300 --> 00:40:38.150
let's see if that works. It says km per
hour over– So then it says all four tests
00:40:38.150 --> 00:40:43.579
are passed. So that's good. So you know
there is primitive data, there's compound
00:40:43.579 --> 00:40:48.459
data. You may have noticed that on the
slide it said: a traffic violation is
00:40:48.459 --> 00:40:53.089
either a red light violation or a speeding
violation. So that's not compound data.
00:40:53.089 --> 00:40:58.779
When you see this formulation in your
language that says: it's this or that or
00:40:58.779 --> 00:41:02.369
that or that, or maybe it is one of the
following. Then you're not looking at
00:41:02.369 --> 00:41:08.420
compound data, you're looking at a
phenomenon called "mixed data". So you've
00:41:08.420 --> 00:41:14.539
seen this, you've seen this, you've seen
this mixed data. So you recognize it by
00:41:14.539 --> 00:41:18.759
either the words "or" or "one of" and you
write a data definition that really has
00:41:18.759 --> 00:41:22.820
that form, you count the alternatives just
like you do with compound data. You write
00:41:22.820 --> 00:41:26.289
a signature definition. I'll show you how
to do that. And you ensure that the counts
00:41:26.289 --> 00:41:33.369
match. And so the way that you do that is
this. We said data definition, so we said:
00:41:33.369 --> 00:41:43.160
a traffic violation is one of the
following. It's either a red light
00:41:43.160 --> 00:41:55.079
violation or it is a speeding violation.
And just as with the compound data this
00:41:55.079 --> 00:41:58.180
little data definition has some code that
goes with it. So we'll just call this
00:41:58.180 --> 00:42:04.119
thing a traffic violation and we just use
define to say what that is and define
00:42:04.119 --> 00:42:11.269
traffic violation, is it just a signature
that says it's mixed, it's mixed data from
00:42:11.269 --> 00:42:19.839
red light violation and speeding
violation. So here you go. So now we can
00:42:19.839 --> 00:42:23.690
use that in signatures. You remember the
problem statement didn't say: find out
00:42:23.690 --> 00:42:28.300
whether a red light violation was serious
or a speeding violation was serious, it
00:42:28.300 --> 00:42:34.619
said: find out whether a traffic violation
is serious. So you know it is a traffic
00:42:34.619 --> 00:42:40.549
violation, but so far we only have
functions, one works on red light
00:42:40.549 --> 00:42:43.729
violations, the other one works on
speeding violations, but they don't work
00:42:43.729 --> 00:42:53.720
on that mixed. So we'll try to do that now
and instead of writing red light violation
00:42:53.720 --> 00:43:01.119
we'll just write traffic violation to
boolean. So we could now write tests that
00:43:01.119 --> 00:43:05.199
match those that are there but I'll spare
you that. But in class we absolutely would
00:43:05.199 --> 00:43:15.560
need to do that. And now what we do is,
when we have a traffic violation– Remember
00:43:15.560 --> 00:43:20.849
how I said if you have compound data, you
put calls to the accessors in the body,
00:43:20.849 --> 00:43:25.420
and then you go on from there. But now
we're looking at mixed data in the input.
00:43:25.420 --> 00:43:29.549
So mixed data has a different template and
that template says: well if you're looking
00:43:29.549 --> 00:43:32.709
at mixed data, maybe this or that or that,
you should probably find out what that is
00:43:32.709 --> 00:43:40.479
before you do anything else. And for doing
that we use a conditional we use something
00:43:40.479 --> 00:43:45.430
like this– So what we need to do is we
need to distinguish red light violations
00:43:45.430 --> 00:43:48.460
from speeding violations, so we need some
function that will tell us which one it
00:43:48.460 --> 00:43:54.609
is. And this is the last bit up here in
the record definition. You remember that
00:43:54.609 --> 00:43:58.309
we said red violation here, red light
violation here. This is the name of the
00:43:58.309 --> 00:44:04.289
constructor, so it is the constructor.
These are the accessors. And this is
00:44:04.289 --> 00:44:08.230
what's called the predicate, and the
predicate tells us whether a thing is a
00:44:08.230 --> 00:44:14.089
red light violation or not. So in this
case the predicate says: red light
00:44:14.089 --> 00:44:20.489
violation question mark, or "p" is what
the programmers in these languages say.
00:44:20.489 --> 00:44:26.190
And it takes anything and it tells us
whether it is a red light violation object
00:44:26.190 --> 00:44:33.640
or not. I'm just gonna copy that down so
that we remember. We're almost done. So of
00:44:33.640 --> 00:44:37.119
course the same thing goes for speeding
violation. So we need a conditional that
00:44:37.119 --> 00:44:41.451
has as many branches as we have
alternatives in the data definition. And
00:44:41.451 --> 00:44:45.420
again you think this is super trivial and
childish, but it works very well for
00:44:45.420 --> 00:44:50.980
making successful programmers. So we need
two branches, and the way that works is
00:44:50.980 --> 00:44:59.119
this. So you write this out with ellipses,
and then you need to come up with tests
00:44:59.119 --> 00:45:03.079
for the two branches in this case the
tests are: is something a red light
00:45:03.079 --> 00:45:11.380
violation or is it a speeding violation.
So we have this, question mark tv, and we
00:45:11.380 --> 00:45:18.819
have this which says, speeding violation
tv. And now here we just need to put in
00:45:18.819 --> 00:45:21.799
the answers, and the great thing is we
already have the answers we already have
00:45:21.799 --> 00:45:33.301
two functions that tell us whether a red
light violation is serious and so we can
00:45:33.301 --> 00:45:42.259
just call that here and we can do this
here so and then we're done. So I think
00:45:42.259 --> 00:45:47.039
that's all we can do in this hour that we
have today. So I hope you see two things.
00:45:47.039 --> 00:45:56.709
First of all this is super boring and
super bureaucratic. But maybe you can see
00:45:56.709 --> 00:46:02.559
that every single step that we have here
has is a principle that has a specific
00:46:02.559 --> 00:46:06.250
name and that you can explain in very
specific concrete terms that are not
00:46:06.250 --> 00:46:10.329
abstract. And that means it can really
explain every step that's needed to solve
00:46:10.329 --> 00:46:16.410
this problem. And I can't tell you what a
game changer to that is for teaching. If
00:46:16.410 --> 00:46:20.199
you really ask yourself if, you know, when
you when you present an example to your
00:46:20.199 --> 00:46:24.069
students whether you can really explain
every single step and explain to the
00:46:24.069 --> 00:46:27.199
students here's what you should have
thought, you know, here's how you should
00:46:27.199 --> 00:46:33.339
have picked what to do next. That usually
ends up badly. So so one of the principles
00:46:33.339 --> 00:46:38.890
behind this style of teaching is really to
be absolutely sure every single step that
00:46:38.890 --> 00:46:42.680
you expect your students to make when they
solve a problem has a name and has been
00:46:42.680 --> 00:46:46.650
explicitly taught in your class. So every
technique has a name. You noticed me
00:46:46.650 --> 00:46:52.219
saying compound data and mixed data and
design recipe and template and skeleton.
00:46:52.219 --> 00:46:57.099
And so this is the factual knowledge that
we use that precedes the skill that we
00:46:57.099 --> 00:47:03.940
want to then induce. If you're teaching a
class that has rewards you reward every
00:47:03.940 --> 00:47:10.019
single step. You really insist on form. I
also can't stress this enough so on our
00:47:10.019 --> 00:47:14.430
home page you find a paper that says form
over function. We don't accept any program
00:47:14.430 --> 00:47:19.010
that is correct. We just accept the ones
that match the form that you've seen. We
00:47:19.010 --> 00:47:22.809
also measure success. You know you really
need to look at how well your teaching
00:47:22.809 --> 00:47:26.019
style is doing and you improve it
continuously. So those are the important
00:47:26.019 --> 00:47:31.650
principles. You might think that this
stifles creativity. And I really don't
00:47:31.650 --> 00:47:35.269
think that's true. And I think that is
based on a misguided notion of creativity.
00:47:35.269 --> 00:47:39.869
So if you talk it successfully creative
artists they really also rely on a set of
00:47:39.869 --> 00:47:44.799
named techniques that they use to tackle a
creative problem. And so somebody always
00:47:44.799 --> 00:47:49.230
says Mozart you know Mozart never had to
learn or practice before he got to be a
00:47:49.230 --> 00:47:54.019
great composer but Mozart started it so
early in childhood that he had his 10000
00:47:54.019 --> 00:48:00.670
hours of practice in there to be before
most people even start. So this works for.
00:48:00.670 --> 00:48:03.499
So this has been proven to work this
approach for children. I think I would
00:48:03.499 --> 00:48:07.839
start about 11 years, beginning
programmers. It's worked for programmers
00:48:07.839 --> 00:48:11.839
that had learned some other via some other
approach you know bad habits and
00:48:11.839 --> 00:48:16.059
professional developers. There's two
websites that you can go on to get more
00:48:16.059 --> 00:48:20.699
information. One is our American sister
project called programmed by design that
00:48:20.699 --> 00:48:24.829
has lots of material, links and
publications. The DrRacket software that I
00:48:24.829 --> 00:48:28.939
showed you. And there's also a book in
English how to design programs. And it
00:48:28.939 --> 00:48:32.559
doesn't say that here but that book is
available for free online but there's also
00:48:32.559 --> 00:48:36.989
a print version. And similarly if you're
looking for German language material
00:48:36.989 --> 00:48:41.119
there's "dein programm DOT de" which also
has links and publication, links to the
00:48:41.119 --> 00:48:45.709
same software. And the draft version of
that book is there too. And hopefully
00:48:45.709 --> 00:48:50.269
we'll have a print version of that also
next year. And that's all I have for you
00:48:50.269 --> 00:48:52.409
today. Thank you very much.
00:48:52.409 --> 00:49:03.349
Applause
00:49:03.349 --> 00:49:06.309
Herald angel: Thank you Mike for that
talk. If you have any questions, we do
00:49:06.309 --> 00:49:11.219
have the microphones lined up here in this
row and in that row and does the signal,
00:49:11.219 --> 00:49:17.479
yes the signal Angel has a question.
Signal Angel: Yes, so one IRC user asks
00:49:17.479 --> 00:49:23.390
what are the benefits of using this
DrRacket tool instead of for example
00:49:23.390 --> 00:49:26.449
Python which was also developed for
teaching?
00:49:26.449 --> 00:49:30.760
Mike: So Python is definitely not
developed for teaching, not in any
00:49:30.760 --> 00:49:36.109
meaningful way. So in practice, in
practice I think the fundamental diff-, so
00:49:36.109 --> 00:49:40.489
but there's a lot of educational
initiatives around Python. The thing is
00:49:40.489 --> 00:49:47.029
really that if you try to name and really
formalize the techniques the systematic
00:49:47.029 --> 00:49:50.999
techniques that I showed you and apply
that to Python programming you will find
00:49:50.999 --> 00:49:55.079
that very hard. I personally found it
impossible. Most Python programs out there
00:49:55.079 --> 00:49:58.140
in practice are just not developed
systematically and I don't know how to do
00:49:58.140 --> 00:50:02.200
that. And so that is where that is much
better. This corresponds to these
00:50:02.200 --> 00:50:08.009
programming languages were designed in
lockstep with the didactic principles that
00:50:08.009 --> 00:50:12.099
underlie them and as far as I can tell,
I'm sorry about that, Python was not
00:50:12.099 --> 00:50:16.300
developed with any didactic principles in
mind whatsoever. Sorry.
00:50:16.300 --> 00:50:21.630
Herald Angel: OK then. Microphone 2 please
go now.
00:50:21.630 --> 00:50:29.309
Questioner: I teach roughly 14 years olds
in the middle school and also programming
00:50:29.309 --> 00:50:34.999
and I use the App Inventor right now. The
App Inventor, MIT Media Lab App Inventor,
00:50:34.999 --> 00:50:43.690
I […] with scratch and I'm not sure you,
you said okay you need to buy Lego
00:50:43.690 --> 00:50:49.979
Mindstorms robots and stuff like that or
scratch or MIT App Inventor. That's not
00:50:49.979 --> 00:50:51.249
the case.
Mike: No. Yeah.
00:50:51.249 --> 00:50:58.799
Questioner: And what I find difficult for
the students I have there they are not the
00:50:58.799 --> 00:51:04.299
best from the best parents, then they
would like to show something in the end.
00:51:04.299 --> 00:51:08.619
And it's your program looks a lot like
Mike: Superball!
00:51:08.619 --> 00:51:14.750
Questioner: it is really very boring and
laughter how do you bring it over that
00:51:14.750 --> 00:51:19.449
point? I find it so valuable that in the
end they can show it on their smartphone.
00:51:19.449 --> 00:51:22.539
Mike: Yeah, depending on your target
audience of course you choose different
00:51:22.539 --> 00:51:27.249
examples and this example just had a lot
of things. You might have seen me show the
00:51:27.249 --> 00:51:30.420
pictures, show the picture algebra at the
beginning. So that's something that tends
00:51:30.420 --> 00:51:34.949
to work great for children and older
children alike and that scales all the way
00:51:34.949 --> 00:51:39.519
to writing video games and there's an
entire book that shows children or young
00:51:39.519 --> 00:51:43.710
people on how to do that. So that's one of
the great aspects of this. I think that's
00:51:43.710 --> 00:51:46.190
a fundamental difference to things like
scratch and so on this approach to
00:51:46.190 --> 00:51:49.979
programming scales all the way to
programm-, to professional programming and
00:51:49.979 --> 00:51:54.859
it scales to substantial video games. So
the students that we so we always used to
00:51:54.859 --> 00:51:58.609
do that the halfway point in the first
semester at the university and they were
00:51:58.609 --> 00:52:02.319
able to write a complete like 80s style
you know frogger or snakes or something
00:52:02.319 --> 00:52:05.559
like that that looked pretty fancy. And
that's something I think that your
00:52:05.559 --> 00:52:09.900
children could take home.
Herald Angel: OK. Then microphone 1.
00:52:09.900 --> 00:52:16.730
Questioner: Hi, thanks for your talk. I'd
like to know so your approach adds a lot
00:52:16.730 --> 00:52:22.890
of let's say overhead that is also
necessary to be taught. How do you go
00:52:22.890 --> 00:52:29.459
about the methodology in the actual
classroom though. Yeah. Do you al-, do you
00:52:29.459 --> 00:52:38.089
also have some recommendations on how to
tackle the actual design of the of the
00:52:38.089 --> 00:52:42.079
class, what methods do you use, do you use
a flipped classroom or what do you do?
00:52:42.079 --> 00:52:46.589
Mike: A good point. So so mostly the
classes that I have taught they are taught
00:52:46.589 --> 00:52:50.400
just like what I did just now. So I try to
demonstrate that to really make that clear
00:52:50.400 --> 00:52:55.509
because it hasn't really been documented.
I could refer you to friends of mine who
00:52:55.509 --> 00:53:00.130
have taught a flipped version of that
which also seems to work quite well. But
00:53:00.130 --> 00:53:04.259
the important thing really I can't stress
this enough that as a teacher and I
00:53:04.259 --> 00:53:07.939
skipped a couple of corners just now to
fit in the time slot was that you go
00:53:07.939 --> 00:53:11.930
through all of those motions that you
always go through all of that motion and
00:53:11.930 --> 00:53:16.390
that's a great tool not just for giving
every single step a name but also for
00:53:16.390 --> 00:53:21.950
pacing the classroom and that and the rest
kind of tends to fall in place has been my
00:53:21.950 --> 00:53:25.750
experience, right. No matter whether
you're looking at you know beginning
00:53:25.750 --> 00:53:28.680
students or professional programmers. I'm
not sure I answered your questions but
00:53:28.680 --> 00:53:34.249
maybe you can take the rest offline.
Herald Angel: Thank you. Microphone 3
00:53:34.249 --> 00:53:37.680
please.
Questioner: Yes. I think this is very
00:53:37.680 --> 00:53:43.809
great but it is teaching functional
programming and many people will very soon
00:53:43.809 --> 00:53:50.400
need imperative programming. How do you do
the switch or can you do it?
00:53:50.400 --> 00:53:54.339
Mike: So I I would dispute that but.
Laughter
00:53:54.339 --> 00:53:57.150
Questioner: Well if you want to get paid
for it.
00:53:57.150 --> 00:53:59.609
Mike: Thank you, go, go.
Laughter
00:53:59.609 --> 00:54:02.960
Mike: So I run a company that does all
their software projects doing functional
00:54:02.960 --> 00:54:06.979
programming. Ultimately you will need to
talk about effects. The thing what this
00:54:06.979 --> 00:54:12.109
does really is I mean if you're writing
software professionally you know no matter
00:54:12.109 --> 00:54:15.739
what the language is, large parts of that
should be functional. So this is a great
00:54:15.739 --> 00:54:20.479
way to teach good programming discipline
and a lot of programs out there don't show
00:54:20.479 --> 00:54:25.039
good programming discipline. So I think
this would be great to improve upon that.
00:54:25.039 --> 00:54:29.180
So what this does is it pushes the
boundary. To be honest I have no idea how
00:54:29.180 --> 00:54:32.509
to teach systematic development using
imperative languages. I don't know how to
00:54:32.509 --> 00:54:35.890
do that. I don't know how to do it and I
don't know how to teach doing it. On the
00:54:35.890 --> 00:54:40.789
other hand what I can do that do here is I
can push the imperative parts of the
00:54:40.789 --> 00:54:44.240
programming to the fringe and make them
less important for the success of my
00:54:44.240 --> 00:54:51.529
project and for the structure of my
project. So yeah. So you should. This is
00:54:51.529 --> 00:54:55.259
the good thing because we know functional
programming works well and we know it is a
00:54:55.259 --> 00:55:01.490
good foundation for an educational
discipline. And yeah I can't, I mean there
00:55:01.490 --> 00:55:05.599
are there are various courses that build
up upon this, but ask me offline about
00:55:05.599 --> 00:55:08.569
that that tackle that imperative
programming.
00:55:08.569 --> 00:55:14.029
Herald Angel: OK then microphone 4 please.
Questioner: Yeah I'd like to thank you for
00:55:14.029 --> 00:55:22.380
your talk too and I'm curious what's your
experience how many repetitions do you
00:55:22.380 --> 00:55:28.539
need to teach your students until they
settle with the principles. Do you teach
00:55:28.539 --> 00:55:32.920
like three examples or is it up to 10
examples?
00:55:32.920 --> 00:55:39.390
Mike: I'm not sure I have a solid rule for
that. So my experience has been, so I think
00:55:39.390 --> 00:55:44.809
every principle here usually has like two
in class examples at the university level
00:55:44.809 --> 00:55:48.670
and then has maybe three or four examples
where they do exercises and that's usually
00:55:48.670 --> 00:55:52.539
enough but your experience might vary. I
don't I don't think I have a good rule for
00:55:52.539 --> 00:55:58.739
that. Generally you might not have gotten
for this but so the point of comparison
00:55:58.739 --> 00:56:02.420
and where I have the most experience is at
the university level. Overall the
00:56:02.420 --> 00:56:06.509
progression of material in here is really
really fast compared to your traditional
00:56:06.509 --> 00:56:11.969
Java course. So you can cover a lot of
material using that. I'm not sure how many
00:56:11.969 --> 00:56:16.839
how many university students or university
courses have successful video games in the
00:56:16.839 --> 00:56:21.719
middle of the first semester and there are
nice programs that are well structured so
00:56:21.719 --> 00:56:26.539
so surprisingly maybe even though this is
so boring and tedious it allows you to
00:56:26.539 --> 00:56:30.859
write programs successfully quite fast and
also goes to lots of teaching to go quite
00:56:30.859 --> 00:56:34.819
fast.
Herald Angel: OK. Microphone 2 please.
00:56:34.819 --> 00:56:40.979
Questioner: Hello, thank you for your
talk. When I learned programming as a kid
00:56:40.979 --> 00:56:50.220
quite young and I think that I could
transport tools and the mindset also to
00:56:50.220 --> 00:56:53.429
mathematics and full blown problems.
Mike: Yes.
00:56:53.429 --> 00:57:00.900
Questioner: So I just wanted to ask if in
your experience can children also use this
00:57:00.900 --> 00:57:07.959
systematic way of solving, I mean do they
really make this transition? Can, are they
00:57:07.959 --> 00:57:11.310
getting better at solving problems?
Mike: Yeah absolutely they do. So if you
00:57:11.310 --> 00:57:15.499
look at one of the three projects I listed
was the Bootstrap Project which is which
00:57:15.499 --> 00:57:19.739
is aimed at high school students or middle
school students and there the approach is
00:57:19.739 --> 00:57:23.510
specifically tied to the algebra part of
mathematics and so this is where you'll
00:57:23.510 --> 00:57:28.529
find exactly what you're looking for. And
that's been that project's been usually
00:57:28.529 --> 00:57:32.099
successful and they have lots of material
on how it should be taught. So that's
00:57:32.099 --> 00:57:35.099
great stuff.
Herald Angel: Okay, we have two more
00:57:35.099 --> 00:57:39.069
minutes and two questions. So Microphone 1
please.
00:57:39.069 --> 00:57:43.900
Questioner: Hi. How do you measure success
in your teaching?
00:57:43.900 --> 00:57:48.559
Mike: So mostly at the university level
we look at the final exams and we have a
00:57:48.559 --> 00:57:54.069
few papers out that are referenced from
the web page there. That's I mean usually
00:57:54.069 --> 00:57:57.200
what we do is we have pretty close
supervision, even at the university level.
00:57:57.200 --> 00:58:03.069
So we look over students' shoulders all
the time to make sure that we're teaching
00:58:03.069 --> 00:58:07.359
them at the appropriate level and at the
appropriate pace. But over the years we've
00:58:07.359 --> 00:58:13.200
seen measurable improvements by looking at
the final exams and very specific ones. So
00:58:13.200 --> 00:58:16.959
we don't just look at the overall grade we
look at individual problems and see all
00:58:16.959 --> 00:58:21.569
the progress has been and what we expect
and there's papers out on that.
00:58:21.569 --> 00:58:25.440
Herald Angel: And micr
ophone 4 please.
00:58:25.440 --> 00:58:33.059
Questioner: Is there some kind of auto
completion in your editor or do you not
00:58:33.059 --> 00:58:36.569
advise us to use this feature for
beginners?
00:58:36.569 --> 00:58:42.109
Mike: Laughter. No there's not auto
completion as far as I know. I'm not sure
00:58:42.109 --> 00:58:47.670
I would advise against it. I know that my
American colleagues they've I mean as
00:58:47.670 --> 00:58:51.319
you've noticed write the templates as it's
sort of always recurring program elements
00:58:51.319 --> 00:58:56.289
and you could imagine there being a button
that inserts that program fragment and our
00:58:56.289 --> 00:59:00.470
American friends they experiment with that
and they came out not using that in
00:59:00.470 --> 00:59:04.039
practice anymore. But I can't tell you
details on how that is. But if you're
00:59:04.039 --> 00:59:08.249
interested you could send me email and I
could find out. So for some reason so I
00:59:08.249 --> 00:59:13.009
can't tell you why and I'm not I'm not
ideologically opposed to that but we're
00:59:13.009 --> 00:59:18.670
not doing that.
Herald Angel: OK then. Mike thank you for
00:59:18.670 --> 00:59:24.519
that very enlightening talk and become a
big applause for that talk.
00:59:24.519 --> 00:59:32.119
Mike: Thank you very much.
Applause
00:59:32.119 --> 00:59:37.494
postroll music
00:59:37.494 --> 00:59:55.000
Subttitles created by c3subtitles.de
in the year 2019. Join and help us!