Twitter Logo

Amos King

Twitter Logo

 Chris Keathley

Twitter Logo

 Anna Neyzberg

The Elixir Outlaws now have a Patreon. If you’re enjoying the show then please consider throwing a few bucks our way to help us pay for the costs for the show.

Episode Transcript


(Upbeat intro music)


Amos: Welcome to Elixir Outlaws, the hallway track of the Elixir community.


Anna: What’s new?


Chris: I mean-


Amos: I heard a dirty secret about Keathley.


Chris: There was a hurricane that went by.


Anna: Oh, you okay?


Chris: Yeah, we’re good. We’re all good. People south, like coworkers of mine in Atlanta are not as good but they’re okay.


Anna: (sympathetic) Ooh.


Amos: Oh no, that’s no good.


Chris: It’s all good. I mean mostly Atlanta just got slammed with rain over and like wind and lots of wind.


Anna: (sympathetic) Hmmm.


Chris: Obviously, the Gulf is, you know, in bad shape right now.


Anna: (still sympathetic) Right. Yeah.


Chris: But we were ok. We’re, we’re fine, fine. You don’t need to be sorry for me.


Anna: I’m glad you’re okay. I’m a super high fire danger area right now.


Chris: Yeah, I was gonna say.


Amos: Does it look like fire outside like it’s all smoky?


Anna: Well, I’m in the mountains and its better today, it was really bad yesterday. Uh, they’re gonna, they may shut up the power tomorrow because of super high wind and fear of fire so I may head back to the city. I don't know.


Chris: Well good luck. Ugh.


Anna: It’ll be okay. It’s alright, guys.


Chris: You know, I’m starting to feel like this climate change thing might be real.


Anna: (empathetically) You think?! I know I'm starting to wonder like, maybe?


Chris: Just maybe, there might be that might be accurate.


Anna: Right?


Chris: It’s tough to say.


Amos: You never know. It's alright after all this greenhouse gas gets up there maybe it'll maybe all that ash will block out some of the sunlight and cool it back down for a while.


Chris: Oh, yeah. Matrix style, it’ll kill the robots.


Amos: (laughing)


Anna: Oh my god.


Chris: It's good.


Amos: (still laughing) I can't even deal with you guys.


Chris: Yeah, it’s too, we should not talk.


Anna: But it's so real like there's like, how do you talk about anything else look like fires and the pandemic and California hasn’t had like breathable air until like recently.


Chris: Just five hurricanes off the coast of, off the East Coast right now just making their way over.


Anna: Yeah, exactly, like I was reading an article about how some of the biggest like glaciers in the Arctic their like shelves that attach them are like spinning and so in that like the seas are going to rise like 10 feet over the next however many years potentially if they break because you know climate change is not a real thing.


Chris: This is, listen, this is very up. We have to move on. We cannot talk about this (laughing) We can’t do that we can’t do this to our to the people-


Anna: (interrupts) To our listeners, I know oh my god.


Chris- Who listen. The thing is like I even think about this a lot 'cause actually a lot of my podcasts that I love that I go to for sort of mental comfort are all experiencing this same thing where this becomes the only thing that's possible to talk about because it's just so overwhelming to everybody and it's gotten to the point where I, I love podcasts and I don't listen to that many podcasts anymore 'cause I just can't I need something else like I need some other venue that has nothing to do with reality right now, so I say we move on.



Amos: Good.


Chris: Let’s move on rapidly.


Anna: Let’s move on. Let’s move on.


Chris: (laughing) Let’s move on as quickly as those hurricanes are coming to the East Coast.


Amos: So…. this year is an election year… (all burst out laughing)


Chris: Oh my god, okay.


Amos: No, let’s not.


Chris: Final joke. Final joke. Here's the thing 2020 is not done with us yet.


Anna: No, it’s not, we’re not even, we haven't even really gotten started right? Like, did y’all hear about how the Secretary of Health and Human services- Did you hear about this?


Chris: No, we can talk about this.  We cannot talk about this. (laughing). I know-


Anna: You don’t wanna hear about how he has to leave because of how he was urging Trump supporters to prepare for armed conflict after the election?


Amos: Whew!


Chris: (resigned) We can’t talk about this. We can’t talk about this.


Anna: And was accusing his scientists of sedition.


