Dan_Shappir:
Hello everybody and welcome to another episode of JavaScript Jabber. Today on our panel we have AJ O'Neill. Hi AJ!
Aj:
Yo yo yo, I'm coming at you live from the coronavirus of Sphere.
Dan_Shappir:
Why? Were you infected, AJ?
Aj:
I think that I have some sort of coronavirus or rhino virus
Dan_Shappir:
Hmm
Aj:
or one of the viruses that causes your lungs to be. Ah! Ah! Ah!
Dan_Shappir:
Well, you look fine, so feel well in
Aj:
Oh
Dan_Shappir:
any
Aj:
yeah,
Dan_Shappir:
event.
Aj:
I look great today. But last week.
Dan_Shappir:
You always look great, AJ. So I'm Dan Shapir, coming to you from Tel Aviv. I'll be your host today. And today we have a really special guest, one that I've been wanting to get on our show for a long time and finally all the stars aligned and so she's here. This is Netta Bondi from Israel. Hi, Netta, how are you?
Netta:
Hey guys, I'm good, I'm doing well. I feel like that was an intro I could never live up to. But other than that,
Dan_Shappir:
Ha!
Netta:
other than that making me nervous, everything is fine.
Dan_Shappir:
So Neta, before we talk about
Netta:
Um,
Dan_Shappir:
the topic
Netta:
Dan,
Dan_Shappir:
that
Netta:
sorry,
Dan_Shappir:
you
Netta:
hang
Dan_Shappir:
decided
Netta:
on a second.
Dan_Shappir:
to discuss...
Netta:
Can you hear me? Um, it looks like my, my screen is still uploading and I'm, I'm just worried that that's gonna, that that's gonna affect my, the, the quality of the recording. Okay, good.
Dan_Shappir:
AJ, can
Netta:
Perfect.
Dan_Shappir:
you check? OK, it's
Netta:
No,
Dan_Shappir:
upload
Netta:
it's,
Dan_Shappir:
pose
Netta:
it's paused.
Dan_Shappir:
now, right now.
Netta:
Yeah. Yeah.
Dan_Shappir:
Excellent. OK, so we'll continue. So Neta, before we get into the topic of our conversation today, can you give us a brief introduction about yourself, who you are, what you do, what you're famous, or infamous, or whatever, and go ahead.
Netta:
Okay, yeah, I'm a senior developer, senior front-end developer at Twang, which is a small startup that aims to enable people to do more with voice. So enable people to do more with voice platforms like Alexa. We basically want to make voice apps as prevalent and accessible and everywhere. web apps. So I'm a senior front-end developer. I'm also a JavaScript enthusiast. Can you call it that? I'm not... my path to programming has not been standard. I didn't do sort of a lot of the things that people usually do to get into programming. You know, whatever computer science degree or in Israel there are some other things that people usually do to get into programming. And I sort of stumbled upon JavaScript by mistake and I loved how democratic and egalitarian it was and I love it to this day. I'm also a speaker. I speak at JavaScript conferences a lot. And that's it I think.
Dan_Shappir:
Yeah, I would like to mention that you're indeed very active in the Israeli tech scene and fairly well known here and also really active about representation of underrepresented minorities in the tech scene in general, which is also a great thing that you do. And so I'm really glad to have you here on our
Netta:
And
Dan_Shappir:
show.
Netta:
you should just do all my intros. Every time I need to
Dan_Shappir:
And
Netta:
do it, I'll
Dan_Shappir:
recently
Netta:
ask you to write it. Ha ha. Thank
Dan_Shappir:
talking
Netta:
you for watching.
Dan_Shappir:
about
Netta:
I hope you enjoyed this video. I'll see you in the next video. Bye.
Dan_Shappir:
For sure, I'd be glad to. I'd be happy to. In any event, I understand that the topic that we're gonna be speaking about today is a topic that you also fairly recently discussed at a conference here in Israel in a talk that I was privileged to attend at the React Next conference, which is about software development as a craft, whether it is a craft or whether it's an art or whether it's engineering or some sort of combination of all of the above or something else entirely.
Netta:
Yeah,
Dan_Shappir:
we're
Netta:
I
Dan_Shappir:
going
Netta:
think
Dan_Shappir:
to be
Netta:
so.
Dan_Shappir:
talking
Netta:
Like
Dan_Shappir:
about
Netta:
you
Dan_Shappir:
today.
Netta:
said, there's a lot of interesting questions there. Is it a craft? Is it engineering? What does it mean to be a craft? How do you hone your craft to fit as a craft? What does it mean to be a craft person? So yeah, this is a topic I think, I feel like this is a topic that is, it's not discussed as often as I would like, because I think craftsmen, and mastery are very important for anyone doing, you know, any type of job long-term. It's, I feel like it's almost a human need to wanna be a master of your craft. And I don't think we look at engineering in that way, often enough, and I don't think we know well enough, what does that mean, and how we can aspire to it, and how we can work towards it. And so these are a lot of questions that I've been asking myself and other people and I figured I'd come on here and I'd ask you. Maybe you'll have the answers for me.
Dan_Shappir:
I'm really glad that AJ is here because AJ has fairly firm opinions on this topic. Like I said before we started recording, after I watched you give your talk, I actually came up to you while you were still on stage. And I told you to check out the Zen of Python and the Go Proverbs and stuff like that. And the reason that I even know about these things is in fact, thanks to AJ, who has mentioned our show several times in the past. So AJ, I'll give you first go. What do you think? Is software development a craft?
Aj:
It can be. It depends on the person because to one person, it, I mean, it's anything, right? You know, you pick up some paint brushes, you know, is finger painting a craft versus is oil painting or water painting. You know, as a kid, you do water paints. That's because they wash out of your clothes and stuff. So that's what your parents get you. Water painting can be a craft. but it can also just be, you know, silly distraction for children. And I think that the programming, there are people that all they want to do is just be code monkeys. If they can go in, copy and paste from Stack Overflow, get paid and leave, then they are happy to do that. There are other people that want to discover the more streamlined process and to optimize around certain trade-offs. And I think that when you are strongly considering why you do what you do and eliminating practices in order, some set of practices in order to have more consistent reproducible outcomes, that is where you're in the realm of engineering. And I would argue the engineering of programming is the craftsmanship because you could also, you know, look at our, you know, story of Mel, right?
Netta:
What's the
Aj:
And you
Netta:
story?
Aj:
could say, well,
Netta:
I'm sorry, I feel like I'm missing something.
Aj:
Mel was a craftsman. And to an extent, that's true, but he wasn't being an engineer as much as an artist in the story that we were told.
Dan_Shappir:
Oh, okay. So a while back we had Tomer Lichter on our show. I think you know him as well. He used to work with me at Wix. And he built an entire website and did a lot of research around a story about the history of programming. We had an episode about it, so we can put the software developer, programmer, perhaps engineer, who worked back in the 50s on one of the early computers that existed back then. And he was like the early form or prototype of a hacker. And he wrote a certain software for that system, an actual Blackjack game, which kind of stretched the beyond that he actually kind of took the platform to the limit and did some things that he didn't necessarily or technically needed to do but did them just because he could because it enabled him to create software as art as it were which again will go goes to the definition of craftsmanship in what that means and then he was asked to actually change that software so that it would lose so that people playing against the system would be happy because it was used as a way to drive sales and he kind of refused to do it and then somebody else was tasked to do it and there's a whole story around it and I would recommend to you and our listeners just to check out that episode. But the point that AJ is bringing up I think is that you know, Mel was an engineer in the sense that he was able to build that software and get it to run. on a system that was hardly capable of doing that, but then he took it a couple of steps beyond and actually created optimizations that were not required or not necessarily required, again, just because he could and just because it produced what he considered to be more beautiful software, which actually made it almost impossible for anybody else to actually understand what the software was doing on the inside. And it's interesting because I have a bit of a story of metal of my own way back when in the day, like more than a decade ago, and I'm showing my age, before Wix, before then I was actually coding in C++. And that was back when generics were making their way into C++, sorts of things with templates in C++. And STL, the standard template library, was introduced into C++. And I was tasked with writing a certain bit of software for the company that I was working at. And I knew that I was on my way out, that I was going to be leaving. And I wanted, I don't recall if I've yet told people that I'll be leaving, but it was my plan. And I was like, with doing this final thing before I left, and I decided to use that project as a means to learn and understand generics
Netta:
Thank
Dan_Shappir:
and
Netta:
you. Bye.
Dan_Shappir:
STL. So I wrote that software in the most advanced and sophisticated C++ possible. I pity the person who would need to support that software after I left. But you know, to be blunt, at that point in time. And like I said, I really wanted to learn C++ templating in generic. And the software did work. All the tests passed. It did everything that it should. It's just that the code inside was incredibly complicated and probably a lot more complicated than it needed to be.
Netta:
Thank you. Thank you.
Dan_Shappir:
or not building that software, I was being a craftsman or a craft person or an artist or an engineer or just a dick. And so yeah, that's my own personal story of Mel, as it were. And yeah, but you know what? I think it's worthwhile to actually look at the dictionary definition And looking, you know, Google is my friend, I looked it up and it says that craft is one, an activity involving skill in making things by hand. And they give an example, the craft of book binding. I don't think that exactly matches software development, although you know it's interesting because we do type with our fingers. And the second part of the definition is a skill used in deceiving that's interesting. And the example they give is her cousin was not her equal in Gal or in evasive craft. Yeah, it's interesting. So I think we're looking more at the first part of that definition of an activity-involving skill. Let's leave the making things by hand to the side for a bit.
Netta:
Um,
Dan_Shappir:
So
Netta:
yeah,
Dan_Shappir:
is software
Netta:
I think,
Dan_Shappir:
development
Netta:
um...
Dan_Shappir:
an activity-involving skill? I definitely think that
Netta:
I
Dan_Shappir:
it
Netta:
mean,
Dan_Shappir:
should be.
Netta:
I think
Dan_Shappir:
Unfortunately,
Netta:
when
Dan_Shappir:
it isn't
Netta:
I talk
Dan_Shappir:
always.
Netta:
about craft, I talk about, because here's the thing that to me is difficult. First of all, I wanna say in regards to definitions, right? I'm gonna mispronounce this name and I'm sorry, but I've only ever read it and I don't think I'm saying it right, but there's a guy called Donald. It's K-N-U-T-H who wrote the art of computer programming. You're both nodding, so I'm gonna say it's okay. Okay. Okay. Yeah, I'll go with that. I couldn't figure out how to. And he talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks. He talks.
Dan_Shappir:
Donald Knuth I do I do I don't I don't think the case totally
Netta:
Okay,
Dan_Shappir:
silent.
Netta:
that explains
Dan_Shappir:
I think
Netta:
it
Dan_Shappir:
it's
Netta:
perfectly.
Dan_Shappir:
Donald Knuth
Netta:
Yes.
Aj:
It's like the H after a
Netta:
So it's
Aj:
W.
Netta:
so that's silent, right? You're like, you're like talking to two non
Aj:
You
Netta:
native
Aj:
know,
Netta:
English speakers and we're like, wait,
Aj:
what
Netta:
is which
Aj:
versus
Netta:
which one of those is correct?
Aj:
what?
Netta:
Like which one of those is right?
Dan_Shappir:
Yeah, anyway, yeah
Aj:
Well, it's, it's,
Netta:
Oh.
Aj:
so there's a, what is it, Hot Rod? Anyway, there's
Netta:
Thank
Aj:
this
Netta:
you.
Aj:
movie
Netta:
Bye.
Aj:
where they make fun of people who say what the English way? Because why are you saying that that way?
Netta:
So
Dan_Shappir:
well
Aj:
Why
Netta:
he's
Aj:
am I saying
Netta:
Donald
Dan_Shappir:
there's
Aj:
that
Dan_Shappir:
also
Aj:
what
Netta:
Knuth
Dan_Shappir:
stewie
Aj:
way?
Netta:
in
Dan_Shappir:
there's
Netta:
the
Dan_Shappir:
also
Netta:
UK
Dan_Shappir:
stewie on
Netta:
and then
Dan_Shappir:
family
Netta:
Donald
Dan_Shappir:
guy
Netta:
Knuth
Dan_Shappir:
cool
Netta:
in America.
Aj:
Yeah, there you go.
Netta:
That's
Aj:
Yeah.
Netta:
my
Aj:
So
Netta:
takeaway.
Aj:
I think that's more the British anyway. That's sorry weeds.
Dan_Shappir:
Yeah, yeah,
Netta:
Okay,
Dan_Shappir:
rabbit hole.
Netta:
I'm so glad we got that. I'm so glad we got that, just right.
Aj:
Yeah,
Netta:
So
Aj:
so he's
Netta:
he
Aj:
newt
Netta:
talks
Aj:
over here,
Netta:
when
Aj:
but...
Netta:
he, so he
Aj:
Kk...
Netta:
wrote
Aj:
Kknooth.
Netta:
the Art of Computer Programming, like he wrote the book called The Art of Computer Programming. And he actually talks, found the speech of his that he talks about why he called it an art, right? Why do you call it an art when we, when it's a science, right? It's computer science or it's computer engineering, and these are sciences. And he says two things that I really resonate with me, and to me sort of he says is that science is knowledge we can teach a computer and if it's knowledge we can't teach a computer if there's like a certain kind of like magic. That was what I thought but I was like I'm not going to say it because it's just because it's just so I don't even know. Yes.
Aj:
Je ne sais quoi!
Netta:
But it is, but it is what he says. He says like if this is something that we cannot formulate to teach a computer, we call it art. And then he says
Aj:
No,
Netta:
we go on
Aj:
that's
Netta:
and we
Aj:
what
Netta:
say
Aj:
it is. It's a certain
Netta:
science
Aj:
je
Netta:
is
Aj:
ne
Netta:
superior
Aj:
sais quoi.
Netta:
to art because it can be quantified, because it can be taught, because it can be organized in a very logical way. But then he says, I think computer programming is an art because I view art as the applicable, the way that we use science, the way that we use knowledge in a way that is practical and applicable to actually make things. And he gives the example of chemistry versus cooking. He says, chemistry is a science. We know for a fact what will happen when we whatever bring together two different kinds of elements. forward. But, yeah, the Hebrew speakers think it's elements.
Dan_Shappir:
Yes.
Aj:
Well, it's so...
Dan_Shappir:
or chemicals,
Aj:
No,
Dan_Shappir:
whatever.
Aj:
it's not about the elements of the chemicals. It's that chemistry is really interesting because there is only science in the pure sense, science in the sense of knowledge. With chemistry, there is no prediction. You can never know what a combination of any two chemicals will yield because the results are always essentially random. We've come up with certain categories. So for example, we know that if you add oxygen to something, it will oxidize. depending on what it is. So we know that there's certain catalysts, but we don't know what the result is, right? So you couldn't have predicted that when you add oxygen to copper, it's going to turn green, or that when you turn oxygen to iron, it's going to turn red. We knew that something was going to happen because oxygen does stuff to stuff, but we didn't know what was going to happen, and there's no way to predict it. Likewise with metallurgy. So if you do soldering, there's no way, It's only through experimentation, electronics, the gallium, what is the, what's gallium? I want to say gallium nitride. Is that what it is? The gallium nitride chargers that just came out? There was no way of predicting that we could have created that charger. Just somebody happened to mix gallium and nitrogen together in the right combination. And then, boom, we got something that was more efficient than traditional silicon for doing power supplies. So chemistry is really interesting
Dan_Shappir:
Thank you.
Aj:
because there's no predictive nature of it or the predictive nature is just so incredibly small. People spend their entire careers mixing different combinations of petroleum and caustic chemicals to try to find something that will be powerful and not give people cancer and brain damage, you know?
Dan_Shappir:
I think the interesting point in the context of software development is that, again, I'm going to your definition or Knuth's definition, is that there are certain obvious basic tenets of computer science as engineering. It's interesting whether or not everybody in the field is actually knowledgeable and aware of them, but that's kind of a separate discussion, but they exist. when you are aware of them and even when you apply them, a lot of time, like in a sort of a similar way to the way that AJ described chemistry, you're doing a lot of investigation and research. One of the things that is kind of unique from my perspective to software engineering compared to essentially any other field of engineering is that all of us are kind of building new things that never existed before. We you know It's kind of a stretch because at the end of the day you might say that you know the majority of web sites and web Applications are more or less doing the same thing, but still at the end of the day when you're You get the requirements from a particular Customer there's a certain uniqueness there and the the solution that you'll come up with is
Dan_Shappir:
world would come up with. So there's a certain aspect of innovation and uniqueness to effectively any software engineering project out there. And that's kind of why I love it. And that's kind of what differentiates it potentially
Netta:
I mean,
Dan_Shappir:
from
Netta:
I think
Dan_Shappir:
other
Netta:
a lot
Dan_Shappir:
forms
Netta:
of the times,
Dan_Shappir:
of
Netta:
so
Dan_Shappir:
engineering,
Netta:
when I was building
Dan_Shappir:
I think,
Netta:
this talk to React Next that we talked about, I actually
Dan_Shappir:
in
Netta:
looked
Dan_Shappir:
an
Netta:
at
Dan_Shappir:
extent.
Netta:
a lot of inspiration from architecture because I actually do think that the similarities there are pretty interesting. And again, there's this kind of like very subtle, slash even non-existent line between what, when is architecture engineering? And when is it craft, art, something that is, and it could also be both and or either one of these things, right? Like we all know that you can build a house and you can make it very functional and you can make it whatever, I'm imagining the houses in Tel Aviv, which Dan you probably know and AJ you might not know, but they sort of all look the same these little boxes and they're fine and people live in them. It's one of the most expensive cities to live in in the world. Like people pay a lot of money for that, but it is just engineering versus if you look at something that has a bit more of just inspiration to it. And I actually do think that there is similarities to when you look at code because code can do what it needs in a lot of different ways, which is kind of what you said then, right? But it can code that is inspiring, that is beautiful, that is clever, that is simple, that is something that... Have you ever had that experience of looking at code? Yeah. I think I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it. I've seen it.
Aj:
Well, clever and simple, clever and simple are diametrically opposed. It... It... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's... It's...
Dan_Shappir:
Well, yes and no. And I'll give a concrete example that recently happened to me. So as part of my job of trying to get stuff to work faster, I get to review a lot of code. I basically, like half of what I do is going into software projects where I don't, I'm not familiar with the software, try to figure out how it works, what it does, and see if I can somehow get it to work faster. And I recently actually did a change for a code, not with the intention of making it faster, but making it better or nicer, simply because what I saw really annoyed me. So what I found, so there was this bit of React code, which mapped information received from a CMS, from a headless CMS, into a visual representation constructed from components. So what they had there, was effectively a huge, not effectively, literally, a huge switch statement, which there was like a component type field which was read from the CMS, like here's the component type, here's that data for the component. So there was this huge switch statement of mapping those component identifiers to the actual component function calls, JSX and what I saw is that all the components were effectively almost all of the components were instantiated in exactly the same way. So what I effectively did is I replaced this huge switch statement with with a lookup table. I basically used, you know, the fact or a dictionary actually would be a better term. I basically created a dictionary that maps identifiers to the component functions, and you know a component in React is just a function reference. So, and once I had this map in place, I could basically just instantiate, I would use the key to do a lookup in the dictionary, get the component function back, and then just instantiate them all the same, exact same way. And what more, to the previous implementation had this huge import statement at the beginning where it explicitly needed to import all of the components. I basically looked at the namespace itself as the dictionary, so I imported the namespace, so now I don't even have the component names anymore inside of that code that does instantiation. So the code became...
Aj:
That sounds a little scary.
Dan_Shappir:
Why?
Aj:
Well, when you need to grep for it, where are you gonna find it? It's a little scary.
Dan_Shappir:
Uh, grab for, grab for what? The implementation
Aj:
for the
Dan_Shappir:
or
Aj:
name.
Dan_Shappir:
the youth? Well, the implementations exists. Uh, why, what, but.
Aj:
Okay. Good, keep going on, keep going on.
Dan_Shappir:
But the bottom line is that I reduced the code size dramatically. I eliminated a whole ton of code duplication. And I also eliminated coupling because now the code that instantiates the components doesn't even need to know which components it's instantiating because they all instantiate exactly the same. Now, the code works exactly the same way. is before. I don't think it runs faster, I don't think it runs slower,
Dan_Shappir:
more or less runs the same. It's probably the download is probably a little bit smaller, but not, you know, to make a difference. I think it's more maintainable, but I'm guessing that some might argue about that. But I definitely think it's
Netta:
Yeah.
Dan_Shappir:
nicer. But nicer is subjective. So, yeah. do a good thing. I mean, the feedback that I got from the people was really positive. They were really happy with the change I made. They're the ones that going to need to support this going forward. By the way, another one of my privileges is that after I make these changes, I leave. I optimize the code and then I walk away. But the people that need to support the code actually approve the PR. They were really happy with it. Some of them I did it and you know why this actually works which I was glad to do but again the question goes back to the fact of you know was this a good thing or not was the previous code bad I mean it worked
Netta:
Mm-hmm.
Dan_Shappir:
so yeah.
Aj:
To me, that seems like the reasonable thing to do. I mean, I'm very much bought into what can't see DODs, put a name to, ah-ha programming, avoid hasty abstractions, which is kind of the, write everything twice and dry, the middle ground between the two. So, if you're doing a switch statement and you got two or three things, great. I have a switch statement. and they're all the same, then I think that what you did probably makes more sense. The only potential criticism I have is that, I mean, this is how JavaScript works, right? This is event handling. You created an event handler. It gets an event. When it gets an event, it passes the arguments, the result of the event is a component. That's what
Dan_Shappir:
Exactly.
Aj:
you did. That's the way JavaScript is built. But the only downside I see to that, is just the downside that all event systems have, which is that it is more difficult to determine where something was called, because it's defined in one place, it's registered somewhere, and the place where it's registered is often not where the call site is, because you often have the registering or listening object being passed around in the code. And so when you go to see, you know, okay, was the call site where this thing happened. If you're lucky and you get a good stack trace, then you can say, oh, it happened exactly here. It was this instance of it. But if you're looking through error logs and you get something that's just the message and you see the event name, but you can't tell where it came from, then, you know, then it's, it's a pita.
Dan_Shappir:
Well, what I can say about that is that it's React. So if you're going to be looking at call stacks, you're kind of screwed either way. But there is another potential downside to what I implemented, and I've kind of mentioned it before, is that you need to be cognizant or knowledgeable about the way that JavaScript operates, the fact, or even React, the fact that a component and that the function reference is something that you can store in a dictionary. Those are not necessarily things that every JavaScript developer is actually aware of.
Aj:
That's a problem. That is a huge, huge problem if people don't... I think true craftsmanship is understanding the basic principles and being able to reduce things down to core fundamental principles. And I think that one of the biggest problems that we have in the world, just it doesn't matter which industry it is, because it's not just software, it's all over the place. People lack fundamental understandings of what the basic building blocks are and do. The number of people you'll encounter that have been programming for years that can't do recursion is scary. This is something that's, it's just so fundamental. Knowing what a function is, knowing what an object is, knowing what an array is, knowing the, you know, the other four or five different types of values depending on how you count, you know, big num is a new thing. Just having the discipline to focus
Netta:
I really agree
Aj:
on
Netta:
with that
Aj:
the
Netta:
idea
Aj:
atomic
Netta:
that
Aj:
parts,
Netta:
knowing the building blocks is
Aj:
I think is a key
Netta:
key.
Aj:
to craftsmanship because then you can do things like what you said,
Netta:
I don't
Aj:
where
Netta:
know.
Aj:
because you know
Netta:
I always have
Aj:
really, really basic
Netta:
kind of,
Aj:
stuff, you can simplify things without having to add complexity.
Netta:
we
Aj:
And so, I
Netta:
live
Aj:
think
Netta:
in
Aj:
that's
Netta:
a
Aj:
a
Netta:
world,
Aj:
good thing. I think that's a good thing.
Netta:
certainly the world I live in. In front end, it seems like it's always about the newest abstraction, right? It's always about how can I level up, can I put something on top of what is the basic technology that I'm using to make it, I think people believe they're making it better. I think people believe they're making it better. I honestly think that it's all, like intentions are always good. It's always about making it better. It's always about seeing a problem with something and saying, I think it would work better if we did it this way. But the problem is we're so
Aj:
Different
Netta:
used to
Aj:
they're making
Netta:
reaching
Aj:
it
Netta:
for
Aj:
different
Netta:
an abstraction now. That's fine. You know, I have, I say this a lot about, and this is, I think this is an unpopular opinion. I've gotten mixed responses to it, but I say this a lot about UI libraries, UI component libraries. It's something that is so easy to reach for. You get, you know, you pull one of the big ones in and you get everything out of the box. And then you spend the rest of your time working on that application. it, trying to make it work the way you want it to work. Because it was never meant, because that was never exactly what you meant to build to begin with. But we're so used to reaching for the abstractions and we're so scared of having to position a tool tip, right? Of having to do things that should be sort of like the bread and butter of our work. I'm sorry, position a completely regular div on your screen. Just a div, just position a div on the screen. I'm so sorry.
Aj:
Why
Netta:
With
Aj:
would you have a tooltip?
Netta:
CSS Grid, you know, like
Aj:
What kind
Netta:
it's
Aj:
of
Netta:
just,
Aj:
monster
Netta:
it's funny
Aj:
are you?
Netta:
because we also get better and better abstractions
Aj:
Ha ha ha!
Netta:
within our sort of native tools, right? like, you know, CSS is amazing for that. It's just, I remember what it was like when I first started,
Aj:
Position
Netta:
you know, and
Aj:
at
Netta:
I,
Aj:
Diff,
Netta:
and
Aj:
what
Netta:
you'd
Aj:
kind
Netta:
have
Aj:
of monster
Netta:
to put
Aj:
are you?
Netta:
this, this would have to be relative and this would have to be absolute and then you'd have to put it and they, and everything would move everything else around on the screen and you'd put stuff in tables just to make it sort of like look like a grid and we've got all that today built in. And we still bring in bootstrap or like tailwind and them whatever too. I don't know what the obstruction is. It's retro!
Aj:
Tailwind
Netta:
Yeah.
Aj:
is the most mind-boggling thing to me. Cause I look at it, it's like the number of keystrokes are the same. You could have written this, you're typing the same words as the CSS. You've got the same number of keystrokes. But maybe that's another topic for another time. I'm not sure if you can see this, but I'm not sure if you
Dan_Shappir:
It's
Aj:
can see this.
Dan_Shappir:
about naming things. It's
Aj:
It's got the same names.
Dan_Shappir:
basically living in a world where instead of using CSS attributes, properties, and values, you just have class names for everything. But again, we're going down a rabbit
Netta:
Mm-hmm.
Dan_Shappir:
hole. I totally agree, Netta, with everything that you said. And there's another
Netta:
OK,
Dan_Shappir:
aspect
Netta:
but
Dan_Shappir:
here, I think.
Netta:
I'm sorry, but
Dan_Shappir:
And
Netta:
can
Dan_Shappir:
that's
Netta:
I just
Dan_Shappir:
the fact
Netta:
say,
Dan_Shappir:
that,
Netta:
this is
Dan_Shappir:
a
Netta:
not
Dan_Shappir:
lot
Netta:
a problem
Dan_Shappir:
of the systems
Netta:
with the system.
Dan_Shappir:
that we're currently
Netta:
This is
Dan_Shappir:
working
Netta:
a problem
Dan_Shappir:
with
Netta:
with the people
Dan_Shappir:
on the front
Netta:
using the
Dan_Shappir:
end
Netta:
system.
Dan_Shappir:
at least
Netta:
The
Dan_Shappir:
seem
Netta:
web
Dan_Shappir:
to be
Netta:
is amazing
Dan_Shappir:
on the surface
Netta:
for being
Dan_Shappir:
at least. They
Netta:
so
Dan_Shappir:
are
Netta:
accessible
Dan_Shappir:
extremely forgiving,
Netta:
that you could open
Dan_Shappir:
which
Netta:
up
Dan_Shappir:
means that
Netta:
a
Dan_Shappir:
you
Netta:
tab
Dan_Shappir:
can build
Netta:
on your browser
Dan_Shappir:
a really
Netta:
and start coding.
Dan_Shappir:
bad system
Netta:
I think that's amazing. I
Dan_Shappir:
and
Netta:
think
Dan_Shappir:
it
Netta:
that
Dan_Shappir:
still seems to work.
Netta:
we want to keep that. We want
Dan_Shappir:
Oh,
Netta:
to keep
Dan_Shappir:
go
Netta:
that
Dan_Shappir:
for it.
Netta:
quality. I don't want to put more obstacles in the places just want to start building web pages. But it is our, and again, that's a question because I can also value people who can build things really fast or solve things really quickly. And they use tools, they use libraries to do that. But I do think that if you're interested in being a craftsperson and you're interested in honing your craft, it is your responsibility to sort of go beyond that. But I don't think the problem is that it's easy. I think it's good that it's easy.
Dan_Shappir:
Yeah, so just to... I'm not saying that it's easy. To clarify what I'm trying to say, so the web was built very much on the concept that is known as the robustness principle, which to quotes means be conservative in what you send, be liberal in what you accept. That's why you can send fairly broken HTML to the browser and the browser instead of displaying some sort of an error message, basically tries to display it that you intended to do, which is usually what you really intended to do. That's why you can not close your divs and it'll still work and stuff like that. HTML is very lenient, CSS a bit less so, and JavaScript the least of them, but it's still really lenient compared to many other programming languages. Just because you don't need to compile, and stuff works. And now we've got TypeScript as being more strict than JavaScript is, and a lot of people are actually happy about that. But again, going back to my point, the thing with the web is because of its fairly lenient nature, you can build systems which have pretty bad architecture and implementations on the inside. work. I remember a story actually not about the web but about the compiled program. I don't remember which programming language it was built in. So my friend of mine worked as a consultant for some company and he told me that they were shipping their product in production for several years now and they could only get it to run as a debug build. They could never get it to work as a production build. In some of these when you're in debug, variables are automatically initialized to zeros, whereas you're running in production in order to save cycles. It doesn't zero the memory, so it can cause crashes. And there are other aspects as well. This is just one example. So they were shipping a debug program to their customers, not because they wanted to be able to debug in the field, simply because the production system never actually worked. But you know, they were selling, they were making money. Customers were, I presume, pleased with the software, otherwise they wouldn't be paying for it. And I'm seeing a lot of it on the web. You know, if you effectively open up the Dev console in effectively any SPA that you wonder to, you will see a ton of errors being written to the console and people are fine with it.
Netta:
Thank you. Bye.
Dan_Shappir:
And, And you know, so the
Netta:
Oh.
Dan_Shappir:
question
Netta:
Oh.
Dan_Shappir:
is, does this indicate poor craftsmanship or maybe it is fine, maybe if it works, that's good enough. I
Netta:
Hmm.
Dan_Shappir:
don't know. What do you think?
Aj:
We say if it fits, it ships.
Dan_Shappir:
Ha ha ha!
Netta:
Wow,
Aj:
That's the USPS, the United States
Netta:
I
Aj:
Postal
Netta:
love it.
Aj:
Service
Netta:
That's a perfect
Aj:
motto
Netta:
metaphor.
Aj:
a few years ago. They said if it fits, it ships because they were, and so basically you could deform the box in any way you wanted. If you could somehow get the thing in the box, it didn't matter. You buy a prepaid box, if you had all in any way, shape or form, manage it to get within the confines of the box, it ships. It's not a bad thing. It's a bad thing. It's a bad thing. It's a bad thing. It's a bad thing. It's a bad thing.
Dan_Shappir:
So you're reminding me of, yeah, it is. I need to remember that one. And it reminds me of this excellent video that I've seen a number of times on Twitter where there's
Netta:
Yes.
Dan_Shappir:
this presumably a female engineer looking at somebody playing like fitting, you know, there's this Charles game where you have shapes and you need to fit them into holes. You know what I mean? like it can be a triangle or a circle
Netta:
But I think
Dan_Shappir:
or
Netta:
it
Dan_Shappir:
half a circle. And
Netta:
just
Dan_Shappir:
they
Netta:
brings
Dan_Shappir:
fit
Aj:
in
Dan_Shappir:
every, they're
Aj:
the
Netta:
us
Aj:
square
Netta:
back to this
Aj:
hole.
Netta:
point that it's about
Dan_Shappir:
exactly
Netta:
people
Dan_Shappir:
like
Netta:
and it's
Dan_Shappir:
this.
Netta:
about sort
Dan_Shappir:
Everything
Netta:
of,
Dan_Shappir:
goes in the square hole. And she
Netta:
if
Dan_Shappir:
literally
Netta:
you
Dan_Shappir:
starts
Netta:
care
Dan_Shappir:
crying
Netta:
about
Dan_Shappir:
at a certain
Netta:
what it
Dan_Shappir:
point
Netta:
is that you're
Dan_Shappir:
in time
Netta:
doing,
Dan_Shappir:
because she just can't cope
Netta:
is probably
Dan_Shappir:
with the fact that they're sticking
Netta:
the
Dan_Shappir:
everything
Netta:
strongest
Dan_Shappir:
into the square hole.
Netta:
indicator
Dan_Shappir:
But everything does
Netta:
of whether
Dan_Shappir:
fit in the square
Netta:
it'll
Dan_Shappir:
hole.
Netta:
end
Dan_Shappir:
So
Netta:
up being
Dan_Shappir:
you know, why not?
Netta:
well-made or, and there's two things here, right? Like, first you have to care, like you have to want to actually make it, good, you know, or not just sort of fit it and ship it. But then there's, there's also the question of how and what does it mean? What is good software? What is beautiful software which, which I think you touched on that it could be very subjective, right? Like we could go in and say, oh, I did the smartest, most elegant thing to make this sort of look so much better and the next person will go in and say what can do we curse is this the podcast you curse on what the beep is going on is that no not even that the next person will go in and say what in God's name is going on so I think this whole idea of what is good good software what is beautiful is also very tricky. And we started talking before about this idea of simplicity and what is simplicity in code. And I think even if you were to zoom in on that, it's incredibly difficult to pinpoint because some people will say simplicity is, have as little code as possible, right? So let's minify, let's name all our variables letters and let's write these concise arrow functions and the next person going in, it looks like a minified JavaScript file, right? So even this idea of simplicity is something that I think is difficult to sort of reach and agreement about. What does that mean?
Aj:
I disagree to an extent. I mean, I agree to a large extent because there's variants. But I think that it's the, we know what's bad, so don't do that. That leaves a whole area of things that we don't know if they're bad. But there's a huge chunk that we can just, we can just cut right down this side and say, okay, we know this is bad, so don't do that. And if you look at what has succeeded in the hardware world, it has been the ARM processor, the risk processor, reduced instruction set. So the way that Apple devices such as the M1 have outperformed Intel devices, and this is not new technology, Apple just put a new spin on it by putting it in something that's desktop class, pro-class stuff, but you focus on the fewest number of instructions accomplished a task. And this is done at the silicon level. This is done at the, I don't know what you'd call it above the silicon level, but the logic that's in the circuit. So typically you build a circuit with either, uh, either P gates or in gates. I don't remember which ones, the more prominent one, but basically, if you only manufacture P gates, then, or then you can use those in series. You can construct, um, and or ZOR. possible part of logic just by using one, not gate, transistor, just by using one type of transistor and connecting it in different configurations. So from a manufacturing process down at the silicon level, it's better to be really, really, really, really, extremely good at just producing the one type of transistor rather than for efficiency to use fewer transistors by using the other type of transistor to, you know, so instead of having
Dan_Shappir:
I think
Aj:
to put three
Dan_Shappir:
I lost
Aj:
transistors
Dan_Shappir:
you in
Aj:
together,
Dan_Shappir:
your
Aj:
you just
Dan_Shappir:
analogy
Aj:
use one.
Dan_Shappir:
a little bit, AJ.
Aj:
Well, I'm working up. Okay, so that's at the silicon level, is that you basically, they just make one type of thing instead of two types of things, and you could make all of it with either, but if you use both, you could use fewer, you could have fewer. But the manufacturing process at the SIGOPPA level, then if all you need to do is addition, you don't need multiplication, because you can just add over and over again, and you don't need multiplication. You can just add a certain number of times, that's what multiplication is. So there's all these little efficient things you can do to do better multiplication and and so on and so forth. So I think that even our processor support multiplication I could be wrong about that but but there's there's a reduced set of things where if you say well If I just take this building block and I reuse the building block I have a simpler system than if I create a more complex more quote-unquote optimized System and so at the end of the day you'd think well if it's not optimized And, but we find out that that's not true because the ARM processor has, has proven this. Apple's processors have fewer instructions. They use less heat, which means, which means they have to do more work, right? So because there's fewer instructions available, it has to run more instructions to get the same work done. But yet, because the entire process is simpler, the manufacturing is more accurate and the, hone so it can do the instructions faster. So even though it has to do more instructions, it can do them more quickly. So it's fewer instructions and then anything that is really complex rather than saying, well, let's try to, you know, make more instructions. This is what Intel did. Let's just make more instructions to make more operations faster. What Apple did was say, okay, well, we're going to have a decoder chip. I mean, this is what's necessary for phones, right? You have to have your radio chip. You have to have your, your audio decoder,
Dan_Shappir:
Again,
Aj:
video
Dan_Shappir:
AJ,
Aj:
decoder.
Dan_Shappir:
I apologize for interrupting you, but I think we're going into too much detail about architecture. If I understand correctly, your point is that less is more, that the simpler you make things and the fewer types of operations that you have and use, the better the results that you get. Is that what you're trying to say?
Aj:
Yeah, like in the physical world, this works better. And with mental load, the fewer symbols your brain has to parse, the fewer things you have to keep in working memory, the more quickly you can cycle through the things that you understand. So if you have a limited character set of, say like English has 20 characters, it's not as efficient, but it's a heck of a lot simpler than the Chinese character set that has 20,000 characters.
Dan_Shappir:
Oh yeah, I totally agree with that. But again, if I'm using your kind of analogy, it seems to me that that's not necessarily always the case. I mean, if you look, for example, at programming languages, you will find that the programming languages that are the most popular are generally not the most minimalist, optimized programming languages they are. They are. They are. They are. They are. They are. They are. They are. They are.
Aj:
popularity
Dan_Shappir:
They are. They are. They are.
Aj:
has nothing to do with it.
Dan_Shappir:
I would contend that popularity has everything to do with it, because at the end of the day, we are working in the real world, and the software systems that
Netta:
Thank
Dan_Shappir:
we
Netta:
you.
Dan_Shappir:
encounter are likely to be constructed using the popular programming languages and frameworks and not using the mathematically purist ones. Otherwise, everybody might
Aj:
Well,
Dan_Shappir:
be coding
Aj:
it's,
Dan_Shappir:
in Haskell
Aj:
it's, oh,
Dan_Shappir:
or something.
Netta:
and
Aj:
I would
Netta:
even
Aj:
hate that.
Netta:
even
Aj:
I don't
Netta:
our planet.
Aj:
think, but, but that's popularity has no correlation to craftsmanship. By definition, most things are junk, right? Look at the universe. Most of the universe is junk. All that we can see, we have never discovered anything in the universe that isn't space junk, right? Except for our planet. That's the only thing in the whole universe we've yet discovered. So if you look at
Dan_Shappir:
It's not in the great
Aj:
So,
Dan_Shappir:
state. Ha ha ha.
Aj:
so you have the Pareto distribution, right? So whatever is most popular, whatever is most abundant is the chaos. It's the entropy. It's the things that are the least organized and least well suited.
Dan_Shappir:
But here's where I somewhat disagree with you. Because when I, like I said, I go into a lot of software that is preexisting and I try to improve it in certain ways. But one of my prime directives as it were is to remain consistent with the software. I try, like if the software is written, I'll give a concrete example. One of the things that I hate about the way that a lot of people writing quote unquote modern JavaScript is that they define functions using const and arrow. I'm talking about named functions. They do, let's say they want to create a function called calculate value. They will do const calculate value equals and then an arrow function definition
Aj:
The
Dan_Shappir:
instead of simply using the function keyword.
Aj:
Well...
Dan_Shappir:
And it drives me nuts. I hate it. We discussed this in the past, so I won't go into why I hate it. People can listen to our previous episode on things about in JavaScript to avoid, where I explain my position. But my point is this, if I go into some pre-existing software, and I see that it's totally written in this way, in the way that I dislike, if I add a function, I will use this format. the one that I dislike. I won't use the one that I prefer with function. And the reason that I do it is to avoid the cognitive overload or overhead for the future person that might be reviewing this code and asking themselves, why is 99% of this software written this way and that 1% written a different way? Maybe there's something special about this 1%, maybe it needs to do things differently. I need to try to figure it out. No. the exact same way and I just don't want to create this cognitive overload for them. So I'm intentionally writing code which I consider to be less pretty, less readable, just in order to avoid these inconsistencies in the existing code base.
Aj:
But that doesn't go against what I was saying earlier. I mean, I agree you're keeping to a constraint that was pre-existing, but that doesn't make that code more craftsman-like.
Dan_Shappir:
No, my point was different. My point is that the majority of software developers out there like programming languages that are multi-paradigmatic, like JavaScript, like C++, and they prefer it over more purist languages, like a scheme or a Lisp or whatever. So, yeah, I think
Aj:
Whoa,
Dan_Shappir:
that's
Aj:
whoa, whoa,
Dan_Shappir:
a good point.
Aj:
whoa, you're going, you're going, you're going the, you, you went the wrong
Dan_Shappir:
But
Aj:
direction
Dan_Shappir:
yeah,
Aj:
there.
Dan_Shappir:
but but
Aj:
ZIG, Rust, Go,
Dan_Shappir:
Yeah, JavaScript
Aj:
Original
Dan_Shappir:
is
Aj:
JavaScript.
Dan_Shappir:
way more popular than Go, but you know, like
Aj:
Well,
Dan_Shappir:
it or
Aj:
JavaScript
Dan_Shappir:
not.
Aj:
is... So, I mean, the word popular there, that you have no other option.
Dan_Shappir:
more software is written in JavaScript than it is being written in Go. And people
Aj:
Well, yes,
Dan_Shappir:
are.
Aj:
but that that is okay. So let's take rust rust is the most loved language year over year over year on stack overflow. It's the most loved language. It's not the most popular. It's the most loved popular is the constraints. Nothing. I'm assuming constraints that require a person to use something, make it popular by the literal definition. Not that we vote for this because we like it. But. it is in wider use. And being in wider use is not an indicator that more craftsmen prefer this or that this has a specific advantage. A lot of times it's historic. JavaScript is not most popular because people love it. No one loves JavaScript. That's why we have React and TypeScript and all these other
Dan_Shappir:
Oh,
Aj:
languages in Elm.
Dan_Shappir:
I think you're conflating a couple of things. I think what people dislike that they might not be able to express the distinction, but what people dislike that drove them towards React is not so much JavaScript, it's the DOM. And part of the problem is that a lot of web developers don't actually make the distinction and are not necessarily aware of where the DOM starts. JavaScript ends and the DOM starts and vice versa. doesn't change that fact. I will add one thing before
Netta:
Thank you.
Dan_Shappir:
I conclude
Netta:
Thank you.
Dan_Shappir:
this discussion and drive
Netta:
Thank you.
Dan_Shappir:
us to PIX because,
Netta:
Thank you.
Dan_Shappir:
you know, we're getting along there with the time. And that's that when I started coding, the field was much smaller than it is today because I'm old. And it was mostly populated by people who were really, really into it. There used to be a saying like, you know, how a real programmer, and again, you know, what even, what does that even mean, but a real programmer is constantly surprised at how much people are willing to pay them to do something that they would do for free. And to a great extent, that was true back in the
Netta:
Thank
Dan_Shappir:
day.
Netta:
you.
Dan_Shappir:
What I'm seeing these days is that a lot of more people are doing it for
Dan_Shappir:
a living. It's not what consideration. The primary consideration for choosing programming is not the fact that they necessarily love programming, is that the pay is good. And that's a legitimate thing. When in the past, when I've expressed, you know, the first times that I encountered it, I kind of expressed a surprise about it even to an extent.
Netta:
Thank
Dan_Shappir:
And
Netta:
you.
Dan_Shappir:
I was told that what I was doing, border is on gatekeeping. And you know what? It's kind of true. And these days, much more accepting to the fact that there are a lot of people in software. You know, when I encounter that, I
Netta:
Yeah.
Dan_Shappir:
try to instill a joy of programming into them. But I accept the fact that maybe it's not the most important things in their life. They have other concerns and that's fine. But I think that does have implications to what we consider to be the craftsmanship of software. Anyway,
Aj:
That
Dan_Shappir:
that's
Aj:
opens
Dan_Shappir:
my
Aj:
up,
Dan_Shappir:
rant.
Aj:
I mean, you've just, you can't end by opening up a whole new can of worms here. Because if, what is craftsmanship if there is not a passion or a drive? How can you have craftsmanship without, how can someone who, I mean, software programming is, it is going to become more prolific. There is going to be a lower and lower and lower level. You know, there's going to be more no code. So software programming is going to become much more diverse, shall we say. But if you are working, excuse the poor analogy, but if you're working at McDonald's, are you a, what, the craftsmanship of cooking, are you, if you're clocking in and clocking out at McDonald's, are you a craftsman? really a place for craftsmen there versus if you're looking at Ruth Chris Steakhouse and being a chef there. I mean, there's a difference in kind between somebody who got a job because they don't see a lot of alternatives. There's a lot of people that enjoy working at McDonald's, but I think the overwhelming majority,
Netta:
But we have
Aj:
at least
Netta:
both,
Aj:
in stereotype,
Netta:
right? Like
Aj:
if
Netta:
the
Aj:
nothing
Netta:
point
Aj:
else
Netta:
is we
Aj:
is
Netta:
have
Aj:
that
Netta:
both.
Aj:
McDonald's is where you work when
Netta:
And I think that's fine.
Aj:
you're trying to figure things out.
Netta:
We need...
Aj:
So there's a huge gap. between
Netta:
that
Aj:
the person
Netta:
craftsmanship
Aj:
who does something
Netta:
exists
Aj:
because well
Netta:
in
Aj:
it
Netta:
the places
Aj:
gets the
Netta:
where
Aj:
bills
Netta:
you actually
Aj:
paid
Netta:
want,
Aj:
and
Netta:
you
Aj:
somebody
Netta:
have to want
Aj:
who's doing
Netta:
to
Aj:
something
Netta:
do a good
Aj:
because
Netta:
job,
Aj:
they're
Netta:
right? I think like
Aj:
They're
Netta:
that
Aj:
developing
Netta:
is the
Aj:
a proficiency
Netta:
sort of
Aj:
or skill
Netta:
the
Aj:
as we
Netta:
condition
Aj:
gave the definition
Netta:
to it
Aj:
earlier.
Netta:
all.
Aj:
So
Netta:
You wanna come in, you have to make it work,
Aj:
Tell
Netta:
you're
Aj:
me
Netta:
gonna
Aj:
more
Netta:
copy
Aj:
Dan.
Netta:
paste
Aj:
How
Netta:
from Stack Overflow,
Dan_Shappir:
No,
Aj:
how are
Netta:
you
Aj:
we
Netta:
can
Aj:
gonna
Netta:
make
Aj:
redefine
Netta:
it work,
Aj:
craftsmanship?
Netta:
right? But if craftsmanship is about wanting to
Aj:
Well, we have
Netta:
do it
Aj:
both,
Netta:
well,
Aj:
but where is craftsmanship?
Netta:
right? I mean, there's no other way, there's no way around that.
Dan_Shappir:
Thank you.
Aj:
And I would allow for both definitions, doing it well and doing it artistically. I just hope you don't do it artistically in code. I would allow for both definitions, doing it well and doing it artistically. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just hope you don't do it artistically in code. I just
Dan_Shappir:
I would say this, those people who are, there are certain advantages even to those people who are primarily working for the paycheck, as it were. They are less likely to try to do it according to your bad definition of what doing it artistically means. They will likely want to get the job done and beyond their way. I think that, you know, there's the concept of the basic understanding and the fundamentals, then people will want to do a good job, even if they're not super into it, just so that they can deliver and move on to the next task and have an easier time of it. So it's mostly about educating people how to do it properly. And also, I think that in this day and age, people do want to be able to enjoy their job. You know, we've had the great leaving. called because people were basically
Netta:
I actually feel
Dan_Shappir:
said
Netta:
like
Dan_Shappir:
I'm not
Netta:
we haven't.
Dan_Shappir:
enjoying this job so I don't want to do it anymore. So I do think there's a certain sense
Netta:
I mean,
Dan_Shappir:
that if
Netta:
everything
Dan_Shappir:
you can
Netta:
happened
Dan_Shappir:
help
Netta:
at the same
Dan_Shappir:
people
Netta:
time.
Dan_Shappir:
find
Netta:
It
Dan_Shappir:
the joy
Netta:
was very well
Dan_Shappir:
in
Netta:
timed.
Dan_Shappir:
the way that they're doing and doing things
Netta:
Yeah, I
Dan_Shappir:
you
Netta:
just
Dan_Shappir:
know
Netta:
feel like
Dan_Shappir:
teach
Netta:
we actually
Dan_Shappir:
them how
Netta:
haven't
Dan_Shappir:
to
Netta:
spoken
Dan_Shappir:
do things better
Netta:
about
Dan_Shappir:
they they will want to
Netta:
the
Dan_Shappir:
do
Netta:
most important
Dan_Shappir:
those
Netta:
thing,
Dan_Shappir:
things
Netta:
which is
Dan_Shappir:
better
Netta:
how, like
Dan_Shappir:
rather than
Netta:
how do
Dan_Shappir:
you
Netta:
you,
Dan_Shappir:
know sometimes
Netta:
I feel like we've
Dan_Shappir:
they'll
Netta:
barely
Dan_Shappir:
cut corners but
Netta:
touched
Dan_Shappir:
at the
Netta:
on
Dan_Shappir:
end
Netta:
simplicity
Dan_Shappir:
of the day everybody
Netta:
a little
Dan_Shappir:
occasionally
Netta:
bit.
Dan_Shappir:
cuts corners you know.
Netta:
But,
Dan_Shappir:
Anyway take on it.
Netta:
but I,
Dan_Shappir:
No, anything else you want to add?
Aj:
Because we can
Dan_Shappir:
Yeah.
Aj:
Oh, sorry.
Netta:
Yes, Neta, it's fine. Okay. Yeah, I would actually love to continue that discussion. I just saw the link that you sent AJ to the GitHub page, which is actually aptly titled, The Creeds of Software Craftsmanship.
Aj:
I am good to keep going.
Netta:
And
Dan_Shappir:
Well,
Netta:
I think it's a worthwhile discussion
Dan_Shappir:
it's
Netta:
because
Dan_Shappir:
getting a bit
Netta:
I think
Dan_Shappir:
late for us, but for me it just means that
Netta:
a lot of the
Dan_Shappir:
we
Netta:
times,
Dan_Shappir:
need to get
Netta:
even
Dan_Shappir:
you
Netta:
when
Dan_Shappir:
on the
Netta:
you
Dan_Shappir:
show
Netta:
look
Dan_Shappir:
again,
Netta:
at the
Dan_Shappir:
Noah.
Netta:
people
Dan_Shappir:
Neta, what did I call you
Netta:
the
Dan_Shappir:
Noah? Neta,
Netta:
how
Dan_Shappir:
we'll edit
Netta:
to do
Dan_Shappir:
it
Netta:
it
Dan_Shappir:
out.
Netta:
and what should be guiding
Dan_Shappir:
Yeah,
Netta:
you
Dan_Shappir:
I don't know why I got confused.
Netta:
is often difficult to pinpoint. And because it's not, it doesn't exist, it's not common enough in the ecosystem, you often don't find yourself in a place where you have like-minded people that can help you along.
Aj:
Well, that is, I think, one of the great detriments of JavaScript with the benefits of languages like Rust and Go and Zig. You may not like the philosophy and you may not choose to use the language, but there is a philosophy and there is leadership and there is a written description of this is what we believe and why we do it the way we do it. This is, you know, why build yet another programming language. There's already so many programming languages, why build another one? And the languages, I mean, all of the languages that have creeds are the ones that I would consider to be the ones of languages that are geared towards craftsmen. So you have, what's that really wonky one, Scala. Scala has the Scala rationale, which is one of the more esoteric ones in terms of I'm not familiar with that one, and it seems that fewer people are familiar with that one in my experience. But the Zen of Python, GoProv, and GoProv, are the ones that are the most popular in Zinibzig, Rust doesn't really have one, which is kind of strange. Rust actually doesn't have a written, um, this is why, to Rust. Which is... Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust. Rust.
Dan_Shappir:
Yeah,
Aj:
Rust. Rust. Rust.
Dan_Shappir:
but
Aj:
Rust. Rust. Rust. Rust. Rust. Rust. Rust.
Dan_Shappir:
I also think it's a bit of a chicken and the egg thing because the people who are going to be using these programming languages are going to be the ones who are more likely to write properly crafted software to begin with. You will find fewer,
Aj:
that's part of the draw.
Dan_Shappir:
yeah, exactly. Well, it's part of the draw, but it's like a self-fulfilling prophecy. You know, you've got a lot of people going through JavaScript bootcamps. Like the statistics that I like to give is that the median experience of a JavaScript developer or a TypeScript developer these days is three years. So 50% of the developers have less than three years of experience. That's not the situation with Rust. People aren't going through Rust bootcamps. You know, they might only have. two years of experience in Rust, but they probably have way more experience in software development
Netta:
Now, where's
Dan_Shappir:
by
Netta:
the sound
Dan_Shappir:
the time
Netta:
effect
Dan_Shappir:
that they
Netta:
now?
Dan_Shappir:
get to Rust. I recall an experienced developer saying that when he learned Rust,
Netta:
Thank you. Bye.
Dan_Shappir:
he wanted to cry because it was so beautiful and finally expressed so many concepts that he was longing for. You don't hear that about JavaScript. That said, I have to say that I think you can And...
Aj:
I know you can. I've done it. I don't know.
Dan_Shappir:
Yeah, but what, and that finally gets to Neta's point. And that finally gets to Neta's point. What made that software beautiful? Why do you think it was beautiful software? I mean, you said it with such conviction, it means that you knew, you know, that that software that you wrote is beautiful. What made it beautiful? What made it beautiful?
Aj:
being able to, well, it's a little bit difficult because no one writes JavaScript this way. By no one, I mean me and Douglas Crawford and half another person, Dan to some extent, I think actually. But being able to find, you've got the rock and you're chiseling away to find the Michael inside of it. So is that what it was? No, the David, the David inside of it. You've got JavaScript is this huge giant boulder of just blah. But there if you just get rid of the crap beneath is a beautiful entirely usable language. And so when I say that I've written beautiful JavaScript, it's JavaScript that you only have to learn about four or five concepts of JavaScript and you can read all of my code and understand all of it. I have classes, I don't
Netta:
Yep.
Aj:
use turnaries.
Netta:
No, but you
Aj:
There's
Netta:
see it
Aj:
just,
Netta:
like,
Aj:
it's just an entire
Netta:
but
Aj:
class
Netta:
that's exactly
Aj:
of things that
Netta:
like
Aj:
just
Netta:
that
Aj:
aren't
Netta:
brings
Aj:
there.
Netta:
us back to
Aj:
Only
Netta:
the
Aj:
what's
Netta:
definition
Aj:
there
Netta:
of art
Aj:
is
Netta:
versus
Aj:
what
Netta:
science,
Aj:
is
Netta:
right?
Aj:
necessary
Netta:
Because there's
Aj:
to be
Netta:
something
Aj:
there.
Netta:
about it that
Aj:
And that
Netta:
is, that is,
Aj:
is
Netta:
you can't
Aj:
beautiful
Netta:
help but
Aj:
JavaScript.
Netta:
describe it
Aj:
JavaScript
Netta:
in metaphor.
Aj:
that's not encumbered
Netta:
And
Aj:
and burdened
Netta:
I
Aj:
with
Netta:
don't want to do
Aj:
all of
Netta:
that.
Aj:
what everyone
Netta:
I want
Aj:
wants
Netta:
to
Aj:
it to
Netta:
break
Aj:
be,
Netta:
it down. And it's true.
Aj:
but
Netta:
And maybe it's impossible
Aj:
is left
Netta:
with JavaScript.
Aj:
to the
Netta:
Maybe
Aj:
simplicity
Netta:
it was never created
Aj:
of
Netta:
this
Aj:
what
Netta:
way. But
Aj:
it
Netta:
I want
Aj:
was and still is underneath.
Netta:
Thank you. Bye.
Aj:
So, you know, it waxes poetic in a really terrible way. No, it was created this way. It just, I mean, I say this all the time, but just quickly for your benefit, prototype. What does that mean? It doesn't mean class. It means that you are prototyping something. What we today call polyfills, that's what prototype is. Prototype is the first name for polyfill before they subverted prototype to means whatever they wanted it to mean, right? But anyway, JavaScript is a small, which it has been abused and beaten and had a few couple of golden nuggets given into it over the years, but predominantly it's just
Dan_Shappir:
Yeah,
Aj:
been strangled.
Dan_Shappir:
but from the get go JavaScript kind of won against the odds because Brandon Ike when he created the JavaScript in those 10 days of glory, he was really constrained in what he was allowed to put in the language, which you might consider to be a great thing because, you know, great success came from him being limited. But some of the decisions that he did make from the get go were pretty that were kind of, you know, pushed down his throat. Or alternatively that he was convinced, again, given the shortness of time, he, you know, made some poor decisions because he's human. So for example, the whole thing about the implicit type conversions initially did not exist in JavaScript. He added them to JavaScript because people told them that people expected to have implicit type conversions in scripting languages. So he said, ah, okay, if that's what people expect, then I'll add them into JavaScript. So, yeah, not all decisions can be good ones.
Aj:
Yeah, and then there have to be trade-offs, but
Dan_Shappir:
But
Aj:
there's a direction.
Dan_Shappir:
I definitely agree though that in many cases, my response to what is beautiful code is, I can't give a definition, but I know it when I see it. Conversely, ugly code. Ugly code is actually easier to define when I see a lot of repetition, when I see code that has side effects, stuff like that or that you can often tell that the person who wrote the code did a lot of copy-paste coding and wasn't exactly sure what the code actually does. It just seems to work, so we put it there. I'll give a concrete example. I recently tweeted this. I said, code, you're probably doing it wrong. And I stand by that statement. And yet you see so much code comparing inner width to 320, 640, 1024, and then says, well, if it's that, then it's a tablet. And if that's then it's a mobile device and a ton of JavaScript code that works that way. And then they hook up to the resize events and to the scroll events and whatnot. And it's a hot mess. that with clean CSS and media queries, and you don't need all this junk, and people do it, and it seems to work, and they just push it out the door, and yeah.
Netta:
Sure, I think people can reach me
Dan_Shappir:
Anyway,
Netta:
on Twitter. That's probably
Dan_Shappir:
we
Netta:
easiest.
Dan_Shappir:
are really running long on time
Netta:
My
Dan_Shappir:
and
Netta:
username
Dan_Shappir:
Neta, we probably
Netta:
is
Dan_Shappir:
need to bring
Netta:
at
Dan_Shappir:
you over again because
Netta:
underscore
Dan_Shappir:
this is an excellent discussion and
Netta:
bonded
Dan_Shappir:
I think there's a whole
Netta:
underscore.
Dan_Shappir:
lot more
Netta:
That's
Dan_Shappir:
to discuss
Netta:
B-O-N-D-I-T
Dan_Shappir:
and unpack in this context.
Netta:
underscore
Dan_Shappir:
Before we finish
Netta:
before
Dan_Shappir:
and
Netta:
and
Dan_Shappir:
move
Netta:
after
Dan_Shappir:
into PICS,
Netta:
the name.
Dan_Shappir:
if people want to contact you to see your talk
Netta:
I'm,
Dan_Shappir:
or
Netta:
it
Dan_Shappir:
to
Netta:
sounds better
Dan_Shappir:
converse
Netta:
in Hebrew,
Dan_Shappir:
with you on this topic,
Netta:
I think. I think it
Dan_Shappir:
what's
Netta:
makes
Dan_Shappir:
the best
Netta:
less
Dan_Shappir:
way to
Netta:
sense
Dan_Shappir:
reach you
Netta:
in
Dan_Shappir:
if you
Netta:
English,
Dan_Shappir:
want to
Netta:
but
Dan_Shappir:
be rich,
Netta:
in Hebrew
Dan_Shappir:
that
Netta:
it's
Dan_Shappir:
is.
Netta:
actually a nice play on words. Anyway, I'm there. I'm big on Twitter. I'm on TikTok too, are you guys on TikTok? I wanna like my, I was like, should I do a pic on like TikTok? And I was like, maybe not. I'm on TikTok. I'm on TikTok. I'm on TikTok. I'm on TikTok. I'm on TikTok. I'm on TikTok. I'm on TikTok. I'm on TikTok.
Dan_Shappir:
Really cool handle by the way.
Netta:
Oh, you mean self-diagnose?
Dan_Shappir:
Why not? Go for it. But no, I'm not big on TikTok yet.
Aj:
My experience with TikTok is that it helps people create mental health issues for themselves.
Dan_Shappir:
Oh God.
Aj:
Uh, not just self-diagnosed. I mean, just, it
Dan_Shappir:
Stuff
Aj:
seems
Dan_Shappir:
inflict.
Aj:
to be a community. Yes. Self-inflict. It seems to be a community, uh, because people always talk about me. I have friends that tell me, oh, I'm so glad I found my community on TikTok. I'm like, you realize those people are faking it, right? Like they're not actually, they don't actually have the whatever they're, they're acting.
Netta:
I
Aj:
They're,
Netta:
have to say,
Aj:
they're, they're, um,
Netta:
I have to say as
Aj:
uh, what do you call
Netta:
a
Aj:
it?
Netta:
person
Aj:
When you move
Netta:
with
Aj:
the steering
Netta:
ADHD,
Aj:
wheel like this to
Netta:
I
Aj:
indicate
Netta:
actually
Aj:
driving pantomimeing,
Netta:
found
Aj:
they're
Netta:
a lot
Aj:
pantomimeing
Netta:
of useful
Aj:
mental.
Netta:
research.
Aj:
illness.
Netta:
And
Aj:
They don't
Netta:
I mean,
Aj:
actually have these
Netta:
maybe
Aj:
mental illnesses
Netta:
people are
Aj:
and
Netta:
faking
Aj:
they get on there
Netta:
it.
Aj:
like,
Netta:
I don't
Aj:
oh,
Netta:
know
Aj:
I'm so
Netta:
how
Aj:
sad
Netta:
you could
Aj:
today,
Netta:
like,
Aj:
but this
Netta:
there's
Aj:
great
Netta:
so
Aj:
thing
Netta:
much
Aj:
happened
Netta:
that goes
Aj:
because
Netta:
into making
Aj:
and then
Netta:
a TikTok
Aj:
now
Netta:
video.
Aj:
my mental
Netta:
Maybe
Aj:
illness,
Netta:
it's like,
Aj:
it's like,
Netta:
you know, I don't know how you
Aj:
just
Netta:
could stand to do
Aj:
no,
Netta:
that.
Aj:
this
Netta:
But
Aj:
is
Netta:
I did
Aj:
fake.
Netta:
find some
Aj:
It's
Netta:
things that
Aj:
all
Netta:
have been
Aj:
fake. It's making mental illness
Netta:
useful
Aj:
look cool.
Netta:
to me.
Dan_Shappir:
I don't know
Netta:
So,
Dan_Shappir:
about
Netta:
but
Dan_Shappir:
that,
Netta:
I wasn't
Dan_Shappir:
that's
Netta:
actually
Dan_Shappir:
not
Netta:
going
Dan_Shappir:
my
Netta:
to
Dan_Shappir:
area
Netta:
do a pick
Dan_Shappir:
of expertise.
Netta:
on TikTok. I was just,
Dan_Shappir:
All I can say
Netta:
I
Dan_Shappir:
is
Netta:
just
Dan_Shappir:
I'm
Netta:
wanted
Dan_Shappir:
not
Netta:
to
Dan_Shappir:
there.
Netta:
stay on one of the cool
Dan_Shappir:
Yeah,
Netta:
kids.
Dan_Shappir:
go for it.
Netta:
I'm still young. I use TikTok Thank you. Bye. Hmm. Hmm.
Dan_Shappir:
Yeah, but yeah,
Aj:
I have
Dan_Shappir:
you're
Aj:
my account
Dan_Shappir:
not now I
Aj:
so
Dan_Shappir:
feel
Aj:
that
Dan_Shappir:
like
Aj:
a bot can't take it.
Dan_Shappir:
now now I feel like you're mocking me. Anyway, let's let's move into pics. So AJ, you go first.
Aj:
All right, so first I'm gonna start with some just show notes here to reiterate. So we talked about the story of Mel. So we're gonna have that link in the show notes and it goes in the square hole. That's right, the square hole. We'll have that in the show notes and then picks. So creedsacrastmanship.com, this is the website that I am personally curating as I find the best of the best written by software developers, things like 12 factor apps, Zen of Python, et cetera, those are all up at the top. As I find talks, people, a lot of them are the Google or Microsoft or Yahoo or whatever tech talks. But as I find people that are really exemplifying the concepts of software craftsmanship, I put those there. And so some of it's organized up towards the top and then down as you get further down towards the bottom, it's kind of like, oh, stuff. But these are, I think, the best resources on the internet. And if you have one that you'd like to add, please comment with it. And, you know, who knows, I may give it a big fat thumbs up and move it up towards the top. And then I'm also, we talked about this, but I didn't actually say it at the time. And I've picked this before, but Lewis Sullivan, form ever follows function. The engineering comes first, then the art is layered on top. You figure out what function it needs to fill and make sure it fills the function and then you add the flourish. And you can engineer that you're going to have this flourish in there, but you don't want concave buildings that act as magnifying glasses to melt the pavement on the sidewalk for anybody. I've mentioned this several times before, but it's really, really important that we can consider art The art is there for a purpose. And some art is just there to make you happy, but most art, a car can be beautiful, but it has to get you from A to B, unless it's a Lamborghini, in which case, you just ride it around twice and then resell it to another enthusiast because the engine's exploded after about 12 miles or something like that. And then a couple of the better apps delivering universal UI patterns as web components. This is a talk. on the Creed's of Craftsmanship. It's a talk about Elix. This was from the Microsoft Tech Talks. But it's just a really, I don't remember at what point I was thinking about this while we were talking, but this is just a really interesting perspective of the atomic components, basically atomic components that you can use in the browser and how to construct them in a way that they are guaranteed to work. So you don't have, well, sometimes click it, it works. And other times I have to rage click it. And it's just that the guy is describing this pattern of how he identified
Netta:
See you again.
Aj:
what are the fundamental core
Netta:
No.
Aj:
components of interaction and how to stack those components of interaction so that you get interactions that actually work, that aren't buggy, a calendar widget that actually works, stuff like that. And then his implementation of that that principle is called elix, and that's component.kitchen. And then finally, festivus.dev. Have you all heard of this? Festivus.dev.
Dan_Shappir:
You mentioned it on the show before, but so I
Aj:
It's,
Dan_Shappir:
heard it from you.
Aj:
oh, whoops, I don't know what that link was. I just sent, I copied this and it sent a different link. It said, but here is Festivus.com. It is, it is Seinfeld episodes that have been recaptured. So there's no audio, but it's just Seinfeld walks in, he says something to George and it's like, hey, I've been thinking about using NPM modules. NPM modules, I know about that. That's how everybody's making the big bucks. Let somebody else write the code. And then Kramer comes in, oh yeah, yeah, yeah, import the module and all the security vulnerabilities. I mean, why not just let people have remote access to your machine cracks open a soda? It's just they're hilarious and they're fairly lengthy. I mean, it's not just one or
Netta:
Yay.
Aj:
two seconds. It's a minute, two, three minutes long of this dialogue going back and forth about DevOps or programming or
Dan_Shappir:
වවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවවව
Aj:
web development. Hilarious! They're amazing.
Dan_Shappir:
Cool, thank you AJ. So now for my own picks. So my first pick is going to be the fact that as we're recording this on September 20th, today is actually my wife's and my anniversary. So yay for us. And yeah, and thank you, Orit, for putting up with me. And you've made me a much better person and I love you. So that would be my first pick. My second pick related to what we've been discussing today. It's a book I've read a long time ago. To be honest, I don't even remember the details. So hopefully it's as good as I remember it to be, but it's exactly on topic and it's called Code Complete. It was written by Steve McConnell and it talks about the craftsmanship of code, about how to write better code. And as I said, I recall it being an excellent book that influenced me in positive ways. I'll pick that as well. My next pick is, I've mentioned it before, but you know what, I'll mention it again. I'm going to be speaking at the Web Directions Summit Conference in December in Sydney, Australia. I'm really excited about that because I've never been to Australia. And it's looking to be an amazing conference. It has like six tracks. about the React track, on the React track, even though I'm not explicitly or exclusively talking about React, I'm actually going to be using performance data collected by Google from real user sessions to compare the performance of the various frameworks out there, but there are a lot of great speakers there, Tejas who we've had on the show, Vitaly Friedman from Smashing Magazine, and so many more, like I said, six tracks. So there's a ton of content. Obviously if that location, I would love to see you there. And if you're not, I think they're also going to have online access to the conference and to the talks. So that would be my second pick, or actually my third pick, sorry, I got confused myself. And my final pick is that pick I pick every time, which is the ongoing war in Ukraine. It seems that the Ukrainians are actually managing
Netta:
Yeah, I actually,
Dan_Shappir:
are retaliating
Netta:
yes,
Dan_Shappir:
by actually
Netta:
I
Dan_Shappir:
firing missiles
Netta:
went a bit
Dan_Shappir:
at population
Netta:
wider.
Dan_Shappir:
centers
Netta:
So
Dan_Shappir:
and civilian
Netta:
first
Dan_Shappir:
infrastructure
Netta:
off, I want to
Dan_Shappir:
and whatnot
Netta:
recommend
Dan_Shappir:
which is causing
Netta:
a
Dan_Shappir:
even more
Netta:
site
Dan_Shappir:
pain
Netta:
called
Dan_Shappir:
and suffering.
Netta:
CSSBattle.dev.
Dan_Shappir:
So yeah as usual as usual if there's anything
Netta:
It's a
Dan_Shappir:
you
Netta:
website
Dan_Shappir:
can do to help
Netta:
that gives
Dan_Shappir:
please
Netta:
you
Dan_Shappir:
do
Netta:
all sorts
Dan_Shappir:
and those
Netta:
of
Dan_Shappir:
would be
Netta:
different
Dan_Shappir:
my my picks for
Netta:
just
Dan_Shappir:
today.
Netta:
images
Dan_Shappir:
And Netha
Netta:
and like
Dan_Shappir:
now's your turn
Netta:
shapes, whatever that
Dan_Shappir:
given
Netta:
you can
Dan_Shappir:
that
Netta:
make
Dan_Shappir:
you're
Netta:
with
Dan_Shappir:
not
Netta:
CSS,
Dan_Shappir:
going to pick
Netta:
and then
Dan_Shappir:
TikTok
Netta:
you can sort of challenge
Dan_Shappir:
is there anything
Netta:
yourself
Dan_Shappir:
else that you would like to
Netta:
to
Dan_Shappir:
pick for us?
Netta:
replicate it. and there's like different levels of stuff you can do and I just I don't I don't again for my ADHD peeps sometimes you need to do something sort of in the background of something else and I think this this is a great way to sort of keep yourself occupied with a challenge even while you're whatever listening to to a podcast or whatever or I didn't want to say this but like if you're sitting in on a meeting and you just need something to sort of keep that part your brain busy. So that's cssbattle.dev. Yes, okay. And then something else that might be common knowledge, but I only recently discovered is MIT OpenCourseWare. So apparently, MIT puts all of their classes online, lectures, all of
Dan_Shappir:
Ha
Netta:
it and like
Dan_Shappir:
ha ha, been
Netta:
all
Dan_Shappir:
there done
Netta:
any,
Dan_Shappir:
that.
Aj:
every meeting.
Netta:
all of it is just accessible for free online, which I just find to be amazing. And if I could tie that back briefly to the idea sort of of craftsmanship that we've talked about, I often feel like the influence or the ideas that come to me based on adjacent knowledge that isn't actually computer programming make me a better craftsperson. So I just think it's really cool that all this knowledge is out there. So it's MIT OpenCourseWare, and that's my second pick. And then my third pick is completely non-tech related. I love fantasy books, and I'm currently reading one called The Priory of the Orange Tree, which is just, you know, it has like, kingdoms and knights and magic and dragons and everything that makes a really good fantasy book and I'm enjoying it so I'm gonna recommend that. Okay. after the holidays.
Dan_Shappir:
Cool, we need to compare notes on fantasy books sometimes. I'm a connoisseur myself. So,
Netta:
Thank you.
Dan_Shappir:
anyway, Neta, thank you very much for coming
Netta:
Ha
Dan_Shappir:
on
Netta:
ha ha.
Dan_Shappir:
our show. This was a wonderful discussion. I actually think there is a
Netta:
Thanks.
Dan_Shappir:
lot more to discuss and unpack here, so I would love to have you on again. I need to see where that can happen. For sure. Anyway, thank you again for coming and thank you all for listening and goodbye. And now it's kind of late here. So Neta, really thank you very much for coming. And it's