Submind YouTube summaries
Thumbnail for Grand Unification Theory: Writing and Running Code, by Brian Ford

Grand Unification Theory: Writing and Running Code, by Brian Ford

Watch on YouTube

Video summary

Brian Ford from Engine Yard argues that the fundamental essence of programming lies in communication rather than mere construction or strict adherence to abstract patterns, viewing code as a vital artifact for exchanging information among programmers, their future selves, fellow developers, and end-users. To enhance this communicative process, he emphasizes critical factors such as clarity, simplicity, relevance, precision, appropriate medium, tone, safety, openness, and the strategic choice of programming language. Ford contends that dynamic languages like Ruby offer superior communication capabilities compared to statically typed ones because they facilitate runtime changes without rigid type constraints, thereby prioritizing behavioral understanding over static correctness. To support this vision, Ford introduces Rubinius, a Ruby implementation equipped with a precise garbage collector, true concurrency, and a just-in-time compiler that returns compiled code objects upon method definition instead of nil. This capability enables deep analysis of running programs by allowing tools to track when specific code paths execute in production environments, associate features with user interactions including geolocation, analyze data flow, and predict errors by comparing object types across different contexts. However, Ford identifies significant challenges in realizing this potential, specifically the difficulty of displaying multi-dimensional information beyond simple syntax highlighting and the need to transform raw profiler data into actionable insights that truly aid developers. The talk culminates in a reflection on whether current development tools, symbolized by a blinking cursor in an editor, are sufficient for modern needs or if we must strive for deeper "insight" to facilitate a more productive conversation between humans and computers. By leveraging the unique properties of dynamic languages and advanced runtime analysis, Ford envisions a future where testing, development, and production environments are seamlessly linked through tools that understand the semantic meaning of code rather than just its syntax. Ultimately, the goal is to shift the focus from simply writing code to creating an environment where the act of programming becomes a rich, insightful dialogue that bridges the gap between human intent and machine execution. The session concludes with Ford expressing gratitude for the opportunity to share these ideas regarding the evolution of programming practices and tools.
Read the full video transcript
so it's uh it's very good to be back in barcelona i actually got this is the only city in europe that i've been to twice i haven't been to that many cities but beautiful city very happy to be here i want to thank um the organizers choose and everybody else from uh from the organizers of baruco beautiful city beautiful place to be and uh also thanks to uh all of you for being here and the other speakers so i work at engine yard on rabinius i started working on robinius late 2006 and started working with engine yard in january of 2008 and as a company i think they've done more for ruby and rails than than many companies have done for any language so i'm very very happy to work there basically what i want to talk to you about today is uh this idea uh when you look around at how you write code how other people write code um not much has changed in decades and i would like to do something about that so if we look at like these are the things that we kind of we have right if we're going to write code we have debuggers we can we can profile our code we can see where you know what code is running where we might look at like for our total code base what the coverage is if you use a statically typed language then you have this little theorem prover that you know checks your type stuff is correct and we have an editor right these things largely are unchanged for like decades so there is one language though that uh does things a little bit differently uh small talk you may have heard of it um and basically any time you start talking about code someone will say well small talk did this right so the fact that small talk already invented everything and we're not using small talk probably means that either small talk didn't actually invent everything or we just suck right you can decide which one of those it is in small talk writing code is sort of a function of running code so your system is running and your editor is part of the system that's running so you can like write some code and like change how your editor works so it's it's a very interesting system but the total experience of writing code is is largely not that different than when you're writing a ruby or something else we have this editor and our editors are basically like you know we we talked there's like a slime is that the new new big thing the new hotness like textmate was going to be for a long time and textmate 2 took forever so then people actually started using vim and emacs again which they've been using like decades before that and then you know so that like editors it's just this thing that it's like it's like a really good photographer or something you know it's like not taking like a picture of something it's just like pointing pixels here and there you know it's like that level of sophistication in in in language like so in english this is a perfectly grammatical sentence that is absolutely meaningless right it means nothing and yet you can actually sort of if i say this board swam wistfully through the narrow sky you can actually like sort of create some image that goes with it but it's absolutely meaningless it's like writing a program that type checks and everything and then just sits there and like like zed was saying doesn't halt right so uh our editors and the way that we write code it's basically about the level of sophistication of a spell checker right and if you've if you've ever been typing on your iphone right and you have a spell checker and autocorrect right it works so well right there's whole sites dedicated to like the the hilarity that ensues from like autocorrect you know getting in the way and that's about the level we're at in writing code right so writing code right writing code we the the word that we basically use is programming right so so what are we doing when we're programming we talk about all these things you know like zed's talk was just fantastic for me i think because i i love to see where people start to build up this beautiful structure in the sky about how important lake yankee says category theory is or test first development and you start worshiping at this thing and like he says your brain just goes off right you're no longer like critically thinking you're no longer questioning is that really helpful is that something that we need so you know patterns you know like there's always something new to like help you protect against you know some terrible thing that you probably haven't actually asked whether it's that terrible what's gonna happen if you don't do it so nothing is wrong with any of these things but are they what we're actually doing when we're programming are they the most important thing that we're doing we hear something like this so someone will say good design communicates in tension everybody like nods like yeah intention and when you look at the ordering of the concepts here good design comes before communicates but if we were to try to break down what those things mean good design is this very nebulous and difficult to describe thing but there's another word in here that i think is a lot more concrete then we can actually look at what makes up that word and that's the word communicate i think that when we talk about programming when we talk about writing code the most important thing that we're doing is we're communicating and the definition here these you know this definition just comes from the apple um dictionary on my computer but you know you can look in a big dictionary something that's going to be very simple it's uh imparting or exchanging information there's a lot implicit in that definition right so if you're going to impart or exchange it suggests that there's an actor it suggests that there's somebody who's receiving i mean you could i guess you could impart information to yourself but that's kind of hard to to think about right because if you didn't know it before you told yourself about it then yeah so so there's probably two two people there when we're programming uh we have the computer we have something that's running our program but we also have our later selves and that's that's something that you could actually communicate with your later so if you come back to that code a week later and you're like who wrote this you go get blame you're like oh i did or other programmers other people that are going to read our code so the idea the fundamental sort of idea i think that what we're doing when we're programming is we're actually communicating that's that's the thing and i didn't i didn't make this up kent beck actually has a book that started out as small talk best practice patterns and it was rewritten uh as this book implementation patterns and the rumor is that he's going to write one that's more focused on ruby instead of java like this one but basically the idea is that you're communicating when you're writing when you're writing software the other thing is that the software that we write almost every piece of software we write ends up itself being an artifact for communicating so if you make a website right for booking travel then some other person comes to the computer and they're using your website to try to communicate with you know the system or if you're like sending an instant message to somebody you're using the software to communicate and things that that system does may either enhance or impair that communication right like typing you know a message to your girlfriend and autocorrects and uses the wrong word and you're like oh you know that sort of thing so again communication is central so if communication is central how do we look at communication how do we break it down how do we figure out how we can communicate better these are things that i've sort of just pulled together i don't have like a source for this but i'm sure there's people who've done studies on communication that would be helpful if you go look them but these are the things that i find most important for communicating first off being clear which simply means not being confusing right not being ambiguous so if something is an x then it should be an x and not be um you shouldn't have a question in your mind or is that the x or is it a why that sort of thing that's just simple obvious or unambiguous simple it often goes with clear but they don't mean exactly the same thing if you've seen uh rich hickeys talk about simple versus complex right in in this this sense we're talking sort of that way that it's it's not complicated it's not too many things that come together there's one thing or there's two things and i think this particular one is very important so is it relevant you could be very clear and you can be you know very simple and you could be talking about politics instead of like programming language or something like that right so it really needs to be relevant to be a good communication and precise right which is simply this idea that um if there's a distinction to be made right if there's a line to be drawn somewhere that you do that as as closely as you can to the the concept that you're talking about another idea in communication is how you're doing it right now i'm talking to you but i could have written this out and you could all be just sitting there reading a blog post or something right so the way that the message comes to you right the medium is uh is a part of the communication and it can impact whether communication is good or not and then there's things that start to like go sort of away from all that stuff previous is a little bit mechanical right it doesn't it doesn't like um it doesn't necessarily involve a person you could use those those criteria for good communication and see how well two computers are talking to each other right potentially but when we get into more human factors there's this idea of tone tone can can have a very large impact on uh communication if someone you know if you you walk in and you're like hey how's it going in the morning to your co-worker and they're like they just grunt at you or something i mean they acknowledged you the communication was pretty clear but the tone you're probably not going to be like oh by the way i had a problem with your code because they don't seem like they're in a good mood so so tone is something that non-verbally i i don't want to make it too like human center but basically tone can affect how the message comes across and then or not something is intimidating or um threatening like if you um if if the message that you want to convey is too aggressive perhaps then people are going to react to that in a way that they're not even dealing with your message they're just dealing with the way that it's that's coming to them but this isn't just for people either if you watch people interact especially people who are not particularly technical if you watch them interact with computers they're often very reluctant to try something because they're afraid it's going to break and they're probably going to blame themselves if it breaks right if they do something and the computer like fails they're like oh i did that wrong it's not necessarily that they did anything wrong the computer could be completely screwed up but there's that that tendency to blame themselves so that whether something is safe or not can impact how willing someone is to to try something uh and then i think this is another thing that's very important for communication um whether someone is open to what you're saying if someone is very defensive they're they're going to be thinking about every possible way to tell you that you're wrong about what you're saying instead of hearing what you're saying right so that's something else that's very human but it can affect communication and i i think that um that it's one of the factors of good communication that is not often appreciated right like you can just be talking if you see two people in an argument you're like how much are they communicating and how much are they just sort of protecting against actually getting the message right so those are some those are some things about how communication uh how we can analyze communication how we can see how how good communication is the one that's very interesting to me from the standpoint of changing how we write and run software is the idea of the programming language itself so the choice of programming language the programming language when we look at those factors of communication the programming language itself is not just um it's not just something that we're using it's it's actually the the medium that we're that we're conveying meaning with right it's not just that it's not just the arrangement of symbols it's more than that it's the it's the thing that carries the communication right so the choice of programming language whether it's python or ruby or haskell or closure or something like that it's not just the syntax and the grammar the way you have to put things together and whether you can use a you know a string that's immutable or a string that's mutable it's actually the whole body that's carrying that that meaning and it's going to imply things about how how well we can communicate one of the biggest in my experience one of the biggest um debates in programming like if you talk to different people it's like do you use a statically typed language or dynamically type language right so the emphasis being on typed here so here's a definition of type this it's a category of things that have common characteristics right but if we if we take a look at ruby um where's the type in this right there's no there's no type here what we're doing is we're dynamically setting a constant so the fact that we can set a constant at runtime instead of like you know before it it implies runtime versus writing code time right which we don't have a good word for um authoring code something like that it's dynamic but it doesn't really have anything to do with typing right or this right the instance variable b right there i'm defining a singleton method so i'm adding an instance variable to this particular object again it's dynamic but it doesn't and it doesn't necessarily imply anything about a type the fact that i'm changing the singleton method on this object a means that a is no longer going to be quite like other objects even if it's of the same class but the fact that the instance variable can be created dynamically doesn't again really have anything to do with types and uh if i do this right if i create a new class at runtime this is closer to type but it's there's not actually i just really have an object that i sent a message to right i just asked for a new thing the thing happened to be a class that i'm asking for a new one so um that last slide it's a little bit of meta programming right the idea of like uh not the language itself like you know just deaf class whatever but the idea of sort of talking about the language that you use to define your program right this idea of meta programming is often seen as something apart something that you can do in ruby but you can't do in something else it's basically again you know just sending a message to an object right so meta programming is not really that different i think just focusing on this idea of computing values right by using these little objects or values i took the word object out of there to try to keep it a little bit away from object oriented programming basically just computing by having these values that you send messages to is i think a more uh important way to look at programming than getting too wrapped up in types right so i want to take that type out and we're just going to talk about a dynamic language and the implications of just using a dynamic language something that can change its form or structure over time and we'll leave the whole typing debate to people who just want to argue right so my assertion is that dynamic language actually communicates better based on those those things that we looked at before the the characteristics of good communication if i have something like this right um it's quite simple right because each element of this right is relevant to it like i don't i don't really care what type of thing x is i only care that it has some behavior called y right it's clear there's no there's no way to sort of confuse what x dot y is with other parts of it um it's relevant right what i'm saying is i have a collection of things i want to visit each one and i want to ask for this particular value to be computed whatever y computes right and it works just fine if you have a heterogeneous array like this right it doesn't it doesn't have to be all of one type there's nothing that adding you know x is a you know integer and only integers can you know function here there's nothing that that adding that additional level of specificity really helps me understand this code any better right one of the things that we get sort of wrapped up in in this whole static statically type versus dynamically type thing is this idea of correctness uh or safety rather it's like well you want your program to crash at runtime you know it's like oh my god what's going to happen this program is going to crash um the confusion there is often correctness versus safety ruby if it raises a no method error it's not really any less uh safe right the computer is not going to be in a in a state that it can't recover from but the program program's not really correct unless what you're trying to do is raise a no method there right so we can have very safe uh programs in ruby that are not statically typed but they may not be correct and you can have completely safe programs in aesthetically type language but they might not be correct and what i'm more worried about is correctness than safety right okay so writing code communicating that's the central activity right i think what we're doing when we're writing when we're writing code what about when we run code like uh every time you run a program it's not necessarily the same the same context i guess right these are different reasons why you might run your program you might just be like in irb or some other repel testing stuff out you just want to see what happens right or you could actually be running all the tests for your program the sort of feedback that you get if you're just doing some exploratory programming might be a lot different than you care about when you're testing right you don't necessarily want to know what particular thing ran when you're when you're testing you want to know did everything pass if it failed if there's some failure can i get to the code and the test very easily when you're when you're doing exploratory programming you might want a lot of like output you might want to see like the whole structure of the object that you're playing with stuff like that right you might be running code in development you might have you know rails up and it's got the great like dev mode where you change one file and you go do something and you don't have to like communicate okay now reload this sort of thing it takes care of that for you so you're running in development again you have like different uh output that you want different way that you want to communicate with that um and then you know it might be actually in production right so that might be another way that you're writing code or you might actually be learning so the difference between that exploratory and learning is that you might be following exercises you don't know anything about this programming language you're just beginning and how you run the code at that point um you might want different uh feedback from the computer then then you would get if you're just doing like deploying the program just go over there run all i want to know is that is that server alive that sort of thing so we tend to lump everything together it's like uh running code it's just like you know there's no difference in how i sort of execute ruby under all these conditions right i would just be like ruby whatever script it does there's like no no additional like context or anything it's just like it's all running and i think that's that's something to think about is there is there a reason why we're running code and we just sort of run it all the same way so this project that i work on rubinius right it's an implementation of ruby if you don't know anything about rubinius which i i'm hoping is pretty rare please talk to me i'm not going to go into a lot of stuff about rubiness here's three reasons why you should use rubinicus or you should try using it we have a precise garbage collector it's a pretty good garbage collector might not be as good as the one in the jvm you know yet that sort of thing but it's far better than mris it's precise we know every object that is an object so we don't scan huge stacks of stuff saying are you an object i'm not sure okay i'll pretend you are maybe that sort of thing it's a precise garbage collector and uh we typically see like five to ten percent of time spent in garbage collection which is more than we want but it's still far far lower than i think you see an mri we have true concurrency or however you want to describe this so where there's no global interpreter lock right so if you spin up two threads they can both run ruby if you have two cores they can run it simultaneously right in parallel and we have a just-in-time compiler so the bytecode virtual machine chugs along and at some point your code gets hot enough and it says you know what this is this is used a lot let's generate machine code directly and uh so we do type type feedback you know we sort of keep track of how everything is actually running so these are reasons why you might want to use rabines for the purpose here i i want to talk about some of the stuff that we have in robinius that i think we can use to build some tools that are going to help us um achieve changing the way we we write and run code in urbinius uh if you like if you go into mri and you do def whatever that last line where you see rubinius compiled code you would just get nil back right mri you define a method and it says okay thank you very much and you get nil back in robinius what you get is an actual object that represents the method or whatever computation you just defined right so i define this method i get this compiled code back if i take this code right here right so simple method takes takes an argument generates a string if you look at this in the rubinius like you can do rbx compile and get this output if you look at this this is sort of a description of the object you can see the arguments arity you see the local variable and its name you see how much stack size it actually needs it needs four like slots on the stack to do this computation um and uh there's that i ran this at the at the reply not in the code so it says there's one line that if you if you ran it on that little file you it would be three lines and then you see see the byte code right so the reason that this is important is that this is a representation of your code that is faithful like exactly what you wrote is just transformed into this this other form that allows us to do a lot more analysis of it and it's it's saved it's not just like sort of hidden away somewhere it's something you can get your hands on as an object in rubiness so what might we be able to do with this right so you have your rails app right which has a ton of rails code and you've got all this core library stuff in in ruby itself stuff that you may never have looked at you've got all this stuff running and you have your app deployed in production right and you have the test that you run before you deploy your app in production the thing that we typically see is those are completely separate processes there's nothing nothing that's shared there except for the source code right so when you deploy you might send the source code over there when you're running the test you have the source code here but there's nothing that exists between them right if somewhere to like look at the server they wouldn't necessarily know anything about the test that you ran and if you were looking at just the test output you might not know that the thing is is deployed in production but we have something that we can use to create a link between these two things we have those compiled methods so everything in ruby every class body every module block method script every one of those things anything that ever runs in ruby we represent as that compiled code object right so one of the things that would be interesting to do right is that if in my tests like we often use like a mock or a stub right and we say this thing should respond to this message if we kept track of those things and we have code running in production and we say you know what the actual object that i see at this bit of code doesn't have this method that was there and test that could be a problem right that could be something that that could lead to a failure and your code might be running fine in production you might have no problem but there could be a problem and right now how would you know that right there's there's no way to know there's no way to actually see if something might fail tomorrow but what if you could do an analysis of your code that's running in production and the code that you ran during testing or something that i that i think is a lot more interesting what if you could actually associate a particular feature in your code with uh sorry a particular feature in your application with the code that provides that feature so you get a new rails uh you start working on a new rails project it's not yours you didn't you didn't start it's an existing project and it's pretty big and you go in and they say uh we need to add you know open id to our login sort of thing and you're like okay so you go sort of read the tests and you you look a little bit of the code you're like i think login happens here you expend a lot of energy to like figure out how things go what if instead you just started up the application and you logged in and then when you're done you're like show me the code and you're able to go through and see all the code that ran so the way that you could do this all those compiled code objects right every single one of them what if all you could do is just start every time one of them started running you just put a time stamp there right and then later you sort based on the timestamp and you visit every piece of code and you say oh i went here first and i went there then i went there then i went there then i went there and you can just see like a tour of your code right or in production if you could look at this information in production you could see that these users interacted with our application in this way you could associate geolocation information you could associate time in the morning users tend to use this feature in the afternoon they use this feature or you could do you know sort of analysis of what sort of things are actually more important right because then when you're looking at allocating developer time or resources you can can make a more informed decision than um than just like oh i think this feature is important you know it gives us it gives us a basis to communicate about the application in a way that right now we have nothing i mean i i know nothing no other like tool that would give you this sort of information just the fact that we have that object that compiled code object that we can start associating information about how the application is running would enable us to create a feature like this and then to you know sort of use this word type again it's not i don't want to get hung up on type but basically anywhere in your code right that your these values are flowing through you can look at those values you can see what flows through if you have a method that is fairly general like something like map you know and you want to see well what sort of collections are we mapping over you could also look at actual values that go through your code right um oops and in looking at those values you can sort of see well you know the the the in a web application it's it's kind of simple you know like basically data comes in a form and it goes through but to be able to look at where those values originate and how they tour through your code and where they come back out gives you ability to look at this this uh data flow right and you can see like from the standpoint of performance or you can see from the standpoint of like the feature map the things like how the code is actually running how the application is is um is working and then error analysis if you have imagine you have like a an exception in production right and it's you basically um assume it's something like what we looked at the other day like nil can't be converted to a string right so you have this nil there and then based on the types of objects that you've seen at that location what if you could look at all the other locations that saw those similar types of objects right so if a nil caused a problem over here and all in this place is over here you also have code that sees those types of objects not nil mind you but these other types of objects you can say well it's possible that i could have a nil over here so what do these different code locations have in common right actually potentially giving you feedback before your application crashes so the the the thing that we're missing still in rubinius is this compiled code database basically if we have a way to collect all that that can be on the server on your develop machine on one of your your co-workers development machines if you have a way to look at all of your code not just the source code but as the compiled code and link all that stuff together we could do analysis that spans testing development production so this is this is like a feature that we're adding to urbinius to enable building this tool the um the fact that no one has has built some of this stuff on the decades you know if we go back to the very beginning where we looked at those those uh debugger profiler the sort of things that we have um i guess that basically means it's not a not a trivial problem right so there's two huge challenges that i see in trying to build a tool like this and and this is an opportunity if this is interesting to you this is an opportunity to sort of think about these things the first is information display we're used to looking at our source code in editors and the most advanced thing that we basically have in our editors right is uh code highlighting right like an identifier is a different color than a than a you know like a function identifier is a different color than a variable that's the most sophisticated we have right now and if you add like an ide then you can do like you know context display it might tell you what type that's the most sophisticated we have but there are dimensions to the code like if you imagine you know looking at some ruby code and you've got different um kinds of objects that come through there how do you represent all the kinds of objects that come through there we go from a very flat two-dimensional display where all we've added is color to needing depth right so how to display this information is a big problem and the other one is uh if you've ever used a profiler tool you know instruments or visual vm any of these things if you use this stuff typically what you get is a view of information right that you have to manually go through it's like the the profile information is just this tree of methods and you start clicking through it and see it's like the most primitive thing you can imagine right data needs to be there to support decisions but we don't the data is just presented in like this sort of rough form it's like you're looking at a raw excel sheet and you're like it doesn't even have the sophistication of adding a graph so you can see a trend over time right so if data is there to support decisions then how do we make the data communicate something more than just a list of things that you sort of click through right and if we start going into like uh you know if we start creating tools like this then do we start questioning some of the stuff that we're doing right do we need tests like tests are used as a way to help us write code sometimes right so you write i think it should do this you write a little test and then you run it and it fails the red green refactor thing of test driven development can be a powerful tool for helping us explore you know the problem that we're working on but all the time that i write on a test is not code that's going to run for who's using the application right so there's other things that tests might do they might prevent me from accidentally breaking something so that's it that's a good that's a that's a value of the test but in terms of like how we write code do we need to spend all that time writing tests i don't have an answer for that but it's something to consider if we if we actually look at how we're writing code and we try to make the computer computer communicate better with us right then how does it change something and the reason that i picked on tests in particular is because ruby has a you know good culture of testing right but like zed was saying you know if you uh if you sit down and and pound out some code and someone's like where's your test you're like i don't have any you know then they're like that that code probably can't be very good right does that help us build something does that help us communicate better so just a question to ponder and finally you know it's like this is what we typically see when we communicate with you know the computer it's like i have my editor up and it sits there with this blinking cursor right that's the best the computer can do that's the best we can we can hope for it's like i've done all this stuff i've run my tests i've played around i've done all this stuff and the editor just sits there with this blinking cursor in human terms right if you came to talk to me and i just like stared at you blankly it wouldn't be a very good interaction right there wouldn't be much communication there so you know i want to i want to leave you with that question is this blinking cursor this blank stare from the computer the best that we can expect right now what i see as sort of the goal that i'm trying to attain is this idea of insight right the source code is this medium of communication we've often labored many you know sometimes a single author or many authors we've labored hard to express all this stuff to try to communicate and yet when the new developer comes on the team they sit down and they like you know clone the repo and they you know sort of start looking through the code my experience of doing that with a lot of fairly big code bases while working on ravinius is just that that sort of feeling of weight of like oh my god how am i going to understand all this stuff how am i going to read through all this stuff it's like before you even like start reading it you just have sort of no clue can we actually do something like create a you know deep understanding of this code base without spending like hours and hours going through the code and trying to make it run and this sort of thing right so that's that's my talk thank you there's more information here uh this i think is a very interesting space and uh i hope that you'll join me and like sort of you know seriously question is the best we can do are these tools that we've you know created like five decades ago and we're basically doing the same thing is that the best we can do so thank you um do we have questions hi um it seems that you you're you're talking about um dynamic uh type enrichment or semantic enrichment as one of the problem that you're questioning yes and it makes me think about multi-stage programming that there is an extension in ocaml for instance and if if you if you are going to build tools that help such insights your tools will need to make assumption on the code which is difficult with a dynamic type yes thank you yeah it's difficult to make assumptions on on your code uh with uh such dynamic typing so am i understanding correctly your questioning uh and is it about dynamic typing and by extension would adding annotation about some runtime level would help your tools to make assumption on the code because as a developer you know that when you reach this stage you you you can make assumption but maybe your tools cannot it's completely generic so if you add type runtime levels then your tools will be able to understand it yes no it's an excellent question um so that's the that's the central role of that compiled code so um sure if you if you take a dynamically typed language like ruby and all you have is a source code as a programmer even you go in and you look at it you're like what sort of thing can i do here you start looking at the methods that are called on an object and you're like ah so it has to respond to 2s okay so that's one class of objects but then it's got concat right you're like i only know can cat on array so maybe this thing can only be an array right but at some point you could add some other object that responds to concat right so the idea is that being able to add information not just from you working on this code base but one of your co-workers when you ran the test in production imagine if you could look at your application instead of just this bit of source code right here but as a spectrum of the source code with the work that you've done on the application your co-workers when you've run the test in production what sort of things have happened imagine if you could see sort of a super imp position of all that information as you are looking at your source code or as your co-worker is looking at your source code so um it it sort of takes these arbitrary boundaries that we have right now right you clone the repository your co-worker clones the repository it gets deployed over there those things are completely separate there's no way to communicate if you had a way to start building up metadata about that type information would be one of those examples of metadata in a way that as you're looking at the code you can see all that where as the machine is running in production and you've got some analysis stuff sort of chicken like is everything okay here you know that sort of thing that's the sort of thing that i'm envisioning so what you are hinting now is like some kind of distributed constraint uh system it could uh disrupt constraint system well i mean i wasn't thinking in terms of constraints but but yes distributed right it's like our computer's network why why does why does the code act like it's completely separate yeah so it could be like a distributed type system i mean to certain extent sure absolutely yup totally there's one up there well hi um well i got to think about languages not just programming languages yes natural human language it's a thing about me and zed says programming is characters into a file i actually think of it as talking to my computer right how sad is that and how does the computer typically respond you yeah it doesn't work stares at you that's the idea um [Music] yeah well you know what i mean now um that thing about everything you showed um so the the the theme of communication uh generally resonates with me and um it's also about the how short is the loop the feedback loop from the computer and what you showed that the little bit that you showed in the bin is how it responds by compiling code and the jitter and what gives you back i think that it would uh it would actually um work very well with those ideas uh that brett victor saw yes in in his uh certainly brett victor's uh designing and strangers like table have you looked into that absolutely visualizing such change would be perfect in that kind of environment i think yeah and and not to not to knock what they're doing but i mean the fact that it's revolutionary that you basically made your repple your editor to me that's depressing right that's the best we can do you you basically have irb sessions sort of running along with your code i mean that's the point that they're at now yeah that's the point now but essentially the vision is that in you at any point in time where you are in writing your code uh binds all that matter it brings the documentation name the feedback the compile code yes and if you pull that distributed if you can network it with everything else that would be yeah it would be that that's that's where i'd like to see us go absolutely thanks a lot that was nice thank you uh my question more than a question here over here hello oh there you are hey uh i really love your your talk but something that person means that at the end you talk about how to display the formation shouldn't be how to engage in productive conversations absolutely yeah that's because it's not it's not like at all i mean just showing me something but i don't want information i want to talk right as you said and get significant responses or even questions like uh i just show you what you're doing yes have you noticed that that graph will crash right mentally right you know have you used microsoft word i mean you don't really want to say it looks like you're writing a letter can i help you with that right but you're right and the display of information is just because our our actual ability to communicate with the computer is mostly limited to display but yes why couldn't it talk to you why can it why couldn't it uh i don't know do other things but yes a much better way to say is like how do you facilitate a conversation i don't want that computer just blankly staring at me yeah absolutely all right so uh we here we have no more time for questions but thank you thank you brand you