Rooftop Ruby Podcast

7: MySQL for Developers with Aaron Francis

April 04, 2023 Collin Donnell, Joel Drapper Episode 7
Rooftop Ruby Podcast
7: MySQL for Developers with Aaron Francis
Show Notes Transcript Chapter Markers

Developer educator Aaron Francis on databases, independent software development, and more. 

Follow us on Mastodon:

Show art created by JD Davis.

Collin Donnell:

Hello, welcome to the show. Today we have a educator at planet scale. And so, welcome to the rooftop that was intros.

Aaron Francis:

Welcome to the rooftop and I love it.

Collin Donnell:

Yeah, that's what we're going for. Joel. Joel

Joel Drapper:

Hey, Collin. I'm good. Yeah. Excited, too.

Collin Donnell:

Yeah, so Aaron just created a seven hour I developers. Am I characterizing this correctly?

Aaron Francis:

accurate, accurate so far, except for the Yeah, that was really difficult. So so the years. But yeah, accurate so far.

Collin Donnell:

How long have you been working on this? For? Yeah, that's amazing. And so it's MySQL for I'm a application developer, I'm not a I'm not a DBA. I've never So we are kindred spirits. I'm a Laravel. developer, I imagine Show. But I started reading all these books and realize, like, application developer, maybe maybe 25%. And the rest of it is career path that I did not want to pursue. And so as I, as I was and doing all of that. And once I had finished, you know, as look at my notes and try to coalesce it around topics. And every topic and then kind of started shuffling them around to of go together. And it just took a lot of a lot of time and massaging. seemed fairly general, how much of it would you say is very with a different SQL type database? How much of this would

Aaron Francis:

Yeah, that is a great question. And one that don't know Postgres very well. And so, in terms of the and compact tables. So that's the schema section. So in the MySQL. And so how much of that applies to Postgres, um, more like specialized data types. And so when I'm saying and I'm talking about, well, you know, this, this column is four between zero and 255, put it in this column. I just don't know probably pretty close in Maria dB, since that was a fork of I think, I think one, there's a huge opportunity for some which I think if they did it solo, they could make a lot of talked about are applicable to all databases, like we go over, How do you how do indexes actually work? Like, why would definitely a little bit broader than MySQL.

Collin Donnell:

Yeah, that's what I was wondering, because in indexes queries, and then it's examples, but of that schema overlap there. So I was curious. So starting at the top, then your course knowing that they wouldn't know going in like, a would help them steer away from? Or am I on the right path here?

Aaron Francis:

Yeah, absolutely. So I think, you know, in the start with how do you query your data, which I think is a little the course that like, you should start with building efficient writing migrations to build the you know, to build the table. So thing I would want application developers to come away with about your schema a lot more. Yes, data modeling is super since that's an entire, like, that's an entire course on its but what we talk about a lot is, alright, let's take a look at the like, what is the smallest column you can get away with version of a column like what what is the simplest in a date column, not not a string column, if it's if it's a string column, because we want the database to be able to work last point, which kind of takes like it takes a little bit of reality, the easiest way to say that is don't make a column easiest, you know, your schema should adhere to the truth look at, you should look at the reality of your data. And your can work with the smallest, most efficient compact types, and you like, Okay, well, you know, my data is nullable. But I think version of No, you know, I'm going to put in a in all the like, well, you just you lied, like the data is nullable just So I think that's, that's the big takeaway is like, spend some because that's going to set you up like that is going to set you creating indexes. And then finally, like trying to get the

Collin Donnell:

Right, so that's even a more basic than data than types, which are provided by the database, and sort of don't work to be worked with.

Aaron Francis:

Yeah, totally. And I think an easy example is to say, create an integer column, right? That's very, very the value can go up to like, I think it's like 4.2 billion or know, if you know that, like you're storing zero to 100, can hold up to 4.2 billion. It's not the end of the world, it's apply it to every column on every table across millions or the kind of thing where it's like, hang on, instead of just file, which is what you know, I do all the time. Let's think column that that holds that and doesn't restrict you. But have, you know, four or five different integer columns that

