Coding Blocks - The Pragmatic Programmer – How to Generate Code
Episode Date: August 5, 2019We continue our dive into The Pragmatic Programmer and debate when is it text manipulation vs code generation as Joe can't read his bill, Michael makes a painful recommendation, and Allen's gaming liv...es up to Southern expectations.
Transcript
Discussion (0)
You're listening to Coding Blocks, episode 112.
Subscribe to us and leave us a review on iTunes, Spotify, Stitcher, and more using your favorite
podcast app.
And check us out at CodingBlocks.net where you can find show notes, examples, discussion,
and a whole lot more.
You slurred all that.
Send your feedback, questions, and rants to comments at CodingBlocks.net, follow us on
Twitter at CodingBlocks, or head to www.CodingBlocks.net and find all our social links there at the top of the page.
With that, I'm Alan Underwood.
I'm Joe Articulak-Zach.
Did you just put on your announcer voice for all that?
Did you like that?
It sounded like you totally changed.
Like, and I'm Michael Outlaw.
I'm auditioning for ESPN.
That's my real calling in life.
Not so much. This episode is sponsored by Clubhouse, the developer-friendly project management platform.
And Datadog, your monitoring platform for cloud-scale infrastructure and applications.
All right.
And in this episode, we are going to be continuing on with the Pragmatic Programmer.
And this time we're talking about text manipulation
and code generators. But before we do that, first, what we always like to do is give a
huge thanks to those who have taken the time to leave us reviews wherever you do so. And
I don't know who's taking iTunes.
Yep, I got the short straw.
There we go. All right, so As I Rose One Mourn, Mr. Bram, MP7373, Tbone189, BernieF1982, DavidWRPain, and MLDenison.
All right, Beach, Thanks to the iTunes reviewers and also on Stitcher.
We got Ben T., More Ginger, Tomsky, and my favorite, Java Joe.
Very nice.
Did you write that one in?
Nope.
Nope.
But I wish that I did.
We always got to ask because Joe has proven to us that he will just like randomly put some stuff in there to get to us, right?
He will.
He's already said he would.
But I don't think this was one of them.
Okay.
We'll give him a pass.
So based off of our last episode, we apparently got a lot of feedback that we don't know squat about VI.
That was basically the gist of it. Like in Slack, there was a whole bunch of conversation
about it, uh, discussion in discuss about how much we don't know about VI. So we're going to
have to have some VI homework. And everybody was quick to say like, Oh, there's not only just the,
the VIM tutorial, like here's other things that you need to like educate yourself on too. Cause
like if you're already not using nerd tree, then you, there's so much more that you need to like educate yourself on too because like if you're already not using nerd tree then you there's so much more that you got to learn and some of it was
actually kind of interesting because there was a lot of commands i was like okay yeah you know
like people in slack for example would share something like yeah okay i knew that one uh
but then there was a whole bunch of other like more than that you know that i was like i guess
what i'm trying to say is like more often than not, I was like, oh, oh, oh.
There's so many crazy things.
I mean, Allah had even shared, this has been a couple years ago,
I think he and I had both watched this React course,
and everything the dude did in the React course was VI.
And it was like, how did he just do that?
And I mean, it's just people that know vi inside
and out they look like wizards inside editors yeah so that's our homework and i understand
i thought like you know i might give you a chance to put you on the spot here because you love that
uh but you know i understand that you've just recently changed your key bindings to vi
man which editor is this first?
So it screwed me up.
It was IntelliJ.
Okay, IntelliJ.
And when I installed it, like one of the installation features was, hey, do you want to install the VI plug-in?
And I was like, yeah, sure, why not?
Not thinking about it.
And I forgot about it.
I installed IntelliJ, and I didn't use it for like two days.
And then when I went to use it, I was on a screen share with somebody and I was just
trying to do a find on the page, which is typically control F, right?
And I'm doing that and it's like doing garbage to my page.
And I'm like, what is wrong with my keyboard?
I've seriously lost my mind.
It wasn't until like three or four hours later that
I was like, oh, let me type in slash and then type in the word. And sure enough, it went to it. And
I was like, it's the V. I turned it off. I turned it off. Yeah. I was, okay. I was curious where
you landed on that because I remember, I mean, it's probably been like, I don't know, seven years
now, at least, you know, probably somewhere in that range.
Because you could do the same thing with Visual Studio.
And, you know, there was a time where I was like, oh, you know, let's give this a go, right?
Let's see how I like this.
Because, you know, like I said, I consider myself pretty proficient, at least in like getting around in VI.
Now, like, I know there's a bunch of other things that you can do with it that I don't know how to do.
Like when it comes to like using it as an IDE, right?
Right.
Like that's where things start to fall short for me.
Using it as a text editor, like I can do, right?
Yep.
And so, you know, my experience with it in Visual Studio was similar to yours in IntelliJ.
It was like, okay, yeah, I can get around with this.
But I was so used to doing things the Visual Studio way.
You invest time learning those key bindings, right?
And then when they're not there anymore, you're like, ah, but why am I trying to make this other thing act like another thing?
It was short-lived for me too i might actually try it at some point it really for me it depends
on do i plan on living in a linux world quite a bit and if i ever do find myself to where i'm back
in linux a lot having to do a lot of things in vi there i will probably force the pain on myself
because it will make me way more
efficient in both.
Oh yeah.
But it was one of those things like,
Oh,
I don't need it right now.
And,
and I'm already frustrated just trying to do a control F cause I keep
forgetting that I did it.
And it was like,
I'm done.
I'm done right now.
Yeah.
So I definitely want to like go over some more of the homework that people
shared.
I like it.
You know, we also got a lot of really good shares for people's bins, like their paths, basically.
Oh, really?
I missed these.
Yeah, yeah.
I got some.
I forget what it was, like email or Slack.
But yeah, people would share kind of what utilities they had kind of in common between different computers or for their work computers.
And there's a lot of really good stuff.
It's like, oh, yeah, I should probably script some of this stuff too there's some of
the commands i just never remember like scp whenever i need to copy files from one computer
or another i just dread it because it's annoying to kind of type that stuff you know if i just made
myself a little helper function like my life would be so much better like even just having the server
names in there so i don't have to remember you know especially if they got funky names would
make my life just so much easier. Make PowerShell scripts.
I'm trying to remember which episode that was that we were talking about the,
the Ben,
was that one Oh eight or one Oh nine?
It's been a few back.
Yeah.
Cause I remember when you said that,
I was like,
Oh,
that's interesting.
I never even thought about it.
And since you said that I've actually been doing it.
Like I actually now have a folder that I put my like Ben type things in and I
add them to my path.
All right.
Now we're talking. This is where it gets interesting. Cause, cause people were putting it and I add them to my path. All right. Now we're talking.
This is where it gets interesting.
Cause,
cause people were putting it,
I believe it was in discuss and that's why I was asking about the episode
number.
But now I got to know like,
what are some of these cool scripts?
I'm not doing scripts as much as I'm doing things like,
uh,
uh,
like I added commander.
Um,
I've,
Oh,
okay.
So you're just putting things that you already use into it.
Like, like for example, like code, right. You know? Okay. Yeah. um i've oh okay so you're just putting things that you already use into it like
like for example like code right you know okay yeah then once i saw we're um more kind of just
specific to like certain tasks that are often done with people like say cleaning up a json
file or something or things that you might have rejects for like there's things i've done in
rejects i've done several times for like just formatting files or something like why not just
have a little one-liner for that?
Yeah, I can't find it to go over.
Because there were a bunch of them that other people had shared,
and there were some really cool ones.
And now I can't remember which episode it was to find it.
But yeah, there's some good stuff in there.
I'll have to go look, too.
All right. Well, if you do create some of your own custom scripts, Alan,
I want to find out what are some of the cool things that you guys are using it for.
All right.
And if you paste yours into Discussing, you have a chance of winning a book there you go oh are we doing
that on this episode all right sounds good i need to pick winner for last one then when he says
discuss that basically means if you go to codingblocks.net slash episode 112 and you leave
a comment there then you can win your own copy of the pragmatic programmer, digital or print form.
You know, and I got like a request that I want to make too.
Okay.
Like if you, if you aren't already part of our Slack, uh, how about you join only because
I need a favor from you.
So you can go to www.codingbox.net slash Slack, but here's the, so that's the boring part.
Join our Slack. There's a bunch of great people there. Yeah, yeah, yeah, yeah. You here's the, so that's the boring part. Join our slack.
There's a bunch of great people there.
Yeah, yeah, yeah, yeah.
You've heard it all before.
Here's the request.
With a yada, yada, yada over the best parts.
I get it.
But you need to join the pet channel,
the pet pictures channel,
because if you've seen the pictures that show up as
the hero images for the episodes, like I've been doing it like for, I don't know, half
a year now.
Yeah.
I'm picking pictures out of pet pictures.
So if you, there's a good chance if you share a picture of your pet there, that picture
might get pulled for a future episode and uh you know
i i the whale might be running a little dry and i need to pull some new ones so
uh definitely and and you know what like i love i love the puppies but if you got some kittens
those are great too we didn't have to be a dog every time but but have you seen catches uh half
a sleep under bite like that's gonna have to make an episode here pretty soon.
Okay, wait a minute.
Was that one just shared?
Yeah, it's within the last five or six.
You got to see that one.
It's pretty amazing.
He's got some cool goats too though.
Yeah, if you want some awesome, awesome.
Wait, Ketch?
Yeah, Ketch.
K-E-T-C.
K-E-T-T-C.
Oh, that is. Okay, never mind. Yeah. Yeah, catch, K-E-T-C, K-E-T-T-C-H-T.
Oh, that is, okay, never mind.
Yeah.
I have it turned on to where I see the names, not the.
Oh, I can't do all that.
I don't even know who these people are anymore.
Oh, that's Devin.
Yeah.
So, yeah, if you look at his, it's pretty.
Where is this, under by picture?
All right, fine.
I'll have to look for that offline.
Yeah.
So, anyways, definitely.
Oh, yes, I saw that one.
It's beautiful, right?
You'll be found next episode. Thanks, Ketch.
So I guess jumping into this episode, we're going to start off by talking about text manipulation.
And Joe, I'm going to let you do this first one because I think you purposely messed this up and it hurt my brain.
Yeah, I just can't seem to read it or say it right anymore.
Pragmatic
programmers manipulate text the same
way woodworkers
shape wood.
That's a direct quote from
the book there.
I feel like I do a lot of text
manipulation. I don't know how
direct quote it was.
I'm pretty sure they didn't say par gamers.
Yeah.
Par gamers.
Oh, that's how I read it in my head.
That's what it sounds like in here.
It's terrifying.
So yeah, they say the text manipulation languages are like routers are noisy, messy, brutish.
Um, and that's kind of true, right?
Yeah, I don't really use
text manipulation languages anymore.
It was funny. They mentioned a couple and they did have
Ruby in there and Python. I kind of
think of those as just being kind of general purpose
languages. It reminded me, back when I first
heard about Python, I remember seeing
in a Barnes & Noble or something,
a bookstore, I got the book off the shelf.
It was like, Python?
It's a snake.
That sounds cool.
And it kind of flipped through.
And one of the first lines that described it is a string processing language.
And I was like, well, that sucks.
I don't want to process strings and put the book back down.
And man, if I had bought that book, my life might have been different.
Better or worse?
Much better.
Python's a king right now, which crazy because javascript is raining so high but somehow like python keeps either edging it out or being right there next to it
and like it's there's such different spaces and such such different ways of working and different
kinds of problems that you solve with both those languages i just think it's interesting that
they're both like so neck and neck python's gonna take it over it might eventually it might yeah
so i mean i'm surprised there's like a granddaddy language in here for text manipulation Python's going to take it over. It might eventually. It might, yeah.
So, I mean, I'm surprised.
There's like a granddaddy language in here for text manipulation that you haven't mentioned yet.
I don't mention that. I'm a little bit hurt.
This should not be named.
Which one?
The one we don't talk about?
Yeah.
See, it rhymes with Merle.
If I said codingblocks..pl would that help you uh
pearl yeah i just i you know i i don't like pearl but it's because i don't know it because i
maybe i'm not smart enough but every time i see it just looks like uh somebody uh specter face
on the keyboard to me it's got different operators that i'm used to it's got a lot of
symbols going on so i've always had a hard time whenever I've had to maintain somebody else's script.
There's a super hilarious, or to me, because if you ever have read or written any serious amount of Perl, you will appreciate this quote, and I got to read it. So with Perl,
you can manipulate text, interact with programs, talk over networks, drive web pages, perform arbitrary precision algorithmic,
or I'm sorry, precision arithmetic.
And then here comes the hilarious part.
And write programs that look like Snoopy swearing.
And that is pretty much Perl in a nutshell.
Do you remember what people claimed it stood for?
No.
No one?
This is why I was surprised you didn't say it.
Practical extraction in reporting language.
Wow.
Is it really?
Well, it's a backronym.
Oh, okay.
Yeah, like it's one of those cases where somebody like tries to fit something into the word, right?
Yeah. Yeah, I guess i'm with you joe i sort of feel like most of these things are just general purpose languages
now right like they're not they're not text manipulation languages so maybe you know when
it first came out like um there were some things that like pearl and python did um like allowing
multi multi-line strings that were uncommon in most languages.
Like you either had to do like the plus thing
or the slash thing
in order to just have multi-line strings,
which has been a real pain.
And JavaScript only fixed that recently
when it added the whole backtick kind of thing.
So, I mean, it was nice to be able to use these languages.
They also mentioned sednock,
which is something I've used a few times
and not had great experiences with it.
But that I think really just has more to do with the types of
problems I was trying to solve and it's just
annoying when you would have to get
some strings from one program and kind of pipe
it into another. It's not necessarily fun working
especially with, I've had some experience
with PowerShell
which is kind of
if you're not familiar with it, it's like.NET, Microsoft's
kind of version of like a bashy kind
of scripting language.
But it does everything via objects rather than strings.
So if you get the output of one of its commands, it's going to have these dot properties and auto-completion that you can use.
So knowing about that and then going over to bash and trying to like pull stuff out of like, you know, whatever weird table formatting the program you're pulling data from uh came up with is that was pretty annoying
to me well was it awk and i don't i've never actually used awk myself wasn't it like grep
on steroids yes i always thought of like set is for finding and awk for uh replacing i know it's
not that simple but that's kind of always like how i kind of thought of things okay
yeah that's that's kind of interesting. I mean, like I've definitely
gotten to where at least grep for, I don't know if it's text manipulation as much as it's
text finding, like, you know, getting patterns like, well, there's a lot of power to these
things, right? Like one of the things, an interesting one that recently I ended up doing
was I was having to grep some logs, right? And typically when you think about grabbing logs,
you're looking for an error. Well, the problem is like you find an error, but the actual error
isn't until like five lines after the word error showed up. And there's like switches for that kind
of stuff to say, Hey, give me everything, you know, that were all the way up to 10 lines past where you found this word.
Right.
So, like, I don't know.
Does that all fall into text manipulation or is that just, you know, searching strings?
Yeah, I would think so.
I would definitely consider that.
And, you know, I think, you know, the more languages kind of added better support for doing things with strings.
And so I don't really I wouldn't shy away from using c-sharp even for a small app yeah you know maybe that's just because i'm familiar with it but i
don't really mind doing that sort of thing for string manipulation but my first stop would
probably be like a bash a python or a powershell if it's just something little no no because i
mean you're not going to like spin up a c-sharp application, you know, take the output from one and, you know, reformat
it. But I do have to make a correction here. Cause when you were talking about the sudden
thing, like I couldn't remember exactly. So I had to look it up and you had them backwards.
Auck was for the, uh, defining the search pattern of what you're gonna look for, but said,
you think, uh, think of that as stream editor. So it's going to do the editing. Oh, okay. Yeah. I know I had more like kind of
programming language, like ifs and stuff. Uh, it's been a long, it's been like eight or nine
years or something. So I've used either one. I think, yeah, I do want to go back to the C sharp
and you would use it if you're using link pad. If you remember, right? Like one of my previous tips
was you can absolutely write C sharp and LinkPad to do stuff to manipulate strings.
I actually did it for an XML file.
So you're not going to write a program probably to do it.
But I mean you did write a program for it.
I mean the difference here though is like the type of text manipulation that they're talking about is like you could just spin up something arbitrarily on a command line.
Like you don't have to install something.
Like you're talking about using a UI to have to do it for you, right?
But you have to install Perl or Python or any of those type things.
Yeah, but if you're on any kind of Unix type environment,
chances are extremely high that you already have some flavor of those tools.
And then if you go back a step and you go back to the tools like SED and AUC,
those are built in.
For sure.
Okay, that's fair enough.
And you can pipe from one to the next.
So when we talk about text manipulation,
if you have to spin up a UI to do it,
then I'm going to picture the fail from families.
You're talking about CLI-ing this, basically.
Okay.
Fair enough.
All the languages they mentioned all have REPLs, which I just looked up what that looks good for.
It's read, evaluate, print, loop.
So you basically could type in Perl or Python, and it's going to give you a little prompt where you can just kind of type in code and it'll execute line by line.
So I wonder if they would have included JavaScript in there.
And now with node,
right?
Yeah.
Why not?
Now,
if you,
if C sharp,
if there was a.net REPL,
then yes,
I would include that.
I bet there is.
I bet there is.
There actually is nowadays.
There is a C sharp REPL.
I believe I saw Hanselman show it at some point.
Really?
Cause I was going to say that the closest that I would be able to think of to that would
be PowerShell because in PowerShell you can use objects just like you can in like all
the same namespaces that you can use in C sharp, you can use on the command line with
PowerShell.
So that would be the closest thing to it that I was thinking of.
But if there's something more, you know, like where you're writing more C-sharp like code, then that would be cool, too.
Yeah, I definitely saw it.
If I can find it, I'll put it in the show notes.
But he definitely showed us something at some point.
And I just don't remember what it is.
So, cool.
So what do we got up here?
So tip number 28, learn a text manipulation language.
Chances are, as we just described, you probably already have because they all kind of do it now.
Oh, and I don't know if we made this point too, but like, you know, you're talking about how messy it is, but you can like use these to shape the data.
But like if you master these tools, you can have like an impressive amount of finesse with how you reshape this
data.
Right.
Yeah.
There's no doubt.
I've seen times where people have just done like an awkward pattern to like
kind of format some data.
And like,
you just think like if you're watching on a screenshot or something,
you're like,
Oh,
why can't you just go to just do a rejects or just do a little,
you know,
program or something.
So it definitely could save you a lot of time if that stuff is a good skill that you've got a strong basis in,
so you can do that stuff without really thinking about it.
You can take in something like a database script or something.
You could take an Excel file, for example, and generate an insert from it.
Or maybe vice versa.
You take a big insert or a dump from a SQL table and convert it into something that's formatted nicer.
I'm forever taking, I'll do like, you know,
select top one star from something, a table,
and then copying the columns that come out
and then doing a little kind of regex on them
in order to generate a class or generate something little.
Oh, so check this out.
I did find it, by the way.
It was a Hanselman thing,
and it's actually called.NET Script.
So if you have.NET Core installed and you do a.NET tool install dash G.NET dash script,
and then if you just run.NET and then space script,
then you basically have a scriptable REPL that you can do.
And I'll put the link in the show notes.
But there's totally
something that you can do there now, which is
pretty cool.
Hold on. I'm putting it here.
Well, we learn something new every day.
And that we should have learned back in October
of last year. Right. It was
in October 2018. Thank you, Mr. Hanselman.
Yep. Hey, it's in the show notes if you're
looking for that link. Yep, definitely. Yeah, I mean,. Yep. Hey, it's in the show notes if you're looking for that link.
Yep, definitely.
All right.
Yeah, I mean, I'm with you, Joe. I remember forever and a day.
You know how sometimes when you would go back and forth,
would take files back and forth between Windows and Unix environments,
it wasn't uncommon that you'd get to control them characters?
Oh, wait. back in the day that
happens today constantly okay so so i used to i don't remember it off the top of my head anymore
but i used to know this one liner for pearl and it was so amazing because it would it was a you're
passing in a regular expression that would find all the control limbs replace them with nothing
but it would write the output it would would save the original as a.back
and then write the original,
write the new file to whatever the original
file name was, right? And it was a one-liner
that you could burn through a whole directory.
Just point it to a directory and it would glob
it and boom, or gone, or whatever.
Or you could pass in the glob
whatever you wanted to use.
Now I don't remember it, and there have been a couple
times where I've tried to remember, like, what what did i do again how exactly did i do that i think those
are the commands i've looked up for for bash and for dos in order to just do something like to
convert either from a you know utf something crazy to ancy or whatever or um to get rid of those m's
like it'll be something i'm doing in docker like i'll generate a file or copy a config out of docker
in order to modify it and map it back in.
So I'll kind of cat it out of there.
And it'll come in the wackiest format.
I'll have to do some sort of weird thing to kind of get it knocked into shape.
But that's been frustrating.
And, like, I keep running into it.
So it's this problem that I used to have 10 years ago that went away for 10 years.
And now all of a sudden, like, the slash M's are back.
Yeah, and Skype is awful about it i think yeah slack is decent but yeah skype man for whatever reason that thing
jacks up all kinds of code that gets pasted in yeah i have a lot of copy paste problems just on
my phone too i'll try to copy something like someone's name from twitter or something like
i go to paste an email or whatever and just nope. The weirdest one for me here lately since you mentioned Skype.
You didn't mention Skype, did you?
I did.
I thought so.
Okay.
It's been with DataGrip where if someone's like, oh, hey, try this query, and then you copy it into DataGrip and DataGrip's like, no, these spaces, I don't know what these spaces are, but they're garbage.
And you're like, oh, come on.
So frustrating.
Guys, what are you doing, man? Yeah. As soon as, as
soon as paste and run become a problem, then it's like, I'm just going to start typing stuff in
again. Cause I don't want to deal with this. Yeah. Everyone. So I want to say one last thing,
like, you know, unless you're driving, you should keep two hands on the wheel, but you should raise
your hand right now, wherever you are in the world. if you've ever used SQL to generate some sort of code.
Oh, absolutely.
Yeah.
Kidding me?
Raise my hand.
Right.
Yeah, it's easy to do some sort of metaprogram where you select the columns up like sysinfo.columns
and you kind of generate some getters and setters or something like if you're working with Java
or do something else.
Or I've done plenty of generating SQL from SQL or generating insert statements or whatever.
Yep.
I feel like that's given a head,
but you know,
I mean,
when we talk about text manipulation,
this is definitely the type of text,
you know,
manipulation that I,
that I was thinking of,
uh,
you know,
as we go through it,
like just some random piece of text and I need to like put it in another
ship.
And it could be something like as simple as like,
I'm going to do a directory listing and where I'm at, but all I want to do is transform that into the name of the files, but remove the extensions or something like that, right?
It doesn't necessarily have to be crazy, but, you know.
Right.
Being able to script those things is super powerful.
Oh, yeah. I mean, of course, now the examples that they start going over are way different than anything I just said.
Like you mentioned the database examples or creating accessors through SQL, right?
But, yeah, I'm not writing a book with it like they were.
That's absolutely crazy.
We mentioned test, or we didn't mention yet, test data generation.
I've done that a few times.
That's more like kind of moving stuff in and out of CSV or Excel files and generating kind of test data that you want to use
or like throwing that stuff into a database.
Definitely done that quite a few times.
Converting languages.
Yeah, I saw that, and i can't imagine doing that unless language is really similar but they mentioned going from c
to uh to object pascal i don't know any about object pascal but it still sounded like a rough
job but it's probably a lot better than doing it by hand it's man they'd have to be similar like
you said otherwise you're going to need a more full-blown language, I think, to try and do the conversions like types and all that kind of stuff.
But I think also back then, things were probably way more similar than they are now, right?
I may be wrong, but...
Well, I don't know.
I mean, do you remember Pascal?
I don't remember it being that close to C.
I mean, it's been a minute since I've done any Pascal.
I'm not going to lie to you.
Yeah.
And, you know, even more so for Object Pascal because I did less of that.
But, geez.
Yeah, I just don't see that as being – I don't know.
I don't think that I would see a text manipulator being the thing that I'd be doing that with.
Well, I mean, it's awesome that they did, but it almost feels like at that point you're writing
your own compiler. Like I'm with you. Like I wouldn't have thought to do that, but I guess
at the same time, like if you were stuck, if you're like, Hey, we absolutely got to move off
of this, you know, then you would. And it, and what if, by the way, what if it wasn't even that
extreme? What if you were like, you know, uh, we're on angular and we want to move to react or what if you're on angular one
and you decide you want to go to angular two, which is angular seven, which is just called
angular. That ain't going to help you. You know what I'm saying? Like, but, but yeah, you know,
if you're converting language, like I was like, Oh, okay, well. That seems like a bigger job to chew on than what a text manipulation would do.
But whatever.
I mean, I'm sure there are some cases where it would work out.
I'm sorry, Joe.
No, no, no.
Go ahead.
I was going to say, it might get you the 90% or the 80%, right?
That's possible.
You might be able to get a large swath of it.
Just go ahead and convert it over.
And now you're going after those edge cases or certain paths or whatever, right?
Yeah.
Maybe.
The generating documentation I thought was a good one, right?
Like if you have code and you want to extract out comments or things like that,
that one actually makes a lot of sense to me.
Yeah, you know, I want to mention too, if you think about transpilers,
that's kind of exactly what they're doing.
Something like Babel, that's taking your ES6 or your TypeScript or something and converting it to JavaScript.
Like, it's kind of crazy to me because I'm so used to dealing with compiled languages and stuff.
But really what it's doing is it's taking strings in and putting strings out.
Yeah, that's a great point.
Yeah, I didn't think about that.
And generating the documentation, I mean, I've definitely been in situations where, you that summary XML documentation and then spit it back out in like a markdown form.
Yep.
Or Java docs or any of that kind of stuff, right?
Like I wouldn't be surprised if it's doing something similar.
Yeah, so we got a list of exercises here.
One thing they mentioned is taking in a list of field names and generating a.h file for if you've never
worked with a C or C++. It's basically
a header file that kind of defines
all your function names so the other
code knows how to link to it without having
to dig through the actual
files, right? Is that a good description of
a.h file? It's been
even longer since I've done anything with a.h file.
The header file has the definition
but not the implementation.
Yeah, and then
they give a more modern example.
You kind of take a list of fields and
generating a bootstrap form.
I wrote that. I literally mean
the bootstrap CSS kind of speed.
So that's something I constantly have to look
up. Bootstrap, how do you do forms
again? Because there's like eight different
levels of nesting to generate like a text input or something.
So I always have to look that up.
It would be nice if I could just kind of have a little program.
I could take a simple list of things, you know, comma separated list and just generate or scaffold out a form for me that I could use.
Now, okay, so you've blurred the lines again.
And not to your fault, though, because the authors have definitely done this.
But there's a lot of blurring here between this section and the next, which is code generators.
And it's like, well, where do you draw the line?
Like, where is it text manipulation versus where is it a code generator?
Right.
It's a spectrum.
And I think it really is a super blurred line.
At least in the examples that they're giving, it absolutely is.
Some of these examples, it absolutely is.
But you know what?
I think this is where you might actually be able to draw the line.
So what you just said maybe would not fit text manipulation because you're actually writing code, right?
Well, it's a one-off.
But no, but if you're writing documentation, sure, right?
Like that's not code.
That's not something that's going to be executed, right?
So if you're generating some HTML,
it's probably going to be executed
if you're generating JavaScript.
So I think that's where that blurred line's drawn
is just what are you...
Really, they're kind of the same thing, what you're doing.
It's just how they get used on the other side of it, maybe.
It's funny that you mentioned HTML, though, because I'm pretty certain that that was one of the cases for the code generator that they were talking about.
It could be HTML.
Right, that's what I'm saying.
It's executed, so it'd be code.
I thought you were saying that it wouldn't be.
No, it would be code.
So you're saying that HTML is a programming language.
I think that's what we just heard.
You heard it here, folks.
Alan said it.
The coding blocks,
codingblocks.net,
breaking news.
That's it.
I quit.
Yeah, HTML was listed.
You know,
HTML5 just came out.
Okay, never mind.
That was a joke.
We're on four.
Yeah, I mean,
like even their examples of converting languages right like that's really we're talking about a code generator that's a generator right so yeah so so i guess
what we're saying then really is just if you were to create a code generator it's nothing more than
text manipulation but then that goes back to Alan's
original thing where you're spinning up link pad, because now we're not talking about like,
you know, command line type of things, right? With a REPL or something like that, right?
If you have to use an editor, an IDE to create the thing that's going to run against the other text.
It's probably gone too far.
Well, at least in my original thinking, like I wasn't counting that as text manipulation.
If you have to, if you have to use an IDE to write the code, that's then going to manipulate
some other text.
That's not text manipulation in my mind.
That's just, you know, some application you wrote.
Right.
Something like regex is text manipulation with back references and that kind of stuff.
If you can just do it in a command, then it's done.
If you can do it, like regular expressions count if you're talking about doing it on a command line.
Right.
You know, with like a find or if you're talking about using like a Perl or something like that.
Right.
Or any kind of REPL, let's say.
Yep.
Yeah.
This episode is sponsored by Clubhouse.
Clubhouse is the first project management platform for software development that brings everyone together so that teams can focus on what matters, creating products their customers love.
While designed to be developer first, the UI is simple and intuitive enough for all teams to enjoy using.
And Clubhouse is truly built for developers by developers. And one of the ways that you can tell is because they've sprinkled Git tips throughout the UI.
And they make a big point to highlight open source projects that integrate with them.
And they're constantly adding new features.
I mean, just in quarter two of this year alone, they've added multiple features and enhancements, including iterations, a new Android app, search enhancements, updated Sentry integration, marker IO integration, sidebar customizations, and Google Auth.
And Clubhouse recently launched the Clubhouse community,
where you can connect with other software engineers and project managers using Clubhouse.
Yeah, with a simple API and a robust set of integrations, Clubhouse also seamlessly integrates with the tools you already use every day,
like Slack or GitHub, for example.
Slap is my favorite.
That's right.
And it gets out of your way so you can focus on delivering quality software on time.
You can sign up for two free months of Clubhouse by visiting clubhouse.io slash coding blocks. Again, that was clubhouse.io slash coding blocks to get your two free months
and see what companies like Elastic, Full Story, and LaunchDarkly love Clubhouse.
All right. So we're at that portion of the show where we'd like to ask you to,
hey, do us a favor. Whatever your method of choice for listening to this show is, go to that source and like either give us a thumbs up, a like, a plus, you know, leave us a review there.
Whatever that system allows for, we would greatly appreciate it.
You know, it helps people to discover us.
It helps us to grow the show.
That growth and that feedback then just further encourages us to keep doing it.
It really means a lot to us.
I can't,
you hear a say about how it puts a smile on our face and you might think that,
you know,
we're not being honest,
but we completely are.
Everyone,
we,
we constantly are sharing them back and forth.
Like,
Oh my God,
did you see this one?
This is great.
They're,
they're,
they're really awesome.
They really mean a lot to us.
Um,
so it would really mean the world to us if you, if you haven't already, if you took the time to do that.
And with that, we will head into my favorite portion of the show.
Survey says, all right. So, uh, a few episodes back one zero9, we asked, how much data, wait, I misspelled that.
How much data do you use per month for your home ISP?
Maybe that was a weird way of wording that, but yeah.
How much do you use for your ISP at home?
Yeah, whatever.
All right.
You got the idea.
You're with it.
All right. So got the idea. You're with it. All right.
So here are your choices.
Less than 250 gig.
Less than 500 gig.
Less than one terabyte.
Or no idea.
Unlimited plan, bro.
Or you'd have to ask my neighbor.
All right.
So I think Joe went first last time.
So I'm going to let Alan go first this time.
Man, this one's tough.
What's your choice and by what percentage?
So I totally want it to be the last one, but it's not going to be.
You don't think so?
That one's amazing.
All right.
I'm going to go with – I don't think most people probably pay that much attention to it.
I'm going to go with less than 500 gig, and we'll go with 38%.
Okay.
538.
All right.
Joe?
Oh, gosh.
I don't know how to tell, so I am going to think that most other people don't know how to tell.
So I'm going to say no idea, Unlimited Pan, bro.
All right.
So what's your percentage?
Whatever Alan said plus one.
39.
It doesn't matter when we choose different things.
It really doesn't.
Well, I thought you said 30.
I said 38.
Oh, did you?
Okay.
He's going to say 39.
Just to be.
He should have gone with $1.
Just why, Alan?
Just why?
That's right.
That's why.
So Alan with less than 500 at 38% of the vote and Joe with no idea, man.
Unlimited plan, bro.
I did it right, right?
You did.
With 39% of the vote.
And survey says.
We're both wrong.
Joe is our winner.
Really?
Yep.
Dude.
No idea.
And that is a 61%. Wow.
Very nice.
Yeah. How much money was. Very nice. Yeah.
Yeah.
I really don't know how to tell.
Yeah.
Unfortunately.
How do you tell?
Do you like log in?
Yeah.
If you have like,
if you're on Comcast or Xfinity,
you log in and there's actually a devices tab.
And the thing that shows up on devices more than likely is your cable modem.
If you look at that,
it'll actually show you how much study you've done over the past month or whatever at least with with comcast
yeah i got the picture and i don't know how to tell i thought it was also part of the
plan name or at least that's what i remembered was it not not on not on mine oh well i believe
it is with at&t i think it's just part of your plan name.
Like it's kind of in your face. How much? No, no, no, no. But how much have you used?
So I have a terabyte cap. Okay. But I mean like if it's unknown. Okay. Right. The cap. Sorry.
Yeah. Yeah. But we didn't talk about like, what was your cap? We said, how much do you use?
Right. That's what I'm saying. That's where you'd see it. You go into your devices and it'll show
you how much you used. It'll also tell you how much your cap is, but that's how much do you use? Right. That's what I'm saying. That's where you'd see it. You go into your devices and it'll show you how much you used.
It'll also tell you how much your cap is, but that's how much you use.
Okay.
I guess where I'm thinking about this though, is that, uh, if you have unlimited, you're
not, you're not gonna, you're not looking for that.
So, uh, yeah.
Okay.
Yeah.
I gotta pay an extra 50 bucks a
month for unlimited online which i don't like right because because because like mine when
you log in it shows you like what you've used but it's like of unlimited right yeah so all right i
can't even figure out how to see my bill they're doing it right yeah well the spectrum bought the company bought the company Bright House that had run ours for years.
And so now it's like depending on which one you log into, they're like, no, you got to go to the other one to see your plan.
I give up.
That's awesome.
So they probably don't even know what you're getting.
So that's good.
Well, you could just go to speedtest.net.
Yeah.
And you'll probably only figure out like 10% of what you actually get.
That's awesome.
All right.
So for today's survey, we ask, hey, what native language are you most interested in?
And your choices are Rust, because safety first, or go, because I want to be fast and parallel, or C, the old ways are best, or C++, the good parts.
Now, some might argue with that, though, by the way.
Like, before we go too much further, some might argue with that.
All comments can be written to comments at CodingBlocks.
Your next choice is, no thanks, I have deadlines.
And lastly, you forgot mine, you expletives.
All right.
Yeah, how did Swift not make the cut here?
Well, it's not necessarily every language.
Like, you know, it's just like, hey, here's some.
Are you interested in these?
If you aren't, then, you know, maybe you have deadlines and you can't even think about it.
That's fair.
And I don't know if you've heard, but C is a brand new language that just came out.
And it's an abstraction layer.
It's actually called WebAssembly.
Wait, no. C
is what I said.
It got me started thinking when I did a
presentation about C Sharp to JavaScript developers.
I kind of thought, if you
only learn one language, of course it should be JavaScript.
If you only learn two,
then C Sharp's not a bad choice because it's compiled
and it runs on the server and
it's good at some things.
Really, in a perfect world,
you kind of would have
a bunch of different languages kind of in your pocket
that you can pull out. So if you need string manipulation,
you could pull out Python. If you need browser,
of course, or a lot of stuff,
JavaScript. If you need
enterprise-y stuff, you could pull out something like a C Sharp or a Java.
Or if you want something functional,
you could pull out, I don't know, Erlang or Haskell or something.
But I think it'd just be nice to kind of have one language
you feel comfortable with in kind of each category.
So I thought it'd be cool to do a survey that's kind of like,
in this kind of niche that people are talking about more lately
than they were in past years of kind of
native programming like what language would you go for i'm gonna reword that uh because because
as you were saying i was like i i i like where you're going i like where this is going but i
think that they should be reworded it reworded as what is the language you would recommend someone learn second?
Oh, yeah, I like that.
That's funny.
But it wouldn't be any of these for me.
What would it be?
None of those.
I would say C Sharp or Java.
I think we can all agree we've recommended,
if you only had to learn one,
if you're going to learn your first one,
that JavaScript is, that one's not going anywhere in the immediate future and it can take
you to a lot of different jobs a lot of good jobs my next one would be python so number two you
would pick python yeah only because there's a lot of things headed towards machine learning and that
seems to be the language du jour there and it it's also used for everything, kind of like JavaScript.
Yeah, you could definitely write a web application if you wanted to.
Yep.
And then my third would be either C Sharp Java.
Like, I mean, you could basically swap those in and out.
So, I mean, yeah, I have a handful of ones that I would go to
before any of the ones on this list.
Yeah, and, you know, I always struggle with Python
because I really like the language. Like, the few times I always struggle with Python because I really like the language
and the few times I've played with it, it's always gone
really well. But I just have never figured
out where to kind of fit it into my arsenal.
I definitely need JavaScript in there.
I like C Sharp.
When it goes to kind of having
a third language, I do feel like I want
something kind of native.
For me, Python's always kind of sit
at position number four for me, Python's always kind of sit, it's sat at like
position number four for me, which is pretty far down that list. I know it's great for machine
learning. I know it's really popular and there's lots of good reasons to learn it. It just, I,
I've always wanted to have like those other kind of three things stacked ahead of it.
You know, for me, I think the only reason why I've never taken the time to learn Python
is because it's very similar to JavaScript and C sharp.
Yeah.
And it meaning the kind of stuff that I can do with it.
And so I'm already comfortable with C sharp.
So if I want to spin up a web project, I can do it.
And for me, a big portion of it is how good the IDE is already.
Right.
Like Joe and I have been living in a Java world here lately.
And it's kind of frustrating because there's just too many open decisions. I'm not going to hate on Java. Like
I can do. Oh, this episode, you're not going to? Not on this episode. I might hate on it later.
I don't know. But that's part of it for me too, right? Like I'm not familiar with the Python
tools. So for me to invest in Python means that I'm also going to be investing in learning in IDE,
the tooling,
all that kind of,
and so,
yeah,
that's the only reason I haven't done it.
I have a huge interest in it,
but I've just never gone that path.
I mean,
in recent years,
I've definitely spent some time,
you know,
investing in Python,
right?
And your IDE conversation,
by the way,
doesn't have to go any further than visual studio code.
Uh,
that's true.
You know,
I mean,
you don't,
you don't,
you can use visual studio code to debug your Python just fine.
Okay.
Um,
but,
hmm,
I mean,
would I call it the language number two?
I mean,
what's your,
what's your number one?
Well,
I think I thought we are agreed on JavaScript for number one.
Okay.
So what's your number two? So that's what I'm saying. Like agreed on JavaScript for number one. Okay, so what's your number two?
So that's what I'm saying.
Like, would Python be my number two that I would recommend?
Like, to somebody who's new, right?
Right.
They're learning their second language.
Which one do you recommend?
And, you know, if they weren't interested in data science type of conversations or topics and whatnot.
I don't know that, I mean, Python is extremely popular.
It's extremely powerful.
So yeah, maybe, I mean, it definitely has that going for it.
And its ability to be used on multiple platforms is an advantage.
But should popularity alone be the reason why I pick it?
Because that's kind of the reason why we're picking JavaScript if we're being fair.
Well, it's not just popularity.
It's also ubiquity, right?
Like the fact that if you want to write a web app, you can.
If you want to write a server-side app, you can.
But that all goes with popularity though, right?
Which is Python too, right? And that's kind of the thing is Python, you want to write a web app?
You got Django.
You have all these big frameworks out there. you want to write a web app you got django you have all these big
frameworks out there you want to do machine learning it's like the the choice du jour right
like it has a ton going for it and so that's it's just the the fact that no matter what you want to
do you can do it with it and that's that's sort of it for me i mean i think python's great don't
get me wrong and i don't even know that it's great because i've never tried it but hmm i mean i i almost don't want to pick it though
because like and i really kind of not to bash on any other language but might want to kick myself
because there's another language that if you did pick it as your second,
then you would have a lot of capabilities for like,
you know,
a serverless or things like that,
like,
or other technology only because it's due to its popularity.
It,
it's used everywhere,
which is Java.
I kind of hate to say it,
but Java.
Yeah, that's why for me,
like C Sharp and Java
are kind of both in that similar.
I'm not making that distinction, man.
I'm not lumping C Sharp in there.
I'm saying Java.
I'm saying like,
if you were talking to a college student
and they were like,
I've learned JavaScript.
It's amazing.
What's the next thing I could take?
How can I take my career to the next level?
Even though Java, you could maybe argue like when you look at, okay, this is going to be
offensive.
But if you look at it from just a pure numbers thing, it's not like Python's definitely
gaining traction and Java isn't as like it once
was. Right. But the fact that like, I know you're working in, uh, Kafka, right. And you have to use
Java if you want to extend it. Um, the three of us have definitely worked with, uh, AWS APIs.
And I can recall like, you know, some of those APIs that, that Amazon web services would come
out. Java was the first thing that they released the API for.
And the only thing.
Everything else was an afterthought.
Right.
If you were lucky that they produced it.
And that's why I'm thinking like, okay, if you stayed in that bytecode world, right?
And the way I said that, bytecode world, then maybe like, you know, you could do a Kotlin or a Scala or Java, right?
Yeah.
Yeah.
And then you're opened up to...
Because there's a lot of great practices that are in that ecosystem, right?
It might be frustrating because they're not prescribed.
Right.
I think I would go with that, though, is the language I would recommend second, even though
it kind of pains me to say it.
Yeah, I should mention that. What we're kind of giving advice for is basically for like a generalist like someone's coming out of school we know nothing else about their career
like obviously if they want to be a front-end developer our you know we wouldn't probably be
suggesting css we'd probably be saying like you know css or dart or whatever right uh and if
someone was like only interested in ever making back-end type stuff
then maybe python would be the first choice then and maybe a second choice would be something like
go so you know all that there's a lot of variance there but i think for just like knowing nothing
about the person what they want from their life like i think that what we said is all basically
kind of solid career choices that's fair that's a very fair clarification i will say in defense
of c sharp i think one of the reasons why it's sort of interchangeable
for me, and you made super great
points about Java, right? Like the fact that
it just is sort of there
everywhere.
.NET has made
incredible strides in the past couple
years with the open source
slash cross platform thing.
Speak the truth, brother.
And
this next version of.NET is not.NET Core.
It's.NET...
Standard?
No.
You're not talking about standard.
.NET 5?
.NET 5 is what they're calling it.
But this is basically where they're trying to take,
sort of move away from.NET Framework.
.NET Core is going to be the thing,
and it's going to be the standardized runtime
that'll run on Linux, Windows, everything.
And so that's why that one sort of,
like a couple of years ago, I couldn't have said that.
I would have said, yeah, Java is probably better
for you to learn for your entire career.
But there is a lot of syntactic sugar and love
in the C Sharp world that just makes your life
as a developer
super beautiful. And, and so it's a, it's really easy to say that because it's also
something that is out in the marketplace a lot, right? So don't get me wrong. I mean,
I'm totally, I've been a fan boy of C sharp since they first like one discussed, Hey, this is the next version.
This is what our future we,
we,
we took,
we learned our lessons from NFC and decided we're not going to go that way
anymore.
Right.
Like I get that.
And,
and I C sharp will forever be my,
my favorite.
Right.
But yeah,
I think I would,
I would pick job.
So that's interesting though. We pick, we pick different ones. Uh, it was, well, kind, I think I would pick Java. So, that's interesting though. We picked
different ones. It was, well,
kind of. Joe was C Sharp slash Java.
Yeah. I'm surprised none of us
picked a functional language, to be completely
honest with you. I mean, it would be up there, but it's
probably not my second or third,
right? Yeah, and that's why I always
struggle with functional languages. Like, they look cool. I've
done a little bit of tinkering. You know, I've really
liked the experiences that I've had with it. But
just in terms of practicality and the side projects
and the kinds of things I want to, the problems I want
to solve, it's just always been better for me
to have a more general
program language. A stateful type of language,
right? Yeah.
Yeah. But I mean, I should
spend more time with C Sharp
and, or not C Sharp, F Sharp and maybe Scholar.
I really should explore more stuff in the Java ecosystem.
Because the things I don't like about Java are, you know, the variance and just different build systems and different things you have to kind of know in order to get started.
And I don't like the Java language itself.
It's just really baroque and is missing features and all that stuff.
Especially if you're working on old versions, it's rough.
But that's totally fixed by, like, a a Kotlin in particular Scala a little bit.
So I really should kind of experiment more there and I'd probably be happier,
especially when I could leverage the more general aspects of Java and still
have my kind of cool functional stuff.
Hey,
so I have one other quick question before we leave this completely.
Yeah.
Has any of you ever decided to take a look at like Q sharp,
the quantum programming language?
Is there any interest or any like, I'm curious, like when it came out, I was like, oh, that's, that's one of those things.
Like maybe if you're one of the first and you truly like, like Julie Lehrman, I'll point out like Entity Framework.
She got on that bus way back to the beginning.
And she's now sort of like when anybody hears the words Entity Frame framework, they're like, oh, Julie Lehrman knows this stuff, right?
Like what if you were one of those people for one of the quantum programming languages?
Like any interest at all?
I mean, I've looked at it a little bit.
I think it's neat.
I just – I'm not an early adopter like ever.
So I'm like more like a version three kind of person,
like driving around the 18 year old car.
I don't like, I like my technology choices
to be kind of boring.
And that's why I like, you know,
JavaScript over TypeScript or, you know,
kind of standards.
And I love that.
I think it's probably because I like to have results.
I like, I care about the results of my software projects i want them to i care more about that than i do
what i used to build it and so i've been willing to make some sacrifices there in order for like
being able to like google for problems or stack overflow or whatever so you want the
true something that you're not you're not bumping into walls every time you turn around without any
kind of answers yeah so i'll wait another couple years.
I'll go to the QSharp
talk at the convention if there is one.
I've just
seen so many things now that have sounded
so amazing and they were just gone.
They died. We were talking about one git from
Microsoft a couple, not that long ago.
Now three years ago, it sounded like
it was going to be the next big, cool, crazy
thing and it just disappears. Remember the file system that was going to be like the next big cool crazy thing and it just appeared disappears or longhorn remember the file system that was gonna be like
sequel based and super cool and like and just disappeared and never came back and so i don't
really want to dump a bunch of time into something that may not ever take off but there's definitely
value and if you take that risk and it does work out well or you learn to do really cool things
with it and there's great value to be had there well i mean if you remember i remember pretty sure it was this book right maybe earlier in the book where they were talking about you
should learn one new language a year yeah that's ridiculous i think that was this book right yeah
so you know maybe that's uh maybe that's your language this year is q sharp q sharp for me
personally though like quantum computing and all that like it's interesting, but it just feels so theoretic and so intangible right now that I can't get excited about it.
Because it's like, well, I can't do that at home.
Yeah, what am I practical?
I don't have a quantum computer at home that I can work on.
Yeah, I mean, that's the thing.
If you wanted to play with something like that, you're basically bought into something like Azure to even be able to mess with it.
Or like the IBM cloud, right? So at that point, you're not even using your own computer to do it.
You're using somebody else's computer. And then at that point, you're like,
well, how do I know what I did is really what I think it just did? Because I don't know,
like tricks just worked.
Like, you know, I mean like that was part of the magic of,
of programming to begin with.
Like when you first started, right.
Cause you were making your computer do something.
Yeah.
Right.
And yeah.
I'm with you.
I go to the talks though about quantum computing and, you know,
they talk about qubits and whatnot, and I'm just like, mm-hmm.
Okay.
One day I'll get super excited about it, though.
But there are quantum katas.
You can check that out.
That's pretty cool.
I haven't done a kata in a while.
I need to get back there.
Yeah. This
episode is sponsored by Datadog, a monitoring platform for cloud scale infrastructure and
applications. Datadog provides dashboarding, alerting, application performance monitoring,
and log management in one tightly integrated platform so you can get end-to-the-end visibility
quickly. You can visualize key metrics, set alerts to identify anomalies, and collaborate with your
team to troubleshoot and fix issues fast. Try it yourself today by starting a free 14-day trial
and also receive a free Datadog t-shirt when you create your first dashboard. Go to datadog.com
slash codingblocks to see how Datadog can provide real-time visibility into your
application. Again, that was datadog.com slash coding blocks to sign up today. All right, well,
moving on, let's talk about code generators. What they mentioned here is when you have a repetitive
task, why not generate it? And that's something that I used to do a lot of in the ColdFusion
world. I used to have a couple little scripts, and this kind of ties back to the previous section
where I would have repetitive tasks.
Like I would query a database.
I would get the columns.
I would generate the queries used for inserting, updating, deleting, selecting.
I would throw those into a CFC file with the appropriate syntax around.
So I would do a lot of generation just kind of by hand,
and I would go and do the forms and everything,
and that was really nice and
it was also really tightly bound
to the output and the way I was doing things
and so it really was inflexible but
that's you know just one
type of code generation there where I'm talking about basically
scaffolding where you kind of do a bunch of work
and then go in and tweak it and I've done
a little bit of stuff with other generation
like generating classes
from metadata just to
kind of save me typing and then it's nice to be able to update the metadata and have that stuff
thrown out for you but um what about you guys have you done much code generation yeah the the
sequel one especially outlaws he's over there smiling internally but yeah for me for me the
the whole question about using like sequel because we about it, like for a lot of our careers, I was always like database first, right?
Like you're working in the database, then you're propagating those changes down through your application.
And so I would always go write some meta queries against, you know, information schema and grab stuff and write my C short, my JavaScript.
You know, I would try and script out as much of that as possible.
Yeah.
I mean, it's definitely, uh, hits a, hits a, uh, soft spot in my heart here lately based
on what I've been working on.
Um, cause I have been working in a code generator or creating a code generator.
So, um, I mean, it is, it is kind of magic when you, when you build it and
you get it to work, you're like code that writes code is always kind of a cool thing. Right. And,
um, I don't, I don't, it's such a valuable thing though, too. Like it's, it's crazy. You might not think about it,
but the fact that you could like, just when you say like the repetitive task thing,
it almost makes it sound like, okay, let me rephrase this. When you say like, Hey,
if you have a retask repetitive task, why not generate it? But at first glance,
like that sentence almost sounds like, well, you mean like if I have a repetitive
task, like why not just make a shell script out of it, for example, right? But, but what way I
kind of interpreted that when you said it was like, well, if you have something that's just
a bunch of boilerplate code, right? Then, you know, if you can script that out, right? Like
immediately, you know, you brought up entity up Entity Framework just a few minutes ago back, right?
And if you think about what Entity Framework is doing, it's just generating a bunch of boilerplate code that describes your database, right?
Whether you like it or not.
And it's hooking things up for you, right?
But the beauty of that is not only do you not have
to write it, but the chances are you're reducing errors. Because how many times have you gone to
write boilerplate code that you copied and pasted? Because you're doing the same thing,
and then you forget, oh, I didn't change that one up there. And so now you have a bug. You have
some sort of bug that was introduced because you copied and pasted and missed something.
When you generate that code, you don't have the same problem, right?
There's not that human error involved.
Well, even if there is a bug in it, the beauty of the generator is that you could just rerun it.
Rerun it.
Fix the bug.
Oh, hey, you know what?
I decided, oh, I fixed this bug.
Or, oh, hey, I decided to refactor this in a more elegant way.
Or we're adding a new feature, and then you just rerun your generator, and now everything gets to take advantage of that new thing.
So, yeah.
And the beauty of these, though, is that reuse of that generator has almost no cost.
Yep.
Run.
I mean, and that was their calling. It was like no cost. Yep. Run. I mean, and that was their calling. It was like no cost. And I was
trying to think of it like, okay, if they're saying it has little to no cost, what is the
actual cost then? Like, are we talking about like a get diff that might come out after the end?
Right? Like, I'm like, well, that's, I guess that's technically a cost.
Is it a cost that I care about?
Right.
Right?
Compared to actually having to write
some more boilerplate code.
Yeah.
So tip 29, take it away, Joe.
Write code that writes code.
Anyway, what I think you were kind of hitting on there,
Al, I mean, you said it,
it's kind of like when you say you have a repetitive task when i generate it like my first kind of thought
of seeing that was like well why don't i just program it like why don't i just write a function
why why am i generating code and so i i know that i generate code in the past i mentioned
so i was trying to figure out like what is the difference between the times that i
generate code and the other times i just like, you know, do normal programming.
Like what's the difference there between writing code that writes code and writing code that
writes binary, you know, essentially or instructions to the computer. And I think
they had some, they had a really nice distinction here, like two types of generating code.
And the first was scaffolding. So that's where you generate something that's a starting point
that you might take and then go modify.
So like in the case I mentioned of like generating the forms, you could take that data and then go in there and then apply the styling or move things around or make it look nicer.
But it saves you a lot of rote typing for putting in the labels and the inputs and hooking all that stuff up.
Or like you could think of this as the file new experience, right? Like you're in like, say, a visual studio and you,
hey, I want to add a new class to this project.
And think about like, you know, it prompts you for like,
hey, what do you want to name the file?
And then based off of what you named the file,
it'll go ahead and create a namespace and a class that matches that name.
And it'll add in all your using statements.
And it just stubs out the whole thing for you, like that's the scaffolding you're referring to yeah we actually had some
folks on from microsoft when they built those generators and i think joe's ac you even did a
video on it but yeah it was basically took you through like a little tiny wizard and then it
would scaffold out the entire project for you right right? And it had real code in there that you could go in and manipulate, add to, do whatever.
I'm trying to remember.
It was Clint and –
Yeah, Clint Ruckus and I forget the other person's name.
Michael Crump.
No, but it was the UWP.
Michael Crump.
Yeah.
Temple Studio.
Yeah.
So that's a perfect example.
And I don't think Clint is at Microsoft anymore, if I remember correctly.
I think he is
gone now. He's at Facebook.
Interesting. Yeah, they all
steal from each other up there in the
great Northwest.
Yeah, but so the one
scaffolding is the one I mentioned. The other one is more like
the kind of entity framework example we mentioned,
which is, if you're not familiar, it's basically
it's a tool that does some querying and stuff
in C Sharp, but its main kind of the thing that most people associate with it is it'll actually go
run against your database get all the column data generate actual classes for those and so i started
thinking it's like well why do i want that why don't i just want to have things that can run my
queries dynamically like why do i need to have classes generated that seems kind of weird to
generate code like why not just generate functions that I can use to write this?
Well,
I kind of settled on is like,
well,
by having the code there,
it gives me the things in my,
in my tooling,
like things like,
uh,
you know,
auto complete IntelliSense and stuff.
So if I'm querying an object,
like a person object,
then I can do like person dot first name and person dot last name.
And that stuff's completed for me.
It all works.
It's the errors are reduced. And so that's really nice to have. And then. And that stuff's completed for me. It all works.
The errors are reduced.
And so that's really nice to have.
And then I don't need to maintain that either.
So if I go and add a new table or adjust some columns,
I can just rerun that generator and get that stuff all back again.
And if I didn't have that, if I just had to say like, you know, Dapper is another library where you can kind of pass more free form strings to it
and get your data back, then you don't have those kind of
benefits and it's easier to make mistakes and you have to maintain that stuff by hand
but when you said entity framework that is still the scaffolding type thing right like it's
generating code up front that's not the active right right but so it generates that but also
it's also responsible for some of the stuff in the background too so like if you're like actually
doing some querying or updating or whatever, some batch operations,
there's some, just some kind of glue in there
in addition to just generating those classes.
Like when you do querying and stuff,
you bring in the entity framework.
It's writing the queries behind the scenes.
I got, yeah.
So what you're talking about is like the link to SQL
or the EF to SQL type stuff that will write the queries
because you did your projections on the objects.
Gotcha.
But then there's also the T4 generators that would go along with that
where you could create C Sharp, for example, off of your database.
But in the example that you went, though, with Entity Framework, though,
that's in the database-first approach.
You could take the alternate approach with Entity Framework
where you go code
first and you don't have a database that exists yet and you could describe it
in code.
And then when you run the application,
that code will then create code to create the database for you.
Yeah.
So that's actually,
that's a really good one.
Another one that I was thinking about for these,
these active code generators, which what they said is they're used each time they're required, content management systems, right?
Like anything that's like a CMS that if you've ever worked in them, I think Embarco is one of them.
I mean, there's lots of them out there, but you might say, hey, I want a first name, a last name, and an email address field to show up on this thing.
And a lot of times CMSs will go grab that information and say, okay, there's three text fields.
Write the code that's going to write that stuff.
And it might write validation JavaScript.
It might write other stuff.
But basically it's generating the code on the fly to build the page.
So that's another one. So mind blown now, because, because the way
you're taking, if I understand the way you're taking code generators, active code generators,
it's almost like saying WordPress is a code generator, right? WordPress could be. You're
saying that like the actual serving up the page could be the process of serving up the page counts
as an active code generator. If it's generating code, right?
So not necessarily WordPress, because if WordPress, if you're just spitting out the content that you wrote, then sure.
But there could be plugins for WordPress, like, I don't know, like a contact form or something, right?
It could generate it because you might say, hey, I want just the subject and form or something, right? Like it could generate it because you might say, Hey,
I want just the subject and the email address. Right.
And so it could write the code to make that work.
That to me is an active code generator. Right.
But it almost sounds like then you're describing like anything that's
templated that then the output of that template is obviously the generated
code for presentation purposes. Right.
Could be.
It almost sounds like we're describing that as a code generator. And I've never considered previously. I never thought about that as
counting as code generator. If there's code being written, right? So like, I don't know the HTML
fits it. Like, you know, we were kind of joking about earlier, but you could be writing, like
you could be dynamically writing validation right like hey
if you if you didn't fill in the subject that i need some sort of alert to pop up on the page like
you know you got to fill in a subject that's code now could i talk you into html if i told you it
was html5 no no probably not no not probably not dang it um but but yeah i mean that's just
one example like a cms kind of strikes me as one.
Hmm.
I don't think about that one.
Like SQL, right?
Like a perfect example is like when you do things, I don't know, maybe you have a form that you fill out on a page and then it generates the SQL or it generates some sort of query against the storage engine that you've got behind the scenes, right?
That's real-time type stuff.
Like, hey, I know that you had this field that was on the page,
and I'm going to dynamically go write the SQL or something to query that stuff.
Like, that's active code generation.
There's plugins for WordPress. I think probably similar ones you're thinking of where you say, like,
these are the four fields that I want to collect.
It'll generate the form. It'll take that that data and it'll generate an email that then
gets sent to you whenever someone fills out that form and yeah i mean i never really thought about
it that way but i guess any sort of templating is really kind of code generation because it's
taking some sort of data and then it's generating something in a different form whether it's the
email in that case or the form for the ht mean, I guess it's, yeah, code generation is just, it's weird.
Well, now if I think about it that way, though, it's like, okay, what isn't code generation?
Right?
Because then you're like, okay, everything you've ever done in all of your JSX is active
code generators.
It is.
Yeah, that actually is.
I mean, if you think about, so let's even step back into the web forms world.
Web forms, you did a combo box or a list box, or I can't even remember what they were.
But behind the scenes, that was actually a program saying, all right, convert the garbage that they gave me into real HTML, right?
So when you had a combo box, that actually got turned into a select element in HTML.
It was writing code, right?
And there were all kinds of JavaScript hooks that you could have in there.
So it was truly taking one form of your code or template
and turning it into code that could be executed in a browser.
Okay, I'm coming at this chapter with a whole new perspective, Nim, because I totally wasn't thinking of it in this regard.
I think you were probably thinking about it in compiled language type stuff, right?
Like, I'm going to write something that writes my C-sharp code.
That's totally legit, too, but really it's the same thing, right?
If you're writing C-sharp code, it's some sort of template.
The only way you're doing it is if you have some sort of repeatable thing that you can sort of templatize.
Otherwise, how are you going to do it?
I mean, you're not wrong that I was totally thinking about it from a compiled language. Like definitely, you know, like one thought that's been on my mind lately is like,
what if you had some database project
and based on any commit that went into that database project,
it automatically spat out the matching C-sharp for it.
Like you mentioned entity framework.
What if you were to make that build pipeline,
spit out the C-sharp necessary for it,
and it could put in a commit for you as part of that, right, to match it?
Yep.
I mean, not to say that that would be ideal,
but that's kind of where my head's at.
Definitely in a C-sharp kind of compiled language world.
Never dawned on me to think about a CMS or like even JSX or anything
like that, where you're, you're, here's the template of, of what I want to be shown and then
render that. I mean, that's what these transpilers do now too, right? Like if you're writing
TypeScript, really all that's happening is, is converting that into JavaScript language. It's writing it for you, right? It's kind of a co-generator. Yeah. I think
we found one of those distinctions, kind of like the jam stack where we could kind of argue over
whether or not we consider something to be co-generation or rendering or if the same thing,
but. Well, I mean, okay. So not to belabor the point here, because I know that Alan was like, hey, I don't even care if it's HTML5, it doesn't count.
But I mean, the authors did call out HTML.
And at the time, I was like, what?
No, no, right?
Like, why would you count it?
Like, I can't.
But if you go this route that you have now, like, you know, mind blown, I'm like thinking
about it now. With like the JSX as an example, right?
Or any JavaScript framework that is like a MVVM kind of pattern or MVC pattern, right?
Like something is taking that JavaScript that you, where you've defined the view that could
be in some, in some JavaScript frameworks,
it's pure JavaScript.
You're not even writing HTML,
but yet the output is HTML.
So then that framework that you're using
is a code generator.
Yeah, totally.
So, okay.
And those are real-time.
Like what you just said,
if it's JavaScript,
you're truly feeding it JavaScript,
and then there's some sort of interpreter that's writing the HTML at, at runtime. That's one of these active code
generators, right? Okay. But okay. Now, now it's coming in. Now it's coming together for me. I can,
I can, the pieces are falling in. So join me on this journey. Why?
Here's why,
here's why that shouldn't count.
I think that the authors of the book,
I don't think that they,
and I could be wrong.
I think that they were,
I hope,
I think that they were trying to say like, if you were to write a generator,
not use a generator.
And in like those JavaScript examples,
that WordPress example,
those CMS examples,
like you're just using something that's already there.
Like you're not writing your own, right?
Oh, I agree with that.
I think what I'm talking about is if you were the person who wrote that, if you were the one that wrote the thing that generates whatever it is, right?
Yeah, it's kind of the principle of the matter.
Right, right.
The principalities. That's right. No no no i i totally agree with that but there's always that other side
of it right so even if you were to write the the c-sharp generator from every time somebody commits
something to the database they're still going to be users of that but it doesn't dismiss the fact
that somebody wrote that generator and that's what he's talking about, right?
Yeah.
I like the way you just exploded my mind, though, because now everything on the internet
is a code generator.
It's all generated, yeah.
And I can't comprehend it anymore.
But let's step back for a second here, and let's talk about how things are typically
done in any kind of work environment, right?
Let's say that you have the regular three tier system,
you have a front end, you have a middle tier, that's your server.
And then you have, and then you have your backend, right?
No, that's not the way a three tier is.
The three tiers there's you.
And then there's like three other managers.
There's one manager that's going to like do your day to day stuff.
One manager that's going to be like, Hey, it's time for your reviews.
And another manager is going to be like, Hey,
how are you doing with your HR stuff?
That's your three-tier strategy.
I'm not joking.
I hate those tiers.
IBM had – you had three managers.
That's ridiculous.
I remember.
No.
It was crazy.
Let's go back to the better world, the MoBetter world.
Oh.
But, like, typically, if somebody is writing an application, they'll write some – they'll create some tables in the database.
They'll make some stored procs, whatever.
Then they're going to go write some C-sharp code or Java code or whatever it is, the middle tier stuff.
And it's going to somewhat mimic that, but there's going to be some sprinkled in things there, right?
But they're handwriting it.
And then they go do the same thing for the UI, right?
Like they're going to handwrite that stuff. So the big difference is what we're saying is instead of you handwriting that stuff,
you can meta drive that stuff and build a lot of that code for both that middle tier
and that front end if you started at the database.
Maybe, maybe you don't even do that.
Maybe you have a bunch of config files that you use that you're like, hey, I want to build
stuff based off my config values.
And then it will go through those config values
and write the different pieces of code it needs.
Oh, God.
Now we're calling Docker a code generator.
Docker's amazing.
Kubernetes is the code generator.
Docker is a code generator.
Oh, mind-blowing.
Yeah, so maybe in the new version of the book,
they talk about the rendering separately.
That'd be interesting.
I still want to read it. Maybe we could do a recap episode where we read the whole other new version of the book, they talk about the rendering separately. That would be interesting. I still want to read it.
Maybe we could do a recap episode where we read the whole other new version of the book and then talk about it in less than an hour.
Yeah, totally.
Well, yeah.
Yeah, I don't know that that will ever happen.
We probably wouldn't get past the title.
Oh.
A couple of other things I want to mention here.
So the big thing I think is just the distinction between passive co-generators, which are basically scaffolding meant to be kind of run less often than you take and tweak, and then active.
So they got a couple more points here on the passive ones, like the scaffolding.
So like one-off conversion, so one language to another is something we talked about being a little weird before.
But it was funny that it was in both sections.
They called out, too, though, in that kind of example that,
uh,
that conversion doesn't have to be perfect.
I love this.
Going back to that point about like the,
you know,
you're just trying to get like the 80 or 90% of your C to object Pascal.
Right.
And then you could like tidy up the rest manually.
Yeah.
And they even said that they did that when they were doing this stuff for the
book,
right?
Like they generated some stuff and then there was some things that things that they're like yeah it's just not worth spending time
writing a generator to do this we'll just one off these things right you gotta you gotta figure out
what that line is for you if i was writing a book without pictures i would definitely use markdown
or totally well yeah but i mean you know because you are going to use pictures and you're going to write it with crayon.
Yeah.
Well, the thing I mentioned here, too, is producing lookup tables from other resources that are too expensive to compute.
I can't think of an example of that nowadays.
But I remember back in the day, you'd look up like logarithm tables or something in a math book, you know?
Right.
That's a good point.
So it's kind of funny to think about generating that sort of data
i guess so i guess i could see in a proper presentation or something like you could do
like run a little simulation say like you know here's three different tracks depending on how
the company does over the next three months like we'll be somewhere in this range here's the estimates
but what does it mean though for a co-generator create a lookup when i think of a
maybe i'm maybe my head's in the wrong place when i think of a lookup when I think of a, maybe I'm, maybe my head's in the wrong place. When I think of a lookup table, I'm thinking like, okay, Hey, like, uh, these are my user types, for example,
right? So you could be an administrator, you could be a, uh, you know, regular user, maybe
user types of bad type. Uh, but I'm a credit card. How about this? Here's a better one. Credit cards,
right? There's a finite number of credit card types that are out there, right?
Discover, American Express, MasterCard, Visa.
Diners Club, that's the most important one, right?
Thank you.
Yeah, yeah.
I don't know how I left that one out.
We don't want to leave that one off.
I feel like our show is now complete.
That's right.
Because we've included Diners Club.
Hey.
Are they Canadian?
Is that what you're trying to tell me?
I think they might be.
I think they are. I remember the IBM used to use them all the the time and it was like anywhere you went it's like you can't what
all right sorry sorry um now maybe that was how ibm kept their cost down it's like you can only
go to like 25 of the available stores anywhere in any given city. So,
where was I going with this?
Yeah, so you would have a lookup table of the credit card types, right?
And the reason why you're doing that,
maybe for like joins on other tables
or whatever, right?
But creating that,
I mean, that one,
that doesn't seem like something expensive to compute.
Yeah, I don't know.
The expensive thing, like Joe said, is kind of hard to come to grips with nowadays.
Like you said, if you had some sort of mathematical table, like your cosines or tangents or something like that that you have to generate, then maybe that's one.
I thought of one.
I mean, they definitely use math as the example in the book, by the way.
What's the one that you got?
So the one I thought about is like you guys seen Skyrim?
Yeah.
Like video game?
Yeah.
So I think I heard this about Skyrim is that they had a lot of procedural generation in order to generate the world because it was so. What they would do is in order to make sure everyone looked a little bit different is
they would generate, say, thousands of characters.
And then maybe a person would go through and say, yes, yes, no, no, no, yes, no, yes, no.
Those were the ones that looked a little too goofy or whatever, didn't kind of meet whatever
requirements they were looking for.
And so at the end of the day, they didn't want to do all that stuff kind of at, you know,
runtime because it would be too expensive to generate stuff and it may end up
look goofy.
But by doing it and kind of having a tool around it,
they do that sort of stuff at like either, you know,
build time or kind of associating that stuff on the data.
And so that kind of reminded me a little bit of like generating art resources
compared to like a lookup table, but it's kind of not that different.
I like that.
That makes perfect sense.
You know, that reminds me, there's definitely an elephant in the room that i don't know that we've discussed
what video game is this oh well do you want to talk about video games so because like there was
the i don't did we even bring up the steam summer sale like Sale? Did you find anything good? I bought some VR things, yes.
Oh.
Yes.
Man, there's a game.
Don't tell me you got VR fishing.
I do have a VR fishing, and it's amazing.
It truly is amazing.
I'm sorry I brought it up.
Let's talk about co-generators.
Look, look.
You guys, I'm going to give you all a great favor here.
You need to go buy a vibe i gotta
stop you here man if we as as as developers from the south you can't start a sentence with hey y'all
and then talk to me about vr fishing because we will never live it down that's amazing right i was
fishing off the bank over there oh so no oh so check this out no seriously there is a game called gorn go buy
some vr headset and then go buy gorn because at the end of a rough or long day it is amazing to
go out there and just beat people around an arena it is it is so fulfilling it is so fulfilling. It is incredibly cartoony, gory, but
it is just like you walk away, you're
sweating, you're all done. You're frustrated
because you beat a bunch of guys, but
then they started beating you. It's just a
great experience.
At any rate, that's one of them.
Joe? Nothing?
You bought some stuff.
Yeah, I bought Overcooked 2 thanks to
Mad Viking God, but it's actually
stressing me out more than work so i try i gotta do it in pieces overcooked too huh
yeah i've heard of that one it's a it's a co-op game you can play it solo too but it's even
crazier where it's like they give you orders and you're like controlling the little person so it's
like the one person's like chopping the fish and throwing it the other person is putting it in the
pan oh the rice is burning oh crap wait hold on we don't need the other person who's putting it in the pan. Oh, the rice is burning. Oh, crap.
Wait, hold on.
We don't need rice.
Oh, no, that's too stressful.
It gets kind of hectic.
Yeah, that's no good, dude.
Yeah, I mean, I don't need that kind of pain in my life.
I can't play games that stress me out.
Although I will tell you, in the virtual fishing game, this is true.
My wife got mad at me because she worked her way up to where she had more expensive lures that you had to pay money for.
So there's free lures, and then there's these lures that you have to pay money for and she's like yelling at me don't use
those lures you're gonna lose it i don't have to buy i'm like what what wait you spent money on
virtual lures to catch virtual fish no no no no no like in the game they cost money like
virtual money like oh oh game game credits yeah game game dollars I didn't have to pay any extra dollars for it.
I thought you meant like real money, like in-app purchase kind of thing.
I'm not going to tell you about those purchases.
Sir, we have to have a talk.
I don't want you to make fun of me.
That's how games are now.
They are.
It's really – the freemium model irritates me.
Anyways, so what about you?
I know you have a game in mind now.
Yeah, it's an old game but uh borderlands 2
was on like some ridiculous sale that included every bit of dlc it ever came with so it was like
a 250 bundle that you could get for like less than five bucks oh yeah you gotta buy those all right
yeah okay you did it yeah i mean joe you probably bought 12 other games that you're never going to play, right? I already have all of them.
Steve's like, there's like a tilt.
Yeah.
I got all of them.
He goes to Steam and it's like, nothing to see here, sir.
Yeah.
Oh, but you have like over 200, right?
Or it might be.
Yeah.
I don't even want to know but yeah it's definitely
more than 200 oh man his wife might listen to this don't don't say that that's right that's
amazing all right well let's go back to code generators specifically the passive code generators
yes so the full-fledged source file is something that could be generated
which is kind of where my head was.
Yeah, like a T4 generator or something, right?
Yeah, exactly.
So here's the interesting thing.
They say it should be part of source control.
I'm curious you guys' thoughts on this.
Absolutely.
You do think so?
Absolutely.
100% agree.
Okay.
Okay.
Because I mean, so I'll give an example.
Joe and I are working in the Kafka Stream stuff, and there's these AVSC files.
They're Avro schema files.
And I struggle with this one.
Like, okay, so I commit my Avro schema, which is basically a JSON blob describing all the fields that are available. And really there's a code generator that runs on that thing and generate some
Java classes.
Like I have basically get ignored those because I don't want those in my source
control.
I want those to get built and compiled and then spit out into the final jar.
Right?
Here's,
here's my thinking from it.
Is that from a build perspective, a build automation perspective,
any point in a repository should be compilable in my perfect world.
Like you would never commit code that can't be compiled by itself. Like I shouldn't have to
go and do something else in order to compile it. And along that kind of lines, let's go,
we keep beating up on entity framework, but it's such a beautiful example.
But if you, if you were not committing the code that was generated, you know, using that T4 generator,
for example, then your code that's on that build server, that could be like a random build server
that just spun up, does a build, and then it shuts down, right? If it's in like an Azure DevOps kind
of scenario, right? Like, in your situation that you're describing, it would have to know your build steps would have to know,
Oh,
Hey,
go run the generator,
which means now that build server needs to have access to some database.
If it's a database first scenario in order for it to build the C sharp
classes,
it would be required to do the bill.
And to me,
that's an ugly dependency to put on the build server.
So I'll tell you this, and this is where it diverges a little.
And I'm curious what you think on this, Joe, because like I said,
I just get ignored because it bothered me.
So our Avro schema files, our JSON files that describe the fields
that would be needed to generate these classes are actually in the source.
So those are committed source files.
The build actually has a build step in there that generates the Java files.
So when you go to do a build, it's going to first then go look through and find all those Avro schemas
and then generate the Java files based off of them
before it does the build of the project. So the reason why I didn't want it in source control
is because every time you modify a schema file, then you're getting these get diffs and these
conflicts on the generated files, which I feel like the source of truth for those Java files
in the first place were those schema files, right? Like
we never handwrite those Java files ever. They are always generated off the average schema file. So
that was where I was like, man, I guess it depends on the situation because the files that are used
to generate those other files are in source control. and because the build actually has a build step in there to
generate the java files then i don't want those generated java files in my source control yeah
i'm with you i prefer to not have generated files in source control but there there are some minor
advantages like um if you talked about browsing github for example and it's nice to be able to
like especially if you have some of the plugins that we talked about before be able to click here and say like oh go to this class and let me see
what's there you can do that from your visual studio or whatever and so it's nice to be able
to kind of look at it that way outside of your tools but other than that if you're talking about
just strictly an ide then the build should replicate that stuff and you don't have to
worry about merge conflicts and stuff so that's my preference but um it's not a strong preference
that's that's a really good point, though.
You wouldn't be able to navigate.
Like if you had some sort of plug-in for GitHub to be able to navigate from one file to another based off the class, it would say that it can't find it.
So it's interesting.
Like it's not in a runnable state, but it is definitely in a compilable and buildable state.
So it's sort of a weird in between
but it was really the code it was the the merge conflicts that basically did it to me and i was
like i'm done with this i'm never i'm i'm not gonna fight this fight every single time we make
a change to a schema file yep merge conflicts though absolutely so basically like if for
instance you added some new fields there's these these Java classes that it generates are massive, right? So you might have 100 line schema file, you're gonna generate a 2000 line, you know, Java file. And if things moved, or if you added another type to something, then it's gonna find these lines that are very similar. It's gonna be like, hey, what mean here it's like yeah i meant for you to die and replace it may not be sequential right so like you may
have your getters and setters at the top but then it may have a section that's all about generating
output and the next section might be about getting data in and so it's kind of mixing matching stuff
like you add stuff in two different parts of the file it can end up you know being say eight
different spots in the file once it's generated.
Yep.
So maybe our answer then is your mileage may vary.
It depends, really.
Because even in, like, I was going back to thinking about, like, the, you know, JavaScript
kind of transpiler kind of, you know, JavaScript compilers, you know, scenarios in some build
environments, right?
And the output from that, which is generated code,
but you wouldn't want to commit that.
Right.
So.
Oh, that's a great point.
Like if you have JSX or whatever,
it typically writes to like a public directory.
You don't commit that public typically.
So, so I guess where I'm going to land in that though, is that like, man,
it's really hard to say. Cause if, if the
code itself is what's generated, it's generating itself, then that sounds like a weird statement.
Like definitely in that entity framework example that I gave, I, I, I might hate you if you were
to say like, Oh, I decided not to commit anything that the T4
generator created because here's the generator. Here's the T4 for it. Right? Yeah, that would be
awful. Because even though you could make the case, they like, oh, well, here's a SQL project
that follows along with that. So you could technically build a database from that SQL
project. But then it's like, oh, yeah, I still have to have a SQL server spun up in order to build and deploy that SQL project too.
And then I got to make a connection to it with that generator.
There's a whole bunch of disgusting steps.
So maybe if in your process it can be done all locally, it's all lightweight, then maybe that's where you draw the line in the distinction.
But as soon as you have an external dependency on a different application
or a different environment or whatever, then commit it.
Yeah.
Yeah, great point.
And if it doesn't create a bunch of conflicts.
If it creates conflicts, all that goes out the window.
Nobody wants to deal with that.
All right, well, let's talk about active code generators.
So, the author
has made the point of saying, like,
if you want to adhere to the DRY principle,
then you have to have active
code generators.
Right? And they say that it's not
necessarily considered duplication
because
the code is being generated as needed
by taking some single representation of it
and converting it to all of the forms you need.
So this would be like the database
and then generating the middle tier C-sharp
and the front end, whatever it is, right?
XAML or HTML or whatever.
Man, if your database is creating front end code.
I've seen it.
I feel like, actually, this was a whole section, this was a whole portion of the book, though, where I was like,
you know, I wrote notes on the side, like, well, this violates domain-driven
design. Pretty sure Uncle Bob would not be happy with the sections that we're reading here.
You know, like, it was conflicting
along those two different books, or authors.
You definitely give up some things when,
when you do stuff like this,
right?
There's no question.
I mean,
code generators are made to reduce boilerplate.
It's not made to make great business decisions in your,
in your code.
Yeah.
And this is from a different era.
And this is one of those places where it's kind of showing this age.
Um,
but I do think it's a great point that,
system boundaries is kind of like the, the thing I was I was really trying to kind of struggle with to figure out,
like, what is it about the times that I use code generation, and why didn't I just do those the normal ways?
And for me, it was mostly either scaffolding because I had some boring stuff I didn't want to type,
or there was a system boundary.
Like, either I was looking at web services or a database or some other sort of protocol or something,
and I needed to generate stuff so I could interface with that,
and I didn't want to have to maintain that stuff by hand.
And yeah, just like they mentioned, great for keeping things in sync.
And a whole thing that I thought was funny is they recommended creating your own parser,
which I think most languages and most kind of system boundaries that you're dealing with nowadays,
like even if it's REST or database or something,
it's probably going to have something kind of built in.
And most people aren't really used to generating their own parsers now.
So that's going to be a pretty heavy task for something that's so common.
Yep.
Oh, yeah.
And I kind of skipped ahead on this,
but I kind of had a little section here on like why, you know, one of the times you wouldn't just program it.
So I mentioned scaffolding, of course.
One thing we didn't hit on was performance, though.
You know, I mentioned, like, why not just do things dynamically?
Like, why are we generating classes and compiling this stuff if we could just kind of, you know, either look stuff up via reflection or do it via strings?
And performance is another reason for doing that.
And, of course course those system boundaries.
Performance is a big one.
You could actually think of data generators or,
or,
or these,
yeah,
these code generators in both lights,
right?
You might have one there to make sure that it is performant,
right?
Like you might have something there.
I'm trying to think
PostSharp, like one of the features of PostSharp was, hey, you do something wrong. There's some
sort of programming pattern that people do typically wrong. And this thing will actually
actively go in and rewrite that code, right? It'll write the stuff behind the scenes to fix what you typically do wrong.
And so there's that kind of actually improving performance.
But then what Joe said, like with reflection is you can have these data
generators, these active or not data, these, these code generators,
these active ones doing reflection.
And you're taking a hit by inspecting all these classes and objects and
everything that come in.
So,
so you could use it on both sides of the coin,
right?
I think,
yeah,
we talked with,
um,
oh gosh,
what was the guy's name from post-sharp Gail?
Yeah. The owner.
Dang it.
The founder,
the name eludes me.
I'll never be able to pronounce it either.
And he lives in a place that we don't know.
Um,
cause we got that wrong.
But he specifically showed an example in a talk that Alan and I attended where he was talking about using the weak event pattern.
And that if I remember right, it was like, hey, if this code doesn't implement the weak event pattern, then you could write an aspect that did implement it.
Yep.
And the aspect's actually writing code behind the scenes, right?
Like it's writing the MSIL for it.
His name was Gael, I think.
Oh.
Yeah, Freiter.
Of course I mispronounced it.
But yeah, super awesome guy, by the way.
But yeah, Gael Freiterur? Yeah, Freitur.
So at any rate,
I just wanted to point out that the performance thing could be
both for and against, right? However you're doing your code generation,
you make a decision there.
Yeah, they call out that some uses of the active code generators work best when they're part of your build pipeline.
So I mentioned that example earlier about like, hey, if you had some kind of database project and it was like anytime you added a new table or changed the structure of a table or added a new function or whatever, then it would automatically kick off some generator that would, you know, go create
your C sharp that matched it.
Right.
Um, not saying that that would be the best use of, of it, but you know, like you could
see how, like if that was part of your build pipeline or even in your example, right, where,
uh, you're creating those Avro schema files at at compile time on your build server
yep right i mean you can even think about it from the perspective of having somebody that's like
devopsie right to where uh you commit something you might want that thing to go in and kick off
or run that project that did the generation for you so So, yeah, having those hooks in place and really paying attention to your pipeline can help out a lot.
Man, you kind of hurt when you said having someone DevOps-y.
Okay.
That's actually a conversation we had earlier.
And Mike's got a good point.
There's this whole notion of they're just DevOps people, right?
And then there's not.
There's people that think that DevOps is a title or a role.
Right. And it's really just something that everybody should be involved in
is what his point is. That doesn't, at least
in my opinion, that doesn't mean that there can't be somebody fully dedicated to
making sure your DevOps runs well, but that doesn't
preclude everybody else from having to be aware of and
participate in it.
Yeah,
for sure.
We should do an episode on that.
We probably could.
It almost feels like you're saying though,
that like somebody's full-time job is to compile your code and you don't need
to worry about how you compile your code.
Cause we have somebody whose job is
like he's we call him the dev compiler and mr dev compiler his full-time job is to take other
people's code and compile it and if it doesn't compile he'll let you know because that's his job
he's dev compiler yeah so i i wouldn't even take it from that perspective and i get what you're
saying that's like basically saying hey everybody else can put blinders on, but this one dude or girl is going to have to be guy or girl
is going to have to be responsible for doing all this. And I don't, I don't think that's the case,
but I think like, for instance, if you get into things that you're dealing with a bunch of
infrastructure, like maybe you're doing Kubernetes or you're dealing with VMs or you're dealing with
puppet type stuff, like, are you really going to expect every single developer to understand how all
that stuff works?
So it's,
there's,
there's definitely some lines that can be drawn is what I'm saying,
right?
Like there's,
there's a difference between your code operating,
compiling,
functioning.
Everybody should be involved in that.
If you're writing code,
you should,
you should know how that thing compiles.
You should know all that.
But if you're getting into stuff where infrastructure
is being stood up and vms are being um you know made or brought to life or whatever i don't know
that everybody's going to be a part of that especially like when it comes to deployments
and different targets and generating certs and stuff some of the stuff is a real big headache
and it's it's just a lot for even one person to know.
And so I hate to have everybody kind of wasting their time with such horribleness.
So,
so,
so there's the infrastructure that you're talking about,
right?
But should you know,
like if you were going to install on Linux,
if you were going to run your app on Linux,
like what were your dependencies for that Linux box?
Yeah.
If you wrote the app,
yeah,
you should know it, right? Like you shouldn't just like throw off your code to somebody your app on Linux, like what were your dependencies for that Linux box? Yeah. If you wrote the app, yeah, you should know it. Right. Like you shouldn't just like
throw off your code to somebody else and be like, you figure out what dependencies I think I need.
Right. I mean, how is that any different than like, yeah, I would expect you to provide the
Docker file. Right. That one's a harder one. And again, I don't think I have a perfect answer. Now, how somebody else wants to package those things up to say like, okay, hey, I got this app from Joe.
I got this app from Alan.
Do I want those to be on the same box?
Maybe.
Maybe.
Like, you know, that infrastructure guy, like he can decide like how he wants to handle certs.
Maybe on this box, I don't have to worry about certs.
You know, unless your app requires
a cert, in which case your script better include certs. But, but it may not be that your app
requires certs, but the infrastructure does, right? Like there's, there's, there's two,
there's so many blurred lines and that's kind of like where if I write the app and,
and it works great on windows and I can show you that it works great on Windows, but now you want to go take it and put it on Linux and
things aren't working. Is it really my problem?
That's different. If somebody else is coming behind you
and deciding that they want to put it on a different platform. Different deployment target, though.
And that's what I'm saying. If your job was to make it deploy on both, then
yes, it is your problem.
If it was your responsibility to make it deployable on both.
This is where I disagree that DevOps is a job title or a role.
I think it's...
If you were tasked with creating code that runs on both platforms,
then you should make sure that it runs on both platforms.
Don't spin it off to somebody else just because they have the title. I agree. Again, I'm not saying that developers
should not be responsible for their own code and making sure it works in places. But I am saying
that there is definitely areas of specialties to where you go in, like Joe, you just said,
right? Like you've been dealing with this a lot.
Like when you're spinning up infrastructure,
there's like when you're trying to secure communications
and you're trying to lock things down,
there's a bunch of crap there
that most developers don't even know exists.
So I'm not taking away the title
of like a sysadmin type infrastructure specialist, right?
Like I'm not saying that that person might not still exist.
I'm not saying that that person might not still exist. I'm not saying that. And that's the type of role in my mind that you're describing when you talk about that. Not if you're talking about auto deploying, like I said, Kubernetes,
if you're doing something like Puppet or Ansible or anything like that, like.
That's only a part of it though. Like your part, how your part gets deployed is only a piece of the puzzle.
But there's going to be somebody that's responsible for making sure that the rest of it works, right?
And that's what I'm saying.
We should have an episode.
Because this could go on for a while.
It's a good topic.
Yeah, we'll digress on this for now.
But, I mean, it's probably a very long topic. Fine. You go to your corner. I'll go to my corner. We'll digress on this for now, but it's probably a very long topic.
Fine.
You go to your corner.
I'll go to my corner.
We'll come back.
Fine.
What game was that?
That was another video game.
Mike Tyson's Punch-Out.
Mike Tyson's Punch-Out?
It was, right?
Yeah.
All right.
So let's go back to active code generators.
And so they go on to say that it's often easier to express code
to be generated in a language that's neutral to the representation so that it can be output in
multiple languages. And this made me think of a namespace that I never knew was a thing
until now I learned about it. So I want to share this with you. And dang, I should have used this as a tip of the week.
I was wondering why you didn't actually.
It's not a new namespace.
It's a great tip of the week.
Okay.
But there's a namespace in the.NET framework
called system.codedom.
And using system.codedom,
you can just using like classes and whatnot, no strings,
you know, or, or I should say like very few and the strings that, that are there are super generic,
but, um, you can just using code, describe like, say a class or a or an enum or whatever it might be, right?
Or a function.
And then output that thing.
But you can output it in multiple.NET related languages.
C sharp, F sharp.
So I was like...
Visual basic.
I kind of wonder, it's like,
okay,
at what point do we say language neutral representation?
Right?
Like if you,
if you write some code in C sharp that could output other code,
right?
Then that C sharp representation of it is the language neutral.
I think that counts because it's going to,
it could write it out in, you know,
whatever your language of choice is that you use the code down to output it.
Yep. I think that counts. I think so.
And I,
the next couple of bullets we have here are like these generators don't need to
be complex, right?
Like you can have a code generator that writes all the code that you need it to be,
and it can be fairly simple. Like it doesn't have to be difficult stuff.
Have you ever wrote a code generator that was simple?
Yeah, totally. I guess SQL ones. Yeah. The SQL ones are amazingly easy, right? Like I could,
I've totally written procs that write tons of code for me that are 50 lines, right?
I'll buy that for a dollar.
I had good luck with PowerShell a couple times, actually, where I would have a file that basically
looked like, say, a C-sharp file, and then I would just have variable slots for the various
little pieces.
And so it was easy to just kind of read that file in, push the variables in, and just generate
files for it that way.
Yeah, I like it.
Yeah, there's definitely some simple ones out there.
And the output doesn't need to be code, which I find really ironic, seeing as how we're talking about writing code generators.
So I don't know that this makes any sense.
Yeah, and it gets back to the kind of the rendering.
So they specifically mention XML and JSON.
It's like HTML is one they mentioned before.
So it's blurry.
Well, XML and JSON aren't code.
They're configuration, right?
Like if we're talking about what XML and JSON typically are, they store data.
I never worked with EXTJS.
It's all JSON.
It's not.
Yeah, I know.
I'm fooling.
Here's the bomb, though, that I didn't leave in there.
So I saved this grenade purposely to throw it at this part of the show when we got to it.
You blob it.
Yeah.
So catch.
But they also included plain text.
And I'm like, well, at that point, that's not generating code.
That's just generating text.
Like, this goes back to text manipulation.
Yeah.
No, it's not the same.
Yeah.
Their code generator for
the book broke.
And when you said you were going to lob a grenade,
I was like, the holy hang grenade.
Wait, where's that from?
What?
Outlaw Mr. Reference? Right.
That just made my day.
I win. Oh, my God.
Oh, it works. No.
It is in worms. It is in worms. But win. Oh, worms. No. Oh.
It is in worms.
It is in worms.
But that's not what it's from.
The holy hand grenade?
Yeah.
It's not from that.
It's Monty Python's quest for the holy grail.
Oh, right.
All right.
I thought we were talking about games.
The holy hand grenade.
All right.
Fair enough.
Yes.
He missed a reference.
I win.
Dang it. It's amazing.
We got to restart the internet now.
He asked me about a movie.
What was it?
Something Johnny Dangerous?
Johnny Dangerous.
Well, we talked about two.
It was Johnny Dangerously and Friday.
Yeah, okay.
So I've seen Friday.
I've never heard of Johnny Dangerously.
Yeah, but you definitely didn't remember the part of Friday I was talking about.
I don't remember any parts of Friday except it's Friday.
Ain't got no job.
What about you?
Sounds just like it.
Joe, Johnny Dangerously.
I love Johnny Dangerously.
Really?
Never heard of it.
Man, all right.
Wait, hold on.
Let me try to figure out
how to get a quote in there.
It's like,
you never heard of it.
My mom never heard of it once.
That's exactly the one
that I was telling him about.
My mother.
He said mother not. My mother. He said mother now.
My mother hit me once.
Once.
Okay.
All right.
I'm going to watch this.
I have it on my list now for Netflix.
Yeah.
I had to send him the IMDB link for it.
So if you've never heard of that movie, Johnny Dangerously, old Michael Keaton movie from the 80s, gangster comedy movie.
So you got our last
exercise here?
Yeah, they said to write a code generator that
generates code in two different languages.
I can do that.
They said text was a code language,
so I got that.
I'm going to do
HTML and XHTML.
Done.
I can't take this one serious now anymore.
Before I was all in on this challenge,
and now where we've taken it to, I'm like, well, forget it.
I've actually got it.
I can actually do a Web API endpoint
and then just change the type that I that i send it i can send it um
xml or application json yeah and i'll have my thing i'm done i win all right all right that
doesn't even count all right fine we're gonna have some resources we like and i don't know
if this book's gonna make it i'm just kidding no obviously this book will be in there. And I see some additional links being popped in there as I speak.
So definitely be sure to check out our show notes.
We'll have some links to some of the fun things that we've talked about.
And with that, we head into Alan's favorite portion of the show.
It's the tip of the week.
Yeah, come on.
All right.
So this one is very interesting. this one comes courtesy of andrew
diamond from our slack channel so thank you andrew for sharing this one with us i did not know that
this was a thing so in visual studio code if you let's say you're like oh hey i need to find some
some text here so let me go and control F and I'm going to find all of my
Docker references. And, uh, you know, it'll, when you do that, it'll automatically like highlight
everything for you. Like all of the, like, you know, I'm looking on a page right now and I see
like, you know, a dozen different, uh, versions of Docker that are highlighted. Right. But while
you have that open, if you then do an alt enter,
you're now in block selection mode on each one of those individual spots, which could be all
on the same line. So you're like, oh, I misspelled Docker. And you start deleting or you like need
to copy something in or whatever. You can make all of the changes you want on every one of those references all within Visual Studio Code. That is amazing. Consider it like this. If you are, let's say,
for example, you use an IntelliJ or a ReSharper or a Visual Studio Code and you use that to
refactor something, you're like, hey, I want to change this variable name, right? You could do
that same type of refactoring with this. So control F, once you found what you want to find,
alt enter, and now you're in block selection. Just start typing.
Yep. That's amazing.
Thank you, Andrew. That is going to be a game changer for my Visual Studio,
or Visual Studio Code experience. I do like that.
Yep. All right.
That one's beautiful. Okay. So, this one one I'm going to borrow from our Slack channel because it's just awesome.
So at the top of the show, we were talking about VI and how we're just noobs or rookies at it, right?
So there's a fun way to actually get decent at it.
And you can go to vim dash adventures.com and it's almost like a zelda-ish type game that
you play and you learn vim or vi uh keyboard strokes along the way and it's got like little
challenges and quests to where there's fun ways to learn this and this this came from Morali Suriar and Slack. And it's just, it really is fun
and it will help these things stick in your mind. Like you'll learn about things and then like one
of the challenges is really cool. Like you go over to the section where there's like little
jagged pieces of land. And the only way to get forward is to go to the end of one of the pieces of land and then like either go up or down.
And in Vim, when you're at the end of a line and you go to the next line, it'll pop you back to the end of that line.
But if you go to the next line and it's longer, it'll take you to the same spot in the next one.
So you learn all these features of VI in a super fun way.
So that's a cool one and I very much appreciate it.
All right.
Yeah, and the one I wanted to mention, I misread something earlier at the very top of the show like three or four hours ago.
There was an iTunes reviewer by the name of As I Rose One Morning, and I misread it.
Thank you for the review, by the way.
I read Assle Rose, which made me think of my tip, which is Guns and Roses related for Outlaw.
And so we've got a link here, Outlaw, so if you want to copy-paste that so you can see it and enjoy.
This is a tweet from Reverend Geek David Neal.
And I am one of those people,
I think it's like,
I don't know,
like two thirds or something of people who can never remember whether forward
slash is the one that goes like this or the one that goes like that.
And it doesn't matter what he means by that because it's truly the problem.
Yeah.
It just exemplifies what I mean.
I always have a hardest time remembering.
So whenever someone says like, oh, you got to use the forward slash, I'm like, I don't know.
I don't know.
Stop saying that.
Draw me a picture.
It's even like when they describe it, it's the one that leans forward.
I'm like, I don't know which way that is.
I don't know.
It doesn't make sense to me.
So you want me to describe it?
Yes.
All right.
So if you've ever seen Slash from Guns N' Roses play guitar, then you know that if he was facing you, looking at you, you could imagine how his guitar would be positioned in his hand, where the guitar neck would be on his left hand and his right hand would be used to strum the strings.
Right.
And because he's facing you that way, that means that his left hand is on your right, et cetera.
Right.
Because everything's flipped.
So the slash then when he's facing forward to you is the direction of his guitar neck.
Going up to the right. Yep. Going guitar neck going up to the right yep going
from the bottom left to the top right but if he were to turn around and walk back towards the
drummer and you see his back backslash and that's backslash because you see the direction of his
guitar now going from the bottom right to the top left.
That's amazing.
Forward slash and backslash.
Now I will never, ever be able to think about forward and backslash without thinking about a Guns N' Roses reference.
My life just got a little bit more awesome.
You're welcome.
Yeah, yeah.
My buddy Kirk mentioned this to me.
And ever since then, I now, whenever someone says forward slash or backslash,
I just immediately clip to November rain playing in my head, as it usually is.
And I'm like, okay, I know which one it is.
And the great thing about this whole, because this is a tweet, a Twitter conversation that is going on here.
And one of the responses, which is himself, the guy who the tweet that you shared, he responds to his own tweet.
So you can picture like the – you've seen the emoticons where it's like think like CSI, where you're putting sunglasses on.
And it's like, wow, my forward slash backslash must have really – and then the theme music kicks in, struck a chord.
That's so good.
By the way, the CSI Miami where dude always did the sunglasses.
Right.
I hated that.
Every intro of CSI was like that.
You're just like, come on, man.
What was his name?
David something.
Oh, I can't remember
now we all have to the interwebs it was so bad hey leave in a comment and uh you have a chance
to win a book that's true you can do that uh i can't think of while you're looking at that up
i'll say well i want to say thank you for sticking around uh to this point in the show uh we talked
about tip 28 and 29 today which was uh learn a text manipulation language and writing code that writes code.
And it was Horatio Cain.
Well, that was his character name.
Well, that's the only name that matters.
It doesn't matter about the other one.
Oh, the actor name was David Caruso.
All right.
Good.
I guess if you lived in Miami, though though you got to put your sunglasses on like all
the time that's like that's probably how you spend 95 of your time is like okay but you only do it
when you're done saying a sentence it's got to be like a cool saying it's got to be like a punny
sentence yes all right so
oh yeah you did the show summary, right?
Yep.
All right.
So, what's your turnout, Lyle?
Wait.
So, I was looking at sunglasses on Amazon.
Yeah, I have a big head.
And it's not just my head for hats.
It's also for sunglasses.
They're always too tight on me.
That's interesting.
I have a big face.
I can't come back with it.
How do you respond to that without it being insulting?
Yeah.
No, you have a tiny face, Joe.
It's great.
See?
That doesn't sound better.
Now you're thinking of that guy with the little head from Beetlejuice.
Right? How long have you been here?
All right.
So, all right.
Without enough of this rambling,
subscribe to us on iTunes, Spotify, Stitcher,
more using your favorite podcast app.
Like I asked before,
if you haven't already left us a review
or a thumbs up or a plus one
or whatever that system of choice is for you,
you know, take that action, make it happen.
We would greatly appreciate it.
Uh,
if you want,
you can find some links at www.codingblogs.net slash review to help that out.
Yep.
And while you're up there,
make sure you check out our awesome show notes,
our examples,
discussions,
and more.
And send your feedback questions and rants to the slack.
And it gets a little lonely in summer because everyone's out like surfing and
doing whatever summer stuff. So should uh hop in there and
hang out with me yeah and make sure to follow us on twitter or wherever uh at coding blocks is found
and if you want to know where we're found you can check that out at the top of the page
codingbox.net we've got all our social links and don't forget those pet pictures on slack that's
that's important. Bye.