[00:00.000 --> 00:11.200] Okay, so hi everyone. Awesome that you're all here. I'm Jadka, this is Jens and we will [00:11.200 --> 00:16.280] now present SNAP, a programming language that we work on together with Bernat and a few [00:16.280 --> 00:20.920] other people that I'll mention in a second. And what we want to do with you today, or [00:20.920 --> 00:26.160] what you have to listen to, is first I'll explain shortly what SNAP is and why we care [00:26.160 --> 00:32.600] about it. Then we'll show our three guiding principles and if we have time in the end, [00:32.600 --> 00:39.040] Jens will show what's under the hood of SNAP as well. Okay, so SNAP is a visual block [00:39.040 --> 00:43.200] space programming language and I'll show you that to you in a second. It's also like [00:43.200 --> 00:48.400] MicroBlocks Live and Parallel and we develop it together with people at UC Berkeley in [00:48.400 --> 00:53.800] California. So we have three people, us three working together with three people from UC [00:53.800 --> 00:58.640] Berkeley, developing this thing together. SNAP is a block space programming language [00:58.640 --> 01:03.520] but it's aimed at high school and college students but as you will see in a second, [01:03.520 --> 01:10.160] you can basically start whenever you want with it. Okay, our three guiding principles, [01:10.160 --> 01:15.680] let's start with the first one, is low floor. So this means that we really want to have [01:15.680 --> 01:22.320] engaging activities for entry level programmers so you don't get scared away and that we really [01:22.320 --> 01:29.080] want to have fun activities that they can do. To show you that, I've built a super [01:29.080 --> 01:34.080] simple what we call a micro world. So this is an extension of SNAP that I customized [01:34.080 --> 01:40.520] myself and this only has these three blocks here and as you can see you don't even have [01:40.520 --> 01:46.360] to read to use them. We can just try them out and see what happens. So let me increase [01:46.360 --> 01:51.800] the stage size a bit so I can click on that. As you can see it's live so I'm clicking on [01:51.800 --> 01:57.320] it while it's in the palette and it's still doing things. I can click on that, nothing [01:57.320 --> 02:02.320] happens. I see oh wow there's an input slot here, maybe I could type a number in here. [02:02.320 --> 02:07.560] Let's see what happens now. Okay, it's doing something. This is stamping a flower and this [02:07.560 --> 02:12.440] one is supposed to be a sponge. It's clearing the stage again. So since we're working with [02:12.440 --> 02:22.160] flowers let me draw a beautiful petal real quick using the costume editor. Let's do a [02:22.160 --> 02:33.280] yellow one. Oh that's brown. Okay and then let me draw something. And let me even fill [02:33.280 --> 02:41.400] it maybe. Yeah wow this is very beautiful and then let's make this even more beautiful [02:41.400 --> 02:46.840] and let's also, that's important, move the rotation center. And let's try the same thing [02:46.840 --> 02:54.080] again. Ah okay this is pretty cool. So now if I want more flowers I can build a larger [02:54.080 --> 02:59.400] script so I can use the central area of snap to build more complex programs. So I could [02:59.400 --> 03:03.760] go to a random position and draw another flower there and go to a random position and draw [03:03.760 --> 03:09.400] another flower there and so I could click on that forever. But it would also be cool [03:09.400 --> 03:13.160] to just have a forever loop that does that. So computers are really good at doing things [03:13.160 --> 03:19.560] automatically very often so why don't I make a loop. So I already prepared this page here [03:19.560 --> 03:25.600] and let's use for the look for the infinity sign because what I want to build is an infinite [03:25.600 --> 03:33.400] loop and let's just copy that and then let's build our own control structure by just hiding [03:33.400 --> 03:38.280] it in the actual, I don't know we don't hide it, let's just do it. So this is going to [03:38.280 --> 03:45.520] be a control block and I'm calling it infinity. And this is going to have two inputs, one [03:45.520 --> 03:50.640] is going to be, no it's only having one input, it's going to be the action. So let me build [03:50.640 --> 03:59.400] this block, I already have it here. So okay no let's do that again. Sorry I'll just delete [03:59.400 --> 04:05.800] that and start over again. Okay I want to make a control structure, it's called infinity. [04:05.800 --> 04:11.200] I want to add a parameter to that and this is the action that I'm going to run. I can [04:11.200 --> 04:18.200] even decide what I want this to look like. So as you might know from scratch our loops [04:18.200 --> 04:23.920] have the C shaped or from snap our loops have the C shaped command structure. So I can click [04:23.920 --> 04:29.400] on that and when I apply that you see that I have the C shaped block with this infinity [04:29.400 --> 04:34.040] sign on it and now I need to decide what I want to do with this block. So first I want [04:34.040 --> 04:40.920] to run the action, I don't have a run block here so let me just open the hide blocks section [04:40.920 --> 04:46.240] and because I hit all the actual blocks from snap and I'll show you how to do that in a [04:46.240 --> 04:55.360] second and let me drag out one of the run blocks. And what I want to do is I want to [04:55.360 --> 05:01.540] run the action and then I want to repeat the same thing and I want to run the action again. [05:01.540 --> 05:06.800] So I think that's correct. Let's try it. So I made myself a forever loop and let's clear [05:06.800 --> 05:13.040] the stage so we can actually see what's happening and let me drag this around here and I can [05:13.040 --> 05:17.200] run my program and I built myself my own control structure and it still looks very simple for [05:17.200 --> 05:22.600] kids but all of you obviously could do that. So this is one thing that we really care about. [05:22.600 --> 05:28.040] We want really simple entry level engaging activities and this is one of my favorite [05:28.040 --> 05:34.480] starter projects but we also want teachers to be able, educators to be able to build [05:34.480 --> 05:39.800] these microverts very easily and we want them to be able to customize snap in a way that [05:39.800 --> 05:46.880] they can use it for their needs. What I also wanted to show you in this project, let me [05:46.880 --> 05:52.520] make the stage a bit smaller again, you can have several what we call scenes in a project [05:52.520 --> 05:58.000] so this is basically a project in another project. So I can now switch to that scene [05:58.000 --> 06:03.600] and here I already prepared a petal and you see that I have more blocks than I had before. [06:03.600 --> 06:09.200] I also have a separate stage so I can switch between scenes and we can use that idea to [06:09.200 --> 06:14.400] build something like language levels. So in the first, in the first micro world I used [06:14.400 --> 06:21.360] I just had that block that draws a flower. In the second micro world I want learners [06:21.360 --> 06:26.320] to be able to build this flower block themselves. So we gave them all the tools that they need [06:26.320 --> 06:32.400] for that. So here for example we only have this block that stamps a leaf, so one of the [06:32.400 --> 06:40.080] petals. So what else do I need to build the flower? I want to do that several times so [06:40.080 --> 06:45.720] I might need a loop and this one as you can see has a number as an input so I can specify [06:45.720 --> 06:51.400] the number of repeats and of course I need a turn in between. So what we want to do is [06:51.400 --> 06:58.240] we want to stamp, let's do a flower with six petals and then I need a turn in between [06:58.240 --> 07:03.600] and also I build this block myself and I want to turn 60 degrees each time so let's clear [07:03.600 --> 07:11.800] before we draw a flower. And then let's do one. So this is how the flower block was actually [07:11.800 --> 07:21.280] built in the first thing. So we can help learners to gradually get new ideas. And then which [07:21.280 --> 07:25.800] is, which I find pretty cool, it's also super simple in Snap to prepare your own libraries. [07:25.800 --> 07:30.840] So I made one if you have a kid in class that is just faster than the other kids. You can [07:30.840 --> 07:37.080] export a library and just let them add more blocks. So here I added a few more blocks. [07:37.080 --> 07:43.120] For example these ones let me change the appearance of the petal that I have. So this one for [07:43.120 --> 07:48.720] example changes the size of it. Let's set this to 100 and then you see the petal becomes [07:48.720 --> 07:54.880] super huge. I can set that to 10. Let's clear again. Then it becomes super small so maybe [07:54.880 --> 08:00.520] we want to pick something in between and we could even do that randomly. So for example [08:00.520 --> 08:08.520] I could add this here and I want the size to be between 20 and 40 and then I get differently [08:08.520 --> 08:15.880] sized petals each time I do that. So if I do it like this you see that this changes [08:15.880 --> 08:22.400] and I really like that about Snap that you can easily expand projects with fun ideas [08:22.400 --> 08:27.480] so they look differently and are more engaging but you only need like one or two more ideas. [08:27.480 --> 08:32.680] This one for example switches to the next costume so if I wanted to add another petal [08:32.680 --> 08:42.760] let's draw one. Let's do the one that I did before but in blue this time. Let's fill [08:42.760 --> 08:51.040] it with something. Okay and then again let's move the rotation center to one of the tips [08:51.040 --> 08:59.880] and we can now use that and each time we draw something we draw a different flower. So the [08:59.880 --> 09:05.760] next one in line and then again we can combine that with what we had before and just create [09:05.760 --> 09:16.720] a beautiful flower field with the blocks that we made. How do you do that if you want to [09:16.720 --> 09:24.000] create a micro world? Let me go to the third one I prepared so this is not actually a micro [09:24.000 --> 09:29.320] world this is regular Snap with all the blocks that you have so as in other block space programming [09:29.320 --> 09:32.840] languages we have different categories here we have the palette on the left where you [09:32.840 --> 09:37.480] find all the blocks for a specific category as I mentioned before it's a live programming [09:37.480 --> 09:43.800] language so you can just click them and something happens immediately and what I also added here [09:43.800 --> 09:49.200] or what I thought I added here but didn't oh that's unfortunate is the so let's just [09:49.200 --> 09:55.000] build it is the project so again we want to have all the blocks that we used last time [09:55.000 --> 10:02.600] so what we had was the next costume block we had the set size tool block we had the [10:02.600 --> 10:12.320] pig random block we also need a division block we had a repeat block we had a forever block [10:12.320 --> 10:23.280] we had a stamp block and we had a turn block and what was the last one oh the second to [10:23.280 --> 10:30.560] last one was clear and what was the last one go to random position awesome and we need [10:30.560 --> 10:34.720] to go to random position and let's assemble these so that we actually can make sure that [10:34.720 --> 10:41.080] our script is working so for a flower we want to repeat a specific number of times let's [10:41.080 --> 10:48.240] do six times then we want to stamp then we want to turn the number of degrees that's [10:48.240 --> 10:57.360] three that's 360 divided by the number of petals that I want so six in this case and [10:57.360 --> 11:02.800] before we wanted to do that we wanted to go to a random position so let's check that that [11:02.800 --> 11:08.920] seems to work awesome we wanted to do that forever and so that all flowers don't look [11:08.920 --> 11:15.640] the same we wanted to set the size to a random position a random size random number let's [11:15.640 --> 11:22.800] do twenty to thirty maybe and we need a second costume so let's just duplicate that one and [11:22.800 --> 11:33.760] let's change the color a bit yeah this is very different awesome this is exactly what [11:33.760 --> 11:43.840] I oh wow okay okay and so we have two costumes so we can actually also use the next costume [11:43.840 --> 11:47.840] block and so we start with a clear stage let's add that at the beginning and let's see whether [11:47.840 --> 11:53.000] this works okay awesome and now if you want to build your own micro world you can just [11:53.000 --> 11:59.800] go to the file menu and select hide blocks and then that's the awesome thing that we [11:59.800 --> 12:09.720] added in the second last like the previous release and you can hide all the unused blocks [12:09.720 --> 12:14.280] and if I do that I only have the blocks left in the palette that I used for my project [12:14.280 --> 12:18.640] and they are in these categories here and I can even make the single palette that I [12:18.640 --> 12:23.360] had before by clicking on the settings menu and then selecting the single palette and [12:23.360 --> 12:28.280] now you have all the blocks in like one palette and you can make your own micro worlds that [12:28.280 --> 12:34.240] have all the blocks that you need for your project that you want to do in class or with [12:34.240 --> 12:38.560] your kids or with some other people who want to learn programming and then you can delete [12:38.560 --> 12:45.280] that and then you have your perfect passance puzzle generator and so this is again the [12:45.280 --> 12:50.800] low floor idea that I mentioned we really want to have engaging activities that have [12:50.800 --> 12:56.800] a cool artifact that looks beautiful or is fun to do but we also want to help teachers [12:56.800 --> 13:03.680] and educators to create these fun and engaging activities in a simple way okay the second [13:03.680 --> 13:09.600] idea that I wanted to present or that we think is or that we care about is white walls so [13:09.600 --> 13:15.320] we want to allow for a huge variety of projects and the ones that we care most about media [13:15.320 --> 13:22.440] projects so we love this idea of media computation meaning you learn general purpose programming [13:22.440 --> 13:29.840] by playing with sounds images texts and one exemplary project for that is for example [13:29.840 --> 13:35.920] from snap you can access the microphone of your computer so in this case if it's running [13:35.920 --> 13:40.880] it should be and this for example is a visualization of the frequency spectrum of my voice that's [13:40.880 --> 13:47.040] just picked up through the microphone so this looks beautiful at the same time as it's interesting [13:47.040 --> 13:52.800] because you can talk about sounds from a physical and computational perspective and we love [13:52.800 --> 14:01.520] to do stuff with the camera so this is another project that I like very much this is pasting [14:01.520 --> 14:08.600] the webcam of my computer to the stage right now I set the transparency to 50% let's make [14:08.600 --> 14:13.480] it fully transparent so the video is still there but you can't see it anymore because [14:13.480 --> 14:19.200] all the pixels are transparent and then I am sending a message to the other sprite and [14:19.200 --> 14:28.920] what's that doing is it's drawing dots on the stage which size corresponds to the brightness [14:28.920 --> 14:34.760] that it's measuring in the image that it picks up from the camera and this is actually a [14:34.760 --> 14:39.200] pretty cool technique it's called dithering and this is how images were made in newspapers [14:39.200 --> 14:43.480] back in the days when you didn't weren't able to print different colors so you just did differently [14:43.480 --> 14:51.080] sized dots to get like a more deep color space so this is what we mean with white walls allow [14:51.080 --> 14:57.520] a variety of projects that are engaging and fun and that also kids who don't necessarily [14:57.520 --> 15:04.640] like Fibonacci might find interesting and the last idea for that I will hand over to [15:04.640 --> 15:11.760] Jens is no ceiling so as I said snap is a programming language that's aimed for high [15:11.760 --> 15:17.480] schoolers and early college students so it's scratch but with all the awesome ideas that [15:17.480 --> 15:34.520] make programming fun and Jens is going to show you this now. [15:34.520 --> 15:43.600] Thank you Jadka so we're having kind of a conflict here because we want to have this [15:43.600 --> 15:50.280] low floor and the wide walls for the kids but we're also having this idealist notion [15:50.280 --> 15:57.400] of blow off the ceiling like we don't want to constrain kids we don't want to dumb down [15:57.400 --> 16:05.280] the language so it's okay for kids and this is kind of coming from the sixties when you [16:05.280 --> 16:11.080] know some of you might remember logo had the idea that you know you don't you don't make [16:11.080 --> 16:16.080] stuff easy for kids but you make it welcoming for kids but you don't constrain it you let [16:16.080 --> 16:24.280] kids express everything they can and this is only one part of the pedagogy the other [16:24.280 --> 16:30.960] part of the pedagogy is geared as Mark said towards teachers towards educators because [16:30.960 --> 16:38.000] if you look at these micro worlds that Jadka has shown let me again go to oh yeah this [16:38.000 --> 16:44.320] is mine already so here is a bunch of blocks like these aren't the regular blocks these [16:44.320 --> 16:53.160] are the ones that we made okay I need to stay more in the center of so y'all at home can [16:53.160 --> 17:00.440] see me we want teachers to be able to build these exercises to build these micro worlds [17:00.440 --> 17:05.360] for their kids so it's not just us you know building something here's an exercise you [17:05.360 --> 17:09.800] can do with their kids but there's a teacher there's an educator wants to teach something [17:09.800 --> 17:16.000] as Yadka did about what was then called you remember the total turtle trip theorem that [17:16.000 --> 17:20.720] was kind of what Yadka showed you about so we built a micro world to that which language [17:20.720 --> 17:26.200] are they going to build this sub language in are they going to have to learn another [17:26.200 --> 17:32.040] language to build these little domain specific languages no you saw Yadka build these blocks [17:32.040 --> 17:43.960] in snap itself and so we want to take this even further and find out whether we can maybe [17:43.960 --> 17:50.120] even invent a language that lets us build a block space language inside the block space [17:50.120 --> 17:57.320] language and for this we really kind of want to do things that we can do in the UI we want [17:57.320 --> 18:03.400] to be able to do it in the language so in this palette here I made a little block and [18:03.400 --> 18:10.280] it shows me some tools so if I click on this I'm getting some more blocks and I can again [18:10.280 --> 18:14.640] hide these it's a very simple block I can build myself that just shows and hides me [18:14.640 --> 18:21.840] some blocks and now I can kind of explore some of these things so I can for example look [18:21.840 --> 18:33.040] at this block that the flower block and I can see how it is defined and see it is defined [18:33.040 --> 18:38.940] with its own blocks so I can open this and edit it but I can also get the definition [18:38.940 --> 18:44.440] of this in a program so now I'm getting the definition of this block and I can see that [18:44.440 --> 18:50.160] it's a function I can take this out and I can do some other interesting things with that [18:50.160 --> 18:57.560] so here is our split block for example I can split hello world by the space and I get hello [18:57.560 --> 19:04.240] and world I can split it by letters and I get each letter so what happens if I split [19:04.240 --> 19:17.720] a script by blocks let's make this even smaller if I split a script by blocks I'm getting a [19:17.720 --> 19:24.720] syntax tree a table of the syntax elements in there so I can do this with you know the [19:24.720 --> 19:33.920] definition of my flower block and oh wow so I can so this is a table so I can also flatten [19:33.920 --> 19:41.200] this so I'm not saying I don't want the length of this I want it flattened so now I'm getting [19:41.200 --> 19:47.160] a list of all the syntax elements that make up the definition of this flower block and [19:47.160 --> 19:51.880] that's kind of interesting because now I can find out for example so here I can take out [19:51.880 --> 20:06.320] the turn block and I can say you know do all of these um is this list contain this turn [20:06.320 --> 20:14.160] block and says yes the turn block is part of the definition of this list so but what [20:14.160 --> 20:22.040] about for example the clear block is that also in there no it's not present in there [20:22.040 --> 20:28.480] so this is interesting I could maybe discover something else so what I can I can look at [20:28.480 --> 20:35.200] all the blocks that I have in this micro world this is a list of all the blocks in this micro [20:35.200 --> 20:44.240] world so I'd like to find out which blocks contain this turn block so I could say you [20:44.240 --> 20:59.360] know I want to keep I want to filter from my blocks those that contain this block let's [20:59.360 --> 21:05.080] see whether that works yeah so I'm getting a list of two blocks that all use this block [21:05.080 --> 21:13.260] now I can turn this into its own block I make a block that says this is the colors of a [21:13.260 --> 21:25.120] block block and the block should be an input so I'm saying this is a block and in order [21:25.120 --> 21:31.040] to define this well I just did define this I just dragged this in and I say okay this [21:31.040 --> 21:40.800] should should work for any block so not not just this block but for any block and um so [21:40.800 --> 21:47.400] now I have this block that gives me the colors of for example this block let me see whether [21:47.400 --> 21:57.040] it works so this block is used by two other blocks and this block isn't used by any other [21:57.040 --> 22:07.480] block and huh let me see maybe I can get a whole report by looking at all the blocks [22:07.480 --> 22:19.640] and by mapping overall the blocks and I want to see the block and I want to see its colors [22:19.640 --> 22:26.480] right so what we're now doing is really an introspection of the system of the block system [22:26.480 --> 22:34.440] in itself so if I map this I'm sort of getting this interesting structure it's a data structure [22:34.440 --> 22:45.160] it's a table and it's a graph really a reverse dependency graph of all the blocks and the [22:45.160 --> 22:53.520] blocks it uses and I get a report of the overall structure of my micro world and folks this [22:53.520 --> 22:58.920] is something interesting if you think about this so we're starting with this easy simple [22:58.920 --> 23:04.560] thing that we can build worlds for kids and we want to build these little domain specific [23:04.560 --> 23:10.440] languages but we want to have a language that actually lets us build these things in itself [23:10.440 --> 23:17.600] and this is why we build introspection and kind of all the goodies of functional programming [23:17.600 --> 23:22.280] into this language but we didn't want to make it so that you kind of have to go down to [23:22.280 --> 23:28.280] memory addresses but we want to represent everything in blocks and this is kind of the [23:28.280 --> 23:34.200] idea of no ceiling because at one point you know we start doing this with kids but we [23:34.200 --> 23:38.560] actually build it for the University of California at Berkeley and they're using it for the [23:38.560 --> 23:44.040] introductory course of computer science for non majors and you know this goes up quite [23:44.040 --> 23:51.520] a long way so we actually want to be able to do scheme in this and to really teach abstraction [23:51.520 --> 23:56.320] so at one point we really want to blow off the ceiling and we don't want to do just only [23:56.320 --> 24:00.600] this imperative style programming where you know one follows the other and you've got [24:00.600 --> 24:06.240] the puzzle pieces but we actually do a higher order function you do kind of recursive you [24:06.240 --> 24:15.320] build your own control structures you build your own language it's a little stiff and [24:15.320 --> 24:19.700] it's challenging to try to accommodate you know the let's draw a flower with a bunch [24:19.700 --> 24:28.080] of three blocks to let's invent our own programming language in the same environment and in order [24:28.080 --> 24:35.280] to build such an environment the whole thing that you see here at your nerds I can show [24:35.280 --> 24:40.840] you right the whole thing you see here isn't using Blockly or a library but what you're [24:40.840 --> 24:46.960] seeing here is actually an operating system that runs inside a single canvas element in [24:46.960 --> 24:53.720] the browser and there's sort of a pill you can take to switch to dev mode and you're [24:53.720 --> 25:00.600] sort of inside this environment that some of you might recognize looks a lot like Squeak [25:00.600 --> 25:07.320] so if anybody you know Squeak and so it's kind of the same morphing environment where [25:07.320 --> 25:14.000] you could just get you know any things you can directly manipulate them for example [25:14.000 --> 25:23.920] you can make this bold but you can also use this to you know let's make a slider I can [25:23.920 --> 25:31.880] attach the slider set the target to the string morph to the font size I can change it I can [25:31.880 --> 25:41.360] make it horizontal and now my slider governs for example the size the font size of this [25:41.360 --> 25:50.880] I can make other elements like for example color palette and I could set the target of [25:50.880 --> 25:57.280] the color palette also to the string and now I can change the color and the size I can [25:57.280 --> 26:05.360] still edit it so this is basically our own system that is kind of self sustained in the [26:05.360 --> 26:15.840] browser and everything that you see in snap is sort of an application inside this really [26:15.840 --> 26:23.440] OS inside the browser and comes with its own green threading model which is how we do parallelism [26:23.440 --> 26:30.440] so in order to go up on the ladder of abstraction on the back end side we have to go kind of [26:30.440 --> 26:42.080] down to not the metal but to kind of a metal of sorts of the browser okay this was kind [26:42.080 --> 26:52.320] of our ideas if you'd like to check it out it runs on snap.berkeley.edu give it a try [26:52.320 --> 26:59.160] yourself you'll find lots of material there is it's open source by the way it's free and [26:59.160 --> 27:07.120] open source is an AGPL license so if you want to know so it's copy lefted so you know everything [27:07.120 --> 27:14.040] is open source about it we write the front end the back end the community side it's not [27:14.040 --> 27:22.120] as big as some other languages but we've got a vibrant community it's all hosted on github [27:22.120 --> 27:27.040] please do contribute please do fork it many people have forked it please let us know what [27:27.040 --> 27:39.960] you think and thanks for coming. [27:39.960 --> 27:45.000] So I found that really fascinating and as a list programmer I couldn't help but think [27:45.000 --> 27:51.560] about macros when you were showing the exploding of blocks so would it be possible once you [27:51.560 --> 27:57.040] get the abstract syntax tree to annotate it let's say add a sound between each step and [27:57.040 --> 28:02.240] then recreate a new block from an existing block? [28:02.240 --> 28:06.400] Yes if we had more time I could show you this we do have macros. [28:06.400 --> 28:12.560] So I showed you the split block which takes apart the stuff we have a joint block that [28:12.560 --> 28:23.840] you could pass on the syntax tree. [28:23.840 --> 28:28.600] Well this is running in the web in a browser so your phone can run the thing in a browser [28:28.600 --> 28:34.800] what you get here is you can publish it as a URL and yes and then you can run it on the [28:34.800 --> 28:39.240] phone and it's something I like to do with kids a lot it's also interesting if you do [28:39.240 --> 28:48.200] stuff on touch devices like on tablets or stuff like that you kind of need to be considerate [28:48.200 --> 28:53.840] of which gestures to use because you don't have mouse over or you know so yeah it's [28:53.840 --> 29:15.600] fun. [29:15.600 --> 29:22.240] That's a good question I really have this dream that I think block space programming if we [29:22.240 --> 29:33.320] take away the kitty stigma of it and if we dare move on from this sometimes horrible imperative [29:33.320 --> 29:40.880] paradigm to the beauty and joy of functional programming that you know we get these expressions [29:40.880 --> 29:46.960] that actually make things easier to understand that make things more accessible and that [29:46.960 --> 29:54.080] this is a great way to be to actually you know express many things inside professional [29:54.080 --> 29:59.600] development so we write the software in a way that we like to use it ourselves and [29:59.600 --> 30:07.440] we hope that it might convince others to actually build and embed this into enterprise applications [30:07.440 --> 30:12.480] because often enough if you think about these low code no code things you know you moved [30:12.480 --> 30:16.840] you click together some preconfigured stuff but then you need to write some glue code and [30:16.840 --> 30:23.120] the glue code often enough is terrible and awful and this is where I would love to see [30:23.120 --> 30:34.560] a block space environment that has no ceiling yes it is less it is skiing in the browser [30:34.560 --> 30:49.320] yes exactly and we do have stickers and buttons here take all you want yeah yeah thank you [30:49.320 --> 31:06.360] very much again.