The strength of Go in the job market ๐, and some stress relief with Carlos Becker ๐
This show is supported by you. Stick around till after the news for more about that. This is Cupid Go for 02/21/2025. Keep up to date with the important happenings in the Go community in about fifteen minutes or twenty minutes or thirty minutes, sometimes. I'm trying to recall.
Shay Nehmad:And I'm Shay Nehmad. As long as it's time dot duration. Right? Isn't that great that Go has a native duration type?
Jonathan Hall:I like that. Yeah. Yeah. I was recently playing with that. The the log, system I'm using, expects duration to be an integer, and I was sending it, I think, the stream representation, and it was screaming up my log, so I had to change that.
Jonathan Hall:Why are you logging durations? For HTTP requests or certain other tasks that happen. It's Oh, nice. Sometimes useful to know, especially when they start to exceed certain thresholds.
Shay Nehmad:I wonder if my microwave implementation uses time dot duration.
Jonathan Hall:Your microwave implementation. I don't know.
Shay Nehmad:Like, someone implemented the the button. Yeah. By the way, don't you feel I don't know if I'm the only one that does this. Do do you use a microwave? I know some people are against it.
Jonathan Hall:Yeah. I use it.
Shay Nehmad:Do you sometimes, like, instead of doing the thirty seconds thing, do, like, twenty seven seconds just to make sure you use all the buttons, you know, on the on the panel to make sure that you distribute the load.
Shay Nehmad:Just me? Okay. Moving on. We have a pretty cool show for you today. We have some announcements to do, talk through, talking a bit about the job market.
Shay Nehmad:We don't do that very often. The sync test, blog post, which is a pretty cool new feature. And so Go rewrites and some some Go projects in the lightning round as well. And we have an interview to, cap it off after the break. Right?
Jonathan Hall:We sure do. We're interviewing Carlos, the maintainer and and author of Go Releaser and a few other popular open source libraries. So stick around for that.
Shay Nehmad:Very cool. Very cool. If you use Go Releaser, and many, many, many, many, many people do, such including my, like, my previous team.
Jonathan Hall:And including Rust and Zig people, potentially. For sure.
Shay Nehmad:So kick us off.
Jonathan Hall:Yeah. So, first off, we have a couple pre announcements for security releases. We don't know what they are yet, but, on Monday, new versions of golang.org/x/oauth2 and golang.org/x/crypto will be released.
Shay Nehmad:So Nothing scary.
Jonathan Hall:That we know of. It might be super scary. We don't know. Maybe this is like the end of the world stuff, but we won't know till Monday. So as long as the world doesn't end until then.
Shay Nehmad:For sure. So just do I need to put on my calendar to upgrade my crypto packages on Monday?
Jonathan Hall:You should you should upgrade your crypto packages every day.
Shay Nehmad:The I'm wondering how many people do this proactively, like, when they listen to us or they just come into work and, like, depend about this opening a PR and they're like, oh, this rings familiar. Oh, right. They talked about it.
Jonathan Hall:Yeah. Interesting question. I don't know.
Shay Nehmad:Well, talking about people coming to work, like that segue? It's my segue. I follow, the pragmatic engineer, newsletter. I'm actually a paid member.
Jonathan Hall:Oh.
Shay Nehmad:Yeah. I did it by accident.
Jonathan Hall:So I wonder if we have any accidental Patreons for
Shay Nehmad:the show. Well, I I all dollars are green. No problem as far as I'm concerned. But, yeah, the the programmatic engineer is actually, like, unironically, pretty good, like, blog posts, but substack kind of thing Mhmm. With deep dives about various things.
Shay Nehmad:So this one's a paid one. I don't know how much I love, like, promoting paywalled content, but it is a state of startup and scale up hiring markets. I know how many people, are looking for a job right now, like in our audience, you know, might be looking from their current companies sort of thing. You know what I mean? Mhmm.
Shay Nehmad:But it's always good to have your finger on the pulse of the market. Right? Just to make sure you're up to date. You never know what's gonna happen in your current company. And, generally, the vibe, if you open, like, I don't know if you follow, like, programming credits, like CS majors and r slash programmers and all these sorts of places, but it seems like it's doomsday.
Shay Nehmad:Nobody can get into any job at all. And the field is completely dead, and there's no need for software pro developers at all anymore. You if you follow these sub sub subrades.
Jonathan Hall:That's interesting. I've I've noticed, an upward tick in in opportunities since the beginning of the year. Although, maybe that's just my very specific niche.
Shay Nehmad:I don't know. So there there is when you look at numbers, there is a low in job listings. That doesn't mean there are fewer jobs or less need. It's just a number. Right?
Shay Nehmad:You can you can interpret it in various, ways. This blog post talks about, like, startups, early stage startups, what sort of tech stack they're looking at. Well, like, there's a lot of, a lot of things they're talking about, like changes in the market. And, you know, people want very, very strong engineers right now and are less inclined to hire juniors because a lot of junior like, real, junior developer work, things that, people with zero user experience can do, sort of can be emulated maybe by, like, AI and cursor badly. Yeah.
Shay Nehmad:Very bad. But just just good enough to not hire these people, etcetera, etcetera. So there's a whole blog post about it. The only part I wanted to highlight for this podcast, even though the blog post is interesting, is the hiring by tech stack, right, in early stage, VC backed startups. First of all, what the first thing they say is that 50% of hires are back end engineers.
Shay Nehmad:Right? K. So back end seems more important in the early stage of a startup. 25% are full stack, and AI and machine learning specialists are, like, 10 to 15%.
Jonathan Hall:That surely that depends a lot on on the startup. Like, I'm working with a startup right now where I'm the only back end engineer, and there's, like, three front end developers. But it's a it's a game. So that's I suppose I suppose if you average it out, maybe the majority of startups are not doing
Shay Nehmad:a front end. A VC backed startup game. It's just like a company.
Jonathan Hall:I don't know if it is. It might be a startup back. I I think they've got some VC. Interesting. Yeah.
Jonathan Hall:But, I mean, it's it's still pretty small potatoes, though.
Shay Nehmad:This is coming from, like, a a recruitment agency. So I guess this is, like, the average when you average out all the noise in all the companies, this is the average experience you'd get. And another caveat, this is just in The US. Although usually The US market tends to reflect what's happening in the rest of the world, just with higher salary. And, you know, listeners from specific countries, you know I'm talking about you, you know when developers from insert specific country here are the best compared to the you.
Jonathan Hall:Mhmm. Mhmm.
Shay Nehmad:Anyway, so the text stacks for back end, TypeScript is easily the most common. I'm doing TypeScript back end right now, by the way, in my new startup. Very frustrating. That's a fact. It's a type language bolted on to a JavaScript engine, like a browser software.
Shay Nehmad:Big mistake. But it's really easy to go fast, and there's a lot of frameworks that help you run super, super fast, like NestJS and things like that. I understand why it's a good choice for startups. Then it's do you disagree or do you is it like LinkedIn flaming what's happening right now or do you
Jonathan Hall:Yo. Honestly, it's not my my it's not the language that I I find problematic per se. I mean, I I do for other reasons, but that's not what I'm talking about. I don't know why you would choose to build your back end in a single threaded language these days. Mhmm.
Jonathan Hall:Because, I mean, all else being equal, chooses choose another simple language that's not single threaded.
Shay Nehmad:So I think people are really sick with Python because of all the tooling issues, but that's getting better with, whatever, Astra are doing. You know, I don't know if you know, but they're doing rough and doing u v. And they're sort of solved the the tooling problem in in Python to the best of their ability. Mhmm. It's a lot better now.
Shay Nehmad:And Python 13 doesn't have a a global interpreter lock anymore, so I think it's a viable choice. These two are the top two languages. Third one on the list is Go. And the Yeah. The recruitment agency, Ashel from the recruitment agency says that, Go has gotten somewhat more popular over time.
Shay Nehmad:So that's his his take on that. And, like, comparatively, Rust has is, remained very niche. Like, if you're working in a crypto company, Rust is very popular. They are looking for people with hands on experience with Rust because there aren't a lot of people like that. Then the other hand, if you just wanna get into a startup, the chance of your Rust experience being useful is is maybe you can transfer some of your experience into the language you're working in.
Shay Nehmad:Right? Like, probably a very experienced Rust engineer can write pretty good TypeScript code, but it's not, like, immediately hands on valuable. Mhmm. Other, honorable mentions because there are almost no, people who need it is Ruby, Flutter, Elixir, Java, c sharp, like dot net, PHP, and Haskell. Basically, the recruitment company says these languages are irrelevant in the, like, early stage startup VC US world.
Shay Nehmad:That doesn't mean there are no companies that work with these tech stacks. This means it's not wide enough for, the recruitment agencies to have caught wind of it. Seeing go up there with TypeScript and Python for me was interesting. I always thought of my interest in Go as yeah. It's it's a relatively niche language.
Shay Nehmad:Like, I thought of Go as like very niche compared to Python and TypeScript, but recently it feels like it's super mainstream. But on the other hand, I'm, like, in the thick of it. So I I don't know. What what do you think?
Jonathan Hall:I I think Go is definitely entering the mainstream. Maybe it already has, I suppose, as a way you draw that line. It's younger than either of those two, so it's it's, expected that it would be less popular just by sheer force of of of knowledge, I guess, or whatever. Mhmm. If I knew all three languages equally, well, I can't think of any reason I would choose TypeScript or Python over Go for back end work because Go has that that multi threaded capability.
Jonathan Hall:Now, not everybody needs that naturally, but
Shay Nehmad:I think a lot of people have a bad experience with Go trying to model very high level, business stuff that is very fluid from, like, five years ago. Like, if you try to do go for your startup five years ago before, a lot of recent improvements and a lot of, like, five years ago, the comp the language was, like, half its age, basically. Right? We've gotten a lot of experience in the last five years as a community. Right?
Shay Nehmad:Like, five years ago, you wanted to build the microservice back end. You had to generate everything. You had to do a lot of cogeneration because you didn't have generics. And you have generics, so you can avoid a lot of cogeneration. Just an example, right, of a problem a startup might want to solve.
Shay Nehmad:Although, for another linked like LinkedIn hot take, if you're a startup where you're doing microservices. Right? But that's another topic. Let's not let's not open that kind of worms. Right.
Shay Nehmad:But just the the popularity is the popularity is a big is a big attractor, I think.
Jonathan Hall:Yeah. And and that closely relates to what I was probably the most important aspect of any of these languages, which isn't multithreaded or performance, whatever. It's how easily can you hire developers. And so if you're trying to you know, especially if you're a startup well, I guess, it depends on on your technical expertise. If you are a technical founder and you have the ability to vet your developers, maybe it doesn't matter so much.
Jonathan Hall:But if you're a nontechnical founder and you don't really know how to hire developers, you're gonna have a better chance probably, hiring developers with TypeScript or Python experience to the Go experience just because there's more of them out there and they're easier to find.
Shay Nehmad:Mhmm. The
Jonathan Hall:And if you're if you're at scale up stage, then that's another another situation. You know, can you hire enough Go developers with the experience level you need to to scale your product? Maybe maybe not. Maybe that's easier to do with TypeScript or or Python for the same reason. There's more people in the market.
Shay Nehmad:I definitely think that there's a shift, like, it might have not hit the recruiting, agencies yet, but I think there's a shift to smaller teams with more experienced developers because you can do a lot more with, like, AI tooling automation, blah blah blah. At least that's a promise. Right? There's also another benefit if you're doing, full stack, which is the other 25%. People say you need react like, the common cases you need react for the front end and TypeScript, for both front end and back end.
Shay Nehmad:And having a single language for front end and back end doesn't necessarily mean your architecture is very nice or whatever, but it definitely means that it's a lot easier for the same developer to, like, switch context and fix, like, do a a feature end to end. Right? And I think a lot of startups Lovable is a good example. We talked about it last week in our live episode. Like, they think they'll get pretty far with ARR with, like, a pretty bad, on a technical merit perspective, a a not great back end language, and then they'll have, like, the the market validation and the time to rewrite it in Go or rewrite in a rouse or at least the important performance bits.
Jonathan Hall:Mhmm. I don't
Shay Nehmad:know if it's misguided or not, but it it's definitely reasonable. Right? You're building something and you don't know if people even want it or will pay for it. Why care about the, like, multithreaded performance before you know it's ready?
Jonathan Hall:That that that's that's absolutely valid if all else is equal. And that that's what what you know, I made that that comment earlier. Now if all else is equal, I would choose Go over Python or or or TypeScript. You do make a strong argument. If you can only afford one or two developers, maybe you want, developers types of script experience because they can do both front end and back end.
Shay Nehmad:Anyway, so a pretty cool, cool blog post. We don't do a lot of shout outs for, like, other non Go, like, media outlets. Right? Yeah. But definitely, if you're looking for something to read that's not Twitter on the train, Pragmatic, I can definitely recommend Pragmatic Engineer.
Shay Nehmad:I've been following the guy for a few years now, and he's putting out some really good content. I think he's a proper, like, journalist full time now, not a engineer, but, still very cool. And if you now go, your state in startup world should be fine, but you should probably know TypeScript. That's that's the main
Jonathan Hall:I still don't know TypeScript, and I haven't found a reason to learn it. But, I do but do JavaScript.
Shay Nehmad:So Oh, just imagine three v eight engines in a tread trench code trying to behave like a real language. Cool. Let's talk about Go Go.
Jonathan Hall:We should talk about something else now. Let's segue oh, sorry. You weren't done. Go ahead and finish what you were saying.
Shay Nehmad:I was trying to segue.
Jonathan Hall:Yeah. I was trying to segue too.
Shay Nehmad:So let me do
Jonathan Hall:Let's try to segue wait a
Shay Nehmad:minute. Let's do it together. Wait.
Jonathan Hall:We need somebody to to solve this. No. We should we should have tested this before recording, how to do these segues without trampling on each other.
Shay Nehmad:Yeah. But how can we do testing for sync like, things that happen at the same time?
Jonathan Hall:Yeah. I wish we had, had known about testing sync tests before we recorded this program. That was a really clumsy segue. I hope it worked out.
Shay Nehmad:It it definitely, drives home the point that, doing, async and sync things is difficult. What's this blog post about? How can it help me?
Jonathan Hall:Yeah. So, we we we I think we mentioned it last week. We certainly mentioned it before. A new feature, a new experimental feature in Go one twenty four is the sync test package. And, you to enable it, you have to enable go experiment equals sync test on your on your build line.
Jonathan Hall:So, like, go, test or go experiment equals sync test, go test is would be how you do that. Right? So it's not there by default. But what does it do? It makes it easier to test, code that is timing sensitive.
Jonathan Hall:So the example they give here, in the blog post this is an official blog post from the Go team, by the way. So the example they give is, writing a simple test for the context dot after func capability. That that's a a feature that was added, I don't remember, a couple versions ago to the context package. Basically, it lets you register a function that will be executed after that context is canceled. How do you test for that?
Jonathan Hall:And so they they write a little naive test where you do an assertion that says, make sure this function has not been called, then call cancel function, then make sure it has been called. If I'm explaining myself clearly, it you you should be able to imagine some race conditions here. Like, if you assert after cancel too soon, maybe it hasn't actually run yet. So maybe you put a a time delay of ten milliseconds or something in there.
Shay Nehmad:I hate seeing sleeps in test though because Of course you do. Why on one hand, like, why do I have to wait? And on the other hand, it always feels kind of flaky.
Jonathan Hall:Indeed. It is flaky. And and and, actually, they talk about that in detail here. So, you know, say say you do ten milliseconds, and then maybe it'll work fine on your local machine, but you upload it to your, your slow overloaded shared CI server, and maybe it takes a second for that to happen. So you had a longer sleep.
Jonathan Hall:Now your tests are even slower, and you have a hundred of these in your in your entire test suite. Your your test is just growing and growing and growing, and they're still flaky. Occasionally, they're gonna fail because occasionally, you know, timing is bad and it takes two and a half seconds for that thing to run instead of one second.
Shay Nehmad:Poor old, Jenkins server running on the, like, bottom of the server rack with cobwebs is, like, struggling. The little server are good. So how can we solve this?
Jonathan Hall:Yeah. So the solution no. The the experimental solution here is sync test. It introduces two, functions. One called run and one called wait.
Jonathan Hall:So you use sync test run the same way you use t dot run, for example. You pass it a function, and by passing a function to sync test dot run, you you create what they call a bubble. And within that bubble, you can call sync test dot wait. And what that does is it waits for all Goroutines within that bubble to block. So that means there's nothing else running in the background, nothing, nothing that's, you know, reading from the network, I guess, or or I don't know if it actually guarantees that, but certainly nothing doing calculations.
Jonathan Hall:Nothing is happening in the background. So you're certain that, when you call sync test dot wait, when it returns, you're in a sort of a clean state in within your bubble that everything is is done happening. So then it's safe to do your assertion. You don't have to wait an arbitrary amount of time, ten second ten milliseconds or a hundred milliseconds or five seconds. You can just use sync test dot wait, and it will block until everything else is blocked, and then it will continue.
Jonathan Hall:And the blog post goes on. Yeah. That that that's just basically the first third of the blog post. The rest goes into more details, which I'll save for you to read, dear listener, rather than reading the entire blog post to you. But that's the that's the basic gist of it.
Jonathan Hall:I can think of a few cases where, I could definitely use something like this. I guess I'll probably just start grabbing my tests for, time dot sleep and see if I can use this instead.
Shay Nehmad:And there are specific use cases here they mentioned, like, testing for network code and IO operations and, like, how how to reimplement this with the sync test. Mhmm. This is experimental. Right? So it means that I don't have this by default.
Jonathan Hall:Right. You have to enable it. And the the API is not guaranteed to be stable. It could change. Of course, that's the whole reason for an experiment is to see how people react with it.
Jonathan Hall:If there's something they forgot, they need to change some some of it. So it it's it's possible that, the API will change potentially if we go 1.24 or or sorry, 1.25. I would imagine that the hope is to release this for general usage in 1.25 assuming nothing serious is discovered that prevents it from being generally useful.
Shay Nehmad:Cool. There's an issue for feedback. So if you do play around with it and find, like, places for improvement or something like that, at the bottom of the blog post, there's, like, the proposal where you can share your feedback.
Jonathan Hall:Indeed.
Shay Nehmad:Very, very cool. How does this I'm wondering. I I I didn't see any mention of it in the blog post, but, like, I'm wondering how this works with, test race. Right? Mhmm.
Shay Nehmad:Like, the race detector. It's probably, like I think it should work. I don't know if these features are completely, like, congruent or if you suddenly turn on sync test, it messes up the test detector. You know what I mean?
Jonathan Hall:I would I would expect that it would work fine.
Shay Nehmad:The race detector, I mean?
Jonathan Hall:Yeah. The race detector should work fine with it. It's a good question.
Shay Nehmad:It's it's very hard to to reason about, at least for me. Yeah. It it it's very simple on the surface to explain why you need it because it's very obvious to see the bad implementation and the good implementation, but just a few more mutexes and one more pipe and one more channel, and my brain is like, I don't know if, I'll do it correctly. But it's definitely an improvement of when trying to do it manually. Right?
Shay Nehmad:Yeah. Cool. Cool. So the call to action is if you have these sorts of tests, try to rewrite them with sync test, turn on the experiment, and share feedback?
Jonathan Hall:Absolutely.
Shay Nehmad:Would you use, like, an experimental feature in CI right now if it works well, or would you wait until the release? For, like, a not for a side project, for, like, a client project or a live Yeah. Yeah. That's a good question.
Jonathan Hall:I would probably wait for the general release. Or I you know, one thing I can imagine doing is writing the test twice. Mhmm. Once using the old method, you know, like, rather than rewriting my test, copy my test and then rewrite them using sync test.
Shay Nehmad:Interesting.
Jonathan Hall:I don't know if I would actually do that, but I could it's it's something that comes to mind as a possible solution.
Shay Nehmad:It would definitely be useful for feedback. Yeah. Exactly.
Jonathan Hall:Cool. One, final proposal I wanna talk about. This is one that's been on my radar for years. I'm really excited that it's getting attention again. It is currently and likely accept.
Jonathan Hall:I imagine next week, we can report that it's been accepted unless some of our listeners think it's a terrible idea and they go leave feedback. Don't do that. And actually, this proposal, I believe, has been accepted before, and then it somehow got lost, like, I don't know, in the weed somewhere. So it's it's, been reproposed, the exact same proposal, not even a new proposal on the same topic. Same proposal has been reproposed, went through the meeting, again just to make sure that the new, variation is what they want.
Jonathan Hall:The proposal is to add support to the net h t t net h t t package to support content negotiation. Do you know what that is, Shai? Or Or are you one of those folks who just always returns JSON no matter what?
Shay Nehmad:I'll be honest. I I'm probably always, returning JSON. Yeah. Yeah. Or plain text if it's, like Or
Jonathan Hall:plain text.
Shay Nehmad:Or HTML if it's HTML.
Jonathan Hall:So the the whole idea here with content negotiation is something that probably a lot of people don't even realize exist because they just always return the same thing. But HTTP gives you the option for the client to tell the browser what format they want the content in.
Shay Nehmad:Oh, for sure. Yeah. I do use that when I use, WTF as my IP. Because they have WTF as my IP and WTF as my IP dot slash JSON
Jonathan Hall:Okay.
Shay Nehmad:Which sends the same API request and then returns, you know, either an HTML page or a JSON object, which tells you, your IP address with a lot of profanity in the JSON key, which I really like.
Jonathan Hall:So so basically, you can you can the the the client can pass a an accept header that says, here are the content types I can I can consume? This is commonly used maybe for for images. Right? I don't know if it's that common anymore, but certainly, browsers will do this. They'll say, I accept WebP and JPG and PNG or whatever, and they give an order ranking of, I prefer WebP over JPG you know, and so on and so forth.
Jonathan Hall:And then content negotiations where the server takes that header, parses it with its weighted, suggestions, and compares that against the content types it knows how to produce to determine which content type it should produce for that particular request.
Shay Nehmad:Okay.
Jonathan Hall:So, you can also use this for text types. So you could have, some I've I've seen some APIs where if you just use curl, for example, it'll return an HTTP I'm sorry, an HTML response that says four zero four. But if you put accept j application JSON, it'll return a JSON representation with the same error message. Same same concept. So this is gonna become part of the center library, or it's likely accepted it will.
Jonathan Hall:Previously, you had to use a third party library if you wanted to do this in your server. So I'm really excited to see this, make it into the center library because it's a feature I've used occasionally. I don't use it in every project, but I've certainly used it in some projects. And, I I really think it belongs in the center library. It's part of the HTTP RFC spec.
Jonathan Hall:Don't know what else I can say.
Shay Nehmad:Isn't adding things to the HTTP though isn't h HTTP like frozen? Wouldn't you need HTTP v two to add this, like, feature?
Jonathan Hall:I don't think it's frozen. I mean, I I don't think it's anything officially that says it's frozen. It is a little bit bloated, and that there was some commentary on that talking about putting it in a different package. There was a an early suggestion to put it in a subpackage, you know, below the HTTP. I think HTTP util was what they thought of doing initially.
Jonathan Hall:Although, since then, they decided HTTP utile was a bad idea to even exist. So, yeah, they decided that ultimately unless one of our listeners or you goes and changes their mind, the proposal is to put it in that HTTP.
Shay Nehmad:Why what suddenly, I realized looking at this proposal, it's from, like, 2017. What happened to, to to pop it back up?
Jonathan Hall:Yeah. So the most, recent activity started on January 21, just a few weeks ago, when the Prometheus team, was finding more use cases for this. And so they they brought it back up, and brought the attention of the Go team to it. Go Prometheus.
Shay Nehmad:Nice. Well, I hope this, gets merged just to because you seem very excited about it. Yes. Well, we have a lot of very interesting, things to discuss, but we are out of time. So let's do them not a lot of justice in the lightning round.
Shay Nehmad:Lightning round. Just two quick projects that, popped into my, onto my radar from Reddit. The first one is, Minecraft. Have you played Minecraft?
Jonathan Hall:I tried once, and I couldn't get into it.
Shay Nehmad:Wow. My wife and I, hours and hours on end. So OG, in fact, that I got it for her as a present on a CD. Woah. Yeah.
Shay Nehmad:Haven't seen one of those in a while. Anyway, someone implemented, like, all the Minecraft clone with all the basic features where you could walk around and and delete blocks and add new blocks and physics and shaders and whatever, in Go. And then as I often do, I went to this person's GitHub page, and I saw they also mentioned they also implement something that I might actually use. Like, this is a cool project. Then on Reddit said, yeah.
Shay Nehmad:I thought it would be cool to do so. I did I did it. But then I saw they implemented Tmux session management. Do you use a Tmux too? Like
Jonathan Hall:Sometimes. Mhmm.
Shay Nehmad:So I I use, Tmuxminator, which, like, creates the sessions for you and you can save them in a file. So whenever you open your PC and your, like, Tmux session might have died or you restarted or whatever, you just go Tmuxminator start, and you have all your sessions and they're named so it's easy to navigate between them. Unfortunately, over the last, like, year or so, I've fallen down the rabbit hole of using terminals with tabs. Started with iTerm and then wrap, and now I'm in Ghosty. And doing both tabs, the terminals, and the TMux is kind of redundant.
Shay Nehmad:Yeah. So I've sort of fallen off the TMux train, which is unfortunate because I think it was actually a lot more productive for me. But, yeah. If you do, TMUX, there's TMUX session management implementing Go. It's called mynav, same guy who did the Minecraft thing, with a release just three weeks ago.
Shay Nehmad:So it's even like, it even fits the the Capago news ish theme because there's a new version, released, three years ago where you can have your workspace directly from a Git URL, which is nice.
Jonathan Hall:Alright.
Shay Nehmad:So, yeah, two cool projects. Awesome.
Jonathan Hall:I think I heard recently that was it Sony? It recently stopped producing writable CD media. Better stock up now before Yeah. For for
Shay Nehmad:if you ever need to save 500 megabytes of of a video. Yeah. Alright. That does it for news this week. Stick around for a short ad break and then an interesting interview after that.
Shay Nehmad:Welcome to our ad break. As Jonathan mentioned in the beginning of the show, this show is supported by you. This week, we have a new Patreon member. Thanks a lot to Jay Martin for joining our our Patreon supporters. If you wanna support the show, this is a hobby.
Shay Nehmad:We do it for fun and to learn, but it's a pretty expensive one because we pay for hosting, editing fees, and, you know, it's our time, etcetera etcetera. If you wanna support us, you can kick in $8 a month via Patreon, and we would greatly, greatly appreciate it. We wanted to say thank you to all the community for joining, well, whoever did join, the live episode last week. It was a lot a lot of fun. We got great feedback.
Shay Nehmad:We'll probably do that again sooner than the two hundredth episode. But just want to say thanks to everyone for joining. I know some people had technical issues joining. I'm really sorry about that. It is our first time.
Shay Nehmad:But, yeah, it was a lot of fun. You can listen to the episode, on wherever you listen to podcasts normally, and you can also watch the video of us doing the the episode on YouTube. If you wanna reach us, you can find us at cupago.dev, where you can find links to all these things relating to the show, past episodes, transcripts, link to the, Slack community, hashtag Cupago, kebab case with hyphens, or you can email us at news@cupago.dev. That is news@cupago.dev. We recently got a very useful email telling us one of our links on the site was broken, so I can I can assure you that the email works?
Shay Nehmad:If you wanna support the show in other ways, you can buy Swag in the Swag store, which you can also find in cupago.dev. And you can also share, the show with a friend, a coworker, or a co student. You can also help us climb the rankings with a review and a rating on Spotify, Apple Podcasts, or, like, wherever you listen to your podcast. We don't pay to advertise the show, and word-of-mouth is the only way we, get to new people. Hey, Jonathan.
Shay Nehmad:You're seeing what I'm holding here? Holding here? This is an audio show. Suddenly, I realized this joke isn't going to land at all.
Jonathan Hall:I see it.
Shay Nehmad:I'm so stressed out, you know, trying
Jonathan Hall:to release
Shay Nehmad:my project. I've been crushing this, stress ball so hard. My hands are getting tired. Who can help me release go? Who can help me release all this stress?
Shay Nehmad:Oh, hi, Carlos.
Carlos Becker:Oh, yeah. That's part of me.
Shay Nehmad:Alright. We have, Yogi and a stress anger management consultant. Carlos here on
Jonathan Hall:the call.
Carlos Becker:Hey. Hello.
Shay Nehmad:Hello, Carlos. So Carlos is, the brains and bronze behind the Go Releaser. Before we dive into it, how would you present yourself to our, beautiful audience?
Carlos Becker:Okay. Hello. My name is Carlos. I'm from Brazil. I live in Brazil.
Carlos Becker:I've been working with software for over ten years. I don't remember how long exactly anymore. It's enough to a few old. I can say that. And I've been working with Go since Go 01/1943, something like that.
Carlos Becker:And I created Go Reducer and a bunch of other libraries and CLIs. And I also work at Charm, so we do Go there as well. And, yeah, I think that's a good summary of it, I guess.
Shay Nehmad:Cool. Cool. And for people who don't know, what is Go Releaser other than one of my favorite Go projects and the projects we talked about on the show multiple times?
Carlos Becker:Yeah. I've listened some of them, I think. Yeah. So go Google is there is a tool to help, as the name implies, releasing Go software. Since some versions of Go, it now also releases Rust and Zig and TypeScript depending on which, compiler you're using.
Carlos Becker:And the plan is to add more languages there. But, basically, you give it a set of targets. It compiles them to binaries and creates archives, Docker images, w W installers, Honeybrew tabs, RPMs, and signs and creates Sys bones and all the all the release fields you need, greatest the change allowed you. So it's basically you create a YAML file, push a tag, and it does pretty much everything might want, hopefully, for you. And, yeah, that's it.
Jonathan Hall:Now that it isn't just Go, does does the name need to change? And if so, I suggest stress releaser.
Carlos Becker:Yeah. I was thinking about that yesterday, actually, and I already talked about it with a couple of friends a couple of times. I really love the the logo we have right now, so that that's the the only thing holding me back. But I think I'm probably gonna have to change it for two reasons. One of them is the languages that's that's now supports more than one language.
Carlos Becker:And the other thing is that Gorillazers commonly wrongly read as Gorillazers. So there there is that problem. Oh. I don't know what a Gorillazers could be. But yeah.
Carlos Becker:Like a block from blockbuster for snuff films. Yeah.
Jonathan Hall:Yeah. Something like that.
Shay Nehmad:The logo is pretty great. It's like the gopher, just riding to the stratosphere on top of a rocket.
Jonathan Hall:Yeah.
Shay Nehmad:So I just wanna say, like, I I've used the I've worked at the Orca Security, which is a a pro license holder of GoReleaser, and we super love the tool. Very useful if you're, like, a company and you have, your thing and you want your customers to be able to use it and you don't wanna be worried about all the release and deploy and all these, like, automating all this nonsense. The thing you said about writing a YAML and it just works, like, yeah. Happy customer here for sure. Jonathan, do you use a Go Releaser for any of your libraries?
Jonathan Hall:I I do. I use it I use it for my KIPOC, package. It's, open source library and a CLI tool. So the CLI tool is built and released to Go Releaser.
Carlos Becker:Cool. Yeah. Nice to hear you. You sure use it and like it. That's it.
Carlos Becker:Yeah.
Shay Nehmad:It's it's pretty widespread compared to, like, you know, 15,000 stars, and all, all that stuff. So I'm interested in hearing, so you wanna add more languages. What other cool things are, like, on the roadmap?
Carlos Becker:I have a couple of things I want to do. One of them is related to Docker images, because right now, the configuration is a little bit repetitive because initially, there weren't, like, Docker manifest. It was just Docker images. Now there's manifest, so you have to create the image images configuration, and then you probably have to copy a a bunch of labels from one configuration to the other. So it looks like a big chunk of really similar YAML code, and then you have to wire those into the manifest.
Carlos Becker:So that's something I want to improve. Probably also use, like, the Docker libraries in Go directly so you don't have to use the Docker CLI to actually build images and the manifest and, like, kind of copy how the Docker something action. I don't remember the it's like the name of the action is Docker build image action or something like that. It it a bunch of copies culture being inspired maybe by their, configuration because it it's a a good configuration, I think. So I'm gonna do something similar about that.
Carlos Becker:And the other thing that came up a couple of days ago is that since forever, we've been doing, like, creating formulas on Honeywell, but it actually should be a cask. So there is that change that I'm also thinking on how to do. Both of these will probably be breaking changes. So it's probably something for Google, these are victory. And also now that, another thing I just remembered now that we have more targets and more languages, I also want to change some internal things that aren't so fun to talk about, I guess, but yeah, some restructuring here and there.
Carlos Becker:Yeah. That's kind of the biggest things on my roadmap for now.
Shay Nehmad:What's the difference between a cask and a formula in in Homebrew? Like, I know I have to sometimes add minus minus cask, but I actually don't know why. I'm just copying the command line of the website and and doing whatever it tells me.
Carlos Becker:Yeah. If I'm if my memory serves me, I think a cask is is supposed to be used to install pre compiled binaries and apps and things like that. And the formula is supposed to build from servers. So since forever, we've mimicked building from servers, but we actually are installing pre pre installed pre build packages pre build banners, actually. Yeah.
Carlos Becker:And I just got an issue a couple of days ago about it, and it makes sense. Before, it didn't make sense to change it because I think Linux built in a support casks or something. But now apparently it does.
Jonathan Hall:It's
Carlos Becker:probably going to happen eventually.
Shay Nehmad:Cool.
Jonathan Hall:How much time do you spend on this? I mean, this this sounds like a really ambitious project supporting multiple languages and multiple build targets. And look. You just look at the feature list. It's a lot of stuff.
Jonathan Hall:And I I know it's been building up over time, but it still has to be a certain amount of effort to even maintain what you have without adding new features. What what kind of time are you spending
Carlos Becker:on this? So I'm not very consistent, I think. There are days I don't do anything and other days, like, I that I sit, like, five hours straight or something. So I don't really know how much time, but it's not that much time anymore. In the beginning, it was more because there are there are more missing features, I think.
Carlos Becker:Now it's mostly, like, maintaining the latest big features I added were, like, the, the other languages support. Yeah. It's almost ten years old now, so it's it's got a lot of efforts and hours in it for sure.
Jonathan Hall:I'd I'd also like to talk about you have a paid version, a pro version. I don't know how many people are aware of that. I mean, I know a lot I've I've spoken to many people who have heard of and use GoReleaser at meetups and so on. I don't get the sense that the pro version is as well known. Talk to me about that.
Jonathan Hall:What let's let's start with this. What's what are the differences between the pro version and the free version?
Carlos Becker:The pro version has some extra features, basically. It has, the recent features I added there is, like, AI to, change your changelog if you want to do that. There are a couple of extra options regarding Tink MSIs and you can import, rebuild binaries from other sources. And, it's a bunch of small leach things. I think the biggest difference there is that you can actually split the build by, operating system or target and merge it, later to, so you can like, if you use Seagull, for example, you can build like windows on a windows machine and some Linux machine, etcetera, And then do another job, like, merging everything and, like, pushing the images and all that stuff in the the last part.
Carlos Becker:Yeah. But it's basically something I probably should have done sooner. A lot of people say that I should do that, and I was like, who who will pay for it? You know? I I didn't I didn't value myself enough, I think.
Jonathan Hall:Yeah. So that that brings up my my next question. If you're willing to share this publicly, I'm curious how many subscribers you have to the pro version, or or if you don't wanna share numbers, just some sort of sense of scale. Is it a lot of people? Is it just a few?
Carlos Becker:It's about if I'm not mistaken, the last time I looked, it was about 200 subscriptions. So it makes around four k in a row, give it give or take. So it's that's good to go for me running it solo.
Jonathan Hall:For a side project. Yeah. Yeah. It's not a it's not it's not a full salary, but it's a good side project. Yeah.
Carlos Becker:In Brazil, it actually can be a a a good salary. Yeah.
Jonathan Hall:Could be. Yeah. Yeah. Yeah. That's not your only open source project, though.
Jonathan Hall:I mean, I actually recognize your GitHub handle mostly from your e n v package, which I import in almost every project I work on. Is that something that that came out of Gorillaser, or is that completely independent?
Carlos Becker:I think that's independent. I don't remember starting it from Gorillaser. If I'm not too crazy, I think I was kind of inspired by some Java libraries that I used back in the day. I think there was one too many. I think it was environment variables to Java classes or something like that.
Carlos Becker:And I was like, no, that's a good idea. Did that with Go mainly to learn, like, the the Reflect API and all that that stuff. People apparently enjoy it, and it's on version 11 now. So it's there.
Shay Nehmad:And I again, this is sort of another, going back to, Jonathan's question. I know I use charm. I use gum a lot. Charm basically make, like, very, very good command line tools, and that's what I know, at least. I love the, like, terminal UI frameworks and GUM especially because it's so easy to plug into bash scripts and just have a super nice picker and, like, not worry about it too much, and, that's really cool.
Shay Nehmad:What do they do that, like, makes money? Like, other I I love the I love the tools that that I I almost don't wanna know how the sausage get made sort of sort of a way because I really like the tools, and I really, really like the branding. It's so, like, pink and nice. But but what's the like, what does the company actually do? You know what I mean?
Carlos Becker:Yeah. So we are working on that. Right now, we are leaving off, investments. So we don't have any any paid products yet, but we are figuring that out. And I can't say more about it for now.
Carlos Becker:So Oh, Okay.
Shay Nehmad:Now I wanna know even more.
Jonathan Hall:Sorry, Shai. You can't know how the sausage is made.
Shay Nehmad:For sure. And what do you do in, Charmer? Because Charmer has a lot of projects. Right? Like, various libraries, animations and Sage apps and style libraries that do you like dabble in all of these projects or is there like one thing that's you?
Carlos Becker:There are a couple of projects that I created. I think I contribute to pretty much all of them at least a little bit. But I work mostly on Wish, which is the SSH app from your, on mods, which is the AI command line thing. I recently did a lot of things in Grum and, saw bubbles that, are used everywhere else, which is, for those who don't know, bubbles is a component library for, for command line apps. I contribute to Bubble Tea more or less often.
Carlos Becker:And, yeah, I I think pretty much everything. I I touch everything, but recently, publicly, I think it's more Wish and mods and GUM, I think. And VHS is true.
Shay Nehmad:Do you tend to, like, reach for, you know, the the charm things more often? Because, theoretically, you can do command line applications just with flags. Right? You don't really need all these good looking things. Do you think it's a it's a good default, or should should people only reach for charm when they actually build a terminal UI?
Carlos Becker:You you mean the differences between a a TUI and a, yes, and a CLI. Right?
Shay Nehmad:So the difference between the CLI and and TUI is that TUI is look better, and they're more interactive, and they might have, like, features where you can scroll and enter and they are stateful, etcetera, etcetera. Do you think that the default should like, when you develop a new a new tool, is your default at this point alright. I I want it to look nice and be interactive, first, or is your default still like the Linux mindset of let's just keep it simple and do a CLI first and only do a TUI if it makes sense?
Carlos Becker:It depends a lot on what I'm I'm building. If it's something that could benefit from being interactive, I I probably do it interactive at least at some point in time. Maybe not, like, for starters, but eventually. But, yeah, I I really like, like, automating things. So even if I do something that works, like, interactively, I also try to make it work non interactively because shell scripts and so on and piping things through through each other and all that good stuff.
Carlos Becker:So that that's my my line of thinking, more or less.
Shay Nehmad:I tend to reach for, gum pretty often. Gum is the it allows you to really quickly insert, like, a picker into your scripts and whatever. But then what happens is when I wanna rerun the command really fast, I I find that I can't because I can't just, like, type the command, press enter, and I because I have to go through, like, a interactive segment. And then I'm, like, kicking myself in the in the channel, like, ah, why did why did I implement this interactive part? But some of the TUI's I've been using for, like, when you actually do interactive stuff, they've been really, really, really nice.
Shay Nehmad:Is gum and, like, the charm bracelet stuff the most common ones? Because I know that there are a lot of TUI frameworks in Rust and in other languages. Are the there is the charm stuff, like, the most, popular ones, or is it, like, a a tough battle out there for for domination of the TUI framework thing?
Carlos Becker:Honestly, I don't know. I I think charm is, if not the most popular, but one of the most populars. I I don't know. Like, there's Textual in Python, I think. Protatoo in Rust that are also pretty famous.
Carlos Becker:There is the old one in c, and Persis. Yeah. There's I don't know how to measure popularity either. Like, if it's GitHub stars, probably it's charm. If it's usage out there, I would bet on main curses, I think.
Jonathan Hall:For sure.
Carlos Becker:There's a lot of old things out there for main curses. So I guess it depends.
Shay Nehmad:GitHub stars are such a weird metric. You have a tool that that measures GitHub stars, right, or or prints them, I think.
Carlos Becker:Yeah. It tries to graph them, like, over time. It was mostly me being curious about, like, how projects get to, like, 10,000 stars or something. But I don't know if this changes this change it, but when I created it, you couldn't, like, get it exactly build the graph properly because it only returns the stars that are still there. So if someone started, like, I don't know, two years ago and then on star.
Carlos Becker:The, your repo it's it just won't show up basically. So it's not very precise. I think there are other tools that, like, keep watching and starring on their own databases so they can see, like, when you lose a star and that kind of thing. But I in the end, I don't really care that much about it. I think it's it's just nice to see the the graph there.
Carlos Becker:Yeah.
Shay Nehmad:I always wonder if it's a vanity metric or if it's a real metric. I love when people star my projects, but, obviously, none of them have been as successful as, something like Go Releaser with 15 k stars. I assume the, like, the paid licenses are a much more meaningful validation of of, like, the work is actually useful or download numbers or or number of issues, things like that are are much more I don't wanna say valid because they're both valid, but I I would say more real or more concrete, like, feedback that the project is actually good than feedback than GitHub stars. Right?
Carlos Becker:Yeah. I think so. I think the thing with GitHub stars is that we don't really know how everyone else uses them. Some people star anything they like. Some people only star things they use.
Carlos Becker:Some people use it as, like, bookmarks or whatever. So it means someone look into it and, at least felt something, so they start it. But I don't know how good it is. If we think, like, financially, yeah, for sure. The like, the MRR and all those metrics are are better success metrics, I think.
Carlos Becker:But at the same time, Gorlaser was just up in service for a lot of years, I think five years or something. So a lot of people don't know about the paid version. A lot of people don't need the paid version because I had already built so many features in the free version.
Shay Nehmad:Which I'm happy I'm happy about just to like, I don't wanna I want I don't want you to leave this interview. Like, yeah. Next release of Gorillaser. Everything is behind the paywall.
Carlos Becker:No. I will never do that. You
Shay Nehmad:only get half the binary. You get 50% of the bytes. You have to pay me for the rest.
Carlos Becker:No. I would never do something like that.
Jonathan Hall:You remember back in the shareware days when the the free the free version would have, like, a time dot sleep thirty seconds before it would start running?
Shay Nehmad:There are some good stuff from that era, man. I never did this, of course, but a friend told me that you, like, get a a, like, a shared key generator for, like, a software you want to use, and it had the most awesome music and the best artwork on it. Like, you open it up on your Windows, which is like just you click on it. You get a, like, a UID. It's basically a UID generator.
Carlos Becker:Yeah. Need first piece most wanted to have the key generator like that.
Jonathan Hall:You know what
Shay Nehmad:I'm saying? Obviously, we don't, EA, I don't know who owns is it two k now? Two k, if you're listening, obviously, we're we're just talking about things we saw on our friends' computers. We always paid for our copies fully. Don't worry about
Jonathan Hall:it. Yeah. Totally.
Shay Nehmad:So, Carlos, for the Go Releaser and the other blog post that you're putting out and all your links and whatever, where can people find you if they wanna reach out about the projects you've told us? As you've told us off the record, some things that might be cooking and you're not willing to divulge yet, but maybe people wanna talk to you about.
Carlos Becker:Yeah. So go redeezer.com for everything Gorillizer related. You can go to carlosbecker.com for my blog and personal site. I'm also on Max and GitHub, as, at carlos with two a's and the numb number zero in them, which is a very bad username, but it's been there forever, so I'm not going to change it. Yeah.
Carlos Becker:I mean, I think those are the the main places. I'm most active on on Max and yeah. I think on Max.
Jonathan Hall:That reminds me of one of the first questions I ever had when I saw your username is why the two a's or why is it Carlos?
Carlos Becker:So it's a funny story. When I created my first Gmail account, like, I don't know, 2,000 something. I tried to create cardosgmail dot com and then, it already exists. So Carlos one already exists. Carlos zero already exists.
Carlos Becker:And then I just got annoyed and put like another a there and that's it. That that's how I
Jonathan Hall:got it. And it worked. There you go.
Shay Nehmad:It's definitely, definitely better than my, thing where I did, like, shy@thegmail.com. And then it was, already taken. And then I did, okay. You know what? Dude500@gmail.com, which is my personal email.
Shay Nehmad:And, you know, I've been applying to jobs at, like, super serious places or, like, going to my insurance agent or, like, what's your email? Like, it's d u d e five. And I'm really hoping that they don't spell it out in their head.
Carlos Becker:I I I have a fix for you. Get the domain and
Shay Nehmad:I do. I do. Yeah. Now I have hello@chinachmod.com for sure for sure.
Jonathan Hall:Oh, I I thought you were gonna say you were shy at dude five hundred dot com.
Shay Nehmad:I I you know what? The the best, the the the best outcome of this, like, problem is that when my daughter was born I don't know. It's not the first thing. Like, first thing I hugged her and then I cried, but definitely in the, like, five hours after she was born, she already had a Gmail account, which is like, firstname.lastname@Gmail.com. In Google, you can do, like, family account.
Shay Nehmad:Like, I took care of that. She's not gonna make the same mistake.
Jonathan Hall:She doesn't have a college savings, but she has a Gmail account. For sure.
Carlos Becker:That that's a good column. Yeah.
Shay Nehmad:I I didn't buy a car seat. Like, I tied her to the roof, but she had a is a Chivo. No. I'm just kidding. Alright.
Shay Nehmad:Alright. Carlos, thanks for, jumping on the interview. We have a stumper question. Anton, you wanna line it up?
Jonathan Hall:Yes. Yeah. So, the the audience, of course, already knows the question because we've asked it a couple of times this year. But the question, who has been the most influential, as you've been learning Go? And I know you've been using Go for a long time, so you might have to think back really hard.
Jonathan Hall:But, who in the Go ecosystem helped you the most? Maybe they wrote a book or a blog post or something like that.
Carlos Becker:So right back during the beginning, I started learning Go because I was working as a site reliability engineer. So I I figured out, like, well, Docker is written in Go. Prometheus is written in Go. Prometheus is written in Go. So I wanted to learn Go to be able to maybe fix issues that I had and things like that.
Carlos Becker:And I, I did fix some issues like that. So I think the most influential developers for me back then, where I think the ones in Prometheus were the most because, I forgot their names now, but I remember that they were very strong opinion strongly opinionated in the sense of, like, keeping things simple. Like, if you can do things in one way even if it's not, as convenient as this other way you are proposing, maybe let's stick with that one single way for now. That really resonated with me at the time because, I came from Java, which has 3,000 ways of doing everything.
Jonathan Hall:Mhmm.
Carlos Becker:And, like, you never know which one is the best. Most of the time there isn't the best ways. It depends on the case and not that. So, yeah, that person that I forgot the name now is is one of the biggest inflation influences on me. Later on also, Mitchell Hashimoto from HashiCorp because of Terraform and all of that line of software too.
Carlos Becker:Yeah. I I think those are the probably the in goal is this true. Yeah.
Jonathan Hall:Yeah. We
Shay Nehmad:should we should, like, set up a hall of, of fame for all these, people. Like, people are mentioning different people as their, you know, influences. I think that's interesting.
Carlos Becker:Yeah. I think we can all, like, read the same things, but different things resonate with everyone. So everyone turns different conclusions from the same input sometimes. And Yeah. That's beautiful.
Jonathan Hall:Cool. Well, Carlos, it's been a pleasure chat chatting with you. Thanks for all the work on Go Releaser. I continue to use it in in your other libraries and appreciate them. So thank you.
Shay Nehmad:Yeah. And don't forget stress releaser. I think, you know, for a rebrand.
Carlos Becker:So send me name ideas.
Shay Nehmad:Yeah. Just just imagine just imagine the swag. Right?
Carlos Becker:It's a good swag idea, actually. Yeah. But, yeah, thank you for for having me here today. It was really
Shay Nehmad:fun. Awesome. Wonderful. That's all we have for you this week. Join us next week.
Shay Nehmad:Although, I might not be on the show next week. It might be just Jonathan. And thanks a lot. Program exited. Goodbye.
Shay Nehmad:Program exited. Goodbye.
Creators and Guests