Chris: So, I have a I have an interesting topic. (Anna laughing)


Amos: Yeah, so is this, is this is this the topic you talked about already?


Chris: Yeah.


Amos: This blows mind.


Chris: So, I gave him as a preview of this topic-


Anna: Oh yeah?


Chris: -and he's like you’re lying.


Amos: You’re never gonna believe this Anna.


Anna: I saw in the chat.


Chris: I'm using LiveView.


Anna: Yeah, what?


Amos: Liar. (laughing)


Anna: You’re lying.


Chris: I had to tick the box over I had to, I had to add, I had to reset the counter back to zero. 724. That was the number of days it had been since I had last written HTML. And then I wrote LiveView.


Amos: Oh, man.


Chris: Ticked it on back to zero. Same with CSS actually. I don't know about if JavaScript counts, I still feel like I still have written JavaScript, but I might have.


Amos: If you didn’t put any in there- if you’re using LiveView it means shouldn't have had to.


Chris: I mean it does, I don't know, like I'm not sure. I haven't written JavaScript syntax yet.


Amos: So, what do you think?


Chis: That it’s cool.  I mean I don't know does it says on the tin for the most part.


Amos: Um, what's the least part?


Chris: No, okay, so I mean I should, can I, can I explain like what we're actually building?


Amos: That’s up to you.


Anna: Yeah.


Chris: I mean so-


Amos: (jokingly) Do we need sign an NDA?


Chris: No, no, listen just don't tell anyone else. I’ll just tell you guys don't tell anybody else we’ll be fine.


Amos: Oh, we’ll keep it to us.


Anna: Yeah, we’re good.


Chris: No, we're working on infrastructure stuff for all around all of our deployments. So, we’re just building all of our own tooling around and well, yeah, I mean we're building an API and UI around all of our deployment process. Cause like that's a time-honored tradition of building your own tooling. Instead of, or you know you either adopt some giant thing or you build your own at some level and so we're in the camp of building it ourselves right now. It’s actually not that hard for our purposes.


But in any case, so the UI is all driven with LiveView at the moment. So, nothing like customer user interfacing at all. The amount of the sum total of people who will ever look at this thing is like you know 40, tops, because it's just all the all the engineers, but in any case. Yeah, no, so we've been playing around with LiveView doing that stuff.  I mean yeah, like I said it seems cool, but I mean everybody’s right, it seems cool. And for the most part it's like it's working the way we would expect it to work. There's a really weird disconnect for me; I mean, there's a lot to learn about LiveView. I now understand why every ElixirConf talk is a LiveView talk 'cause there really is that much to learn about it.



Amos: Wait, what? You’re not allowed to say that.


Chris: (laughing) Wait, I'm just, I’m explaining the reality of the world, ‘cause like, no, I mean I get it 'cause like there is a lot. There's a lot. I don't know, universally, all of us who worked on HO have worked on this project, which granted is like three people, have been like there, it's a lot, like there's a lot to unpack about it.


It's not nearly as simple as I expected it to be and for certain operations, I was like this is a lot of effort. Like I needed to open a modal, and it was a lot of effort to like open a modal, given like what I would expect, but I've also not written web UI in two years, in over two years.  So, I have no idea, like my question to everyone was just: Is this how you people live?  Like is this just like what it's like to do this? Cause I've forgotten what it's like to do this.  Like it took me all day to open a modal, to figure out how to open a modal. And I think that's mostly just because I have no idea what I'm doing. And I just don't have any expectations of like, how it's supposed to work, and like how easy or not easy it's supposed to be.  But uh, yeah. But overall, it's been really cool. It's been very useful.


Amos: Is there some built-in modal stuff or did you have to do all of your own, like design your actual modal popup?


Chris: No, we had to wire it all up with like the Phoenix click blah blah blah, like all their little event thingies and have it all. And then, but, like you then you have to learn about whether or not it's like, uh what is the term for it like stateful, like a smart component or like a stateful component or not or whatever?  Like basically some components like need IDs and can then accept events, but only if you target them otherwise it bubbles up to like the root thing and like I don't know. There's just a lot to learn about it all, which is really where the time went.


But, yeah, it took us, between three of us, or I guess really two of us, it took us 4 hours to get a modal to work, give or take. But, at the end we had a modal that worked, so that was nice you know. And more or less we were able to do deployments which is actually the hard part, or the, well actually that's been the easy part. But it's like the interesting part is the actual doing of the deployments.