Joel Drapper:

I was just gonna say, as someone who has a that the schema part of the course, which is the only bit exploring how the types that we use in applications, at least in integer in Ruby. And it can be any length of integer, right. you. But when it comes to the database, you've got all of building databases are used to working with languages that have a lot of people, their first introduction to like thinking it's signed or not signed, because many people like thought of that. So that I think that alone is incredibly regular application developer can can watch and like, come these types that we work with. I found that to be really type for the thing that you're doing, and trying to figure out still having enough space. Yeah, I learned a ton. I haven't a ton from the schema section. And it definitely made me think

Aaron Francis:

long course. So that's fine. Yeah, that's, unfair advantages when creating this course is I'm an just like those things that you just mentioned about like, oh, the column unsigned, because that represents the reality more about. And basically, everything that I teach in this course, was was reading the docs or reading these books. And I was like, frustration for me was a lot of the SQL content was either was select the star means bring back off the columns. I'm like, Yeah, This is how you, you know, turn on binlog replication. And I'm know that somebody else is going to host my database. I just want you say that, because that was the exact like, that is exactly

Joel Drapper:

But it's also just like, people who are not writing to declare, like the type of an integer as being like a think about it. And I think, especially if you are like just the generators probably leave it as nullable, even though like bit weird. It's really interesting, just like just the

Aaron Francis:

Well as as a PHP developer, we're in the same of turn it into an integer for you without asking. So like,

Collin Donnell:

it was really interesting to me to hear you to that are more strongly typed. And so I'm like, yeah, if it's that. Because you do have to declare that, were you guys you just, that's, that's not the default that you have to do guess, we can just sort of go through an order is indexes. And maybe you can give us the overview of that.

Aaron Francis:

Yeah, totally. And again, we're like doing about pulling your data out. And that's very, that's very got to set yourself up for success. And then indexes are so like, before we even get to the querying section we need to indexes work. And so, you know, there are a lot of specific broad, generic like, computer science light, I got my degree it's very much it So very much computer science light. But we are good or whatever. But what does an index actually do? So does what is an index? Well, it's a separate data structure does it like? How does it make it fast. And so I have a little row by row, we can kind of start at the top and go to the bottom, interesting, and this is a MySQL specific thing. I'm sure other really interesting is when we start talking about the primary engine, but in MySQL, the table is the primary key, it's a arranged. And then every secondary index has like the the secondary index, it goes to that index and looks through it finds index. And I just was like, this is super interesting. I never more of like, okay, well, here's, here's when you might looking at where should I put indexes, here are the rules once. And the rules are very specific. And so we dive into a to know when they're trying to get like they're trying to get the database becomes the bottleneck, like people make fun they're like, Oh, Ruby slow, come on, the bottleneck is going building, the bottleneck is likely going to be the database.

Collin Donnell:

I'm going to ask you a question as to why we're a would want to get out your course, which is, like, can you everything?

Aaron Francis:

Yeah, yeah, that is a that is a great question. talk about, if like, indexes are good, you should have as many as few indexes as you can get away with. And so there's this performant query. But they're also a copy of part of your maintained. So anytime you do an insert an update, or a delete, table is modified. But then every secondary key that have to go out and it has to be modified as well. And so move me so much you can you can bloat your table up with be maintained. And so that can really kill your INSERT, UPDATE copies of your table in all these various indexes. So yeah, data, and you're like, Yeah, you know, how big is it? All right, and sometimes a dark art, because you're like, Ah, I'm definitely over index. And I think you could definitely under

Joel Drapper:

I think one thing that I'm excited about getting coming, based on the schema section, is the ability to index time, I've not really used MySQL very much, or at least not to showed in the first section of the course, that you can create query of a JSON column. So you can say I want to look for the column. And you can either have it computed, I can't remember can have it computed in advance and put in an actual column on index that column if it's computed in advance If

Aaron Francis:

