Proposals, proposals, proposals. And faster PostgreSQL tests with Peter Downs
This is Cup o' Go for 07/24/2026. Keep up to date with the important happenings in the Go community in about twenty minutes per week. I'm Jonathan Hall.
Shay Nehmad:And I'm Shay Nehmad.
Jonathan Hall:Hi Shay, how are doing?
Shay Nehmad:I am doing all right here in beautiful San Jose, California. I have a nice weekend planned ahead of me, and I'm just dying to know, does the testing package allow examples with any signature?
Jonathan Hall:I'm so glad you asked because the answer is no, it does not.
Shay Nehmad:Quick This is how normal people talk. Right? This will be believable.
Jonathan Hall:Before we dive into that, we haven't we're gonna talk about some proposals today. We're gonna talk about, I guess, mostly proposals and Go Plus.
Shay Nehmad:Yeah. Proposals and, I guess, etiquette in the LLM age.
Jonathan Hall:A fantastic interview coming up with Peter Downs. We just got Yeah, that was a
Shay Nehmad:lot of fun. I'm excited to get to it, so.
Jonathan Hall:Yeah, just got off with So, let's breeze through this news so you can listen to Peter Downs talk about PostgreSQL, Go, Vibe coding, and a couple of other things. So, yeah, you may or may not know, this isn't the most popular feature of testing in Go, but you can make executable examples. Did you know that, Shah?
Shay Nehmad:Oh, yeah. I I know of the feature and whenever I remember it, I feel really, really smart because it makes a lot of sense. You put the example, you get like both the benefit of documentation, but you know it's right. I tend to use it quite often in Python actually with doc tests and whenever I remember it's there in Go, I try to use it as well.
Jonathan Hall:Right, so you can create executable examples which serve two purposes. They serve as tests that can be executed as part of your test suite, and they serve as documentation that can be executed while you're browsing through the documentation. So, if you're watching, you can see that on my screen, I pulled up the GoDoc for the FMT package, for FMT. Printf. So, you can see on my screen here I have the documentation for FMT.
Jonathan Hall:Printf, if you're watching on the video. And it just shows a little example that says func main and has a little FMT. Printf in there, and there's a little run button down at the bottom. If you click that, you can actually execute the code and it shows the output on the screen. So, two I'm not sure
Shay Nehmad:who Kim is and were 22
Jonathan Hall:years old
Shay Nehmad:when they wrote this function. Know that's not the point, but the example it's like the first time I'm actually reading the example, and the example is like fmt dot printf, and then it prints like percentage s is percentage d years old, and the values are Kim in '22. Mhmm. And I don't know. I think there's a Kim on the Go team.
Shay Nehmad:I remember some Mhmm. Like, I've seen that name on the Proposals tracker as well. Anyway.
Jonathan Hall:Anyway, if your name is Kim and you're 22 years old, we wanna interview you.
Shay Nehmad:You get this episode for free.
Jonathan Hall:Wait, I'll have this episode for free. The point of all this is that these executable examples serve as both tests and as executable documentation. The limitation up to now is that the function has to be a very, very specific format. It has to basically be a function called Example. So, the way it works right now is to create an executable example, you have to create a function that starts with the word example with capital E and then beyond that it's arbitrary, but then it has to return nothing and take more arguments.
Jonathan Hall:That's the limitation today, right?
Shay Nehmad:So, you would have to wrap it Right. Different if you
Jonathan Hall:have a function that either takes argument or returns anything, you have to wrap it, which makes the inline documentation still makes it run, it makes the inline documentation a little less clear because you're now referencing a function that's not in the documented example. So, the proposal is to allow arbitrary function signatures. So, now your examples can return an error, for example, or other arbitrary things, and they can still be executed in line as executable examples. So, I think that's a nice addition that will particularly help those of us who occasionally release open source software where we have executable examples, which I've done a few times.
Shay Nehmad:And this doesn't break anything. Like, I'm trying to think, it doesn't break anything, it's just adding stuff, right?
Jonathan Hall:Right, it should be a pure addition. So, everything that did work before will still work, some new things would work. I suppose the edge case where it might theoretically break something is if you called something example underscore foo and returned an error, that would be ignored today and it would now be executed. But I don't know why anybody would do that. I suppose you could do it so that it doesn't get executed, I don't know.
Shay Nehmad:Well, maybe the example is like you're still developing it or whatever. But yeah, that makes sense. Another proposal we wanted to discuss was, Identical. I guess we should rename it to same now. But there's a classic Footgan and Go.
Shay Nehmad:You teach a lot of people Go. You know how when people come from other languages, they have like, oh, value versus reference, right? When to use which and what does it mean, in Go? And then you're you're hitting them with like the maps and, slices thing. Do you wanna do you wanna explain that in case someone who's listening doesn't exactly know what's the what I'm referring to?
Shay Nehmad:That, like, the the map is actually contains, like, a reference, so while you pass it as a value, the underlying thing might change unexpectedly? Did I just explain it?
Jonathan Hall:I think you did. Yeah. Maps and slices are reference types, right? So they pass by reference, yeah, when you mutate them, it changes the underlying value.
Shay Nehmad:Yeah, I think this is surprising for some people and there is a question of comparing maps. So if you want to know if two maps are equal, this is something I do all the time, right, in tests, like, are these maps equal? Sometimes you wanna make sure if you wanna check if they're identical, like with the word identity, like from math. Right? You wanna check if they're actually the same thing.
Shay Nehmad:Not if their values are the same, but either are they actually the same map. And there's a proposal here called maps add identical func that checks, you know, if it's the same. And this is diverged a little bit, and what is accepted now is a function called same, which gets like a map and two maps and compares are they the same. Basically, the only thing it's doing is, compares the underlying pointers, and if you if you want to know that, you can use this same function. Now, I am fully for this function because otherwise you have to write unsafe code yourself to bring like unsafe don't pointer and mess with pointers, that's very ugly to write.
Shay Nehmad:I don't know when I'll use it. Like when do I care that two maps are actually the same? Do you have a case in your code that you're like thinking about it that it matters?
Jonathan Hall:I don't think I've ever needed that. So it's hard for me to In theory, can imagine that it would happen. I just can't think of a situation where I would need that. I suppose if I want to know that the two processes didn't derive the same map pairs independently, they actually, you know, referenced the exact same map. But I don't know when I would do that.
Shay Nehmad:Yeah, for slices, it's way more complicated. They went into it. My brain was like, Oh, maps and slices, they're the same, so why not do this? Why not implement same for, slices as well? But apparently, slices are, more complex than that, like, oh, what about a zero length slice?
Shay Nehmad:And what about len and cap and like the reference to the pointer to the array, blah blah blah. But generally, it seems like this is accepted after quite a lot of discussion, but I think actually good discussion and useful. It is very generic, like the function itself has a lot of generic values, m1, k1, v1, m2, k2, v2, and I tried to understand why, and then I realized that you wanna make sure that the keys are comparable, but V1 and V2 can be any. Like, you gotta make sure that these maps are like valid, because otherwise there's no point in in adding them. But there's some understanding of why this could, this is useful.
Shay Nehmad:And generally, it seems like it's been accepted because it would be useful. And I don't know, I've never found a case where I need to use it, but I'm definitely happy that it'll be there whenever I'll need it.
Jonathan Hall:Yeah. Another one of those things that I probably won't use very often, but I'm glad that it's going to be there if I ever do need it, is some additions to the atomic package. We're going to be adding I it. Yeah, we're adding max and min variants to a bunch of things. If you're not familiar, the atomic package lets you do certain atomic operations on some basic types.
Jonathan Hall:So, it's very useful if you're, say, you need a counter for how many, I don't know, HTTP requests occur and you don't want to use a mutex. You can use an atomic counter that every time a request comes in, you increment it by one. And by using atomic, you don't need the mutex and it's guaranteed atomic and concurrency safe. But what if you need to do something a little bit more complicated, like where you're like, I have this value stored there, I need to read it and see if it's greater than or less than this other value I have and then store the biggest one there. It's not possible to do that atomically without a mutex because it's two operations.
Jonathan Hall:It's a read operation followed by a write operation. And if you want those to be atomic, you have to use mutex until now. Now we're going to have max and min, so you could use, you say the atomic value dot max 12, and then if the existing value is less than 12, it sets it to 12. If it's more than 12, then it keeps the value that's already there. And then it returns the value that did exist, so you can do your comparison after the fact if you want to.
Jonathan Hall:And then, of course, the inverse for min.
Shay Nehmad:Just to clarify, this proposal works for numbers bigger than 12.
Jonathan Hall:Yeah? Yeah. Yeah. You don't have to limit yourself to 12. So
Shay Nehmad:why the thing about atomic packages, it's architecture dependent. Right? You have to have, like, the machine code to support it. And you gotta compile whenever you say max, like an atomic max, you gotta compile it when when it actually compiles to the relevant instruction. If I understand this proposal correctly, it's AMO max and AMO min in RISC V.
Shay Nehmad:But like, it's very it's way more complex just in terms of implementing because, oh, maybe old, you know, this won't compile if you're building two specific architectures and stuff like that. Right?
Jonathan Hall:So I don't know if it wouldn't compile, but I can certainly see that implementing this for certain architectures would be tricky. Already atomic operations on, say, an int64, if you're on a 32 bit platform, might be tricky because you're dealing with two different registers there, you can't do it at one atomic CPU operation. All I think is
Shay Nehmad:that this is not a language feature as much as it's a let's expose some low level capabilities that exist already. Sure. And that's difficult. Like, that's always difficult. Because you like to think that these things have layers and they're like, you know, completely abstracted from one another, but in reality, they impact one another a lot.
Shay Nehmad:It does seem like you have equivalents for atomic, max, and min in a lot of architectures, importantly, like you're highlighting right now on the screen if you're watching on YouTube, or any video platform that we may in the future upload to, like AMD and ARM, so the normal ones.
Jonathan Hall:Yeah. So, yeah, I think that's a fair point. Like, in general, this is exposing CPU features that you probably already have. But if you're on platforms where that's not exposed, then the authors have to go to extra effort to make it work atomically. And I'm so glad they're doing that, so I don't have to think about it.
Shay Nehmad:I'm just wondering why this came up, because like, it's been opened in 2023, there has been zero activity, and suddenly in June, it was just added to the active column. Good to know that they're not letting like old proposals rot. I'm just wondering what caused them to do it.
Jonathan Hall:I don't know the answer. Would love to. It would be nice to get an insight into how old issues are selected for discussion. Maybe we can get somebody from the Go team to come talk to us about it at this point.
Shay Nehmad:Austin Clemens, maybe. Yeah. See if we can pull that off, if you're listening. Cool. Fast min max on, on, in well, not fast, Atomic.
Shay Nehmad:It's a different
Jonathan Hall:Probably also fast, but yeah.
Shay Nehmad:Yeah. Probably slower than just a normal operation, right? Because it has to
Jonathan Hall:have It multiple might be, but it's probably faster than using a mutex, so.
Shay Nehmad:Yes, yes, for sure. Yeah. Maybe, you know, I'm kidding. It depends. I'm not sure it will always be faster than I'm pretty sure in most cases it will be.
Shay Nehmad:I'm not sure it's always. Anyway, last thing I want to bring up very quickly, because this is more of a culture discussion than a code discussion. We've seen on the channel, someone posted a change list for algebraic enum types to Go, And I was like, what? We're the Go news people. How have we missed all the proposal and discussion around this?
Shay Nehmad:This is, like, such a big change, whatever. And then turns out it's not really what happened. This is a change, you know, that wasn't really, like, proposed or whatever. It was added. You know, it was the the pull request got opened, and there's a, something called Go Plus, which is a fork of Go, called the Go programming language, but better, and it has algebraic enum types, and it has try catch syntax or try syntax.
Shay Nehmad:And it has like, it does all the things that people sometimes don't like about Go. You didn't like this approach
Jonathan Hall:So to be clear, on a technical standpoint, I don't have a strong opinion because I haven't looked at it quite closely. I think that submitting a pull request
Shay Nehmad:5,000 line change.
Jonathan Hall:Yeah. Without discussion and linking to linking to the wrong repo where you've posted your proposal, like this person clearly didn't do any homework to understand the Go Proposal process. Or if they did, it's years outdated. It's hard to take it seriously.
Shay Nehmad:I I think that we looked at the code. It's not obviously wrong or something like that, but we haven't, like, deeply reviewed it because I feel in the world a world of slop, like someone throwing a 5,000 line change at you doesn't mean you have to review it and find all the problems for them. You at a point, I asked like, let's say this is a perfect implementation that they actually wrote in a basement twenty years ago, right? It's not whatever.
Jonathan Hall:Yeah, they've tinkering on this for a decade or two and it's fine tuned, it's perfect.
Shay Nehmad:And I ask, like, does it matter? And I I still ask you, does it matter that this is the way they have presented it? Assuming after all the assuming after all the discussion, this will be the code. No. Not a single character change.
Jonathan Hall:Yes, it matters because nobody has had a discussion about, is this the design we want? And they didn't follow the process. Whether the process is good or bad is another question, right? But if somebody is going to come propose an architectural change, especially something as substantial as new types in a language like this, it needs vetting. Maybe that thing works perfectly, zero bugs, it's great.
Jonathan Hall:Maybe it is a perfect design, even in that sense. Maybe there's no reason to choose a different design. Still needs to go through the process of giving people a chance to respond and to that end.
Shay Nehmad:Yeah, I agree. I think it also, the proposal process helps reduce cognitive bias because you have time for people to understand how the language is moving and what is changing. If you try to introduce the changes that are it's like, it's almost, I hate to say it, but it's almost like childish to try to introduce such a big change without, like, talking to everybody because Mhmm. We got it's like you know how, like, money is just, oh, when you're a kid, it's like, oh, it's just paper and and coins. And then you grow up a little bit and you're like, oh, I can use this for goods and services.
Shay Nehmad:And they're like, it is just paper and coins. When you see like countries', you know, economy as you grow up, you see like countries' economies crash around you. You're like, oh, their coin and paper is not worth nothing because nobody believes in it anymore. Their mental model of what it means changes. Like, if the Go will change will change so quickly that we don't believe, that we don't understand what it does anymore, and nobody on the team knows what it does, I think its value will will plummet.
Shay Nehmad:Like a lot of the value people get from Go is not from the fact that it's like stable and sale and doesn't have new stuff go into it. It actually is very active. It's from the fact that big changes take a lot of time because a lot of people talk about them, like generics, for example. Also, have to say I don't like the change itself. Like, not sure that we need all this algebraic enum types.
Shay Nehmad:Enums in Go suck. It's one of the worst parts, we can solve it with way, way simpler options. This is probably like the best, but it's also very complicated. But again, I even want to discuss the technical merit of it, Lucas. That's what the proposal process is for.
Jonathan Hall:Right. Think that team
Shay Nehmad:will deal with it though.
Jonathan Hall:Oh, I think it's dealt with. The CL has already been marked as held for proposal and there has been no actual proposal except this incorrectly done one that will rot because it's in the wrong place. I think it's already handled. Nothing's going to happen.
Shay Nehmad:Interesting.
Jonathan Hall:Well, think the analogy I would use would be, maybe you're a world class, I don't know, ballet dancer and you show up at your friend's wedding and start dancing ballet. Like, you might be the best at a thing, but you're doing it in wrong context. And that's the problem, and you lose all credibility by doing that. And that's what giving this person all the benefits of the doubt, that's what I see happening here. Maybe it's a world class PR, maybe it's technically app perfect, but it's the wrong context.
Shay Nehmad:And it's, I have to say, it's kind of hard to give all the benefit of the doubt. I doubt. Agree. My, lately more and more and more. And we'll talk about vibe coding in a second in the interview actually, because we recorded in the, already.
Shay Nehmad:But I've been facing more and more slop, even as models have gotten better or whatever. I actually wrote a blog post about it. You know what, I'm gonna plug it. I have a website called mrnice.dev. I wrote a blog post called At the Gates of Slop.
Shay Nehmad:Maybe some of you will find it interesting, but it's not about Go at all. It's just about like programming, Agenic programming. Cool. Twenty minutes. I think we're good.
Shay Nehmad:Alright. Let's do a quick lighting round. Just a brief announcement before that. Thank you all so much for listening. This show is supported by you, mostly via Patreon.
Shay Nehmad:You can find links to our Patreon and our Slack channel where, for example, we learned about this CL, everything at cup o' dev. Alright. Lightning round. Lightning Round. I've set you up with a Lightning Round item, Jonathan, that I know you're gonna have trouble with.
Shay Nehmad:Alright.
Jonathan Hall:So the exciting Lightning Round item is the Goblan twenty twenty six point two is now available. Yay. If you are not like me and you use Goland, you probably already know about this and you're probably already using it. If you are also like me and don't use Goland, you are unlike me and want to use Goland, now's a good chance.
Shay Nehmad:I I like the like the additions they added. I just want to shout them out. Like a lot of profiling data and a really, really, really well designed profile viewer. That's honestly better than the built in profile viewer, like the web that you get with Go. Really, really well done from the team.
Shay Nehmad:I don't use JetBrains. I might start using Air, their agentic one. My CTO really recommends it, But they're they clearly took a deep look at performance and and made it really, really nice with pprof. So just a nice wrapper around pprof, which is cool. I'll I'll like a ton of other changes.
Shay Nehmad:Of of course, AI stuff, but I like the that specific change. I thought that was good.
Jonathan Hall:The screenshots they share do indeed look pretty.
Shay Nehmad:You'll give them that.
Jonathan Hall:I'll give them that.
Shay Nehmad:My Lightning Red item is on more of the esoteric side. If your Lightning Red item is useful, mine is esoteric. G sharp, a modern dot net language with Go, Kotlin and Swift Ergonomics. So this made it, like, on my desk somehow, I think Google recommended it to me. It runs on dot net, and it seems to be, like, have totally new syntax.
Shay Nehmad:I guess it's useful if you have a lot of, you know, dot net ish, nuggets, I think they're called, nugets, something like that, that you don't want to translate, but you want to start writing your new code in Go, but you don't actually wanna start using Go because you gotta run on dot net to interface with your, you know, DLLs or whatever they're called because it has a interrupt with the CLR. I don't know. I don't know about this one. It seems like a lot. And if you showed this to me, like, years ago, I would be like, oh my god.
Shay Nehmad:People put so much work into it. And now I'm like, I gotta go take a look at GitHub and see how much work how much human work has actually been put into this. But it's cool. It's just like a 0.3. It just came out.
Shay Nehmad:Like, it's obviously very early stages. If you're into, like, new languages and learning them, sounds cool. And I was surprised that the G wasn't taken yet, but I guess the only criticism I'll have is that it's very hard to say G quickly and not make it sound like C.
Jonathan Hall:Is there GoLam support yet for G or do I have to wait for the next version of JetBrains?
Shay Nehmad:It might be a different editor, right? They have a different editor for every language.
Jonathan Hall:What would they call their G?
Shay Nehmad:I don't know what they call their their C one has a really weird name. C JetBrains editor. Rider. It's called Rider.
Jonathan Hall:Rider.
Shay Nehmad:So I I think it would have Rider support before it got Golang support. Mhmm. Anyway, just a cool experiment. I don't think it's super serious yet, and I'm definitely not gonna use it, but it seems cool. Seems like a cool experiment.
Shay Nehmad:Theoretically, people have been working on this for like seven years, at least according to GitHub, which is very surprising to me because it's the first time I'm ever hearing of it. But looks like just a cool project, like with a lot of work very recently, with the first release being May. So I think this was like an old idea that someone picked up because of vibe coding and they're just going all the way. David Abando. Oh, and they're working for Microsoft.
Shay Nehmad:Cool, cool,
Jonathan Hall:cool. Okay.
Shay Nehmad:Cool. You know what? This may be more serious than I thought. Cool. Cool.
Shay Nehmad:Cool.
Jonathan Hall:Well, let's see if it if it gets any traction.
Shay Nehmad:Yeah. And David, if you're listening and you wanna get on the show, we would love to hear the pitch for G. The pitch for G.
Jonathan Hall:The pitch.
Shay Nehmad:Would you say that joke fell flat?
Jonathan Hall:It fell flat. Yeah.
Shay Nehmad:Sorry. Sorry. I had to. I had to. Alright.
Shay Nehmad:Let's get to the interview already.
Jonathan Hall:Alright. Let's do it. Hey, Peter. What's happening? Need to talk about your TPS reports.
Peter Downs:Oh, man.
Jonathan Hall:Hi, Peter. Hello.
Shay Nehmad:What's happening?
Peter Downs:How are doing?
Jonathan Hall:What's happening? I'm telling you. What's happening?
Peter Downs:Oh, man. So much so much is happening.
Shay Nehmad:Not a
Peter Downs:lot with the TPS report stuff. Oh, well. I'm behind on this.
Jonathan Hall:Yeah. You did get that memo, didn't you?
Shay Nehmad:I'll go ahead and send you another alright. We can literally quote office space all day, but
Jonathan Hall:Peter, you can just go watch me one last question.
Peter Downs:Yeah. How much time would you say you're spending on these TPS reports?
Shay Nehmad:What would you
Jonathan Hall:say you do here? Okay. Peter, tell us who you are, what you do, not with the TPS reports, maybe with Go.
Peter Downs:Yeah. Happy to do it. So I'm Peter Downs. I'm the head of engineering at a company called CloudX where we run a mobile ads exchange. So all those ads that you love and those mobile games that you also love, we are the ones who run the auction and help the ads get there.
Peter Downs:We use a lot of Go to do it. So I'm hands on but running a small team of very experienced engineers globally based.
Jonathan Hall:Cool. So my son, my five year old son probably sees your handiwork a lot more than I do and is asking me, Papa, what's this? Why do I have to push this X on this ad?
Peter Downs:That's right. You know, it's a whole, this is my first time working in ads and I've spent a lot of time in FinTech and there's a lot that people don't like about the mobile apps. It's, it's surprising, but no one is ever coming up to me and saying, wow, the latency was so low. They were served so quickly and so efficiently, which is what I really would love to hear one day.
Jonathan Hall:All right. All right. I'll pay attention to that. Earlier
Shay Nehmad:the ad gets to me, the, the faster I can skip it.
Jonathan Hall:That's right. Actually And
Peter Downs:We we do all sorts of cool stuff for the show
Jonathan Hall:as well.
Shay Nehmad:We appreciate people willing to pay to advertise their brand or whatever. Mhmm. But the whole mobile app ads, exchange is is not really a human activity where people come to, you know, the app developer and ask him, hey. Can we put it's it's very automated. Right?
Peter Downs:Yeah. It's there there's two kinds, but we work mostly in programmatic. So that's the the automated version you're thinking of. You know, I used to work in credit and move some money around, and I always wondered who was spending all this money and why? And it turns out it's ads.
Jonathan Hall:I'm curious what a UX Do you have UX folks? And what do they do in a company that does something that users generally don't like the experience of?
Peter Downs:Yeah, it's actually been pretty interesting learning all of this myself, so I'll do my best to explain it. We make a product which is the supply side platform. That's what we're known as, a mobile supply side platform. And our customers are game developers. And they actually would love to just make enough money from ads so they can show as few of them as possible and go back to building good games that ideally your your children like, or your adult friends like when they're coming back from their job on, you know, end of the day on the subway.
Peter Downs:And there's a lot of pain and annoyance that goes into actually showing the right ads, not showing horrible ads that turn your users away from the app. And our platform helps them do that in a way that's a lot easier.
Jonathan Hall:Well, we didn't come here to talk about ads per se. I mean, that's fine. I'm learning things.
Peter Downs:No, neither did I.
Shay Nehmad:I'm actually, I'd
Jonathan Hall:love to talk about Go. Yeah, let's do that. So the reason we got connected here is because I am a user of one of your packages and I've mentioned it on the show, I don't know, a few months ago. And if I'm not mistaken, you found that. How did you find that we had mentioned you on the show?
Peter Downs:That's right. So I occasionally check-in and name search myself and found that you guys had mentioned me. I was telling you a little bit about it pre show, but I actually have so little feedback from the community in general about Yeah. Are any of the things I build used by anybody? I get lots of bug reports.
Peter Downs:I get lots of issues on GitHub, but, it's always really nice to hear that someone is actually using something that I built. And so when I heard that you had used it and recommended it, I thought that was awesome and I reached out and now here I am.
Jonathan Hall:Cool. Cool. Yeah. So the the the the package I mentioned was PG testdb. It's, github dot com slash peter l down slash p g test DB.
Jonathan Hall:And it's, I don't know. Why don't you describe it
Peter Downs:rather than Yeah. So I, when I first got started with Go, I actually worked with this guy, Evan Elias, who did all the databases for Tumblr way back in the day. And something we were always talking about was, wouldn't it be nice to run tests that involved your database without them being super slow to set up the database and put fake data in it? And it wasn't until around 2021, when I was working at a company called Pipe that myself, along with a few other members of the team, just built a way to do it. So pgtestcv lets you write database back tests to your application.
Peter Downs:It is a real Postgres database. There's nothing fake about it, but it's really fast. So every test gets its own totally unique database. Everything's already migrated. The schema's as you expect and it takes, you know, on the order of tens of milliseconds to get that on a reasonably fast developer machine.
Peter Downs:So I really unlocked a lot of database back testing for us at that company, which was really important because we put a lot of our sort of transactional financial logic in PostgreSQL because it's a great database. And then when I was working there, I sort of cleaned it up and published it, the hope that others would benefit as well.
Jonathan Hall:Well, at least one of their has, I can say.
Peter Downs:I'm curious, what do you use it for? I honestly never hear about who uses my code or why.
Jonathan Hall:I do use it virtually every Go application I write that uses Postgres, I use it. Before I explain how I use it, I'll also mention that I am co maintainer, but that's early overselling it. I'm one of the maintenance maintainers of a package called Go TxDB, which solves the same problem in a different way. So, what it does is it wraps, it gives you a database driver that rather than starting a new database, it starts a transaction. And then when you close the database, it rolls back the transaction.
Jonathan Hall:So, it solves the same sort of problem in a less elegant way, but it works on other databases. So, you can use it on MySQL or on Microsoft SQL or whatever. So, I do use that package when I am forced to not use Postgres.
Peter Downs:Yeah, a PostgreSQL is unique in that it makes this kind of like database clones really fast. Yeah. I I've used the transaction based testing. I know it was super common even back in, like, the twenty tens in the Django world, like Mhmm. Totally valid approach.
Peter Downs:Nothing wrong with it. But I think CGTest TV is better.
Jonathan Hall:It is. So I mean, the transactional approach, its big advantage is that it doesn't depend on a specific database, but it's generally slower and it has corner cases that aren't addressed by PGTestDB. Like if you need to do something that uses multiple connections, you just can't do that in a single transaction. Right. With PGTestDB you can because you actually have a separate database that you can connect to.
Jonathan Hall:It's a clone of your real database, right? So, you run all migrations, you have your database, you clone it, which takes milliseconds, run your tests and throw the clone away. And then you do that three times as you want. So, how do I use it? I mean, that's how I use it.
Jonathan Hall:I test my data layer against a live
Peter Downs:database. I'm also like baffled. I'm astonished. You're pitching it better than I ever did. This is awesome.
Peter Downs:Super thrilled to hear that you're using it.
Shay Nehmad:So unfortunately, I'm not using it yet. I today have a setup with test containers where I have test containers running and they're running Postgres. And indeed, looking at the startup time, like the time of a test, most of the time is actually the setup. So you Yeah. If I'm just restarting my machine, you got to pull the test containers container first, which is like a sort of a bridgehead that pulls PostgreSQL 17, and that takes forever, especially on the WeWork Wi Fi.
Peter Downs:Mhmm.
Shay Nehmad:And then you get the, the images running. That takes a while to start up. Then it runs the init script, then the migrations, then some data seeding in the tests, all of which is the same for all the tests, and then, like, it's ready. Yeah. Would I be able to use, you know, PGTestDB to speed that up in your opinion, Peter?
Peter Downs:Shay, you're like, you're you're set setting them up for me on a tee. Yes. Absolutely. So the idea is if you have a situation like that, PGTestDB should let you do all the same seeding of the data ahead of time. And the only difference is that if you have a different test with the test containers approach, you need to create a new Postgres container and reseed the data.
Peter Downs:But with PGTestDB, you're essentially doing a super fast copy of whatever you had previously prepared. So if in your current setup, have 10 tests, you need to prepare 10 containers. With PGTestDB, if you have 10 tests, you need to prepare the database once and then it'll very quickly create its own unique database for each of those tests. And when I say you need to prepare, that's actually what the library does and takes care of for you. So from the perspective of your code, you're just saying, give me a new test db And then magically In
Shay Nehmad:real life in real life, does it run a new Postgres container or does it create a new database in a single container or does not run a container at all? Like, where do the DB stuff where does the DB stuff happen? Because I we do a lot of pretty advanced stuff with Postgres, you know, installing extensions and stuff like that. A lot of the in memory Postgres stuff I've tested. I've tested the it's something equivalent that runs Postgres with, like, WebAssembly, and it just wasn't it nothing worked.
Shay Nehmad:Like, role level security doesn't work, and extensions don't work, and, like, nothing works. So it's in theory, it's cool if you're just testing select, but if you have a real app with, like, role level security and extensions and advanced indexes and stuff like that, at least for me, it didn't work. So what sort of Postgres is running in in PGTestDB?
Peter Downs:This is like the total this is this is great. So exactly your situation is why I built this. The idea is you bring the Postgres server and Postgres within a running Postgres process or server has its own concept of databases, and all you need to do is provide that root Postgres connection string and pg test db will create new databases within that database. So one of the ways that it actually gets very fast is if you set up your Postgres to only store the data in memory. For testing purposes, you really don't need to turn on the write ahead log usually.
Peter Downs:You can if you want, but, you can make things go really fast if you never write them to disk. For your situation, you can just supply any Postgres setup however you want with any kind of extensions ready to run or be enabled and what pgtestimu will do is take a clone of however you set that up, that database, and give that fresh clone to each of the tests. So I'm kind of going out on a limb here because I don't know exactly what extensions you've got or what kind of cool stuff you're doing, but it doesn't matter if you're running Postgres on Neon, doesn't matter if you're running Postgres locally, it doesn't matter if it's running in a container or not, you can just connect to it. You give PG test to be a DSN or a connection string and it should work. And if it doesn't, you can become one of the many people who have filed bugs for me to fix.
Peter Downs:Started with Actually, no joke, it should just work. Please try it out.
Jonathan Hall:So I started with a client about six months ago that was doing essentially the same thing, they hand rolled it. They you know, they created a template template database and then they had their own code like clone that database. Don't remember the exact Postgres syntax. But the point I'm making is that under the hood, there's nothing magical here. It's stuff that's built into Postgres and you're just wrapping it in a nice package that works well in Go.
Jonathan Hall:If you're not using Go, like somebody who might be co hosting this show, you can still do this exact same thing in TypeScript if you need to. Yeah, You just might have the pretty wrapper around it.
Peter Downs:That's exactly right. I'm actually glad you brought this up. I did basically nothing. So this is pre AI that I wrote this code. So I did actually write some code, but there's it's all just Postgres under the hood.
Peter Downs:You mentioned the word template. That's the feature if you want to go look this up. It's Postgres template databases. Massive shout out to the PostgreSQL team. They're awesome.
Peter Downs:Love the database. It works really well. And there's actually been a couple of forks or, like, rewrites of PGTestDB for Python and for some other languages. But these days, you may as well just put codecs on it. You'll probably have one in your language, I don't know, two minutes later.
Jonathan Hall:Yeah. Yeah.
Shay Nehmad:I am, as, as, Jonathan alluded, I use TypeScript, and I was about to ask exactly that. And you know
Peter Downs:what? I'm gonna
Shay Nehmad:I'm gonna take your word for it. I'm gonna how do you want to how do you want me to call it? The fork.
Jonathan Hall:Oh. So
Shay Nehmad:it's PGTestDB. I can use a PG test DB dash t s dash Peter. How does that sound?
Peter Downs:What about, what about just TS test DB?
Shay Nehmad:Oh, but I isn't it just specifically PostgreSQL?
Peter Downs:That's a good point.
Shay Nehmad:Alright. Let's I should have used my full permission. Minutes. Yeah. And then, Cloud Codex can, one shot it in five.
Peter Downs:I think you gotta include your name in there somewhere. Right?
Shay Nehmad:Yeah. My name is already you you mentioned you search your name every now and then, which is a cool That's a I've never I don't do it too often, but, I've my name is plastered way too often on the Internet. Like way too often.
Jonathan Hall:All right. Well, while working that out, Shay, I want to keep talking to Peter about some other stuff.
Shay Nehmad:Of
Jonathan Hall:course. You also have a package called pg migrate, which I have not used. Of course, I've used migration libraries. What's special about this one, if anything?
Peter Downs:Nothing super special, so I'll just start with that. It certainly isn't well adopted as far as I'm concerned, and I'm not really trying to push it on anyone, but I've used it in most of the companies I've worked at because it just runs migrations in order, and if they fail, it stops. And there's a couple other, I think like golang migrate. There's a few other very popular migration libraries, all of which work really well, and there's nothing wrong with any of them. But in the businesses that I've worked on, we run a lot of containers in parallel we kind of want them to use advisory locks so that I could just deploy the latest version of the code.
Peter Downs:And if 20 containers spin up all running our back end binary and they all try to apply the migrations, really only one of them should do it at a time. And if it for some reason has an error, I don't want it to leave the database in a state where a human needs to do something in order to clear the state and let migrations flow again. Maybe one other idiosyncrasy of it is that there's no concept of down migrations at all. And the reason for that is, again, in just the teams I've happened to work on, what we found is that you never run them. You actually just never run them.
Peter Downs:And if you're running them locally, it's because you're not using something like PGTestDB that lets you just write tests that assume the current state of the schema, and you actually just will never run them in production because what you'll do in production is write a new migration that fixes whatever broken state you've left the database in and gets you to where you wanna be. So it's kind of
Shay Nehmad:a forward You roll forward usually.
Jonathan Hall:Yeah, I love that.
Peter Downs:Yeah, I don't know if that's really true for everyone else, but that's the experience that I've had.
Jonathan Hall:So I wrote my own migration library once. Oh, fantastic. But I think we agree on those two things you just mentioned, I kind of agree with, like I designed it to specifically allow a multi pod installation to all try, but only one succeeds. They don't step
Shay Nehmad:around each other
Jonathan Hall:forward only. And my observation, although I agree with you, what you said, I hadn't put it in those terms that people never use the down migrations. My observation was that the down migrations are usually absent or broken. That's Which is probably because they never use them. Yeah, exactly.
Jonathan Hall:So, and even when you try to do down migrations, often you cannot do That's right.
Peter Downs:Usually there's a ton of migrations that just can't be undone.
Jonathan Hall:Yeah, they're destructive. And so my whole idea was like, let's just constrain that you cannot do it down so you can't lie about undoing destructive work. And then the other difference with mine is that it supports multiple databases, which That's I a big improvement. I almost never used. Well,
Peter Downs:I have to say that would be nice. I've had some people ask about other databases and it's really just the one I have is tuned for PostgreSQL, but it works alright.
Jonathan Hall:Check it out.
Peter Downs:If you don't care really how you run your migrations, it should work for you.
Jonathan Hall:Yeah. Well, if anybody wants my library is called Burrow because how do Gophers migrate? They burrow.
Peter Downs:Oh, that's really good.
Jonathan Hall:Okay. We talked about your libraries. Any other libraries you want to talk about before we move on to other topics?
Peter Downs:I just want to shout out Brander and Riverq. It's just a really great Postgres Golang queue library, for anyone who's actually talking to you.
Shay Nehmad:We talked about them in the in the show a few times, and I've been reading, Brander's blog for forever. So if you can if you actually know him and you can get him on the show, that would be awesome.
Peter Downs:I don't know if I
Shay Nehmad:can get him on
Jonathan Hall:the show. Blog. We could just reach out to him. I bet he would
Peter Downs:I'm I'm just a fan of his work, frankly. Think if you, if you're thinking about Golang stuff and PostgreSQL stuff and you aren't previously aware of Brander, go take a look. He's got some cool things for
Shay Nehmad:you to read. Mhmm. Uh-huh. He's in Indonesia diving for the full month of October.
Peter Downs:Yeah. Think he's also fairly, successful and, maybe between jobs at the moment.
Shay Nehmad:Oh, no, that was 2025. Never mind.
Jonathan Hall:Alright. So, before we started recording, actually a couple days ago, you sent a list of topics. And one of the things you talked, you mentioned that you'd be interested in talking about is how you found Go to be an incredibly effective language for vibe coding. We've talked on the show a few times about people's takes that Go is good for agentic coding because, you know, the simple syntax and so on. My first question is, what does vibe coding mean to you?
Jonathan Hall:Because it can mean a thousand different things, and then we'll talk about how Go is relevant to that.
Peter Downs:Good broad question. I should say, yeah, vibe coding, there's kind of two things that I do that are different that I both shorthand call vibe coding. And one is the true original definition from the ancient days of 2025, where you don't actually look at the code, at all. You're just kind of messing around and asking the agent to make things happen. I think Go is great for that.
Peter Downs:Just like a lot of languages are pretty good, Go in particular, the agents seem to be trained on it, they seem to be able to understand their errors and if you eventually do look under the hood, what they've written is usually not that horrible. It's often pretty bad, but it's not that horrible. Whereas I think I've seen some TypeScript that the agents write that just makes me go, like, boy, I'm never going to understand this. Because Go is just such a readable language. It's like, any engineer can figure out how to write Go, any engineer can review Go even if they've never written it before for the most part and, it lends itself to reviewing what the agents have done.
Peter Downs:And then the other thing that I do and that my team does and like the way our whole organization runs is we do a lot of agentic development where we actually are looking at the code and interacting with it. And at the end of the day, a human is saying, I'm responsible for this, even if an agent wrote a lot of it originally. And I think Go is great for that too. Again, it benefits from being able like it benefits from an easy review process and it benefits from a really great DX process where it's super fast to lint, super fast to test and the more, like, constraints and tools you can give your team to write good code, the better an agent will be at using those same tools with Go for whatever reason. I I should say that I don't have a ton of other modern corporate experience working with other languages other than, like, TypeScript.
Peter Downs:Mhmm. So it could be that Go is actually just the same as everybody else. I'd be curious what you guys think.
Jonathan Hall:Mhmm. What's your thought with TypeScript there, Shay? To go on TypeScript compare in those
Shay Nehmad:regards? Can, so there's this talk by Rich Hickey called the simple made easier or whatever, where he says, Oh, people, they complain about the tooling and then they say, oh, we just need more guardrails. And then he just stand there and he's like, but who drives like that? Who's like taking out their car and bumping against their guardrails like, oh God, thanks for all these guardrails. So with TypeScript, that's how I feel.
Shay Nehmad:I feel like you can add a lot of, like, extra linter rules and agent MDs till the, you know, all day long, but it takes a lot of extra attention to write, like, good code, in TypeScript. It's it's certainly way better than JavaScript, but still, it's not easy, nor is it simple to write, like, good modular code. It requires a lot of, like, discipline, which means a lot of code review, which means often you feel like you're, yeah, I'm getting like maybe a 20 to 30 increase in my productivity, maybe, maybe, but not the like 10x amazing stuff. It helps if you have like a framework, that that constraints you to start with. Like us on the back end, we use NestJS and already like so many of the ambiguity of how to do a class and how to do a service and how to do dependency injection, how to do testing, it's all, like, frameworked away.
Shay Nehmad:I don't love it but, it it certainly makes AIs a a lot more, you know, they stay within the guardrails and they don't bump into them as often. In TypeScript land, in, like, front end land, in React, it's Wild West. It's horrible. They can just write horrible code, and it gets by, especially since people are like, yeah, whatever, I see that the UI looks like I sort of vaguely like the Figma, I, like, gave the agent the Figma and it wrote some code and now the UI looks like the Figma, whatever. And you know, suddenly components don't align and suddenly there are bugs in state and you know, the app crashes in production.
Shay Nehmad:I feel like in types, in front end it's way worse.
Peter Downs:I will say in the front end, that is often how I wrote front end by hand. So in some sense we've achieved AGI.
Shay Nehmad:Yeah, for sure. I think, you know, it's not a it's not to say that backend is better than frontend or frontend is better than backend or whatever, but historically I think frontend has been less budgeted for, like it was always, especially the companies that I've worked for, which were like cyber focused, you know, mostly back end focused or low level focused companies. The front end has been the thing that you would like throw over to overseas development agencies and like just get something that works, doesn't matter how well it operates. I don't think it's a correct, solution or anything like that, but I think in some sense the my experience working with LMs on the front end has been similar. It has been like, like you said, it's the result of, what went into it, right?
Shay Nehmad:The training, the whatever. Yeah.
Jonathan Hall:Well, will say
Peter Downs:back Oh, sorry.
Shay Nehmad:Vibe coding, not looking at the code at all, very rare for me to do. And I'm going to try, like I hate it. I can't. I just can't. I can't do it.
Shay Nehmad:There's something in me that just won't allow it, but I'm trying it right now. I'm pressing enter on. I want to develop a fork of PGTestDB in TypeScript. Okay, it's running. Let's see what GPT56 sole medium can do with a goal.
Peter Downs:It's gonna crush it, I guarantee you. Because here's the other thing about Go, just going back to what you're saying about guardrails,
Shay Nehmad:they're
Peter Downs:all built in. Go is designed. There's just not that much you can do in Go. Injection. There's not that many ways you can do an abstraction over state.
Peter Downs:It's like pretty straightforward and your hands are tied in a lot of ways and it just kind of constrains everything that you're doing in Go. But the beauty of it is that you can still do a lot of things really well.
Shay Nehmad:Also, funnily enough, I don't know if you know this, but, you know how Go format puts a tab in the front? Yeah. TypeScript and Python use spaces. Right? So at the beginning, like, early twenty twenty five when token counts, like, token windows were way smaller, it mattered.
Peter Downs:Yeah.
Shay Nehmad:I know. Right? Isn't that dumb luck? Like, 2020 late twenty twenty three or or something like that, maybe early twenty twenty four. Natalie from Go Time told that to me in in a a talk in Go For Kan Israel.
Shay Nehmad:I was like, ugh, I can't believe how lucky how lucky. I I guess all languages will move to tab based, white space formatting now. Cue the Silicon Valley Proposals. Just tokens. Incredible.
Shay Nehmad:So the vibe coding, vibe coding, you know
Jonathan Hall:The closest I get to Sorry. The closest I get to vibe coding is for my Home Assistant configuration and setup. Where I don't know Python very well and Home Assistant's written in Python. So I have Cloud like, hey, I want these lights to come on at dusk or whatever, and it white codes that for me. That's about as close as I get to white code.
Peter Downs:That's pretty sweet. Yeah. I saw someone on Twitter talking about how they gave Claude access to all of its sensors in the house and they just said, take care of me. It was following them around, shutting lights off when you left the room.
Jonathan Hall:That doesn't sound like a very token efficient way to automate your house, but okay.
Peter Downs:It sounds like a pretty token efficient way to end up dead somehow.
Shay Nehmad:I'm sorry. I can't let you do that.
Jonathan Hall:I'm sorry, Dave.
Shay Nehmad:I I do think Go is more like you said, because it's simpler and all these things are built in, there is the allure of Go code that's generated is good. But I wanna challenge that to like two levels, right? There's one level of the syntax and like code, basic code organization and stuff like that. Yeah. Since there's only one way to do it, or at least one standard way to do it, usually that's okay.
Shay Nehmad:But do you feel like, especially recently, the the higher level of that? Like, am I treating edge cases, correctly? Is the code organized in a, like, modular way that I'll be able to develop it, you know, with my company going forward. Like, I don't know. It adds a new, ad, provider, you know, configuration, but it always assumed that the state is that the origin is USA, and that is not configurable.
Shay Nehmad:It's hard coded. And, like, because it's Vibe coded or relatively Vibe coded, you don't notice it because you're just like, oh, all the tests passed. But then in the DB, like you said, we we ran that migration, and now all the rows in the DB have USA hard coded, stuff like that.
Jonathan Hall:So do you feel like the
Shay Nehmad:higher level, not just the syntax generation is you can vibe code it as well because it's Go or or or no?
Peter Downs:No. You're I I think you're right. It's Go doesn't make that work better in my opinion. I took a class with Gerald Sussman, the scheme guy, and his whole approach to writing code was you're essentially defining a DSL or a language that allows you to express your problem, write down your problem in a way where the answer is computed by writing it down. And I think when it comes to stuff like this, that's still where humans are great at working on stuff, especially the people that I work with.
Peter Downs:We hire some very, very talented people and it's a lot like every team has become an internal platform team almost, even the product team, where you wanna just be providing these building blocks for expressing the kind of problems that your product solves and then your agent can do a great job of generating stuff. But there's nothing specific about Go that lends itself to that versus like, honestly, TypeScript is super expressive type system and really nice for doing some of these things. Like if only Go had discriminated, unions, that'd be so sweet. I'd be so happy.
Shay Nehmad:I I I did see someone sent on the channel. I I almost don't wanna mention it, but I
Jonathan Hall:know what you're gonna
Shay Nehmad:send on the on the cup o' Go. You know what I'm gonna say? Yeah. Someone opened a pull request to go, with, like, algebraic enum types, which I think you can Alright. If you.
Shay Nehmad:No. No. They just submitted it like, you know, without a proposal, then added the proposals like later.
Peter Downs:Oh, that's no good. That's probably not gonna work.
Jonathan Hall:And they link to a proposal that's not been accepted or discussed at any length and it's from, I don't know, I guess no, when
Shay Nehmad:did they change it? I mean, it started five days ago. Maybe it'll get picked up, at some point.
Peter Downs:Just, can you check to see if they also enable syntax highlighting on the Go website? Because if so, then we know this is going nowhere.
Jonathan Hall:I'm pretty
Peter Downs:sure this is might still have a chance.
Jonathan Hall:I'm pretty sure this is also the person's first submission to the Go project. So like, it has no chance.
Shay Nehmad:Wait. The Go website doesn't have syntax highlighting?
Jonathan Hall:What do
Peter Downs:you mean? There's a there's some very famous, mailing list threads that you can go look up where, certain people responsible for the creation of Go don't believe that syntax highlighting is necessary, to convey the beauty and power of the Go language or any language for that matter. But the playground for a long time did not have syntax highlighting and there is a strong line, a strong policy about not enabling it.
Jonathan Hall:So I can actually
Shay Nehmad:syntax highlighting. I'm looking at the code right now. What the hell?
Jonathan Hall:I didn't I didn't Does it
Peter Downs:have an off yellow background as well?
Shay Nehmad:I'm looking at just the Go blog posts right now.
Peter Downs:Yeah. There's a there's a certain there's some people I I don't I think this was a while ago and maybe the position has changed, but yeah, there's a like the Go playground does not have syntax highlighting on by default, and there's some very funny mailing list messages about it.
Jonathan Hall:So I I didn't know any of this. This is this is news to me,
Peter Downs:but Okay. This is good.
Jonathan Hall:This is good. I can kind of agree to an extent. Like, if I need syntax highlighting to for the language to be readable, then that's a problem. That's of it it is it's kinda it's kinda similar to
Shay Nehmad:that now. That's not the argument. But you the IDEs you use, all the code you've ever read. When I did, assembly, the MOV was
Jonathan Hall:Okay. Green. So you just said all the IDEs you've ever used. I was about to give a parallel opinion, which is that if you need an IDE to use your language effectively, have a shit language.
Peter Downs:Dang. Okay. Well, I'll challenge you on that because Go is what made me switch from just straight up Vim to using Versus Code with an LSV.
Jonathan Hall:Versus Code isn't an IDE. Do you mean? Surely. It's an editor with a bunch of plugins and you get to choose which ones you want to use.
Shay Nehmad:The way
Peter Downs:I've configured it
Jonathan Hall:is that you can get very close to, but here's my point. No, no, no. And here's what I think is going to make both of you less upset with what I just said. My point isn't you shouldn't use syntax highlighting and you shouldn't use IDEs. That's not my point.
Jonathan Hall:My point is if you need to use those things for your language to be usable, your language is crap. Think adding
Shay Nehmad:those
Jonathan Hall:Do want things point
Peter Downs:a finger at any specific language? I don't think I
Jonathan Hall:need to point at any particular language, but I'm holding up a cup of coffee if that says anything. I think having those things as value adds is fine. I think if you have a language where you need either of those things, that's a big sign that your language is problematic. So that's my opinion. And hopefully I've upset you a little bit.
Jonathan Hall:I think
Peter Downs:I can can ride with you on that one. I I'm in. I agree.
Jonathan Hall:Shay Shay is not convinced. He likes his, syntax highlighted IDEs.
Shay Nehmad:Not that I'm not convinced. It's just like I'm still reeling from, Versus Code is not an IDE. It's an editor with a bunch of plugins.
Jonathan Hall:So there
Shay Nehmad:there's a understand. It it's sort of like how much sawdust can I put in a granola bar until it be be stops being a granola bar and starts being, like, sawdust? I mean, I of course, technically, what you say is right, but I'm like, I I I don't know. I and, also, I use it to edit or I use Vim, whatever, but the same same difference. Right?
Shay Nehmad:I have Vim with a a whole bunch of plugins for syntax highlighting and blah blah blah blah.
Jonathan Hall:I use it to I have a pretty lightweight Versus Code configuration. So when I've loaded a true IDE is like JetBrains stuff, it always feels like I'm walking through molasses. Going to everybody who I haven't pissed off yet, going to piss you off now, I hate JetBrains.
Shay Nehmad:Oh, no. Wait, wait, they in the future will ever sponsor us in that case.
Jonathan Hall:I don't think I want Oh my god. Bother
Shay Nehmad:JetBrains Air is like the most awesome agentic development, workflow I've ever had.
Jonathan Hall:I would accept JetBrains sponsorship before an Adelina sponsorship, but that's about it.
Shay Nehmad:I will not accept that.
Peter Downs:That's a good idea. Yeah. Hey. You guys should get a linear sponsorship. Don't know.
Peter Downs:Yori, the CTO. Awesome guy.
Jonathan Hall:We should Yori,
Shay Nehmad:if you're listening to us. Your company should start offering dynamic ad, placements on podcasts.
Jonathan Hall:Oh. And
Shay Nehmad:then we could So I think cool would that be? Go delivery mechanism for, like, dynamic
Jonathan Hall:to that is easy. We just need to vibe code a Cup o' Go app for your for your mobile.
Peter Downs:That's true. We could do this right now. If you are a mobile app, we can serve ads to you.
Jonathan Hall:There it is. And that can serve
Peter Downs:them very efficiently. Go is really good at it. Awesome.
Shay Nehmad:Where can people find you online? Is there anything you wanna plug? We really appreciate your time coming here. This is your place to put an ad or whatever for yourself or your company or whatever.
Jonathan Hall:I was having such a time button. I promise. We won't.
Shay Nehmad:You can actually Yeah. Yeah.
Jonathan Hall:We're listening. Alright. So one one thing on the
Peter Downs:x buttons is that is the number one complaint about mobile ads hand hands down. So you guys are right on the right on it with everybody else wishing it would actually work. You can find me on Twitter, I'm Peter L Downs. You can find me at my website, peterdowns.com, and you can find me on GitHub. Again, Peter L Downs.
Peter Downs:And, my company that I work for is called CloudX. You can find us at cloudx.ai and our hiring page is SlashDrops. We're always looking to work with very talented people who want to write, vibe, and generate future of the mobile ad world.
Shay Nehmad:Cool. I opened the Peter Downs, and I see you are now working together with LeBron James, basically. You just signed with Philadelphia. I hope you're
Jonathan Hall:excited.
Peter Downs:It's pretty incredible news. I'm actually I kinda can't believe it, but maybe that'll maybe that's what we need.
Shay Nehmad:Well, we'll see. Maybe he brings his son with him, so maybe it's not that good of a news.
Peter Downs:Listen. We'll we'll take whoever we can get.
Jonathan Hall:So my question was, are you hiring specifically Go roles or all sorts of roles?
Peter Downs:We're we're hiring across the board, but essentially everyone on the technical side is writing Go in some capacity. So there's a full stack roles that are more Go Lang focused, but even our mobile engineers are actually contributing to the back end these days. So yeah, if you write Go or you want to learn Go and you want to work in a pretty high paced environment, come reach out.
Shay Nehmad:Cool. Well,
Jonathan Hall:I warned you before we started recording, Peter, that we have a question at the end. You've had a few minutes to think about it. Question is, what is your favorite third party library? And I did say you're allowed to choose your own, but you didn't seem to want to do that. So what is your favorite third party Go library or tool?
Peter Downs:I don't think it's fair for me to pick any of my own, but they are obviously number one. They're obviously awesome. I'd say the the other thing the the one that I'm actually loving right now is called Pocketbase. It's an open source kind of Firebase or Supabase reimplementation. It's on top of SQLite, not PostgreSQL.
Peter Downs:So Oh. Oh, no. Sad. But, it's actually an incredibly well built piece of software that I've only started using recently, but shout out to the Pocketbase team or Maintainer. I really don't even know that much about it, but it's been incredibly cool to work with.
Peter Downs:So shout out Pocketbase.
Shay Nehmad:And I don't know if you remember, Jonathan, but we talked about, Pocketbase, in the show.
Jonathan Hall:I know that we have. I don't yeah. It's been a while, but, yeah, we we
Shay Nehmad:2024. Wow. Oh my god. That was that was a long time ago. Open Tofu.
Peter Downs:Well, it's still trucking that. I think it's a version '37 or something, and I'm, messing around with it and loving it. So shout out to Pocketbase. Awesome.
Shay Nehmad:Yeah. Oh, wait. Hold wait. Wait. Wait.
Shay Nehmad:Wait. Wait. Hold the hold the phone. We talked about it on our first episode ever.
Jonathan Hall:Really?
Shay Nehmad:Yes. We had, like, a non sponsorship segment in the middle where we were like, highlight an open source project, in 01/23/2023. So I'll just I'm sure
Jonathan Hall:that's why they're popular.
Shay Nehmad:Listening before we mentioned you by name. You would have already known about this for, like, three years.
Peter Downs:I'm, I'm late to the game, but I'm, I'm an ardent supporter.
Jonathan Hall:There there we go.
Shay Nehmad:But I really like Pocketbase. It's written in Go, and it basically takes the Firebase paradigm to sort of entire platform as a service into a single Go binary that you can build and run close to where you're running. Maybe if you have a hobby project, that's a really, really good way to get it started.
Jonathan Hall:Well, thanks, Peter, so much for coming on. It's nice. I like meeting my the people who write the code I use. So, I guess you like to meet the people who use your code. So, win win all around.
Jonathan Hall:Thanks for coming on and talking about Go. It's been a pleasure.
Shay Nehmad:Yeah. And we will stay in touch because my codex is just about wrapping up here. So I'll have to send the project Awesome. Your way for you to review
Peter Downs:will not be reviewing. I'm happy to merge it right to Maine on on my phone. So that's the world we live in these days. Guys, thanks so much for having me. I had a blast.
Jonathan Hall:Thanks a lot.
Shay Nehmad:Thanks, man.
Jonathan Hall:Alright. Filippo, cue the it feels good to be a gangster song as we as we close out this
Shay Nehmad:this
Creators and Guests