Amos: Deploying LiveView is the interesting part?


Chris: No, no, no like kicking off deployments for our services.


Amos: Oh, okay.


Chris: That's actually.


Amos: Oh, like from the tool.


Chris: Yeah, yeah.


Amos: Oh, okay. Nice.


Chris: That part's dead simple, but I don't know it's just weird.  It's a weird disconnect to go back to that world, and to try to remember like, is this just what it's like? Is everything just hard? Is that, is that how front-end web development is? This is a legitimate question. This isn’t a rhetorical question, I’m legitimately asking. Is front end web development just this hard now-a-days?


Anna: Um, its, there’s definitely a complexity.


Amos: And there’s, I don't know I think every framework doing things just a little differently can, can make it pretty difficult to stick to and as-Yes, I mean it's way more complexity than whenever you just had a pop up that said, “Are you sure?”


Chris: Right, yeah.


Amos: But I mean even that CSS is hard enough to get things right, so then adding, adding interaction on top of that I've always found it, yeah, I guess I’ve always found it rather difficult myself.


Chris: Yeah, I guess, I think my scope is just wrong. And it's also one of those things that, I mean, both of us who are working on it said, more or less simultaneously, this feels like a lot of work to avoid writing JavaScript. But I think it is probably the amount of work. I don’t know. I would rather do this than write JavaScript let's be clear.


Amos: Would you do the same amount of work in JavaScript?


Chris: Yeah, I have no idea. I mean for what we're doing I don’t know. I mean it's, actually, that's that's a tough call.  I have no idea. But we're not good at JavaScript or like I'm not. I have no proficiency in JavaScript, not really, so, and I mean I'm especially not anymore. Whatever proficiency I had in it is now five years out of date or whatever so. So, I don't suspect will be, like, transitioning away from this anytime soon.  This is, like, we're going to be using this stuff, but it's just, it's just interesting to me to, like remember that like I have no capacity in these skills and at the same time, like my scope of what I should be able to get done is completely wrong.


Like, we shipped deadline propagation in like an hour. Like we have a feature of part of our RPC framework that allows us to say, you know, if the deadline over here is 500 milliseconds it'll send it from service A to service B, so when service B gets that RPC it starts, it knows it has 500 milliseconds to start ticking down that time. And if it forwards that on to any other services it deducts whatever amount of time it’s spent before it forwards it on. So, the downstream, like service C, would then have 200 milliseconds and all that just flows. So, service C isn't sitting there wasting time if it all of a sudden goes over the deadline, it's not like doing additional database queries and stuff like that.  And that way like we just abort the whole thing really early. That took us like an hour. Like that library took us like no time at all right?


You know, like, the RPC framework that I'm talking about that we're starting, that were kind of like leaning into?  I built that in like, a handful of hours over a weekend one time.  And like, it was pretty mechanical, like I just felt like I knew what I was doing the whole time. The adaptive concurrency stuff that has math involved in it, you know, that, that was the work of like in afternoon or two on a weekend.  It took me all day to get a modal to work, Amos! (laughing)


Anna: You seem like you really want to talk about this, Chris.


Chris: Well, it’s just like, it's like I, my scope of what's possible is so broken once it comes to like UI stuff where like I don't know what's happening. Like, how do you do anything? Is this just and, that, that's the question is:  Is just how you people live? Like is this just what it's like out there in the world? Is it a cold and desolate place?


Anna: That’s hilarious. I mean I think it also, it's all relative right? It's just like what skills you, you know, execute day to day and what areas you tend to have more proficiency anyway in right?


Amos: Are all three of you lacking that front end in the last five years?


Chris: Oh, 100% yes. We're all, like, just completely devoid of any knowledge about this. I mean not really like we've all done front end work. We've all done that that, kind of stuff and you know we've all written JavaScript at some point in our lives. Some of us have written more JavaScript than others, like you know, I mean it's we all have done that work. The thing doesn't, it's not a mess you know what I mean? Like when you look at it, you're like yeah this looks totally reasonable. And it does what it's supposed to do and all that stuff. So, it's not like a, it's not a, it's not a catastrophe but, yeah.



