Navigating Web Development Challenges - JSJ 624
Shay Davidson is a full-stack web, mobile, and game developer. He is currently leading the front end at Lemonade. The discussion revolves around the use of Supabase as a free database and its comparisons to Firebase for developer experience. They dive into building applications with Next.js and React 18, utilizing React Server Components to interact with the Supabase API. They share their experiences, frustrations, and insights regarding caching mechanisms, server actions, and the challenges of adapting to new technologies in the React ecosystem. The episode also delves into the React server components controversy, the importance of learning and experimenting with new technologies, the use of AI for creative purposes, and the potential dangers of deep fakes.
Show Notes
Sponsors
Socials
Picks
Transcript
Hello, everybody. Welcome to another thrilling episode of JavaScript Jabber. I am Steve Edwards, the host with the Facebook radio and the voice of being a mime, but I'm your host today. With me on the panel coming from across the pond in Tel Aviv, Israel is mister Dan. How are you doing, Dan?
Dan Shappir [00:00:23]:
I'm doing well. I'm doing fine. Thank you.
Steve Edwards [00:00:26]:
Good. Are you are you, my opposite today weather wise? We were getting snow on the ground here.
Dan Shappir [00:00:31]:
Let's put it this way. I'm sitting in front of an open window in a t shirt and sweatshirt.
Steve Edwards [00:00:36]:
I feel your pain. I really do. Also with us on the panel is mister AJ O'Neil from the purple background. How are you, AJ?
AJ O'Neil [00:00:45]:
Yo. Yo. Yo. Coming at you live from under the weather.
Steve Edwards [00:00:48]:
Under the weather.
Dan Shappir [00:00:49]:
Oh, sorry to hear that.
Steve Edwards [00:00:54]:
Yeah. And I'll feel better tomorrow. Our very special guest also from the Tel Aviv area, mister Shay Davidson. And how are you doing, Shay?
Shay Davidson [00:01:02]:
Hello. Thanks for having me.
Steve Edwards [00:01:05]:
We are glad to have you here. We were we are anticipating, shall we say quite the reaction from this one, and you'll understand as soon as as soon as you, hear this. Thank you. Thank you. Alright. So, Shay is here by Dan's invite as Shay wrote some, very disparaging tweets. No. I'm kidding.
Steve Edwards [00:01:32]:
Just some tweets with opinions on React Server Components and things that I am not very knowledgeable on, so I'm going to let Dan take it from here.
Dan Shappir [00:01:40]:
Well, you know, React server components is a totally noncontroversial issue. Just kidding. It seems that, that this got, like, the entire we are community still up in arms ever since they were introduced. We've had we we've discussed them on several episodes. Obviously, we've had Dan Abramov on on the show. More recently, we had another episode about it. Let me I forget, the name of our guest. I'll, say it in a in a minute.
Dan Shappir [00:02:14]:
And, I also spoke about them. And, and in general, it's you know, a lot of people are talking about them, because, oh, yeah. With Sam Selikhov, who did that really controversial, tweet a while back where he actually, inlined, s twelve query inside, React component, like the kind of reminiscent of the good old PHP days. And it and it got the entire React community really up in arms. So so it's a pretty controversial topic, I guess. And, Shai did his, his part of, you know, increasing that, controversy. So I thought, that, you know, having him on as an actual person who actually tried to use this technology rather than, you know, somebody who's either promoting it or intentionally disparaging it, I thought would be like, an interesting change of pace. And also the scenario in which, Shai that you used it is also I thought really interesting.
Dan Shappir [00:03:25]:
So I think it's also worth talking about. So, yeah, take it away. Introduce yourself, please.
Shay Davidson [00:03:31]:
Thank you. So, I'm Shay Davidson. I'm 39. Had a birthday last week. And Happy birthday.
Steve Edwards [00:03:39]:
What day was your birthday?
Shay Davidson [00:03:41]:
It was a Sunday.
Steve Edwards [00:03:43]:
Oh, okay. The 28th was the perfect day, but,
Shay Davidson [00:03:46]:
because that
Steve Edwards [00:03:46]:
was fine. But they're close enough.
Shay Davidson [00:03:51]:
I've been developing things since I remember myself. Started my career as a Flash game developer. Actually, won the best Israeli indie game in 2010, but did nothing with it. Yeah. Unfortunately. And then I started my actual career as a web developer, a food developer at eBay, then with PayPal, worked in a parallel team with Kenzie Dot, by the way. And then after my team got closed, I joined Lemonade, and then I'm there for 5 years already. I'm a principal engineer there.
Shay Davidson [00:04:30]:
And until recently, I was the front end lead in the company. And now I'm planning all kind of technical initiatives.
Dan Shappir [00:04:41]:
So both of us are kind of in InsurTech because I work I work at Next Insurance.
Shay Davidson [00:04:46]:
We are. It's it's funny. I never thought I'd be in insurance. And also my wife is a legal counsel in the insurance company in Israel. And so it's it's we have we have insurance in the temple. And I was like, no. I want to develop games. I don't want to be a joint venture.
Dan Shappir [00:05:04]:
Funnily enough, my first job, my first professional job as a developer was in a gaming company as well. But that was a really long time ago. A lot
Shay Davidson [00:05:13]:
of people started I mean, a lot of people I know went into development just because they want to develop games. But now nobody about that.
Dan Shappir [00:05:24]:
Yeah. Funnily enough, I've I've never been a big gamer. I'm not really big into actually playing games, but actually programming games, that's a lot of fun and something that I really enjoy doing.
Shay Davidson [00:05:35]:
It's amazing, and it's probably the best track in development or coding that you can ever experience, but I can talk about it later. Let me start sharing the story. So, a few months ago, I was in a family trip in Europe and we were hearing a podcast during a car ride. And we listened to the history of computer games, and the narrator talked about games in the seventies, textual adventures or mods, where you could input text, and the game would reply to you what you're seeing or what you can act upon, etcetera. And my daughter, which was, almost 9 back then, was very excited. And the first thing she said was, daddy, do we have something like this in April? And I said, maybe. And we went back after the vacation, and I searched in Google, and I couldn't find anything in Google. And in the age of AI, I said, okay.
Shay Davidson [00:06:39]:
That should be pretty easy to develop because I mean, you can even go to GPT today or an or Claude, which is even better in Hebrew, and write a prompt, write me a story about x. Imagine I'm a character in this world, and let's try to build the story together. And, I mean, it it works pretty well. I mean, I sometimes I read stories, bedtime stories for my kids just using the prompt from GPT, etcetera. But I wanted to create a very unique experience, that feels unique and feels like a gift, something that she can be proud of, that she received, and she can play with, and looks pretty nice. And I don't didn't want to just send her the link to, OpenAI website, and she can do whatever she wants. And so I started working on a project called, which is, again, a simple application, a simple React application built on top of OpenAI APIs and just looks way, way better. And
Dan Shappir [00:07:44]:
If I can interrupt you for a second, though, if what you were doing is pure text based adventures, why do you actually even need React? Oh, it's text.
Shay Davidson [00:08:00]:
Yeah. You're you're right. But the the thing is that that was like and we've been using Next. Js in, Lemonade for quite some time. But, I mean, as the front end lead in Lemonade, I said, okay. I know all this jammer around React server components and next 14, and then and then then move from, the page router and next to the app router, or was it vice versa? I was confused. But, and I said, I don't know anything about it. Let's use this opportunity to also experience some new technologies.
Shay Davidson [00:08:32]:
And, of course, if I'm using Max, I need to use React. And, I wanted to experience that considering it was a simple app it is a simple application. We have only I have only 3 pages. I have some API calls to, get to OpenAI and get the the new follow-up adventure. Yeah. I thought that was a reasonable excuse to start using React and Next. Js.
Dan Shappir [00:08:57]:
So it's kind of like that thing about developers wanting to blog. So the first step in blogging is creating a blogging platform.
Shay Davidson [00:09:07]:
Yeah.
Dan Shappir [00:09:08]:
So you you kind of use this opportunity to learn about, the new React. Well, in new Next. Js. Well, cool. I mean, it you know, if you're gonna do a hobby, you might as well get the the most out of it for sure.
Shay Davidson [00:09:23]:
I thought that I thought that it's important for me as somebody who is in a leading position in in a company to first be able to reason about this when people approach to me and say, what about, why don't we upgrade our next? Or what about some components? Do you have an opportunity to use them in our code? And I said, well, I don't have any experience with it. I don't have any viable use case for this right now in our business plan. And in order to have an opinion about that, I might need to experiment it directly. And that was a great opportunity for me because
Dan Shappir [00:09:57]:
Before before we delve into that, you did mention that at Lemonade, you do use, Next, JS. So I'm kind of curious. Are you using it, like, as the general basis for your front end or for particular things?
Shay Davidson [00:10:12]:
No. You know, what
Dan Shappir [00:10:13]:
what you know, depending on what you can actually say, obviously.
Shay Davidson [00:10:17]:
We started using Net. Js about the same time I've joined, like, four and a half, 5 years ago, and the purpose was, mostly around SEO. We wanted the server side rendering for SEO. And and
Dan Shappir [00:10:31]:
for the public site, is it?
Shay Davidson [00:10:33]:
Yeah. It's only for our marketing website, and that's how we call it.
Dan Shappir [00:10:37]:
Okay. Okay. Cool. It yeah. Funnily enough, it's the same thing at, at Next Insurance, where I currently work, that, our marketing website or pub public site as we call it is built on top of Next JS as well, and other things are not. The thing that needs to rank is built on Next.
Shay Davidson [00:10:59]:
Js. A lot of the experience in Lemonade is very, very, very dynamic, and we thought that we didn't find a good use case for next with these use cases. And also, we ran into a lot of problem with dehydration, considering we have a lot of highly interactive and dynamic, animations in a website, and we do a lot of generated CSS. And it we always ran into integration problem and and things that and and they need to be isomorphic. Like, all your components need to work both in the server and the client in the same way. And when you when you rely on the in some components or some pages, when you rely on the position of the scroll when the user refresh and it's only available once the server request ends, then you run into problems.
Dan Shappir [00:11:58]:
So so in that case, just again, you know, depending on what you can tell us, I'm I'm kind of curious. Then what are you implementing that part of the user interface in Ed Lemonade?
Shay Davidson [00:12:12]:
We have our own, framework, but, basically, it's vanilla React.
Dan Shappir [00:12:19]:
Oh, so it's kind of client side, client rendered, React. Okay. It's it's interesting. I'm actually I'm I'm kind of derailing us slightly, but I think it's an interesting point to bring up because I am seeing kind of this, the split of how would you say? Bureau b? Bifurcation? Bifurcation in yeah. Exactly. In the in the React ecosystem of, like, you know, forget about React server components. I'm talking about SSR hydration meta frameworks on the one side. Next.
Dan Shappir [00:12:59]:
Yes. You might say because that's the, like, the king of the hill for for, React, meta frameworks. And on the other side, a lot of organizations simply doing client side rendered React. You know, maybe somebody did create React app couple of years ago. Maybe they even manually configured webpack. But it's basically, you know, a lot of software built using react, you know, and especially larger orgs don't care about SEO, don't care about ranking. It's it's like dashboards and interactive applications and whatnot. And it's just clients that react all the way.
Dan Shappir [00:13:43]:
At least that's what I'm saying.
Shay Davidson [00:13:45]:
Yeah. I think in our case I mean, in our dynamic pages, we didn't need SEO. And and I think that's a question that I've seen. That's a problem that I've that's an opinion I've seen a lot of times that the focus on the SSG and perform rendering performance or initial rendering performance is indeed a front end concern, but it's not the only concern. But people like in all the meta discussion around React nowadays, it's it's only this, the rendering initial rendering speed, working with network, rendering with server data, but front end is more than this. And I feel that, for example, in our new business case, in Lemonade, we had to tackle other important things. And, you know, it's
Dan Shappir [00:14:31]:
I'm totally with you. You know, we had Alex Russell on on the show a while back, and he makes the distinction, between websites and web apps, where based on depth of interaction. But the actual kind of split that I'm mostly saying is around whether or not you care about, you know, ranking and whether or not you cared, whether, you know, whether or not the page is actually gonna be scanned and be, you know, in in index. And and a lot of cases, you know, like you said, you we at Lemonade also at Next where I work, again, Next Insurance not Next JS, it's it's stuff that's behind authentication. It's, it's, like, funnel sort of a thing. You never land directly into it. You don't search it. It's very personalized.
Dan Shappir [00:15:34]:
So it it doesn't really need to to rank. So, obviously, you know, there, yeah, there are some considerations around loading time because, obviously, you don't want it to load too slowly, but it's not the primary concern for sure. But on the other hand, think about what next what Vercel is selling. Vercel is selling hosting. So they kind of need you to want, you know, to care about those things related to hosting, which are performance, which are the initial render, which are stuff like that. Because if you're doing client side rendering, you can basically host it anywhere.
Shay Davidson [00:16:14]:
Eventually, I realized that I'm forced to deploy it in Versal and not in other, services I'm fan of like Netlify.
Dan Shappir [00:16:21]:
Netlify don't support React server components?
Shay Davidson [00:16:24]:
I ran into problems configuring it and just gave up and paid Verus.
Dan Shappir [00:16:30]:
Interesting. Anyway, back to your story.
Shay Davidson [00:16:34]:
Yeah. So, okay.
Steve Edwards [00:16:37]:
Let
Shay Davidson [00:16:37]:
where was I? So I decided to develop, this web app, not a website, like you said, for my daughter using experiment with new technologies, if that opportunity. And, the story is not only around the ReactOS components. Like I said, it's about around, the new next 13 next 14, actually, React Total Components. And also I've used Supabase, which was an amazing experience. And I and I'm saying it because, like I said, I came my first full stack of web dev gig was eBay, and then there, I was writing application in Rails Ruby on Rails. And there's always this notion that it was far more easier to write web application back then compared to the node system today, where you need to orchestrate everything and Razor did everything from you for you. Now looking back, I don't miss writing in Ruby. I love TypeScript, and I can't imagine myself writing, production grade application without types.
Shay Davidson [00:17:47]:
But Good
Dan Shappir [00:17:47]:
thing that Chuck isn't here.
Shay Davidson [00:17:50]:
No kidding. But, I mean, it's still I mean, there's still this nostalgia for nostalgic reasoning for we could do better. And I think this is what the remix is selling, by the way. They say they can be the new rails in the node ecosystem. And but, anyway, developing this game brought me back to my earlier experience as as a developer. I'm like, yeah, this this feels familiar. And so, I didn't know about Supabase anything. I heard about it from a friend at work, and I if you don't know what Supabase is, it's a a SaaS product.
Shay Davidson [00:18:30]:
It's also open source. You can create a project, and they basically give you a Postgres database for free with storage that's comparable to s 3, with real time, functions, serverless functions, automatic GraphQL API generation. Really, really great. I didn't use all these. I just used the database.
Dan Shappir [00:18:53]:
Yeah. I'm kind of curious. Like, what did you need all that power for?
Shay Davidson [00:18:57]:
I didn't need all this power. I just wanted free database. Because like I said, it's not only Rails back then. If you remember, there was this, company called Bars that Facebook bought and then closed that, deliver the same premise. Here's a SAS project a SAS product for that you can create a database with functions you can deploy, and and you don't need to set up dust the database yourself. You don't need to set up MySQL or Postgres. It's just there, and here's a simple API to access.
Dan Shappir [00:19:28]:
And Well, it's also Firebase, I think, in a sense.
Steve Edwards [00:19:31]:
I Well, that's what it is. It's an open source version of Firebase.
Shay Davidson [00:19:35]:
Yeah. But I don't. I I I have experience with Firebase, but honestly and without I I don't I don't have a good experience at Firebase. And Fair. Something about the API feels awkward to me when I use it. And I don't want to get into details because maybe it was just one, my single or two times I've been experienced with it and didn't have a good experience. Maybe I did something wrong. But compared to Supabase, I mean, it's a different completely different world.
Shay Davidson [00:20:10]:
And but, that's but when I when I when I tell about, when they tell people about Supabase, they say, oh, it's like Firebase. And I say, no. It's not like Firebase. It's it's it has a better developer experience than Firebase.
Steve Edwards [00:20:25]:
Well, for what it's worth, Supabase's tagline says I mean, on their website, it says the open source Firebase alternative. So you can Yeah. Probably forget people for thinking that.
Dan Shappir [00:20:33]:
That's exactly what I wanted to say. That's exactly the tagline. Superbase is an open source fiber based alternative. Anyway, back to your story. So you you you chose a super base for your database and it was really good for you? Yeah. And you chose to build everything on on next 14 with React 18 and the app, folder and React's components.
Shay Davidson [00:21:01]:
Correct. So my application has 3 pages. There's or I have landing page, which which is completely static. I have a user page, which shows all the books that I generate using AI or user. And I have a create book page, and I have the book itself where the user one page shows the textual adventure, what the AI says, and another one, the other side of the page in the book is a 4 with a single input that the user, my in my case, can write what she wants to do and submits it. And then the AI generates a new page. It moves forward. Kind of a chat interaction.
Shay Davidson [00:21:45]:
Just I created an entire book with CSS, with pages, and 3 d animation. I actually don't I'll show you what, I I just realized my that my, OpenAI quote is out, so I can't use anymore. But, Yeah. But, I mean, it was 4 pages and okay. Here's a component. Do this API call to Supabase in the React component, considering it's a server component. Take the data out of it and render the component the dot the render the components you wish to render based on this data in the server component. And the first thing I did was to render the list of books, the list of stories.
Shay Davidson [00:22:31]:
And I said, okay. Supabase, a query from books, by the user. Here's the data. It's typed because Supabase automatically generates the types for you. And then run a map function over these books and render the book component. And, well, it worked. Amazing. And that was my first experience with, React Server Components.
Shay Davidson [00:22:56]:
Understand, okay. This is fairly awesome because I don't need to declare an API function in the API folder. It's just there to automatically create an API for you, and I have it in a single file. Okay.
Dan Shappir [00:23:13]:
Nice. Undoubtedly, that's, like, the the big premise thing is that you, sorry, can make a call to an asynchronous API with a sync await inside your React code, inside your component, directly render the results, you know, it's it's very enticing, undoubtedly.
Shay Davidson [00:23:35]:
Yeah. But then things got complicated. First of all, I ran into problems with the super base queries. Like, I let's say I created a new book, a new, new book for my daughter, and I got back and I think back, to the index page, and the book was not there. And I I mean, nothing about it appeared in the Next. Js documentation, etcetera. But if you search on it in Google, you run into multiple Google GitHub issues around it. And so, apparently, because Next.
Shay Davidson [00:24:12]:
Js override the native fetch function, they with their own caching mechanism. And I I got the older, response data back.
Dan Shappir [00:24:26]:
Well, actually actually, I it's not so much, I think, that you got the old response so much as it it basically cached the old response, and it didn't and it basically just returned the cache version. So as I recall as I recall, what they did is that they now I don't remember if they still do it or if they basically backtrack on on this on this behavior. It's an inter it's it's an interesting thing to check. I I because it definitely did get a lot of pushback. Basically, the they kind of built kind of like react query like functionality into their fetch implementation that by default, it caches the results instead of may if the URL is the same or something along these lines?
Shay Davidson [00:25:14]:
I think that built in caching, again, is one of the things, like, in Rails, you'll say, oh, they are deal they're doing it for me. I don't need to develop it myself. Like, oh, it's a complete dev experience bundle. But when seeing that, I was perplexed because I didn't understand what's going on. And it's barely I mean, maybe I'm talking about it in there, but one of the main con problems that I had throughout this entire experience is not necessarily the technology. It's the fact that it's barely documented, and it's documented through GitHub Issues. Like, how do
Dan Shappir [00:25:48]:
I explain? You know, it's it's an you know, that's kind of the thing about living on the bleeding edge. You know? And and undoubtedly, when you started using it, it was kind of like the bleeding edge. I think it's they would argue that it's more mature now. I I can look. Obviously, overriding a built in, function like fetch in a way that changes its behavior is something that I'm intrinsically opposed to. I can understand, like, the the motivation. Like, the the problem that they faced was that when you componentize, access to APIs, you very easily repeat yourself. Like, if you've got 2 components that need to access the same data, you know, you end up in this kind of, world of pain where each and, like, forget about 2.
Dan Shappir [00:26:44]:
You've got a 1,000 components that all need to access the same data. They all make the same API calls. You can very easily, like, either overload, your your database or, just create the performance nightmare. So they built caching into the actual fetch to avoid this kind of of waterfall of of a 1,000,000 calls for each call? Like like, how do you preserve, like, the component model, which where each component is, like, distinct and self contained, but at the the same time, don't end up issuing a 1,000,000 fetch calls. So I'm guessing that that was their solution. I would have been explicit about it, you know, do something like a React query. And and I seem to recall that they that I'm trying to remember if if it's still that way or they changed it back.
Shay Davidson [00:27:42]:
Months ago, it was still there because that's when my daughter's birthday was on February 14th. So, it's not long ago. Anyway, afterwards, I discovered that there's built in caching configuration mechanism in the new next. But it's globally declared on the, components file. So and it's also it was also very hard to find it in documentation. And the thing and I only managed to solve it by digging into GitHub issues. And but once I solve the caching issues, it was I solved this problem, and I could move on. And the next thing that I found confusing, but I understand why it works, is mixed in between server components and, client components.
Shay Davidson [00:28:38]:
So, basically, whenever you want to use, React hook, it must be in a client component. And and and I I I understand why. I mean, it's obvious why because you can't serialize the state back of the server.
Dan Shappir [00:28:56]:
Yeah. The the server components are are kind of stateless by definition. They they render and and they're done, And and that's it. So, obviously, they can't be stateful. They have to be stateless. So and then you can't have a use state in a React server component. Steve, AJ, is it is it clear enough, or do we need to kind of talk about why that is?
AJ O'Neil [00:29:28]:
Well, I think we should talk about why that is because I personally don't use the components.
Dan Shappir [00:29:37]:
Well, think about it this way. If you've got a component running server side, then if you need want it to be state full, you need to have, like, this persistent connection between the client and the server.
Steve Edwards [00:29:53]:
Like a WebSocket?
Dan Shappir [00:29:55]:
Like a yeah. And also, it's like a one to one connection between between your your, server and your client because you're keeping something in in server memory that that is the state. And and that makes the whole server side development that much trickier and, you know, less scalable and and more complex. You basically you generally want to keep your server code stateless. You know, keep whatever state you have in a database or something. And and that means that you can't really use stateful hooks on the server side. So React server components, because they run server side, they can't use stateful hooks.
Shay Davidson [00:30:44]:
That's what you mean that your state is not serializable. So how would you transfer it to the server?
Dan Shappir [00:30:50]:
Well, in a sense, it is kind of serializable in the sense that, you know, you can pass props from a server component to a client component. So you're effectively serializing props across the wire. So I I can see, like, you know, if if it was just the the protocol overhead of serializing data back and forth, that's solvable. And like I said, they kind of solve it already because they serialize data downstream in in the React server components sending props to clients and components. And they serialize now data upstream in server actions or server functions. You you send, which is kind of an RPC protocol, you send data upstream and you get the result downstream. So they they are able to serialize state across the wire. The bigger issue from my perspective is the fact that you cannot have persistent state in the memory of a server side component because you might be hitting 1 server instance within one call and another server instance in another call.
Dan Shappir [00:31:59]:
Or or the server, you know, might be might go down because it's some sort of a Lambda function or something like that. So it server so server React server components, by definition, cannot have, cannot be stateful. They they they can the only way they can have persistent state is by using something like a database or something like that. Is that kind of clear, Steve, agent?
Shay Davidson [00:32:28]:
Yeah. Yeah.
Dan Shappir [00:32:29]:
But it
Steve Edwards [00:32:29]:
There is does clear as mud. But yeah. It's
Dan Shappir [00:32:31]:
Yeah. It does mean that the instance you want to you you you want to use to make a component stateful by adding if in React in React, make by adding a use state or something along these lines, you have to make it, a component that can run on the client side And and use client is that divide that gets you from being service side only to having something that can also run on the client side. Yeah. The the interesting analogy that Dan Abramov now makes when he describes it is that use client is to react or to modern react like the script tag is to web development. It kind of indicates that from this point on, script tag says this stuff runs in the browser or can run-in the browser. Anyway, again, I kind of thought it derailed us, but I thought it was a point worth making that, like you said, that the instance you wanted to add interactivity and client side state and respond to user interactions, you had to switch over, and and and, you know, things that are beyond, you know, routing. You had to switch over to using, to use, to use client and client side react.
Shay Davidson [00:34:01]:
So I want to go deeper into this because in my case, I have a 4 page application. But even with the this, I mean, small amount of files and components, you start having this mishmash of, okay, this is a server component, and this is another server component inside my page. Oh, but this might be a client component, and this is another client component that is only a client component because it has a use state, but it doesn't actually render anything because I need to get back, data for me. So it's basically a use client hook. And and that you get some kinda get lost on what's a server component or what's a client component. And it was hard to for me to imagine how this doesn't get messy in a large scale application. And
Dan Shappir [00:34:56]:
So here's my 2¢ about it. First of all, when I talk to people about React server components and and so I'll I'll I'll backtrack a little bit. I have a talk that I give it that I gave it a few conferences, which is about overcoming the performance cost of hydration, in which I talk about various ways in which various, frameworks try to reduce the cost of hydration. And one of the methods is React Server Components because it pulls some of the rendering operation from the client to the server. So for React Server Components, they don't actually need to download any JavaScript code. They don't need to do high any hydration. It it just streams the results from the server directly to the client. But but then I describe the downside of this approach, and I say that the biggest downside is that it's a it's a new mental model that you can't just, you know, assumes that since you know React, you can easily just switch over to use this stuff.
Dan Shappir [00:36:05]:
You you need to think differently about how you architect your, your, React application. And, again, to be to be fair, Dan Abramov is is, you know, straightforward about that, where he basically says that the the transition in React from classes to hooks was a very easy one because it was bottom up. You you wanted to use if you wanted to start using hooks, you can say, okay. In that but in this particular component, I'll start using hooks. It doesn't impact any part other part of the rest of the the application, and, and they can, like, start in that in in a particular point and then expand out. Whereas with React server components, you know, you kind of need to it's bottom it's top down, and you effectively need to rethink the architecture of your entire application. And you need to start thinking like you said, Shay, about, hey. This is going to be, server side.
Dan Shappir [00:37:08]:
This can be server side only, but this part needs to also run on the client. And, you know, where do I draw the line? Where do I switch? Where do I place the divide? And and it infects everything, and it really is a different way of thinking about the architecture of your React application. It's not a it's not a trivial switch.
Shay Davidson [00:37:31]:
I think the Ook comparison is is really is really good because when I joined Lemonade, I had the experience. They just they've just introduced OOCE, and I've had only experience with the class components. Then. But getting into OOCs was felt so natural to me. It was, wow. This is amazing. It's a function functional coding which React and look at the power that Ux gives us, and we don't need mixins anymore. And, we don't need compound components, and everything is great.
Shay Davidson [00:38:01]:
And I learned Ux immediately and started applying it in all Lemonade's code. But with React's have components, it it feels different because not I I don't think it's a mental model. And I think that from the start of introducing it, there was a great communication problem in introducing what they want to achieve, how it's being done, what is the what how the technology actually works, and and everybody are biased around it right now. So even if I had a great experience developing React Server Components, there's this little thing back in my head that says it it's it's a bit off. And I think that the communication problem around, I'm not sure they can fix it anymore. And maybe in 2 years from now, when everybody are using React server components. But right now, like, it's it has been 2 years since they've announced it. I think it's still hard to digest reactable components.
Dan Shappir [00:39:05]:
Realistically, I think that only now people are actually starting to use it. How's that British phase go go in anger? Like, seriously. I and and I think, like, it's it's interesting, you know, if any of our listeners wants to, you know, hit us back on that, but I am wondering how many organizations are actually using React server components for large scale projects? It's an it's an interesting question. I which I don't know the answer to. I've not I've yet to encounter a large scale application developed with React Server Components, but, obviously, my information is very anecdotal.
Shay Davidson [00:39:58]:
Do you think it would benefit the React and Vercel teams if they have announced several components after it has been matured enough?
Dan Shappir [00:40:10]:
I don't know how that might have worked because it's it's, like a chicken and an egg problem. I mean, if you wait for it to be mature before you, release it into the wild, it will never be mature and you'll never release it into the wild. These technologies, you know, they they they evolve over time, and and, you know, it it's it's also very much about the feedback that you get. For example, I I don't know how many people remember that the actual initial, implementation of React server server components was the Shopify, Hydrogen. We actually had, a person from Shopify on our on our show. I need to find the episode when it, you know, when it was really new and we were talking about, you know, how it works and what they do, and we really didn't get it back then, by the way. And that project failed, effectively. And it failed, and they learned a lot from that failure.
Dan Shappir [00:41:16]:
For example, back then, there was no use server and use client. Instead, it was based on the file name. So you either had server or client in the file name or something along these lines, and that would determine whether it ran on the server or ran on the client or both. And that turned out to be a bad idea. But I'm
Shay Davidson [00:41:38]:
getting started about the file name based routing and configuration. I don't know.
Dan Shappir [00:41:44]:
Well yeah. But it turned out to be a bad idea, and they wouldn't have known that it would've that it's a bad idea if they hadn't tried it out. So, yeah, you know, it's it's you you kind of have to make these kind of big bets sometimes. The the challenge for React is that they've got such a huge base, and and, you know, they it's more difficult, much more challenging for them to make these kind of big bets than it is for smaller frameworks. Like Ryan Carniato, the creator of Solid, he makes sweeping changes in the way that the framework works, like, on a daily basis. But, you know, he's got, like, what? How many websites built using Solid? So it it it's it's a and and the people who use Solid are are buying into this. They they know what they're getting. Would would react.
Dan Shappir [00:42:42]:
It's it's a different story. But like I said, I I don't I think that if they would have waited for it to mature and and and also remember how long it actually took to get from react 17 to react 18. Like, what was it? 2, 3 years?
Shay Davidson [00:42:57]:
Yeah.
Dan Shappir [00:42:57]:
How how much longer would they have waited? Another 2 or 3?
Shay Davidson [00:43:01]:
You know? But I think when I think about it, it's not only when you think about it, it's not only about React of Components because I'm not talking about library maintainers, but as an application developer, I mean, you look at all these new React features, even suspense, use transition, use deferred value, use I don't even remember all the new hooks name as and I see it in the team, in the guild, in in in the lemonade front end guild. I mean, nobody it's not that we don't know how to use this. We don't have we we don't really know it doesn't interest us to learn it because we don't know what are the use cases for these features. I mean, SUSPENSE, okay. SUSPENSE is also at a rough initial ride. But now SUSPENSE is very known. But the rest of the all these new features, it's not only React server components when you think about that.
Dan Shappir [00:44:02]:
Yeah. But I think it's mostly React server components. It's first of all, it's also it it's worth mentioning again. I I assume most of our listeners know what suspense is all about. Basically, suspense is about saying this stuff can we don't need to wait on it. It can be asynchronous to the rest of the application. That's basically, from from my perspective, the shortest explanation of what suspense is. That the originally, the entire React rendering operation was synchronous.
Dan Shappir [00:44:32]:
It all it happened all at once. And suspense was a way to say, these parts of the UI, well, they can have happen later, and they can happen at their own time. Shay, would you accept this definition, or would you use a different one?
Steve Edwards [00:44:51]:
It was you, AJ.
Shay Davidson [00:44:53]:
Yeah. But the the I mean, there's a way to maybe simplify it because, I mean, the common the most common use case is what should I render while I wait for this data? But this part that I'm waiting on is only a small part of what I'm trying to render.
Dan Shappir [00:45:10]:
And Yeah. But that's kind of, a fancier way of saying what I'm saying. Because if something is asynchronous to the rest, it means that it happens in its own time, And you usually want to show some sort of placeholder while you're waiting on that thing to actually happen.
Shay Davidson [00:45:27]:
Yeah. It's the same thing, but most of the people use it for spinners and loaders, and that's I think that's the simple way to describe it.
Dan Shappir [00:45:36]:
Yeah. And I'll quote myself that, one of my favorite shit tweets was that the way to tell the difference between a modern web application and a legacy web application is that the legacy web application is 1 big spinner while it's loading, and a modern web application is a lot of tiny spinners.
Shay Davidson [00:45:55]:
I prefer the first, like, way from UX perspective. But
Dan Shappir [00:46:01]:
Well, the idea then, though, is that, you know, if if with a big spinner, you're you're blocked on the slowest part. And, with the the modern application, you know, each thing loads at arrives as soon as it it's as it's ready, which is again, by the way, part of the thing about React Server Components Streaming is that if you've got multiple React server components in the page, another thing that's kind of confusing is that each can kind of arrive independently as soon as it as it's ready. And you've got a spinner until it's there, and then it it appears. And in you can arrange your page in such a way that the most important things and the high priority things and the things that appear first are in the initial viewport, while things further down the page appear as they become available.
Shay Davidson [00:46:59]:
I I think it's an interesting discussion. I would actually love to talk about it for a few minutes because from my personal experience, I think the big spinner problem you could solve with perceived performance improvements, like, and also remember I'm not sure that the exact right term, but but ghost texting and that it looks like there's content, but it it has animation.
Dan Shappir [00:47:23]:
Oh, like like the YouTube thing, like lots of gray boxes until there's
Shay Davidson [00:47:27]:
a A lot of experiences are doing at the moment. And I when I as a user, I enter a website, and I have these all little spinners, and then content starts appears. It takes my attention. I'm I mean, first of all, if you're not doing it correctly, it creates layout shift, which is which are bad. But, I mean, I would love I have when people see me work, why you're not using a larger monitor? You know, you're you're only using your MacBook's monitor because and I'm saying, I don't want to move my eyes around. I want to remain focused on a single place. And when everything pops out on your screen, it takes your attention. It creates this delay of your interpretation of the content in my personal experience.
Dan Shappir [00:48:19]:
So Apple Vision Pro is not for you?
Shay Davidson [00:48:21]:
Yeah. Probably not.
Dan Shappir [00:48:25]:
And well, look. First of all, in a lot of ways, I agree. I mean, you know, first of all, I hate spinners, period. So preferably no big spinner, no little spinners. Just give me the content fast so that I don't need spinners. But but, you know, think about it differently. In a lot of pages, you've got the important things and and you've got the less important things. So, for example, if you're thinking about, let's say, a weather app, you want to know the temperature and whether it's gonna rain or not.
Dan Shappir [00:48:56]:
Everything else is kind of, superfluous. You you know, it's it's nice to to have, but it's not more than that. And if it's a big spinner and you're waiting on some slow something that's not the main content, that's that's a big issue. Think about, you know, a lot of of, like, in a lot of cases, a lot of modern pages, ads appear after the main stuff. And you could have delayed everything until the very last ad appeared. Some, native applications work like that and that annoys the heck out of me. Where you're you go into, like, this news app and it takes a ton of time to load. But when it loads, it has everything, including all the ads.
Dan Shappir [00:49:46]:
You know, give me the text. Load the ads while I'm already reading reading the application. Now, obviously, you need to be smart about it to avoid shifts and stuff like that. But but I I I I do get the value of not blocking everything on the slowest thing and prioritizing things based on how important they likely are to the user. Obviously, you need to be to build the UI in such a way that it works well. Like, for like I mentioned before, maybe, you know, it's okay if there's a tiny spinner, but it's outside the initial visual visual, visible viewport. And it's, you know, you only see it if you scroll down really quickly. That's okay in my book.
Shay Davidson [00:50:37]:
Definitely. I I agree. And maybe I've sounded too harsh. Like, it's not that I want the entire website site to load and then show content. But I think there's a middle ground between showing when especially for back office applications when you have a lot of
Dan Shappir [00:50:54]:
No. I I totally I totally agree. If your page looks like 20 spinners and and things appear at random in different places, that's a very annoying experience, undoubtedly. Yeah. Especially if it also causes lots of shifts, then it's totally ridiculous. So, anyway, were you able to actually build the app?
Shay Davidson [00:51:13]:
Yeah. I did. And I actually didn't get to the best part because, I mean, I added my up and downs in the experience of developing this, but I think the best feature that I've encountered is the server actions. I was like, okay. I need an API to create a new book or to submit the form, etcetera. But then I I I read about several actions. And, basically, several actions, work such similar to several components and the fact that you can declare them inside a component and their functions that's run-in the server, but their API, their signature, are native form arguments, like how you would handle a submitted form from the client. Do you have the same API on the server? And you have access to the same server side APIs that you have in server components.
Shay Davidson [00:52:09]:
For example, I can access Supabase and read the deformed data from the client inside the server action, validate it.
Dan Shappir [00:52:20]:
Yeah. Basically, a server action is a function that runs on the server that can be called from the client effectively. Now it's wrapped in a function usually wrapped in in a form submit. Does it have to be, by the way, or can it be just any
Shay Davidson [00:52:38]:
recommendation, I didn't see any other use cases. Maybe they've improved that, but it's I use it only for form submission. The handler for the form, tag was the server action all the time.
Dan Shappir [00:52:51]:
In any event, we talked about it with Sam, and I also talked about it in that episode I did on RPC. It's effectively a form of RPC. Calling a function that runs on the server from the client using effectively function call semantics and having the framework, in this case, Next. Js serialize the parameters in the up stream, deserialize them on the server, and then serialize and deserialize the result which is sent back.
Shay Davidson [00:53:24]:
So I I I think the the serialized thing is not it it's not entirely correct because this is also where I went to Publix. Because the response from a server action, it's, it's not the data itself because, I mean, it's it's running inside a server component. So if you want to get the data back, you should rerender it with the data you fetch in the server component. So a server action can do 2 things, maybe more, but I've used 2. It can either redirect to a different page or it can say, I want to invalidate the data in this certain page. And then I I mean, it wasn't intuitive for me in the beginning because I said,
Dan Shappir [00:54:11]:
I need to I want
Shay Davidson [00:54:12]:
to let's say that I I want to refresh the data in my in the page of the trigger, this server action. So and even if this server action can be reused, I wanted to to invalidate the cache in a the cache in a dynamic way just in the page that triggered it. And there wasn't such a function. And I had, like, in every server action, I had to figure out what was the path that, sent triggered the the action and then invalidate.
Dan Shappir [00:54:43]:
So so, effectively, you caused the, route operation on on every submit effectively?
Shay Davidson [00:54:52]:
Yeah.
Dan Shappir [00:54:53]:
And then send the data back down as props in React Server Components?
Shay Davidson [00:54:59]:
The yeah. Next does it for you.
Dan Shappir [00:55:02]:
Well, to be fair, look, when I first like, I had various misconceptions about React server components and about server actions when I first encountered them, because, initially, I assumed that it would be more akin to QUIC's server dollar, mechanism where it's literally a way to call, a function on the server side. But, React really subscribes to the unidirectional data flow model. So they they don't want you to call the function on the server side and send the data down that way. They want it to go in a circle as it were. You send data from the server to from parent components as props going down, and you send notifications as events bubbling up or function calls bubbling up. So it's it it's kind of like this circle of of how the the thing flows. So I can un totally understand why they don't want you to just, you know, do things on the server and get data from the server by just calling functions, getting data, and and and rerendering it that way. They want the rerendering to go through the React server components.
Shay Davidson [00:56:26]:
It totally makes sense. I I agree. And, and now that I know it, I can, oh, can develop these things fairly quickly. But, I mean, again, it wasn't really intuitive, and especially the cache invalidation thing.
Dan Shappir [00:56:45]:
Can you can you elaborate on the caching issues?
Shay Davidson [00:56:48]:
Yeah. Let's say that
Dan Shappir [00:56:49]:
I'm really unfamiliar with.
Shay Davidson [00:56:51]:
Yeah. Let's say that, you want to use the same server action in 2 different pages. But the result that I want is that the data that I want to invalidate is not in a single page, but on the same dot the same page that I triggered the action from. So it means that you need to start analyzing that path that the action was triggered from. In my case, and maybe I didn't do it correctly, I literally added the path of the page as an hidden input on the form, so so I don't need to do it. The I don't need to calculate it myself. So it's just there. So for example, if I want to invalidate the data on a specific user, you need to have the ID of the user and the URL that you want me to validate.
Shay Davidson [00:57:41]:
And then instead of trying to calculate it, I just sent it with the form data. It's probably
Dan Shappir [00:57:46]:
How do you validate how do you do that in validation, by the way?
Shay Davidson [00:57:50]:
Yeah. I don't remember the function name, but, it's called invalidate tag or something like that. And and some weeks since I've done it, so I don't don't remember precisely.
Dan Shappir [00:58:00]:
But it's, it's a Next JS thing?
Shay Davidson [00:58:03]:
Yeah. It's a Next JS thing, not Reacting.
Dan Shappir [00:58:06]:
Okay. Okay. We are close to finishing, I think, Shai. Anything else you want to to talk to say about this project? Is first of all, is that you said that you kind of ran out of your OpenAI, quota, but, like, we'll need to wait, like, a month and then be able to see it or something along these lines. You know, share
Shay Davidson [00:58:31]:
the link and have
Dan Shappir [00:58:32]:
your quota instantly run out as our listeners try it out?
Shay Davidson [00:58:35]:
So what happened is that they I intended to release it only for my daughter and I, OpenAI just released their GPU turbo model. And, apparently, it costs a lot. And when I published it on Twitter, it blew up. I got, like, 20, 1,000, impressions and people approached me, strangers and colleagues and family. Like, I want to try this. I want to try this. So considering I didn't have a create user form, I created all the users manually for some of the people that requested. And then, I ran out of, quota for my OpenAI, and I paid quite a lot.
Shay Davidson [00:59:13]:
But, my daughter played it. She lost interest after a week. That's fine because I achieved what I wanted. I created an awesome personal, a great gift. I learned a lot technologically, and, I had a good experience in general. And so, yeah, it achieved its goal.
Steve Edwards [00:59:36]:
Alrighty. So, hopefully, you will all have a good reaction to this episode. I know I'm always learning. Anything I learn about React, I hear about React, I'm learning because I don't use it. But, anything, to wrap up before we move on to picks? Anything you wanted to cover that we did not cover?
Shay Davidson [00:59:58]:
No. I think, it was a I had a pretty good, experience with you guys.
Steve Edwards [01:00:05]:
Good deal. Alrighty. So with that, we'll move on to PIX. PIX are part of the show where we get to talk about, anything we wanna talk about that isn't tech related or is tech related or anything within reason that's not gonna get us fined. So, let's see. Dan, I know you had a good pick for us once you lead us off. After you turn yourself off of mute, Dan.
Dan Shappir [01:00:28]:
Yeah. My dog was barking really loudly outside, so I had to mute myself. Mhmm. Anyway, so so, yeah, AI is the thing. So AI is the pick. My my first pick is this really amusing, channel on YouTube where he basically has Arnold Schwarzenegger do all sorts of things, usually sing in all sorts of of sort of roles. So, for example, a really popular one is Arnold Schwarzenegger doing Judy Garland and singing, Over the Rainbow. There's another one where where the Arnold Schwarzenegger is the thriller, instead of Michael Jackson or, doing Whitney Houston.
Dan Shappir [01:01:16]:
It's it's really amusing. And by the way, that that's just one example I recently saw here in in, you know, it won't mean anything for our, non Israeli listeners, but the very known Israeli band from the seventies, they had them cover, modern songs, and it really but in their or using, you know, their voices and their singing style. And then, again, it was really amusing, like, saying, like, new songs being done by an old band that way. So it's really amusing seeing all these things that can be done with AI. But it can turn it turns out that this thing can kinda get scary because there was this story a while back about, how, a finance worker at some company in, Hong Kong was conned into, paying $25,000,000 to some, hackers, after they tricked him by using, deep by deepfaking, the the company's CFO on, on a video chat. So, basically, he thought he was talking to his CFO who told him to transfer $25,000,000 to a certain account, which he did, and then only thought to try to verify it to get again after he actually made the transfer. But, but yeah. So, you know, watch out for those deep fakes.
Dan Shappir [01:02:51]:
And, I guess, those would be my picks for today.
Steve Edwards [01:02:58]:
Alrighty. AJ, you got any picks for us even being under the weather weather?
AJ O'Neil [01:03:07]:
I don't know. Let's see. Dune. Dune was rereleased in theaters, couple weeks ago, and then I'm gonna go see the next part tomorrow. So I'll, I'll pick Dune. It's done very well.
Steve Edwards [01:03:23]:
Has it? I'd heard sort of bearing bearing reviews on it.
Dan Shappir [01:03:27]:
Yeah. Thank you. I I I enjoyed the first part. I watched it a while back. I thought it was fairly accurate to the book.
Shay Davidson [01:03:38]:
I saw it last week on, I saw it last week in IMAX, and it, it was a great experience.
Dan Shappir [01:03:44]:
The the second movie?
Shay Davidson [01:03:45]:
The second movie. Yeah.
AJ O'Neil [01:03:47]:
Wait. The second movie came out oh, well, it came out on Friday, I guess.
Shay Davidson [01:03:51]:
Yeah. For us, it came out in Tuesday.
AJ O'Neil [01:03:54]:
No way.
Shay Davidson [01:03:54]:
Yeah. Some some some movies in Israel are released earlier than the rest of the world. It's not the first.
AJ O'Neil [01:04:01]:
That's interesting. Okay. Yeah. Well, I I think they did a really good job with the first movie. I think that if they're gonna do the whole series, they gotta tone it down a little bit. Because I think when you're when you're introducing something this epic that's been done so poorly in prior iterations, it's good for it to come out so bold and strong and dramatic. But if they keep the same tone that they had for the first movie for every movie, it would be overdoing it. But I think it was perfect for the first movie.
Dan Shappir [01:04:31]:
And I I actually heard I actually heard the an interesting analysis about the movie, and that's something that the director actually did right, which that in a lot of ways, the hero, Paul Mahdi, Paula Tradis, is actually in lots of ways, really, in in well, the opposite of a hero. Because the the best thing that he should have done or could have done was literally to kill himself, like, halfway into the book. Because from that point on, basically, what he creates is a disaster.
AJ O'Neil [01:05:14]:
I don't know.
Shay Davidson [01:05:15]:
It's, I think it's, it's it it this what you're saying appears in the second movie, and it's really uncanny by the way, and without spoiling too much.
Dan Shappir [01:05:29]:
Have you read the book by the way, AJ?
AJ O'Neil [01:05:33]:
I, yeah, it there's probably some parts that I didn't get fully because it is, it's kind of a boring book like Moby Dick, you know, it's got a lot of words.
Steve Edwards [01:05:45]:
A lot of words. Amazing how books tend to have those.
AJ O'Neil [01:05:50]:
Well, it's got the book has more words than it has story. You know, it's it's Saying
Steve Edwards [01:05:55]:
a lot without saying a lot. Is that it?
Dan Shappir [01:05:57]:
Well, he does a lot of what he does a lot of world building. So you really need to be into world building to enjoy the book in in a in a way.
Steve Edwards [01:06:06]:
Yeah. I guess that's the hard part about having such an intricate book making it to a movie because it's really hard to get in all that background.
Dan Shappir [01:06:13]:
Actually, in the description of in a certain way, a movie has a certain If done right, movies can have an advantage in that regard because they can just show without needing to explain. One of the problems in in the the old, the original movie, the one who was done by what's his name?
Shay Davidson [01:06:34]:
David Lynch.
Dan Shappir [01:06:36]:
By David Lynch. Exactly. Was that he literally told the story as he was showing the story. You know, it was all there was all, like, everything was narrated.
Steve Edwards [01:06:49]:
I see.
Dan Shappir [01:06:49]:
That was one that was one of the problems of the movie. The other problem was that it was totally incomprehensible to anybody who didn't read the book. But, but yeah.
Shay Davidson [01:07:00]:
You know, there was a planned earlier version by,
Dan Shappir [01:07:04]:
Yeah. Of course. The yeah. The
Shay Davidson [01:07:06]:
Ali as a as the epilogue?
Dan Shappir [01:07:09]:
Yeah. Yeah. The the the the most the fame the most famous movie that never that that was never made.
Shay Davidson [01:07:15]:
Yeah. Too bad, by the
Dan Shappir [01:07:18]:
way. Yeah. But he actually planned on totally changing the story, by
Shay Davidson [01:07:22]:
the way. Oh, did he not?
Dan Shappir [01:07:24]:
Yeah. His story was actually totally different.
Steve Edwards [01:07:28]:
So alright. Before we move on, I'll give you guys one bit of trivia. And I may have told this before, so apologies if it's a repeat. But the inspiration for Dune for Frank Herbert was the large dunes on the Southern Oregon coast too far from where I live. He lived up in, Tacoma, up in Washington, just north of here, and and he's talked about how that was when he went down and saw the dunes, like, banded down that way. That was his inspiration for writing Dune. So
Dan Shappir [01:08:01]:
k.
Steve Edwards [01:08:02]:
Anyway, myself, I'll move on to the the dad jokes of the week, which as we all know, are the high point of any any of these episodes. I'm sorry if you weren't worn shy, but, just be prepared. So did you know that penguins produce an oil that helps keep their helps their feathers retain their heat? You know? And, so in other words, you could say the oily board gets the warm. You know, for those of you know what Popeye is, you can think about
Shay Davidson [01:08:34]:
Oily boy.
Steve Edwards [01:08:37]:
Let's see. The other day, I went to my doctor, said I wasn't feeling good. AJ might appreciate this one. As I said, doc, I've got an earache, inflamed sinuses, conjunctivitis, and headaches. And he but he was really dismissive. He said, no. It's all in your head. Right? And then finally, I, my wife and I always brush our teeth together, separate toothbrushes, by the way, just because I found out that 9 out of 10 dentists say that brushing alone won't reduce cavities.
Steve Edwards [01:09:13]:
Get it. So
AJ O'Neil [01:09:15]:
That was funny. That was funny.
Steve Edwards [01:09:17]:
Right. Alright. Shai, what do you have for us? Any picks? Any, shameless plot? Any
Shay Davidson [01:09:24]:
I thought whether to talk about the game I'm playing, a computer game, or to talk about the to stick with the sci fi concept, theme that we had earlier. And, I will stick with the sci fi one. Okay. Because the next movie is probably rendezvous with Rama, Arthur Siclar, rendezvous with Rama, which is my favorite book. And I'm really excited if and when it shows up. And afterwards, he's supposed to do Dune Messiah, which is the third part of the Dune saga. Do you know did did you read the handbook with Raman?
Steve Edwards [01:10:04]:
I, myself, have not. I mean, I don't know where Dan went. He must have both.
Shay Davidson [01:10:10]:
It's basically without spoiling too much. It's basically a futuristic a futuristic arts sci fi book, about a cylindrical spaceship that enters the solar system and how humans interact and explore it. And I'm a big art sci fi fan. So, the book is one of my favorites. Art sci fi?
Steve Edwards [01:10:35]:
I haven't heard that term before.
Shay Davidson [01:10:36]:
What is Yeah. Art sci fi is basically science fiction that tries to cling to reality. Unlike, for example, sci fi, which has a lot of aliens and a bit, are tangent to fantasy like Star Wars, which is definitely not sci fi. So but it usually touches things like futurism, solar system exploration, things that really cling into real science.
Steve Edwards [01:11:10]:
Oh, okay. Cool. I like those. Alrighty. So with that, we are going to wrap up, this episode of JavaScript Jabber. We lost Dan, but, AJ's still here. I'm still here. Shai's here.
Steve Edwards [01:11:23]:
Thank you all for watching slash listening, and, we will talk to you next time on JavaScript Jabber.