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