But the, I dunno, this is where my- like I don't really learn anything about frameworks comes back to bite me. Cause like I don't know how; I don't even understand the words that like LiveView is using anymore. So, I have to, you know, that's been most of it is like sitting there reading the docs a lot and trying to actually kind of trying to grock what it all is trying to do.


Amos: Do you think the docs are pretty useful for somebody starting out or they well done?


Chris: Yeah, they’re, you know they're very detailed. Like the stuffs in there, you know, and we've been able to solve all of our problems, it's just taking a while, like there's a lot more reading than I think we expected to do right? There's a lot more learning than we expected, which is why I think universally we were all like, “This seems like a lot of work.” Mostly 'cause it's like you do need to read like, four or five markdown pages of stuff to get, to really get started, because they just sort of expect you to understand this stuff. And maybe the docs are written such that like if you jumped on this really early, like it's not that much to absorb. The docs have that kind of feel to it, like they kind of expect that you already know how it works to some degree.


Amos: Um-hmm.


Chris; And like you've gone through the fire a little bit, so…But overall, it's fine.


Amos: What was the hardest thing to do-


Anna: I have to drop of.


Amos: (disappointed) Ooh.


Chris: Alright, later. Be safe.


Amos: Bye, Anna.


Anna: Once my fire drills are over, I promise I will be back one day. I thought it was this week but maybe next week. Bye.


Amos: Yeah.


Chris and Amos: (simultaneously) Good luck.


Chris: Bye.


Amos: So, what was the, the hardest thing outside of like actually doing front end work but, but it, working through the Elixir side of it?


Chris: Yeah, that's a good question. The surprising thing was sort of how much code you really needed to write.  Like if you want to, if you're building a modal you really do need to track like the open or close state of the modal and that means that you have to like, have multiple events that can open or close the modal. And you need to be able to adjust your state accordingly in your state and then your rendering needs to be based on that state. I mean it's all the same stuff that like react tab right, like you have to track all this in the, in these different places and then you have to update it and then you have to do all the work. And it's just a lot of code. Like it's surprising amount of code to open a dang modal.


Amos: (laughing) Yes.



Chris: And also keep, you know, the whole time I'm sitting there and I'm like god, and it's like going over the network to like, like I, that's the thing I have to keep reminding myself of.


Amos: Um-hmm.


Chris: And there's a part of me, there’s a- the part of me that cares about such things, is like, “This is really inefficient, like to open a modal.” (both laughing). But, you know I, the other thing is just that there's, surprising things, I, I can't even talk intelligently about it, so it's you know it's like I haven't used it in enough anger yet to talk about it super intelligently-


Amos: Um-hmm.


Chris: But there's just sort of weird idiosyncrasies of the components. Like, if you have a nested component in a component it doesn't like, capture the events. Like the, the root component captures like the events unless you specifically change the target of the event to be the subcomponent, even if a subcomponent is the thing that defines the click event. Like I don't even know the words that I just said made sense.


Amos: (laughing) I think I'm following you.  So, if I have, if I have a modal-


Chris: Yeah.


Amos: It has something on it that you can click, and that thing is supposed to react. So, let's say you have a model that has a counter section that's, that's like a separate component.


Chris: Um-hmm.


Amos: If I define, even though the counter section defines the click event, unless I explicitly tell it that belongs to the counter then the modal was, is going to catch that click event.


Chris: Yeah, like the, basically the top-level thing except in this case if the, the modal isn't the first thing that you're rendering that it even won't capture the event it will go up to like the root.


Amos: So, the whole page-


Chris: Yeah.


Amos: -is going to catch it.


Chris: Yeah, so you, you're, so you either have to change the actual target of the event that you want to send it to or you have to move your events to like this higher level thing. And I have no idea which of those is correct or whatever I've like you know haven't I've literally not read anything about quote unquote best practices and doing this kind of stuff right? Like I don't have I don't know what people are doing for patterns we’re just kind of –


Amos: Just making it up as you go.


Chris: Yeah well, we're just like, you know, using our brains and like thinking through like what we want that that process to look like and be and like and how we want to architect it how we would structure it and we're just doing it that way. And I have no idea if it's right or wrong, but you know like I said it's working. We eventually get it all to work and we like understood it all, but it did take a lot of reading to figure out what all those differences were. I don’t know. None of this is an indictment of LiveView, like yeah you have to read the docs like, okay, go figure.