you can, and you you have set me up well, because generated columns, I just find them so useful. And I, I just know, maybe sounds super lame, we don't talk about generated like, yes, we do talk about how to index them. The great thing MySQL treats it like a real column. So you just add an index basically you say, it's very much like Excel, where you would column. But they get really, really powerful when you do they allow you to reach things that would otherwise be an In MySQL, you cannot put an index on a JSON column, that I think it's a gin index on a JSON column. And you get kind of that, but we love it anyway. So what you would do in MySQL is generated column, you would say, I need to pull this one level. And I want to, I want to make it a real column. In an in through like a model observer, or model callback, or some sort framework you use. So like when the user, you know, when the attribute as well, that sort of thing. This is very much like And so if you ever accidentally save a user without firing the table plus, and you're modifying records in there, I mean, we've But using a generated column, the database is in charge of mess it up. And so it's super duper nice when you need to pull that key in particular. So if your JSON blob for whatever And for whatever reason, it makes sense for that JSON blob need that one key to be pulled to the top. But if they ever get and the JSON blob and a different email key in this you basically create a new column, and you tell MySQL, here use to keep this column updated, then you get to tell my sequel, going to be a virtual column, or it's going to be a stored out. And so it's just like, it's just kind of like a view thing. the row out, calculate this, again, stored columns are are written to the disk as a real column. And they each have on it. And the neat thing is, you can actually index a virtual index the virtual one. Because what MySQL is going to do is secondary structure. And so when you then go to query and you're key, this key, this key equal to Aaron, MySQL looks at it and In fact, I have an index that's based on that formula itself, based on that formula, I'm just gonna go use the index. And so asking for, I'm going to use this index. And so I think situations than just JSON. Like if you need to search by let's you where you split it at the app, sign the email at that sign easier to search for domain because leading wildcard of break it up and index the whole domain. So I know that's a they're awesome. And I think they're super useful. So yeah, second section there.

Collin Donnell:

That's really interesting. And you were pretty big trade offs to doing what you just said, right? So that must affect, you know, like you were saying maintaining performance when you use those sorts of things.

Aaron Francis:

You know, that is a good question. And it depends, say, for example, let's go back to the JSON, the JSON example. certain size, and usually you're shoving a lot of JSON in there, kind of a second location, and a pointer is left in the actual query on a key, if you're querying on a key, not only does secondary location to look at that JSON, even in the first and you're like, Wait, now I'm duplicating the data. But if you to go grab that full heavy JSON blob. Now, if you have a pretty stored with all the other columns, because it's not big, the equivalent and you do let's say you do a virtual instead of basically the equivalent of saying select star comma, and that's like exploding, the, we call it in PHP, we call it the, it's the equivalent of just adding to your SELECT statement calculate that as it pulls it out. So I don't really have any prevents me from going to access a blob, often that secondary adding a select for a pretty basic operation, I feel good

Joel Drapper:

thinking of going to a different location to technique where and this was new, like this idea is new to like a large text field or a blob, you should consider that's because if you want to like select, if you're not table, then and use like select star, you're going to end up might not need it. And so it can be a lot better to have, like need it. But like the basic, like default query doesn't trade offs of using that technique? I guess, doing a join text? I don't know. I thought that was such an interesting

Aaron Francis:

Yeah, this is one that application developers, I or Django, something like that. I think this is one that that we basic theory here is, we want our rows on the disk to be as possible. So again, it's not about like saving some money to close together, so that the database can grab it all kind of here is if you have a super wide table, so you've got a table but it happens, right this, you're just like, hey, let's And eventually you've got these huge tables. Now, that may not wide, and it does have a lot of columns that you hardly ever whatever reason need to store text, which is the official name for example, then not only are you sending a bunch of data back waste. You're also like going out to grab those potentially as well. But then also your rows are very spread out on the disk not always ideal. So to prevent that, what you could do, you have a very long table that's very wide, and it has a few hot columns that I don't know, you keep around for auditing that, like you never really need it, you could break it up into supplement, whatever you want to call it. And then that way, your narrow, really compact on the disk, easy for the database to trade offs are real. In your application, you have to like that can be really frustrating if you are used to like, a user supplement contains most of that like long tail of got to kind of keep them in sync, like, that's more of a you know, God object page where they can change every setting or attributes go to which table. And that can that can be y'all keep asking you about it. Because there are no, there are databases. But if if the trade off is worth it, it's worth worth looking into. If you're listening to this right now. And it? Yeah. Yeah, you might, you might consider this. And this is record kind of world, which we both live in. Because Active select star, like every time, it's just issuing select star never gonna be the guy that's like, oh, RMS are bad. I love stars, and you're getting back 45 columns, and you need three like, maybe we need to start thinking about either selecting best practice. Or potentially, if it's extreme, splitting it up

