The strength of Go in the job market 📈, and some stress relief with Carlos Becker 🚀 - podcast episode cover

The strength of Go in the job market 📈, and some stress relief with Carlos Becker 🚀

Feb 21, 2025â€ĸ57 minâ€ĸEp. 100
--:--
--:--
Listen in podcast apps:
Metacast
Spotify
Youtube
RSS

Episode description

★ Support this podcast on Patreon ★

Transcript

Jonathan HallJonathan Hall

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 NehmadShay 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 HallJonathan 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. 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 NehmadShay Nehmad

I wonder if my microwave implementation uses time dot duration.

Jonathan HallJonathan Hall

Your microwave implementation. I don't know.

Shay NehmadShay 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 HallJonathan Hall

Yeah. I use it.

Shay NehmadShay 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. 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.

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 HallJonathan 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 NehmadShay 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 HallJonathan Hall

And including Rust and Zig people, potentially. For sure.

Shay NehmadShay Nehmad

So kick us off.

Jonathan HallJonathan 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 NehmadShay Nehmad

So Nothing scary.

Jonathan HallJonathan 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 NehmadShay Nehmad

For sure. So just do I need to put on my calendar to upgrade my crypto packages on Monday?

Jonathan HallJonathan Hall

You should you should upgrade your crypto packages every day.

Shay NehmadShay 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 HallJonathan Hall

Yeah. Interesting question. I don't know.

Shay NehmadShay 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 HallJonathan Hall

Oh.

Shay NehmadShay Nehmad

Yeah. I did it by accident.

Jonathan HallJonathan Hall

So I wonder if we have any accidental Patreons for

Shay NehmadShay 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.

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.

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.

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 HallJonathan 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 NehmadShay 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?

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.

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.

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 HallJonathan 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 NehmadShay Nehmad

a front end. A VC backed startup game. It's just like a company.

Jonathan HallJonathan Hall

I don't know if it is. It might be a startup back. I I think they've got some VC. Interesting. Yeah. But, I mean, it's it's still pretty small potatoes, though.

Shay NehmadShay 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 HallJonathan Hall

Mhmm. Mhmm.

Shay NehmadShay 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.

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 HallJonathan 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. Because, I mean, all else being equal, chooses choose another simple language that's not single threaded.

Shay NehmadShay 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.

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.

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.

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.

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.

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 HallJonathan 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.

Now, not everybody needs that naturally, but

Shay NehmadShay 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?

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. 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.

But just the the popularity is the popularity is a big is a big attractor, I think.

Jonathan HallJonathan 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.

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 NehmadShay Nehmad

Mhmm. The

Jonathan HallJonathan 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 NehmadShay 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.

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 HallJonathan Hall

Mhmm. I don't

Shay NehmadShay 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 HallJonathan 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 NehmadShay 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.

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 HallJonathan Hall

I still don't know TypeScript, and I haven't found a reason to learn it. But, I do but do JavaScript.

Shay NehmadShay 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 HallJonathan 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 NehmadShay Nehmad

I was trying to segue.

Jonathan HallJonathan Hall

Yeah. I was trying to segue too.

Shay NehmadShay Nehmad

So let me do

Jonathan HallJonathan Hall

Let's try to segue wait a

Shay NehmadShay Nehmad

minute. Let's do it together. Wait.

Jonathan HallJonathan 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 NehmadShay Nehmad

Yeah. But how can we do testing for sync like, things that happen at the same time?

Jonathan HallJonathan 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 NehmadShay 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 HallJonathan 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. 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.

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?

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 NehmadShay 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 HallJonathan 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.

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 NehmadShay 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 HallJonathan 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.

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.

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.

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. 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 NehmadShay 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 HallJonathan 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.

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 NehmadShay 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 HallJonathan Hall

Indeed.

Shay NehmadShay 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. 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 HallJonathan Hall

I would I would expect that it would work fine.

Shay NehmadShay Nehmad

The race detector, I mean?

Jonathan HallJonathan Hall

Yeah. The race detector should work fine with it. It's a good question.

Shay NehmadShay 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?

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 HallJonathan Hall

Absolutely.

Shay NehmadShay 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 HallJonathan 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 NehmadShay Nehmad

Interesting.

Jonathan HallJonathan 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 NehmadShay Nehmad

It would definitely be useful for feedback. Yeah. Exactly.

Jonathan HallJonathan 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.

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.

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 NehmadShay Nehmad

I'll be honest. I I'm probably always, returning JSON. Yeah. Yeah. Or plain text if it's, like Or

Jonathan HallJonathan Hall

plain text.

Shay NehmadShay Nehmad

Or HTML if it's HTML.

Jonathan HallJonathan 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 NehmadShay 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 HallJonathan Hall

Okay.

Shay NehmadShay 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 HallJonathan 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.

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 NehmadShay Nehmad

