 It's great to be with you Last year was my first closure conge So it's pretty neat to be up here a year later talking about what I'm building with closure and datomic and closure scripts And all the other tools that we have so I'm really grateful for all the people involved in producing these tools since They're helping me make progress on things that I've been working on for a long time and kind of finally getting somewhere So the title of my talk is computable stories Because that's what session is about It's about Stories that are about computations stories that are computations. So let me start unpacking that for you So here's a quote Sort of our starting point. Most of our systems live outside the bounds of any single process that we write So this is a quote from Rich Hickey from the first database as a value talk and it's a point that he elaborated upon yesterday in the keynote and the point that he was making was Sort of no matter how nice it is inside the bubble inside of our individual process where we have the Facilities of closure and the state identity kind of management situation we have there these processes live in a broader system and That broader system can potentially reach into our process and the complexity from the broader system can reach into our process and Make things complex for us there even with those facilities that we have So kind of the canonical example there is the database, you know complexity in the database reaches into our individual process and makes it harder for us there and It's not only just kind of what happens within that bubble, but it's about the boundaries of the bubble right, so What does it mean to be an application server? you know part of the definition of that is Sort of defined by the attributes of this greater system, you know the attributes of the database define what it means to be an application Server the database is over there that limits the architectural options you have it sets the boundaries on the bubbles in which we work So the database is not the only thing of this nature that's kind of reached into our programs Making life hard there and then defining kind of the boxes in which our programs can operate Another thing is the humans humans are part of the systems as well, right? You know, we are in there setting up setting up servers standing up systems Changing the architecture of our systems Creating values inserting them in places, you know Whereas much of a part of these systems as the database as the application server as anything else so The problem is when we are are computing as humans Sort of within the language of the system You know, there's no information model. There's no process model. There's no notion of update. There's no kind of Built-in notion of conveyance, you know, we're sort of flying blind without the without the sort of Facilities of closure inside the process and was out and outside of the facilities of kind of however, we set up our system to handle some particular case and What ends up happening is we're just constantly blowing our foots right off, you know Who's ever overwritten a piece of data from the repel, right? You know, this is This is stuff that happens all the time, you know, we set up we set up some system, you know We you know initialize it with some parameters, you know We close the repel and then a week later. We forgot what we did, you know, how You know, maybe we remember in generalities what we did But you know, what was that second argument for that function that we used to initialize this thing, you know And maybe it's usually this but in this special case It was this other thing and now we forgot what that was, you know, we come back to our system and You know now we kind of have to re-remember that from scratch. Oh, we get this error. We Google it again Oh, this is something that we remember was the situation in this particular case. So let's you know, let's fix that so we have these kind of story stories of successes and triumphs and stories of failures and We can't share that knowledge. There's no There's no sort of representation where you can say this is how I stood up, you know My had duped cluster and you know ran these things that you can just kind of pick up and give to someone else It's it's always a totally ad hoc process of oh, you know, let me write some tutorial online It's a particular format in a particular place And you know remember all the steps. Hopefully we can remember we put all those things in there It's a pretty heavyweight thing to try to share You know to try to share our stories that we're living every day And The ultimate cause of this is you know, this is a disaster of unmanaged state at the level of human computation when we're computing with our systems, that's that's kind of the ultimate cause and the tendrils of this, you know, there's bazillions of them and hope, you know, maybe At the end of the talk, I'll have time to unload the full clip You know at the rebel and kind of enumerate all the ways that that this is causing problems But you know We can kind of see that already just kind of at a basic level. We can't remember what we did You know, we can't reproduce what we did. We can't share it with other people So kind of the question that I have is what is the closure way for human computation? You know, how do we apply? the principles and methods and tools of closure and atomic to this case when we're doing the computation and kind of the the key idea is You know, the thing that we can hook on to is narrative because narrative is where humans meet computation You know, they are that sort of the nearest concept that humans can relate to to what computation is So here's here's a basic observation computation is a narrative and Narrative represents a computation, you know, they're both kind of essentially about going from point A to point B through a series of steps You know, sort of a series, you know an evolutionary process that does this transformation from point A to point B and It's it's all about that sequence really and that's kind of what defines both of those things If you just take the last element of the sequence, then you've lost something essential Right, if you take the last part of the computation the output, you know, that's just a piece of data That's no longer a computation. That's just a piece of data You take the last element of a narrative, you know, and then they lived happily ever after Right, like you've lost something kind of important, you know It's not just about the end You know, it's about what happened and sort of the the meaning of what you know The end is in the context of what happened the meaning of what's in the middle of the story is informed by what happens later and what happens before it and The reason why we care about the overlap between these two concepts is because narrative is the most powerful way of communicating knowledge It's the most general way of community communicating knowledge and for certain kinds of knowledge is it is the only way of communicating knowledge And I don't think it's sort of an accident of evolution or something that Humans operate on narratives, you know narrative in narrative out, you know We have sort of the little drama of our lives and you know, we perceive the state of the drama We compute the next step Do the next action the world responds and and the narrative continues So session is a system for narrating computations the sequence of inputs and outputs, right? This piece of code comes in, you know, this result comes out this piece of code comes in this piece of This result comes out the sequence of those pairs. That's the computation that we're interested in and What we want to do is Turn it into a value because then we get all the benefits that values give us Easy to perceive right easy to perceive the narrative doesn't have to just be a bunch of text in the terminal We can put it on a web page web app have pictures in it and so forth Easy to remember we can actually remember what we did You know, easy to fabricate easy to reproduce to relive that sequence of steps You know, there are some fields where that is kind of the defining critical issue of their time right now You know scientific computing You know you people doing experiments. How do you reproduce those experiments? They have no way to represent some structure that they can convey to do that So, you know, you can convey to other people Another thing that's pretty important is you can index index these stories, you know You can kind of aggregate them index them query them and so forth So let's kind of move towards solving problems here. So in Kind of the more abstract case of what stories do for us and then move towards some demos of session of how this kind of pans out in in our world So the first thing may be the most fundamental thing stories explain Right stories explain How the world came to be the way that it is, you know, how some artifact was created You know, that's sort of Oftentimes that's the best way to understand the thing Sometimes it's the only way to understand the thing is sort of how it was created how it came to be So, you know, who who's ever been surprised by the output of their program, right? like This is you know, sort of this happens to us like every single day and What do we do kind of the canonical thing to do? You get some piece of data. You don't quite understand what it is or what it means is you got to go back up the sequence You got to go see the narrative and see the actual steps of how it was created You know, whether it's the detail of you know, why is this date? You know, does it have a time zone and you know, what is it or whatever like kind of the mechanical details of the computation? sussing that out or Understanding kind of what it means in a broader sense of it came from this data source And this is what the computation was and therefore, you know, we computed this about this thing You know kind of where it lives in the broader universe of things Another thing stories do is stories instruct it's pretty easy to see that if you have a story of how you went from a to b and You want to go to be again? Then you have you you have a recipe of how to do that, right stories instruct you You know, how to how to do things So, you know, I Had you know, here's the story of how I installed emacs, right? I download this this thing from this website. I installed something there Cloned this get repo and move those files over here. I ran it and I got this error You know, that's like the dramatic point in the story and then But then I overcame it because you know, I did this and you know now it works So, you know one person, you know one kind of hero went out into the unknown and came back with this Experience that they share and now other people can follow in that path They don't have to kind of start over from scratch. There's a path for them to go on so stories instruct Stories also convey purpose right, they don't just tell you why the world is the way it is if it don't just kind of Tell you how to change the world into some new state They tell you why you would want to do that. They give you purpose They convey a purpose. They convey sort of values of why you would want to do that And this is really important because that's what makes stories human You know, that is what makes them something you can identify with as as a human individual and They do so in many different ways, you know, some of them are implicit just the fact that something happened that the story exists It's sort of an implicit endorsement that this is something worth doing or not doing potentially Depending on your interpretation and Some stories just you know go Explicitly, you know, I did this and it was good because you know X and you can see that, you know, I Implemented this algorithm and things went faster compared to the old algorithm And so forth. So stories convey purpose So let's let's put some of these problems in context. So what's the biggest problem in closure? We actually know the answers to this, but you feel free to shout out Anyone anyone So Yeah, that's a problem. It's a problem That's not the biggest problem though. Okay All right, so the biggest problem is documentation So I'm not just kind of you know using my own opinion here We have this 2012 state of closure survey from Chaz Emmerich Doing excellent work there. So 30% of the people You know the highest number of all the possible options said Documentation lack of documentation was the biggest thing holding them back So obviously we have a bunch of experts here. So maybe it's not You know as big of a problem now parentheses may still be a bigger problem for for the people in this room So let me show you an example of how we made how we might do documentation So let's go to a session here and And okay, so here's session I hope people can in the back and see you can see this. Okay, let's see. All right, great. So Like I kind of mentioned earlier the foundation of session is the idea of a series of input and output peers So let's let's sort of go ahead and make sort of a tiny little closure Closure language tutorial. So we're going to say here is apply a function and You know here. We have an example of an input and output results let's say Sort of apply a function across a vector Right, so we can say map plus 1% and Then put some data in here. All right Looks like it actually works excellent And you know, we can sort of go on right and just kind of start adding these examples Take two elements from beginning well To so we're sort of building up for this sequence of stuff and right now It doesn't look much different from your typical ripple session other than of course you know, we we have a web app here. We actually have a Simple version of of par edit operating in here. There's this thing called sub par Which gives us some simple par edit capabilities Which is nice, but Let's just do sort of one more thing reverse All right, so I just kind of pretended to be the author here sort of Making examples of using functions that you know, I've written or whatever someone else has written and now we will simulate being a Consumer a reader of these little stories So you may have not seen what happened, but I just reloaded the page, right? sort of the equivalent of closing the repel window and Opening it back up and all the stuff I did is still there or all the stuff someone else did is still there and You can just kind of go in here and start reevaluating stuff You're not kind of copying and pasting from some static text somewhere or and you're not sort of reevaluating code That's sitting in a text file that does not have the output, right? Like if you don't know what map does And you see this example and you don't have the output When you evaluate that example, how do you know the output is correct? You don't you have no idea of what you're getting is correct or if you see an error you know, is that the correct thing to be happening and Not only can we sort of relive the story that was written before But it's sort of as if you have the storyteller right there and you can you can ask questions about the narrative, right? Oh, you know, here's the detailed part of the story and I don't quite understand it So let me sort of you know ask more detailed question of what happens if it was like this, right? You kind of can ask the hypothetical questions in the midst of the narrative to enhance your understanding of it. So Let me prepare the next demo and then Go back to My slides here so That's sort of an example of an instructional session examples without the incident incidental complexity You can just kind of go to it start evaluating stuff Sort of minimizing other fuss and it's it's certainly better for the author You know, all they need to do is deal with the closure evaluation environment You know, maybe they're doing this for their own benefit And it's certainly better for the reader slash user You know, you have the examples right there online you could start evaluating stuff right there online You know, you have the sequence of examples and you can permute them ask more questions about what happened It's certainly much easier to share an index and You know sort of who's who's ever received an incomplete bug report, right? Like In this kind of system There's a direct line from what I have now to well someone evaluated this example and it blew up, you know Checkmark, you know send off to you know, some you know repository indexing service somewhere, you know, kind of Notify the author of the library that You know, you had a bad user experience in this case and they can get the history of what you did You know and the annotations that are happening behind the scenes in session sort of adding meta-information And you can go beyond that of course, you know submitting Submitting tests You know, why are we not collectively creating repositories of tests and it's because you know There's no way to kind of share those lumps of stuff in the reasonable way But also because there's no user interface hooks and this provides user interface hooks for those sorts of things, you know This thing is something we think should be a test, you know, click this, you know send it off to the central test repository or whatever So let's let me give you an example another example sort of more complex example of what we can do Hopefully things have loaded here properly Yes, okay, so So who read the the codec blog post? Okay, so who was interested in kind of analyzing their own repository? Okay, so how many people go went ahead and actually did that a few? Okay, actually decent decent fraction of the people that raised their hands for the second question but still there's there's quite a bit of drop-off in that in that conversion funnel and I Would argue the reason for that is the same reason why you know what happens to many projects, which is You know you have this kind of static bit of code and maybe some explanation of how to use it But you can't just kind of jump in to start evaluating stuff and start doing stuff so right here I have a session that goes ahead and does a bunch of analysis or some analysis on the closure github repo, so I'm going to go through and So so when these things load they're essentially You know representations of what happened and I want to reproduce or sort of relive what happened So I'm going to go ahead and step through Some of these computations All right, well that's a little suspicious Let's see. Well, let's see what happens here So I'm going to step through these computations. Okay. All right now now I'm starting to have some confidence that this is actually doing something good Right if I did not have the output together with the input I wouldn't necessarily have confidence that my re-evaluations were doing the correct thing So I'm going to explain some of the some of this code. That's at a point when I kick off a more substantial computation Okay, yeah, we're almost there Okay, so this is a little bit more substantial computation will take take a two minutes or so And what it's doing is so in the in the codec example in riches blog post the kind of computation given as an example was finding the Novelty that's being introduced into the repository so You know a given commit, you know it modifies various code and During that process you may be introducing new definitions for functions hopefully that's what you're doing and Then the question is when you know sort of Given the function given the symbol. What are the unique definitions associated with that? That have happened during the history and when sort of when was the unique time that that was first introduced So, you know for instance, you know for the closure core map Function there's I guess four different definitions that and those are the corresponding commit entities for the when those different definitions were introduced and Just to kind of Show you a little bit more stuff here. We're still computing the commit the That thing there, but so one of these commit entities basically looks like this right you have kind of the commit message In this particular case, you know some tests were introduced sign things like the committed at time the Shah You know so on and so forth so we're still waiting for this thing to finish but While we're doing that let me sort of show you what you can do when when it does finish. Ah Well, there it is great So Even without having had the Computation in hand I had I already had some code here that kind of shows you what the structure is right? So we take the first from that commit sizes thing And you can see the first thing is a big number and the second thing is a smaller number And you know if we just kind of look at the structure of the code It's pretty obvious. You know the first thing is the commit entity and the second number is the number So it's the number of new codex novel codex introduced in that commit And I'm kind of interested in that because I want to see you know, how many commit how many new Codex are introduced in each commit over the history of the closure repository Because I think that's an interesting question and it's launching launch off point for sort of more questions So we can take that data and just make a plot This plot is a closure expression eating data. It's a tag literal when it turns into When it gets sucked into the into the browser it kind of turns into a Java object or a JavaScript object So, you know commits can have Commits can have the same committed at date So we need to do a little bit of transformation to first accumulate All the all the commits that happen at a particular date and then Turn that into the plot and that's what you get you see there's a few commits that totally dominates You know, there's just like tons and tons of new things introduced in those commits And you can find those pretty easily by filtering on the commit size Variable there get things bigger than 400 different codex touch those entities and you see okay one of them is when they added though You know 1.0 introduce that thing and all the metadata Another one is removing the deprecated some deprecated reader macro from a bunch of functions And then we can do things like well, let's filter things that are all under Commits that are under a hundred different things change and kind of see that so it kind of looks like the most intensive period of Of closure development was around here, you know 2010 June June and in July seems like a bunch of stuff was happening there and If we're kind of interested in closure historical research, we went we might want to continue looking at that direction But you know that's sort of not really the point of my talk the point of the talk is This is a knowledge artifact, right? I've done this for closure and now I kind of solve that problem and If I give this to you, it's it's pretty straightforward for you to just modify this code to operate on your own repository Or you know, you could also choose to continue the kind of closure branch and explore closure some more But you don't have to start from scratch. You can You know, you kind of you can just go in there have a starting point basis for modification and You know where that you sort of know where the narrative goes, you know, it's not just some API Where okay, you can theoretically do some capabilities and it's also not an application You know for me to turn this into an application a parameterizable application Where you put in your repository and out comes a bunch of analysis. You know, that's a bunch of work And that's a bunch of work on top of the work. I've already did Let's go back to the To this guy here. So So the advantages here is You know, I've basically done an experiment or produced some results. It's reproducible and There's significant advantages over this model over an application Which would be kind of the alternative paradigm for sharing Reproducible knowledge, right? You can't share a reproducible knowledge from the repel really The only paradigm that we have for doing that is this for writing programs writing applications and that incurs a ton of complexity So this is a simpler way of transmitting The ability to reap to do redo a computation Without kind of interfering the complexity of going into into the application space So that should give you a sense of Kind of What session can you and why you would use it? So let's kind of go in a little bit into the architecture And this is the basic architecture It's all about datomic in the middle here And then you have these you know machines or conveyor belts that move things around between datomic and the person and Datomic and the system The person in the system never interact directly. It's all going through datomic and Basically we have Well inside atomic we have these sequences of actions and results right you this the human submitted this action and The system produced this result and those things are stored kind of in pairs in datomic and The purpose all this other machinery is to just kind of aggregate more of those things in the datomic database so we have the UI that talks to the sentient being Performing the universal computations You know put these guys in front of an iPad and you'll see anyway, so So, you know the UI is both kind of the web UI and it's also of course The thing that talks to datomic which right now we can't really do directly from The browser in the way that I want to do so there's a little bit of a server-side component there but it's it's quite thin and What happens is you know you submit your action this thing makes a transaction into datomic These services are listening to the datomic transaction stream and notice that the action Sort of the request embedded in the action is talking about them So they're listening to the transaction stream notice a new action do whatever is they need to do and Then they report back to datomic Now and then you know that results get sent over a web socket and then you know back to the You know we're listening on a transaction stream here and then sending over web socket back into the UI And you're kind of seeing the result up here There and then you can perceive you know perceive the result perceive the history and take the next action So there are several important points here. The the first point is that we're not storing Necessarily the data in session or in datomic, you know session datomic In this case, it's all about storing stuff about the world. It's not about being the world, you know This thing might be you know the data might be some terabyte thing that we're computing with and We don't want to be responsible for storing it. There's services to do that for us So we tell the services things They may produce a value and kind of have a hang out within their own space and just tell us, you know I did I produced this it was this big You know and here's kind of the first few elements of it or whatever the only thing you need back from the service is Enough facts or the human to make a decision off of So that does not necessarily include all the data it could include a summary of the data It could include, you know metadata about the data and so forth and That gives us a lot of flexibility, you know, basically the idea here is we're just coordinating these services and Coordinating the services and telling them how to talk to each other. So for instance, you know one action will be You know compute this thing You know do this computation the next action can be Put the thing that you computed into this other storage service so that you can persist it Take the thing that you have in memory in your process in sort of the closure evaluation environment and persist it to the storage service so that it can be around later and When the person wants all those pieces of data about how many, you know commits How many codec codec correspond to each commit, you know, they just had it and they don't have to reevaluate all this stuff We you know just persist that value So The greater components of kind of this architecture is there's a this process model, which is very important There's the services which I talked about We need to achieve location independence for data. This is very important And we need to be able to represent as many things as values as we can possibly can You know, we need to push the boundaries of what can be a value, you know, if the database can be a value then You know, that's a kind of that's kind of shocking right the database as a value like That is pretty unbelievable So if that's possible then there should be a lot of other things that we should be able to treat as values that right now Or just blobs of you know imperative building up of stuff And if we can store those things as values that gives us And you know that sort of enhances the power of session even more So let's go through the process model The basis the starting point is the epical time model of datomic, you know We're building on datomic so that that's sort of not a surprise and the only difference it really is kind of what happens in those little boxes and Sort of what those f's can be so this is kind of This is kind of the process model right here so inside of the database we have these sequences of actions and results and The process of adding stuff to the database is more of a two-step thing So one step is The sentient being Looks at the history of actions and results right that's the narrative This is kind of the whole input How you decide what you do when you're looking you know you're looking at the repel session You're looking in session you see these inputs and outputs You're cogitating and you then you decide based on all that data. What should be the next step? Oh, you know, let me look at the first element of this list because I don't necessarily understand what it is or looks like everything works You know, let me take the next step and build this graphics You're kind of processing the entire history of the narrative to produce the next step of the narrative And to do that you produce an action. You know, that's your job. That's the kind You know, that's the computation that you do as a human you Take take that history and then you produce the next action and then it's the process. It's the Responsibility of the universe then to produce the results right and What it's going to do is it's going to operate on on the action like the whole history of stuff You know, that's there, but you know, that's kind of a vague thing requiring human intelligence to really You know make a predictable or to make a decision out of and we want the things that we're telling What to do to make predictable decisions based on kind of local information So the services will just call that f Take the action and then resolve it into a result and then Between those two steps. We've sort of completed the entire loop of adding adding to our narrative so Human computation narrative in narrative out mechanical computation action and result out right the whole thing The the thing of the work we do that's a human computation The mechanical computation is the individual steps So services Not just closure evaluation, right? You know if all we can do closure evaluation then there's a hole in our model because The reason why we're you know a lot the thing that we're doing in the closure evaluation a lot of time It's like talking to all this other stuff so if that's you know sort of if that's not incorporated in our model then there's a huge hole in our model and Furthermore, there's no need to have a closure dependency in order to talk to these services if you're talking to the Twitter API I asked asking you for some stuff Now why should closure be kind of a dependency in that path? You should be able to represent those things directly You know if you're talking to some huge computation service some had you think you should be able to talk to that directly and give it an Instruction directly get the result back directly without kind of going through some closure layer And ultimately what we're doing is I'm we're telling them to make stuff and report back We're also telling them to coordinate with each other, you know sort of okay You guys set up whatever stream you need between you and you know do the dance and tell me you know what what happened I? Also believe that we can have services as a value You know apis The things that we have they're not that great And there's a way to do this enclosure with values so I don't know if I should get into it now but You know the problem is is again solving this location dependence Location dependence problem Now if you need some queue to take things from point 8 to point B and that queue was a place and then You transfer your session to someone else and they want to run this computation You know they need that little component of the system as well Right You know if you have your session and you're talking to all these components of the system The part you know you need the components of the system to be values Otherwise when you transfer the session you can't kind of transfer the computation along with it And there's already a President for this and which mentioned yesterday, which is actors right you can move actors around from process to process and It is possible. I believe to Take the part of actors that confines them to having a specific model of communication between each other And how and sort of break that off So you have the ability to move these things around but you're not stuck with only having one protocol that they speak to each other with so 2013 we'll get that one Another big problem definitely very important to solve location independence for the data So it's critical for a sound information model in your session. You can't be writing to specific locations kind of manually Because then you could overwrite them or you know, it's just it's just a huge mess critical for conveyance again Pat you know sort of passing the session to someone else You can't be managing the location of data manually yourself. It should be an implementation detail managed by datums So, you know you have some results and you have some attribute on the results the location The location has various attributes like host protocol whatever you need to kind of resolve That reference into a concrete thing and if your code You know if all your code ever knows is you know, I call first on the thing and it gives me the first element like it's a seek or You know the thing implements whatever protocols I expect it to implement You know, then your code doesn't care, you know that back that well The data lives in three different places that datomic knows about you know S3 my local storage and my friend over here knows about this piece of data And you know when I asked for when I tried to perform my operation on that data A bunch of stuff happened behind the scenes to figure out which thing I should use and just kind of pipe it in my program So we can make it into implementation detail managed by datum So we're not sort of saying like x1 equals this x2 equals that x3 equals that you know as we're evaluating our code and then you know you get into some situation where You fix a bug in your you know transformation function and then you re-evaluate x2, but you don't re-evaluate x3 And now you know x4 is not based on the right piece of data Now these are the things that we get ourselves into constantly when we're working with data at the rebel And then like I said, we need to lean on values as much as we possibly can the benefits are just enormous And we need to especially use them for things like graphics and UI so that we can perceive our data and perceive our session independent of the state of Systems that we're based on you know if you have to launch some complicated system and then build up a bunch of state inside of that process Just to see What it is that you did like this is really bad You have to be able to see Perceive the work that you did without having to launch all this stuff up And the way to do that is to treat things as data And the way to do that is to treat them as tag literals for things that Have a little bit more juice than just kind of you know a maverick whatever So it looks like I have some time so we can unload the full clip In three minutes, so the rebel so what's the basic characteristic of the rebel oh? Before I unload the full clip. Let me you know Let me just point out the reason why I'm doing this is just point out how this is different from the things that we're doing and kind of Enhance the understanding of the managers of doing them the session way Okay, so the characters of the rebel is this right it's just like Sisyphus rolling the boulder up the hill You know you're just like rolling the state up the hill rolling the state up the hill You know you close the window and then poof, you know you You know it's a new day you're back to You know all the work is gone and you're sort of committed You know sort of condemned to a lifetime of you know toiling your way You know copying and pasting things into the rebel or reevaluating stuff So there's no memory and that's kind of the fundamental problem So there's no memory of the system state of the system before you did what you did notice memory of the state of system after you You did what you did no memory of what the heck you even did Right, so there's no reproducibility Can't reproduce if you can't remember Limited perception that's sort of a consequence of you know text-based thing There's no there's nothing to convey to something that can represent it in a better way Sort of DIY conveyance you know you're at the rebel and you want to Save the fact that you actually did something in this universe, right? You want to persisted beyond your particular rebel session and what we end up doing is just plop all over the place Let me save this piece of data in this file. Let me put it in some other location and storage And then you know you end up overriding it or someone else is overriding it or you can get confused about what matches up with what It's a total disaster and then you get transcription errors, you know Who's ever made a mistake copying some code from a tutorial, right like you know We're sort of reduced to copy and paste as our mechanism of conveyance to and from the rebel So there's no versioning You have no idea what order things happened in you know You had five versions of this function which version produced the file on disk, you know Who the hell knows you know you come back to this a month later? You know sort of no idea what happened Likewise, no auditing you have some piece of data. There's no way to get the history of how that piece of data was created There's no context You know in which context was this piece of data created and of course no extension of the environment of the rebel Because it's such a low-level text-based thing. You can't kind of go in there and start adding of the Send this example to the owner of the library so that they can you know choose to accept it into their database Two other systems worth talking about in my final minute here before I get forcibly carried off stage So small talk and Mathematica both, you know, very innovative systems, especially in their time So we're not doing small talk images. The point is not to Remember for the sake of the computer the point is to remember for the sake of the human being So we don't have to persist kind of all the states so that we have 100% reproducible stuff We have stuff we need to persist stuff so that the state of the human mind can come back to where it is and Mathematica You know, we're not storing things in documents in notebooks. That's place-oriented programming That's overriding old information And that's also not being able to dig out the information that you produced You know if you're putting all your information to a document and someone else is interested in that information There's some other component in the system. That's like You know, give me all the new blog posts You know, there's you know, you can't it's very difficult to have automated systems to dig into these documents and extract out the information You want your information to live in the loving level playing field with all the other Components of the language of the system So I believe this is a paradigm whose time has come and with the tools that we have now we can finally make it So thank you