Joel Drapper:

That makes so much sense. And I guess one of the secondary table anyway. Like every time you access the users probably not worth it. You split it in correctly. Yeah, yeah, come over to the main one,

Aaron Francis:

and what a pain it would be to actually move it pretty sure before you do this, that there's stuff that you issuing select star, in most cases, like maybe you start on global scope or whatever would be best, by only selecting five this scope. Just select more columns that are still in the Alright, here's my theory, do I actually want to, you know, go do it on the application side first. And I think one one point ever hang out on StackOverflow, and you're like I did select how dare you do select star you must be an application understand we inhabit different worlds, but let's have a little practice, right? Only select what you need. Absolutely. I world, you don't want to deal with partially populated models, were going to be fully hydrated. And so if your ORM does not have select star always because the risks aren't worth it. So like model and then you access email and you think email is no but populate your model with it because you thought you were Laravel has recently introduced partially hydrated model I think Ruby Rails has had this for a while. But Select Select hot, partially hydrated model sounds like it could lead to

Joel Drapper:

I'm not sure how rails to handles that actually. that thing for you as and when you require it. Or it could Or like you said, it could just return nil. Exactly. Awful.

Aaron Francis:

Yeah, that's what Laravel did for a long time. are like, Oh, you accessed first name? Did we pull it from the you know, some other thing, and if it's none of those, it just you realize, wait a second. Email is definitely there. I And so now I'm treating the user as if they're a guest user, about that, really, but now, when you start talking about is them through these flows that they should not be in? So yeah,

Joel Drapper:

But as long as you'll ORM handleset, you of separating, like splitting a table, where you've got like, in a separate table. Doing that first by just taking your main select statement, where you're selecting specific columns, that these columns? Or do I really depend on the other 10 all the and I think this is just a great example, you mentioned auditing. that we put on database tables, that are like write only. We we just never read them ever. And sometimes those columns are sending out this request. And I'll just write it there for is exactly the kind of thing that you know, if you're never think that is just such a great piece of piece of advice to keep

Aaron Francis:

Yeah, that's a great example. Because I think storing all of that in the database. And you don't even you a story about when I needed something, and it wasn't there. an application developer, myself, I feel like I have a lot Like, sometimes I feel like the database tail can wag the dog, I'm trying, I'm trying to, you know, one, keep my job or build be happy and like, I'm sorry, I'm storing a bunch of data in example of like, yeah, dump it in the database. But how can we

Collin Donnell:

There were a few things you mentioned that got me a lot of places where when we're using RMS of different flavors, so ideal, and someone, for example, just using Rails, or with some sort of sub optimal results. And I can give you an an ORM there called Core Data, and a feature it had in the subclasses, you could say like, this thing I'm setting up in as this and that ended up being something people did not from, because the implementation of it was when you were talking just made that all one table. So anything that was a child entity entire feature where it makes sense when you're using it but think there's a lot of that?

Aaron Francis:

