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!