(Amos laughing)


Chris: It was more like-


Amos: You can’t just guess how it works?


Chris: We just, we were slightly salty that we had to read docs like we were just like really excited to try to get stuff working, and then we are pairing on it too. That's always demoralizing like when you're pairing on something and you're excited about it and you're like, “Oh, sweet!”  and you're in a pretty good groove like you've done the hard, what you anticipate to be the hard part which is like talking to Amazon via it’s disparate, (Amos laughing) you know, API calls and making sure that you're doing all your deployments and reading from your container registries and all this stuff and like managing all of that. And that was trivial relative to like opening a damn modal.


(Both laughing)


Like it turns out that was not the hard part. And we were really excited about it, and then immediately had to stop and then go read 3 pages of markdown to figure out how it actually works-


Amos: Well, and-


Chris: It just sort of it just derailed the moment of a little bit.


Amos: (laughing) Pairing on reading a document is just terrible in the first place.


Chris: Yeah, right? Yeah, we were just sitting on the call like both reading documents and it’d be like how does this work? We have no -what the heck is a smart component or whatever they call the stateful components or whatever. It's like a live live component?


Amos: A live live?


Chris: Yeah like some of them, I don't know some of them are dumb. Or like stateless, I don't remember the term. I immediately forgot everything after I consumed it.


Amos: So, so when you're calling stateless is that, like something that doesn't really have a back and forth. It doesn't really get updated with data?


Chris: Yeah, I don't actually, there's like specific technical definitions for what that means. Like essentially if it has like events on it, it can't be stateless. Or something like that. There's like, there's like a rule about it. But if it’s just like rendering stuff then its stateless? I don't know man. Listen, I like I said I'm-


Amos: I'm really interested-


Chris: I immediately expunged all of that knowledge out of my head, like it did not capture any of it. I did just enough to get the modal to work. (Both laughing).


Amos: So, I'm, I'm interested because I'm wanted to mess around with it actually today before you even said anything. For my Noggin Day is, I was going to make a little, a little thing that used like Phoenix presence and LiveView to, like your whole team goes to this web page and it gives you a list of who you're pairing with and then you can hit a button and it gives you a new list and like switches everybody up. That was, that was my plan for today. So, I wanted to do some LiveView stuff too but like you it sounds like I'm going to be reading the documentation first. (Laughing)


Chris: Yeah, just read the docs. Read the docs I first is really what I'm getting at.



Amos: (exasperated sigh) I, you ever look at documentation and wish it was more like an IKEA manual or they were just like just


Chris: Just pictures?


Amos: Yes. Pages of pictures.


Chris: I don't know. I, I go back and forth on it, the, I have a really hard time forcing myself to learn a lot about any given framework. I just do. Like if I feel, if I feel like there's not going to be a payoff. Like here's the thing, I am not gonna write a whole lot more LiveView in my life. Unless something dramatically changes right and unless I get a new job.


Amos: So why did you, why did you decide to write LiveView in the first place?


Chris: I don't know. Why do you, why do you do anything?


Amos: Well, I’m just curious if you, if you were like, if you're like “We want interactive front end, and I don't want to write react” or like-


Chris: No, yeah that’s it you nailed it.


Amos: Is that it?


Chris: Yeah, you got it. I basically was like I don't want to write, I don't want to write JavaScript if we can help it and this, and we ended it does need to be a live updating UI thing.


Amos: You know there gonna be like 3 listeners right, that are gonna be like-


Chris: Total?


Amos: - Why, why didn’t you just use Elm?


Chris: Oh yeah, whatever. Yeah, I'm, I thought Elm was dead language at this point. (laughing)


Amos: Yeah, I hear, hear there's two companies using it.


Chris: Yeah, I'm pretty sure the WebSocket library for Elm still doesn't work, or something like that he still doesn’t?


Amos: Ugh, it’s still broken?


Chris: It still doesn't compile or something? I don't know. Listen man, maybe just give people tools to build things and then they’ll build them instead of trying to make a perfect language. Whatever. What do I know? Anyway- (laughing)


Amos:  He can't, you can’t compile them until you get the types right.


