РАСШИФРОВКА 🔗
WEBVTT
00:00:00.040 --> 00:00:00.550
Joel,
00:00:00.920 --> 00:00:01.290
Hey.
00:00:01.689 --> 00:00:02.359
we have a guest.
00:00:02.819 --> 00:00:04.860
Hi, my name's Dave.
00:00:05.009 --> 00:00:05.580
How y'all doing?
00:00:05.860 --> 00:00:06.440
Hi Dave.
00:00:06.519 --> 00:00:09.160
Do you want to just give your own little introduction maybe?
00:00:09.210 --> 00:00:10.060
Yeah, sure.
00:00:10.099 --> 00:00:12.589
Um, so, uh, I get called Dave.
00:00:12.599 --> 00:00:21.649
That's kind of what I go by, but for various reasons I've, uh, my, my public name might be David Bryant Copeland, which is my, my full, full legal name, which I use to write some books.
00:00:21.679 --> 00:00:25.289
Um, I've written a few books on, on Ruby and things over the years.
00:00:25.780 --> 00:00:37.929
Um, and, uh, basically otherwise just been a software engineer for the last 20 plus years, had some experience consulting, had some stuff at product companies, a lot of startup stuff.
00:00:37.960 --> 00:00:45.759
Most recently was at Stitch Fix and then a mental health startup, so I'm currently between jobs at the moment.
00:00:45.759 --> 00:00:52.149
But yeah, just mostly just been a programmer and a writer for the last several, several years.
00:00:52.820 --> 00:00:53.060
Yeah.
00:00:53.060 --> 00:00:55.409
You have written, you've written so many books.
00:00:55.490 --> 00:00:59.579
Uh, I think at least seven, seven is how many I had in my outline.
00:00:59.590 --> 00:01:01.030
There may, maybe there's more though.
00:01:01.420 --> 00:01:01.759
Yeah.
00:01:02.049 --> 00:01:05.719
So several, um, over like the last decade or so.
00:01:05.819 --> 00:01:06.390
yeah.
00:01:06.849 --> 00:01:09.280
And then, so you started 20 years ago.
00:01:09.280 --> 00:01:12.859
You said, did you, so I guess you probably didn't start with Ruby.
00:01:12.859 --> 00:01:14.790
Like what's kind of your path to get to Ruby?
00:01:14.965 --> 00:01:15.444
Yeah.
00:01:15.484 --> 00:01:18.295
Um, so I, I have a degree in computer science.
00:01:18.295 --> 00:01:19.185
I have a master's degree.
00:01:19.185 --> 00:01:21.234
I thought I wanted to be a college professor.
00:01:21.325 --> 00:01:25.454
Um, I year into my master's program, I realized I did not want to do that.
00:01:25.454 --> 00:01:27.885
So I finished up my master's pretty quickly.
00:01:28.295 --> 00:01:37.265
Um, did some C and C plus plus pretty early and then did some Java during the sort of initial dot com thing back in the 2000.
00:01:37.724 --> 00:01:40.075
Um, and did, did a lot of Java.
00:01:40.135 --> 00:01:43.734
Um, heard about rails kind of around.
00:01:44.284 --> 00:01:48.805
Probably around Rails 2, like, I think when Rails 2 was coming out, that's when I kind of heard about it.
00:01:49.355 --> 00:01:56.125
And it was just like, this laundry list of annoyances I had with the Java ecosystem, Rails just had an answer that was so nice.
00:01:56.594 --> 00:02:23.955
And, um, but, it was very hard for me to get
Load full transcript
a job because I didn't have any experience, so I, um, I somehow convinced Pragmatic Programmers to let me write a book about Ruby command line applications so that could sort of demonstrate hey, I, I know some Ruby, um, I spoke at a few conferences, and then, uh, got swept up in LivingSocial's massive hiring spree of anyone who'd ever heard the word Ruby before, and that's how I got some actual, actual experience doing it, so.
00:02:24.314 --> 00:02:27.365
And that was probably 2000...
00:02:28.180 --> 00:02:42.629
11 maybe and I got thrown into a project that was like I'd never heard of background jobs or rescue or sidekick or any of that stuff before and this particular project had a ton of that and I had to just sort of trial by fire learn a whole lot about um, how to do that.
00:02:42.629 --> 00:02:44.870
But it was very, it was, it was very informative.
00:02:44.919 --> 00:02:46.129
Um, so
00:02:46.669 --> 00:02:51.039
And, and, and, and now these years later you're, you're, you have a book about Sidekick?
00:02:51.389 --> 00:02:57.240
yeah, I mean I, I've approached this stuff like if I learned something that seems useful to somebody else, yeah.
00:02:57.685 --> 00:03:02.335
I'd like to write it down so that I don't forget and so that maybe somebody else can get some value out of it.
00:03:02.344 --> 00:03:07.555
So, um, yeah, the, the pragmatic programmers, they've, they've tried to do a mix of books.
00:03:07.564 --> 00:03:15.094
A lot of their books historically have been really long, like 200, 300 pages, which is a lot of effort to write one of those, especially a technical one.
00:03:15.094 --> 00:03:16.604
It's, it's, it takes quite a long time.
00:03:17.085 --> 00:03:22.335
Um, so they've been trying to do these other shorter ones that are like 50, 60 pages of like really focusing on a topic.
00:03:22.344 --> 00:03:23.895
And so, um, Yeah.
00:03:24.569 --> 00:03:50.729
You know, as I mentioned, like, after Living Social, Stitch Fix, um, the previous company I was at, tons of background jobs, like, everything was like, wrapped up in background jobs, and I just learned a lot going through the, the crucible of dealing with that in production, so I thought, okay, I think I could capture some of the stuff I wish someone had told me, um, when I first started, and Sidekick being pretty, pretty popular for Rails, um, kind of, kind of fit pretty, pretty well.
00:03:51.819 --> 00:03:53.349
Yeah, that, that makes sense.
00:03:53.889 --> 00:04:03.379
I, I, I'm a big fan of short programming books because, uh, I don't know, it is very difficult for me to read a 400 page programming book all the way through, or, or more.
00:04:03.389 --> 00:04:09.319
Um, I think like sub 200 is really good for me, uh, for somebody with my attention span.
00:04:09.639 --> 00:04:10.289
yeah.
00:04:10.500 --> 00:04:14.919
Okay, so you're, you're telling us about Stitch Fix and, uh, Sidekick and this book.
00:04:14.919 --> 00:04:19.740
So I don't know, what, what kind
of things do you think would trip people up that this might be useful for?
00:04:20.009 --> 00:04:36.649
Yeah, I mean, the thing that, that I really learned, like, um, kind of being responsible for an app that had background jobs in it, and so, like, before LivingSocial, I was, like, of the mindset of, like, well, I've made my program, I've written my code, the tests pass, I'm gonna hand off...
00:04:36.920 --> 00:04:42.860
it to the operations team and the operations team will worry about the database connections.
00:04:42.860 --> 00:04:44.920
And if it goes down, they'll get page.
00:04:44.920 --> 00:04:46.250
And that was sort of mindset.
00:04:46.269 --> 00:04:47.709
So living social was like, none of that.
00:04:47.709 --> 00:04:48.689
It was like you ship it.
00:04:49.245 --> 00:04:51.444
If it breaks, you're on the hook to fix it.
00:04:51.944 --> 00:04:58.375
Um, which is a little jarring to go from not that to that, but it actually made me a lot better programmer.
00:04:58.375 --> 00:05:10.805
Cause then you could see, oh, this, this, this code I wrote that in theory is beautiful and perfect and has these design patterns and it really is elegant, actually falls over in production, doesn't work, and when there's a problem, I can't figure out what it is.
00:05:11.154 --> 00:05:13.545
So then you change the way that you start writing code.
00:05:13.855 --> 00:05:16.444
And so for background jobs, it's really...
00:05:16.970 --> 00:05:20.529
It's very easy to see that because you're running some code.
00:05:20.889 --> 00:05:23.660
It can't run in the request loop because it takes too long.
00:05:23.670 --> 00:05:25.879
The classic example is charging a credit card.
00:05:26.990 --> 00:05:28.050
It takes a couple seconds.
00:05:28.089 --> 00:05:29.500
There's no way to make it faster.
00:05:29.930 --> 00:05:37.910
You can't have all of your web servers sitting around waiting for, uh, you know, Chase to charge your credit card of your customers.
00:05:38.139 --> 00:05:39.360
So you put it in a background job.
00:05:39.959 --> 00:05:42.430
And then it's running and then how do you know when it's done?
00:05:42.430 --> 00:05:43.589
What do you do when it's done?
00:05:43.600 --> 00:05:44.750
What if it goes wrong?
00:05:44.759 --> 00:05:45.959
How do you know it went wrong?
00:05:45.970 --> 00:05:46.470
What if?
00:05:47.055 --> 00:05:55.314
It gets retried automatically and all of a sudden you've charged someone this credit card 20 times and you didn't mean to like there's all these interesting failure modes that happen.
00:05:55.709 --> 00:06:02.569
Because you've sort of made this distributed system out of a web server that's in queuing a job that gets run on some other server some other time later.
00:06:02.949 --> 00:06:12.490
And what to do is, I think there's a lot of like clear ways to manage that, but there's, there was not a, I couldn't find a reference that was specific enough.
00:06:12.490 --> 00:06:15.610
It was like you'd hear, Oh,
make your jobs item potent.
00:06:15.610 --> 00:06:16.689
I'm like, Oh, okay.
00:06:17.019 --> 00:06:18.079
What does that mean?
00:06:18.100 --> 00:06:19.000
How do I do that?
00:06:19.000 --> 00:06:21.829
Practically, you should be monitoring your stuff.
00:06:22.110 --> 00:06:22.540
Okay.
00:06:22.540 --> 00:06:24.579
But like how, like what am I looking for?
00:06:25.029 --> 00:06:28.449
So, you know, after several years of having to actually do it.
00:06:29.055 --> 00:06:34.764
Um, might be nice to have it written down so someone doesn't have to spend several years, uh, the next time.
00:06:35.100 --> 00:06:48.370
Yeah, I guess jobs are a, uh, you know, that sort of background thing is a place where Ruby developers would touch something more like concurrency in a way they would normally don't, right?
00:06:48.504 --> 00:06:49.004
Totally.
00:06:49.430 --> 00:06:54.420
So, I assume you'd probably run into a lot of the classic challenges you would.
00:06:54.704 --> 00:07:04.545
Yeah, and I used to be deathly afraid of it, cause I think early versions of Rails it was unclear if anyone was working to make it thread safe.
00:07:04.555 --> 00:07:15.379
So I, like, like the, the problem you could have is if I have two threads running, threads share memory, and so if thread number one, changes memory that thread number two is accessing.
00:07:16.100 --> 00:07:22.449
It can be extremely hard to predict or even observe what happens, but the result can be kind of catastrophic depending on what you're doing.
00:07:22.959 --> 00:07:26.220
Um, versus what they call process based concurrency.
00:07:26.220 --> 00:07:31.420
So you're running two different Unix processes that have totally separate memory, even though they're running the same code base.
00:07:32.014 --> 00:07:33.144
Their memory is separated.
00:07:33.144 --> 00:07:44.225
So the chance of them like screwing each other up is pretty low, but you're kind of in a degenerate case using double the amount of memory when maybe you don't need to, um, and memory is expensive and all that stuff.
00:07:44.225 --> 00:07:47.485
So you want to use threads, but then Israel's itself thread safe.
00:07:47.855 --> 00:07:48.995
It used to be unclear.
00:07:48.995 --> 00:07:49.704
I think now they've.
00:07:49.899 --> 00:07:52.589
I've done a lot to make sure that, yes, it is.
00:07:52.970 --> 00:07:55.620
But then the libraries, I mean, Rubyists love their singletons.
00:07:55.629 --> 00:07:58.050
They love className.
00:07:58.050 --> 00:07:59.980
columnMethod and who knows what is happening under there.
00:07:59.980 --> 00:08:06.699
But a class in Ruby is really an object that is global and has global state and that gets you back to the shared memory.
00:08:06.699 --> 00:08:15.439
So I used to be very afraid of doing anything multi threaded and I met Mike Perham who makes Sidekiq.
00:08:15.610 --> 00:08:17.069
I think that's the way to say his last name.
00:08:17.420 --> 00:08:21.959
And I asked him, because I had done all these background jobs with Rescue, which doesn't use threads.
00:08:22.379 --> 00:08:24.379
And I, you know, relayed my, like, fear.
00:08:24.379 --> 00:08:29.290
And he's like, I totally get it, but honestly, I've been supporting Psychic for years, and these problems have almost gone away.
00:08:29.290 --> 00:08:30.519
Like, you almost never see...
00:08:30.879 --> 00:08:33.330
Any kind of threading issues, you really should switch to it.
00:08:33.919 --> 00:08:37.289
So I was like, okay, this guy's making his living doing this and supporting it a lot.
00:08:37.299 --> 00:08:41.809
He's probably seen more rails apps with background jobs than anybody.
00:08:41.889 --> 00:08:45.370
So I think that's, it's okay to trust the ecosystem.
00:08:45.379 --> 00:08:54.080
So then of course you still, when you're writing code, you have to be careful about it, but it's a little easier to manage the code you control rather than trusting the code that you don't control.
00:08:54.860 --> 00:08:56.000
I don't know if that kind of got it.
00:08:56.000 --> 00:08:57.090
I was a little all over the place there.
00:08:58.090 --> 00:08:58.370
Yeah.
00:08:58.370 --> 00:08:59.620
No, absolutely.
00:08:59.669 --> 00:09:02.480
Um, no, that, that may, I'm definitely going to get that book.
00:09:02.509 --> 00:09:08.090
Uh, that sounds, that sounds perfect for me because it's short and it's on a topic that I would like to dig into more.
00:09:08.090 --> 00:09:09.950
So it's, it's got, it's got everything.
00:09:10.429 --> 00:09:12.500
Um, so.
00:09:13.259 --> 00:09:27.029
So the reason that I originally, uh, was familiar with you, other than maybe we talked on Mastodon actually, but I didn't put the connection together until later, was that Joel had recommended a separate thing that you wrote called, uh, Solid is Not Solid, which...
00:09:27.375 --> 00:09:29.304
I thought was just great.
00:09:29.384 --> 00:09:52.460
It is, um, it is, uh, well, it's about how the, there are some issues with the, uh, you know, the solid principles and how maybe a couple of them are in there because like it made the acronym work, um, which I thought was, uh, that, that, that sort of thing and how, uh, You know how maybe one of them, uh, I actually, I actually said this chat GPT.
00:09:52.730 --> 00:09:56.409
I pasted in the thing and I was like, does this mean I could never change my code?
00:09:56.419 --> 00:09:57.409
Like, is that a thing?
00:09:57.409 --> 00:09:59.000
And it's like, no, that, that is what it says.
00:09:59.629 --> 00:10:02.210
Uh, with the open closed principle, which that, that was a good one.
00:10:02.529 --> 00:10:06.470
Um, do, do you want to just talk about that and what, what maybe inspired that guy?
00:10:06.975 --> 00:10:15.740
I, I don't know how I, I definitely have noticed over the years, most of what Engineers do with solid as they talk about single responsibility principle.
00:10:16.070 --> 00:10:20.850
Cause it is the most kind of concrete one
and it does feel right.
00:10:20.850 --> 00:10:24.830
And we all kind of know like code that does like too much stuff is a problem.
00:10:24.830 --> 00:10:26.940
So it feels like, okay, that's the thing we can talk about.
00:10:26.940 --> 00:10:30.700
But I just found everyone's arguing like, what is the responsibility?
00:10:30.879 --> 00:10:32.509
And, and, and like, I just saw people just.
00:10:33.519 --> 00:10:41.500
Getting way off the rails, like discussing the meta concept of like what is meant by this principle and like, there's just no good definition.
00:10:41.500 --> 00:10:46.500
And so I went back and I read Uncle Bob, Bob Martin, who kind of coined all these principles.
00:10:46.990 --> 00:10:52.730
I read the paper where he discussed it the first time and it was very vague.
00:10:53.159 --> 00:10:54.870
Um, decoupled.
00:10:55.870 --> 00:11:00.230
And you're like chasing, you know, you're, you're chasing code all over the place to figure out what does it do.
00:11:00.580 --> 00:11:02.090
And like, why did I do all that decoupling?
00:11:02.100 --> 00:11:03.389
Like, what is that buying me?
00:11:03.710 --> 00:11:13.309
And there's this other part, this, this sort of counterpoint to coupling called cohesion, which is like you want a bunch of code in a class, for example, to be kind of cohesive.
00:11:13.320 --> 00:11:15.250
You want it to all make sense together.
00:11:15.519 --> 00:11:16.769
And it's okay.
00:11:17.210 --> 00:11:19.809
To have more than one method or have a class is more than one thing.
00:11:19.809 --> 00:11:21.580
If what that thing it does is cohesive.
00:11:21.970 --> 00:11:25.929
So you're constantly really trying to balance coupling and cohesion, right?
00:11:25.929 --> 00:11:29.559
If you have 80 billion things in your class, it's a mess.
00:11:29.700 --> 00:11:36.120
But if you have only one thing, it's maybe like to decouple and single responsibility principle doesn't help you there.
00:11:36.129 --> 00:11:38.049
It makes it more confusing and kind of worse.
00:11:38.789 --> 00:11:43.009
And so then I read the other papers for the other OL IDs it.
00:11:43.865 --> 00:11:57.085
If, if some of them are nonsense, like the open close principle, but some of them are like uncle Bob was trying to solve a real problem in the nineties about Java and C plus plus that just doesn't exist anymore in a web app or in a rails app or in a Ruby app.
00:11:57.085 --> 00:12:01.414
And so like, I don't, they don't feel like principles to me, right?
00:12:01.424 --> 00:12:06.134
They're, they're just like interesting things you could try if you have a specific problem, but probably you don't need them.
00:12:06.735 --> 00:12:09.284
But people hold them up as this sort of hallowed thing.
00:12:09.284 --> 00:12:13.475
And so I thought, um, might be good to take a little.
00:12:14.240 --> 00:12:15.600
Take a little shot, shot at it.
00:12:15.940 --> 00:12:17.539
Um, which was fun.
00:12:17.970 --> 00:12:20.620
So there were a couple of things from that that I, I really appreciated.
00:12:20.639 --> 00:12:29.399
Um, one was the speaking about cohesiveness because I, so how would I describe this?
00:12:30.289 --> 00:12:35.179
Uh, I generally speaking am wary of patterns that people apply.
00:12:35.695 --> 00:12:40.934
That essentially mean I have to go through one or more middle things to make two other things talk.
00:12:41.210 --> 00:12:41.679
Mm hmm.
00:12:41.889 --> 00:12:42.279
Yeah.
00:12:42.325 --> 00:12:42.945
You know what I mean?
00:12:43.254 --> 00:12:56.815
Uh, there is a, I, I, I feel like this is a thing I've seen a lot where there are a lot of sort of imported patterns and architectures and things where it is meant to make things more decoupled in kind of an extreme way like this,
00:12:56.870 --> 00:12:57.259
Yeah.
00:12:57.965 --> 00:12:58.154
but.
00:12:58.450 --> 00:13:01.909
does not really put any thought into the cohesiveness side of it.
00:13:02.080 --> 00:13:02.490
Yeah.
00:13:02.830 --> 00:13:06.059
Maybe because that is a, um, what was I thinking?
00:13:06.070 --> 00:13:10.850
It's a, you're saying how dry feels kind of, like, solid.
00:13:10.889 --> 00:13:12.629
You know, it feels like something you could talk about.
00:13:12.659 --> 00:13:16.250
It, like, makes sense where cohesiveness is maybe a little squishier.
00:13:16.649 --> 00:13:17.720
Yeah, yeah.
00:13:17.740 --> 00:13:25.090
And so you tend to do things that are like a little easier to understand even though they're not necessarily the right thing to do.
00:13:25.100 --> 00:13:30.559
And there is this pattern running through a lot of the solid principle or kind of patterns.
00:13:30.580 --> 00:13:40.960
And also like the, the classic designs patterns book also has this, which is like adding this flexibility to your code and agile has a lot of questionable things, but it has some good things.
00:13:40.960 --> 00:13:46.970
And one of the good things about agile is like, don't build things that you don't know you need because then you're leaving the door open.
00:13:47.350 --> 00:13:51.490
to address issues when they actually come up as opposed to thinking in advance, Oh, I might have this problem.
00:13:51.919 --> 00:13:56.700
And a lot of these ways to make your code solid involves adding flexibility.
00:13:56.950 --> 00:14:09.259
You don't need adding layers of indirection that maybe you don't need or don't help or making your, um, creating like a class hierarchy and an abstract base class to make this one method like configurable when you don't necessarily need that.
00:14:09.865 --> 00:14:18.725
And it's just odd to me, there's all this stuff that's like making things flexible as a principle, as you should start doing it right now.
00:14:18.965 --> 00:14:25.524
Like yeah, if I need to make something configurable, it's good to know there's a pattern to do that, but you often don't need to.
00:14:26.524 --> 00:14:28.325
So it's just kinda weird to me.
00:14:28.615 --> 00:14:31.434
I'm not quite sure where that came from.
00:14:32.434 --> 00:14:48.335
Yeah, I feel like these, a lot of these patterns are often presented quite dogmatically, like, this is how you should do things, as opposed to, like, this is one way you could do something, but, like, it's not necessarily the right thing for your situation.
00:14:48.794 --> 00:14:54.024
And, like, I guess it's really tempting to try to find those things.
00:14:54.365 --> 00:14:56.144
But they probably just don't exist.
00:14:56.154 --> 00:15:00.075
Like, there is no pattern that you can apply in every situation.
00:15:00.095 --> 00:15:00.524
And
00:15:00.794 --> 00:15:01.335
Yeah,
00:15:01.524 --> 00:15:21.524
we have to, over a long period of time, and exposure to lots of different things that worked, and lots of different things that didn't work, essentially develop a taste, uh, and, like, a sense that might be impossible to distill down to, like, a simple five letter acronym.
00:15:22.075 --> 00:15:23.154
Right, right, exactly.
00:15:23.164 --> 00:15:25.725
Cause there's this nuance of like, when would you do that?
00:15:25.725 --> 00:15:29.514
I mean, before we started recording, we were talking about the Rails schema RB file, right?
00:15:29.514 --> 00:15:31.794
Rails will by default store your schema in Ruby.
00:15:32.424 --> 00:15:38.945
And the reason it does that is because it can recreate that and there won't be things specific to a database in there.
00:15:39.054 --> 00:15:41.054
I would almost never use that.
00:15:41.054 --> 00:15:44.154
I would use the SQL version, cause I want to use the power of my database.
00:15:44.205 --> 00:15:47.865
But, I can't just say always use a SQL schema file.
00:15:47.865 --> 00:16:01.105
I really need to say, these are situations where like, Like, this is why, and here's the situations where that will be a benefit, but there are situations where it might not be a benefit, and I don't want to be responsible for you not thinking it through, right?
00:16:01.115 --> 00:16:14.544
Like, I want to tell you, like, here's the kind of nuance around it, and yeah, that requires a lot more reading or typing or speaking to kind of get the point across versus a kind of snappy acronym, um, which is, which is too bad.
00:16:15.355 --> 00:16:18.804
I really enjoyed, um, Uh, a book.
00:16:18.894 --> 00:16:19.894
I can't remember who wrote it.
00:16:20.284 --> 00:16:22.105
Um, who wrote the refactoring book?
00:16:23.169 --> 00:16:24.720
Oh, Martin Fowler?
00:16:25.034 --> 00:16:37.845
My, is it, I, I really enjoyed that book because I felt like that was just, here's like a hundred different ways that you could refactor some code and maybe make it better depending on this, like, whatever.
00:16:38.054 --> 00:16:40.115
But like, it wasn't like you should always do this.
00:16:40.134 --> 00:16:40.955
It was kind of.
00:16:41.259 --> 00:16:46.419
Or at least the way that I took it, it was just like, here's some code and here's some different code that does the same thing.
00:16:46.639 --> 00:16:54.809
And if you just expose yourself to this, then eventually you start feeling like, Oh, actually, I feel like this would be better this other way.
00:16:54.990 --> 00:16:55.379
Um,
00:16:55.399 --> 00:16:56.299
Yeah, totally.
00:16:56.299 --> 00:16:56.480
Totally.
00:16:56.480 --> 00:16:57.059
Um.
00:16:57.409 --> 00:17:03.690
one that I like to go for is, um, just thinking about like, how many different files do I need to open up to make a small change?
00:17:04.240 --> 00:17:06.750
Um, and that's often where I find that solid.
00:17:07.454 --> 00:17:20.315
Like if you, if you really have like a very solid type architecture, you would end up opening like 14 different files to change this one very small thing because everything is like completely abstracted into different
00:17:20.434 --> 00:17:25.115
right, which means that you've kind of, it's not very, very cohesive, right?
00:17:25.255 --> 00:17:25.684
right.
00:17:26.174 --> 00:17:29.424
And you, and you can bring them all together into a simple, cohesive.
00:17:29.755 --> 00:17:41.204
Um, like object that maybe you, you could say has multiple responsibilities, but all those responsibilities are very crucially related for your application.
00:17:41.275 --> 00:17:43.924
And so like, they do kind of belong together.
00:17:44.335 --> 00:17:45.714
yeah, yeah, yeah, exactly.
00:17:45.714 --> 00:17:48.934
And that's just such a harder, it's just, there's a lot of gut feel to that.
00:17:48.964 --> 00:17:52.460
And like, what is a cohesive concept today may not...
00:17:52.730 --> 00:17:56.140
It may not be that cohesive a year from now and you need, and that's where the refactoring comes in.
00:17:56.140 --> 00:17:58.799
Like, okay, now I've got six methods in here.
00:17:58.799 --> 00:18:00.130
They really do need to be split up.
00:18:00.130 --> 00:18:01.140
Like, how can I do that?
00:18:01.140 --> 00:18:09.410
Well, you know, like, like you said, refactoring probably has a chapter in there that tells you here's exactly how to do it, um, in this exact situation.
00:18:09.410 --> 00:18:13.150
And you can, you know, leverage that knowledge without just applying it dogmatically.
00:18:14.335 --> 00:18:15.805
All right, so I'll have to read that one next.
00:18:15.875 --> 00:18:18.605
Um, I think I own it, but it was pretty
00:18:18.890 --> 00:18:19.670
I think it's a long one.
00:18:19.670 --> 00:18:20.079
Yeah.
00:18:20.329 --> 00:18:24.609
But the long ones, the long ones, if they're written in a certain way, you could use them as a reference.
00:18:25.420 --> 00:18:30.369
So, like, you could just probably drop in and read a couple of random chapters and let it go for a month or something like that.
00:18:31.369 --> 00:18:44.799
When you're talking about jumping between 14 different files to change something, that reminds me of specifically being at one job where I remember thinking to myself, like, going to work, like, because it was one of those,
where I was like, well, this is going to suck.
00:18:45.009 --> 00:18:52.450
Like, as soon as I open my editor, I'm just like, I'm just like, once more to the breach, like, you know, let loose the dogs of war or whatever.
00:18:52.839 --> 00:18:56.529
Um, but, okay, so that, yeah.
00:18:56.750 --> 00:18:57.859
So everybody should read that book.
00:18:57.890 --> 00:18:59.089
I'm a, I'm a big fan.
00:18:59.150 --> 00:19:03.019
Um, I don't know what, what other you've written all these things.
00:19:03.019 --> 00:19:12.799
I don't want to just list them all, but, um, I feel like, uh, you have your agile web development and rails is also kind of a recently updated one.
00:19:12.839 --> 00:19:13.779
I do own that one.
00:19:13.890 --> 00:19:20.700
I haven't read it yet, but that, that one I think is more targeted at like an introduction kind of to intermediate level.
00:19:21.065 --> 00:19:26.345
and the writing on that is kind of making it, keep, making it relevant for new versions of Rails.
00:19:26.345 --> 00:19:30.734
So, like, I actually worked on it with, so Dave Thomas wrote the original version.
00:19:31.255 --> 00:19:57.210
Sam Ruby, last name no relation to the programming language, took it over and then for a few of the editions he and I both worked on it but it was like, it's a weird thing to update a book like that because you, you don't want to change a lot because it's working, um, but you do need to change the code because the thing to do in Rails 3 no longer works in Rails 4 or whatever, or the right way to do it in Rails 5 is, is different, um, But it's a long book.
00:19:57.210 --> 00:20:01.160
I mean, it's 300 some pages and there's like a ton of code in there that all builds on each other and it all has to work.
00:20:01.160 --> 00:20:03.569
And, um, so it's, it's a weird thing.
00:20:03.569 --> 00:20:08.109
It's like a lot of work to not make that many changes or like write a chapter.
00:20:08.109 --> 00:20:12.799
Like, I think I wrote a new chapter, but then it's gone now because the chapter was something about JavaScript.
00:20:12.799 --> 00:20:14.859
It's like just irrelevant, a hundred percent irrelevant now.
00:20:15.210 --> 00:20:17.240
Um, but it made sense for like one version of rail.
00:20:17.240 --> 00:20:20.269
So yeah, the writing introductory material is.
00:20:20.634 --> 00:20:33.795
This is really hard because it's hard to think how, what are they, what's the reader going to know and what are they going to get tripped up on, especially if you're experienced because it's been so long since I didn't know anything about programming it.
00:20:33.825 --> 00:20:39.575
I have to really struggle to try to remember what was it like when I was completely lost and none of this made sense.
00:20:40.464 --> 00:20:43.585
How did I get through it and you know, it's always a development environment.
00:20:43.595 --> 00:20:53.214
Honestly, usually it's like I think everything's right But like the database isn't working because I
don't know what a port is and the ports different for some weird thing Like, you know, it's always that stupid stuff.
00:20:53.214 --> 00:20:57.444
That is really hard to figure out that Um, trips everybody up.
00:20:57.464 --> 00:21:00.944
I don't know why the, the dev environment problem has still yet to be solved.
00:21:01.035 --> 00:21:02.085
They're always terrible everywhere.
00:21:02.085 --> 00:21:04.684
I assume YouTube had that experience everywhere I've been.
00:21:04.684 --> 00:21:05.875
It's been terrible.
00:21:05.914 --> 00:21:08.845
Even when I made it, it was great for a while and then it got terrible afterwards.
00:21:08.845 --> 00:21:10.434
It's yeah,
00:21:11.660 --> 00:21:20.220
Speaking of that, um, you've written a bit in sustainable web development about, uh, how you use Docker for, uh, development environment.
00:21:20.829 --> 00:21:23.059
And that, I find that very interesting.
00:21:23.079 --> 00:21:23.700
I think.
00:21:24.529 --> 00:21:31.119
I've never managed to, or like taken the time to really dig into that and get that all set up.
00:21:31.480 --> 00:21:40.799
But the, the promise of just being able to have every developer at the company run exactly the same thing, you know, and you've got everything in there.
00:21:40.809 --> 00:21:45.339
You've got the database, you've got Redis, you've got like everything that is required for development environment.
00:21:45.650 --> 00:21:48.059
Day one, you say like, what is it?
00:21:48.059 --> 00:21:49.670
Docker compose up or something.
00:21:50.109 --> 00:21:52.130
And then you're, you're, you're set.
00:21:52.930 --> 00:21:54.079
I love that idea.
00:21:54.670 --> 00:22:23.549
It's um, yeah, it's one of those things, so at, at Stitch Fix, we did not have that, and at the point where I was about to leave, there's maybe a hundred some, some developers there, and some of them were using some versions of that, and you kind of see like, well, if I could go back in time, and Docker existed back then, this might have helped some of these problems, um, so like, the, the mental health startup I was at, it was just me, so I, I built everything in Docker, kind of like you described, um, We hired a developer.
00:22:23.599 --> 00:22:25.259
She was able to get everything up and running.
00:22:25.430 --> 00:22:27.569
She replaced her computer, got it up and running.
00:22:27.569 --> 00:22:28.900
We updated Ruby.
00:22:29.680 --> 00:22:32.690
It seemed like it worked pretty good, but that's a data point of, of one.
00:22:33.210 --> 00:22:38.549
Um, and then, uh, I didn't know enough about Docker, but she left.
00:22:38.599 --> 00:22:46.119
And then as I was leaving, uh, my replacement came on and it was during the, the Mac, uh, Apple Silicon transition.
00:22:46.150 --> 00:22:49.490
So I had an Intel Mac and he had an M2 Mac.
00:22:50.105 --> 00:22:53.865
And it kind of worked, but like not exactly.
00:22:53.875 --> 00:22:56.755
Some, there was some weird thing in the emulation that didn't work.
00:22:57.085 --> 00:23:01.315
And I didn't know that you could build a Docker image that had both architectures in it.
00:23:01.315 --> 00:23:04.144
I didn't, I didn't know to even ask if that was possible.
00:23:04.285 --> 00:23:05.525
So I definitely didn't know that it was.
00:23:06.045 --> 00:23:14.194
And so I think that now, I think whoever's working there now is not using the beautiful Docker scripts that I created because they were like, I'm just going to get it working.
00:23:14.525 --> 00:23:27.444
Um, I've since learned how to do that, but yeah, it's a, it's just like, It's a lot of effort to kind of create a nice user experience around these tools, which like the tools theoretically can, can set that up.
00:23:27.454 --> 00:23:33.095
But it's, you gotta have someone whose job it is to keep it running and maintained and keep it evolving and keep it good.
00:23:33.555 --> 00:23:36.555
And on a small team, like you're just not going to.
00:23:37.005 --> 00:23:38.904
It's just gotta be someone out of the goodness of their heart does it.
00:23:39.144 --> 00:23:42.625
Maybe when you get bigger you could have a developer experience team that does that.
00:23:43.835 --> 00:23:47.734
But yeah, I still use it for personal stuff.
00:23:48.035 --> 00:23:56.365
It does work, I have a bunch of projects where the thought of running NPM install and seeing the thousand things that break just makes me sad.
00:23:56.585 --> 00:24:00.404
And so being able to do that in Docker and have it not happen that way is nice.
00:24:01.454 --> 00:24:04.325
But it's probably a little slow I guess.
00:24:04.325 --> 00:24:06.404
Like I don't use Webpack, but Webpack.
00:24:07.015 --> 00:24:11.845
Dev server doesn't really work that quickly under that setup that I have, but I don't know.
00:24:12.154 --> 00:24:13.234
Maybe someone will figure it out.
00:24:13.904 --> 00:24:15.095
Have you tried Orbstack?
00:24:16.095 --> 00:24:16.984
No.
00:24:17.375 --> 00:24:19.644
Is that the um, the faster
00:24:20.095 --> 00:24:21.214
the new faster one.
00:24:22.285 --> 00:24:25.414
The new, the new shiny faster one that doesn't have a price tag yet.
00:24:25.555 --> 00:24:25.835
But
00:24:26.005 --> 00:24:26.724
Yeah, yet.
00:24:27.775 --> 00:24:31.684
I don't know, it's funny, I don't, I wouldn't mind paying for something that was amazing.
00:24:32.144 --> 00:24:32.704
Yeah.
00:24:32.724 --> 00:24:37.464
But I am a little nervous of like, VC backed company hasn't figured out how to monetize.
00:24:38.015 --> 00:24:42.875
And then as soon as I get into their ecosystem, they would get bought by Oracle and deprecated or something.
00:24:42.884 --> 00:24:43.414
I don't know.
00:24:43.424 --> 00:24:44.984
A little cynical over the years, but.
00:24:45.315 --> 00:24:52.795
It's, it's what I'm keeping an eye on, but we're definitely Uh, kind of waiting to see if they come out with some pricing plans.
00:24:53.845 --> 00:24:55.575
Just what their business model is going to
be.
00:24:56.329 --> 00:24:57.609
It's, yeah, it's tough.
00:24:57.640 --> 00:24:59.900
Like, yeah, I don't know.
00:25:00.279 --> 00:25:02.619
I have the same, the same issue with the, um...
00:25:03.470 --> 00:25:09.700
I'm really getting into a new text editor called Zed, but I again, have no idea how they're going to make money.
00:25:10.069 --> 00:25:12.779
And I'm like slightly worried that I'm falling in love with this text editor.
00:25:13.240 --> 00:25:15.019
Like it's going to be taken from me.
00:25:15.160 --> 00:25:18.609
It's going to be like shut down or I don't know.
00:25:19.259 --> 00:25:23.700
I wish they would just like, tell us what they're going to do and like, put it, put a reasonable price price on it.
00:25:24.769 --> 00:25:26.910
Yeah, no, that was also actually a concern with.
00:25:27.355 --> 00:25:31.674
Me for Zed also, and I was gonna say it, but then I'm like, I don't wanna make Joel feel bad.
00:25:31.944 --> 00:25:39.565
Um,'cause I know he likes it Um, but I've actually thought about, uh, Dave, what, what editor, what editor are you on?
00:25:40.605 --> 00:25:41.505
I use Vim.
00:25:42.125 --> 00:25:46.575
Um, I, I had a computer in college that, that was it.
00:25:46.595 --> 00:25:47.224
It was just Vim.
00:25:47.305 --> 00:25:48.625
You had to learn that or you couldn't do it.
00:25:48.634 --> 00:25:50.065
So that's, yeah.
00:25:51.065 --> 00:25:58.295
I keep thinking maybe I should really get my setup there and just do it because then I will never have to change again.
00:25:58.569 --> 00:25:59.269
it's true.
00:26:00.125 --> 00:26:01.744
it's just going to continue existing.
00:26:02.134 --> 00:26:19.880
Um, but my, the thing with Neo Vim for me was that, um, They make setting up LSP so goddamn hard, uh, it is Such a pain in the ass, um, that I got to that point, I spent like an hour on it, and I'm just like, I don't want to do this anymore, so I did something else.
00:26:21.069 --> 00:26:32.970
Speaking of, uh, what you were saying, though, about Docker, what I was thinking, that's, that's another thing where I feel like I spent an amount of time on it, and I'm like, is this going to take me like two days to get running the first time?
00:26:33.289 --> 00:26:34.789
And then maybe lost interest in it?
00:26:35.089 --> 00:26:38.660
Uh, it seemed like kind of a, am, am I missing something there?
00:26:38.660 --> 00:26:40.630
Is it easier than I think it is to get up and
00:26:40.720 --> 00:26:44.779
what I found is that it's conceptually very confusing.
00:26:44.940 --> 00:26:55.650
Um, and so when Um, and I'm someone who like, if I go to like stack overflow and I see you run this command and it will work and I run the command that it works, I'm not a hundred percent satisfied.
00:26:55.650 --> 00:26:58.349
I kind of need to know like, well, why did, why did that work?
00:26:58.930 --> 00:27:02.069
And getting that answer with Docker is not easy.
00:27:02.079 --> 00:27:06.200
The, the, the, the names of the concepts are kind of confusing.
00:27:06.420 --> 00:27:10.170
If you're, I'm assuming they make sense to someone who's like a professional.
00:27:10.819 --> 00:27:11.880
Technical operations person.
00:27:11.880 --> 00:27:12.329
I don't know.
00:27:12.329 --> 00:27:14.670
But to me, a lot of the names don't make sense.
00:27:14.670 --> 00:27:15.799
The concepts are weird.
00:27:16.380 --> 00:27:18.470
The documentation isn't that great.
00:27:19.200 --> 00:27:25.950
But when you dig and you get a sense of the technology underneath is pretty solid, but it's just very hard to figure out.
00:27:26.480 --> 00:27:29.849
I'm not sure how it works and why it's doing what it's doing and why it's not working.
00:27:30.339 --> 00:27:34.769
And then of course, because ultimately what it's doing under the covers is downloading these massive images.
00:27:35.359 --> 00:27:37.890
The iteration cycle is, is slow.
00:27:38.390 --> 00:27:42.809
I mean, I remember being at a coffee shop one time doing this and I'm like, Docker Compose up! And it's just like...
00:27:43.595 --> 00:27:47.384
I'm never going to download all of these things over coffee shop wifi.
00:27:47.384 --> 00:27:52.555
So that means I just can't work on it unless I'm at home and that's just different from a lot of things.
00:27:52.555 --> 00:27:59.654
But, um, yeah, uh, it's, I, I, I don't, I don't know.
00:27:59.944 --> 00:28:00.875
I think it's not you.
00:28:00.875 --> 00:28:08.875
I think it is hard to learn and I don't think the Docker company is doing a great job of making it easy to, easy to learn from a lot of different.
00:28:09.224 --> 00:28:10.434
A lot of different angles.
00:28:11.434 --> 00:28:22.595
Yeah, because the, the promise of it, not, not so much for me in, um, in having the, you know, like thing I can just have contained and easy to run in different systems.
00:28:22.884 --> 00:28:29.825
What's really appealing about it to me is I paid for 64 gigabytes of RAM and I, I think it would give me the opportunity to use all of them.
00:28:31.055 --> 00:28:37.015
I think if I got that Slack and Ruby mine at the same time, I could probably use all
00:28:37.055 --> 00:28:39.055
it definitely uses a lot of memory.
00:28:39.744 --> 00:28:54.799
Okay, so you also do, you have a couple of open source things, uh, and one of them seems like it's fairly, like, it's out there, called GLI, uh, which is, it's a DSL for making Like git style where you can have like commands and subcommands.
00:28:54.869 --> 00:29:07.049
Um, that makes sense, but what, so I, I noticed that two of the open source things you, you list are, uh, are, um, command line libraries.
00:29:07.079 --> 00:29:14.029
And then one of the books you wrote was about the first book you wrote was about that, which I was kind of bummed isn't a book you can get anymore because, um, that sounds awesome.
00:29:14.434 --> 00:29:14.835
Yeah.
00:29:14.835 --> 00:29:23.464
You know, they, it's out of print and they basically the deal
with them that they're when the book is out of print, then the two things can happen.
00:29:23.474 --> 00:29:31.954
They can say, do you mind if we have another author take it over and you will make 0 on it or, or not, right?
00:29:31.954 --> 00:29:33.075
They may or may not do that.
00:29:33.305 --> 00:29:36.865
Or I own the copyright so they're like, you can have the copyright and do whatever you want to it.
00:29:36.875 --> 00:29:39.644
So I guess in theory I could take it and republish it.
00:29:39.994 --> 00:29:51.325
Um, It is, some of it is a little out of date and I do have it on my list to like go back and revisit that because it was, it, it did sell pretty well and it was pretty popular and I do think Ruby is great for any command line apps.
00:29:51.775 --> 00:29:54.884
Um, so it's on my list to revisit at some point.
00:29:54.884 --> 00:29:57.335
I just haven't, haven't got to it.
00:29:57.335 --> 00:30:02.144
I think it's probably more of a more effort than just kind of recompiling it, so to speak.
00:30:02.535 --> 00:30:03.355
Yeah, for sure.
00:30:03.355 --> 00:30:13.184
When you were talking about the, uh, Agile web development book, it made me think you were basically talking about it the same way you would talk about like a legacy application, right?
00:30:13.194 --> 00:30:20.934
Of that, you know, it's this thing you're, you're trying not to change too much because it's like work, but also, and also it's working.
00:30:21.224 --> 00:30:26.105
Uh, and, but you are also trying to, you know, get it to where it needs to be.
00:30:26.365 --> 00:30:28.585
Um, I thought that was really interesting.
00:30:28.894 --> 00:30:35.295
Uh, how do you, so I guess, If somebody were interested in writing a book, where would you recommend they start?
00:30:35.335 --> 00:30:40.174
Because the idea to me, I got asked to write an essay the other day for a job.
00:30:40.315 --> 00:30:43.375
And they were like, it should be six to eight pages for this interview.
00:30:43.375 --> 00:30:44.954
And they were paying me, so I totally did it.
00:30:45.325 --> 00:30:46.984
But, uh, which is great.
00:30:47.015 --> 00:30:48.055
I love it when jobs do that.
00:30:48.055 --> 00:30:49.724
When they pay you for the interviews.
00:30:50.095 --> 00:30:59.029
Um, but, my, my immediate thing was that is, Uh, with that was, I don't, I don't know if I have eight pages to say about a lot of things.
00:30:59.029 --> 00:31:02.859
That's, that's, that's very daunting to me, uh, let alone like 300.
00:31:03.240 --> 00:31:11.599
It's weird because like, so these, um, these, what they call express titles at Pragmatic that are like, they want to do something that's like 50, 60 pages.
00:31:12.109 --> 00:31:17.474
Um, I found it actually really hard to, Only write 50 or 60 pages.
00:31:17.484 --> 00:31:25.525
Like I had several more chapters of sidekick background up things and they were like, just write this as a blog post and those can be, um, you know, mark marketing content
for the book.
00:31:25.545 --> 00:31:28.055
And I was like, okay, that seems, that seems fair enough.
00:31:28.065 --> 00:31:34.394
So it can be hard, but I think you got to start with like, you have to like to write and you have to really want to express.
00:31:35.259 --> 00:31:58.049
Some opinion or information, um, in the written word, like the, the, what, how do I want to say like the, like a book is a, is where you can really just fine tune how you're thinking about something or really get very specific about how something should work or why something is like that nuance we were talking about before you can, the book is where that nuance can be explained.
00:31:58.589 --> 00:32:07.109
Um, and so if you like doing that, if you have the thoughts there, This It's the perfect format for that, um, beyond.
00:32:08.109 --> 00:32:12.769
Versus, some people are like, oh, I will write a book on X because that'll be a good way to learn about it.
00:32:13.710 --> 00:32:23.599
That doesn't work for me, I find that a little frustrating because what happens is you write 150 pages and you're like, well, I need to start over now that I've really learned this thing, um, which is, which is hard.
00:32:23.599 --> 00:32:31.150
So I like to start from, I know this, so I'm not solving the problem of what's the way to do this, or what is my opinion, or what is the...
00:32:32.109 --> 00:32:34.190
How do I want to, you know, what am I trying to say?
00:32:34.190 --> 00:32:41.609
It's more like, how do I get this organized in a way that it lands, um, in a way that as many people as possible could possibly could understand it.
00:32:42.029 --> 00:32:47.730
Um, and, and, you know, all of that is, you're not going to make a living doing it, so you kind of have to love it.
00:32:47.970 --> 00:32:49.150
You're going to have to want to do it.
00:32:49.529 --> 00:32:50.769
Um, and.
00:32:51.634 --> 00:32:58.355
You know, kind of stick with it and get it and get it done, which can take a long time, but 50 pages can be done in a month.
00:32:58.494 --> 00:33:04.545
300 pages is going to take a lot longer than that, even if you know it back and forth, it's, it's still a lot more work.
00:33:05.009 --> 00:33:06.799
Do you like outline these things before?
00:33:06.799 --> 00:33:09.150
Kind of try and collect your thoughts in that way?
00:33:09.170 --> 00:33:12.079
Or do you kind of go just start writing?
00:33:12.079 --> 00:33:13.140
Like, what does that even look like?
00:33:13.484 --> 00:33:16.325
Yeah, I mean, I know other people do different processes.
00:33:16.345 --> 00:33:18.644
I, I will start with an outline.
00:33:19.154 --> 00:33:26.694
Um, and try to, like, I imagine like if I'm in the bookstore or I'm looking at the table of contents.
00:33:27.335 --> 00:33:31.035
It should say exactly what is in the book and what the person is going to learn.
00:33:31.414 --> 00:33:35.585
Um, and so, try to make sure, like, everything is in there.
00:33:35.585 --> 00:33:38.484
And then, from there, I'll start writing.
00:33:38.484 --> 00:33:45.595
And sometimes you'll go off from, you know, you'll get to the end of a few sections, and you're like, well, where I thought this would go is not right, so I'm going to change it.
00:33:45.595 --> 00:33:52.154
And that's, that's fine, but I, you know, try to end up where I thought I was going to end up, even if the journey kind of changes.
00:33:52.154 --> 00:33:56.644
But for me, definitely having an outline, especially if it's going to be more than just a blog post.
00:33:57.855 --> 00:34:01.424
Um, just, just to keep it kind of organized is, is helpful.
00:34:01.845 --> 00:34:06.914
Um, but then the writing process, like, I don't know if you've heard of the, the shitty first draft concept.
00:34:07.505 --> 00:34:12.014
So you just get it, you just get it down and try not to edit, try not to think about it.
00:34:12.014 --> 00:34:16.429
Just get all the words out of yourself and then you can go back and make it.
00:34:16.750 --> 00:34:17.559
Make it better, right?
00:34:17.559 --> 00:34:20.199
It's like the, the writing version of TDD, right?
00:34:20.210 --> 00:34:21.239
You get the code down.
00:34:21.269 --> 00:34:24.460
You don't worry if it's terrible, but you get it working.
00:34:24.480 --> 00:34:27.139
And then once it's working, you can go back and make it nicer.
00:34:27.139 --> 00:34:31.400
So like writing kind of kind of works the same way, or at least in my mind it does.
00:34:32.400 --> 00:34:46.349
It's probably something where if I started doing it, it would become clear what the path would be, uh, because I do like writing blog posts, uh, however, I get to a certain length of about a thousand words or so, and I'm like, and that's it, I'm done.
00:34:47.530 --> 00:34:51.440
And then that section is like, conclusion, I'm done, and then the blog post is over.
00:34:51.675 --> 00:35:04.934
Having a time set aside, like, if you can fit it into, it's like any habit, like if you can fit it into your day so that you're like, now is the time when I'm writing, and it doesn't feel like this extra exhausting thing you have to somehow fit, that can help.
00:35:05.025 --> 00:35:10.684
Um, yeah, I, uh, the first one I did, I didn't, I just did it every moment.
00:35:10.885 --> 00:35:15.505
I had and, um, you know, my wife was like, Hey, should we do something?
00:35:15.505 --> 00:35:16.804
I'm like writing Kent, you know?
00:35:17.074 --> 00:35:19.914
So then I realized like I wake up earlier than her.
00:35:19.914 --> 00:35:28.085
So I would just do it in the morning before, like I get up, have breakfast and do my writing and then she would wake up and then we'd hang out and then both go to work and that, that worked better.
00:35:28.085 --> 00:35:31.505
So then I never worried about, am I going to find time for it?
00:35:31.505 --> 00:35:32.594
Cause I knew I always had that.
00:35:33.054 --> 00:35:45.295
Time set aside, took a little bit of the stress off, but it's
still like you're reading a hundreds of pages every week to like read what you wrote over and over again to make sure it makes sense, make sure it's good.
00:35:45.755 --> 00:35:52.905
Um, I mean, at least you can do updates to books, but you know, like, I mean, Joel, you just held up the paper version.
00:35:52.905 --> 00:35:54.284
Like that's not getting updated obviously.
00:35:54.284 --> 00:36:00.405
So I have to try to make that as good as I can cause I know someone's going to have that physically in front of them and I want to not be.
00:36:00.675 --> 00:36:02.585
Totally embarrassed by what they bought.
00:36:03.585 --> 00:36:16.914
Yeah, I, I feel like when it comes to writing that I feel like I'm missing a bunch of design patterns that writers must have that I know they must have because I know what that that's what it's like when you write software.
00:36:17.500 --> 00:36:27.170
And like, I, I feel like I'm a junior programmer trying to make my code work and I'm just missing all of these tools that must be out there.
00:36:27.679 --> 00:36:30.110
Um, and I just find, I find it incredibly difficult.
00:36:30.119 --> 00:36:30.800
Like, I've...
00:36:31.179 --> 00:36:45.079
I'm trying to write a book at the moment and I'm finding it incredibly difficult to figure out, like, when I've got multiple concepts that, like, depend on each other, how do I present one of those concepts, um, without the others?
00:36:45.170 --> 00:36:48.969
Like, which one do I, which one do I present first and how do I, how do I build up to it?
00:36:48.980 --> 00:36:54.809
Like, how do I organize this so that you understand what I'm talking about when I'm referencing all of these different things?
00:36:55.000 --> 00:37:01.309
Um, and there must be the tools that people use that they kind of, like, could apply.
00:37:01.735 --> 00:37:04.894
To that problem, or whatever, or whatever problem you have.
00:37:05.195 --> 00:37:05.724
Yeah.
00:37:05.784 --> 00:37:09.985
I mean, work, so working with the publisher, they give you what they call developmental editor.
00:37:09.985 --> 00:37:19.235
And so that person is kind of gives you feedback along those lines and they're often not, I hate to use the word technical or not, but they're often not programmers.
00:37:19.869 --> 00:37:26.920
Or if they are, they're often not familiar with whatever it is you're writing about, but they can follow it and they can sort of figure out if things don't make sense.
00:37:27.380 --> 00:37:30.840
And they can be this sort of like the smartest, dumb reader of your book.
00:37:30.840 --> 00:37:34.650
So they can ask questions that are like really helpful and get this feedback.
00:37:34.659 --> 00:37:45.280
And I mean, it can be sometimes hard to get feedback about, I mean, I don't know about you all, but my experience in programming is you don't get a lot of feedback and it's not often very critical.
00:37:45.280 --> 00:37:48.460
And so when you do get critical feedback, it's kind of unpleasant, but.
00:37:48.909 --> 00:38:01.739
You will get it and it makes it better and so they, that helps a lot, um, I think like the most specific thing I can think of that's along those lines is like, go slower than you think you should.
00:38:02.300 --> 00:38:12.800
Um, don't, don't use words like this and that and thing and it's like use the actual word because the reader is going to forget what, what you're reading.
00:38:13.139 --> 00:38:17.139
Like just, just assume that they are remembering way less than you might think going through it.
00:38:17.639 --> 00:38:26.880
Um, and then tell them what the code is going to be before the code, not vice versa, which was, that was the hardest one for me cause I'm.
00:38:27.494 --> 00:38:28.994
It's easier to say, here's the code.
00:38:29.014 --> 00:38:29.925
Now let's talk about it.
00:38:29.925 --> 00:38:30.885
Cause that's how you work, right?
00:38:30.885 --> 00:38:33.905
You write your code and then you have like a pull request review or whatever.
00:38:34.344 --> 00:38:39.574
But like a lot of times if the code is too long, like more than a few lines, it can be really confusing if you're just learning.
00:38:39.574 --> 00:38:41.684
So you have to say, all right, we're going to do this.
00:38:41.695 --> 00:38:46.835
Or if you want to talk about a 10 line routine, you may have to say the first three lines, we're going to do this and here's why.
00:38:46.844 --> 00:38:52.744
And the first three lines and now we're going to do these and that going slower, uh, does help it.
00:38:52.775 --> 00:38:54.335
I, it was not natural to me.
00:38:54.385 --> 00:38:56.715
Um, but it is better when I look at.
00:38:57.114 --> 00:39:03.434
Like when I've changed to do that, um, but just having the feedback and someone else who like can help us is nice.
00:39:03.434 --> 00:39:10.414
Doing it alone is hard cause you got to find some way to get feedback and not everyone's going to, Oh yeah, I'll read your 300 page book and give you notes.
00:39:10.414 --> 00:39:14.284
Like no one's going to do that, but I'd be happy to look at whatever you're doing.
00:39:14.315 --> 00:39:15.275
I do like doing it.
00:39:15.275 --> 00:39:17.264
So if I can, I love helping people, right.
00:39:17.264 --> 00:39:19.425
And so if I can, if I can help them happy to do it.
00:39:20.425 --> 00:39:21.244
Thank you very much.
00:39:22.244 --> 00:39:37.465
So, so when we were asking you, uh, about, you know, things we may talk about, uh, one of the things you, you, you threw out a couple of bullet points in an email, and one of them was always up to talk about rails and not putting business logic into active records.
00:39:37.704 --> 00:39:46.914
So, uh, I, I don't know if we will have extremely different opinions than you on that, but I am interested to hear what yours are in case one of us does.
00:39:48.034 --> 00:39:48.565
Yeah.
00:39:48.585 --> 00:39:53.894
So, um, I w the first rails up, I worked on was a monolithic rails app.
00:39:55.090 --> 00:40:02.500
And they, they did what seemed right, which is app models are your model driven development models of your domain.
00:40:02.860 --> 00:40:05.559
So therefore you should put your business logic in those models.
00:40:06.170 --> 00:40:09.349
And if some of them happen to be also a database table, well, that's just.
00:40:09.735 --> 00:40:10.594
Part of rails.
00:40:10.664 --> 00:40:13.125
Um, it was a disaster zone.
00:40:13.144 --> 00:40:15.554
I mean, it, it was just absolutely horrible.
00:40:15.934 --> 00:40:18.034
Um, working in it was unpleasant.
00:40:18.565 --> 00:40:19.684
The use, right?
00:40:19.744 --> 00:40:26.554
Every, every app has their one model, usually the user, but some model that's like used by everything that's like related to what the app does.
00:40:26.554 --> 00:40:34.065
In this case, the user, I mean, it had like the first 50 lines were includes of modules and those modules were hundreds of lines long.
00:40:34.074 --> 00:40:37.385
I mean, the, the user object probably had thousands of methods on it.
00:40:37.675 --> 00:40:38.554
It was just untenable.
00:40:38.985 --> 00:40:44.065
Um, Does that mean that conceptually putting code like that in there is wrong?
00:40:44.414 --> 00:40:44.985
I don't know.
00:40:45.054 --> 00:40:48.625
Um, but talking to other developers, they had had similar experiences.
00:40:48.675 --> 00:40:52.474
And so at stitch fix myself and another developer, there were there early.
00:40:52.855 --> 00:40:57.644
I mean, we were writing, we were, we were saying the exact same things to each other and we were like, let's just not do that.
00:40:57.724 --> 00:40:59.335
Let's just just not do that.
00:40:59.335 --> 00:40:59.965
See how it goes.
00:41:00.275 --> 00:41:01.255
So that's what we did.
00:41:01.255 --> 00:41:08.094
And so In, if you want to make logic, we decided we put it in app services to have another place for it.
00:41:08.094 --> 00:41:11.445
That would be very obvious that that what that was for.
00:41:11.934 --> 00:41:13.175
And that's just where that stuff would go.
00:41:13.184 --> 00:41:14.625
And you just make a class, right?
00:41:15.005 --> 00:41:19.784
It'd be called whatever user creator and had a deaf create, like just don't think too hard.
00:41:20.284 --> 00:41:23.144
Just put the code somewhere else, literally anywhere else.
00:41:23.454 --> 00:41:24.465
And let's see how it goes.
00:41:25.005 --> 00:41:26.204
And it was, it was nice.
00:41:26.315 --> 00:41:26.905
Um.
00:41:27.340 --> 00:41:29.530
The, those classes were not large.
00:41:29.570 --> 00:41:31.130
They were pretty easy to understand.
00:41:31.579 --> 00:41:44.210
Um, and what I thought was really interesting was as we hired more developers, um, I don't remember having a lot of conversations about like, you need to write the code this way, but people just did.
00:41:44.369 --> 00:41:48.360
Um, and that told me that there was some value in doing it that way.
00:41:48.769 --> 00:41:49.719
Now, maybe.
00:41:50.059 --> 00:41:56.139
Someone at GitHub or Shopify or Basecamp has some secrets for how to avoid that mess that I was talking about.
00:41:56.300 --> 00:42:00.909
And I'd love to know what that is, but I've never heard of, I've never heard of anything like that.
00:42:00.920 --> 00:42:07.519
So, um, that's kind of a super kind of pragmatic practical reason why I go down there and I can.
00:42:08.099 --> 00:42:20.340
I have some retro, retconned reasons why I think it works, um, but that's kind of like how I got to it, and I was just very happy with that, and other developers seem to be, so, I don't know.
00:42:20.489 --> 00:42:29.030
But again, this is one experience for one person, so, uh, who knows what cosmic forces might align elsewhere to make this a bad idea.
00:42:29.675 --> 00:42:39.735
Yeah, I'm interested to hear what you have to say about that, Joel, because I think my thinking may be clouded by not having worked on as many really, really large Rails things.
00:42:40.184 --> 00:42:44.835
Um, but, uh, but you have done more of that, so I'm curious what you think of that.
00:42:45.215 --> 00:42:47.494
Yeah, this, this is a tricky one.
00:42:47.514 --> 00:43:02.454
I think, um, I'm always torn between, uh, feeling like, like, doing too many service objects overcomplicates things, and means that you have to have...
00:43:02.829 --> 00:43:05.769
Like 14 different files open when you're trying to make one change.
00:43:06.210 --> 00:43:08.099
Um, we talked about earlier in the show, I think.
00:43:08.150 --> 00:43:18.969
Um, and, uh, I think like I, I, I, one alternative approach is just try to model smaller things.
00:43:19.760 --> 00:43:32.050
Um, and if you're, if your model is like thousands of lines long, there are probably smaller concepts that you can extract from that model that themselves are significantly smaller.
00:43:32.579 --> 00:43:33.820
Um, like.
00:43:34.204 --> 00:43:40.114
And, and maybe this is just another, another way of approaching what are essentially service subjects.
00:43:40.114 --> 00:43:49.914
But like, one example is instead of, uh, having like create user as a service, you could have a user creation as a model.
00:43:50.664 --> 00:43:56.414
Um, and like, it's kind of almost exactly the same thing.
00:43:56.414 --> 00:43:59.364
You're still breaking it down, but you're just trying to.
00:44:00.364 --> 00:44:10.744
Your user creation doesn't necessarily, um, this is probably not very great example, but it does, these other models don't necessarily do just one thing.
00:44:10.755 --> 00:44:19.304
They might be doing two or three things that are related to the two or three attributes that they, um, kind of manage.
00:44:19.605 --> 00:44:21.744
They're like these simple kind of value objects.
00:44:22.255 --> 00:44:28.675
Um, so I kind of try to think about it like that, um, is like, if I can take these.
00:44:29.619 --> 00:44:33.260
These three arguments that are being passed
around, turn them into an object.
00:44:33.820 --> 00:44:44.170
And then anything that is related, like things that we apply to those three arguments, those three like objects together, we can model in that model.
00:44:44.760 --> 00:44:47.670
Um, as long as it has a, you can come up with a good name for it.
00:44:48.289 --> 00:44:52.239
Um, so I do, I think that's another approach and I don't think it's.
00:44:52.739 --> 00:44:56.949
Completely opposite to service objects.
00:44:57.010 --> 00:45:10.139
Um, but I think that my understanding is that service objects are more about like, try to take every action that you can do and make that be like, it's essentially like a callable object, like an, an event or a
00:45:10.170 --> 00:45:10.840
Yeah.
00:45:11.284 --> 00:45:12.485
Yeah, it's, it's interesting.
00:45:12.485 --> 00:45:16.804
Cause like you're, you're getting across sort of two concepts, which, which always make this topic hard to talk about.
00:45:16.804 --> 00:45:28.465
So one is what you're is like, okay, if we're agreed that our methods don't have to go in the active records always that we could put them in another class, that's one thing.
00:45:28.465 --> 00:45:31.824
But then the second part is given that what's the structure of all that.
00:45:31.835 --> 00:45:33.074
And for me,
00:45:33.150 --> 00:45:33.840
Exactly.
00:45:34.239 --> 00:45:39.250
The structure of all that is less important than just don't put it in the active records.
00:45:39.250 --> 00:45:44.639
Like, I feel like if the, if it was called app active records, we would never have this discussion.
00:45:45.019 --> 00:45:50.510
Cause those, those, those active records are, in my mind, they're models of a database table.
00:45:50.650 --> 00:45:52.360
And they're great models of a database table.
00:45:52.760 --> 00:46:01.219
But like, the, the create method of my user active record is not where you implement the business process of what happens when a user gets created.
00:46:01.239 --> 00:46:01.940
You could.
00:46:02.255 --> 00:46:04.764
But I don't think that's what that's really, really for.
00:46:05.175 --> 00:46:09.844
Um, and so where that goes, I think like what you described makes a lot of sense.
00:46:09.875 --> 00:46:11.565
I've seen that seems reasonable.
00:46:11.934 --> 00:46:16.775
Um, I, I'm not a big fan of the make every method called call, but I've seen that too.
00:46:16.804 --> 00:46:17.715
That's another thing.
00:46:18.105 --> 00:46:26.195
So it's, it's hard to pick it apart, but the, and I guess maybe, you know, I was saying before, what does Spotify and GitHub and Basecamp do?
00:46:26.425 --> 00:46:29.025
I think you've seen what Basecamp does and they just make a bunch of modules.
00:46:29.460 --> 00:46:32.960
That do that and they include them in whatever active record makes the most sense to them
00:46:34.170 --> 00:46:37.159
That, that has been my impression from, uh, from reading things.
00:46:37.420 --> 00:46:47.309
Yeah I absolutely hate that, it just drives me bananas and I don't see the value in it, but obviously it works for them, so that's cool, so that's one way to do it.
00:46:48.010 --> 00:46:56.920
But other than that, I don't know, I feel like if I could just wave a magic wand to every Rails developer, it'd be like, just don't put that code in the active record.
00:46:57.000 --> 00:46:58.369
Put it literally anywhere else.
00:46:59.039 --> 00:47:01.929
Don't put it in the controllers either, but you know what I mean, like don't put it in the active record.
00:47:03.030 --> 00:47:17.139
But having a, um, Having a way to, like a, a, a pattern is, is good because you can also do like, like if, if half your team does what Joel, you were saying, and the other half does what I'm saying, that's kind of worse in a lot of ways.
00:47:17.150 --> 00:47:18.250
So you don't want that either.
00:47:18.260 --> 00:47:21.489
Um, so you need some, some guidance.
00:47:22.489 --> 00:47:27.570
I, I do think some of this is just clouded by not having worked on as many really, really large Rails things.
00:47:28.059 --> 00:48:06.554
But I, I do want to kind of, when I think of like cohesiveness, right, I'm trying to keep the, this may be the mistake your coworkers went down though, uh, where you were saying like they started off with like a good thought of like, this is our domain object, so it should, uh, It should build off of that, that, that intuitively makes sense to me, um, although I can, as you say it, I do understand that doing something different, my thing is always like, the interface may be there, but like, what's behind that interface is pretty flexible, um, so I don't know.
00:48:07.554 --> 00:48:23.065
Like, I wouldn't literally have all the code in those modules, like they probably would still be using other objects and stuff, but they, but I may, it does kind of make intuitive sense to me to expose a lot of that through there, although I do understand what you're saying.
00:48:24.070 --> 00:48:24.500
Yeah.
00:48:24.530 --> 00:48:27.610
I mean, another angle I think about this too, is like.
00:48:28.400 --> 00:48:35.829
If you're gonna write, if you're gonna change or add some code to the app, like how many decisions do you need to make to figure out where that code goes and what it should look like?
00:48:36.300 --> 00:48:39.480
And ideally it's zero.
00:48:39.489 --> 00:48:41.019
You just know exactly where it should go.
00:48:41.050 --> 00:48:44.679
Um, not ideally it should be a lot like, okay, should this be in a module?
00:48:44.690 --> 00:48:46.829
Should the module delegate to an object?
00:48:47.079 --> 00:48:49.050
Should it go on app services or app models?
00:48:49.610 --> 00:48:51.050
Should it be in a namespace?
00:48:51.050 --> 00:48:56.000
Like you wanna minimize those or make those decisions like very, very easy to kind of arrive at.
00:48:56.440 --> 00:49:04.380
Um, and for me, like the stupidest, easiest way is like, just put it in app services and make
a class.
00:49:04.385 --> 00:49:05.190
You could figure it out later.
00:49:05.195 --> 00:49:18.110
Um, but it to, to your point Colin, it, it looks ridiculous at a small rails app to go into a controller and have it be like user creator create, and then the user creator create method is just user create.
00:49:18.525 --> 00:49:19.804
That does look ridiculous.
00:49:20.164 --> 00:49:23.045
Um, and so someone seeing that would be like, what is going on here?
00:49:23.045 --> 00:49:23.985
This doesn't make any sense.
00:49:24.594 --> 00:49:36.045
Um, so it, it, it is, it is hard to kind of make the app look the way you want and be easy to work with for you know, the size that you're at or the problems that you're trying to solve.
00:49:36.045 --> 00:49:39.264
And you know, that's the that's the whole problem with it, I guess.
00:49:40.264 --> 00:49:43.974
It really does depend on the size of your app and, and your team, I think.
00:49:44.559 --> 00:50:01.969
Like if you have thousands of developers working on, you know, an app with millions and millions of lines of code, then that pattern is not going to look as ridiculous, like, you know, that because creating a user is going to be doing a thousand different things.
00:50:01.969 --> 00:50:05.940
It's not going to be just delegating back to the user model.
00:50:06.460 --> 00:50:11.429
Um, so I fit, I think that there's, it's not like.
00:50:12.429 --> 00:50:14.320
It's not like a binary thing.
00:50:14.880 --> 00:50:26.550
Um, and sometimes it might just be a case of like, if you have this model, that maybe your user model usually is the user model is getting out of control.
00:50:26.960 --> 00:50:28.309
Then start there.
00:50:28.539 --> 00:50:38.519
Like if that's a problem, then start extracting things, make, make things smaller, um, try to figure out what, what ways you can group things up.
00:50:39.050 --> 00:50:51.090
Um, And, and yeah, the thing, the thing for me is like thinking about, um, thinking about events as objects as well.
00:50:51.440 --> 00:50:53.940
So like a user creation is.
00:50:54.414 --> 00:51:04.815
Is an object, whether, whether you make that like a service that's create user or a model, which is user creation, you're still essentially modeling an event and it's okay.
00:51:04.914 --> 00:51:09.885
Like that is just that idea of like, I can't find the right model.
00:51:09.885 --> 00:51:10.635
I can't find the right model.
00:51:10.644 --> 00:51:13.074
Well, maybe the, the thing that you're doing is.
00:51:13.469 --> 00:51:15.539
That's the thing you're trying to opt to model.
00:51:15.949 --> 00:51:19.280
Um, I think that idea can be really, really helpful.
00:51:19.510 --> 00:51:26.750
Yeah, it is interesting how If you fit everything into an event kind of thing, like they all, they all kind of are right.
00:51:26.750 --> 00:51:29.869
It's, it's pretty easy to, to, to think of stuff like that.
00:51:30.250 --> 00:51:33.030
Um, and yeah, that can be.
00:51:33.474 --> 00:51:35.364
We, we did some of that at, at Stitch Fix.
00:51:35.369 --> 00:51:38.724
And it, and it, it, it helps to decouple things that don't need to be coupled together.
00:51:38.755 --> 00:51:40.795
'cause and then to come back to background jobs, right?
00:51:40.795 --> 00:51:51.264
A background job is kind of like, here's an event and you kind of launch it into the ether and like, it has to be decoupled because it's, it's lost all the context of the controller method that it was in.
00:51:51.324 --> 00:52:00.614
And that forces you to, or requires you to, to write the code in a certain way to, you know, to make sure that's manageable and, um, yeah.
00:52:00.675 --> 00:52:18.835
Um, And hopefully there's someone on the team who's, like, thinking about that and watching it and knows, uh, this looks like a mess waiting to happen, let's spend some time cleaning this up, um, and everyone is like, yeah, we should do that, or, you know, we don't feel pressured to just keep shoveling things into the mess and worrying about it later.
00:52:19.835 --> 00:52:28.614
It's, it's so easy when you have a file that has like 6, 000 lines in it and you like to just add three more,
00:52:28.949 --> 00:52:29.840
I know, yeah,
00:52:30.065 --> 00:52:31.474
you know, um,
00:52:32.204 --> 00:52:38.405
I mean, we haven't talked about CSS, but there, there is a CSS file at living social called JSIO dot CSS.
00:52:38.934 --> 00:52:39.994
And that's where all the CSS went.
00:52:39.994 --> 00:52:41.414
It was an append only CSS file.
00:52:41.425 --> 00:52:43.014
It was thousands of lines long.
00:52:43.764 --> 00:52:46.465
And I was like, what is, what is, why is it named that?
00:52:46.485 --> 00:52:48.085
It was stood for just shit it out.
00:52:48.639 --> 00:52:57.250
Because there was like this, this sort of ethos of the company that was like, try everything, just, just shit something out really quick, uh, to see if it works product wise.
00:52:57.579 --> 00:52:59.800
And I guess that was applied to the code too.
00:52:59.809 --> 00:53:02.519
Let's just just keep throwing it in there and we'll worry about it later.
00:53:03.170 --> 00:53:04.050
And this is wild.
00:53:05.050 --> 00:53:06.610
Sorry for the bleeping you're going to have to do.
00:53:06.610 --> 00:53:09.070
I trying not to use too many curse words, but
00:53:09.485 --> 00:53:12.175
Now we're definitely not going to do that.
00:53:12.204 --> 00:53:15.875
Um, but, uh, the, um.
00:53:16.875 --> 00:53:21.795
Man, when you say that of the, the, the just shut it out file really makes me think, I don't know, maybe I will try to have one.
00:53:21.824 --> 00:53:22.704
Maybe they have a point.
00:53:22.945 --> 00:53:24.505
it is nice not writing CSS.
00:53:24.554 --> 00:53:26.514
It's one of my favorite things to not have to write.
00:53:27.695 --> 00:53:32.784
yeah, it's, I, we don't have to go into CSS now, but I, I, I am conflicted.
00:53:32.844 --> 00:53:47.574
There are many approaches and I've, uh,
you know, I don't know, I guess my briefly, uh, I guess maybe it applies to a lot of things is that, um, yeah, at a certain scale, anything works.
00:53:47.875 --> 00:53:49.164
And I think that applies to like.
00:53:49.969 --> 00:53:52.590
Putting stuff into your records or that fit small enough scale.
00:53:52.590 --> 00:53:59.840
It probably really doesn't matter what you do So yeah, I guess the answer to every question is like it depends
00:54:00.215 --> 00:54:11.485
And honestly, like if you have a team who like doesn't want it, like really wants to write a semantic CSS or really wants to put stuff in active records, that that absolutely counts.
00:54:12.019 --> 00:54:15.789
Like, why would you make all those people miserable to do some other pattern that they don't want to do, right?
00:54:16.150 --> 00:54:18.530
They're the one, it's their job to work on it.
00:54:18.530 --> 00:54:23.090
And if they want to work a certain way, that's probably, that counts a lot.
00:54:23.159 --> 00:54:25.530
Um, for what you want, what you want to do.
00:54:25.530 --> 00:54:28.579
Especially when there's things that are like, kind of stylistic.
00:54:28.590 --> 00:54:30.130
Like, is everything call?
00:54:30.139 --> 00:54:31.440
Or is everything an explicit method?
00:54:31.449 --> 00:54:34.519
Do we put our, are we using BEM for CSS?
00:54:34.519 --> 00:54:35.539
Or are we using Tacky?
00:54:36.730 --> 00:54:41.380
There's not a sort of like mathematical proof of those being better than the others.
00:54:41.389 --> 00:54:45.690
So, the feelings of the people doing it, like, have to count.
00:54:46.050 --> 00:54:52.940
Um, cause there's no reason to be miserable at work, or at least, you should be not as miserable as you can, right?
00:54:53.329 --> 00:55:10.239
should be not as miserable as you can I definitely agree with that Yeah, that's a good one well that being said then I think it's a great place to wrap up But we'd love to have you back when we think of more things to talk about For now, do you want to tell people where to find you?
00:55:11.150 --> 00:55:13.699
Yeah, um, I'm on Mastodon on ruby.
00:55:13.880 --> 00:55:17.849
social slash davetron5000, um, davetron5000.
00:55:17.849 --> 00:55:23.840
com is my website, it will redirect to the less easy to spell naildrivin5.
00:55:23.840 --> 00:55:25.639
com, so just go to davetron5000.
00:55:25.650 --> 00:55:31.070
And that, that's, that's where, those two places, Mastodon and my blog are usually where I'm at.
00:55:31.079 --> 00:55:33.289
And uh, if you're into background jobs and sidekick...
00:55:33.844 --> 00:55:41.724
The book will come out of beta at some point and therefore be 100% perfect with no errors at all, and you can safely buy it, uh, 9.
00:55:41.775 --> 00:55:43.735
99, pages of quick read, I hope.
00:55:44.585 --> 00:55:45.105
Amazing.
00:55:45.454 --> 00:55:56.425
Well, uh, well, if you're, if you're listening to the show, you like the show, please tell your friends, rate, subscribe, star, uh, create a background job to, uh, post about it.
00:55:56.795 --> 00:56:01.065
Um, and, uh, we will talk to you next week.