00:00:20.689
Thank you very much for coming. Before we start, I guess full disclosure, this is my first RailsConf.
00:00:26.189
So if I do come up to you looking pretty excited, that's because I am. We flew out on Monday from London and I'm flying home on Friday.
00:00:36.960
It's just been a tremendous privilege to be here to meet some people that I've looked at from afar, perhaps followed on Twitter, and yeah, it's been a real thrill.
00:00:44.960
The other disclosure is that this is actually my first ever talk. I've never done a tech talk before.
00:00:51.210
So I really appreciate you all coming, but more importantly, thank you if you also bother to stay.
00:00:57.559
As a side note, if you've never done a talk before, can I recommend that you apply to do this next year? Because the process has been incredibly easy.
00:01:06.840
There's none of that crazy stuff about sending your slides three years in advance or any of that; it's just been really relaxed and friendly.
00:01:19.890
If you've never done it before, please consider it. Everyone has been super lovely.
00:01:26.039
I'm Chris, so Chris the sole on pretty much all of the internet, well, all the internet things that you can sign up for because this name is always available.
00:01:38.390
I come from a lovely little county called Suffolk in the UK. If you know where Suffolk is, great! If not, let me describe it. There's a handy saying that the UK looks like a witch riding a pig.
00:01:51.880
You can decide which part of the pig you think Suffolk is. However, the good news is that Suffolk doesn't actually look like that.
00:02:04.860
This here is Southwold in Suffolk, and these colorful things are called beach huts.
00:02:13.560
If you thought bricks were a terrible idea, then you should see how much people will pay for one of these things. It's a staggering amount of money.
00:02:26.250
A lot of people decide to visit Suffolk because it's a beautiful area. We have quite a few hotels, campsites, B&Bs, and cottages.
00:02:39.120
I used to work at a consultancy business where we built websites, and all our clients wanted booking systems. We initially thought there had to be something out there, but they said there wasn't.
00:02:58.920
So about eight years ago, we started a company called Staylists, offering online booking for hotels and B&Bs.
00:03:09.270
That system is built on Rails, which I guess makes it a monolith.
00:03:16.590
We have about 300 models, approximately 40,000 commits to the codebase, and 72 contributors. And I'm curious, how many of you think 72 sounds like a lot?
00:03:36.780
The interesting thing is that I'm the only full-time developer we've had for a long time, which makes me the CTO.
00:03:44.100
We worked mostly with contractors, many of whom were consultants from a company in Poland called Debt Guru, with whom we've worked for about six years.
00:03:59.700
In our setup, we have rotations where we get developers for six to nine months, and we take some junior developers on for maybe six weeks.
00:04:08.970
This means we constantly have new people coming in and out, and we need to get them up to speed quickly so they can tackle the work.
00:04:19.830
One nice thing is that when people leave, they always say nice things. They often remark that "Chris knows everything about this codebase. If you need anything, just ask Chris." That feels pretty good.
00:04:31.390
However, this inevitably leads to an important realization: I’m not really the Oracle or the linchpin; I'm just the bottleneck.
00:04:39.480
I realized I made a mistake by not spreading that knowledge earlier, and that's a problem I needed to solve.
00:04:52.900
People have had bottlenecks in business before, and I thought about how to alleviate that.
00:05:02.280
I started looking into other areas beyond just programming because my background is more on the creative and product side.
00:05:13.860
I found inspiration from an interesting figure: Walter, a grocery store owner from St. Paul, Minnesota, who observed that customers only bought as much as they could carry.
00:05:23.610
So, he invented the paper bag, which transformed grocery shopping. It was lightweight and repeatable, and he didn't need to follow customers home.
00:05:37.470
There's something similar in Rails that solved my problem: it's called rake DB reset.
00:05:49.950
This talk is about rake DB reset. I want to convince you that it's a good idea. How many of you have your computers with you today?
00:06:00.990
How many of you have a local environment set up?
00:06:06.570
How many of you are prepared to open up a Rails app and run rake db:reset? Quite a few of you.
00:06:14.520
Anyone not prepared to do that? Okay.
00:06:19.320
I'm going to persuade you that you should want to do this. What exactly happens when you run rake db:reset?
00:06:31.860
Essentially, rake db:reset does two things: it drops the database and then runs db:seed.
00:06:38.280
The seeding part is what I want to focus on because it can reduce dependency on you, especially if you’re the one who knows how all these objects interact.
00:06:44.760
So, what happens when I run rake db:seed? There's a module called database tasks that runs load_seed.
00:06:52.290
If we dive into that, we see that load_seed is delegated to the seed loader.
00:06:58.740
The seed loader is part of the Rails application, which finds the db/seeds.rb file and loads it.
00:07:06.030
In essence, rake db:reset drops the database, loads the schema, and then seeds the database.
00:07:12.300
Does everyone have a db/seeds.rb file? Who here does not have a db/seeds.rb file in their Rails application?
00:07:24.090
Now, what about creating seeds? We know it’s just a Ruby file, and we can use Active Record to create stuff.
00:07:36.060
I prefer using 'create!' because I want it to fail loudly if something goes wrong.
00:07:43.860
A few tricks you might not know about: the create method can take an array of hashes.
00:07:51.000
Instead of thinking of names for a large number of records, you can use gems like 'faker' to help.
00:08:01.140
Faker provides a ridiculous amount of fake data, making it interesting for testing different scenarios.
00:08:12.210
Overall, we're seeding a monolith. We have a lot of models, so the seeds file can get quite big.
00:08:20.460
To keep it manageable, we choose to extract our seeds into separate classes.
00:08:31.020
We organize our seeds to improve readability and maintainability, only requiring the relevant files in our seeds.
00:08:40.320
Additionally, we discovered a nifty trick: you can run 'rake db:seed' while specifying a particular seed file using an environment variable.
00:08:52.350
This makes it easy to run specific seed files while working on particular segments of your application.
00:09:01.890
The interesting part is whether you can run rake db:seeds without a DB seeds file.
00:09:09.870
We found that if the seed loader is nil, we can set it to a class instance.
00:09:18.240
What it allows us to do is to change the seed loader dynamically and delete the seeds file if necessary.
00:09:29.940
This feature leads to a more flexible implementation of seeds across different environments.
00:09:41.610
The main takeaway was that adding this seed class provided us with an instant and consistent local environment.
00:09:52.920
No more slack calls or wasting time explaining the same thing over and over again.
00:10:04.590
What we're actually doing now is allowing developers to engage more effectively with the system.
00:10:16.620
It fosters a productive environment where they can reproduce the conditions they need to do their work.
00:10:28.590
Overall, the significant benefit is that you can reset your local environment whenever you need to.
00:10:42.000
In doing so, we've also created a resilient local environment that helps ensure a smoother workflow.
00:10:55.140
The joy of being able to reset daily leads to a more prosperous development experience.
00:11:07.230
When everyone contributes to the seeds file, we have access to more contextual data to work with.
00:11:18.030
The process of creating a new model now includes adding seeds, allowing everyone to build together.
00:11:30.090
In conclusion, I was particularly impressed with the speed we could develop after this change.
00:11:41.520
It’s practical creating a staging environment where we can run seed data, improving communication across teams.
00:11:52.590
Now QA teams can understand what they’re looking at without setting it up themselves every time.
00:12:11.490
Overall, this simplification contributes to a streamlined process that benefits all the developers involved.
00:12:22.590
I urge you to consider resetting yourself free. Thank you very much for listening.
00:12:34.960
Does anybody have any questions?
00:12:40.270
That's a great question. For external data sources like Stripe, we actually use a dummy account.
00:12:45.960
This allows us to connect through the application and seed the relevant data.
00:12:51.320
We put any necessary keys directly into the seed file instead of going through complicated setups.
00:13:01.540
To keep things organized, we place our seeds in a subfolder called seeds and name them according to the model.
00:13:12.210
This has allowed us to manage our 300 models effectively.
00:13:23.030
When it comes to handling relationships, we load the parent object first to ensure proper associations.
00:13:35.170
If we have multiple files for related data, we just create them and relate them accordingly at the top of the seed file.
00:13:47.050
We've noticed some people worry about seeds becoming stale. Honestly, we're still in the honeymoon phase with this implementation.
00:14:04.650
In the future, there could be challenges, but right now, it feels efficient.
00:14:23.220
We even wrote a small utility class to help manage relationships and keep our seeding fun.
00:14:36.300
We also found joy in communicating about what we were doing in the console while handling seeds.
00:14:48.490
To sum up, we did originally explore gems for seeding but decided to keep it simple with our own classes.
00:15:00.490
We develop organically, and that worked out well for us.
00:15:15.750
We don’t currently use seeds in our tests, though that could change in the future.
00:15:28.520
But as it stands, we generate dummy data to facilitate our testing processes.
00:15:39.480
I can always share insights on how we structure our seeding if there’s interest.
00:15:49.520
If you want, I'm happy to discuss what we've implemented or contribute to discussions about this.
00:15:58.290
Thank you all once again, I'm Chris. You can easily find me due to my shirt. Have a wonderful time!