Chris: Yeah whatever. (Amos laughing) Anyway I have no opinion on Elm. What I do know is my opinion on Elm I'm not going to use it. Cause, again, like I don't wanna learn a whole thing to do this one thing. Like, that's not a good expenditure of time, like on the on the company's dime it's just like not, right? Like we're already doing, I mean part of the goal of this project is to have a, a live updating UI and we can achieve that with tools that we all understand or can understand rapidly, using Elixir. So, we're just going to do that.


Amos: Rapid is relative though, I mean four hours for a modal- (laughing)


Chris: Yeah, but I mean yeah, but I did message a friend of mine and I would, and I asked, “Is this just how you people live?” and he said, (Amos laughing) “Yes, you get used to it.” (Chris laughing) So, so you know that's, that's, that's where we're at, I think.


Amos: Nice.


Chris: But it's just not my, that's not my thing.  And at the end the day, like I'm may end up using LiveView. Again, not an indictment of LiveView, LiveView seems really good. It's just that, that's not right now, unless I change jobs, that’s not the kind of work that I do. As evidenced by the two-year long stint of just never writing each HTML.


Amos: (whispers) That is a beautiful thing.


Chris: I mean, I’ve enjoyed it.


Amos: Let’s just sit with that for a moment.


Chris: I have, I have enjoyed it. It's been nice. It's been, it's been a good run.


Amos: I have done very little for about three years and it is beautiful.


Chris: And I’m not, I'm not unhappy that I wrote LiveView. I'm not unhappy. I wasn't, I didn't, not, you know, it's not like I didn't enjoy my, my brief moment of using LiveView. And I have it like a side project thing I'll probably end up using it for that I'm working on, and you know, whatever else. Like, I mean I'm sure it'll come up again. But I have a really hard time learning (sigh) that much about a, about a framework. Cause I don't know frameworks just come and go.


Amos: Do you think that there are things that are in LiveView that are…mmm…. outside framework you know what I mean? I'm having a hard time coming up with how to ask this question. But, like, are there principles in LiveView and that you think are going to be applicable no matter what kind of data transfer you're doing to the front end? Or is it, is everything very LiveView centric whenever you're doing it?


Chris: (exhales) My gut reaction is no. I do not think that those patterns are reusable. I think LiveView is pretty unique. But I also, I also don't, I don't know that what's the right way to say this? LiveView is copying an already established rendering model. Which is to say it's doing a diff, and it's only rendering the changes, right?


Amos: Right.


Chris: Which is like a thing that people have done a lot at this point. I have no, uh, react was the first one I used that did that explicitly. Where it was declarative in, in the sense that you could just sort of say, like, “Here's my state. Here's what I want to render. You figure out how to, how to render it,” right?  Where it’s kind of made a declarative API out of it. Um, declarative-ish, right? React was the first one I used. I don't know if it was, I don't care to know if it was the first one in production that ever did that. Whatever. That was the first one I had experienced.  And since then it seems like that's the model, right? Like Elm uses that model I think, whatever other hot new web frameworks, you know, front-end frameworks also use that model, right? LiveView’s using that model. LiveView’s using the model of I have state, I'm going to render the changes It just happens to be doing it on the server instead of on the client. And the benefit there I, I really think like the benefit there is ease more than anything.


Amos: Like developer ease?



Chris: Yeah, yeah. 100%. I don't, I don't think there's a technical benefit to that as much as like if you knew JavaScript, and you knew and you’re tooling really well, and you and you had those skills- I do not have those skills-if you had those skills there's no technical benefit to going back to the server for everything or to making the server do that. Cause you could also have web sockets and like send updates that are, have service and events or whatever.


Amos: Right.


Chris: And then write updated on the client. I don't think there's a technical benefit here, I think it's an ease benefit, of, and we're leaning into that you know. Where it's not simpler, it's, it's easier, and I’m fully taking advantage of that fact.


Amos: Yeah, I see that, I had discussions with some people who do a lot of front work, who don't like the idea of LiveView because they feel like it couples you too much to your server. And, and I'm, I'm not sure that they are fully correct there 'cause I think you can still have the same type of events that you would have on a web socket internal to your application. So, you could have both if you wanted to have like multiple client front ends one of 'em happens to be LiveView. But the thing, the only thing that I have ever thought that I could say, “Yeah, maybe I would want it on the front end,” is that you're moving compute power back to the server. Which might be able to do it faster and stuff, but the client’s compute power you don't have to pay for.