I think there is definitely more of that than we voices online. And by that, I mean, Twitter Hacker News and because that's where I hang out. And I think the dominant voices developer and use an ORM, you should be writing SQL by hand what database I'm using. But I have this great ORM. And I just opinion, I think ORM should be treated for what they are. And know how to wield this tool, such that we save time, and and I have said, I said in the course, I'm never going to tell because I think one that's silly, and two, that's harmful. ORM, like an experts like you should be an expert user of your responsible for the sequel that it generates, I don't really great. I don't want to do that. If you want to use your ORM, for what it generates. So what that can look like, I think one examples is something called index obfuscation. So when you the column first name, what MySQL does is it takes all the and it puts it over in that secondary structure. Awesome, using your ORM to query against first name, and for some reason, parentheses, first name, right. So what the ORM has done, and this is this is conceivable. What the ORM has done is said by lowering the First Name column and lowering your search make sure we get all the values that you need. And what that name, right? So you thought, Okay, people are going to search very smart boy. But now your RM has totally hosed you. Because first name. And so MySQL looks at that and says, Nope, I'm So that is an example of an index obfuscation. Right. And this is something that Laravel does. And here's, here's where I one that I'm about to talk about is not Laravel fault, it is a responsible for investigating is this writing basically the SQL you can say, let's say like the user model, and then you can say then inside of that you can pass like created at so let's say I right? So I say user where year created that is equal to 2023. experience. I just got to write the words where year pass in my that does under the hood, unfortunately, is it wraps the enough sense, right? Now you're creating that column is going to be used, like you're totally hosed again. What would Well, that looks like index obfuscation. To me. What I'm where created that is between and I'm then I'm going to pass because now you're leaving your created at column untouched by a that B tree to you know, navigate and then scan down at the ORM and again, it's not the Oh RMS fault, like the ORM might not have messed up, if you didn't have an index on created I say, you need to be an expert driver of the ORM. And that's my sequel? But how do I, how can I be the best MySQL user ever? you know the DevOps team or playing at scale or whoever, expert driver? So there are places Oh, RMS can hose you I raw SQL, I think in the worst case, and lrm may hurt your you give away the keys to the kingdom, and it's just game

Collin Donnell:

Yeah, my takeaway hearing you talk about several different RMS over the years. And they will at database, like a database is one potential back end, you could modeling your data. Like that's, that's what Core Data has always experience was that you do actually kind of need to intuitive sense for that. It seems like that might be sort of When

Aaron Francis:

you were when you were saying that I was shaking disservice because it's going to be such a, I don't know, I don't what you would call it. But to pretend that there's not a naive at best. Because, yes, the Oh, RMS are incredibly powerful. incredibly good, oh, RMS, but there's still a database make a lot of sense to me, because I'm querying a set of entirely different than querying an actual database. And so if folder of JSON documents, and it works just the same. It's like, one is ever going to happen to be like, Well, I was gonna use I was going to use my sequel, I'm going to use Postgres Sure, Now you get to go learn the differences about Postgres and Postgres track, or you're on a MySQL track, but to pretend that example of knowing why, or, or why you need to know what's right? I think you were talking about child tables earlier, least in in Laravel. There's this table kind of that, that might have a comment that can be linked to a user or an image or have to store what that other model is, right? So what you going to get really, really big, we're gonna have a ton of what's the most compact way that I can do it, if you run a Laravel, it creates a string column where the the class is comment belongs to an app slash models slash Image class, right? sense. That's, that's really helpful for me to see, hang on a these things, and you're going to be putting a compound index store the fully qualified class name, I don't need to store you image or a user or whatever. And so that's, again, where you can, it to be as compact as possible. And you can say, I'm going to to 50 characters of a fully qualified class name, I'm just mapping. I'm going to do the mapping over an application land example. Like, hey, the the ORM is here to help you. But once doesn't super matter, I'm gonna be honest. But once you reach a you're in charge here. And so I think that's another time when your data, in this case, my SQL, you can look at that and say, maybe I should compress that down a little bit, use an enum

Collin Donnell:

Yeah, absolutely. My experience has the database or whatever, and you don't need to worry about rows or something, except with the absolutely most trivial it. But maybe you have this weird layer in between you and fortunately, active record in particular, I don't know what that. It's not abstracting it so far, like there is an in the database, unlike some other things where you're not secret that there's that there's a database anywhere. Yeah, I

Joel Drapper:

think it's it's not bad. You can definitely I the same, they create a string. And there's just no reason patterns in Active Record, like single table inheritance, that often end up with a table that is just really not ideal. And relationship instead of a single table inheritance type structure there's probably, it might be helpful if the documentation was kind of not a very good pattern. So one of the other things that tool called Hammerstone. And it's kind of related to database describe it.

