Python Bytes - #291 Wait, you have how many licenses?!?
Episode Date: July 6, 2022Topics covered in this episode: Python License tracker undataclass Qutebrowser asyncio and web applications Extras Joke See the full show notes for this episode on the website at pythonbytes.fm/...291
Transcript
Discussion (0)
Hello and welcome to Python Bytes, where we deliver Python news and headlines directly
to your earbuds. This is episode 291, recorded July 6, 2022, and I'm Brian Hocken.
Hey, I'm Michael Kennedy.
Good to see you, Michael. It's been a while.
Yeah, good to see you, Brian, as well. Fun as always. There's just a never-ending flow
of fun stuff to talk about. I know we've got good stuff to share today, as always.
Yes, we do. Why don't you kick us off?
Licensing, something everybody's super psyched about.
But I think you will find this project interesting.
And I don't know how you'll receive it, but I was like, wait a minute, what?
This is odd.
So this project comes to us from Tom Nyhoff.
And he sent this in and said, you know, it occurred to me that we have licenses for things like PyTest.
So I could go search for PyTest.
And over on GitHub, or my programming lens, over on GitHub, I could check this out.
And what is the license?
Well, it looks like the license is MIT.
So if I want to use PyTest, I'm buying into the MIT license, right?
Yeah, kind of.
Sometimes.
Only if you ship with it.
So let's go ahead and put PyTest.
That's true.
But, you know, there are libraries like Request
or whatever that you might, you know, ship, right?
So I'll just put PyTest in here to see what we get.
So this project is called Python Project Insight,
and it only has about 5,300 packages parsed in so far.
But the idea is you can say, load the dependencies,
and it'll show you the licenses.
So for example, for PyTest, we have the MIT license, but PyTest depends upon packaging
and import lib metadata and Colorama and PyParsing and Adders and typing extensions.
Well, packaging has the Apache license. Colorama has the BSD license. Adders has MIT license.
So does PyTest.
And then the Python Software Foundation has typing extensions.
So I don't know.
What do you think of that?
It is interesting.
And I don't know what to do with it.
I don't either.
I'm like, wait a minute.
I have to kind of sort of consider the transitive closure of the dependencies for their licenses.
And I had never really, I'm sure people are there.
Well, of course, Michael, of course, that's how it works.
But for me, I hadn't really thought about it.
I look at the project or the library and it has this license.
Like another one could be that you would build on before,
more likely would be like requests.
So if we load the dependencies for requests,
you have Apache, BSC, MIT, and Mozilla
split across that one project.
So yeah, I just think this is pretty wild.
I'm pointing out that TensorFlow was one of the more wild ones.
If you load up TensorFlow, there's just lots of different licenses here.
Like sample the GitHub licensing options, basically.
So if I was shipping a commercial product with python that used a whole
bunch of dependencies i do know that these this transitive closure stuff the stuff that i'm
actually shipping with i really am supposed to uh list those and have those licenses listed
and somewhere right in a sense because you are shipping the the dependencies of a thing in order
for that thing to work right yeah so um so you're at least saying
i'm using this it's here and here's the license for it i think that's the case i'm not a lawyer
of course um but the there's a whole bunch of these tools like pytest for instance that we use
that we don't ship those are those are a different story um and that's kind of a different license
thing um but i i don't know about the packages. Are these like the packages that these are shipping? They're there. They're not really
being sold. But do you have to list the licenses of the things that you're depending on? I don't
know. I don't know either. I think maybe in some times it doesn't matter. But if it was GPL rather
than LGPL, right, for example, that might be something you care about.
You know, I don't know.
I would love to hear people who really understand this super well if they could like maybe tweet at us or comment on the YouTube stream or something like that about exactly what that means.
But I do think it's pretty interesting information.
Like mostly this shows the licenses, but also shows the total size of installing the project
and what libraries it depends upon so you can kind of like poke around with that as well
that is that's actually pretty useful and interesting information as well that you don't
really think about is how big how big of a download do i get if i put all these things
all these things together so yeah yeah and you can pile them up. So you can say, I'm using TensorFlow. I'm using SKLearn.
I'm using Request or whatever.
Then you can say like, okay, for those three,
tell me about what the story is.
You know what I mean?
Yeah.
Then it gets a little more interesting still.
I guess maybe that's not quite right.
But that just comes with SciPy.
But anyway, yeah, something like that, right?
Yeah, neat.
So anyway, thanks, Tom, for sending that in
and sharing it with us. Well, i think i'll switch gears a little bit and talk about data
classes so i actually really like data classes have you used data classes much mike michael
some they definitely have some very neat properties i find myself kind of when i'm on the edge of
using a data class i'm like maybe Pydantic but
Frozen is a cool option you can add slots slots makes so many things awesome in terms of lower
memory usage faster attribute access all kinds of things and if it's just slots equal true on the
class definition that's kind of nice yeah it is um so uh Trey Hunter is a Python trainer, and he came up with this cool tool on his Python
morsels site called the undata class. And it's actually also a library that he released,
a little tool that's undata class. And the idea is he was thinking, what would be the equivalent
of a data class? If you didn't write a data class, if you wanted to have the same sort of
functionality, what would you do in a normal class so he's got this cool tool down and the example
shows yeah it shows here uh slots uh just a point with xyz all floats and also shows frozen sets and
slots but i'm gonna turn those off um and you just change the class and it changes the output. And it like, he like prints out what an equivalent class would be if you didn't, if you didn't use data classes.
So actually I'm not, and I, and I tried to make sure I understood all of this.
So one of the things that it's kind of neat that it just, it's part of a learning tool that he's got, that it shows you, you know, what you get with data classes.
But there's not a lot of description around like what all this means so this is sort of a fun thing to help you look up stuff i guess so
right off the bat if we just have x y and z you have a dunder and net that takes x y and z's
as input values and assigns them and it comes with a nice repper class and then an eq a dunder eq
which is uh for equality um and one of the things i knew i wanted
to look up was um to make sure i understood is uh what it does is it says if if if the other thing
if i'm gonna be getting compared with something else if that other thing is also my same type
in this point point in this case point uh then then you can do the the equality comparison
otherwise the rais are not implemented
and that's just kind of a convention because python um and then what happens is uh python
will try to call eq on the other thing of like reverse the order and stuff because it's kind of
how python works but it's one of those hidden sort of things is you need to kind of know that if if
you if you don't know what to do in an eq class
or an eq function um ray is not implemented and then python goes from there um and then uh
resetting though uh if you if you give it uh slots all the slots does is add slots to it um and that's
it which is kind of cool and what slots does yeah And what slots does is it makes it so that you can't add later.
So if you can't add a W attribute later to your point.
But then if you do frozen, it does a whole bunch of stuff.
Oh, you get a whole bunch more Dunder methods.
But mostly these are just raising exceptions so that, you know,
if you try to change it, it raises exceptions.
So anyway, this is kind of cool. Yeah. do you see the uh dunder init the constructor implementation when you add frozen
it doesn't say self.x it's a it calls set adder like behind the scenes and then it implements
set adder and dell adder and raises exceptions if you try to mess with it pretty well that's cool um the we're also going
to link to a couple um a couple articles that uh that trey wrote about he wrote about this
about how he wrote this and well one of the things i really i'm bringing this up
partly because i like data classes and it's kind of cool for people to learn what they are
but in his developing this he says he came up with
having a great use case
for the match case,
new match case blocks in Python
using Sentinel objects,
which I'm not sure
what he's talking about there.
So I'll take that.
Look at that.
Using TextRap dedent,
which I love.
And it's nice to see
somebody else using that.
Slice and then AST.
So he's using AST in here. So it's kind of a cool, fun that. Slice. And then AST. So he's using AST in here.
So it's kind of a cool, fun example of using that.
Anyway.
Cool term.
Yeah, a lot of cool stuff in action there.
Go back to the first one, the first tab you got there.
Yeah.
One of the things I appreciate from this example is you just say class point,
X colon float, Y colon float, Z colon float.
Yeah.
Put the data class attribute on it.
Look how much it's doing for you, right?
It's not just the typed values,
but it's protecting the read-write ability,
making it read-only.
It's getting a repper definition.
It's getting a hashability, equality,
not quality effectively by, all right,
there's a lot of cool things it's adding for you there.
Yeah, and he's-
You can appreciate the data class.
He's suggesting doing other stuff
like using keyword only and fields, different fields to see if you can change how it works.
But yeah, I'll have to play with this more.
And a reminder to everybody that data classes are almost enough, but you need more.
We'll also look at adders because adders is kind of a superset of data classes.
Right. Yeah. Fantastic. That's great. Cool. cool all right brian the next one i got here this one's for you okay
all right all right uh so let's go back we'll take a two a two-step process to approach this
did you ever use links l-y-n-x yeah like a long long time ago ago. I remember SSH. I know, I think I telnet it into the mainframes back at the university and I'd run L, Y, and X.
This predated the graphical web.
I mean, it's insane, right?
But it's a browser that is pure text in the terminal.
Today, we have all these fancy browsers.
But one of the things you had a lot of was like keyboard shortcuts and other types of things you could do, right? Yeah. Well, now that it's 30 years later, what if we could
go back to a time a little bit like that? So I want to introduce you to the Qt browser, Q-U-T-E
browser. Okay. Okay. So what is this? The Qt browser is also like kind of in need of a homepage
refresh, but it's a keyboard focused browser
with a minimal GUI. And what's interesting is it's built with Python. Okay. So it's a full web
browser built with Python. And it's kind of like a, like a Vimper or one of these other ones that
lets you do Vim like control and behavior of it's a little bit like a little bit like links,
but it's actual, actually
Chrome, more or less, at least the Chrome runtime. So this one was sent in, I want to make sure I
give him credit for giving a shout out. This was sent in to us by Martin Boris and it's, it's pretty
neat. So it's a browser. Let me switch up my screen share just for you for a sec. Stop. And then I'm going to add the Qt browser.
You ready? Where is it? There. All right. So look at this bad boy. So this is the browser.
And how do I go to places? Well, I can click on things like here's a link I can click on.
But if I want to go somewhere, I press O and it pulls up a place I can open. Look at this.
I got my history. I want to go to like, I'm going to go to TalkPython.
If I want to do a command,
I hit colon
and here's all my commands.
I've like my tab,
my GIF focus and control
and so on.
Over here I just type F.
So if I want to,
if I want to navigate,
for example,
I'm here on the TalkPython page.
What if I want to go to courses?
I type F
and then everything,
see how everything gets a letter above it? Oh, that's pretty great. Yeah. So L, D, D,. What if I want to go to courses? I type F and then everything, see how everything gets a letter above it?
Oh, that's pretty great.
Yeah.
So L, D, D, G.
If I want to go to D, I just press D
and then we're off on the TalkPython training site
and so on.
So I could open, or I could say open,
and then I could search for PyTest
and it'll pull up my tests and so on.
And I can do a new tab.
I got to remember how to do that.
Yeah, we're going to say tab clone. And I i come over here i know there's a bunch of good commands that i'm not following like very
much like if i was actually using vim yeah if i could search for pytas book i could come over here
right like that and i can hit um is it control or windows uh control oh that's a good book yeah i
heard that's a good book so i can like cycle through my tabs, see how minimal my tabs are and stuff there.
Oh, yeah.
It's in the bottom.
It's got all these little commands.
So anyway, I can type colon Q, boom, we're out.
Nice.
What do you think of this?
Yeah, what do you think of that?
I actually love the Qt browser.
I haven't used it much,
but I definitely know about it
because Florian Bruin, who started Qt Browser,
he's a PyTest core contributor
and also one of the technical reviewers
for the PyTest book.
So really cool guy.
But I love the idea of being able
to just use a browser with a keyboard
and not have to touch the mouse at all.
That's like, that's next level.
It's pretty neat.
Yeah.
Yeah, let's see.
Out in the audience, Kim Van Wyk.
Hey, Kim.
Says, I resigned myself to using a mouse more than I want to.
QBrowser may be the way to go.
Thanks for the tip.
Awesome.
Yeah.
And Alvaro says, are those VS Code shortcuts?
I suppose only if you have the Vim bindings set in VS Code.
But then, sort of, yes.
Well, of course you do.
Why wouldn't you?
What are you, a monster?
Can you even do Emacs bindings?
I don't know.
You could do non-Vim bindings.
Yeah, right.
But then people would look down on you, right, Brian?
I don't do Vim stuff in mine.
I know that you probably do, though.
Yeah, I use Vim everywhere, especially in VS Code.
So, nice.
But I think people should check it out.
It's kind of a cool project.
And also it helped push forward some PyTest things.
We got some new features because of this.
Yeah, that's great.
I installed it with Homebrew, so that was easy to install.
You can install it with Apt on Linux.
I'm not sure about Windows.
But they've got a quick start guide, so you can follow along to see like you know what what you might want to
do like it's it's not super obvious no that cheat sheet cuts do is uh i have a eye chart
e-binding it's a bit of an eye chart i suspect you consume it there you go it's still small
it's still small but um yeah i do like like the navigation, pressing F and then just a letter to navigate instead
of using your mouse to follow the links.
That's pretty cool.
Do you remember those templates that people used to have back in the day for office tools
where they would overlay?
You would put them, it was actually an overlay on your keyboard.
Yeah, it would go over the function the function keys to the so you can remember which functions did what during what
application if you switch to word you put a different or probably word perfect at the time
you put a different template over it and yeah yeah i'm gonna use lotus one two three give me
the function key overlay yeah yeah okay yeah i'm just yeah just like that. It is showing how old I am. So let's talk about
something new. Still teach that in college. Yeah. Although in college I had to, I had to teach,
I was a, um, a TA for like a computers one-on-one class, but during grad school and links was one
of the things we had to teach. And I was like, nobody's going to use this. Yeah. But it was
part of the curriculum
incredible yeah so that's awesome anyway so let's uh switch to something new like async so um oh
yeah uh i think we've talked about court probably several times uh and court is a it's like flask
but it's async um it actually is the is the uh does the entire it supports the flask api or i think and sort of
looks the same but it's async instead but there's a problem super close you can basically everywhere
you have the word flask if you replace it with the word court it more or less works so like
lower clay like import lowercase f flask you import lowercase court if you create an object
capital f flask you use capital court and then. If you create an object capital F flask,
you use capital court, and then it lets you do async basically.
Cool. But there's an ecosystem around both of them now. So there are extensions to flask.
Some of them work on court. There's extensions to court. I don't know if any of those work on flask,
but the people behind both of them kind of are supportive of the whole thing. And so port is actually now part of the pallets project was,
is the big news.
And pallets is the,
the project that includes flask and a whole bunch of other stuff.
But it,
because of this,
it will help maybe the maintainers kind of work together a little bit better and smoother to iron this out. So the big difference, of course, is that Flask has a whiskey server behind it.
Server, right word?
And Cort is ASCII, so asynchronous.
But this is cool.
Well, why do we care a little bit is that it used to be that really you had to do async if you wanted async you had to do court but now flask
as a flask 2.0 you do have some uh some async capabilities but it's still using a single
threaded server so there's there are some limitations. So kind of interesting to
read about this. There is a async and await age on the flask website that talks about really what
the trade-offs are, what the performance and the background tasks and how to do that within,
without shifting to court, but then also talks about at some point you might want to just switch to court instead.
Along this line is,
I was thinking about this partly
while I was looking at this other article
from Steve Pate that called
should you use async on your next Python web application,
which I wanted to bring this up because I was curious about what your take on it
was.
Well,
the first part is it's a really nice history.
It talks about the history of web server interfaces with Python,
with,
uh,
with the timelines and,
and whiskey and ASCII.
Um,
and,
and then how async IO came in into play and how,
uh,
you vehicle is popular and unicorn.
I don't know how to say that.
Um,
I'm pretty sure it's G unicorn cause it's short for green unicorn.
Okay.
So the last bit should still be pronounced unicorn.
So I'm going to go with G.
Okay.
And then there's hyper corn,
which is the asynchronous,
uh,
web server.
That's similar.
Uh, anyway, so it talks about this, but then at the end, the conclusion, it talks about all the different frameworks.
And the conclusion is most people don't need async on their web server. And I was curious
what your reaction to this conclusion is. I have some thoughts, but let me pull up some first. Okay.
So here's my thought. It depends. It depends on how far you need to push it towards the edge. I
was surprised how far you can get without async in terms of concurrency. Okay. So I recently did
an in-person class. Imagine that over Zoom, but live in person. I actually have some more to say about
that. It's kind of related. But anyway, I just did a course with some folks who are doing fast API,
and they said, look, this async stuff that we're doing adds some complexity to the way that we got
to write code. We're not sure whether or not there's a trade-off. So what we did is we actually
ended up writing a fast API app with the the sync and the async version
of sql alchemy and then using a sync and an async version of fast api endpoints okay okay with the
database that we had as the back end and the database was not the limiting factor because it
was at like 10 cpu while this was happening. It was just chilling. Yeah. But with a real database, Postgres as the backend,
what we found was we could do,
I can't remember this right.
Oh boy.
I'll give you, I can certainly give you the relative bit.
So with the synchronous version,
we got way more scalability than we thought.
So it was like 75% performance of the async version so that seems way higher
because the database had like most of the things we were doing just waiting on the database but
because we were running in g unicorn with uvicorn workers i was really just in g unicorn with threads
you know python doesn't do threading well except when it's listening on a network socket or doing
a few other things that will release the gill.
And guess what?
When you're talking database,
you're listening to network socket.
So there's all these points
that naturally free up the threading.
And actually got us like 75% of the way there,
but we still got 25 to 30% more performance
out of the async version.
And it was like, I think it was five worker processes
running on my eight core machine,
talking to Postgres. And we were getting some like, I think it was five worker processes running on my eight core machine talking to
Postgres. And we were getting some like, you know, like 2000 requests per second versus 1500 a second,
or maybe it was 1000 1500, something like that was a lot of requests per second. But we did get
more performance out of the async version. So my depends is like that last 25 are you like that close to your performance i would
say 95 of the web apps are not maxed right they're not maxed out with like multiple servers trying to
deal with it all right 95 of servers are are doing important work but they're probably still have a
lot of capacity left so it's like it depends are like are do you need that last 25 or does it not
really matter yeah yeah and also uh like that's those are my thoughts what's the load like on your typical i mean what
are your levels anyway right so um if you if you already have that like for instance if you already
have an application running um you can measure it and see see what your load is looking like
and how many people you have and then if you you, if you think, Oh, I might,
I might increase my, what if we double, um, then you can kind of guess what your load's
going to look like if you double and stuff. So interesting. Uh, yeah.
I recommend people check out this Locus thing because it's so easy to say a typical user clicks
on the page between five and 15 seconds. They might go log in some of the time. They might go hit the homepage.
They might hit the about.
And then you can say,
I would like to see how many users I can take.
And if you're 10x what you need,
you know, it doesn't matter
whether you use async or not,
but there is a performance benefit.
It's just not as massive as it might sound.
The other bit that I want to like point out
is the one statement that that like it depends on
what you're using also like i can't can't find the the bit here but it he was talking about how
um one application he had he was thinking about oh i might i might do async except for he was
using a payment gateway that didn't have an async version so he had to use a synchronous for that
and since it's synchronous
somewhere you kind of have is this true if it's synchronous somewhere you have to be synchronous
everywhere or is that not really true you know if sorry say that if it's sync async it's async
everywhere or sync it's sync everywhere uh either one is either one of those true if i like if i
have a if i've got an application and and i do need to hit a gateway that's synchronous, do I need to, if I isolate it, I guess I can probably do asynchronous and hide it that way.
Yeah, I mean, you just don't get as good a scalability there and you kind of block up the processing if you do the sync.
For the async one, you can do like a wrapper where you say like, we're going to do some async work, but I'm just going to call that and block because all the other stuff above it doesn't want to deal with being async.
Yeah.
So it's easier to go from sync to async to like have part of it be async.
The other way around is a little more tricky.
It can mess it up a bit.
Okay, cool.
Yeah.
Nice.
Interesting conversation.
Thanks a lot.
Absolutely.
It sure is.
Is that it?
Is that all of our items?
Are we? I think. Is that all of our items are we i think that all of our items i think so yeah yeah what you got any extras for us i don't
no okay i have some let me uh let me pull them up here locus look let me tell you about it now
it's great all right no i have three things i want to tell people about number one is i did a talk
at python web conference the htmx and flask one that i've done in some other
places but that was a fun talk like a 45 minute flask plus htmx goodness there and so that video
along with all the other um python web conf 2022 talks are now on youtube so people can check that
out cool did you know that um the python web conference had five days and i think it was like four or five
tracks all day so there are a ton of videos there's like 150 videos or something on there i mean look
at this scroll bar here it's probably gonna like um page as i get to the bottom too yep you look
at that so there's a lot of talks that people can come check out if they're interested in that
that's one of them being htmx that i did yeah i want to i want to watch your talk you've given that a couple times have
you yeah yeah i've gave it a couple times basically the way it worked is like when i was working on
that course and really like playing with those ideas i submitted to a bunch of conferences and
those conferences were either a year out or they were like a month out or something right that's
how they ended up so spread out but the other one is i mentioned the the browser that was fun but how about the browser asaurus okay a mac os only tool but
there's probably something like it for the others so here's the thing suppose i'm in um typora which
is a markdown editor or i'm in a powerpoint and it's got a link and i click it by default it opens
in the default browser.
But depending on what you're doing, you might want it to be like, oh, sometimes I wanted to open in
Vivaldi, but other times I wanted to open in like, say the Qt browser or Orion or some odd
thing like that. Right. So the idea with this thing is that you click a link and when it opens
up, instead of opening in the default browser, the browser asaurus is the default. And then you have keyboard shortcuts like F for Firefox, E for Edge, S for Safari.
And you say, well, which one do you want to open in right now?
And it basically just delegates to the different browsers you register it with.
So you can hit T for Tor or F for Firefox when you click a link.
That's kind of cool, right?
That is pretty cool.
Yeah.
I haven't been convinced that I would use that or or not but um i do do appreciate and i i feel like maybe someone sent that in and
if they did i really appreciate it but uh yeah i don't have any notes who sent it in so anyway
that's pretty cool if you if you find yourself you know copy link going to different browsers a lot
and you're on mac i know that's like a a small a rapidly decreasing vin diagram but if you're in
that space this might be a cool option for you yeah um was it written with anyway typescript on mac i know that's like a a small a rapidly decreasing vin diagram but if you're in that
space this might be a cool option for you yeah um was it written with anyway typescript mostly
okay so speaking of browsers i just found this because i was like is links dead can i use
something like links now and there's there's a there's a browser called browse which is a text
based browser so that's still a thing cool i had to try this out oh my gosh i love it that it
kind of has text but it it like eight bit pixelated yeah it takes the images as pictures but it kind
of it takes the images and makes them look like what you would get yeah so i'll have to give this
a try yeah and you've run it in docker of course you do all right pretty. Pretty cool. All right. Oh, let's yeah. Go ahead. One more before
we get to our joke. Okay. The other one is I talked about doing a live class. So I actually
have an announcement for a live class that I'm doing. So obviously people know I have a bunch
of online courses and of course I'm going to keep, I'm already working on the next one of those and
we've got a bunch coming there, but I want to try some experiments, some,
something where people can, um, attend a class in person with other people, right. If they, um,
sort of help each other along. And I've tried this before this cohort thing, but I think I've got a
better platform, a better way to do it. So over at, um, so link I'm going to put in the show notes,
I'm doing a fast API and MongoDB. So basically fast API,
PyTantic, Beanie and MongoDB course
that is going to be a four day,
six day course over two weeks.
And it has a couple hours a day.
And I have a bunch of people there
working together on some fun stuff.
And I'll be live teaching every session.
So it's going to be like a live course
as if you were attending it in person,
just remotely because it's 2022
and it's not, I guess it's not post COVID all the way.
But anyway, it's got a really cool set of topics
that we cover.
It talks about Async.
It talks about Mongo, Beanie, Pydandic,
FastAPI, of course.
We even use Locus at the end to test it out.
I think this would be fun.
This looks great.
Cool.
Yeah, awesome.
I think it'll be fun too.
I think it'll be neat to have this experience with people.
And I've tried this before,
but all my prior attempts were,
they were good, I think,
but they were like,
yeah, take the online course
and then we'll do like a community type thing.
This is like a live course that I'm just teaching
one off for that group of people that sign up. So we'll see how that goes. If it goes really well and people
love it, then I'll do more of these. If not, then maybe less of them. I don't know. We'll see how
it goes, but this is happening August 8th to 19th. So it has a real date because it has a real live
aspect to it. Nice. Cool. All right. And Mario on the audience says, that's my stack right there.
Oh yeah, that's a good stack right there.
There's some really good stuff to talk about there.
I've been using Beanie and FastAPI for stuff
and obviously Mongo.
Yeah.
Speaking of courses, one question out there,
how's the PyTest course going?
It is going.
It's creeping forward,
but life has gotten in the way. And we'll get it out.
It's awesome that you're having, yeah, it's awesome that you're working on that.
It takes a while to create a course, doesn't it?
Longer than I thought. I'm like, man, I already wrote the book.
I can totally pop a course out like a couple of days.
Of course. Would you say that like as a junior developer,
you might think about this differently than after somebody has been doing it
for a while?
Yeah. I just, this cracked me up. So I can't remember. It's a great joke you got here.
On somebody shared on Twitter. Sorry, I can't, I don't know who, but okay. So in a job interview,
you've got somebody gets asked, where do you see yourself in five years? And the junior developer
in this interview question, like shows a picture of like, you know, the black hoodie with multiple screens and light up keyboard.
Just, hey, I'm in hacker zone.
Five screens.
Yeah.
Totally coding.
Yeah.
Senior developer, where do you see yourself in five years?
On a farm.
Pumpkin farming with cows and apples.
And you know what?
I'm about done. love it yeah i my my
personal thoughts are why not both this is just a view of the inside his office and then outside
working from home man that's right working from home yeah all right i have uh maybe the one that
preceded that the one that or maybe is in between these two that might precipitate the second.
Okay.
All right. So this is a tweet
from Programming Humor.
It's a strange language,
that JS.
JavaScript is such a strange language.
Nobody can understand it,
but if they manage to,
then they create their own framework.
Yes.
Everyone's got their JavaScript
front-end framework
or something like that.
Yeah.
And you know you've made it
when the framework you've invented
starts showing up on job requirements.
That's right.
With four years experience
when it's only two years old.
Exactly.
Yeah.
Well, good episode, Michael.
Thanks for showing up again.
You bet.
Fun as always.
Thanks, everybody.
See you later.
In the Slack and everything.
Bye.
Later.