Chris: Yeah, and also the client is, depending on the client, potentially more powerful than your server. (Laughing). Like certain cases.


Amos: That’s true.


Chris: Right, at least in terms of like rendering and stuff, depending on how you set up. Especially in aggregate, when you think about 100 clients all working on this at the same time those hundred clients have more compute power than your one server does.


Amos: Right, and if your data is very dependent on each client now you have 100, you’re doing all the computing for 100 different clients doing different things, where you could have just handed that to somebody else's computer to do for you.


Chris: The coupling argument is, (exhales) I don't know if I buy that. Like in as much as coupling is probably not the word I would use.  I mean, obviously you're dependent on your server. And there is a world, I don't think it's an easy world to walk into, but there is a world that you could imagine. And actually, like, JavaScript’s just the Canonical bad example of this cause all the tools suck like. (Amos laughing) No, I mean they really do.


Amos: Yup.


Chris: Like let's be, it's, it's the same thing as- Okay we have talked about this too. It's the same thing as Docker is the same thing as Kubernetes. Those things suck. And they suck not because of what they achieve, right. Cause every time I say this people assume that what I am is a curmudgeon who wants to go back to, you know, I'm going to rack up some metal at my local Kolo and, and like start deploying that way old school style. Naw fam, like that's not what I, that's not what I want.


And when I say that Docker sucks and Kubernetes suck, like that's, what I'm pining for is not the, the ye old days of deployment like that. That's not what I'm talking about. I think what those things achieve is really useful and really important and has moved the industry forward and is important to the industry and we should continue to lean into that. We should also not stop being critical of these tools because they suck. Like they're not good, and they have terrible UX, they have terrible problems that we should actually work on addressing. And just, like, pretending that it's all his sunshine and roses out there, that all those things are just totally great because of what they achieve, is super useless and not helpful and actually counterproductive to making the world a better place. So. Let's be very clear about, about that.  I think the same thing is true with JavaScript. Like all that JavaScript tooling completely sucks and the people who think it doesn't are, just, like have not experienced anything else. That's like become painfully obvious, right? (Amos laughing) It's like-


Amos: Yeah –


Chris: Go work on literally anything else. Like use a different language, use a different runtime, like use not the browser and the cra- like browser’s crappy APIs. And go try and like, go work on a real system like doing, like doing, like that has support for all this stuff.


Amos: Um, hmm, right


Chris: Or at least that like, gives you choices.  And so, there is a world, that all being said there is a world, right, where you could build a fully offline application. It's much easier to do on a real hardware, on like a real computing platform then, then on like the browser, but even in the browser, there are tools and frameworks to be able to, like you know. If you can talk to the server once, you can shove that stuff in something that approximates a database, uh, hold onto it and work on that directly and synchronize that through a server to other clients or whatever. And you can do it periodically. And like there's work being done, like Kleppman’s doing his stuff with CRDTs. I have a friend, James Long, who is a person in the JavaScript world, and he built a budget application, and he did it all with hybrid logical clocks and CRDTs. And it’s a no, it's like a, it's like a node, it's one of those things, what’s it called? It's the -an electron! It’s is an electron app that runs on, you know, your machine, but it's all completely local. And then it, it does end-to-end encryption on your data and sends it through a server that he doesn't even know what data you're sending, and synchronizes it using hyper logical clocks and CRDT’s across, across all that stuff. So, it's possible to build stuff like that right? That is a way to do offline applications. You're still dependent on there being a server at some point.


Amos: Right.


Chris: Like, the server doesn't, you know, and so it's like you're not as hard dependent on that server being up, but at the end of day like most applications are dependent on there being some sort of server being up. Is that the way it should be? I don't know, probably not, like most stuff like, all of our, well, not most, but a lot more stuff should work offline then, then, then does. But I don't know that I would call that coupling I would call that like dependence. And LiveView I think obviously leans really heavily on that, and then that's the thing that they talk about, right, this thing that Chris talks about all his different keynotes, it's like yeah, we're not solving this and we're never gonna solve it. Like it’s just no longer needed-


Amos: There’s no offline support.