Aaron Francis:

Yeah, that's part of our problem.

Joel Drapper:

It basically makes, it's like an API for like you can have like, I don't even know where to start.

Aaron Francis:

See, this is the problem you have perfectly, you work at playing skill full time for for a long, long time. Now, and my partner, Colleen. And so what we have is a it is a drop So on your side, it's a gem on our side, it's just called a that gives you the ability to give your users a visual Query Planet skill, a while back, I was working at a, like a local employees come to me and be like, Hey, can you run this haven't protested yet? And the value is under $200,000? And back and be like, Hey, can you run it for Collin County where can I can run that report. And of course, like the 50 of time there? Like, are we ever going to reach the end? And the answer very flexible query builder that keeps the developer in control. at the beginning, our data models are, how can I say this have a little bit of patching here in there, right. And we, as as it could be because we've been in business for 10 years, the developer get to say like, here are all the conditions that one's a Boolean, and then you get to like you get to paper Boolean condition. And in the database it is, you know, a to the user just treat the nulls as true or treat the nulls as are active. And like under the hood, it might be where is need to know that. And that's a big problem with these query okay, I see, like, I see all these columns, what what is, is really be intimately familiar with this data model. And so our company needs to provide this kind of data to their internal a sales team or marketing team that are coming to the again. And our thesis has been, we will do all we will, we will package that you can just drop in. And we have front end record query that you can either run or paginate, err, you can do whatever you want with it. And that has been our thesis.

Joel Drapper:

So you basically have a language of describing essentially like the the language for the query builder. to go to your web app, and build up queries like this field whatever the conditions are? And that is something that you

Aaron Francis:

That's correct. Yep. So that is, that is an alright, you want to build a users filter, great, tell me all as Hammerstone, will present that on the front end and allow add ors, they can add groups, they can do whatever they want. that our backend component understands. And so we take on based on that JSON from the front end. And importantly, we write, we never write SQL ourselves. But we sit on top of take all of their user input and the way that you configured column, but for an unfortunate reason, all of my times are we got it, we'll handle it, we'll handle that conversion, of like, that's kind of our value proposition is we give

Joel Drapper:

is a massive time saver as well, anyone who's can be. And it's been, it's been really interesting hearing you with this. And it's like, following the product that. So I've been joined following that.

Aaron Francis:

No, thanks. I'm glad to hear that.

Collin Donnell:

You know, what this reminds me of a lot is the those sorts of UIs. There's a class for I think it's called There's a class for it, I think called NS predicate editor. It you had any inspiration from that kind of UI.

Aaron Francis:

I have had a ton of inspiration from many of dev world. But yeah, this, like, it's been really hard for us we're gonna go with this in the future. But one of the things this to filter models on an index view. Like that is the we offer, like you go to the Users page, and you can say show it's like here, all those users. Okay, cool. Everybody needs smart lists or email lists or running recurring exports. So seven days. So you can like make it relative in the past seven whatever is coming or their end date is coming up, and just send that those are my those are my churn at risk of churning store them, not the actual sequel, just the user's elsewhere. And I think that's where it gets really There's there's many reasons, but we've had a really hard time and I, who's the partner, my co founder on this joined tiny not they're not bootstraps, they back bootstrapped companies. And like, Get up, come out here into the shed early, and then work at And so we're just like, desperately iterating to try to because it's like, we have all this stuff that we think is seems hard to integrate, like, No, we've we've made it super bit of a challenge for us. And so we're considering hitting the of a thing you integrate into your application and more of a trying to figure out like, Alright, I think this problem is might be bad, or sub optimal. And so yeah, if you want if you a podcast there. But Colleen and I talk every week about how to

Collin Donnell:

Maybe I'm crazy. This made sense to me as soon as feel good that I definitely. Yeah, but I definitely are then going to give you money can be very difficult.

Aaron Francis:

