Episode Transcript
Transcripts are displayed as originally observed. Some content, including advertisements may have changed.
Use Ctrl + F to search
0:12
Welcome to Go Time, your source
0:14
for wide-ranging discussions from all around
0:16
the Go community. Find
0:18
us on the web at gotime.fm,
0:21
on the Fetaverse at Gotime, at
0:23
changelog.social, and on X at Gotime
0:25
FM. Thanks to our partners at
0:28
fly.io, the home of changelog.com. Launch
0:31
your app as close to your users
0:33
as possible. Find out how at fly.io.
0:36
Okay, here we go. What's
0:42
up friends? Do you remember when chat
0:44
GPT launched? I do. It
0:46
felt like the LLM was this magical
0:48
tool out of the box. However,
0:51
the more you use it, the more you
0:53
realize that's just not the case. The technology
0:55
is brilliant. Don't get me wrong, but it's
0:57
prone to issues like hallucination on its own,
1:00
but there's hope. There is
1:02
still hope. Feed the LLM reliable
1:04
current data, ground it in the right
1:06
data and context, then and only
1:09
then can it make the right connections
1:11
and give the right answers. The
1:13
team at Neo4j has been exploring how
1:15
to get results by pairing LLMs with
1:17
Knowledge Graphs and Vector Search. Check out
1:19
their podcast episode about LLMs and Knowledge
1:22
Graphs throughout 2023 at Graph Stuff
1:25
dot FM. They share tips on
1:27
retrieval methods, prompt engineering, and so
1:29
much more. Don't miss it. Find
1:32
a link in our show notes. Yes,
1:34
check it out. Graph stuff dot FM
1:36
episode 23. Welcome
1:56
to Go Time. I'm your
1:58
host, my name is Chris. There
8:00
was this debugging argument that
8:03
he was making that I was following,
8:05
but I'm not really sure how that's going to
8:07
shake out in the actual implementation as far as
8:09
when you look at it. I don't think it's
8:12
going to look this weird when you look at
8:14
it, the iterators. Yeah,
8:16
I think that's also something that can be worked
8:19
out in the error messaging and the stack traces.
8:21
There's also an argument here that
8:24
it implicitly transforms, returns, continue, breaks,
8:26
defers, all of those. And I
8:29
understand that that does add complexity when you're thinking,
8:31
but as far as writing code, I think that
8:33
makes it a lot more simple. I don't have
8:35
to learn how to do
8:38
these things outside of the actual keywords,
8:40
right? Trying to continue inside a
8:42
not like a custom iterator
8:44
now is kind of a nightmare. Yeah. And there's
8:47
been so many times I'm like, I would like
8:49
to continue here, please. So I
8:52
honestly do think it's going to be simpler overall,
8:55
just being able to use your normal
8:57
semantics and keywords. Yeah. Because I was
9:00
using the goldmark package the other day
9:02
and has this AST walking
9:04
thing. And you have to return special
9:07
things to be like, oh, continue or exit
9:09
or whatever. And I was like, this is
9:11
kind of wonky. I don't know if I
9:13
like this as much. And then also, error
9:16
handling sucked a whole lot. And
9:18
I think it's kind of easier
9:21
to apply your own error handling
9:23
if you can just do a regular for loop
9:25
here or for range loop. Because
9:28
you can just have the captured error
9:31
variable that should still work
9:33
is I think it should work. Let's
9:35
see why it wouldn't work. I know there's
9:37
also the argument that this is one more way to iterate.
9:39
Right? But I think that argument kind
9:41
of falls flat, because it's not like
9:44
there were standard ways to iterate before. Right?
9:46
So we're not introducing a new standard. It's
9:48
just we're agreeing on a
9:50
pattern. Yeah, making
9:52
an attempt to consolidate or at least give
9:54
people a predefined path
9:57
to go on and not just like
9:59
what package have you been using and
10:01
deciding how you want to design your iterator based on
10:04
what packages you've seen, how you have an actual like,
10:06
well, this is how you can canonically do it
10:08
in the language. And you can still go
10:10
do it by under the way if you wish. But this
10:12
is how the way people are probably going to be most
10:14
familiar with. Yeah. So to
10:17
sum it up, I'm not
10:19
sure it's going in the wrong direction. Yeah,
10:22
it's kind of a, it's a very bold and
10:25
broad statement. They'll be like, it's
10:27
evolving in the wrong direction. I
10:29
think it's, I think
10:32
the only direction that languages can
10:34
evolve, especially if you want backwards
10:36
compatibility guarantees, is to become more
10:38
complex over time. Like I
10:40
think through that complexity too, you can gain simplicity,
10:44
right? So I think there's a weird argument in
10:46
here about like, yes, we have to keep
10:48
all of these old iterator styles,
10:51
but perhaps, you know, not forever. Like
10:53
we have ways of deprecating things even
10:55
in the standard library now. So
10:57
it's like, it gives us a path toward
11:00
all of the iterators eventually looking the same
11:02
or being able to like convert one iterator
11:04
to like this style of iterator in the
11:06
future with some like glue code or something.
11:08
So it seems like it feels like it
11:11
will have the eventual effect of making things
11:14
more simple in the same way that
11:16
generics had the effect of making things
11:18
more simple. For example, from the slices
11:20
package, right? Now you don't have to implement your own slices
11:22
package or implement all these functional all of
11:24
the time, or you don't have to, you know, write
11:26
those same lines of code that
11:28
are kind of confusing if you don't understand
11:30
that pattern already. I think most people, you
11:33
see the word slices.clone, you're like, I bet
11:35
this clone's a slice, right? It's very, it's
11:37
very straightforward what that means. So
11:39
I think like, yes, on the, I think on
11:41
a small scale, it might add
11:43
complexity language. But I think on a large
11:46
scale, it's making the language go in a
11:49
good direction, toward more of
11:51
the simplicity that we want. Because yeah,
11:53
if you don't want to have any
11:55
added complexity, then you just can't add
11:57
anything to the language. And that is
11:59
also. also a bad thing for the
12:01
language. Yeah, I like that
12:03
small scale versus big scale. Like
12:05
it's making the ecosystem simpler,
12:08
not the language simpler. Right. And
12:10
there is a kind of somewhat strange argument
12:12
at the end here too, where he talks
12:14
about like, oh, like we should
12:16
have more SIMD instructions and things like
12:19
that because Go is losing in the
12:21
performance space to Rust. And
12:23
I mean, we can talk about this with the
12:25
next article, but I don't really know if like
12:27
Go is that great
12:30
of a language for performance critical
12:32
things. It's not terrible for
12:34
performance critical things, but I
12:37
don't think that's like the target that Go
12:39
is usually going for most of the time.
12:41
It's not like the, when I think of Go,
12:43
I don't think of like, oh, I need
12:45
like low level, raw performance. I think like,
12:47
oh, I want a language that allows me
12:49
to maintain, you know, large code
12:51
bases that do, you know, a
12:53
whole bunch of different things. And I want to be able
12:55
to actually maintain it with the somewhat large team of people.
12:58
Yeah, I do think that's a good
13:00
transition to the next article. Yeah, so
13:02
this one isn't so much of an
13:04
article as it is a post on
13:06
Reddit and someone asking in
13:09
our Go lane, what software shouldn't you
13:11
write in Go? And
13:15
interestingly, I feel
13:18
like the people that commented like
13:20
some of the top comments, I'm just like, you're
13:22
all oddly wrong. Like most
13:25
of it is about like, oh, garbage
13:27
collection is a barrier. Like
13:30
one of the comments literally says garbage collection is a
13:32
barrier for some hard real time processes. And
13:36
there was an interesting other Reddit
13:38
thread I found. It was about
13:41
same sort of thing of like, well, why do we
13:43
keep saying that Go is bad
13:45
at real time? And
13:48
the argument and people basically said like,
13:51
what do you mean by real time?
13:54
Like what type of real
13:56
time constraints are you talking about? And
13:59
this is a very insightful. just like, you
14:01
know, real time doesn't necessarily have to mean like
14:03
as fast as possible. It could also just mean
14:05
like at a fixed interval. But
14:07
also like, you know, we're not in the go, certainly
14:09
not in the pre-go 1.5 era or in the even
14:11
1.5, 1.6 era where the garbage collection
14:15
pauses were, you know, 10 milliseconds
14:18
at every 50 milliseconds. Now
14:20
it's sub millisecond max
14:23
garbage collection pauses. I think it's like 100
14:26
microseconds is where they've gotten it down to
14:28
for the like the longest, like worst case
14:31
garbage collection pause, which for
14:33
most real time systems seems to like
14:36
that shouldn't that does not feel like it makes
14:39
a large difference for most
14:41
people as far as GC is concerned. So I
14:43
don't I don't really buy that whole argument of
14:46
it's bad at doing things
14:48
that need to be real time. But
14:51
what do you think? I mean, I get what they're
14:53
saying, right? Like I'm not going
14:55
to write some in best embedded like
14:58
firmware and go that needs to
15:00
recalculate something a hundred Hertz, right?
15:03
Like that just doesn't make sense anyways. But
15:06
yeah, I think I think people are
15:08
still kind of confused about the stop the world
15:10
GC stuff. Yeah, I think people like that also
15:12
goes to like my thing. I
15:15
always remember of like you don't have a garbage collection problem.
15:17
You have a garbage problem. Like if
15:20
the garbage collector is getting in your way,
15:23
it probably means that you have done something
15:25
pretty awful with your memory management,
15:27
you need to go fix up your memory
15:29
management. Like garbage collection does
15:31
not mean you don't do memory management. It
15:34
means you don't have to write as much
15:36
of the code to management as intricately be
15:38
self to do memory management. Yeah,
15:40
I also saw a lot of arguments on here. You
15:42
shouldn't write like gooey is with go. And
15:45
I think I would tend to agree with that. Like that's
15:47
just not what I would reach for. I
15:49
think there are some like decent libraries now, but
15:52
yeah, I don't know. Yeah, I think
15:54
gooey's is especially when
15:56
like the native platform like
15:59
language. macros
20:00
to make everything work. Yeah,
20:03
anything else on this list
20:05
of responses? Oh,
20:09
someone said they write everything in Go. Oh,
20:14
god. I'm actually trying to answer this. Is
20:17
there a class of software you should not write in
20:19
Go? I don't think there is. Yeah, I mean, I
20:22
don't think there is. I think
20:24
there's software that might be slightly better
20:27
to write in another language. This
20:30
is kind of like a thing I've been thinking about a lot
20:32
lately. It's probably like
20:34
another podcast idea or another
20:36
podcast episode idea. But we can also talk
20:38
about if we have time, where I've been
20:40
reading a bunch of Leslie
20:42
Lamport's work, mostly because I
20:44
haven't read the Paxos paper in a long time,
20:46
the part-time parliament. And I was like, I think,
20:49
looking for something else that he had
20:51
written. And I came across like, basically,
20:53
Leslie Lamport has this very
20:56
long list of all his written works. It's, I
20:58
think, currently 193 works long. So
21:00
he's written a lot of stuff over his
21:02
career. And in the
21:04
kind of blurb he writes about Paxos
21:06
in the part-time parliament, he's like, oh,
21:09
this is a simple algorithm. And
21:12
he doesn't really, he's like, I don't understand why
21:14
people don't understand this algorithm. So I
21:16
said to him, I read that paper. And then after reading that paper, I
21:18
was like, oh, this is kind of simple. And
21:21
so I went through and like got a whole bunch of other
21:23
papers. So I'm going to read all of these. And
21:26
there's one of his papers where he's
21:28
talking about teaching concurrency and
21:31
kind of like his suggestions for how we
21:33
should teach concurrency to students, specific
21:35
computer science students and computer engineering students.
21:38
And there's this really great line
21:40
in that paper. Actually, let me
21:42
like pull it up so I can read
21:45
it correctly. And he's talking about
21:47
like computation here. So he says, how
21:49
should we describe computations? Most computer scientists
21:51
would probably interpret this question to mean,
21:53
what language should we use? Which
21:55
I think is kind of the question we're asking
21:57
here of like, I don't know what.
22:00
things shouldn't you write in a go? What things shouldn't
22:02
you use this language for? And then
22:04
he says, imagine an art historian
22:06
answering, how would you describe Impressionist
22:08
painting by saying in French? Which
22:11
is just a hilarious line. And
22:13
just, it's one of those like deep
22:15
and subtle cuts at us as an
22:18
industry. Cause it's true. It's like
22:20
we talk about like, oh, you shouldn't use that
22:22
language to build that thing. It's like saying you
22:24
shouldn't write that novel in French cause it's not
22:26
a good, like you should write all novels in
22:28
English cause English is a good language for writing
22:30
novels. And it's like, we should
22:33
not be thinking about things in that way. And
22:36
kind of this point is like, we should be talking about
22:38
this stuff in form of concepts. And I
22:40
think that's true of this discussion as
22:42
well of like, I
22:44
don't think that there are things
22:46
that you, there certainly aren't things you can't
22:49
write in go if you can write them
22:51
in any language. Go is a turning complete
22:53
language, which means it's equivalent to all
22:55
of the other languages. There might be like missing APIs.
22:57
You might have to like go do some FFI stuff
23:00
and to see to like make it work or to
23:02
other weird assembly stuff. But there's not
23:04
like a fundamental thing that you can't do with, that
23:06
you can do with Go and can't do with another
23:08
language or you can do with another language and can't
23:10
do in Go. So I think
23:13
it's like more about the concepts that matter
23:15
and can you express those concepts well in
23:17
Go? But also there's like the
23:20
whole other, other argument as well of just like,
23:22
I don't know if you're doing a startup or
23:24
something like that or creating a project, is
23:27
Go your strongest language? That's probably the language you
23:29
should write that thing in, right? So
23:31
if you're like, for example, when you're talking about early
23:33
about Goobies, it's like, okay, if you need to build
23:35
a whole bunch of Goobies and Go is your strongest
23:38
language, perhaps it's just better to
23:40
make a slightly uglier Gooey and
23:42
learn something like fine. So you
23:44
can just implement a Gooey
23:46
with that and then have the application you want
23:49
and then move on instead of having to like
23:51
learn a whole new language just to build
23:54
a Gooey, right? It's like, oh, I
23:56
got to run Swift and C sharp and I guess
23:59
C++. for Linux. I don't
24:01
know what Linux goobies are made in, but yeah,
24:03
go learn three other languages to go
24:05
express this same concept. Seems kind of
24:08
silly. It's like, yes, go. Oh, you
24:10
want to like write this same
24:12
story, but you need to write it in like
24:14
four different languages now. Like that feels a little
24:16
weird. If you could just write it in the
24:18
one, it can still be accessible to everybody. We're
24:22
right back to the ask
24:24
a question in software engineering. And the answer is
24:26
it depends. Yeah, yeah. I
24:28
mean, I guess the answer to this is like,
24:30
what software should you write and go is mostly
24:32
just like, I don't know, just just
24:35
write and go like, if
24:37
you know, go goes to strong language, right? And go like,
24:39
and if that doesn't work for some reason or the reason,
24:41
I'm going to write in something else. But I
24:43
think it's yeah, I don't think there's
24:45
any broad answers that that work for
24:49
this kind of certainly, you know,
24:51
the broad answers that will fit into like a
24:53
Reddit response that is reasonable to read. Right. When
24:55
people say like, can't build real time systems in
24:57
it. It's like, no, like,
25:00
nuance is required there. Like, if I'm
25:02
writing, like, spark jobs, I'm
25:04
not going to write them and go
25:06
though, because it's Python or Scala, right?
25:08
Like, that's the supported languages.
25:10
Like, I think there's an argument for
25:12
tooling here, right? Like, don't shoehorn go
25:14
into things where there is no tooling,
25:17
just because you want to. I mean, it also
25:19
depends on your goal. Right? Because
25:21
it's like, if you have that argument,
25:23
then there will never be tooling for that thing
25:26
in that space. Right? If no one does it,
25:28
then there's never gonna, it's not, it's not going
25:30
to be in that space. Right? That creates like
25:32
those artificial barriers. And I
25:34
think like even, even thinking in this
25:36
way is indicative of, I
25:38
think of the problem that like Leslie Lamport
25:41
was bringing up in that conversation, which is
25:43
like, or in that paper, which is like,
25:45
if we think in the
25:47
framing of like certain languages are
25:49
good for certain things, then we're
25:51
not really thinking about the problem
25:53
itself. Right? We're thinking about
25:55
this other colored version of the problem of
25:57
like, okay, this problem in. And
26:00
then it's like, oh, well, now if we go to another language,
26:03
you have to solve that problem in a different way in that
26:05
language, which is, I
26:07
don't know, not, not, not the,
26:09
not the best of situations, but
26:11
that's a larger industry
26:13
level thing we got to solve
26:15
for. Yeah. I agree with you
26:18
there, but I think there's some leeway on both sides.
26:20
Like at the end of the day,
26:22
you got to make money. You got to get stuff done.
26:24
Yeah. You got to get stuff done. I
26:26
don't know. Yeah. Like once again,
26:29
like the big view versus the little view
26:31
from a individual person standpoint, uh,
26:34
or a small company standpoint. Yeah.
26:36
There's probably some things you shouldn't rate and go and you got
26:38
to make that trade off. But it's
26:40
also like a different type of question. Like is
26:43
the difference you post a question to
26:45
a company versus toward an individual. I
26:47
would say. So yeah,
26:49
you're right. It's a, you know, it, it
26:52
depends. It depends. It depends.
26:54
Uh, yeah. Yeah. That's
26:57
the Lord, the answer
26:59
to all the questions. It depends. Yeah.
27:02
You know, there's a whole, whole series over on
27:04
a unchanged log. I think it's
27:06
a change on that friend series. It depends. I
27:09
did an episode. It was fun. There's
27:11
many more episodes. I have not listened to that yet.
27:14
I'll have to check it out. So I'll go listen.
27:16
They're good episodes. They're fun. All right.
27:18
Do we have anything else to say on what software
27:20
shouldn't you write and go? So choose
27:22
your own adventure. I do think
27:24
that leads interestingly into the make files
27:27
written and go alternatives to make written and
27:29
go. Should you write
27:31
an alternative to make and go? I think
27:34
probably yes. Yeah. Yeah.
27:37
I mean, make also make is for a number
27:39
of reasons. Pretty awful. It's
27:41
like standard, which is nice, but
27:43
like that whole only
27:46
using like tabs thing and
27:48
so many other weird syntactical
27:50
things about make and
27:52
make files is just exhausting.
27:56
And like, I, you know, for well-established
27:59
projects or I think. I think ecosystems
28:01
like C and, yeah,
28:03
that have this more baked into them,
28:06
it makes sense. But for Go, it's
28:08
always like, Make files always feel so
28:10
awkward, weird in Go. So
28:13
I think I've always like reached for
28:15
some other alternative. Have you used any
28:18
of the alternatives mentioned in the article?
28:20
I think I've used Mage a few
28:22
times. I don't think I've ever used
28:24
Taskfile. Also, I hate YAML, so I
28:26
don't think I want to use Taskfile. Yeah,
28:29
we use Mage pretty extensively where I work.
28:31
And I think one of the great parts
28:33
about it is, I don't
28:36
have to learn all the weird extrinsicities.
28:38
How do you say that? Oh,
28:40
extrinsicities, yeah. Of the AWS
28:43
CLI for doing stuff. Like,
28:45
Go has a great AWS
28:47
SDK, right? So we can do all
28:49
of our automated AWS stuff
28:51
in a Mage file and it just works. It's
28:54
amazing. I would definitely recommend. That's nice.
28:56
And just being able to keep everything
28:58
in Go sounds nice. I
29:02
mean, having the full power of like, a
29:04
full actual turning complete language is nice not
29:06
having to do, kind of as the author
29:08
points out, all of this kind of bending
29:11
over backwards to make stuff work with the
29:13
shell and the weird version of the shell
29:16
that Make has. Yeah, being
29:18
able to do real for loops is real nice.
29:20
Yeah. Not that the shell can't do for loops, but
29:22
I mess it up every single
29:25
time I try. Real for loops and logging
29:28
and, execution
29:30
of parallel commands and a whole bunch of other
29:32
stuff. That's just like, this is like easier to
29:35
do in Go than it
29:37
is to do in other things. So
29:40
yeah, I mean, I'm fully on board with things like Mage.
29:42
Once again, I don't, when it comes to task
29:45
file, I don't really see, I
29:47
guess if you don't want to learn Make, like
29:51
the syntax of Make and you're
29:53
happy with YAML, then it's good. But
29:55
I just really do not like YAML. There's
29:58
just so many oddities. Like I was writing
30:00
YAML inside of Markdown the other day and
30:02
it was like, I was getting some weird
30:04
error from it because, oh, because I was
30:06
writing it and it was like converting my
30:08
tabs to spaces, just spaces to tabs on
30:10
a which, but the YAML parser didn't like
30:12
the fact that it was not using the
30:14
correct spacing type and it blew up with
30:16
some weird error. And I was like, this
30:19
is obnoxious, I don't like this. How
30:21
it likes white space important syntax
30:25
is not
30:27
what I enjoy in life. So I would
30:29
probably just sit down and use make or
30:31
really just use mage or something like that
30:33
instead of task file. But I'm
30:35
sure plenty of people like this. If
30:37
we wanna dist.toml or YAML some more,
30:39
I think one of my most frustrating
30:41
days ever was because YAML was not
30:44
considering something a string I thought was a string.
30:48
So you don't have to quote things, right? But every
30:50
once in a while, that'll bite you. Yeah,
30:52
yeah. It's
30:55
such a messy
30:57
markup language for sure. I
30:59
get why it was created, but
31:02
there's a lot of things we create that
31:04
sometimes are bad ideas. A
31:06
lot of things in this industry we create are
31:08
bad ideas. But yeah, no, I think like mage,
31:10
mage is cool. I think I've used it a
31:12
few times in the past. If you haven't checked
31:15
it out, you should definitely listen or go check
31:17
it out. Especially- I
31:19
would recommend. Yeah, especially like the fact that
31:22
it's like a directory of files. So
31:24
you can kind of like properly manage the structure of
31:26
it and have your own little like build system within
31:28
your code base. What I think is helpful.
31:31
Yeah, we've actually used mage inside of GitHub
31:33
Actions too to help manage
31:35
some of the like build and test
31:38
scripts. And it
31:40
works real well. Yeah, it's like you're
31:42
building your own little build system, which if you're
31:45
only ready to go, that's a nice little thing
31:47
to have. Yeah, I don't know.
31:49
Much else we want to say on good
31:51
old mage or good old, what
31:54
are these alternatives to make files? That's
31:57
all I got. Ha ha ha. I
32:01
do recommend checking out. If it
32:03
works for you, it works really well. Yeah.
32:07
What's up friends? I'm here
32:09
with two new friends of
32:11
mine from SpeakEasy. Sengar Batchu,
32:13
co-founder and CEO and George
32:15
Hadar, founding engineer. So for
32:18
the uninitiated, SpeakEasy takes care
32:20
of the entire SDK workflow
32:22
to save you and your
32:24
team significant time, delivering enterprise
32:26
grade SDKs to your customers
32:28
in minutes. You can generate
32:30
best in class SDKs in
32:32
TypeScript, Python, Go, Java, C-sharp
32:34
and even PHP. So
32:37
Sengar, what's your excitement level
32:39
for APIs and this API
32:41
world we're living in? I'm
32:43
super excited about APIs. I
32:45
think we went through Gen
32:47
Zero of the API first
32:49
revolution. And I think we're actually going to
32:52
a second one now with the tailwinds of
32:54
the AI ecosystem kind of causing that to
32:56
be invigorated. So yeah, super, super psyched to
32:58
be working in this space right now. I
33:00
think it's, everyone's at a point now where
33:02
everyone knows about REST APIs and GraphQL APIs
33:05
and GeoPC APIs. And now I think we're
33:07
actually getting into the second phase of
33:09
that, which is how do people ship
33:11
great developer experience in addition to the
33:13
APIs? And how do we build
33:15
like truly best in class APIs that
33:18
turn into laying along the infrastructure, right?
33:20
And this is kind of the vision,
33:22
I think, that Stripe helped manifest for
33:24
everyone in the FinTech space, which is
33:26
an API that really sets the bar
33:29
for developer experience, but also like it's
33:31
something you can truly rely on. It's
33:33
a true fuming Stripe dependency of your
33:36
company. You can feel confident doing that.
33:38
And I think that's the part of API development
33:40
that really excites me. I agree,
33:42
that is exciting. So George teams who
33:44
leverage SpeakEasy are those who have leaned
33:46
all the way in on
33:49
documenting a solid open API spec
33:51
and mostly want to be hands
33:53
off of their SDKs. Is that
33:55
right? Precisely. So you're coming to
33:57
us because you want to be
33:59
hands off. from that process. You
34:01
want to put all of your effort
34:03
into documenting your API and then you're
34:05
trusting and relying on great quality tooling
34:07
to turn that into code and documentation,
34:09
which is what we're doing for you.
34:11
You're not meant to change or edit
34:13
the code because it will be regenerated
34:15
the next time you change your open
34:17
API. So you ultimately put it in
34:19
our hands. Once you've committed the changes
34:21
to your open API, it's off to
34:23
the races and you get a new
34:25
release of your SDK. You'll get a
34:27
pull request to review. You will have
34:29
the opportunity to look at the contents
34:31
of the code, but quite often you
34:33
can let it hum along creating SDKs
34:35
for you or new releases of your
34:37
SDK every time you change your API.
34:39
Very cool. Well, the thing that got
34:41
me with speakeasy that really helped me
34:44
understand it was that as George said,
34:46
it is hands off. You can just
34:48
focus on documenting your API via the
34:50
open API spec and you still have
34:52
pull requests. You still have visibility. And
34:54
in fact, they will even hop into
34:56
pull requests with you to triage any
34:58
sort of anomalies or issues that come
35:00
from the SDK generation and improve
35:03
the backend of speakeasy to make
35:05
future releases better for you. I
35:07
think this is so cool for
35:09
teams who want to just be
35:11
hands off of their SDKs and
35:14
focus on their product, focus on
35:16
the core documentation around the open
35:18
API spec, but still have all
35:20
that awesome visibility. Okay. So the
35:22
next step is to go to
35:25
speakeasyapi.dev. You can start off with
35:27
one free SDK. That's so cool
35:29
because you can go there right
35:31
now and try it out completely
35:33
free. One free SDK. Let them
35:36
know the changelog sent you, let
35:38
them know JS party sent you.
35:40
Once again, speakeasyapi.dev. So
35:50
the next article we have is titled
35:52
the long overdue problem coming for some
35:54
people in Go123. This
35:56
is kind of like an in the world. Weeds
36:01
article. This is talking about a specific
36:04
compiler directive called
36:06
Go Link Name that the Go team
36:08
is starting to really lock down. Should
36:10
we explain what it does? Yeah, yeah.
36:12
So it's about to explain what it
36:15
does. So Go Link
36:17
Name effectively allows you
36:19
to reference an object
36:21
or a symbol or something like
36:23
that that you would usually not
36:25
be allowed to access. So for
36:28
example, you can use it to
36:30
access a unexported variable
36:33
or function in another
36:36
package. So you have some package that has
36:38
some type or some function foo that would
36:40
only usually be able to be called from
36:43
within that package. And you have another package.
36:45
You can use this Go Link Name directive
36:47
to be like, actually, I
36:49
want to be able to call foo from inside my
36:51
package, which obviously, it's necessary
36:54
for the Go team and for
36:56
Go to have this for a
36:58
number of reasons. But it also
37:01
is kind of
37:03
not great because it means that
37:05
now all of your things
37:07
you meant to be private are not really private
37:09
anymore. You just kind of reach in and grab
37:12
them and take them out and use
37:14
them. Yeah, a couple of notes on that. You do
37:16
have to import unsafe to use this. So
37:19
you are the Go team is telling you, hey,
37:22
this is going to break. So
37:24
the changes that they're making is that
37:26
you can no longer just go in
37:28
and grab something out of any package.
37:31
And the next version of Go in 123, only
37:34
things that are explicitly marked as
37:36
you being allowed to do this will allow
37:39
you to do it, which I
37:41
just find to be kind of a funny thing
37:43
because then this is just another way of exporting
37:45
things. Because it's like, yeah, it is
37:47
a little bit weird. Yeah, it's like I get why
37:49
we're doing this kind of gymnastics to
37:51
make this happen. But it's just kind
37:54
of hilarious. You see it
37:56
a lot in the standard library. and
38:00
stuff from the runtime, right? Like
38:03
if they're gonna lock this down, I wonder why
38:05
there isn't just a runtime package that
38:07
is used to pull those things in. Like
38:09
there's probably a good reason, but I don't know
38:11
why. Yeah, and I think this
38:14
directive also was probably intended to be used for
38:16
something else and people found they could use it
38:18
for this thing and are like, oh, we'll just
38:20
use it for this other thing. It's
38:23
also interesting like the particular
38:25
situation of why the author
38:28
kind of stumbled upon this was because of
38:30
the quick go package that needed
38:32
to get the default Cypher suites for
38:34
TLS 1.3. And
38:37
in go, there was explicit choice
38:39
made that those Cypher suites are
38:41
not configurable, but also because
38:43
of, you know, does your
38:45
hardware support AES? Does your client want
38:48
to use AES and a whole bunch of
38:50
other things? It's not like
38:52
the default Cypher suites might not even
38:55
be like an actual like stable thing
38:57
that you can reference, which
39:00
is like an interesting little quirk of
39:02
this quirk is that, you know, the
39:04
reason why it's not an exposed variable
39:06
is because it's an extremely complex thing
39:08
that like can't really be determined until
39:10
runtime and still might shift at runtime.
39:13
So it winds up being like this kind of odd
39:16
space and that's why it's not an exported
39:18
thing. But yeah, just a little bit of
39:20
a weirdness. This whole
39:22
situation is just weird overall. But
39:25
yeah, it's like a little thing that's gonna start breaking
39:28
random things. I'm sure there's tons
39:30
of just people that have used this as some sort of
39:32
pack to get around something. And now stuff
39:34
is just gonna start breaking and people have to figure out how
39:36
to fix that. Yeah, and the
39:38
proposal to do this, I think is
39:40
really interesting because in it, Rustcox literally
39:42
says, hey, this is gonna break stuff,
39:45
but it puts us on a
39:47
good path forward. So it's worth breaking those things,
39:49
which I think I agree with. Yeah, I mean,
39:52
once again, you probably shouldn't be able to just
39:54
reach into other packages and
39:56
tinker with their unexplored things like
39:58
that. saying
1:02:00
like, Oh, we need to get
1:02:02
rid of these harmful, quote unquote harmful words on
1:02:04
our code bases. So master and master and slave
1:02:06
and blacklist and whitelist and all of these things.
1:02:08
And there's a huge hubbub
1:02:10
and people filed a bunch of PRs and we
1:02:13
eliminated a bunch of these words. And like, you
1:02:15
know, get we we changed it, it's no longer
1:02:17
master is default. It's main, right? We went through
1:02:19
all of this effort to change all of these
1:02:21
things. And this in this idea that
1:02:24
like, oh, these words using these words are harmful
1:02:26
to, you know, people of color, especially black people
1:02:28
and they shouldn't have to see them every day
1:02:30
and all of this. And I
1:02:33
push back a lot. And that at the time, I was like, this is
1:02:35
not this is not where we need to be spending our time. And people
1:02:37
said, well, we got to do something, we should be doing some things. And
1:02:39
like, we can do this, and we can do those other things. And
1:02:42
then you look at the same
1:02:44
industry as the same people. And we're
1:02:46
just like, you know, full on embracing
1:02:48
AI right now. And if
1:02:51
you go look at the underpinnings of how
1:02:53
all this data is cleaned, how these things
1:02:55
get trained, there's a lot
1:02:57
of like subjugation of like, especially people
1:02:59
of color going on a lot of
1:03:02
destroying of people's mental health and oppression.
1:03:04
And like, where is that
1:03:06
energy from our industry to push back on those
1:03:08
things, right? We said, well, we'll get rid of
1:03:10
these things. This is the first step toward fixing
1:03:12
larger problem. But then the
1:03:14
follow through isn't there. I think that's the same thing
1:03:16
that sort of happens in obviously different contexts
1:03:19
for these other things. We're like, oh, we got to
1:03:21
make software better. So the way we make software better
1:03:23
is by fixing the languages. But
1:03:25
the languages aren't the problem. It's the concepts
1:03:27
and understanding that's the problem. And
1:03:29
that's where the Rust isn't helping. But it's not
1:03:31
just Rust. It's like any of these languages that
1:03:33
are like, we will by making
1:03:35
this language better, we will make it so you
1:03:37
can write better software. And like, that's addressing
1:03:40
the wrong problem. So I guess at the
1:03:42
end of the day, you're saying it's not
1:03:44
the languages. That's the problem. It's us. That's
1:03:46
the problem. Yeah. The engineers.
1:03:49
Once again, I think Rust is
1:03:51
a cool language. I think people
1:03:53
should use Rust. I think we
1:03:55
should have memory safety. And I think the
1:03:57
baro checker is a really cool thing. And I think we
1:03:59
should have type safety. which of all these tools that help
1:04:01
us write software better, but we
1:04:03
shouldn't forget that the primary problem with
1:04:06
software today is not that we don't
1:04:08
have memory safety. Like we've been able
1:04:10
to write many a systems with really
1:04:12
good, without having memory safety. We've been
1:04:14
able to write many a systems without
1:04:16
having type safety, right? And
1:04:18
the end of the day, your computer also like, assembly
1:04:20
doesn't have any of these things. That's what's running everything,
1:04:23
with the instructions at the end if they don't have
1:04:25
these protections on them. So it's like
1:04:28
not having these things doesn't preclude us from
1:04:30
writing good software. So we should
1:04:32
focus on what are the things that will help us write
1:04:34
good software, which I think that this
1:04:36
could be a part of it once we actually teach people
1:04:38
how to think about code and how to think about their
1:04:41
programs. So I think if you
1:04:43
actually do sit down and you spend time, a lot
1:04:45
of time thinking, you wind up with massively simpler solutions
1:04:47
to problems. And if you
1:04:49
kind of aggregate those things together, you wind
1:04:51
up with massively simpler, larger code bases at
1:04:53
the end of the day. Because if
1:04:55
you don't, the problem just snowballs. Like once you're already in
1:04:57
a mess, it's so much harder to get out of that
1:04:59
mess. Yeah. So
1:05:02
we'll see how unpopular that is. I mean, they're probably
1:05:04
pretty popular with Go people. So just said, you know,
1:05:06
Go is the ideal language for writing
1:05:08
good software. Well, not ideal. It's one of the good
1:05:10
ones. I would say like Wisp is probably one of
1:05:13
the more, you know, ideal
1:05:15
languages for the translation, at least
1:05:17
from the view of computation, if you
1:05:19
want to do it rigorously into actual
1:05:21
code you can run. I
1:05:23
think I do have an unpopular opinion. Okay, go for it.
1:05:26
And this is something I want to do an episode on. I
1:05:29
guess the premise is learning Go isn't
1:05:31
easy. I know we say that
1:05:34
a lot. Like, oh, Go is easy. You can
1:05:36
get it down in an afternoon. And
1:05:38
I would go on to expand that learning any
1:05:40
new language isn't easy. And it's
1:05:42
not, when we say learning a language, I think a lot
1:05:44
of people think learning the syntax
1:05:46
of a language, right? Like how to do a
1:05:49
for loop, how to assign a variable. And
1:05:51
I think that's the, not even the tip of
1:05:54
the iceberg, it's just the pointy part on top
1:05:56
and nothing else, right? Learning a language is learning
1:05:58
its paradigms, learning. like how
1:06:00
it's normal libraries where it gets learning
1:06:03
how to write idiomatic code in that
1:06:05
language. And that's not like
1:06:07
you're never going to get that overnight. Like
1:06:09
that's all going to come with experience. So
1:06:11
pretending that any language is easy
1:06:13
to learn, I think does the whole
1:06:15
community a disservice,
1:06:18
right? Acting like you can jump into a language and
1:06:20
immediately write good code is, is I
1:06:23
don't say realistic, at least it's not realistic
1:06:25
for me. You just don't know enough to
1:06:27
know if you're writing good code when you first
1:06:29
jump in. So learning any programming language is not
1:06:31
easy. Learning the syntax is easy. The
1:06:34
rest is hard. Yeah, I think I
1:06:36
agree with that. Because I think like the
1:06:38
way I was just kind of translating that in
1:06:40
my mind was like, if you think about it in
1:06:42
terms of like language as a whole, it's like, yeah,
1:06:45
you can learn like the syntax and the grammar of
1:06:47
like a particular natural language.
1:06:50
But also deeply embedded into language is
1:06:52
the culture of the
1:06:54
community that developed that language. And
1:06:58
it takes a lot of effort to learn that
1:07:00
culture and to understand that culture, especially if that's
1:07:02
a culture that is somewhat at
1:07:04
odds or juxtaposed with your own words,
1:07:06
like, okay, like, I think
1:07:08
this is like the thing between like, I have some friends
1:07:10
who are like Eastern Europeans and the way that they express
1:07:13
things in the way that Americans tend to express things is
1:07:15
like vastly different, especially when it comes
1:07:17
to levels of excitement. I think that same sort of
1:07:19
thing exists within programming languages where it's like, yeah, I
1:07:21
know the way that you express something in, I mean,
1:07:23
Go and Rust are good examples. The way you do
1:07:25
something in Go and the way you do something in
1:07:27
Rust are going to be
1:07:29
very different because the cultures of those communities are
1:07:32
very different. So you might be able to learn
1:07:34
in syntax, but actually understanding
1:07:36
all of that cultural stuff is
1:07:38
real tough. I think that's
1:07:40
the perfect analogy for it. Yeah, yeah, I
1:07:42
know. So I think, yeah, it's, I
1:07:46
think our unpopular opinions are like somewhat,
1:07:48
somewhat tangentially related because it's like the
1:07:51
tough part of, of all of
1:07:53
this is like figuring out like, how do you express
1:07:55
what you want to express in
1:07:57
the language, in the way it should be expressed in the
1:07:59
language? And I think that's how
1:08:01
you wind up with these languages
1:08:03
that get, or these concepts that
1:08:05
get siloed into our particular language
1:08:08
is because we like, oh, well, that language is easy
1:08:10
enough to learn. Like I think Python and data science
1:08:12
is a good example of just like, oh, Python is
1:08:14
easy enough to learn. So you can
1:08:17
do data science and data engineering in it. And
1:08:19
that whole world just kind of gets everything built
1:08:21
for it. But it's like, do
1:08:23
the people doing those things understand conceptually
1:08:25
what it is that they're doing and
1:08:27
they're simply mapping those concepts into that
1:08:30
language? Or can they only express those
1:08:32
ideas in that language itself and they
1:08:34
can't pull it out to another language?
1:08:37
I think that's a, that's an actual more concise way of saying
1:08:39
my own unpopular opinion is like, no, we need to need
1:08:42
to focus more on having the
1:08:44
conceptual understanding and mapping it into
1:08:46
the language as opposed to having
1:08:48
the language be our only vehicle
1:08:50
for expressing that conceptual thing. Yeah.
1:08:53
It's almost like we're learning things the wrong in the
1:08:55
wrong direction, like inside out. Yeah.
1:08:58
Instead of outside in. We're hyper focused on language, which again,
1:09:01
was, is Leslie Lamport's point. Like I
1:09:03
haven't finished reading the computation and state
1:09:05
machines paper, but in
1:09:07
that paper, he basically talks about
1:09:09
his interesting thing in the beginning
1:09:12
of it where he talks about
1:09:14
like, oh, imagine
1:09:16
if we didn't use equations
1:09:18
in say physics. So
1:09:20
you have two different parts of physics that
1:09:22
had their own special notation that it might
1:09:25
not be obvious that like E equals MC
1:09:27
squared is like the same thing in these
1:09:29
two to, in two different parts of physics,
1:09:31
right? Or now for, for
1:09:33
anything, right? If you don't, if you use
1:09:35
dissimilar syntax, then it's not going
1:09:38
to be easy to recognize similarities and
1:09:40
patterns between two different places or that
1:09:42
you have the exact same thing in
1:09:44
two different places. And
1:09:46
so his kind of point there was like, oh,
1:09:48
well you might, you have equations and just because
1:09:50
like you have two equations that say
1:09:53
the same thing, doesn't mean they do the
1:09:55
same thing inside of the branch of physics
1:09:57
that you're operating within in the same way.
1:09:59
like you can, you know, if
1:10:02
you put this into natural language, you can
1:10:04
say the same English phrase to
1:10:06
two different communities of people, and it
1:10:08
could mean two vastly different things, even
1:10:11
though the words are still equivalent. But you have
1:10:13
the ability to kind of like understand and translate
1:10:15
those things because you have the similar base
1:10:18
of words that you're using and all of that. Yeah,
1:10:20
I have that issue talking to non-software people, like a
1:10:24
regular software term will slip into everyday language
1:10:26
and they're like, what are you talking about?
1:10:28
Yeah, that's like, that's the, you know, the
1:10:30
beginner to master. Like, you know, you've mastered
1:10:32
something when you can explain it to someone
1:10:34
that doesn't have any context for what it
1:10:36
is because like you understand what the concept
1:10:38
of the thing is so you can better
1:10:41
bring that over to what people want to understand.
1:10:43
So yeah, I think these
1:10:46
would be two good episodes. I
1:10:48
had to get some people that will probably disagree with me and
1:10:50
get Johnny on, get some,
1:10:52
who else would disagree with me? Oh, maybe I can
1:10:54
get Sam to come back. I
1:10:58
don't disagree with what I'm saying. And another, you know,
1:11:00
gotta, gotta, gotta, if I'm gonna have this as an
1:11:02
episode of like, yeah, meh, on Rust for all these
1:11:04
reasons, gotta have people that are gonna disagree with me.
1:11:06
This is assuming that they're gonna disagree with me. They
1:11:09
might agree with me and then it wouldn't be as
1:11:11
fun or it might be like, you know,
1:11:13
Sam stands on Rust. I don't, I
1:11:15
think he's, nah, I won't speak
1:11:17
for that. I think he's fine with it, but now
1:11:19
I don't know. That'll be a good thing to learn,
1:11:21
right? Yeah. Yeah. I'm interested to know. I'm
1:11:24
still undecided on Rust. So again,
1:11:26
I don't, I'm probably going to
1:11:28
learn Rust. Like I, like me
1:11:31
being Matt on Rust has little to do with
1:11:33
like the language or its usefulness or utility. Like
1:11:35
I understand in the current context it is. It's
1:11:37
a more macro thing, right? Learn
1:11:40
concepts, people learn how to think. That's the big
1:11:42
thing. We all need to learn how to think.
1:11:44
And I hope, I
1:11:46
hope people don't think it's an insult. I'm not
1:11:48
insulting us as an industry by saying that we
1:11:50
don't think about things. Like thinking is very
1:11:53
difficult to do and it's a very difficult thing to
1:11:55
learn how to do, to think critically
1:11:57
and intensively about things. Like. So
1:12:00
it's not an insult to anybody to say
1:12:03
like, we're not thinking, it's just
1:12:05
a thing that we should fix if we want to
1:12:07
build better software. It's like, yeah, you gotta think, it's
1:12:09
hard. It's hard work. We get paid a lot of
1:12:11
money. We can do the hard work. But
1:12:14
yeah, that feels like a good place to wrap
1:12:16
it up. Any last
1:12:19
words, Ian? I
1:12:22
think we've said it all. I think so. Thanks
1:12:24
for joining me and thank you listeners for
1:12:26
listening to this kind of all over the
1:12:29
place episode. I hope you enjoyed it as
1:12:31
much as the last one we did. That
1:12:36
is Go Time for this week. Thanks
1:12:38
for listening along. Subscribe
1:12:40
now if you haven't already head
1:12:42
to gotetime.fm for all the ways
1:12:45
or simply search for Go Time. Wherever
1:12:47
you get your podcasts, you'll find us.
1:12:50
Hey, do you receive our change
1:12:52
log newsletter each Monday? If not,
1:12:54
let's fix that bug. One reader
1:12:57
calls it so good, he considers
1:12:59
it a competitive advantage. Sign
1:13:01
up for $0
1:13:04
at changelog.com/news. Thanks
1:13:06
once again to our partners at fly.io, to
1:13:09
our mysterious beat freak, Breakmaster Cylinder, and
1:13:11
to our friends at Sentry. We love
1:13:13
Sentry. You might too. Use
1:13:16
code changelog when you're signing up for a team
1:13:18
plan and save $100. Why
1:13:20
not, right? That is all for
1:13:22
now, but we'll talk to you again next time
1:13:25
on Go Time.
Podchaser is the ultimate destination for podcast data, search, and discovery. Learn More