Okay.

Jonathan HallJonathan 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.

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. Don't know what else I can say.

Shay NehmadShay 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 HallJonathan 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.

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 NehmadShay 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 HallJonathan 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 NehmadShay 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. 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 HallJonathan Hall

I tried once, and I couldn't get into it.

Shay NehmadShay 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.

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.

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 HallJonathan Hall

Sometimes. Mhmm.

Shay NehmadShay 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.

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. 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 HallJonathan Hall

Alright.

Shay NehmadShay Nehmad

So, yeah, two cool projects. Awesome.

Jonathan HallJonathan 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 NehmadShay 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. 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.

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.

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.

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 [email protected]. That is [email protected]. 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?

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.

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 HallJonathan Hall

I see it.

Shay NehmadShay Nehmad

I'm so stressed out, you know, trying

Jonathan HallJonathan Hall

to release

Shay NehmadShay 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? Oh, hi, Carlos.

Carlos Becker

Oh, yeah. That's part of me.

Shay NehmadShay Nehmad

Alright. We have, Yogi and a stress anger management consultant. Carlos here on

Jonathan HallJonathan Hall

the call.

Carlos Becker

Hey. Hello.

Shay NehmadShay 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. 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. 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 NehmadShay 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.

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 HallJonathan 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.

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. Like a block from blockbuster for snuff films. Yeah.

Jonathan HallJonathan Hall

Yeah. Something like that.

Shay NehmadShay Nehmad

The logo is pretty great. It's like the gopher, just riding to the stratosphere on top of a rocket.

Jonathan HallJonathan Hall

Yeah.

Shay NehmadShay 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 HallJonathan 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. Yeah.

Shay NehmadShay 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.

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.

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.

Yeah. That's kind of the biggest things on my roadmap for now.

Shay NehmadShay 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.

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 HallJonathan Hall

It's

Carlos Becker

probably going to happen eventually.

Shay NehmadShay Nehmad

Cool.

Jonathan HallJonathan 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. 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.

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 HallJonathan 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. 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.

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 HallJonathan 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 HallJonathan 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 HallJonathan Hall

Could be. Yeah. Yeah. Yeah. That's not your only open source project, though. 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. 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 NehmadShay 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.

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. So Oh, Okay.

Shay NehmadShay Nehmad

Now I wanna know even more.

Jonathan HallJonathan Hall

Sorry, Shai. You can't know how the sausage is made.

Shay NehmadShay 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.

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 NehmadShay 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 NehmadShay 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.

So that that's my my line of thinking, more or less.

Shay NehmadShay 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.

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. 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 HallJonathan Hall

For sure.

Carlos Becker

There's a lot of old things out there for main curses. So I guess it depends.

Shay NehmadShay 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.

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. Yeah.

Shay NehmadShay 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. 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.

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 NehmadShay 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 NehmadShay 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 HallJonathan 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 NehmadShay 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 HallJonathan Hall

You know what

Shay NehmadShay 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 HallJonathan Hall

it. Yeah. Totally.

Shay NehmadShay 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. I mean, I think those are the the main places. I'm most active on on Max and yeah. I think on Max.

Jonathan HallJonathan 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. And then I just got annoyed and put like another a there and that's it. That that's how I

Jonathan HallJonathan Hall

got it. And it worked. There you go.

Shay NehmadShay Nehmad

It's definitely, definitely better than my, thing where I did, like, [email protected]. And then it was, already taken. And then I did, okay. You know what? [email protected], which is my personal email. 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 NehmadShay Nehmad

I do. I do. Yeah. Now I have [email protected] for sure for sure.

Jonathan HallJonathan Hall

Oh, I I thought you were gonna say you were shy at dude five hundred dot com.

Shay NehmadShay 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, [email protected]. In Google, you can do, like, family account. Like, I took care of that. She's not gonna make the same mistake.

Jonathan HallJonathan 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 NehmadShay 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. Alright. Carlos, thanks for, jumping on the interview. We have a stumper question. Anton, you wanna line it up?

Jonathan HallJonathan 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. 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.

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 HallJonathan 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. Yeah. I I think those are the probably the in goal is this true. Yeah.

Jonathan HallJonathan Hall

Yeah. We

Shay NehmadShay 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 HallJonathan 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 NehmadShay Nehmad

Yeah. And don't forget stress releaser. I think, you know, for a rebrand.

Carlos Becker

So send me name ideas.

Shay NehmadShay 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 NehmadShay Nehmad

fun. Awesome. Wonderful. That's all we have for you this week. Join us next week. Although, I might not be on the show next week. It might be just Jonathan. And thanks a lot. Program exited. Goodbye. Program exited. Goodbye.

Transcript source: Provided by creator in RSS feed: download file
For the best experience, listen in Metacast app for iOS or Android
Open in Metacast