In short
Podcast Summary: Homebrew and macOS Package Management with Mike McQuaid
Episode Overview In this episode of *Software Engineering Daily*, Mike McQuaid, a key maintainer of Homebrew, discusses the origins, architecture, and evolution of Homebrew, a popular package manager for macOS. He shares insights into the challenges of maintaining an open-source project, emphasizing community contribution, automation, and the importance of a sustainable environment for contributors.
Key Participants
- Mike McQuaid: Early contributor to Homebrew, responsible for its long-term maintenance and direction.
- Kevin Ball: Host, Vice President of Engineering at Mento, and an independent coach for engineers and engineering leaders.
---
Key Themes and Concepts
- Origins of Homebrew
- Homebrew was initiated by Max Howell in response to the need for a simple and developer-friendly package manager on macOS.
- Mike McQuaid joined the project several months later, having been drawn to the open-source community during his university years.
- Architecture and Design Choices
- Programming Language: Homebrew is primarily written in Ruby, allowing for easily read and writable formula definitions, which describe how packages are built.
- Community Contribution: The design of Homebrew allows for a GitHub-based workflow, encouraging community involvement and contributions.
- Dependency Management
- Homebrew filters dependencies and manages software installations, distinguishing itself from language package managers (like NPM or PIP) by focusing on system-level packages.
- Transition to Bottles
- Bottles are precompiled binaries that significantly speed up installation times and reduce the complexity of building from source.
- This shift was driven by user experience concerns and the need to manage support requests more effectively.
- Challenges of Open Source Maintenance
- Noise Management: The volume of issues from users can be overwhelming; thus, simplifying options within packages helped mitigate this issue.
- Maintainer Time: The most valuable resource in open-source projects is the time of maintainers; creating a supportive environment is crucial for sustainability.
- Community and Culture
- A zero-tolerance policy for abusive behavior fosters a healthier community.
- Regular in-person meetings among maintainers enhance collaboration and motivation.
- Emphasizing human interactions and interpersonal relationships is vital for long-term engagement in open-source projects.
- Funding and Support
- Homebrew operates on contributions, sponsorships, and support from various companies, including GitHub and Mac Stadium, which provide logistical resources.
- Financial transparency is maintained via platforms like Open Collective, where the community can see how funds are allocated.
---
Key Takeaways
- Simplicity and Usability: The design and usability of Homebrew have been critical to its widespread adoption among developers.
- Community Engagement: A strong, engaged community is essential for the success and sustainability of open-source projects.
- Balancing Trade-offs: Decisions in maintaining Homebrew reflect a need to balance user preferences with the project's sustainability and ease of management.
- Cultural Considerations: The health of the community and the well-being of maintainers are as important as the technical aspects of the project.
Final Thoughts Mike McQuaid's insights into Homebrew reveal the complexities of managing an open-source project. The emphasis on community, sustainability, and a supportive environment highlights the need for a well-rounded approach to software development that values both technical excellence and human relationships.
---
This markdown summary provides a comprehensive overview of the podcast episode and encapsulates the significant discussions and insights shared by Mike McQuaid and Kevin Ball.
Written by AI. May contain mistakes. Listen to the episode to check what was said.
Transcript
Automatic transcript. May contain errors.0:00Homebrew is a widely used package manager that simplifies the installation of open source software on macOS. It was created in response to the growing demand for a lightweight, developer-friendly tool suited to an increasingly Mac-centric development ecosystem. Today, Homebrew is a near-essential part of the macOS software development toolkit. Mike McQuaid joined the project early on and collaborated closely with its creator, Max Howell. He joins the podcast with Kevin Ball to discuss Homebrew's origins, architecture, its emphasis on automation and CICD, long-term sustainability, controversial trade-offs, and much more.
0:41Kevin Ball, or Kate Ball, is the Vice President of Engineering at Mento and an independent coach for engineers and engineering leaders. He co-founded and served as CTO for two companies, founded the San Diego JavaScript Meetup, and organizes the AI in Action discussion group through Latent Space. Check out the show notes to follow KBall on Twitter or LinkedIn or visit his website, kball.llc.
1:16Mike, welcome to the show. Hey, thanks for having me, Kevin. Yeah, excited to get to talk to you. Let's maybe start with a little bit about you. Can you talk about your background and then how you got into Homebrew and where we're going to go today? Yeah, sure. So I feel like in tech, I've kind of had two lives, right? So there's my maybe a little bit like being a really rubbish superhero, right? Where I guess my commercial job related life, you know, I'm a guy from Scotland. I had an interest in computers, did the computer science degree thing, got the tech job thing. I've been doing that since 2007, just getting jobs, changing jobs, paying the bills, having fun, all that stuff.
2:01But then there's my open source life, which is generally of more interest to people with homebrew and all that type of background. So my love of open source, I guess, probably started while I was at university. Like I came to university, I heard about, you know, when I was in high school, people talking about installing Linux on the machine the same way that you might talk about, you know, taking illicit drugs or whatever. It was this kind of like risky, dangerous, sort of like somewhat admirable thing. so yeah so i got to university like a bit of a kind of windows power user had not done meaningful programming really like beyond just trying to get games working my computer and you know peer pressure happened pretty quickly and i was like okay i need to get on the installing linux on my desktop bandwagon right so got linux on my desktop machine got like a little home server of an old computer running my parents house so i could like send data back and forward and all this type of stuff and yeah and obviously you know desktop linux one of the nice things about it i mean probably even now it's certainly back in you know 2003-4 when i was first dabbling with it it's like open source is front and center right and you very quickly realize like oh this is like a community of people building a thing and as much as i feel like i'm a consumer and i'm using this thing if i file a bug there's a very real chance that like the guy or girl who wrote that is the person who responds to my tickets so yeah so i guess that kind of growing awareness i am you know i started like helping out with things and helping out on irc channels and bug trackers and forums and all this type of stuff and then like you know forking stuff myself modifying it a little bit publishing up the changes in case anyone cared but yeah but i guess for me the the main thing was probably like i did google summer code back in 2000 and what would it be 2007 for the kd like desktop environment still around and yeah and i basically sort of fell in love with the open source community through that really like from spending a three-month project just writing lots of codes seeing very high degrees of trust and mentorship and help and whatever and then i just went on from that being a huge proponent of it in my work life and then I guess the two streams probably crossed again in 2009 I was in London working for a stock called Mendeley across the other side of London friend of a friend was a guy called Max Howell who was also working in London a huge stock called Last.fm that probably brings back memories for a certain number of people and yeah so he had been tasked with you know doing various bits and pieces and building desktop of applications and i believe the the the official story is like he was in the pub one night complaining about all the package managers being terrible and someone said to him well if you hate them all so much why don't you make your own one right and he left the pub went down wrote a sort of outline of what homebrew should be started building it uh and then i got involved you know i can't remember what it was like four or five months later kind of heard about this thing it's I'd sort of tried to build something vaguely similar myself.
5:08And yeah, that was, I guess, 16 years ago, like in September, I've been working on this thing. And yeah, and that's my open source story, I guess. That's awesome. Yeah, I feel like a lot of us have that experience with open source of like, this stuff is all crap. Wait, with this stuff, though, I can actually do it myself and make it my version. Yeah, totally. So I feel like in today's age, especially with Macs having become, at least in the US, and much of Europe, the sort of de facto development environment for many, many developers. A huge number of our listeners are probably homebrew users, but I don't know how many of them have actually looked below the hood at how it works or why it became the de facto norm.
5:52Why is this one not terrible the way that all the package managers that Max was complaining about are? So how would you describe like, what are the core like choices or approaches that have made homebrew so successful yeah before we get to that i just noticed this is again i've been working on for 16 years it's the first time i've ever thought of this i think because you were saying in that sentence and you're talking about max the apple computers and max the creator of homebrew and it's only just twigged i'm like oh yeah that's a fun little coincidence that that is a fun one yeah but anyway yeah so how homebrew works so i think one of the things i've found in my career in general right is i'm i'm a maintainer i'm not a creator right like i'm someone who is very good at taking something that someone else has made and riffing off it and evolving it and growing it and blah blah blah but like i am rubbish at coming up with new ideas myself right so a lot of the kind of brilliance of homebrew i think goes back to max's original design right and i think the i guess the less interesting parts of the design first but people might not know this so let's let's tell them anyway so homebrew is and was from day one written in ruby primarily and so like at the time you know ruby was sort of starting ruby and rails were starting to take off ruby was like a very you know becoming a popular language in 2009 um and you know nowadays it's the same you know there's still a bunch of code that probably goes right back to the first kind of few commits and if you sort of squint a little you can see that you know the dsls and stuff that are being used in Humblew today are still much the same as back then.
7:28So I think that brings you to the first part of Humblew that I think was initially brilliant, which is like something Ruby is very good at is building these DSLs, domain-specific languages, I guess we would call them, where because Ruby code can be at least made to look very much like just normal English, right? And because Ruby is a very low syntax-heavy language, you can build these things that look a little bit more like you're just declaring, you know, it almost looks a little bit like YAML without as much indentation and stuff sometimes where you can just look like you're declaring data, but you're actually calling functions inside a class and things like that.
8:09And as a result of that, Hubru started off with these things called formula. So the formula is basically like a definition of how a package is built. Originally, Hubru started off being a from source package manager, so everything's built on your machine. nowadays basically everything is built by someone else usually homebrew somewhere else elsewhere but that kind of initial formula description was very very easy to read and write and contribute to so i think that was a key thing to begin with like if you've ever worked with other package managers particularly back in that era and had to like package something in you know app get or rpm or whatever like it was a nightmare frankly like it was horrendous how many steps it would take and how many things you'd have to do to pass all the lints and test all this stuff on your local machine whereas the ruby formula made it very easy to read and understand what's going on and design and contribute and that's the next thing i think that was the really smart choice It's like I was speaking with a CEO recently who said something along the lines of, you know, all the best engineers are lazy, right?
9:16And often engineers that he might have a problem with are the ones who are being insufficiently lazy, not working hard enough. But like there was a certain amount of that from the outside with Max, right? Where he said like, hey, like, you know, if this package manager is going to be successful, we're probably going to have like five, six, 10 ,000 packages. I don't want to maintain 10 ,000 packages, right? I also don't want to go down the route of something like Debian or whatever, where I have to find 1 ,000 people who are willing to maintain 10 ,000 packages. So this was around the era that GitHub was starting to take off.
9:51So he basically was like, right, we're going to design the package manager. So it's a GitHub-based workflow. And Homebrew actually predated pull requests even on GitHub. So the original flow, I mean, the first few commits I had would be, I would be on IRC and I would DM Max with like a commit in my fork. And he would be like, yeah, that looks good. He would then cherry pick that from my fork and then push that to the homebrew repo. Right. And then over time we ended up pull requests and reviews and all this type of good stuff. But yeah, I think that model from the outset of designing it to be both very, very easy to contribute to, but also designing community contribution and community maintenance as being a core part of the overall flow of Homebrew is, I think, what resulted in it being as successful as it's been.
10:39That's fascinating. And I think for open source in general, the packages that sustain themselves seem to be those that manage to build that community early. So thinking about that from the beginning is great. Another thing that I think makes Homebrew different from at least the package managers that went before in MacLand and also a lot of the Linux package managers is it's pretty much all user space, right? Yeah. So that's one of the nice things about macOS and one of the reasons I'm still a fairly diehard Mac fan today is back in the Linux package manager days when I was working with that, I mean, the Linux package managers, I would still say to this day that I don't think AppGet is better than Homebrew in every way.
11:27but I think overall it is a more powerful package manager right it has a lot more stuff a lot more sorted than homebrew does right um but it it always there was a slight weirdness to me always where essentially like some random utility that I'm pulling off someone's github right that i essentially if it breaks it has no consequence to me like and my libc or like kernel are essentially managed in exactly the same way as far as the package manager is concerned right and one of the nice things about mac os or i mean even nowadays again if you sort of look at it from a funny perspective things like wsl or like there's linux distors that are doing this now as well you have a kind of a mutable file system like a modern mac os does and homebrew linux is taking off on those as well is this idea that like as you say you have this user space package manager right which is living in a non-protected part of the file system you don't need to run sudo to run it and stuff like that once it's installed and then basically you sort of limit the the damage that that can do to your system and nowadays i think partly because of maybe homebrew becoming more popular like the you know the mac os base system is like super locked down and you can get access and modify things if you want to but you're gonna have to boot your mac in a special mode and blah blah and that basically just means that developers on macs now don't have to like fiddle with things in user bin user bin is up to apple like opt homebrew bin is up to homebrew and you can just remove Optum Rubin and every at least like desktop application on your system should just continue to work fine as is.
13:24All your programming projects may explode, but it has less of a degree of concern that you're actually gonna like break your system or whatever, which was at least theoretically possible in the battle days. Yeah, well, and it makes, for example, staying up to date with Apple's upgrades it's a lot less painful as well. I feel like it used to be I would, and I still have some of these instincts, but I would resist forever upgrading to the newer OSs because I knew my whole dev environment would break and I'd have to go and rebuild everything. And I feel like that problem has more or less gone away.
13:58Yeah, so I'm glad to hear your perception is that problem has mostly gone away. I mean, to be fair, Apple are better on some of the stuff than they used to be, but it's definitely an area of pain that projects like homebrew mainly feel but in some ways like if homebrew can do one thing well it's providing a abstraction layer over all of this stuff so that we have to care and worry about and fix this stuff and you don't right so yeah like that's that's very much a a goal of our package manager is to i wouldn't say it's completely painless at this point but it's i I mean, it used to be days and now it's like, oh, I've got a couple hours of cleaning things up.
14:42Yeah, for sure. Let's maybe actually then peel back that abstraction layer a little bit because I as a user, I just know the APIs you provide. But what are actually the key pieces that go into making a package manager work? Yeah. So I think Homebrew is a bit of a special snowflake of a package manager in lots of ways. I guess I've mentioned some of them already. you know some of the package managers that have come after have really leaned into the same sort of model of community contribution and stuff like that some haven't i think one of the things we do that often surprises people is you know we have i guess our our stats and best estimates or whatever are like you know five ten million kind of relatively active users of home group which is a scary amount of people um and then in terms of maintainers we have like 30 people right and And probably on a day-to-day basis, probably 10 to 15 of them are active.
15:37And you tend to have this parallel function of even within those maintainers, there's some people who do a really disproportionate amount of the work. And in the total history of all of whom were maintainers ever, I think there's been probably less than 16 people, maybe even less than 50 people. So obviously, that's good scaling, right? Like how you can get a relatively small number of people to provide that amount of service. some of that is the contributors i mentioned before like you know getting third parties to go and help and submit changes probably got like yeah i mean definitely over 10 000 contributors i don't think we're anywhere near to 100 000 but you know in the five figures there but still there's like you know there's scaling effects and you're like how can you make that happen for 20 000 packages which are getting probably you know 10 20 100 updates a day across that so something we have done certainly at least from the very early days of me being involved with homebrew is going back to what we said before about laziness like i'm an exceptional lazy person i like the people i work with to be lazy and i really encourage that right so my one of my positions for a long time which is kind of funny now we've got ai because it's you know encouraging you to think about that in a different way still was almost like i guess i wrote a blog post about this called robot peasantry human empathy right because at the time i felt like i was seeing you know people were almost being like oh i'm gonna write a bot to thank first-time contributors to a project or whatever and like i my observation was is that like if people have a bot doing it it doesn't mean anything they don't really feel valued and considered by a bot right but like on the flip side people are very tolerant of bots being i don't know if you've ever had one of those pull request reviews in a work environment or whatever that are brutal yeah well not even brutal like i would say like excessively pedantic right we're saying you're using semicolons in javascript the way that they don't like and you did it 20 times and they go through and on every single occurrence they're like use semicolons of use different and like when when a human does that you hate that person right whereas when a what i would call a robot or like a ci job or a linter or whatever does it, you're like, that is actively helpful.
17:53And if you didn't tell me all of the occurrences, you would not be a useful tool. So something I try to encourage in myself and in others in Humbroo from the early days was being like, okay, anytime you are regularly making the same comment on say three pull requests, figure out a way to turn that into an automated check that can run, that can make the CI red so that the user has that indication that there is a problem here. and I guess there's, you know, to adopt horrible tech industry jargon, like shifting things left as well, right? So also that idea of like, okay, ideally we move from a human comment to being a CI comment, like on a pull request or whatever.
18:35But then ideally still we move from a CI comment to a local development environment comment. So again, we have a bunch of automated checks. So the most common linter in Ruby land is a tool called Rubocop. So we now have it configured so that if you open Homebrew in VS Code, you'll get prompted to install the RuboCop plugin. And if you install that, then when you're writing Homebrew Code, we will pop up straight in your editor and tell you, like, this is against, like, essentially the description of this formula is not in the format we like. Like, you have started with A or N, and we don't like you to start with A or N because it doesn't look nice in our output or whatever, right?
19:14So then you can have a user who's working on this for the first time who gets that input straight away, right? And if you've enabled auto-formatting in your editor, then some of those Rubicops have auto-correction. So you could start your description with an A or an N. I can't remember whether this one does auto-correction or not, but we'll assume it does for this anecdote. You could type that in and you press save. And if you've got format and save enabled, then you'll just see that text just disappear, right? So obviously that contribution experience is delightful when all the stars align and all that stuff happens.
19:44and instead of a human being like don't do this don't do this your editor is automatically do making your codes the way we need it to look so it passes ci and even if it does make it to ci again like we have a pretty time zone distributed team now so we probably have decent follow the sun coverage but like before we had that there was something really delightful about seeing someone open pull request see you know our linter spits out 10 warnings they read them all they action them all they improve everything and then you wake up in the morning and you're like oh this there was 20 things i would have said on the first version of this pull request instead our ci tooling and the robots or whatever settle this the person's got it ready and now i can just merge it straight away right and then everyone has a better experience and that's how the projects can scale dramatically better in that way and i also might you know while i'm on my soapbox like my personal experience is a lot of companies could do with moving a lot more in that direction than they think as well.
20:41Because generally, humans don't like doing that stuff. And generally, pretty much every software company in the world, if you're like, I can give you a way to move faster without negatively impacting your quality, like most people or most companies, most developers would say, yes, please. And that's how you get there. You get there by very heavy but reliable automation. Have you tried building a text-to-SQL chatbot? If your AI agents don't understand your data, its definitions, queries, and lineage, they're forced to guess. And bad guesses mean risky assumptions. That's where SelectStar comes in.
21:19SelectStar automatically builds an always up-to-date knowledge graph of your data, capturing metadata like lineage, usage, and example queries. So whether you're training an AI model or deploying an agent, your AI can answer with facts, not assumptions. Stop the wrong SQL queries before they happen. Learn more at selectstar.com. There's a mindset shift there that takes a while to sink in. And I find I'm climbing that whole mental climb again now with these AI coding tools because there's things they're good at, there's things they're not good at. But a thing they are very good at is writing tools.
21:56So you can use them to automate your check that you are going to do. and it's mind-boggling how much faster you can go as you accumulate those i'm in the same space right now where i would say i'm a like ai i don't know user and mild optimist but it's like figuring out the places in which these tools are very well suited and very badly suited right because it you know it's like the that old expression used to be of i can't remember where i first heard this but you know like your your average not tech person would be like i hate computers because they never do what i tell them to and then the tech person responses no you hate them because they do exactly what you tell them to when that's not what you mean right and i think it's interesting because i feel like a lot of the time the some of the modern lm tools are getting better at inferring what you meant rather than what you told them to do but then on the flip side, the responses are now non-deterministic.
22:56So you can't, you know, that, there's examples before with the CI and the linting or whatever, I'm sure I could describe in prose and feed that into ChatGPT and have that somehow run in my CI pipelines. But the problem is if you rerun that on the same code three times, you're going to get, like, you don't get the same response every time without some sort of deterministic, like, code layer living underneath or on top that is making sure that that stuff works as it does. So yeah, I still feel like that's a big point of growth that we're still figuring out is like figuring out how do we make these two tools play together in the nicest possible fashion.
23:34The automated validations that you're doing are actually great for that. Because if you can put this non deterministic thing in a loop with deterministic validation for correctness, your quality gets so much higher. Yeah, yeah, I've definitely felt that When I've been doing stuff, I'm yet to really go hard on agentic stuff, particularly agentic, not in a window in the foreground sort of approaches. It's on my to-do list to play around with that in the next few weeks. But even on that, I definitely find in tools like Cursors, Agent Mode, or whatever, if you can say, here's how you run the test, here's how you link the code, here's how you type check the code.
24:14So Homebrew nowadays uses Sorbet, which is like a type checker built by Stripe kind of type checker runtime type system, runs exceptionally fast to kind of check the entire code base. then yeah like the more of those guardrails you have then the better these tools do because they're able to validate their own behavior without you having to say like oh no that should be you know like an integer being passed this method not a you know a number one in quotes or whatever so let's come back a little bit to the pieces that make homebrew work so we talked about kind of the automations for contribution and the key sort of piece of formula which are building dsls what's the engine inside of homebrew presumably you have some sort of dependency resolution or thing like that going on and like what are the like i don't know the software architecture of a package manager yeah so i mean i don't know that i know the software architecture of package manager either but i can speak to yeah homebrew basically where you touch upon dependency resolution that's the most common thing that you know the of value in some ways that a package manager is providing so So if you don't use or have never really thought about a package manager before, essentially like the two key things you might say that they are doing for you is one is just the way of essentially specifying, here's a bit of software.
25:37I want this installed. You figure out however that gets installed. And the way of indicating you want two pieces of software installed should be the same, even if the underlying build mechanism, distribution mechanism, whatever is radically different between those two things. So it's that abstraction layer. Generally, as well as that, there's some sort of version-based behavior as well. This is something where homebrews got a lot of flack over the years and were better than we used to. But again, let's differentiate between different types of package managers for a moment, right? So you have, I guess, what you might call, I guess you were saying user space earlier.
26:17Some might say like system package managers, right? which would be Homebrew would be sort of an example, but definitely something like Appget on Debian or Ubuntu, something like Yum or whatever on Fedora, I think that's been, or DNF maybe now, I can't remember, it's been a while, Emerge on Gen2, Pac-Man on Arch, et cetera. So those are responsible generally for installing everything that might be on a system or not. And like, again, you can debate whether Homebrew is one of those or not, but what Homebrew is definitely not, which people are often more familiar with, is a language package manager.
26:52So say something like NPM or Cargo in Rustland or PIP in Python land or GEM or Bundler in Ruby land, et cetera, et cetera. These package managers where everything you install through that thing will be written at least primarily in that language. They may also have C extensions or whatever, depending on the language. But essentially you're installing libraries mainly for the writing software yourself in that language. Right. So one of the big differences between the language package managers and the system package managers is the language package managers generally have this model of like, okay, well, we basically can let anyone sort of publish anything.
27:33And ultimately the people who are in control of uploading a new version and deciding whether people get upgrades or not are the publishers of that package and generally the authors and the creators and the repo owners on GitHub. Whereas with system package managers, generally there's a bit of a like, okay, because of the dependencies, which we mentioned earlier, you need to verify that it is okay for everyone to get a new version of a thing, right? So if I decide I'm going to, I have some library that a thousand packages in Homebrew depend on, I release my version two and I say, okay, Homebrew, right, we're ready for version two of the package, right?
28:11Like if I'm in entire control of that, happening then again depending on the package manager like that might be okay it might be that they can just upload version two and then everything sticks on version one until we manually like change it and it says it goes to version two so homebrew was designed from the early days to be again more package manager terminology i'm afraid what you call a rolling release package manager so things like ubuntu or debian you might be familiar that they have every so often they've got you know i can't remember what an ubuntu one is but it's you know like poetic pelican or you know it's always like a you know two letters the same or debian buster or whatever right so they generally the way they do that is they say okay we're going to like branch off a while before we essentially get all the packages so they're like vaguely stable together and then we have a point where we say okay we've released this new thing we basically are only going to do security updates and bug fixes until there's ways of you working around that.
29:14But by default, that's how we're going to do things. Then you have a rolling release package manager, which is what Homebrew is, which is essentially you get the newest version of everything all the time. So if you just type brew install some package name, say MySQL, right? In Homebrew, at least, let's simplify things and look at Homebrew 10 years ago to start with. If you type brew install MySQL, you will always get the newest version of MySQL, right? And if yesterday, whoever it is that owns MySQL nowadays, Oracle dropped a new major version and we're on MySQL 10 and it has no backwards compatibility with MySQL 8, right?
29:50Like, tough luck, right? Like, all your shit's broken, but Homebrew is internally consistent, so it's fine. We evolve from there to being like, okay, well, then we're going to at least have CI where we're going to test and make sure that everything works within Homebrew's ecosystem, at least. So you're not breaking any other packages in Homebrew. That's one of the fun artifacts of our CI is that when that happens with something like OpenSSL, which has thousands of dependencies, what that looks like is a CI job that will take two to three days to run of continuously churning away for like, you know, 48 hours.
30:28We've had various CI providers and hosting providers who assume that that's a typo. where we say that like, hey, like your timeouts are triggering too long. You know, they're kicking in after, I think like one time it's like, we're kicking in after 48 hours. And they're like, oh, do you mean like 48 minutes? No, 48 hours. Like, yeah, that's, surely it's not taking longer than 40. No, yeah, this job takes up to 72 hours to run. So that's been a little bit of a surprise. And again, that's part of the reason why people, when they might critique Humboldt and Humboldt's model, it's like, yeah, like this, it's hard to do this stuff at this sort of scale.
31:04And then more recently, Homebrew has done a bit more around versioning. So now you can install MySQL at 5.7, and that means that you will sit on that version forever. But because of Homebrew's original architecture, the way we do that is we maintain a separate MySQL at 5.7 package, and we have to maintain that indefinitely. And if there's something that has to happen to all the MySQL versions for a new Mac OS version, we have to essentially port it between all of those, right? So there's a little bit of overhead there, which is why we don't do this for every single package all the time. Yeah. Capital One's tech team isn't just talking about multi-agentic AI.
31:45They already deployed one. It's called Chat Concierge and it's simplifying car shopping using self-reflection and layered reasoning with live API checks. It doesn't just help buyers find a car they love. It helps schedule a test drive, get pre-approved for financing, and estimate trade-in value. Advanced, intuitive, and deployed, that's how they stack. That's technology at Capital One.
32:07You're a professional software engineer. Vibes won't cut it. Augment Code is the only AI assistant built for real engineering teams. It ingests your entire repo, millions of lines, tens of thousands of files, so every suggestion lands in context and keeps you in flow. Where other tools stall, AugmentCode sprints. Unlike Vibe coding tools, AugmentCode is built for shipping to production. And you don't have to switch tooling. Keep using VS Code, JetBrains, Android Studio, or even Vim. Don't hire an AI for vibes. Get the agent that knows you and your code base best. Start your free trial at AugmentCode.com.
32:47So that is interesting. So what CICD provider are you using today? So nowadays we use GitHub Actions, but we have our own self-hosted runners for doing a lot of the hard work, basically. So particularly on macOS, essentially we need the newest version of macOS pretty much as a month, two months before Apple released the new version, because we want to be able to test things and verify things or whatever. and we are yet to find a, we would ideally use an entirely hosted solution. We are yet to ever find an entirely hosted solution who can do things as fast as we need them to be done, but also provide like, you know, 72 hour timeouts on things.
33:34So our self-hosted runners used to be, again, like a little bit of fun open source lore, used to be physical Mac minis that were originally installed in a data center by me taking them down in a suitcase from Scotland on a train, which ended up going in the car of someone whose podcast I listened to who let me stay in his house and then put them in the data center of his ISP. And then later I took another train and then moved them up back to Scotland and blah, blah, blah. So yeah, there's a bunch of funny games that happens with this before this stuff was available by cloud providers. But nowadays, there's a company called Mac Stadium, who we've worked with for a long time now, probably coming up to 10 years, who provide like hosted Macs for us to use.
34:23And they've got like a nice sort of Kubernetes like abstraction layer that lets us kind of spin up and spin down VMs of the various macOS versions we need to run. So, yeah, so that's basically what powers are like CI, like the actual where the code is being run and built side of things. But yeah, but then the main almost like centralized server now is all on GitHub Actions. Who funds that? Do they donate those resources? So originally, Mac Stadium donated all of the resources. And then Apple helped when we were in the Apple Silicon transition. That's the first time, I guess, Apple like gave us something, which was nice.
Read the full transcript
35:06So they got us access to basically to a bunch of free Apple Silicon hardware. and then eventually essentially we well and this is to be very clear this is completely fair enough of max stadium but essentially we kept on being like we need more bigger faster etc and they were like yeah like i think you can pay for some stuff now right so we have basically we pay max stadium but we receive a very heavy discount and you can see if you're interested in humbrew's finances and financial situation i guess that's another fun little thing where all our finances now are on i think called open collective which is essentially if you imagine that you if you imagine you're like personal banking app right and you can go and see all the transactions and oh you know 223 on this day you spent this amount with this vendor or whatever it's essentially that but like the ledger is public like you anyone could go like kevin you can go and see how much money like humbrew received and spent and from whom in the last year and you can also see like we do a maintain a small maintainer stipend of like whatever it is like 300 a month for people who are still active on the project so you can see who got that stipend and when and how much and when it was paid out and and all that type of stuff and obviously like you know this sounds like a privacy accident waiting to happen but open collective being very good about making sure everything that should be private remains private and whatever but it's yeah it's quite cool it's a quite cool open source way of doing funding where rather than having very strict rules on how money can be spent essentially you have like this open ledger approach so yeah that's essentially how that's funded you can literally go and see how much did we spend with max stadium last month and all that type of stuff on our open collective if you were so interested yeah that's actually kind of wild i'm i'm looking at it just glancing at it here that's very cool to have that level of transparency and to have you know for for a registry you know you you need a lot of resources and so having that visible and having people able to see like hey this is what it costs to make your life just work like this yeah i mean we're lucky as well i guess i would be remiss if i didn't mention like we get a lot of free resources from a bunch of companies as well.
37:24So DNS Simple, 1Password, formerly DigitalOcean in the past. We basically have a lot of vendors who've given us a lot of free stuff, which is very nice and is obviously, I don't know how much of that reaches across the Atlantic to where you are, Kevin, but certainly Scotsmen such as myself are stereotypically very cheap and very careful with our money. So my preferred price for any vendor arrangement is always free. And that is what I've always attempted to negotiate. so yeah like we're we're very lucky to have that and i guess the biggest one you know a former employer of mine and it's been easier to be a bit more sycophantic about them before i worked there and after i worked there because i've been on homebrew on both ends uh is you know github has contributed a huge amount to homebrew in terms of why they both given us a bunch of money but also like all when you download any of homebrew's binary packages nowadays that's all on github packages kind of infrastructure which is like primarily a docker registry which is why it might be a little bit confusing as to how we are using that for our stuff but yeah but basically we had a situation i can't remember how long it was five years ago maybe where our previous hosting provider bin tray with about 90 days notice we're like yeah we can't post your stuff anymore sorry and so we had to find a new provider and migrate everything over there and whatever so that was very good of GitHub to be willing to do that.
38:47And I remember at the time seeing essentially when the switchover happened, like seeing all of the internal graphs of usage and being like, yeah, like this is, I'm sure a lot, GitHub Actors has had a lot more usage over time, but like at the time it was like 50, 75 % of the usage of the entire system was people using Homebrew. So if we couldn't do that without a big funder like GitHub, and I feel like we're all so used to GitHub at this point that we kind of expect just infrastructure we expect it to just work right exactly and we expect it to all be or just work all the time and be free to everyone uh certainly everyone doing open source so yeah like i think a lot of my former co-workers uh have and have and do work very hard to make all this stuff work so yeah particularly shout out to get help there yeah for sure let's maybe actually talk about so you you've mentioned a couple of big changes that have happened over the year.
39:42So one was migrating to GitHub packages. I don't know if there's more to that story that's worth diving into. But some of the other ones, actually, one I'm curious around is you mentioned originally, all of the building happened on developer machines, right? You install and it builds for you right there. And nowadays, very little is happening on developer machines. What drove that transition? And were there any interesting technical challenges to make it a reality yeah yeah so let me get to that in one second first i'll say on the github packages migration i think it's quite interesting for people of a certain ilk if that does interest you then i did a talk at i think it was the staff plus conference in london like two or three years ago and you can go and find that on their web page if you go on my website mikemcquade.com under the talk section i think there's a link over there or whatever but you know that's basically the If you're interested in a dedicated 30-minute discussion of why that was an interesting technical thing to work on, you might find that interesting.
40:42In terms of the source migration, yeah, I sort of spearhead that the most, right? So it's pretty much the only concept in Homebrew that I have created myself, which is why if you hate the naming, then that's my fault. I'm sorry. So we call, keeping with the beer metaphor in Homebrew, we call our binary packages bottles, which are then poured onto the file system, right? So I created Bottles originally as just a way to speed up a select number of packages. So I've been talking to Max and there was, I guess, QT, the kind of cross-platform programming framework that both Max and I worked on with the past.
41:22We were both using it when I was at Medley and he was at Last.fm. So we had quite a lot of experience with that. It was an early package in Homebrew that got like reasonable levels of uptake. and like the build times were just well were and and still are uh kind of bonkers like it you know would take multiple it would take like often close to or over an hour on kind of fairly standard mac hardware at the time so there was a element of like this is not a great user experience for someone to type brew install qt and then have to wait an hour before they get what they want there was also the aspect of just like errors right so you could sometimes get to a point where when you were compiling stuff, particularly back in the day when it was easier to play around with your macOS base system where Qt would build for, say it was going to take an hour, 59 minutes and 59 seconds and then have an error and be like, oops, something went wrong.
42:16And then essentially you lose all of your progress and state and you file a bug report, right? And we would notice that these bug reports were sometimes like, well, very often when building things from source, the number of bugs that were just like, this user has done something weird with their machine, right? And we were able to defensively improve some of that, but it became pretty apparent that like, essentially when you build a bottle, rather than like, say something like Qt, you're running a compiler and linker to do various things or various libraries and move things around and install things and blah, blah, blah.
42:53And when that was all happening in the user's machine, when it was building from source, So we would say there's just so many things that can go wrong. Essentially, you're running probably over the course of that build system, probably in excess of like a million, maybe 10 million, maybe even like a billion separate shell commands, any of which failing for a particular reason will take down the whole thing, basically. right so whereas this kind of bottle architecture we moved to was essentially again i i'm not a particularly smart guy so i believe in the simplest solution to any problem so essentially the bottles are just a toggle right it's basically just we build that we run all those commands originally the first few bottles were like literally i just build it on my personal machine on my macbook and And then we run brewbottle, cute.
43:45It spits out a tarball. We upload the tarball. We provide the checksums for the tarball so that you know it hasn't been tampered with. And then people download that tarball and it saves them an hour, right? So that started off being like just on, and I guess I say the commands from before, essentially you go from a million commands to being essentially download tarball, extract tarball. And the ways in which that could go wrong were dramatically fewer and it dramatically reduced our support burden. And going back to, we said way earlier, again, a big motivation in Homebrew has been some of the changes which I pushed through that have been very unpopular in the package manager have basically happened because I'm like, without this, this project will die.
44:29But we do not have the resources to deal with the amount of incoming support requests we have for supporting this power user feature, which maybe lots of people love, but generates a really spectacular number of support requests. So we are going to do it this new way, which is a way that we're actually able to support. So that was another motivation of this stuff, is it's just like, because fewer things can go wrong, fewer people submit issues, and we're able to maintain the package manager better at the cost, in some cases, of some flexibility for our users. Yeah, well, and it highlights, right?
45:02All engineering is about trade-offs. This is a trade-off that you absolutely had to make in order to support the number or the sort of scale that you're at. Do you do those binaries? Are they statically linked or can they reference libraries on the system? Or like, how do you navigate like dealing with library code or other system dependencies? Yeah, so most of the time they're dynamically linked. So we will link to stuff provided by Apple and we will link to stuff that's provided ourselves in other packages, bottles, libraries, et cetera, which is where things get a little bit more complex because if you upgrade a library and then you have to rebuild everything and that's how you get your 72-hour CI jobs.
45:44But yeah, so that's essentially these cascading chains of dependencies where you have to ensure all the linking between all of them is consistent and stable and all that good stuff. And you sort of alluded to another change, which is this removing optional compile flags or kind of reducing the sort of set of options available yeah so that's that's probably my i would say most impactful in terms of making home long-term scalable and maintainable but definitely the most overwhelming negative feedback i've ever received for any bit of work i've ever done um and was probably the first thing that built me uh a much thicker skin in in open source in fact speaking with thicker skin of source like just as a funny anecdote again like so right now i have a a person who was banned from the homebrew issue tracker last week who is now on his third new email account that he signed up with just to send me abusive emails and i'm having this fun back and forth of uh he has now had two github accounts banned and i'm just going through not replying to any of his emails and one by one taking the time to make sure that every new email he signs up with gets banned by this email provider so it's you know like only with maybe 16 years open source could this become a fun pastime of like recognizing every time he's going to try and log into some new email provider or github account or whatever like seeing that it's banned and me taking the satisfaction in that despite not seeing like him actually seeing any response from me as an aside like so that example you mentioned with the options again this was a i think that became the natural end of the road with the so as i mentioned we started off doing the binary packages just for a few select packages and then we got to a point where we're like okay like basically everything is going to be better with these binary packages but the problem is if we provide options like we don't really have we have never built and like all these things in open source if someone had come along and built this i would have been delighted but no one did we don't really have a way to kind of have this optional behavior with our binary packages.
47:52And what happens is when you provide these compile options, then those people are just falling back to building from source. We go back to this world in which everything is, again, very complex, lots of things can go wrong. We get lots of issues filed. But also when you have, again, this is obvious to anyone who's done, you know, a decent amount of, you know, even probably high school level maths. But right, if you have one option in a formula, then you have one thing that can, then you essentially have a, that can be on or off. That's, you know, two combinations, right? You get the combinatoric explosion.
48:28Exactly. You've spotted it. Yeah. So you have two, you have that, you have three, you have, so, you know, we would have many of our popular formulas would have five, 10 different options. And there was just a, from our perspective felt obviously not literally, but a perceivably near infinite number of things that could go wrong. and just we ended up constantly having this whack-a-mole right and some of the kind of power users said well you know you could have just said that people shouldn't file issues and you know like you didn't need to take away our toys just because some people were misbehaving with them and it's like unfortunately again when the scale of something like homebrew you only need 0.1 % of users to be regularly doing the wrong thing before you just have this absolute diluge of noise and what happens is again like the most it's funny because there's a lot of talk for a while about like problems in open source and funding and sustainability and scalability and all this type of stuff right i think a lot of that's overblown but like one of the things i do think is if you want to talk about sustainability in open source the scarcest resource available in open source is the time of a maintainer right money is good when it can give you more time for existing maintainers often often it cannot but in this case you know you can say okay well just close these issues don't respond to them but it's like but every time a maintainer and often with the way it helps notifications or whatever work it's not just one maintainer reading that it's one or five or ten or twenty right like say even one person reads this you know if we're getting 75 90 of our issues are just this noise then that is all time that that maintainer i guess in many cases, it was often me, cannot fix your bug.
50:10I cannot release your feature. I cannot release a critical security vulnerability update because I'm spending all my time triaging just all of this noise, which essentially the only way to make it go away, because we would tell people again, like, don't file these issues, please. People keep filing them. The only way to make it go away is to take your toys away and say, sorry, this kind of option behavior, it does not work for us to be able to maintain a scalable package manager with these around and yeah to this day i still meet people who are very disappointed in this choice but i think if they were aware that there was a time when it looked like we either do this or literally the package manager will die and everyone will quit then they realized they would maybe realize that like well that that was preferable to the other outcome i mean i spent a couple years about a couple years as a primary maintainer for a big open source package i was paid to do it right it was a job and it's still like it's so exhausting to deal with the noise and yeah that is hard so how this is one example of a way that you've made maintaining homebrew a little bit more sustainable how do you think about creating a sustainable environment for your team of maintainers.
51:28Yeah. I mean, that's, I guess that somewhat alludes back to the, the thing I said earlier, well, two things, I guess. So one is the most valuable primary resource is maintainer time. And to me, what that looks like is, I mean, in a funny way, you could say maybe even maintainer time is an output and maintainer and the input is maintainer motivation right so what that looks like is most of our maintainers right as i mentioned people receive a small stipend of like 300 a month i mean some of our maintainers are maintaining are like you know merging 300 pull requests in a week right so the dollar by time like compensation don't do this to make money exactly it's not a money driven thing right i even i guess me working on it for 16 years like the vast majority of this time i have never been paid anything to do any of my work on homebrew and the time and there's never been a time when i've had more than maybe a couple of months where my primary paid responsibility has been doing anything related to homebrew directly and so So as a result, you need to just be like, how can this stay interesting and fun and healthy and whatever?
52:48And what that looks like, again, something which I've got a bit of flack for, but I very much stand behind, is homebrew has to be a safe space for the people who are working on it. And that doesn't mean we can't have challenging conversations and it doesn't mean we can't disagree and whatever. But what it does mean is if someone is being abusive, as nowadays, it used to be I would give them two strikes, three strikes, whatever. Nowadays, my general policy on open source and somewhat in life is if you are being a very unpleasant, mean person, even if it's completely unintentional, like I have found, if you receive one notification saying, hey, this is not okay, your behavior is not being appropriate, that you can judge how well that will go from the person's reaction to that like someone who even tries and gives a horrible apology about like i'm sorry you felt that way blah blah like you can still tell that like they're trying they've maybe never heard a good apology they maybe never given a good apology but you know what they're trying and they're trying to adjust their behavior like those people i will give them a bunch of chances but when someone is called out on their behavior in that way and their response is to double down or get incredibly defensive or say well no actually you are the problem like you you go read your code of conduct you're bullying me or being mean or whatever it may be right like that never ends well like and if you read through people getting blocked on homebrew sometimes people get blocked on homebrew for what seems like almost nothing but the reason why they get blocked is because a we've had a conversation privately as maintainers about this and what's going on sometimes there's a bunch of stuff where someone only says one borderline thing in public but they've sent a bunch of private emails to a bunch of people which are significantly worse but often it's just like i've been doing this for 16 years and frankly like i can just tell when this is not going to end well so the quicker we can just shut this down the better right and i and i think that's what it looks like another i guess maybe more recent addition is you know for the last maybe six years or a couple years break with covid we try and have most of the maintainers meet in person once a year right and if you looked at people's contribution graphs and get up there was an explosion of activity when that happens because again people you're re-energized and you meet people and also like when i promised i was going to review someone's PR and I see them in person and they're over drink they're like oh did you review that PR I'm like oh shit I'm really sorry I'm gonna go review it right now or whatever right and that's helpful and it's energetic and it's something I felt like I learned back in the day from KDE of like going to their conferences when it was like hundreds of maintainers back in like whatever it was 2007-2008 you know and just seeing like oh yeah like this is you need to build something I'm not very good at personally but like you need to build a community like we've talked about the community of contributors there's also a community of maintainers and that that needs to be a small group of people who remain actually regularly using and contributing and maintaining homebrew who feel like they're a bit of a team and they have some sort of sense of collective identity together and like i think that helps a lot and it also helps with as i mentioned before with kind of people being abusive it's like i just go into even before i had kids i go into protective dad mode and i'm like you know what you can say a lot of shit to me but the bar what i'm going to tolerate for my team of people who are spending their evenings and weekends trying to build you shit that you get to use for free my bar of the amount of abuse i'm going to let you give them is not very high and if that means that homebrew has lost some valued contributors over the years who we just needed to tolerate that every few months they were going to go and be very rude or ruin someone's day so be it fine we can be less that's the one area of almost like productivity decrease i will happily accept is like if it if we can have a twice as fast home brew where everyone has to deal with assholes all the time or we can have a half as fast home brew then we can have a half as fast home brew there's a nicer place to deal with i i'm aware of saying that that you know if you google mike mcquade asshole there is a it's a not minority position that I myself am an asshole, but I do this from a position of trying to make it a better friendly place for people.
57:08So, yes, I think I have no stake in this and I'm not in the community, but I wish more parts of the tech ecosystem had that type of zero tolerance for asshole. Yeah, I just, I don't know, like, again, not naming names or employers or whatever, but I've definitely, I'm sure you're the same, Kevin, where there's been people who've had problematic behaviors of previous companies I've worked for where the signs were there in the first week, right? And I have said that before when I was like, so long as I have any influence, if you push the boundaries, I know you're coming really close to the line in your first week where you should be in a good, happy place.
57:47You should be trying to impress your coworkers. We should be trying to impress you. If that's the first thing you do when you enter a company, not a good fit, right? As far as I'm concerned. because at the end of the day, you know, and again, that's the other maybe difference with Homebrew compared to some other projects is that like, we are, you know, we have a lot of perks that you don't get at work in that no one can really tell anyone what to do. I can tell people I'm not going to let this PR be merged as is, but I can't say you have to go off and write this code by tomorrow or else, you know, like no one gets to do that.
58:20That's nice. And you don't, you know, so you don't really have bosses bossing you around to the same extent but the flip side of that is like you know i i want us to have the level of interaction that would be considered standard in a workplace and that means that you know just being abusive and like flaming people and whatever and like losing your temper like that's you know these things happen but like essentially you're how much slack you're going to get cut is proportional to like how much time and effort and energy you put into the project. If the first interaction we've ever had with you is very negative and angry and whatever, then no, not interested in continuing that.
58:58If, and this has unfortunately happened with Homebrew in the past, if you're a prolific contributor who's been very involved, maybe a maintainer for a long period of time, and over time, those rates of problematic behavior rise and rise and rise and rise and rise, eventually we're going to have a conversation where it's like, either you need to fix this or we need to part ways. And like much as like in a job situation, you can sometimes have those people who they used to be great, but, you know, either they changed or in happier ways, the culture changed, right? And we all change to be people who are not going to tolerate that anymore.
59:33And I guess if there's a last note on that, if you're a maintainer listening to this, I would encourage you to read one of my most cited posts, as far as I could tell, that I'm the proudest about. It's a post I wrote a few years ago called Open Source Maintainers Owe You Nothing, which is basically, if you look through the licenses of open source software, then that's what it says. Essentially, it says, you know, we do this without warranties or disclaimers or promises of damage. And, you know, how much of this is legally enforceable is debatable. But like, literally, most open source licenses say if a maintainer was to push out a change that deliberately destroyed all the files on your machine, like in agreeing to the open source license and using that, you are agreeing that like, you can't hold them responsible in any way for doing that, right?
1:00:18I think most people would agree that's when it crossed the line. It's been like, you know, maybe you're legally okay, but that would at the very least make you a bit of a dick. But the thing that I think is so crucial about that way of thinking is it's like, if you're a maintainer, you do not have to do anything that people don't want you to do. Right. And if your project maintaining it is not fun or interesting for you anymore, and you're just being guilted into doing things, then you can stop and that's okay. And not only is it okay, you probably should do that. Right. And you need to find a way to have your responsibilities on that open source project, be something that actually you find interesting.
1:00:55and engaging and as you mentioned before kevin like sometimes the way you can do that is like i take a job where i get paid to do this and sometimes i don't like it but then i look at my bank balance and i'm like okay this is fine because it's worth what exactly yeah if you're getting paid for to do a job there will be parts of it you don't like that you still should do if you're not getting paid which most open source maintainers are not like you darn well better enjoy it yeah and even on the you're not getting paid like i guess i would extend that to say you're getting paid like a reasonable market rate right like someone who's getting ten dollars a month to get up sponsors also does not owe anyone anything really correct yeah for sure i think this is the thing and to me this is again back to open source sustainability where i think like the without sounding too i don't know like cliche or whatever like i think a lot of sustainability comes from within and it's about figuring out like what is sustainable for me as a human like and what can i do and what it is you know since i become a husband and father and whatever like what can i do on homebrew that is not going to negatively impact my family right and that is again all of the stuff that kind of goes into running an open source project that people don't really think about because you don't necessarily have anyone who's going to be saying to you hey like you know like it's uh 11 o 'clock on a friday evening like you need to be up early tomorrow you there's a problem with homebrew you're staying up late dealing with this right now like maybe you just need to let it slide maybe you just need to let people suffer until tomorrow morning because actually you need to get a good night's sleep because you're going to be grumpy with your family or whatever you don't right and in most good workplaces that i've been in your boss or your co-workers would be the people nudging you in that way whereas an open source again historically there's not been as much of that and something again i hope for homebrew sake and we do see a bit of that is when people are saying like oh you know i need to step up till this is fixed and people like i got this or this can wait right like you need to look after you and like that's the stuff that keeps people around and happy and you know keeps human maintainable as well as the software.
1:03:10100%. All right. Well, we're coming close to the end of our time here. Is there anything we haven't talked about yet that you think would be important to touch on or leave people with? I don't think so, especially, I guess, just to maybe extend even more of what I was saying before, like, you know, I guess I found in work in the industry for whatever it's been like 18 years and open source for, you know 16 with homebrew and a few more like it a lot of this stuff that i maybe dismissed when i was younger about the human interpersonal stuff and squishy feelings and therapists and boundaries and all of these like you know oh cheesy grown-up words or if you're scottish like cheesy american words it's it's all really important at the end of the day and like this is what stuff is built on the back of and like something I really admire when I'm looking at you know the LinkedIn or resume or CV or whatever you want to call it of a person who's applying for a job or I'm going to work with or whatever is like you know like we've got this industry expectation that like you know you don't want to be at too many jobs for like a year or less right but I really love when I see people who've done one thing for a decade or more right and i guess like almost like a challenge i would put to anyone listening to this is like what would it take for you to be happy in your job or your industry or your open source project or you know maybe to be even deeper still like your marriage or your house or your friendship or whatever what would it take for that to be still in a really good place in 10 years right and think about what you can do to get there because you know I used to say to myself like, oh, you know, I've got 10 years at home brimaria and then I'm going to quit.
1:04:57But then I'm like, well, you know, maybe I've got 20 or 30 or whatever. I don't really know because it remains sustainable for me to do. And it remains hopefully at least beneficial for others to kind of receive the kind of work I'm doing. And I think I think the world is much better when people can focus on that. And often, you know, to quote every flight attendant or whatever, like putting on your own life mask first. like helps us all be able to do more better stuff together than it does when we're monitoring ourselves and then we burn out in two years or whatever
From the publisher
Homebrew is a widely used package manager that simplifies the installation of open-source software on macOS. It was created in response to the growing demand for a lightweight, developer-friendly tool suited to an increasingly Mac-centric development ecosystem. Today, Homebrew is a near-essential part of the macOS software development toolkit. Mike McQuaid joined the project early
The post Homebrew and macOS Package Management with Mike McQuaid appeared first on Software Engineering Daily.
