1 00:00:00,000 --> 00:00:03,975 Alright, so this is a project that, 2 00:00:03,975 --> 00:00:06,630 as you can see from the authorship list here, 3 00:00:06,630 --> 00:00:10,260 has been a lot of people actually, 4 00:00:10,260 --> 00:00:11,670 it's all undergraduate students that have 5 00:00:11,670 --> 00:00:13,590 worked on this project other than myself. 6 00:00:13,590 --> 00:00:14,550 So I've just listed them 7 00:00:14,550 --> 00:00:16,660 in alphabetical order here. 8 00:00:16,760 --> 00:00:18,870 Some of them were, of course staff, 9 00:00:18,870 --> 00:00:20,790 some of them were students 10 00:00:20,790 --> 00:00:21,990 interested in the topic. 11 00:00:21,990 --> 00:00:23,160 I do want to particularly shout 12 00:00:23,160 --> 00:00:24,930 out gabriel, Wow, 13 00:00:24,930 --> 00:00:26,550 who came up with 14 00:00:26,550 --> 00:00:29,130 the initial design for this thing. 15 00:00:29,130 --> 00:00:31,590 So I'm excited to 16 00:00:31,590 --> 00:00:32,520 present on behalf of 17 00:00:32,520 --> 00:00:34,735 the people who actually did the work. 18 00:00:34,735 --> 00:00:38,615 So if you try to investigate 19 00:00:38,615 --> 00:00:40,880 how people's experiences go 20 00:00:40,880 --> 00:00:42,380 when they're learning Rust borrow checker, 21 00:00:42,380 --> 00:00:43,460 you start to find 22 00:00:43,460 --> 00:00:45,830 really interesting quotes or poems, 23 00:00:45,830 --> 00:00:47,910 almost this 24 00:00:48,670 --> 00:00:51,200 poem here from a study conducted by 25 00:00:51,200 --> 00:00:52,670 Michael goblins and colleagues as 26 00:00:52,670 --> 00:00:54,170 learning Russian ownership is like 27 00:00:54,170 --> 00:00:55,760 navigating a maze where the walls 28 00:00:55,760 --> 00:00:57,559 are made of asbestos and frustration. 29 00:00:57,559 --> 00:00:59,075 And the maze has no exit. 30 00:00:59,075 --> 00:01:00,380 And every time you hit a dead end 31 00:01:00,380 --> 00:01:02,300 you get an aneurism and die. 32 00:01:02,300 --> 00:01:05,570 So I love this quote. 33 00:01:05,570 --> 00:01:07,370 It really expresses 34 00:01:07,370 --> 00:01:09,440 the frustration that students 35 00:01:09,440 --> 00:01:11,180 feel in 36 00:01:11,180 --> 00:01:13,684 navigating this so-called alien concept, 37 00:01:13,684 --> 00:01:16,460 this biggest struggle that they face. 38 00:01:16,460 --> 00:01:18,770 The phrase fighting the borrower checkers 39 00:01:18,770 --> 00:01:19,820 come up today and it comes 40 00:01:19,820 --> 00:01:20,900 up all over the place on 41 00:01:20,900 --> 00:01:23,200 the web when people discuss these things. 42 00:01:23,200 --> 00:01:25,550 And we'll have an interesting paper just 43 00:01:25,550 --> 00:01:26,690 kinda investigating how people 44 00:01:26,690 --> 00:01:28,415 talk about those things. 45 00:01:28,415 --> 00:01:30,785 So why, why is, 46 00:01:30,785 --> 00:01:32,510 why is it rusts so tricky? 47 00:01:32,510 --> 00:01:32,750 Why is 48 00:01:32,750 --> 00:01:33,950 this ownership and borrowing system 49 00:01:33,950 --> 00:01:34,805 so tricky? 50 00:01:34,805 --> 00:01:36,965 And you know, just, 51 00:01:36,965 --> 00:01:38,300 just from kind of thing. 52 00:01:38,300 --> 00:01:39,440 But the problem looking at some of 53 00:01:39,440 --> 00:01:40,880 these these these prior papers, 54 00:01:40,880 --> 00:01:43,070 you get the sense that the real issue is 55 00:01:43,070 --> 00:01:44,210 that there's all this invisible 56 00:01:44,210 --> 00:01:45,320 state that's happening. 57 00:01:45,320 --> 00:01:47,390 It's static state. 58 00:01:47,390 --> 00:01:50,480 Who owns the resource and it's the life. 59 00:01:50,480 --> 00:01:52,790 How long has this lifetime extend? 60 00:01:52,790 --> 00:01:54,800 What capabilities do I have given 61 00:01:54,800 --> 00:01:56,240 the uniqueness constraints that 62 00:01:56,240 --> 00:01:58,820 are imposed by the reference system? 63 00:01:58,820 --> 00:02:00,200 And, um, all of these, 64 00:02:00,200 --> 00:02:01,910 all of these pieces 65 00:02:01,910 --> 00:02:02,870 of invisible state and 66 00:02:02,870 --> 00:02:03,620 the rules that govern them, 67 00:02:03,620 --> 00:02:05,450 they all have to be mentally stimulated 68 00:02:05,450 --> 00:02:07,280 by the programmer, right? 69 00:02:07,280 --> 00:02:08,420 So they have to learn to mentally 70 00:02:08,420 --> 00:02:10,130 simulate these rules and then 71 00:02:10,130 --> 00:02:11,570 keep a model in their head as 72 00:02:11,570 --> 00:02:13,145 they comprehend, 73 00:02:13,145 --> 00:02:15,275 attempt to comprehend code. 74 00:02:15,275 --> 00:02:17,660 That's a very complicated thing. 75 00:02:17,660 --> 00:02:19,100 A lot of cognitive load 76 00:02:19,100 --> 00:02:20,540 is incurred when you do that. 77 00:02:20,540 --> 00:02:22,940 And so if we want to build 78 00:02:22,940 --> 00:02:25,790 tools to lessen that cognitive load, 79 00:02:25,790 --> 00:02:27,980 general principle that we might follow is to 80 00:02:27,980 --> 00:02:30,800 make visible the invisible. 81 00:02:30,800 --> 00:02:32,600 To help learners, we 82 00:02:32,600 --> 00:02:34,790 do this invisible work for them instead of 83 00:02:34,790 --> 00:02:35,990 requiring them to do it all 84 00:02:35,990 --> 00:02:37,190 in their head when they still haven't 85 00:02:37,190 --> 00:02:40,370 really figured out the rules themselves. 86 00:02:40,370 --> 00:02:41,900 And then you just show it to them in some way 87 00:02:41,900 --> 00:02:43,415 that's comprehensible in some way that 88 00:02:43,415 --> 00:02:45,230 they can refer to 89 00:02:45,230 --> 00:02:46,970 and engaging in a couple of different things. 90 00:02:46,970 --> 00:02:49,490 One, as they're developing this mental model, 91 00:02:49,490 --> 00:02:51,350 these visualizations can 92 00:02:51,350 --> 00:02:53,690 help provide scaffolding. 93 00:02:53,690 --> 00:02:56,900 So they provide the vocabulary, 94 00:02:56,900 --> 00:02:57,980 the key structures, the key 95 00:02:57,980 --> 00:02:59,030 concepts that they need to 96 00:02:59,030 --> 00:03:00,140 eventually be able to come up 97 00:03:00,140 --> 00:03:01,430 with on their own in their head. 98 00:03:01,430 --> 00:03:02,915 But until they do that, 99 00:03:02,915 --> 00:03:04,460 they can see that this is 100 00:03:04,460 --> 00:03:06,695 what I need to be able to produce in my head. 101 00:03:06,695 --> 00:03:09,140 Then as they start attempting to do that, 102 00:03:09,140 --> 00:03:10,805 as they start to develop and 103 00:03:10,805 --> 00:03:13,490 try to apply their mental model. 104 00:03:13,490 --> 00:03:15,350 It gives them a way to take 105 00:03:15,350 --> 00:03:16,970 these, to make them scientists, 106 00:03:16,970 --> 00:03:18,020 to take the predictions that they're 107 00:03:18,020 --> 00:03:20,000 generating and allow them to 108 00:03:20,000 --> 00:03:21,800 immediately verify that what they predicted 109 00:03:21,800 --> 00:03:22,760 is actually what's happening 110 00:03:22,760 --> 00:03:23,885 if it's not visible, 111 00:03:23,885 --> 00:03:26,165 there's no way to verify your prediction. 112 00:03:26,165 --> 00:03:28,370 So that's a lot of words. 113 00:03:28,370 --> 00:03:29,720 I think this is a general principle that I 114 00:03:29,720 --> 00:03:31,250 think is important and told 115 00:03:31,250 --> 00:03:33,140 us I just want 116 00:03:33,140 --> 00:03:34,820 to jump into a demo of the rest 117 00:03:34,820 --> 00:03:36,170 of this tool which is focused on 118 00:03:36,170 --> 00:03:37,250 visualizing these ownership and 119 00:03:37,250 --> 00:03:38,825 borrowing things in Rust. 120 00:03:38,825 --> 00:03:44,270 So let's switch over to that tab. 121 00:03:44,270 --> 00:03:48,440 So what the system is, 122 00:03:48,440 --> 00:03:50,975 is it's a system for including visualizations 123 00:03:50,975 --> 00:03:54,215 in narrative, instructional narrative. 124 00:03:54,215 --> 00:03:56,870 So we are based on the empty book system 125 00:03:56,870 --> 00:03:58,760 that a lot of rust documentation 126 00:03:58,760 --> 00:04:00,575 and Russ books and things already used. 127 00:04:00,575 --> 00:04:02,420 So you can see this isn't empty book 128 00:04:02,420 --> 00:04:04,070 tutorial that we've developed. 129 00:04:04,070 --> 00:04:05,540 And I'll talk more about how we 130 00:04:05,540 --> 00:04:07,100 integrated into our classroom and everything. 131 00:04:07,100 --> 00:04:09,140 But this is an introduction to Ross. 132 00:04:09,140 --> 00:04:09,785 It's meant to be 133 00:04:09,785 --> 00:04:12,110 a 30-minute introduction to rust, 134 00:04:12,110 --> 00:04:13,490 designed for people with 135 00:04:13,490 --> 00:04:14,600 some programming background 136 00:04:14,600 --> 00:04:15,890 but no rest background. 137 00:04:15,890 --> 00:04:20,120 And we'll go through some of the tutorial. 138 00:04:20,120 --> 00:04:20,600 You will see that 139 00:04:20,600 --> 00:04:22,190 all these code examples we will have 140 00:04:22,190 --> 00:04:24,710 alongside of them, this visualization. 141 00:04:24,710 --> 00:04:27,185 And it's an interactive visualization. 142 00:04:27,185 --> 00:04:28,280 That word interactive is 143 00:04:28,280 --> 00:04:29,630 maybe doing a little too much work. 144 00:04:29,630 --> 00:04:30,740 It's, what I mean by 145 00:04:30,740 --> 00:04:32,960 interactive is that it allows you to 146 00:04:32,960 --> 00:04:35,465 hover over different visual elements and get 147 00:04:35,465 --> 00:04:38,030 a verbal description of 148 00:04:38,030 --> 00:04:39,980 what that visual element means. 149 00:04:39,980 --> 00:04:43,100 Okay, so let me, so this initial examples 150 00:04:43,100 --> 00:04:44,420 meant to actually showcase a lot of 151 00:04:44,420 --> 00:04:46,100 the different visualization features. 152 00:04:46,100 --> 00:04:47,390 And then we'll go through some of 153 00:04:47,390 --> 00:04:48,470 the more basic examples. 154 00:04:48,470 --> 00:04:49,610 But you can see as I hover 155 00:04:49,610 --> 00:04:53,225 over aspects of this visualization, 156 00:04:53,225 --> 00:04:55,745 both the visualization, 157 00:04:55,745 --> 00:04:57,590 but both the hover message shows up, 158 00:04:57,590 --> 00:04:59,570 showing you what that element means. 159 00:04:59,570 --> 00:05:00,800 And then you see some changes in 160 00:05:00,800 --> 00:05:02,270 the code itself highlighting, 161 00:05:02,270 --> 00:05:02,990 in this case 162 00:05:02,990 --> 00:05:04,340 the corresponding function string 163 00:05:04,340 --> 00:05:05,360 from and underlining 164 00:05:05,360 --> 00:05:06,710 the line just so you know. 165 00:05:06,710 --> 00:05:08,675 Which line you're talking about, 166 00:05:08,675 --> 00:05:09,710 then you can see what's 167 00:05:09,710 --> 00:05:10,940 happening here is that 168 00:05:10,940 --> 00:05:14,375 it's visualizing a move or cava, 169 00:05:14,375 --> 00:05:15,680 resource returned from string 170 00:05:15,680 --> 00:05:17,660 from and moved to S. 171 00:05:17,660 --> 00:05:19,040 And then when you hover over this 172 00:05:19,040 --> 00:05:20,540 kinda dot event on S, 173 00:05:20,540 --> 00:05:21,800 you see that S acquires 174 00:05:21,800 --> 00:05:23,225 ownership of a resource. 175 00:05:23,225 --> 00:05:24,440 And then from there on out, 176 00:05:24,440 --> 00:05:25,700 if you hover over this line, 177 00:05:25,700 --> 00:05:28,370 you see that S is the owner of this resource. 178 00:05:28,370 --> 00:05:31,280 And it also communicates something about 179 00:05:31,280 --> 00:05:33,980 the variable S being 180 00:05:33,980 --> 00:05:34,880 mutable since it was 181 00:05:34,880 --> 00:05:36,365 introduced with let me mute. 182 00:05:36,365 --> 00:05:38,345 The binding can be reassigned. 183 00:05:38,345 --> 00:05:38,660 It's 184 00:05:38,660 --> 00:05:41,015 kinda visualization of these capabilities. 185 00:05:41,015 --> 00:05:42,920 So you can see there's more of that 186 00:05:42,920 --> 00:05:44,030 for different things like 187 00:05:44,030 --> 00:05:46,295 borrows and things here as well. 188 00:05:46,295 --> 00:05:48,845 So that's the, that's the, 189 00:05:48,845 --> 00:05:50,210 That's rough is okay, 190 00:05:50,210 --> 00:05:51,380 so it's a way of 191 00:05:51,380 --> 00:05:53,720 visualizing code snippets like this. 192 00:05:53,720 --> 00:05:55,160 And if tutorial, what 193 00:05:55,160 --> 00:05:56,360 we expect people to do with it 194 00:05:56,360 --> 00:05:57,740 is actually just start with 195 00:05:57,740 --> 00:05:59,345 a very simple visualizations. 196 00:05:59,345 --> 00:06:00,845 For example, just kind of 197 00:06:00,845 --> 00:06:02,330 initialization of a heap 198 00:06:02,330 --> 00:06:03,560 allocated string here. 199 00:06:03,560 --> 00:06:05,570 And you can see what 200 00:06:05,570 --> 00:06:08,165 happens is the same thing we just saw. 201 00:06:08,165 --> 00:06:09,320 This is not letting me, so 202 00:06:09,320 --> 00:06:11,120 the binding cannot be reassigned. 203 00:06:11,120 --> 00:06:13,280 And then you see something happening with S. 204 00:06:13,280 --> 00:06:14,915 In this case it's a print line which 205 00:06:14,915 --> 00:06:17,855 just reads from s, OK. 206 00:06:17,855 --> 00:06:19,955 And then eventually it ends 207 00:06:19,955 --> 00:06:22,145 up at the end of the scope of 208 00:06:22,145 --> 00:06:26,855 S and we know enlarge the screen. 209 00:06:26,855 --> 00:06:31,415 So that way that works. 210 00:06:31,415 --> 00:06:33,485 Okay, so at the end of dystopia 211 00:06:33,485 --> 00:06:35,375 of S, S goes out of scope. 212 00:06:35,375 --> 00:06:36,350 But we also talk not 213 00:06:36,350 --> 00:06:37,430 just about the scoping here, 214 00:06:37,430 --> 00:06:38,510 which is an important concept, 215 00:06:38,510 --> 00:06:40,685 but also about the, 216 00:06:40,685 --> 00:06:42,530 the resource being dropped, right? 217 00:06:42,530 --> 00:06:44,210 So because as owns resource at 218 00:06:44,210 --> 00:06:45,110 that point and it goes out of 219 00:06:45,110 --> 00:06:46,790 scope, the resources trunk. 220 00:06:46,790 --> 00:06:49,610 Then as we go through the tutorial, 221 00:06:49,610 --> 00:06:50,365 you see that we start 222 00:06:50,365 --> 00:06:51,860 introducing more concepts like 223 00:06:51,860 --> 00:06:54,560 moves via, I'll let bindings. 224 00:06:54,560 --> 00:06:56,030 So you can see that x 225 00:06:56,030 --> 00:06:57,620 is resources moved here. 226 00:06:57,620 --> 00:06:59,495 There's a move and 227 00:06:59,495 --> 00:07:01,520 why acquires ownership from that move. 228 00:07:01,520 --> 00:07:03,800 And notably, there's also not a line here 229 00:07:03,800 --> 00:07:05,960 that makes it clear that 230 00:07:05,960 --> 00:07:07,100 x no longer owns 231 00:07:07,100 --> 00:07:08,540 a resource when the move happens. 232 00:07:08,540 --> 00:07:11,450 So that's a key idea with ownership moves 233 00:07:11,450 --> 00:07:13,070 is movement is really 234 00:07:13,070 --> 00:07:14,540 like handing off to something. 235 00:07:14,540 --> 00:07:15,530 And you see that hands-off 236 00:07:15,530 --> 00:07:17,029 happening in the visualization. 237 00:07:17,029 --> 00:07:19,070 And also at the end here you see that x goes 238 00:07:19,070 --> 00:07:21,020 out of scope because 239 00:07:21,020 --> 00:07:23,120 it doesn't hurt to resource at 240 00:07:23,120 --> 00:07:24,290 that point because of the move, 241 00:07:24,290 --> 00:07:25,310 no resources dropped. 242 00:07:25,310 --> 00:07:26,600 Whereas when y goes out of scope, 243 00:07:26,600 --> 00:07:28,430 it now it owns the resource at that point, 244 00:07:28,430 --> 00:07:30,185 so the resource is dropped. 245 00:07:30,185 --> 00:07:32,180 So it's giving you the information 246 00:07:32,180 --> 00:07:34,085 that if I asked you a question 247 00:07:34,085 --> 00:07:36,380 about when a resource is dropped or what 248 00:07:36,380 --> 00:07:37,550 capabilities x has at 249 00:07:37,550 --> 00:07:39,230 a particular line in this code. 250 00:07:39,230 --> 00:07:40,100 These are the kinds 251 00:07:40,100 --> 00:07:41,255 of thoughts that you'd have to, 252 00:07:41,255 --> 00:07:41,960 you'd have to build 253 00:07:41,960 --> 00:07:42,770 this mental model in 254 00:07:42,770 --> 00:07:43,490 your head and we're trying 255 00:07:43,490 --> 00:07:44,600 to put that in front of 256 00:07:44,600 --> 00:07:46,760 you so that hopefully, 257 00:07:46,760 --> 00:07:49,490 as a student you can learn to generate 258 00:07:49,490 --> 00:07:51,230 these things more quickly on your 259 00:07:51,230 --> 00:07:54,005 own after some time. 260 00:07:54,005 --> 00:07:58,790 Okay, So the tutorial goes, 261 00:07:58,790 --> 00:08:00,170 I'm not gonna go through every example 262 00:08:00,170 --> 00:08:01,640 in the tutorial. There is a link. 263 00:08:01,640 --> 00:08:03,860 I'll post that maybe in the Zulu 264 00:08:03,860 --> 00:08:06,275 up as well if people want to play with it. 265 00:08:06,275 --> 00:08:08,720 For borrows, there are 266 00:08:08,720 --> 00:08:10,415 some interesting things that start happening. 267 00:08:10,415 --> 00:08:14,570 So you can see that with a borrow, 268 00:08:14,570 --> 00:08:16,729 there's kinda two variables 269 00:08:16,729 --> 00:08:18,590 are things of interests. 270 00:08:18,590 --> 00:08:20,435 There's the reference itself, 271 00:08:20,435 --> 00:08:21,830 and then there's the resource 272 00:08:21,830 --> 00:08:23,570 that the reference refers to. 273 00:08:23,570 --> 00:08:26,225 And so we indicate that by 274 00:08:26,225 --> 00:08:28,220 showing both this reference S 275 00:08:28,220 --> 00:08:30,425 in that function f, 276 00:08:30,425 --> 00:08:34,220 we mark the, we 277 00:08:34,220 --> 00:08:35,780 indicate that the thing that's 278 00:08:35,780 --> 00:08:37,295 being referred to with this de-reference, 279 00:08:37,295 --> 00:08:37,520 right? 280 00:08:37,520 --> 00:08:39,500 So star S, like what capabilities 281 00:08:39,500 --> 00:08:41,270 do you have with star S? 282 00:08:41,270 --> 00:08:42,590 Then in the visualization, 283 00:08:42,590 --> 00:08:45,425 there's also a correspondingly two lines. 284 00:08:45,425 --> 00:08:49,310 Like what can you do through S2 star S, 285 00:08:49,310 --> 00:08:50,330 we can mutate it because 286 00:08:50,330 --> 00:08:51,785 it's not immutable resource. 287 00:08:51,785 --> 00:08:54,680 Whereas here we're talking 288 00:08:54,680 --> 00:08:56,090 about the reference itself, 289 00:08:56,090 --> 00:08:57,470 so it's a shared, 290 00:08:57,470 --> 00:08:58,970 we can only read data through it. 291 00:08:58,970 --> 00:09:00,080 Okay, so we start 292 00:09:00,080 --> 00:09:01,100 getting into a little bit more of 293 00:09:01,100 --> 00:09:04,020 the subtleties related with references here. 294 00:09:04,570 --> 00:09:07,310 Here we're talking about 295 00:09:07,310 --> 00:09:09,035 lifetime is a little bit, 296 00:09:09,035 --> 00:09:11,330 and in a very visual way as well, 297 00:09:11,330 --> 00:09:12,620 you can see what happens 298 00:09:12,620 --> 00:09:14,440 with There's these borrows 299 00:09:14,440 --> 00:09:16,495 that happened to y and z. 300 00:09:16,495 --> 00:09:20,230 And then you pass Y and Z over into f. 301 00:09:20,230 --> 00:09:22,585 And because there's no further use of 302 00:09:22,585 --> 00:09:25,675 the reference, these two references, 303 00:09:25,675 --> 00:09:27,700 they're kind of their lifetime ends and 304 00:09:27,700 --> 00:09:30,145 we indicate that with this return, 305 00:09:30,145 --> 00:09:31,630 this notional return of 306 00:09:31,630 --> 00:09:33,070 the borrowed resource back 307 00:09:33,070 --> 00:09:35,095 to the original owner. 308 00:09:35,095 --> 00:09:38,050 We put a little bit of work into making 309 00:09:38,050 --> 00:09:39,430 this visualization scale and 310 00:09:39,430 --> 00:09:40,450 these kind of circumstances. 311 00:09:40,450 --> 00:09:42,100 You can see the line is a little pink tier, 312 00:09:42,100 --> 00:09:43,300 and I'll talk a little bit more about 313 00:09:43,300 --> 00:09:44,875 the scaling problem a little later though. 314 00:09:44,875 --> 00:09:47,170 It's not infinitely scalable. 315 00:09:47,170 --> 00:09:48,565 Okay? 316 00:09:48,565 --> 00:09:51,640 So I'll stop there with the example. 317 00:09:51,640 --> 00:09:55,400 So that's the idea there. 318 00:09:55,710 --> 00:09:57,895 We're back to the slides. 319 00:09:57,895 --> 00:10:01,480 So is this useful, right? 320 00:10:01,480 --> 00:10:03,175 That's, I think an important thing, 321 00:10:03,175 --> 00:10:04,360 an important question to ask 322 00:10:04,360 --> 00:10:05,500 whenever you develop a tool, 323 00:10:05,500 --> 00:10:06,610 is this actually useful and 324 00:10:06,610 --> 00:10:07,945 people getting anything out of this. 325 00:10:07,945 --> 00:10:11,320 So the way we assess that is in my horse, 326 00:10:11,320 --> 00:10:13,630 which is upper level 327 00:10:13,630 --> 00:10:14,710 of programming languages course 328 00:10:14,710 --> 00:10:16,270 each for 90 at Michigan. 329 00:10:16,270 --> 00:10:19,104 I've taught that for four semesters. 330 00:10:19,104 --> 00:10:20,050 Collectively, 331 00:10:20,050 --> 00:10:22,450 313 students have taken this course. 332 00:10:22,450 --> 00:10:24,250 So good sample. 333 00:10:24,250 --> 00:10:25,990 These are typically almost 334 00:10:25,990 --> 00:10:27,355 entirely juniors and seniors 335 00:10:27,355 --> 00:10:28,795 undergraduates with two semesters 336 00:10:28,795 --> 00:10:31,480 of our introductory C plus, plus sequence. 337 00:10:31,480 --> 00:10:34,900 And it's in the second half of my POL course. 338 00:10:34,900 --> 00:10:36,355 So the first half of the course 339 00:10:36,355 --> 00:10:38,325 is taught in OCaml. 340 00:10:38,325 --> 00:10:40,070 There's one assignment on 341 00:10:40,070 --> 00:10:41,750 just intro to functional programming, OCaml. 342 00:10:41,750 --> 00:10:42,860 And then there's a bunch of PL 343 00:10:42,860 --> 00:10:44,330 prototyping that you would expect 344 00:10:44,330 --> 00:10:47,240 from a PL course. 345 00:10:47,240 --> 00:10:48,620 So people understand concepts 346 00:10:48,620 --> 00:10:49,550 like scope and they have 347 00:10:49,550 --> 00:10:50,480 kind of a more 348 00:10:50,480 --> 00:10:52,100 sophisticated maybe understanding 349 00:10:52,100 --> 00:10:53,555 of PL concepts. 350 00:10:53,555 --> 00:10:55,925 But Rostow hasn't been used yet. 351 00:10:55,925 --> 00:10:59,465 And our introduction to rust is by schedule, 352 00:10:59,465 --> 00:11:00,935 limited to two lectures, 353 00:11:00,935 --> 00:11:03,080 one discussion, all in one week, 354 00:11:03,080 --> 00:11:05,810 and then a two-week long assignment, 355 00:11:05,810 --> 00:11:07,505 roughly two-week long assignment. 356 00:11:07,505 --> 00:11:09,950 One component of which is to read and 357 00:11:09,950 --> 00:11:11,270 go through that tutorial 358 00:11:11,270 --> 00:11:12,050 that I just showed you, 359 00:11:12,050 --> 00:11:13,460 which we tell students should 360 00:11:13,460 --> 00:11:15,920 take between 3045 minutes. 361 00:11:15,920 --> 00:11:17,660 And then there's some assessment 362 00:11:17,660 --> 00:11:19,070 that we'll talk about in a second. 363 00:11:19,070 --> 00:11:20,795 So this is 364 00:11:20,795 --> 00:11:22,610 the particular educational context 365 00:11:22,610 --> 00:11:23,270 that we're working in. 366 00:11:23,270 --> 00:11:25,190 I think it's an interesting one 367 00:11:25,190 --> 00:11:27,200 because it's students that 368 00:11:27,200 --> 00:11:29,150 have some programming experience in 369 00:11:29,150 --> 00:11:31,745 imperative languages, like in C plus plus. 370 00:11:31,745 --> 00:11:33,620 So this is, I think 371 00:11:33,620 --> 00:11:35,300 a decent model of actually even if 372 00:11:35,300 --> 00:11:36,530 you were trying to push rust 373 00:11:36,530 --> 00:11:38,525 in an industrial setting, 374 00:11:38,525 --> 00:11:39,890 you're gonna get people with programming 375 00:11:39,890 --> 00:11:41,360 experience that are interested in C plus 376 00:11:41,360 --> 00:11:42,800 plus it has some attachment to it 377 00:11:42,800 --> 00:11:44,840 because it's performance and so on. 378 00:11:44,840 --> 00:11:46,760 And so we think this is, this was 379 00:11:46,760 --> 00:11:47,810 a good audience to test 380 00:11:47,810 --> 00:11:50,100 this tool on for the first time. 381 00:11:50,230 --> 00:11:52,460 So what we're learning goals, 382 00:11:52,460 --> 00:11:54,560 well, there's kind of two parts to this. 383 00:11:54,560 --> 00:11:56,120 One, ownership and when borrowing. 384 00:11:56,120 --> 00:11:57,620 So we want first students 385 00:11:57,620 --> 00:11:59,300 to understand how ownership 386 00:11:59,300 --> 00:12:01,130 is the foundation of memory management and 387 00:12:01,130 --> 00:12:03,035 Rostow automatic memory management and rust, 388 00:12:03,035 --> 00:12:03,710 when you talk about 389 00:12:03,710 --> 00:12:04,910 garbage collection is kind of 390 00:12:04,910 --> 00:12:07,700 an alternative before we get into rust. 391 00:12:07,700 --> 00:12:08,630 So there's 392 00:12:08,630 --> 00:12:11,000 some specific learning goals here in 393 00:12:11,000 --> 00:12:12,350 terms of things that we want students 394 00:12:12,350 --> 00:12:14,120 to be able to do. 395 00:12:14,120 --> 00:12:16,115 So how do we assess these learning goals? 396 00:12:16,115 --> 00:12:19,310 So this is actually an important question, 397 00:12:19,310 --> 00:12:20,705 I think one that our community should, 398 00:12:20,705 --> 00:12:23,660 should think through it systematically. 399 00:12:23,660 --> 00:12:25,190 The challenge is you want to 400 00:12:25,190 --> 00:12:26,900 ask questions that assess 401 00:12:26,900 --> 00:12:28,520 their understanding of these 402 00:12:28,520 --> 00:12:30,214 invisible concepts. 403 00:12:30,214 --> 00:12:31,040 And you want to do it in 404 00:12:31,040 --> 00:12:31,700 a way where they can't 405 00:12:31,700 --> 00:12:33,110 just like load up rust when 406 00:12:33,110 --> 00:12:35,120 they're doing an assignment and type 407 00:12:35,120 --> 00:12:36,200 in the code that we give 408 00:12:36,200 --> 00:12:37,700 them and they get the answer. 409 00:12:37,700 --> 00:12:41,150 So it's not just is this well typed, right? 410 00:12:41,150 --> 00:12:43,070 So how do we 411 00:12:43,070 --> 00:12:44,915 assess their understanding of ownership? 412 00:12:44,915 --> 00:12:46,400 So here's the kind of question that 413 00:12:46,400 --> 00:12:47,900 we came up with. 414 00:12:47,900 --> 00:12:48,380 What I think is 415 00:12:48,380 --> 00:12:50,180 a really interesting class of questions. 416 00:12:50,180 --> 00:12:51,530 So what we do is we give them a 417 00:12:51,530 --> 00:12:53,285 little snippet of Rust code. 418 00:12:53,285 --> 00:12:54,920 Nothing particularly 419 00:12:54,920 --> 00:12:56,330 interesting is going on in this code, 420 00:12:56,330 --> 00:12:57,830 but there's a bunch of moves and borrows 421 00:12:57,830 --> 00:12:58,580 and things like that that 422 00:12:58,580 --> 00:12:59,765 might be going on in it. 423 00:12:59,765 --> 00:13:01,520 Then we ask, and you 424 00:13:01,520 --> 00:13:02,120 can notice there's also 425 00:13:02,120 --> 00:13:03,005 a bunch of print lines in here. 426 00:13:03,005 --> 00:13:03,860 So we asked between which 427 00:13:03,860 --> 00:13:04,790 two adjacent lines of 428 00:13:04,790 --> 00:13:06,530 this printed output is 429 00:13:06,530 --> 00:13:07,670 the string resource that a 430 00:13:07,670 --> 00:13:09,455 initially owns dropped. 431 00:13:09,455 --> 00:13:11,525 And then explain why by describing 432 00:13:11,525 --> 00:13:13,700 what happens with movies and borrows. 433 00:13:13,700 --> 00:13:15,260 This question isn't one that you 434 00:13:15,260 --> 00:13:16,460 can easily answered by just 435 00:13:16,460 --> 00:13:17,780 typing this code and 436 00:13:17,780 --> 00:13:19,310 getting feedback from the Rust compiler. 437 00:13:19,310 --> 00:13:21,320 Rust compiler will successfully execute this, 438 00:13:21,320 --> 00:13:22,790 but there are no visible side effect 439 00:13:22,790 --> 00:13:23,810 for the drop, right? 440 00:13:23,810 --> 00:13:26,374 That's just when the string is deallocated. 441 00:13:26,374 --> 00:13:28,010 So you do have to actually 442 00:13:28,010 --> 00:13:29,210 build that mental model 443 00:13:29,210 --> 00:13:30,260 that I'm talking about, right? 444 00:13:30,260 --> 00:13:31,325 That we're trying to teach 445 00:13:31,325 --> 00:13:33,740 and model all the moves and 446 00:13:33,740 --> 00:13:35,510 see when variable that 447 00:13:35,510 --> 00:13:37,385 owns that resource goes out of scope. 448 00:13:37,385 --> 00:13:39,110 That's, that's the, that's the goal that they 449 00:13:39,110 --> 00:13:40,100 understand that and they can 450 00:13:40,100 --> 00:13:42,210 figure out that the answer, 451 00:13:42,730 --> 00:13:45,960 in this case is, what is it? 452 00:13:47,170 --> 00:13:49,160 After? 453 00:13:49,160 --> 00:13:51,440 Hello and 454 00:13:51,440 --> 00:13:53,030 goodbye, I forget what the answer is. 455 00:13:53,030 --> 00:13:54,635 So I think that's it. 456 00:13:54,635 --> 00:13:58,100 We give them 678 questions 457 00:13:58,100 --> 00:14:00,725 like this, all relatively small. 458 00:14:00,725 --> 00:14:03,260 And if people can do this, 459 00:14:03,260 --> 00:14:04,490 that means they're starting to develop 460 00:14:04,490 --> 00:14:05,240 an understanding of 461 00:14:05,240 --> 00:14:06,410 this invisible thing that's 462 00:14:06,410 --> 00:14:07,850 going on with ownership and moves 463 00:14:07,850 --> 00:14:09,745 and we see some success with it. 464 00:14:09,745 --> 00:14:10,820 So the median score on 465 00:14:10,820 --> 00:14:12,635 this kind of question is 91%. 466 00:14:12,635 --> 00:14:13,580 We also have questions like 467 00:14:13,580 --> 00:14:14,765 this on our final exam. 468 00:14:14,765 --> 00:14:17,720 Also, very people do 469 00:14:17,720 --> 00:14:19,670 very well on that question as well. 470 00:14:19,670 --> 00:14:21,545 Then we also are able to, 471 00:14:21,545 --> 00:14:22,460 the way we have it setup, 472 00:14:22,460 --> 00:14:23,660 we are able to measure how 473 00:14:23,660 --> 00:14:25,040 long it takes students to answer 474 00:14:25,040 --> 00:14:25,790 this question when it is 475 00:14:25,790 --> 00:14:26,810 from the time it's presented 476 00:14:26,810 --> 00:14:29,000 to them to when they submit an answer. 477 00:14:29,000 --> 00:14:30,905 And that's about five to six minutes 478 00:14:30,905 --> 00:14:32,420 on average, right? 479 00:14:32,420 --> 00:14:35,495 So what that means is that students are 480 00:14:35,495 --> 00:14:37,280 kinda like thinking 481 00:14:37,280 --> 00:14:38,990 through each of the events. 482 00:14:38,990 --> 00:14:41,645 They're not just kinda knee jerk answering. 483 00:14:41,645 --> 00:14:45,560 It's done. A quick assessment of the code. 484 00:14:45,560 --> 00:14:47,900 We think this is promising. 485 00:14:47,900 --> 00:14:50,750 After a week or two of instruction in rust, 486 00:14:50,750 --> 00:14:52,130 Students are able to understand 487 00:14:52,130 --> 00:14:53,450 the automatic memory management 488 00:14:53,450 --> 00:14:55,265 where the resources are being dropped. 489 00:14:55,265 --> 00:14:57,950 As a consequence of these move events. 490 00:14:57,950 --> 00:15:00,380 I can set of learning goals 491 00:15:00,380 --> 00:15:01,955 have to do with borrowing. 492 00:15:01,955 --> 00:15:04,040 So again, they have to understand 493 00:15:04,040 --> 00:15:05,555 immutable and mutable borrows. 494 00:15:05,555 --> 00:15:07,670 They understand how lifetime 495 00:15:07,670 --> 00:15:09,920 and borrow relates to the lifetime owner. 496 00:15:09,920 --> 00:15:11,720 Then also we want them to understand 497 00:15:11,720 --> 00:15:13,280 the basics of non lexical lifetimes. 498 00:15:13,280 --> 00:15:16,715 And it's actually a challenge 499 00:15:16,715 --> 00:15:18,380 relatively to assess understanding 500 00:15:18,380 --> 00:15:20,150 of borrowing relative to ownership, 501 00:15:20,150 --> 00:15:21,680 because borrowing is really more about 502 00:15:21,680 --> 00:15:23,450 restrictions on what you can't do. 503 00:15:23,450 --> 00:15:25,250 And so we can ask, 504 00:15:25,250 --> 00:15:26,990 we do ask questions of the form on 505 00:15:26,990 --> 00:15:28,730 which line of code does the lifetime of x. 506 00:15:28,730 --> 00:15:32,150 And that's essentially the return arrow. 507 00:15:32,150 --> 00:15:34,325 Like where should the return arrow go? 508 00:15:34,325 --> 00:15:36,860 People do a little bit worse on this. 509 00:15:36,860 --> 00:15:40,430 But it's about 80% or 510 00:15:40,430 --> 00:15:41,600 so is the medians 511 00:15:41,600 --> 00:15:44,040 colon questions of this sort. 512 00:15:44,110 --> 00:15:46,820 Discussion topic that I think I'd like to 513 00:15:46,820 --> 00:15:47,870 get more feedback from 514 00:15:47,870 --> 00:15:48,930 the community on is that is, 515 00:15:48,930 --> 00:15:50,945 there, are there better ways of assessing 516 00:15:50,945 --> 00:15:54,185 borrowing and understanding of borrowing? 517 00:15:54,185 --> 00:15:55,955 Other than there's also, 518 00:15:55,955 --> 00:15:56,690 I mean, you could just have them 519 00:15:56,690 --> 00:15:58,460 write code like the borrower checker, 520 00:15:58,460 --> 00:16:01,430 but we want a more targeted assessment. 521 00:16:01,430 --> 00:16:03,350 And then one additional 522 00:16:03,350 --> 00:16:04,100 thing that we didn't want to be 523 00:16:04,100 --> 00:16:04,970 semesters where we did 524 00:16:04,970 --> 00:16:06,410 an extra credit question where 525 00:16:06,410 --> 00:16:07,745 we ask students to actually 526 00:16:07,745 --> 00:16:09,050 generate their own rust, 527 00:16:09,050 --> 00:16:10,670 this visualization, this is also 528 00:16:10,670 --> 00:16:11,720 a nice segue for me to talk 529 00:16:11,720 --> 00:16:13,070 about how that is done. 530 00:16:13,070 --> 00:16:14,630 It is not fully automatic. 531 00:16:14,630 --> 00:16:16,115 What we've done is we've developed 532 00:16:16,115 --> 00:16:18,170 a domain-specific language that's basically 533 00:16:18,170 --> 00:16:19,430 just a comment system 534 00:16:19,430 --> 00:16:21,980 in a formatted comments system in Rust. 535 00:16:21,980 --> 00:16:22,520 So you just take 536 00:16:22,520 --> 00:16:23,750 your rescue that you want to visualize. 537 00:16:23,750 --> 00:16:24,560 You annotate it with 538 00:16:24,560 --> 00:16:26,090 comments that looked like this. 539 00:16:26,090 --> 00:16:27,080 You pass it through 540 00:16:27,080 --> 00:16:28,430 our recipes visualizer and you get 541 00:16:28,430 --> 00:16:30,845 this kind of visualization that you saw. 542 00:16:30,845 --> 00:16:31,400 So you can see 543 00:16:31,400 --> 00:16:33,319 there's a column specification. 544 00:16:33,319 --> 00:16:34,580 What columns do you want to visualize? 545 00:16:34,580 --> 00:16:35,750 You might not want to visualize every 546 00:16:35,750 --> 00:16:37,340 variable and every function. 547 00:16:37,340 --> 00:16:39,260 Then on each line you say 548 00:16:39,260 --> 00:16:41,165 what events happened on that line. 549 00:16:41,165 --> 00:16:42,650 And this little comment here. 550 00:16:42,650 --> 00:16:44,420 And we have this kind of table saying 551 00:16:44,420 --> 00:16:46,475 what were all the possibilities are. 552 00:16:46,475 --> 00:16:48,500 One thing I'll note here is that this is 553 00:16:48,500 --> 00:16:50,750 a notional machine of how Rust works, right? 554 00:16:50,750 --> 00:16:52,220 So it's not exactly 555 00:16:52,220 --> 00:16:54,575 a specification of the Rus borrow checker. 556 00:16:54,575 --> 00:16:56,630 It's something that 557 00:16:56,630 --> 00:16:58,160 corresponds roughly to what 558 00:16:58,160 --> 00:16:59,555 an introductory students 559 00:16:59,555 --> 00:17:00,935 understanding borrowing 560 00:17:00,935 --> 00:17:04,340 and moves would develop. 561 00:17:04,340 --> 00:17:06,800 And how do people 562 00:17:06,800 --> 00:17:08,959 do on this median score is 100%. 563 00:17:08,959 --> 00:17:10,430 This was an extra credit question. 564 00:17:10,430 --> 00:17:11,750 So people essentially didn't 565 00:17:11,750 --> 00:17:13,190 submit it if they didn't get it right. 566 00:17:13,190 --> 00:17:15,200 So that's tears were at about the time. 567 00:17:15,200 --> 00:17:15,740 So we should wrap up. 568 00:17:15,740 --> 00:17:17,870 So if i'm I'm wrapping up here. 569 00:17:17,870 --> 00:17:19,100 So I went to one of the three, 570 00:17:19,100 --> 00:17:20,525 so it took about two hours. 571 00:17:20,525 --> 00:17:21,740 Most of that was actually set up 572 00:17:21,740 --> 00:17:22,880 a virus on their own machine 573 00:17:22,880 --> 00:17:23,840 and things like that. 574 00:17:23,840 --> 00:17:25,760 But interestingly, 60% thought 575 00:17:25,760 --> 00:17:26,975 that this exercise help them 576 00:17:26,975 --> 00:17:28,700 better understand Ross 577 00:17:28,700 --> 00:17:30,590 overall did receive his help. 578 00:17:30,590 --> 00:17:31,880 Ninety-five percent of students 579 00:17:31,880 --> 00:17:32,600 said it was either help, 580 00:17:32,600 --> 00:17:33,620 the visualization was either 581 00:17:33,620 --> 00:17:34,940 helpful or very helpful. 582 00:17:34,940 --> 00:17:36,740 75% of students reported 583 00:17:36,740 --> 00:17:37,820 frequently interacting 584 00:17:37,820 --> 00:17:39,470 with the visualization study. 585 00:17:39,470 --> 00:17:40,940 In our study, we also did a 586 00:17:40,940 --> 00:17:43,145 small think-aloud similar results. 587 00:17:43,145 --> 00:17:45,140 Then the feedback was basically, 588 00:17:45,140 --> 00:17:46,730 I think these things are helpful. 589 00:17:46,730 --> 00:17:48,830 I still have to think through the problems. 590 00:17:48,830 --> 00:17:50,300 And then there were some feedback about 591 00:17:50,300 --> 00:17:52,520 the actual mechanics of 592 00:17:52,520 --> 00:17:54,260 interaction that I'll skip for now. 593 00:17:54,260 --> 00:17:56,045 So to conclude, 594 00:17:56,045 --> 00:17:58,115 we think this is a promising approach. 595 00:17:58,115 --> 00:17:59,090 What are our next steps? 596 00:17:59,090 --> 00:18:01,340 One, automatic visualization generation. 597 00:18:01,340 --> 00:18:02,630 There's some challenges there with 598 00:18:02,630 --> 00:18:03,830 customizability and 599 00:18:03,830 --> 00:18:06,080 the scaling of these things too, 600 00:18:06,080 --> 00:18:08,060 we want to explore 601 00:18:08,060 --> 00:18:09,500 alternative visualization style 602 00:18:09,500 --> 00:18:10,790 for automatic visualization. 603 00:18:10,790 --> 00:18:12,800 Can you do it without a big sidebar? 604 00:18:12,800 --> 00:18:13,730 And then finally, 605 00:18:13,730 --> 00:18:15,455 integration into more courses. 606 00:18:15,455 --> 00:18:18,020 Public release of self-study tutorials 607 00:18:18,020 --> 00:18:19,040 and smaller learning 608 00:18:19,040 --> 00:18:20,555 modules for different topics. 609 00:18:20,555 --> 00:18:22,280 If you are interested in that, 610 00:18:22,280 --> 00:18:23,510 if you have a course or you want to 611 00:18:23,510 --> 00:18:25,280 develop material contact me. 612 00:18:25,280 --> 00:18:27,290 You can play with Material at 613 00:18:27,290 --> 00:18:29,900 that URL and I'll stop there. 614 00:18:29,900 --> 00:18:34,670 Thank you. Alright, Thanks Cyrus. 615 00:18:34,670 --> 00:18:36,680 Fabulous talk. We'll jump right into 616 00:18:36,680 --> 00:18:37,730 some questions and then head 617 00:18:37,730 --> 00:18:39,290 into the big group discussion. 618 00:18:39,290 --> 00:18:40,670 So following up on 619 00:18:40,670 --> 00:18:42,320 your point about automatic generalization, 620 00:18:42,320 --> 00:18:44,510 Matthew did ask how close to 621 00:18:44,510 --> 00:18:44,960 generating 622 00:18:44,960 --> 00:18:46,730 the visualizations automatically RVs. 623 00:18:46,730 --> 00:18:47,900 And so it would be really 624 00:18:47,900 --> 00:18:48,980 critical for playing with 625 00:18:48,980 --> 00:18:50,090 code as we talked about in 626 00:18:50,090 --> 00:18:52,205 the last session or in the last time. 627 00:18:52,205 --> 00:18:53,660 There's a bit of automation. 628 00:18:53,660 --> 00:18:55,010 You can generate the column headings 629 00:18:55,010 --> 00:18:56,660 automatically by just parsing out 630 00:18:56,660 --> 00:18:58,430 the variables that are 631 00:18:58,430 --> 00:18:59,915 used as the initial state. 632 00:18:59,915 --> 00:19:00,860 And then you'll see actually 633 00:19:00,860 --> 00:19:01,940 if you're looking at this table down here, 634 00:19:01,940 --> 00:19:03,575 there's this go out of scope of it, 635 00:19:03,575 --> 00:19:05,300 which can be visualized in 636 00:19:05,300 --> 00:19:07,100 three different ways depending on if 637 00:19:07,100 --> 00:19:10,700 that variable x owns a resource at that time. 638 00:19:10,700 --> 00:19:12,440 So we do track that automatically. 639 00:19:12,440 --> 00:19:13,985 You don't have to decide if it goes, 640 00:19:13,985 --> 00:19:15,260 if the resource is dropped or not. 641 00:19:15,260 --> 00:19:16,715 The system does that automatically. 642 00:19:16,715 --> 00:19:17,960 So we've taken baby steps 643 00:19:17,960 --> 00:19:19,535 towards automating it, 644 00:19:19,535 --> 00:19:22,040 but it's a bit of a challenge 645 00:19:22,040 --> 00:19:24,650 to actually support the entire system, 646 00:19:24,650 --> 00:19:26,870 the entire borrow Checker of rust. 647 00:19:26,870 --> 00:19:28,370 We don't attempts to do that. 648 00:19:28,370 --> 00:19:29,210 We want attempt to do 649 00:19:29,210 --> 00:19:30,530 a certain advanced features 650 00:19:30,530 --> 00:19:32,330 that are described in our paper. 651 00:19:32,330 --> 00:19:34,070 I think this is really interesting question. 652 00:19:34,070 --> 00:19:35,180 If there's 653 00:19:35,180 --> 00:19:36,410 graduate students out there that are 654 00:19:36,410 --> 00:19:37,460 interested in this topic is 655 00:19:37,460 --> 00:19:39,215 definitely a topic I want to explore. 656 00:19:39,215 --> 00:19:41,270 But I think there's 657 00:19:41,270 --> 00:19:42,740 some benefits to the manual generation, 658 00:19:42,740 --> 00:19:45,080 both for students doing a question like 659 00:19:45,080 --> 00:19:46,790 this and for instructors 660 00:19:46,790 --> 00:19:48,575 being able to customize it. 661 00:19:48,575 --> 00:19:50,270 And we think it doesn't 662 00:19:50,270 --> 00:19:51,530 take that long to generate it 663 00:19:51,530 --> 00:19:53,450 manually for any particular example 664 00:19:53,450 --> 00:19:54,770 and we're working on improving that. 665 00:19:54,770 --> 00:19:58,740 So that's where we're at. 666 00:19:59,710 --> 00:20:03,360 Any other questions in the chat. 667 00:20:09,730 --> 00:20:13,115 One thing I'll just toss in is, 668 00:20:13,115 --> 00:20:15,410 I think one metaphor I find really 669 00:20:15,410 --> 00:20:17,060 interesting here is thinking 670 00:20:17,060 --> 00:20:18,455 about this tool kind of like dot, 671 00:20:18,455 --> 00:20:19,850 you know, the, the sort of format you 672 00:20:19,850 --> 00:20:21,695 use to describe graphs with this. 673 00:20:21,695 --> 00:20:23,495 This is sort of like, like 674 00:20:23,495 --> 00:20:26,000 a language of program comprehension or 675 00:20:26,000 --> 00:20:27,980 visualizing static semantics of programs is 676 00:20:27,980 --> 00:20:29,135 something that there hasn't, 677 00:20:29,135 --> 00:20:30,740 doesn't really exist. 678 00:20:30,740 --> 00:20:32,885 But I think if you could sort of like, like, 679 00:20:32,885 --> 00:20:34,430 I really like how it's extracted 680 00:20:34,430 --> 00:20:36,140 out as this visual language that you can 681 00:20:36,140 --> 00:20:37,280 generate however you want and 682 00:20:37,280 --> 00:20:38,690 theoretically adopt for use cases 683 00:20:38,690 --> 00:20:40,160 even beyond ownership 684 00:20:40,160 --> 00:20:42,035 potentially or visualizing ownership. 685 00:20:42,035 --> 00:20:44,165 I think it'd be very cool if 686 00:20:44,165 --> 00:20:46,715 it was applicable to this sort of settings. 687 00:20:46,715 --> 00:20:48,950 Like if you had any abstract interpretation 688 00:20:48,950 --> 00:20:49,640 of your program, if 689 00:20:49,640 --> 00:20:50,705 you could play it that way. 690 00:20:50,705 --> 00:20:51,755 Awesome. 691 00:20:51,755 --> 00:20:52,640 We've been thinking 692 00:20:52,640 --> 00:20:53,960 about like certain libraries, 693 00:20:53,960 --> 00:20:55,040 like higher-level library is 694 00:20:55,040 --> 00:20:56,420 related to concurrency and things like 695 00:20:56,420 --> 00:20:57,950 that that have certain mental models 696 00:20:57,950 --> 00:20:59,495 like mutexes and things like that, 697 00:20:59,495 --> 00:21:02,525 that you might want to ask 698 00:21:02,525 --> 00:21:04,370 people to visualize it using 699 00:21:04,370 --> 00:21:06,125 some slightly different visual language. 700 00:21:06,125 --> 00:21:08,390 And I think this approach overall, 701 00:21:08,390 --> 00:21:10,820 it's kind of an interesting direction 702 00:21:10,820 --> 00:21:12,450 to take with that.