Chris: -or if you get disconnected, you’re disconnected and the theory just being that for most clients it doesn't matter. I'm not here to argue, not necessarily, one way or the other I think the industry is such that we just don't care about that, and that's probably not, that’s probably like net bad. But. does that change, I don't know, does that mean LiveView-


Amos:  Most of the time, most of the time you don't necessarily need to worry about that, but what is the reconnection strategy? So that like, if I have bad Internet that cuts out and comes back on how well does that work? Is that something that LiveView is just handling or am I gonna have to put a lot of work into it?


Chris: Yeah, I remember asking Chris about this really far back, in like the early beta times of LiveView, and I think what happens is if you get disconnected it pops like a spinner over the whole, like a spinner overlay over the entire page that says, like, disconnected or something like that that. That probably has changed. I have no idea. But I know that it knows if it's disconnected or not so it can do, so you can do something to the UI if it's disconnected. But yeah, but you know it, I mean at the end of the day, like, you are dependent on that connection and if you're on a device out there on like a 3G signal, that connection is gonna be flaky. Is that the right approach for what you're trying to build? I don't know, maybe not, if that's your constraints. For us it's like, a bunch of, the users for this thing are going to be a bunch of people who like, sit at a desk with a hard line.


Amos: Right.


Chris: And that's the sum total of people using this stuff. So. And also the UI isn't, it kind of doesn't matter. The UI is like a nice to have. There's an API that uses our RPC framework that is actually what people use most of the time.


Amos: Right, you're not going to click to deploy when you're offline.


Chris: Right, yeah exactly. So. But I mean I do think that it is worth considering the fact that you're dependent on a server being there and more importantly than a server you're dependent on a client connection. From on a potentially, you know, on whatever the client’s connection is to a server. And you're dependent on that being reliable. That is worth knowing and considering.


Amos: Right.


Chris: And, and thinking it through. Doesn't mean you shouldn't use LiveView, it just means you should think about it.


Amos: Everything's a tradeoff.


Chris: Yeah, and if it's, you know, if that's not going to fly for you, then you're gonna have to think through how, you know, how do you achieve what you want to achieve differently.


Amos: Do you look, you look like something just attacked you.


Chris: No, it’s just wind is blowing really hard.


Amos: Is it a hurricane?


Chris: No, the hurricane has mostly gone past.


Amos: Well, that’s good. Well, one of the five.


Chris: Yeah, one of those five, one of the five has gone past us. (sound of door creaking open and closing)


Amos: Whoa, was that lunch?


Chris: Oh my gosh. I feel like this is an entire pizza. It’s an entire pizza! Oh, snapsticks!


Amos: Alright! Well, I guess it’s lunchtime. Does that mean it’s time to go? While you still have hot pizza?


Chris: Yeah, so I should go eat some hot pizza. But so, LiveView is cool. That's the takeaway. You do need to, like, you go read the docs it's gonna take you second but other than that-


Amos: I-


Chris: Ope.


Amos: Oh, I had you cut out for a moment.


Chris: Oh, okay.

Amos: Oh, now your voice and your audio are not in sync. That’s… it’s a good thing we're getting off here 'cause that would make crazy.


Chris: Yeah.


Amos: Or not your voice, your face and your audio sorry. Yeah well, I think, I'm, well, while you're eating pizza, I'm gonna go read some LiveView documentation then. I'll read all, all of the markdown first.


Chris: I think it's realistically like two pages. You do need to go read up, go read about the different types of components.


Amos: OK sounds good. I'll start there and then maybe, maybe by the end of the day or Noggin Day next week I'll,  I'll have completed my pairing thing and I’ll let you, let you take a look at it. And you can be like nope, you’re terrible Amos, you have no idea-


Chris: I would have literally no opinion-


Amos: No, you'll be like, you’ll be like, look, I'm, I'm a LiveView expert now and-


Chris: No, I claim no such thing-


Amos: This is terrible.


Chris: No this is incorrect. That's, that's, that's false, I claim nothing. I claim no expertise in really anything but definitely not in LiveView.


Amos: (Laughing) Alright, well maybe, well maybe we should get somebody who is to come on and correct any of her stuff. So, if anybody out there is a LiveView expert and says everything you guys just said is BS, keep it to yourself.


Chris: Yeah, we don't wanna hear about it.


Amos: (laughing) Alright Keathley, I'll talk to you later.


Chris: Alright later.


Amos: Bye.