¶ Tabs or Spaces?
So I want to start with something non -controversial and ask you tabs or spaces. Oh, we use spaces in Laravel, but I think there's merit to the tabs argument, if I'm being honest. Yeah. You know, I have to give it credit. Yeah, you could be convinced. Yeah, so when I originally wrote Laravel, it actually was tabs. OK. And, you know, so of course, I guess the merit I'm referring to is people can kind of configure what that looks like. on their machine.
At some point in the PHP ecosystem, there was sort of a coding standard that was adopted across the whole ecosystem. And it gained a ton of traction across tons of projects. And it dictated that you use spaces. And that's when we moved to spaces, sort of. They forced our hand, in a sense. But we were originally tabs. Interesting. OK. And do you miss that? Did you take advantage of the fact that you could change what a tab meant? I actually didn't on my own machine.
But I know that's just one of the things that people refer to as an advantage of tabs. Gotcha. Yeah, that's fair. I wonder if people do that at all, or if that's just an argument that justifies after the fact some other preference. Yeah, I'm not sure. You come from, I think, a Rails background. That's a spaces environment, right? Yeah, I think Ruby's all spaces. I don't think there's any traction on the tabs in Ruby land.
But it's that whole like, I do this, but I respect the other side's argument is how I feel a little bit about like Vim and Emacs, for example. Like I'm a Vim guy, but I got to admit, Emacs is a great editor. It's being able to like code your, like configure your editor and Lisp is badass. The fact that it's just like a running Lisp instance is just super cool. So I respect both sides. Yeah, and I've never used Emacs.
I've only used Vim. Vim's not my primary editor, but I'm... proficient enough to like make changes in a program if I need to using Vim, if I'm in like a production server or something. But yeah, all of my college professors were big Vim users. And that's all we used in all of our classes actually. So I got a lot of Vim experience then. Nice. I feel like people should try it. Like I think it's worth knowing to experience like, hey, modal editing is a thing.
It's kind of a different paradigm than everybody else. basically everybody else uses. I think that's just like worth exposing yourself to even if it doesn't really click for you. Yeah, I agree. So what is your daily driver now? What do you what do you code in? I am in die hard, die hard, loyal to sublime text still. Oh, OK. Which I don't you know, I don't know what the current state of sublime text is as far as user adoption, but.
Before like VS code and I mean before VS code there was like the atom editor from github I don't know if you remember that but sure and they kind of VS code came out and it feels like VS code grabbed a lot of Sublime text old market share, but sublime text is just so dang fast. It's so light feeling You can just fly around files.
It's so much faster than VS code which I think even VS code users admit I think the The downside to Sublime is its package ecosystem is not nearly as vast as VS codes is at this point, probably because you can write things in JavaScript and VS code, whereas in Sublime Text, you're writing Python, which maybe is not as widely known, I guess. So yeah. When you say fast, is that like fast to start, fast to open files? Like what is fast? Yeah, both. Everything.
Okay. Yeah, fast to start, fast to open files. just navigating around files even somehow feels faster within a single file, you know. Interesting. Okay. Yeah, it's just a pretty sweet little editor. And I think it's cool because it's one of those projects that's written by kind of one person. It reminds me of like a roller coaster tycoon or like Stardew Valley, you know, or some of these pretty ambitious projects.
Those are both games, but they were written by a single developer all the way through. and sort of achieved worldwide fame and success, which is, I think, pretty cool. And Sublime Text is like that. Was there going to be some big Sublime Text rewrite that never happened? Or am I remembering that right? There was a long break kind of between Sublime Text three and four.
And the Sublime Text author, I think his name is John Skinner, he'll just disappear for months, you know, and then he'll pop back out with a huge update. And there's not a lot of updates in the meantime, you know of like hey, yep still working on it. Here's what I'm doing It's just radio silence and then boom sublime text 4 and then that kind of a year like I kind of get that You know, it's just like I'll be in my coding cave.
I'm not gonna talk to you Yeah, I like to imagine he lives on like sort of a Caribbean Island and just resurfaces every now and then to Ship an update. Yeah, he doesn't have any internet. He just had like every few months takes a boat to the mainland like upload something Yeah, exactly. I thought what are you using? I mean, so most of it, I'm still Vim. Like my VimRC is like almost 20 years old at this point. Yeah, but yeah, it's just it works for me.
Yeah, I think once you're that invested in Vim, you know, it's probably hard to totally. Yeah, I mean, it's like super, super sanded down to like be like the way I want it. You know, it's like it's really highly configured and I have a lot of muscle memory built up and I still feel like. at least for most of the editing I'm doing, it feels like the fastest for me to get code out and to make changes into files and things like that.
I think there are times where I'm a little jealous of certain things, like, oh, are there better debugging tools or refactoring tools or slightly higher level things that maybe I'm interested in? I want to check out Zedd. That seems pretty cool as an editor. I don't know if you play with that. I haven't. And I actually don't use a lot of those kind of higher level tools either. Are you a shortcuts guy? Are you kind of like arrow keys, just like doing an old -fashioned way?
Yeah, I use a lot of shortcuts for sure. I don't use a lot of like high -level debugging tools like that, you know, like kind of IDE style debugging tools. I don't really get into that. I think because a lot of what I do is program for the web, and I've actually found that like early in my career, I wrote .NET desktop applications.
where the application starts up and it's sort of like this long -lived process, right, that has sort of state that is maintained over hours potentially and variables and things. And I find that when I'm writing web software, you know, any given web request exists for an order of milliseconds. And the path through the application is generally easy to follow from beginning to end as far as what is happening.
And I just don't feel like it really requires like... a step debugger to step through those kinds of situations very often. Whereas when I was writing desktop applications, I used the step debugger and all of those tools in Visual Studio every single day because there was this complicated state in the desktop application and you kind of need to step through it or even reverse and see what's happening when users click certain buttons.
But I just haven't had that experience on the web as I haven't found myself reaching for that. Yeah, interesting. It was a trip going from desktop to web. Yeah, I mean, super different. But I like writing for the web. And when I'm referring to the web, I'm primarily referring to server -side web.
So I'm sure if you're writing heavy client -side applications, I think those bear actually more resemblance to desktop application development than back -end web development, where a quest is in and out, done, over. So yeah, it was a big change. But I'm... I enjoy it, you know?
¶ Shells
Yeah, totally. So switching from editors, do you have thinking about shell? Do you have a are you a what shell are you using? I use that. Oh, my. Is it zish? Yeah, sure. Zish. I think. Yeah, I use that. I don't configure it all that heavily other than how it comes out of the box. I just have like a pretty simple bash profile that sets up some aliases and some. a couple of functions, but I'm not a, I don't have a ton of customizations, I would say to my shell.
Do you make heavy use of the functions and the aliases you write? Like what do you use it most frequently? I have a lot for jumping around different directories on my system. I have some for like, Sim linking certain directories so that I can test Laravel, the framework against like the application skeleton without kind of involving a package manager. I have some related to like SSH -ing into different things, but I mean nothing too crazy, pretty basic stuff, I would say.
And then your Sublime Text, similar deal, not super configured? No, I have a few packages. I mean, I kind of like that. I feel like it's kind of like even on my iPhone, I tend to try to use like the native apps, you know? I try to use notes, try to use music.
So I think that carries over into like my dev stack where I try not to actually get into this sort of crazy customization because I feel like when I start up a new machine, I just kind of like not having to do a bazillion different things to get my sort of like environment configured. It's just a lot to wrap my head around. So I like to keep things as simple as possible in general. I bet I only have like seven or eight extensions installed on Sublime Text. You know, it's pretty simple.
And on the dot, I do have... basic dot files, but again, nothing crazy, you know? Okay. Nothing super nuts. No. Not even a dot file big enough to put in a GitHub repo. It doesn't even feel worth doing that. Yeah, interesting. And so it seems like maybe that's kind of a philosophy of yours in some sense. Yeah, I think, I mean, I'm a minimalist in general, you know? I was definitely even more of a minimalist before, like I got married and had kids. But still a minimalist, I would say.
And I think that carries over outside of my personal life. It definitely carries over into my code life, into the way I write code, the way I set up my environment, everything. And I think it carries into Laravel as well. I think I've tried to maintain a sort of minimalist philosophy as I write Laravel as well.
¶ Minimalism in Coding
Totally. I watched that documentary that... somebody made if about Laravel recently and Yeah, I heard the word minimal a lot of times that seemed to be like a really core thing that you cared about Yeah, yeah, we tried to avoid obviously complexity at all costs I mean, I think every programmer would say they like to try to avoid complexity But yeah, we definitely I At least try to make that a priority for sure. Yeah, so what was how do you given that everyone wants it?
But I would say minimalism is actually probably in sort of short supply. Like, what are you doing that actually works there? I mean, just kind of getting into the nitty gritty of like how I like to write code. But great. I try to keep the code like to me, good code is just code that is easy to change and doesn't have a lot of like sort of like apparatus around it or like.
You know, it's not like this big ornate cathedral that feels extremely meticulously designed to be this perfect creation that will withstand all business use cases without, without, you know, it will be able to absorb any use case we need because it's so flexible and so well thought out. And I actually gave a talk a few years ago where I sort of parroted a quote by, oh, it's a lady. I'll have to look up her name after the podcast and put in the show notes.
But she said, you want your code to be like Kenny from South Park and not like T 1000 from Terminator. Disposable, easy to change, you know, because as much as you can try to like plan ahead for so many different business use cases, it just never pans out. It seems like and that's actually what leads to a lot of complexity. I think in code is trying to anticipate all of these future scenarios. Whereas if you just keep the Write like the minimal amount of code you need now.
And I think there is some balancing to this. Like you can't just be sloppy or, you know, do something totally, you know, that's just going to cause you a lot of problems later, be significant tech debt, but try to write the minimal amount of code to get the job done well, let's say, and go from there. You know, don't try to anticipate every single business case you might have in the future on your product and code around that.
It seems like it could be that like having an opinion enables minimalism. Like if you decide like this is how we're going to do cues in Laravel and like this is going to be a small API. Like this is how we do it. And we're not going to support a bunch of other things. And that lets you have a small surface area and like keep things minimal. Does that sound right to you? I think so. Yeah. I mean, yes, agree. If you have opinions, you can keep things much simpler for sure. And I think.
Laravel is an opinionated framework in the sense that it's born out of the Rails lineage of sort of inspired frameworks, which Rails being an opinionated framework written by a pretty opinionated developer. We definitely follow in those footsteps, and it makes our life easier to an extent.
So we try to keep things like, as far as Laravel goes, keep things extendable and flexible where people can write sort of third -party packages to... hook into maybe some interfaces we've written or contracts we've written in our queue system. Like, hey, as long as your queue system does like a push, a pop, or whatever, you know, queues do, you can just write your own driver and support your own queue. So we try to do that and it helps us keep the core pretty minimal.
Yeah. Do you value backwards compatibility a lot? Like, do you try really hard to maintain that or is that like a thing you're willing to sacrifice for cleanliness? So... As Laravel has gotten older, and I released Laravel in 2011, I value backwards compatibility more so, the longer that Laravel is around. When Laravel was very young, like in 2011, we made breaking changes all the time, because there weren't that many users.
Most of them were early adopters that were sort of used to living on the cutting edge, and were perfectly willing to have breaking changes in the name of like progress and fixing things that kind of weren't panning out in the framework. And we were sort of still feeling our way through. what we wanted the framework to be like and what we wanted its personality to be.
Now though, 12 years later with so many businesses and so many developers using Laravel, I do feel a greater obligation to maintain backwards compatibility, mainly because I know how much it sucks to update dependencies that are breaking things all the time. So we definitely value that. We do releases once a year and there are usually some minor breaking changes and I sort of... think about it in time. So in our documentation, we list like estimated upgrade time.
And I try to keep that like 15 minutes, you know? So there's a few breaking changes, but it's not hours of work or days of work. And try to try to do things that we can automate as well. Yeah. So does that do you find? So that basically requires you to get it kind of right in the first place or? to have some sort of like compatibility layer that you insert for people that lets them not have to change if they don't want to. So do you feel like you're... That sounds right.
So are you investing a ton of effort in trying to get the initial API correct? Does that sound like you? Yeah, I would say so. I mean, we're definitely very hesitant to take on new APIs because once we do, you know, we're committed to that API. So I definitely think those through a lot before we adopt them. And yes, we do try to, like say an API doesn't pan out or it just kind of like doesn't feel right. We do try to develop a new API while keeping the old one.
So like this, say, I mean, let's just keep it really simple and say like, I hate this method name that we named this method. Like we could obviously just leave the old method in there. We'll make a new method. We'll have the old method just call the new method and everything sort of works. We do that actually fairly often if we want to. Fix things but not break things. Nice. Yeah, we should turn off your automated reaction things. I don't if you just saw that. Yeah, what was that?
This is a new Mac OS feature they turned on by default. I think if you click the green camera in the menu bar, there'll be a little video thing somewhere. I see that, reactions. Oh, I turned it off. Okay. You do it per app, by the way, so get used to doing that. Wow. Which is a wild decision.
¶ Stripe and Their API
Yeah, so then... Yeah, I feel like the I heard interesting things about like how stripe maintains their their API or there's all of these transformations They've written going basically back to the beginning of time where it's like you can just be on any version and they will translate it for you to get to you where you need to go and that's just like that that commitment to To not making programmers go back and change stuff.
I feel like it's kind of an underappreciated Bit of work that keeps your thing popular and appreciated and loved Yeah, and one thing I've talked about actually with with Adam Wathen on this topic is I don't like people to go shopping on the framework.
Like if I make a bunch of breaking changes And I think you can kind of see this Maybe with like view 2 to view 3 I don't want to put like view and to negative of spotlight But when you make a lot of breaking changes and people sort of have to almost rewrite it feels like if I'm rewriting Now there's sort of like a question in my mind of what should I rewrite it in? And it's not necessarily going to be the same thing. And programmers love a new thing. They're excited to try the new whatever.
So they'll take that They would love nothing more than to rewrite the whole app in an entirely new stack. Not just rewrite, but rewrite in a new place. Yeah, with a new thing. Absolutely. So I try not to sort of instigate that mentality in developers. Because if we have to rewrite, Why not rewrite in React or Zvelt or in Laravel's case, why not rewrite in, you know, I don't know, Rails or Django or Next .js or whatever it is.
Yeah. So is there anything besides trying to get the initial API right and trying to like not just like be conscious of breaking changes that helps you keep avoid that fate? A lot of the stuff we do, I would prefer it to be born out of real world needs. So like surprisingly, when people contribute to a framework, they will contribute things that they actually have never needed in the real world.
And I think when you do that, that's when you run kind of the biggest risk of not getting the API right, right? Cause it's not really born out of any application need or any business need that you actually had in the real world. And I think that's one thing that benefits Rails and benefits Laravel quite a bit is that both of the frameworks, are sort of extracted out of real world stuff, whether it be Laravel's queue system or authorization system.
And like, you know, I saw Rails just came out with a new solid queue that's sort of born out of their queue experiments and sort of database backed queues and also their new solid cache package. I think that helps you get the API right, you know, because you know that the use case is valid, that the methods make sense.
So I'm always very hesitant and I've actually closed PRs on the Laravel framework that I could tell were sort of built in a vacuum and they weren't connected with any sort of real development need. They're just sort of cool to have. I think that's risky. Is there a smell that you noticed that those have? Yes. So I see them come in, like we'll get, let's say we get one PR that adds a feature and it gets merged.
someone will see that it gets merged and then open a very related PR to add maybe like a complimentary method or something that I know for sure they have not had the need for yet. They only saw the first PR get merged. And so they're like, oh, well, it would be cool actually if we had this too. And I almost always close those. Interesting. I can tell. I can tell where they're coming from. I assume there's probably a little bit of a sense of cache from getting a PR merged into the framework.
Like do you? I picture myself as a young developer seeing that, like, ooh, we added first, second, and third. Maybe if I make a PR for fourth, that'll get in there. Exactly. And then I get my name on the contributors list. Yeah. And I get it. People do get excited about contributing to big open source projects. But yeah, that's exactly the kind of PR I'm referring to. Gotcha. Yeah, nice. I've heard that your comments are a little bit infamous. You have a very specific comment style.
I would love for you to opine about comments. Yeah, so all of the comments in Laravel are three lines long and each line is three characters less than the line before it and I don't know I honestly don't remember how or when that started but eventually it became Kind of a thing and it felt like I was so invested in it. I might as well keep going And make every comment that way from now on There's actually a pretty funny like stack exchange post from me.
This is pre Laravel actually I was still a dotnet developer asking like is it dumb to care about these sort of aesthetic things in a code base And most of the answers were like yeah There actually is better better things that you could be spending your time on probably But I don't know it is sort of like is a small thing that makes me happy when I go through the code base and like all the comments are the Same even though it has no real value but yeah, it's kind of become just like a
a shtick at this point and we just keep it up in the code base.
¶ Aesthetics
Yeah. It seems like you have a strong, like, aesthetic sense or like a sense of craft and like you care about small details and things. Do you feel like that was like, was that a learned thing? Like, are people born with that? Did you pick it up by seeing other people do it or something? Like, where did that come from? Probably a little bit of both. I definitely picked it up some from seeing other people do it and not seeing it just necessarily in programming alone.
Like for example, I used to mow grass when I was in college and back then my grandpa would help me actually sometimes. And after every time we mowed, he would make me lift the mower up on this like lift and spray off the whole underside of the mower before we put it back in the garage. So it didn't get any, a single blade of grass in the garage basically.
And he just sort of had this personality in general of like, you know, like, finish the backside of the piece of furniture, you know, make everything look good, even if no one's going to see it. That kind of personality, I guess. And I did pick up on that and sort of carry it over into programming in some sense where if I knew, for example, that like there was some nasty file took deep into Laravel that was just gross. I just like couldn't sleep well at night.
Like I wouldn't want to even use Laravel at all, you know, because I would know that deep down in there, it's sort of like. Farce and there's this ugly code and I can't well, how can I build my business on this piece of trash, you know?
So I think it is a little bit OCD to an extent in a legitimate sense, but that's just sort of like It's been a it's been a good thing for Laravel I guess in the sense that it's made me really thorough in terms of the quality of the tool I feel like this I feel like I I can empathize with some of this where I think I think people that create stuff to create things tend to have this like, it has to be amazing and like it's trash otherwise. And like you just want it to be so perfect and so good.
And I feel like all of us are just kind of like, man, it sucks today, but eventually I'm gonna make it like so good. Once I get these last few things, it's just this constant sense of not quite good enough. And it can be hard to live with, I think, because it's not, it doesn't feel, yeah. Yeah, it can be hard to live that life sometimes. when you're focused on the negatives and like needle things to want all the things to be perfect. But I do think it leads to really great software.
Yeah, I agree.
¶ A Coding Hill You Would Die On
All right. Do you do you have a coding hill that you would die on? Oh, gosh. What's an example of a hill? Like, do you have a hill? Like all instance methods should be like one line, Max, maybe three lines if you are an emergency kind of thing.
Um. Wouldn't say I have a hill that specific No, I can't even honestly think of like a certain hill I would necessarily die on in that sense I Mean I I think in general We have a few guidelines that I try to follow I like to keep methods fairly short I would say but not necessarily a specific number of lines of code one thing We also try to avoid really small thing, but I think it helps in terms of code readability is we never make callers of like a function pass
Boolean flags to change the behavior of the function. So basically you don't want to end up with a function that's like some method name, open parentheses, false, true, false, true, true, false, you know? And it's just like imperceptible from the outside what any of that means. So in all of Laravel, you never would have to pass a Boolean flag to any method. So the way we work around that, you know, is usually having another method. Like, let's say we have a method that generates a URL.
We have a function called URL. And maybe sometimes people might be tempted to put like a Boolean flag if they want the URL to start with HTTPS instead of just HTTP, like a secure flag, let's say. We would just make like a secure URL function that requires you not to pass the Boolean flag. So we do that throughout Laravel. But I don't know. None of them are like... That's actually probably one of the strictest rules we have. I would definitely die on that hill.
Before I would put a Boolean flag in the Laravel docks, I would rather delete the project, I feel like. Nice. By the way, I think that's a really good anti -pattern to know about. The term to Google is control couple. I remember reading about this... quite a bit. It's it's sort of like you're effectively leaking into all the colors of this method, the conditional that's in the method. You know, it's like, everybody knows I got a conditional and it looks like this.
And it's like, that's not, you're not supposed to know that. That's a secret. Yeah. That's true. Yeah. Call, call the other. Yeah. So, so split them into different methods and call, call what you actually want is I think a better approach. By the way, I just like Google control couple just to remind myself. And the first result is the anti pattern that I was speaking about. The second one is, are you in a relationship with a controlling partner? Nine signs. It's bad.
And it's bad in a lot of contexts. Yeah. So no. So no control couples allowed in there at all. No. And you know, one thing, if I can bring up something, I think one thing I find
¶ Clean Code
interesting about clean code. is how clean code is seen across different ecosystems. And you may have some insight into this because we kind of come from different ecosystems in a sense. Yeah. But like when you say clean code, do you mean the book or the concept? I mean, a little bit of both, actually. So like in the PHP and dot net ecosystems, clean code as in the book and clean code as in like the Uncle Bob sense of clean code, if people have heard of this person is like super popular.
So. tons of like tons of directories and architecture and interfaces around separating concerns really, you know, a lot of ceremony around getting all of the application architecture just right with all of these boundary layers and how they interact and things like this. And it's just like a super popular thing and in .NET. And I think that's leaked over into PHP and maybe Java as well, let's say. Whereas like in JavaScript and Even in Ruby, to an extent, I feel like it's not the same emphasis.
And it's like not the same influence of the same people has bled into those ecosystems. And it creates sort of different definitions of what clean code means. Whereas like in PHP and .NET and Java, I feel like clean code means your code is separated into different files in the right way. And they have the right interfaces. And... You know, they're typed the right way.
Whereas like in Ruby, or at least in Rails, it feels like clean code is sort of code that reads like prose or is, you know, like more English, plain English or something. And it's not the focus is not so much on like architectural purity as it is in like ease, how easy it is to read and, you know, kind of the syntactic sugar of the code. Yes. Which I find interesting. Yeah, that is interesting. The word that popped into my head, it was like idiomatic.
Yeah. It feels like languages will have different idiomatic ways of writing code that is kind of distilled from the culture of the people who are writing it in a way. Like you could certainly write, like the thing when I think of clean code, I think of the solid principles, like the capital, all caps. And like, I would say... I bet DHH would be like, yeah, that's not that interesting. I'm interested in how the file looks.
I'm a software writer, and I want to write it like an essay a little bit, and it should look a certain way and feel a certain way. And this thing you're telling me about the Liskov substitution principle about how this class should be able to stand up for that class, I don't really give a shit about that. That's not that interesting to me in this hypothetical world where I'm refactoring in this certain way and using a class hierarchy. And so I think it's.
But I think that resonates that sort of approach resonates more and maybe like other o languages that are just just with different people in them Yeah, and I think one one place I was going with that is the salt like take for example the solid principles of clean code Yeah, which I think in general are kind of helpful Some of them are more helpful than others. I think But I think it can lead to this sort of idea that clean code can be boiled down into like a checklist.
And if I do these things in my code, the code is going to be good and easy to maintain. And it's sort of, I feel like it's almost a little bit of ironically, a lazy way to code in the sense that you're, you can not, you can sort of check out your real critical thinking and just say like, as long as I'm doing solid, the code is good in this very robotic, you know, fashion.
Yeah. And I think it's sort of chasing a silver bullet to clean code that maybe isn't as clear cut as you would like it to be. And I've seen this a lot when working with especially younger developers who are just getting into code and they're kind of taking code serious, which is good, but they sort of latch on to sort of these checklists that they can follow to achieve clean code. And I think it lacks a little bit of the intuition that is needed.
when writing clean code, a little bit of just like the experience of coding for years and kind of knowing, hey, typically when I've written code in this way, it's gone poorly. You know, like when I've written code in this way, it's gone well. And that's just born out of years of programming, I think. It can't be summarized into a checklist. Yeah, I feel like that's also kind of what makes coding so hard is like, hey, did I pick a good architecture for this?
You can't even know that today or this year. Yeah, you know, you'll you'll know that maybe like three years from now when like you're trying to make these complicated changes or like new people are coming up onto the system and trying to understand how it works and reason about it or it's it like takes a long time to even get good feedback from your decisions. Yeah, it really does. Yeah, unfortunately, you're making a piece of a pottery. You can be like, all right, this is a good bowl of water.
It's you know, it's watertight. It didn't fall apart. And like, yeah, it looks nice. I did it, you know. Yeah, but like does did the queue system turn out well? Do we pick the right API for this or like are we gonna regret parts of this later that we couldn't anticipate? That's that all comes much further down the road. Yeah. Yep.
¶ Testing
How do you feel about testing? I like testing. We write. I write a lot of tests. Laravel has thousands and thousands of tests. I don't do a lot of tests first. I would say I do a lot of tests during kind of tests after. But yeah, huge fan of testing in general would not be able to ship software confidently without tests.
I don't think Definitely think it's you know something that every developer should learn But yeah have no strong opinion in terms of like test first or test driven development, I would say Gotcha went so if you're what does it look like when you are? Tackling a kind of law a large new Project of some kind you like are you a prototyper? Like, do you... What does this look like? When do the tests show up? Okay, well, like, let's take, for example, like a new package or a new feature in Laravel.
A lot of what I do first is just go into a blank text file and start writing kind of my dream API for what this is going to look like from the outside in. So basically, kind of like what the documentation is going to look like. What are the examples that are going to be in the documentation? And sometimes I even call this, you know, like documentation -driven development.
I think that helps iron out a lot of the the warts and like problems in your idea if you have to write out sort of how people will use it and I also kind of carry that over into Say I'm building like a full app. I have a whole new product idea I'll build a UI first And it doesn't have to be like pretty, you know, I'll just use basic Let's say tailwind classes to sort of get some basic shape in place, but I'm definitely not like, you know tweaking every drop shadow and every gradient.
But just to make sure that the user perspective is correct first. And I didn't used to be this way. When I first started programming, I would do like back and I'm going to build this whole API first that has no front end. It's front end agnostic. And that sounded like really appealing for some reason to my developer brain. But I was bitten by that sort of several times where I would build this big API that was front end agnostic.
And when I went to write the front end, there was all these awkward things I needed to do that the API didn't accommodate for. So now I start from the outside and work my way in both if I'm doing an application or I'm writing something that's just purely a Laravel feature, like a package for Laravel that doesn't have a UI at all. In that case, I would start with a documentation level, basically. Gotcha. And do you like to have like... Will you spin up a new Laravel app to try to use this thing?
Like you make it like a toy example kind of? Yes. Exactly. I do that every day almost. I actually just have a blank Laravel app, you know, ready to go to kind of like a sketch pad that I can just write, drop an idea into. Got it. And then from that app, you're like writing calls you wish you had and then updating the framework to try to support that. Yep, exactly. Nice. And then once you have it the way you like it, some of those calls probably become unit tests on the new functionality.
Yep, then I'll just go back in and fill in the test and you know ship it out there pretty much. Yeah, are you are you? What was your balance? Would you say between like kind of lower level unit tests versus higher level integration type things? This is another thing that's changed. I think over the years Earlier in my career. I wrote a lot of low level tests.
They ended up feeling really brittle I think I think there are certain classes that like lend themselves well to low level testing things that are sort of really like say like you pass in a string, you get out a string, you pass in an array, you get out an array. And they're like these very unit testable types of classes, like a classic like calculator class or something like that.
Where I feel like those kinds of things actually lend themselves well to like low level testing or even just like test driven development. But when I'm building web applications, I test from like the feature level or like, I guess you would say the controller level of like, let's make an actual simulated HTTP request into this endpoint. we're actually going to assert that certain records exist in the database afterwards.
We're going to assert that a mail was maybe dispatched to some user or a mail notification or text message or whatever. And some of those things might be sort of like faked. Like, of course, we might fake like the actual mail sending. But in general, the test is very high level. I just feel like I get so much more confidence out of those tests. And I guess the downside is if something goes wrong, maybe it's not as granular what exactly went wrong during the request.
But in my experience, it's still been very quick to sort of diagnose what was happening. And I just get so much more confidence out of those tests versus like these very low level tests that almost start to feel coupled to the implementation of the code that they're testing in a way.
And in general, I find that also, the higher level test helped me achieve what I consider to be the goal of testing, which is one, shipping software confidently that you know works, but then also two, being able to change the code without significantly changing the tests. And I think a lot of people actually get their tests so coupled to the code because they are so low level that they're almost one -to -one in terms of when they change.
And to me, that's like losing one of the main benefits of even having tests is, the ability to refactor the code or improve the code without changing the tests. So that's why I kind of prefer, honestly, high level end -to -end tests. Gotcha. Yeah. I would say my style has moved that way as well recently. I was a pretty hardcore TDD practitioner.
So I was like, well, I need a lot of unit tests to drive the next step in this process of me writing another method and changing how that method behaves. But I had of come to the same conclusion you did, which is that, The maintenance burden of tests that are a bit too low level is really pretty high. And it just doesn't feel... I feel like I get way more leverage on the higher level ones.
Yeah. And you know, like, I keep bringing up Adam, but I think Adam Wevin actually has one of the best testing video courses out there. It is a Laravel -based course. It's a video course with like, I don't even know how many hours of video. It's gotta be like 100 hours. But he does a high -level test, but tests first.
And I think even if you don't use Laravel or PHP, it's such an awesome course to check out because it demonstrates, I think, how to write tests that aren't brittle but still write tests first if that's kind of like what people are interested in. I don't know. I found it super cool. It actually was very influential, I think, in my own testing journey in a sense. Cool. Nice. That's test -driven Laravel, I think it's called. Yeah.
¶ Personal Involvement With Code
I remember that that was a beast. I think I remember talking to him as he was trying to get like the 80th through 100th video released. Yeah, yeah, that was a quite a labor. How often are you looking at like a big chunk of code that you're trying to understand? Does this happen frequently with like contributions or like picking up a different library or something? Is this at least weekly?
I would say I don't know I would go so far as I daily, but weekly for sure, mainly in the form of pull request, but also in the form of code that. employees here at Laravel have written and we kind of have a peer review process where probably other people have looked at it first and we're kind of getting to the point as well where I don't scan every single line of code in our commercial products. I'm just gonna be such a bottleneck.
But at the framework level, I actually do read through every pull request to this day. I'm the only one that merges pull requests into the Laravel framework still. So I review every single pull request and of course some of them are pretty complicated. And so I would say about once a week I'm looking at a pretty beefy pull request that let's say is 20 files changed. I would consider that kind of like in my context a pretty big pull request for the framework and sometimes even more than that.
How do you do that? Well, I don't know. I try to tackle like the hard things first. So just in general, not just on this topic, but if I have something that I'm trying to tackle, I'll just do the hardest task first and just get through it. So I kind of do that with pull requests. I don't really have any secret other than just like gritting your teeth and pulling down the pull request and going through it kind of file by file.
So first, I'll take like a high level cursory overview, just like in the GitHub web interface and kind of get my head wrapped around. in general what they're trying to do and then I'll pull down the pull request locally go file by file checking them off on GitHub as I go, you know, making sure everything looks good renaming variables refactoring methods if I need to, you know, things like that. Interesting. Okay, so you'll so you'll you're editing you're making edits here as you go.
Yeah, like maybe pushing to a branch that is like their changes plus yours kind of thing and merging that later. Yep, exactly. And I will say that like the bigger your poor request is to Laravel, it has to be really valuable. So I'm all about like bang for your buck poor requests. So my favorite poor requests are obviously poor requests that are like two lines changed, but immense developer value like added.
Because obviously almost no maintenance burden, tons of value added for the hundreds of thousands of people using Laravel. Like that's ideal. The bigger your poor request is, it has to be really freaking good in terms of value added because I have to take over all of the maintenance burden for that feature going forward. And it doesn't matter honestly how hard the person promises that they'll stick around and maintain the feature.
Just like you have to understand that life happens, they change careers, maybe they're in a different language, they're at a different company and they're not even using PHP anymore and it's like, hey, sorry. I don't remember exactly why we did this, or I don't even use PHP anymore. So I just assume that we're maintaining this forever without any help. And in that case, the feature has to be freaking awesome if it's going to be like 20 or 30 files changed in the framework.
Yeah, that makes sense. Yeah. Do you care about good commit messages? Yeah, when we squash things down, yes. Especially if it's pretty complicated, what's being added. I try to add something meaningful in my own pull requests at least Just to kind of you know make it easier for people if they're browsing through and seeing what changed Mm -hmm And so do you is this mostly like a description of like a high -level description of what's what's going on? What's part of this this change?
Yeah, pretty much So like we recently refactored some stuff in Laravel to make it a little bit slimmer a little bit easier to onboard sort of new developers into a little bit less overwhelming out of the box. And when I made that change, I actually wrote a pretty detailed description in the get commit message of like everything that changed and why it changed and the implications of that, because it was a sort of beefy PR that fundamentally changed some things in Laravel.
¶ Notes and Manifestos
So if the poor request is more, you there's a lot of kind of moving parts and a lot of things happening, you know, I'll write a more detailed message. If it's a pretty simple change, that's pretty self -explanatory. I might not write much of anything. Right. Do you draw diagrams or anything as you work? Do you keep notes or sketches or anything? Rarely. I mean, I can only think of like a handful of times I might have done that. There are times I wish I had a whiteboard next to my desk.
I feel like when I used to have that when I was like in a cubicle, I used that actually a lot to sketch out things. So maybe the fact that I don't sketch out things is just lack of access to a quick whiteboard, but... No, it's not something I really reach for very often. I'll more like write, I would say, like a manifesto of a new feature more than I would like draw something.
So I might open up Notion, go to a new document, let's say, you know, new database feature in Laravel and type up like a pitch for that feature just to kind of wrap my head around it and the benefits and the drawbacks. I do that more than like drawing diagrams, I would say. Gotcha. Do you feel like there are habits? that you follow that help you make good code. Kent Beck has this great quote, which is, I think he says something like, I'm an average programmer with above average habits.
That's interesting. Yeah. I mean, asking a lot of questions as far as like, why does it have to be this way? Why does it have to be that way? You know, challenging assumptions in terms of what we're building. Do we actually need this code at all? I think is a good question to ask. Totally. Which is, you know, not probably asked often enough.
I sort of agree that like I see myself as a very average developer with, I think my power in a sense is I have a very low threshold for like pain, developer pain. And there are just like certain APIs. I'm just not willing to stomach. And I think my threshold is pretty low compared to other programmers around me that I see where it's like they're willing to put up with a little bit more complexity, a little bit more like cumbersome APIs and just sort of live with it and move on with their life.
Whereas in Laravel, I'm just have such a low threshold for what I'm willing to tolerate in terms of like cumbersome, awkward, gross. unrefined API's are. And I think that helps a lot keep Laravel nice and clean and feeling fresh and enjoyable. Yeah, I thought that's kind of the secret of quality is just like caring a little bit more. Yeah, I think that just works in almost everything is like it's not that like I'm so brilliant programmer or a product person.
I think it's a little bit more just like I. I have low pain tolerance. Like it's I get more annoyed maybe than the average person. Yeah, when things are not awesome. And so I'm just like, well, can't we just make it better? And often the answer is yes. But you only get to that. Yes. If you're like, I find this too annoying. Like I want you to make it better. Yeah. So I've long thought that was sort of one key to, you know, Laravel success in a sense. It's just you. Yeah. You not being annoyed.
Yeah. Being okay with pain. Yeah. And I think needing things, you know, I'm not I don't feel like an exceptionally gifted computer scientist, you know, I kind of prefer things to be easy and digestible. And, you know, so I tend to try to write code that way. I mean, it's probably it's probably better that you aren't because if you were a super brilliant programmer, it might be hard for you to know that you have written something that is hard to understand or follow. Yeah, I agree.
I think I'm an average developer that hits average developer problems and writes solutions for the average developer, and that is a big market. There's a lot of people there. Yeah.
¶ Skill Over Time
Yeah, nice. So if you think about your... So maybe you're an average developer, but let's... If you think about your programming skill over time, when was that curve the steepest? In terms of when did I improve the most? Yeah, when were you improving the most and what were you doing that led to that?
I feel like I made the biggest leap during my dotnet days when I was working with some really talented dotnet programmers that were much smarter than me and had much more experience than me in building software. And I just leveled up like extremely quickly in that environment, which kind of sucks because I feel like I'm not in that environment anymore necessarily. Yeah. And I it's just awesome.
If. early in your career, you can be around a great team of people that really know what they're doing. And not in the sense that like they're, you know, ivory tower people, but just they've got a lot of experience building and maintaining software, and they know what works, they know what doesn't. And I just think you can level up so quickly in that environment.
Yeah, I think if you're a newer programmer optimizing for the quality of your teammates is probably the number one thing like over product or salary like, oh, I'm super excited about the app or like I would make a lot of money. Okay, fine. But like, how good are the people on your team and are they willing to teach you? That's that's the thing I'll be thinking about early in my career in particular. Right? Yeah. Did you?
So when these when you were getting better by working with these more experienced programmers, what what was the knowledge transfer like? Was it happening mostly in code reviews? Was were you sitting at lunch talking about this stuff? Were you pair programming? It actually was more like in the code in the code reviews like and I was not a very good programmer.
I had only been programming for you know, maybe a year professionally at this time and obviously making like just you know, new programmer mistakes or writing things in a way that maybe I wouldn't write today and they'd be like, hey, what if we wrote it like this way? Or have you thought about like taking this approach and it would just like click and be like, oh yeah, that actually is a much better way to do things.
So it was a lot of that, a lot of just friendly review and pointers in the code. And then also looking at how they wrote code. Because say I just had a down afternoon where I didn't really have much to do because I had wrapped up a project or whatever. Then I could just go browse some code and just see how things worked and see what people were doing. Do you ever do that now? Not really, no. I don't do that a lot now. But I did.
definitely do that early in my career just to kind of like get insight into how people were tackling different problems.
¶ Ian Landsman and Laravel
Yeah, totally. It's kind of shocking to me how I was watching in that Laird Mill documentary, what a big role Ian Lansman played. I didn't recognize him as kind of like the daddy that like kind of incubated this thing and made it happen. That was really fascinating. Yeah. I mean, I think Ian took a pretty big risk on Laravel, I guess, early days.
I had released Laravel maybe six months before I got an email from Ian, like, hey, we build customer support software and we kind of want to modernize some of our, you know, PHP code base onto Laravel. It looks like kind of a cool tool. Would you want to come work for us and help us do that? And Laravel was like not a... It was not a big thing at all.
Definitely not outside of PHP, but even within PHP, it was not even in the top, let's say four or five frameworks that you might choose to write a new application in. So in that sense, it definitely feel like he was placing a bet on a pretty young tool. But what was cool is when I got there, he actually gave me probably six months to just work only on Laravel, building out features that we knew we would need. Like we knew... we would need a queue system.
We were handling lots of incoming email, building a customer support tool. We needed to really queue a lot of incoming email for processing later. We wrote the whole database migration system. We improved the ORM a lot. Tons of stuff that we knew we would need, I built during those months. So yeah, I mean, it was a pretty pivotal moment for the framework. He's also the one that sort of first encouraged me to have like a Laricon in general.
He was like, hey, I think we could do a conference about this. about Laravel. And I was like, man, I don't know. Like, I don't know if anyone's going to come to that. And he was like, you know, even if it's only like 100 people, we should do it. It'd be fun. And that's just kind of how it got started. Yeah, that's so cool. I feel like my takeaway from that was that it can be so powerful to believe in a person and a thing and like encourage them to raise their ambitions a bit. Yes. Yeah, agree.
I've done that in the Larval ecosystem sometimes where I'll see like someone write something really cool and I'll just like email them and be like, I just want to let you know, like this is a pretty cool thing. You know, if I can ever be in any assistance to you, you know, like, let me know. Like not any kind of like I'm not looking for any business deal or anything like that, but just like if I can like put you on in any way that helps you, you know, like, let me know.
Yeah, I think that's really good. Like, like kind of like watering the seed a little bit, but it also seems like Ian watered the seed and also like told you like this could be bigger. This can be like a real thing. This conference can happen. People could like really love this framework. Like it was like raise the ambitions, not just like support. I think this is good, but like this can be more than you think it could. Yeah, yeah, totally agree.
Because at the time, like when when I was writing Laravel, the most popular framework in PHP was a framework called Symphony and like and also code igniter. And I was like Laravel will like. obviously never be his biggest symphony. Like that's what I was thinking in my head. And that was fine. Like I was just building Laravel for really for myself, honestly, to build my own ideas. But if anyone else used it, that was just added bonus.
And then once it was his biggest symphony, it was like, it'll never be as big as rails, you know, like it'll never reach that level of like market permeation. And then eventually sort of basically got to that point. So I don't know, just crazy. But yeah, he did. kind of seemed to always believe that it could be much bigger than I did. Yeah. So, yeah, I hope people sort of take that lesson. I don't think it... In this case, he gave you a job, so it literally cost him something.
But I think the raising someone's ambitions and helping them believe something could be bigger doesn't usually directly cost anything, but can have huge impacts. Yeah.
¶ Businesses Based on Open Source
So you're one of two people that I talk to pretty regularly, the one being Adam, who have... taken an open source thing and then built a pretty huge business around it, which is kind of wild. And it feels a little bit like the dream. It's almost like the best sort of freemium business there is, whereas like the open source thing is free and then there's paid things around it. Yeah. Any thoughts on like how you pulled that off?
Because I know you left Ian and you were like, you're like, all right, I'm going full time on Laravel. Did you have a path in front of you when you did that and knew how you were going to do it? When I first wrote Laravel, no, I had no idea. And that wasn't even the intention, honestly. The goal was to write my own SaaS using Laravel and start my own business that way. And Laravel kind of turned into this meta business.
But when I first wrote my first commercial product, which was Laravel Forge, which was kind of this deployment tool that you could use to deploy your Laravel apps, I wrote that and launched it in 2014. And even in the weeks before it launched, I was talking to my wife and I was like, if it just pays our mortgage and our bills, that'd be awesome. And we can just have that money for fun money and whatever. But within a few weeks, I was actually making more than I was making at Userscape.
And soon I was making double what I was making at Userscape within a couple of months. And then it was like, oh boy, this is a real business at this point. And that's basically when Ian was like, look, you can't work here and run your own full business at this scale. OK, so we sort of transitioned me out of userscape at the end of 2014. But I mean, it was all of it was like a surprise to me, honestly.
I guess I just underestimated how many people were going to be interested in that kind of thing. And then once that was out, we just kind of kept building more commercial products around Laravel and went on to launch, you know, four or five more things. Do you ever talk publicly about the revenue of those things? I think I have a few times so like a couple years ago.
I think I had I did a podcast series on my own podcast of like Building Laravel to like ten million dollars in sales as like a solo founder and that was a few years ago And I mean I think all time Laravel's an ecosystem has passed like 30 million in revenue or something like that That's the commercial products built around open source. Yeah, the commercial products. Yeah and Across all of them.
So we have five forage vapor on voyeur Nova spark And all together, I think they've passed like 30 million lifetime revenue since 2014. So pretty crazy, honestly, for like an old source tool. And we've also done conferences, but conferences have always been a very breakeven thing for us. We've never made any significant money running events like that. Yeah. But it fills the excitement bucket, though.
Yeah. That's the only reason it exists is to just sort of build excitement and goodwill like in the community. Yeah. So I went to the last Lericon, it was great. And like the excitement is real. And like I was talking to some tuple users there and that like filled me up with just like that's the in -person interaction with people that you normally like only talk to through the internet is like, it's amazing. Yeah, I always come away from those events like super energized, honestly.
And I didn't realize how big, how much I was missing that during the COVID years. But when we did our first Lericon since COVID, which was actually like July of this year, I was like, wow, I actually really miss this a lot. So I'm glad we got back on that train. And I'm actually I just signed the contract for 2024 LaraCon today. So we'll be we'll be back next year as well.
Cool. And so it seems like it sounds like you're spending a lot of your time focused on Laravel itself and less on the commercial products now. So have you have you freed yourself up mostly from that? From a coding perspective, yes. So what I do is like at the beginning of each month, I'll write up like a pitch of all the things I think we should do on the commercial products and kind of who I think should work on them.
But honestly, like that, even that is sort of flexible based on what the employees are feeling like and what they have an appetite for. So I'll write up the high level product pitches and maybe a few technical details of like how I think maybe it could work.
But then they're sort of like free to go implement those things as they see see fit I mean they know the code base is better than I do at this point like I actually wrote every commercial product at Laravel from start to finish in terms of the 1 .0 version that was initially launched to customers So I did know the code base is like top to bottom at one point but over the years I've of course forgotten them and now they know more than I do so they do that and I mainly focus on the open
source stuff and I mean, on a day -to -day basis, I'm almost exclusively in our open source code because I think the framework is sort of the foundation and centerpiece of the whole ecosystem. So I'm really focused on making sure that stays really well maintained. And then are the other Laravel core team members paid as well? Are they employees of you? Yeah, so we have 10 employees and they're all full -time paid employees.
And we actually have two of them that are really It's pretty exclusively open source, full time, salaried, open source people that help me triage things, help me with the release process, because we have a lot of packages these days, and we do weekly releases, help me with that whole process. Just make sure things are like running smoothly.
If there's a really gnarly bug that I don't have bandwidth to really chase down, like we have a guy that's just really good at chasing down hard to find bugs that are deep into the framework. So they help with that.
And then the other programmers are primarily on the commercial products seems like such a huge advantage if you can make it so that your Open source project can have some sort of revenue stream attached to it That then lets you hire people to work on the open source project that feeds the paid thing. Just like a beautiful flywheel Yeah, I mean it is a huge huge advantage and I think there's like only a few categories of open source project that actually lend themselves to this sort of model.
Unfortunately, I think there's so many important libraries out there that just never seem to lend themselves to significant revenue. But frameworks are definitely one of them where it feels like you can kind of leverage this model. But there are some open source packages like you have a Excel spreadsheet manipulator. package on GitHub. And it just never seems those kinds of packages just never seem important as they are and widely used as they may be.
Never seem to make any significant revenue, you know, unfortunately through like donations or whatever. And people ask me all the time, like, how did you make open source sustainable? And I don't feel like I actually made open source sustainable. You know, I just built commercial products around an open source platform. And to me, that's sort of a little bit of a different thing than actually making open source sustainable. Right. Right. It's like open source.
Open source became sort of lead gen for these paid products that plugged in nicely. Yeah. I don't know very many people at all that just like maintain open source and make a couple hundred K a year on GitHub sponsorships. That seems like incredibly rare. Right. Yeah. Totally. Yeah. Well, if I ever started open source tool, that will be my goal. It's something that could get that flywheel going. Because man, what? What a huge advantage to like have all the incentives aligned.
Like you just like, yeah, I want to hire more people and pay them to work on this thing that we happily give away for free because that generates new customers who can new potential customers for these paid products over here that lets us hire more programmers. It's just, it's, that's great. Yeah. Yeah. Yeah. It's been nice. Cool, man. Awesome. Well, thanks for sharing all this programming wisdom. That was a great chat. Yeah, that was a, yeah, it was a fun conversation. Covered a lot of ground.
Yeah, we did. I enjoyed it. Cool. Well, thanks. Thanks. Thanks for having me. Yeah, take care.