And there's a big I think, one of our one of the plugins or packages or gems libraries. Yeah, paid libraries. Yeah, Mike perm has done it with sidekick. And you're like, Yes, that Colleen and I have been talking about, it's like, I regard. Like, I would love, it would be wonderful to me, if package, and instead of open sourcing it and hoping that they and get paid for it. And we have this thriving community of like, that to be the case, I do not have the energy, or the money to change the world in other ways, raising my children as a primary try to change the world and make code a viable thing to sell. And really a common thing in the market. And when you start need to try it. And I'm going to have to eject once I'm 95% of seems like a fun problem. And I get I get paid to work. And so my own version. And so we've had success talking to business owner, my time is money. I'm just gonna do it. But talking to like this could be difficult, and I'm just gonna burn a bunch people have learned before, but we're learning them for the

Joel Drapper:

It's, it's incredible, isn't it? Like a the autonomy to be able to spend, like a few days working a few 100 quid, like a few $100 like to buy something that would out to not save them several weeks work, did it save them two something from it? I think it's a real shame that that is the like pick that battle. Exactly. Do you find though that it is a

Aaron Francis:

out Do that's another that's another problem, more, kind of be careful. The Ruby community is a lot more have Heroku. Right. And besides being great companies, they're other smaller companies. So like when people started companies 10 and Heroku, and be like, oh, we'll start with Rails. Because And so that trickle down effect is very real. It's also very either work at these huge billion dollar companies billion other mature Ruby shops. And so I think we have found the

Joel Drapper:

It's interesting, honestly, thought it'd be the

Aaron Francis:

Well, maybe there's no willingness to pay on there on on the PHP side, I think PHP has a long history of community. And I think that has been a hard thing to shake. But hobbyists and that like, the long history of PHP being as a community moved on, and Laravel exists and runs cover like, Laravel is very successful. Look at all the SAS any billion dollar companies that are publicly championing that use it, but they're not billion dollar companies that Foundation, like y'all just started the rails foundation,

Joel Drapper:

but even billion dollar companies, people, that billion dollar companies, like, I mean, having worked on, how how valuable Shopify is, or was when I was there, but it building Hammerstone in house, then it would be to like to get payments, and you have to have like, probably a bunch of like use a piece of software, it's it would be impossible to just of amazing. And I think, yeah, I don't know, like you've got, this. Yep, we sure do. I really wish you the best because it quality software libraries, and sell them if there was like a like, and we would have a better, like a better quality of

Aaron Francis:

I think the more we can have like, weirdly, this building query building filter building, I think it is one problem. And most people will probably as they should stop at business needs. And I think the more that we can have nerds like be. But instead, we're all reinventing the wheels over and source, which is extremely valuable, but people get burned people just reinvent stuff in house because there's no like, And so I agree, I think it would be better long term. I don't

Joel Drapper:

If it was a culture of if these companies$100 a year that that would also be great. Right? You could make exist. And yeah, that's it's sad.

Aaron Francis:

Yeah. Which which battles Do you have energy for? energy for. Yeah.

Collin Donnell:

Well, that's a lot of information. So we've start to wrap it up. So Aaron, where can people find you? What interested in? Go? Yeah,

Aaron Francis:

thanks for thanks for listening to me. I mean, databases for quite some time. So thank you, thank you for find the course at Planet scale.com/courses should take where you can find my sequel for developers, if you are looking yourself. Because you don't want to be a DBA. That's what we do a couple of layers on top of it to make your life a lot easier. good at it. And I can say that, because I'm on the education get to I just get to make videos. So come to Planet Aaron Aaro. N D. Francis. I'm on Twitter basically all the time. So come come hang out on Twitter. And if you want to dot Dev. So that's a lot of links. I think that should be

Collin Donnell:

Yeah, well, fabulous. Thank you for being on here. And I am definitely going to go finish your course and much for for being here.

Aaron Francis:

Yeah. Thanks for having me. This is a lot of fun. on. This was a joy. Thank you.

Collin Donnell:

Awesome. Well, we will be back next week. And enjoy it, please remember to tell your friends like those things. Hit the star and overcast and we'll see you next

Podcasts we love