Whiskey Web and Whatnot

A whiskey fueled fireside chat with your favorite web developers.

Listen/Watch

75: The Case for Adopting TypeScript with Josh Goldberg


Show Notes

Many people dream about being their own boss, but there’s no clear rulebook that outlines how to get there. While self-employment seems glorious to some, it’s not for everyone. How does someone know when they are ready to take the step into the unknown, and how do they know if that choice will suit them?

Josh Goldberg, Open Source Developer and author of Learning TypeScript, built much of his coding career at Microsoft and Codecademy before taking the leap into full-time open source tooling in January 2022. Since then, he has published a book and expanded his networking by speaking at over 30 conferences, but he still has time to discuss coding languages and hiking in Arizona over a glass of whiskey.

In this episode, Josh talks to Chuck and Robbie about Typescript adoption, becoming a full-time open source developer, and the power of expanding your professional network.

Key Takeaways

  • [01:48] - An intro to Josh Goldberg.
  • [2:28] - A whiskey review - Barrell Armida Bourbon Whiskey.
  • [07:01] - Chuck, Robbie, and Josh’s whiskey rating.
  • [12:27] - Josh’s latest book, Learning TypeScript.
  • [21:27] - GraphQL vs. TypeScript.
  • [23:40] - Josh’s journey into TypeScript.
  • [27:18] - Josh’s thoughts on adding a type system directly to JavaScript.
  • [30:11] - The case for TypeScript adoption.
  • [34:20] - TypeScript conversion strategies and solutions from Codecademy.
  • [39:43] - Josh’s transition to full-time open source developer.
  • [42:27] - Josh’s advice for aspiring full-time open source developers.
  • [45:10] - Josh’s experience speaking at conferences as a developer advocate.
  • [57:50] - Josh’s closing remarks.

Quotes

[29:33] - “You have to iterate in public and learn from real world usage in order to get things right.” ~ Josh Goldberg

[31:14] - “If you’re trying to convince people to switch to TypeScript, you convince them based on the pain points they have and how TypeScript fits into them.” ~ Josh Goldberg

[42:27] - “There are a lot of people who are interested in going full-time open source. It’s a great place to be, but I wouldn’t recommend going into this without a lot of prior work. To build up your network, to get a full-time job in a development team that gives you mentorship and management that helps you grow that way so that you are well equipped to go into open source first.” ~ Josh Goldberg

Links

Connect with our hosts

Subscribe and stay in touch

Top-Tier, Full-Stack Software Consultants

This show is brought to you by Ship Shape. Ship Shape’s software consultants solve complex software and app development problems with top-tier coding expertise, superior service, and speed. In a sea of choices, our senior-level development crew rises above the rest by delivering the best solutions for fintech, cybersecurity, and other fast-growing industries. Check us out at shipshape.io.

--- Send in a voice message: https://podcasters.spotify.com/pod/show/whiskey-web-and-whatnot/message

Transcript

Robbie Wagner: [00:09] What's going on, everybody? Welcome to another Whiskey Web and Whatnot with myself, Robert William Wagner, and my cohost, as always. Charles William Carpenter III.

Chuck Carpenter: [00:21] You haven't replaced me yet.

Robbie Wagner: [00:22] No, as always.

Chuck Carpenter: [00:23] But, yeah, maybe that'll change.

Robbie Wagner: [00:25] Well, I do say as always, but I guess if we switched hosts, I would have to change that. Anyway, our guest today is Josh Goldberg. What's going on, Josh?

Josh Goldberg: [00:33] I'm learning things. I'm so excited to be here. I've been watching or listening to the show for a while, and there's some things you do on the show, like the little sound of the whiskey pouring, that make me just really high anticipation right now.

Robbie Wagner: [00:46] Nice.

Chuck Carpenter: [00:46] Yeah, that's one of my favorite parts, too. Actually, if I listen to this show, yes, I should I should bump the numbers, but I just don't like my own voice.

Josh Goldberg: [00:53] Oh.

Chuck Carpenter: [00:54] I just go with it. I don't know.

Josh Goldberg: [00:56] Listening to one's own voice is truly a hellscape. I hate it.

Robbie Wagner: [01:01] Yeah, I don't mind. I listened to all of them, but yeah, it's going to be really disappointing. I guess this one will come out mid-January or something. But we have a bunch of advent of whiskey ones we just did where we recorded ten episodes in a row and did 24 whiskeys. And they're all little twist-top things, so it's like there's no pop.

Chuck Carpenter: [01:19] No.

Robbie Wagner: [01:20] There's, like, barely a pour sound and apologies in advance.

Chuck Carpenter: [01:24] We should work on those sound effects.

Josh Goldberg: [01:26] Do you dub those in? Do you, like, get a sound effect and put it over?

Chuck Carpenter: [01:29] No, we just put it close to.

Robbie Wagner: [01:31] No, it's all just live.

Chuck Carpenter: [01:32] Yeah, you just do the whole like.

Robbie Wagner: [01:34] So we'll do it now. Tell us about the whiskey, Chuck.

Chuck Carpenter: [01:37] Okay. Well, you didn't let Josh introduce himself.

Robbie Wagner: [01:40] Oh, yeah, I've done this a couple of times, but I forget what I'm doing. Yeah, Josh, tell the folks at home who you are and what you do.

Josh Goldberg: [01:48] I forgot that was a part of this, but hi, folks at home. Thanks for having me, the two of you. Real pleasure to be here. I'm a full-time open source maintainer in the TypeScript ecosystem, so I work on projects currently, most notably TypeScript ESlint, the tooling that lets you run ESLint and Prettier on TypeScript, which, from what I hear, is pretty darn important. I also wrote a book on TypeScript, Learning TypeScript, published through O'Reilly that came out earlier this year. So I'm just hanging around, having a good time in open source, helping folks use TypeScript the best they can.

Robbie Wagner: [02:18] Nice.

Chuck Carpenter: [02:20] You're living Robbie's dreams, but we'll get to that later. No. Yes. There we are.

Robbie Wagner: [02:26] There we go.

Josh Goldberg: [02:26] What a good sound that is.

Chuck Carpenter: [02:27] There it is. All right, so this is the Barrell, and we did clarify it. The folks at Barrell, even though there's two L's, it's still Barrell.

Robbie Wagner: [02:35] I emailed them.

Chuck Carpenter: [02:36] Armida bourbon whiskey. Yeah. Which I think is a worthwhile question. It sounds really cool. So it's a blend of three straight bourbon whiskeys finished separately in pear brandy, Jamaican rum, and Sicilian Amaro Casks and then blended together and left at cask strength. So you can enjoy it at full proof, which happens to be 112.82. My sweet spot. My work day will be over after this.

Robbie Wagner: [03:01] Mine is point 46 trash.

Chuck Carpenter: [03:05] Okay. Well, what about you, Josh? Is it the similar.

Josh Goldberg: [03:09] It's similar. I don't discriminate too much on the proof level for me, if I'm having whiskey, it's after 08:00, and there's nothing else left in my day.

Chuck Carpenter: [03:18] Yeah, that's true. That's very responsible and reasonable. It's not how I roll, but yeah, since I'm on mountain time, I'm usually like 2 hours behind Robbie, and so I'm trying to be respectful of his schedule.

Josh Goldberg: [03:32] Respectful.

Robbie Wagner: [03:33] We make Chuck drink midday, and it's fine.

Josh Goldberg: [03:37] Yeah.

Chuck Carpenter: [03:37] Sometimes as early as noon or one. And we did a recent one where it was eleven because the guest was in Spain. So we're like, how do we, okay, eleven it is. Work day over anyway.

Josh Goldberg: [03:50] Yeah.

Josh Goldberg: [03:51] I really appreciate your dedication to authenticity here, that you're not filling it with black tea or something.

Chuck Carpenter: [03:56] No, it's part of the experience.

Josh Goldberg: [03:59] You would never.

Chuck Carpenter: [04:00] Yeah, no, I like whiskey. It's not like the worst thing that could happen to me. Right. It's just if I'm expected to be productive, it's difficult. Well, I get a lot of fruit. I get a little maple in the smell.

Robbie Wagner: [04:12] I smell raisins.

Chuck Carpenter: [04:15] I could get that.

Josh Goldberg: [04:16] It's smooth as all heck. I like this.

Chuck Carpenter: [04:18] You messed with me. I taste a little raisin. It is very smooth. It is very yummy. At this proof, I really get very little burn. Just enough to let you know it's there. I would say apricot for me.

Robbie Wagner: [04:32] Yeah, I was going to say apricot. I was going to say it's kind of like a trail mix that has like a whole bunch of dried fruits, kind of.

Chuck Carpenter: [04:39] Yeah.

Josh Goldberg: [04:41] I'm having a hard time pinning down that was actually one specific fruit there because it says pear, and that was in my mind. But yeah, it's kind of a general vibe of the fruitiness and sweetness in there.

Chuck Carpenter: [04:52] Yeah. A little bit of like almost like caramel, I would think, like a dolce de leche or something midway for me. So a lot of fruit up front. A little bit of that caramel kind of sugary burnie kind of thing. We got a small tinge of leather in the finish, but it's pleasant.

Josh Goldberg: [05:11] It matures.

Chuck Carpenter: [05:12] Yes.

Josh Goldberg: [05:13] Over time, it starts off like a child and then grows less sweet as you go.

Chuck Carpenter: [05:19] Except for it doesn't want college money. So this is already better. All right, so I'm going to do this thing. I got like this bottle of water. I've always wanted to bring my dropper in, I always forget. And I want to add a couple of drops of water, like little spring water thing, and see how that changes it.

Robbie Wagner: [05:36] Did you bring your dropper? He's going to pour it in there.

Chuck Carpenter: [05:39] I didn't no, I just did this, and I poured it in a little cap and then very scientifically measured a couple of drops in the past. That's a nice way to try a whiskey, is have part of it as straight out of the bottle, have some with a couple of drops of water. That's a trick that I learned years ago at this DC bar called the Jack Rose, and it's fun.

Josh Goldberg: [06:02] I'm going to try that out. Thank you.

Robbie Wagner: [06:04] Jack Rose should really sponsor us.

Chuck Carpenter: [06:06] Yeah, I think.

Robbie Wagner: [06:07] I think we've mentioned them a few times now.

Chuck Carpenter: [06:08] I hope it's still there. Yeah, that changes it quite a bit. Then it starts to get like creme brulee, loses a lot of the fruit, gets a little floral finish.

Robbie Wagner: [06:20] Interesting.

Chuck Carpenter: [06:20] I think that inspired Josh. Did he get up to go get some water? Yes. Yeah.

Josh Goldberg: [06:24] I don't have a dropper, but I have hand techniques.

Chuck Carpenter: [06:27] Yeah.

Josh Goldberg: [06:28] Got three drops in there.

Chuck Carpenter: [06:30] Oh, that's what I tell my wife. It's all right. I've got hand techniques.

Josh Goldberg: [06:35] Whiskey after dark.

Robbie Wagner: [06:36] Okay.

Chuck Carpenter: [06:39] So anyway, let's get to the rating system. So as a seasoned listener, Josh, you know, we use the technical system of eight tentacles. So one to eight, one being terrible, never give this to me again. Eight being amazing. I really would love to drink nothing but this. And then, of course, everything in between. And since you know so about that, I'll go ahead and let you go first.

Josh Goldberg: [07:03] Oh, boy.

Chuck Carpenter: [07:04] Set the standard.

Josh Goldberg: [07:05] I was just going to say whatever numbers you two said average together, I worry about being very optimistic, but I would give this a seven or eight. Personally, I really like this whiskey. I don't know that I could ever give a whiskey a pure eight because they're just different types of things. I don't think one whiskey can satisfy all my whiskey needs, but this one is excellent. I like things with a little bit of fruitiness to them, but I also like a little undertone. I don't just want it to be sweet.

Chuck Carpenter: [07:31] Yeah.

Josh Goldberg: [07:31] I have a $15 bottle of pineapple whiskey that has remained on my shelf for, I think, two years now because I can't stand it. But this thing is quality. This is nice.

Chuck Carpenter: [07:40] Yeah. In general, I'm not a fan of flavored, so I get that. I do pass on the advice that I got once on a tour of Buffalo Trace, which is the old man who was touring us around, and he's like, well, everybody asks about Pappy, but we have all these different other whiskeys, and really, at the end of the day, the best whiskey is the one you like. And so if it's $20 bottle of Weller because that's what it was at that time, then great. And if it's something pricier and more avant-garde, then okay, great for you, but it's really, all that matters is that you love it. It doesn't really matter what we think anyway.

Josh Goldberg: [08:18] Then. Yolo, I give it an eight. Eight tentacles.

Chuck Carpenter: [08:21] Love it. Nice. Our first eight.

Robbie Wagner: [08:24] No, it's not our first eight.

Chuck Carpenter: [08:25] I think it is.

Robbie Wagner: [08:26] You rated the one we picked in eight, which I was like, I don't know about that. Since we did a barrel pick, you can't rate our barrel pick as the only eight.

Chuck Carpenter: [08:34] Sure, I can, on a technicality, but that's a rye, so that's okay. Then I'll go next and go ahead and subject myself to further scrutiny by Robbie. And I actually am going to agree with you, Josh. I really like this. I think that it's well-rounded. We've really liked a lot of these barrel products. And this one is interesting in that they're using a blend with all of these different used barrels, but then traditional bourbon. So I don't know where I categorize it necessarily. Right. It's obviously not a rye. It's not your standard bourbon. It's using some special techniques. So just in the sense of American whiskeys, then I would say I would give this an eight. And I would highly recommend it. I think it's delicious, and I loved trying it both ways, with the water and without.

Robbie Wagner: [09:21] So I'm going to ruin the rating system here.

Chuck Carpenter: [09:24] Of course.

Robbie Wagner: [09:25] But it's not that I dislike it. I agree that it is very good. I would recommend it to people. My hang-up here is the previous barrels we've had. I think we're better. So I rated them a seven. So this is going to have to be a six for me.

Chuck Carpenter: [09:40] Wow, that's fine. And you're categorizing this in comparison to the other barrels? To me, it's a little different than the other barrels because the other barrels were just, you know, a bourbon and whatever else. Right, so they might have used some staves or something, though, right? In the one?

Robbie Wagner: [09:55] No, they're all in special barrels.

Chuck Carpenter: [09:58] Yeah, that's the whole point.

Robbie Wagner: [10:00] They all do three different unique barrels. So the other ones had that too.

Chuck Carpenter: [10:05] Yeah, all good. I still kind of like this. I really like the maybe I'm just looking for something refreshing feeling because this has some of that to me. But then it's got the punch and the proof, and I don't know. But as of right now, I still feel like this is the better one. Agree to disagree.

Robbie Wagner: [10:21] Yeah. I'm not saying it's bad by any means. I think Barrell is probably my second favorite whiskey brand, like Sagamore and then Barrell. And I would recommend all of their products. So far, I haven't had anything from them, that's not good.

Chuck Carpenter: [10:35] Yeah, definitely.

Josh Goldberg: [10:38] This is my first Barrell, and it's making a good impression.

Chuck Carpenter: [10:41] I bet not your last. At least at my Costco. They get Barrell sometimes, and so do a Costco store pick or something like that. It's pretty nice.

Josh Goldberg: [10:51] I used to live in Washington, and once in a while, in the Costco, you'd get some local nice thing, and I can never remember. Either I got it there, or I got it straight. The Woodinville Whiskey Company had a port barrel, aged bourbon, which was my favorite for a very long time, similar to this. It's got that little bit of fruitiness, but it's not a sweet whiskey. It is more mature, more rounded than that. This is striking me in some of the positive ways that that one was as well.

Chuck Carpenter: [11:18] Yeah, nice. I've not heard of that. We'll have to add it to a list.

Chuck Carpenter: [11:22] Yeah. I thought I had the other barrel behind me, but it was a different barrel. I had this one.

Chuck Carpenter: [11:27] Oh, yeah, that one was probably my least favorite, I think.

Robbie Wagner: [11:30] Of the Barrells?

Chuck Carpenter: [11:31] Of the Barrells, yeah.

Robbie Wagner: [11:32] But it was still good.

Chuck Carpenter: [11:34] Yeah, it was like, oh, this is good, but a little too, I don't know, fresh cut grass or something, I think was one of the ridiculous adjectives I used. So I was like, okay, anyway, onward and upward. Should we talk about technical things?

Robbie Wagner: [11:48] Yeah.

Chuck Carpenter: [11:48] Software things? Sure. Open source things.

Robbie Wagner: [11:51] Yeah. So I don't know where you want to jump in, Josh, but I have some things in a list here. We'll just, I guess, start from the book that you have released, Learning TypeScript. Tell us about it. Like, who's the target audience? What can people learn from it?

Josh Goldberg: [12:05] Sure.

Chuck Carpenter: [12:05] Rust.

Josh Goldberg: [12:08] Oh my heaven.

Robbie Wagner: [12:08] PHP.

Josh Goldberg: [12:10] I've been meaning to learn Rust, and I used to do a lot of PHP back in my college days. I remember it fondly, and it's funny to me people have been pooping on a lot of the latest JavaScript React frameworks. Oh, it's just going back to the PHP days, forgetting, of course, all the horrors that are PHP on its own. But no. My book is Learning TypeScript. So as one can imagine, you might learn a little bit of TypeScript from it. It's hard to target a book. It's something I learned while ideating and then writing it. There are too many different types of people coming from too many different types of places. People who know, let's say, C# and or Java and want to learn TypeScript but don't know JavaScript or vice versa, they know JavaScript and no other type things. So as an opinion, my book says you should learn JavaScript first, and you don't need to know anything else. You can come in here without any type systems, compiled languages, whatever, and then you'll be fine to learn TypeScript. So the primary audience is someone who knows JavaScript. Maybe they went to a bootcamp or got it in college or something and wants to go from there.

Josh Goldberg: [13:10] You don't need React or Angular or any of those other things.

Chuck Carpenter: [13:12] Right.

Josh Goldberg: [13:13] That being said, there is some JSX-specific stuff in TypeScript, so the book does briefly touch on how to configure it for different things. Like for example, React and Preact.

Chuck Carpenter: [13:23] So, let's say you are not a complete layman to JavaScript. Like, I am far from an expert, but I've used it quite a bit over the last few years. I can get yelled at by TypeScript, figure it out, and then move forward and declare Types in a decent way and all of that. So are there nuances in the book where I would learn something?

Josh Goldberg: [13:43] I hope so. I think so. That's another challenging thing, that if you want to write a book, it needs to have reusability, that someone can read it, wait six weeks and then read it again and still get something out of it as a not complete novice. And yeah, I think you can use TypeScript without deeply understanding how the type system works, the theory, the theology behind it. But once you understand why it works the way it does, why, for example, the empty object squiggly squiggly means anything in the world, including strings and numbers, why that all structurally works together, it really helps you out when you're writing real-world TypeScript. So the book starts with an explanation of theory and theology and then ends with something that I had a lot of hard time naming, the extra credit or the miscellaneous section. Things like logic in the type system, conditional mapped types, things that most of the time you should actively avoid but sometimes are useful, leave it necessary, and kind of bend the realm of what people normally associate with learning for programming language. Because TypeScript type system fun fact is incredibly powerful. It's its own programming language, it's Turing complete, and you can do some wild and wacky things in it, but you really shouldn't ever do that to yourself or anyone else unless you're just having fun.

Robbie Wagner: [14:56] Yeah, I think for me, I have several specific issues with TypeScript, I would say, one of which being, say, you have a thing, and I don't have a good concrete example, so maybe you can help me with a better one if you have one in mind. But say you have a thing that has 45 types on it, and I want to use 17 of them, but I don't want to have to define all the rest of them. And it says like, oh, you have these types, and it lists the 17, and it's like, but you were supposed to have these 45. What do you do in that situation?

Chuck Carpenter: [15:30] Oh, you can exclude.

Josh Goldberg: [15:31] Sorry, go ahead. No, you go. You're the expert. So I'm not going to interject.

Josh Goldberg: [15:36] I was going to start with snark personally that why do you have 45 or 17 different things?

Chuck Carpenter: [15:41] Please.

Robbie Wagner: [15:42] Well, that is a problem. Yes, that's your problem.

Josh Goldberg: [15:45] That's not TypeScripts problem. Complex types come from complex code or complex concepts behind the code. So if you're in a situation where TypeScript is buckling under the weight of your shenanigans, consider using fewer shenanigans. That being said, there are sometimes cases where you do need to have a large type that gets turned into a smaller type. And there are a few strategies there. You can use the built-in partial type, which takes in a type and makes all of its members optional. Or you could use a type like Pick, which takes in a type, and then a list of keys from the type and picks those. Or you could use Exclude, which does the opposite. It excludes types. Or you could do some sort of fancy thing like you could take all the types from the original one that begin with the word get, or whose values are assignable to number. There are ways to do fancy things there in the type system, but again, for the most part, if you're doing something fancy, it means that people have to understand something fancy with your code, which is normally not a good thing and something to be avoided if possible.

Robbie Wagner: [16:43] Yeah, that's fair. The problems I have with it are edge Casey, for sure. I use it fairly successfully, even though I wouldn't consider myself an expert in it by any means. But some of the things that are great is your team can't theoretically pass the wrong things into things, or like you get nice autocomplete all the time, especially if you're using libraries that are well-typed. But one of the things that I have another problem with, and maybe this is also just due to me configuring it wrong, or I don't know. Sometimes I'll have a library that is typed, but it does a bunch of stuff wrong. So I run my code, and I get hundreds of TypeScript errors from the library. But you can't necessarily skip lib check because I'm still using the stuff from the library, so it would still throw those errors. I don't know. Are there good workarounds for that sort of thing?

Josh Goldberg: [17:40] There are workarounds. I wouldn't call them good. Yeah, what you're describing is a rare case, but not unheard of, where the types for a library are wrong. Most of the time, that comes from the types being created separately from the library. Libraries that don't themselves ship their own JavaScript types and DTS files are very often made by the community in a huge repo, one of the most active repos on GitHub, if not the most DefinitelyTyped. And DefinitelyTyped, there's nothing guaranteeing that they exactly match up to the project. There's just a bunch of tests that people looked at and thought matched up. A fun fact. I actually wrote the DefinitelyTyped search page if you go to aka-ms/types. Oh boy, that started 404ing today. Great. Never mind.

Robbie Wagner: [18:28] So don't go there.

Chuck Carpenter: [18:31] Sounds like you have something to do after this show.

Robbie Wagner: [18:34] Yeah, by the time this airs, it will work. We're confident.

Josh Goldberg: [18:38] Okay, cool. Well, anyway, it was designed by Orta, former member of the TypeScript team, and anyway, there's this great search engine for the types of types that are generated by the community and or in the project, but anyway, yes. So sometimes you can't get around it. Sometimes the types are broken or busted, or maybe they're first-party and just don't match the nuance of how you're supposed to use a library. If this is a one-time complaint, like you just have one file that's trying to call this one API and it's wrong, you can always use TS-Expect-Error. TS expect error. Fun fact, I wrote that feature. That's why I bring it up. Which says, I know there's going to be a type error on the next line. Shut up about it.

Chuck Carpenter: [19:12] Oh yes.

Josh Goldberg: [19:12] And then it'll also complain if there's no longer a type complaint on the next line. Like if they update their types, you can also override the types altogether for a library. I forget the exact syntax, we're doing this, but you can declare module, name the library, and then write your own type definitions, which could just be the keyword, export something colon space any, just to say, screw it, I don't know what's happening. Anycast it, or you could copy and paste the original types and make your own fixes. But if you're in this situation and you're fixing the types anyway, I would highly recommend just sending a pull request to DefinitelyTyped to fix it, if such a thing is in your time and energy budget.

Chuck Carpenter: [19:48] Help other folks.

Robbie Wagner: [19:49] Yeah, I already tried fixing them and failed miserably. I opened a PR to their repo and was like, these are the problems. I don't know why they're problems. Here's some theoretical fixes. Hopefully, this helps. That's all I could do. But I tried, at least.

Josh Goldberg: [20:03] That's better than most. Good for you, honestly. Great. Thank you for doing that. Most people just complain miserably and then do nothing about it.

Robbie Wagner: [20:11] Such is the open-source world.

Chuck Carpenter: [20:13] Boom. That's what I was going to say. That's the life of an open-source contributor, is it not? Yeah, I'm impressed with myself, first of all, that I knew the partial pick and exclude options in terms of messing with things. A lot of times when I'm working in an existing project, it's, say two years down the line or whatever else coming in to work with that stuff. I wonder. A lot of times, it feels like if you're generating types from schema, which, while that's kind of a helper, that tends to cause more problems and help down the line as the project gets bigger and bigger and bigger and more complex. I don't know if that's the reason for it, but that is one of the things that I've kind of seen. Like, okay, you have a GraphQL layer, it's got its schema, and then you're generating types out of that schema to use on the client side. But then your functions are doing some wacky things, and you're outputting something different than the object type that goes in, and then you start typecasting around that, and then you'll start to have the record unknown, whatever stuff because unknown is now acceptable because any is crap, that whole pitfall of things. And I just tend to wonder like if, depending on your schema for your types, maybe there's more headache than it's worth.

Josh Goldberg: [21:26] That's a great point and a great road to go down. GraphQL is a fascinating case study in TypeScript shenanigry. GraphQL has the opposite opinion of TypeScript. For null ability in TypeScript, you have to explicitly say that something can be or null or undefined, either or both of those. In GraphQL, it's on, by default, a decision I vehemently disagree with and wish I had the energy to make more noise about. Yeah, but also for GraphQL, the output the results of a query is dependent on the type you put in, which is directly analogous to the programming languages concept of generics. Something generically different about the parameter causes a different type in the return. But GraphQL types can be so complex and so nested, include this, include that, where this, where that the output type can be a bajillion different things based on the input. So we have this incredibly complex nyon misunderstood always complexity of the input type. So of course, if you're going to map that into TypeScript blend, if you're going to try to represent it in type two code, it's going to be 3000 lines of conditional types, which are a very unreadable syntax for human beings. Most of the time when I've seen GraphQL work well with people who are using TypeScript or just trying to understand the types, it's that they have types generated based on the GraphQL queries, not only based on the GraphQL schema, which is a very key difference that if you generate the type based on the query, the tooling can then generate the output for you, which is a single type, not some fancy, complex nested logic thing.

Chuck Carpenter: [22:54] Oh yeah.

Josh Goldberg: [22:54] That is my recommendation to.

Chuck Carpenter: [22:56] People that makes a lot of sense. Okay, I grab that one, and then that seems like okay. This is a happy because you only really need the types that have to do with what you're interacting with within your application, right? You don't need all these other crazy things, but then you import them, and you try to declare that within your own functions, but then you're only using partial bits of that. Or you have some sort of object manipulation that just starts to make that a little crazy. And then you're like, well, no, now it's a partial. No, now it excludes these things. Now it extends and goes through all this other extra crap. Interesting. So I'm wondering what was your journey into TypeScript. How did you go from PHP to TypeScript? I know you had some time at Microsoft, so I'm thinking there's overlap there but.

Josh Goldberg: [23:43] Well, I certainly got rid of the PHP before I went to Microsoft. Yeah, so I went through the four-year CS degree that was typical for many years and, thank heavens, is no longer as typical in our industry. And it was at RPI, and the curriculum there is largely C plus plus and then associated things around that. But I really like the web, and I was even in high school messing around. I used to make little forum signatures in Photoshop. I was a big photoshopper. And I had this little portfolio website at HTML CSS that showed them off. So I kind of got into JavaScript on the side. And then I was really bored and feeling nostalgic about bold video games. So I remade Mario in JavaScript, and it was a God-awful project. It was hundreds of global variables, the worst code I've ever written. It was huge. It was terrible. I didn't understand JavaScript. And then people on the Internet rightfully told me, hey, you should try Linting this. So I learned very much the hard way why Linting is great. Which, fun fact, I am accidentally sort of quoting the intro chapter the intro thing from my book. But anyway, I got into Linting. I got into static analysis just as a user. And I really liked it. I liked how things can look at your code and tell you how to make it better, which is so nice. Normally you have to listen to some angry senior developer yelling at you for 30 minutes about why your code sucks in order to learn how to fix it. So that was nice.

Chuck Carpenter: [25:05] I miss those days.

Josh Goldberg: [25:06] You missed the days of being yelled at.

Chuck Carpenter: [25:08] Where you had to get shamed into being better. And it was okay. It was acceptable. I didn't have shoes. I would walk to work in the snow up a hill, and people would yell at me from their hoodies and Funyun bags and.

Josh Goldberg: [25:21] Yeah, oh my God, Funyuns. I forgot about those.

Chuck Carpenter: [25:27] Anyway, I stepped back.

Josh Goldberg: [25:29] Yeah. So I liked static analysis, and then I started to get into TypeScript more. A bunch of friends were yelling at me. I should try it out. And on the same vein, it let me document my code, it let me declare how things are supposed to be, and then it would yell at me when I messed that up. Eventually, I got into TSLint, which, years ago, was the linter for TypeScript code. Now it is deprecated, and anyone still using it should migrate to TypeScript ESLint. You have a look on your face that makes me think you're still using TSLint.

Chuck Carpenter: [25:56] No, just if they are, even I know better.

Chuck Carpenter: [26:00] Great. I slowly got more involved with TSLint, started submitting documentation, fixes, small features, bug fixes. Eventually, it became a maintainer shortly before the deprecation, which was very fun. And now, I work on TypeScript ESLint, which is the modern version of that. So I kind of slowly rolled into there.

Chuck Carpenter: [26:19] So you never had to experience Flow. Flow.js.

Josh Goldberg: [26:23] No, I never thought that would do well. I thought. That. It's a great idea. And fun fact, one of the TypeScript ESLint maintainers, not me, the one who is very active with the architecture until recently worked on Flow at Facebook, at Meta.

Chuck Carpenter: [26:37] Wow.

Josh Goldberg: [26:37] And has some very strong points in favor of Flow compared to TypeScript as a language. But Flow came too late. Much like the Zune, it failed to kill the iPod of TypeScript, which is a pity because I was a big Zune kid back in the day.

Chuck Carpenter: [26:51] Nice. See, there's your throwback reference.

Josh Goldberg: [26:54] Yeah, Zune, and Funyuns.

Chuck Carpenter: [26:56] Yeah, funny. I'm just trying to set my generational precedents here, that's all.

Robbie Wagner: [27:03] So we've brought up Flow and TypeScript and they're slightly different, I would say. What do you think about the also slightly different proposal to add types directly to JavaScript and pros and cons on that?

Josh Goldberg: [27:18] I am very excited about that, but I feel weakly pain on this because the community as a whole has a hard time understanding what that actually means. People are not adding TypeScript runtime type-checking suggestions to JavaScript. You're not going to have throw new error supposed to be number was actually string in your code as a part of the JavaScript language, right? In fact, we're not even adding the TypeScript type system or an equivalent type system to JavaScript. There's no type system in JavaScript even in this proposal. The proposal is purely a bunch of comments with slightly different comments and text to indicate them. And that's fantastic because then it then means that there's a more standardized way that variants semi-super sets of JavaScript such as Flow and TypeScript can add the types to JavaScript. And then it also means that you may in many cases some cases be able to directly run your currently TS files what may end up being JS files in node or equivalent directly, which is really convenient right now. You oftentimes have to either compile your TS files to JS or use like node register or TS node or something to run them.

Josh Goldberg: [28:24] So being able to directly run your files is going to be a huge low-level productivity boost for people running back-end code things. But I just want to be very clear, the proposal people think it's that we're adding a type system but it's really just adding a place to put your languages preferred types as comments. There is a worry that I have that as a community, we're becoming completely reliant on TypeScript because everyone uses TypeScript. All the Linter plugins assume ESLint plugins TypeScript compatibility, and this proposal doesn't fix that. It just makes it so we can iterate more in the type system land. So I'm pretty excited about it. Hope it comes soon.

Chuck Carpenter: [29:01] Yeah, and I think it shows like a clear at least influence which I think the JavaScript community has been good at observing what users like as a former CoffeeScript user, for example, I mean, there was a lot from that superset that landed in the real spec. And I think this is just another example of some of those things that start to influence and land in the real deal.

Josh Goldberg: [29:25] Absolutely.

Chuck Carpenter: [29:26] Kudos in that sense.

Chuck Carpenter: [29:28] Anders Hejlsberg likes to say, show me a perfect language, and I'll show you language with no users. You have to iterate in public and learn from real-world usage in order to get things right.

Chuck Carpenter: [29:38] And perfect is so subjective in many ways, right?

Josh Goldberg: [29:41] Yeah.

Robbie Wagner: [29:42] So imagine you're someone who is on the fence about using TypeScript in their next project. I think it sounds like your book takes a diplomatic approach to that, where it's like, just learn JavaScript first, kind of add a little bit on what's the path to, I guess, for different teams. Like if you have a team of five or a team of 50, or at which situation is it best to use it or not, or how do they we get the whole team on board type of thing.

Josh Goldberg: [30:11] I love the question. I also love the specific phrasing and word you use, diplomacy. I oftentimes call this politics, but diplomacy is probably a better term for it. You have a group of people who may or may not be bought into an idea, and you want to get them bought into an idea, whether it's converting their TypeScript or using TRPC instead of GraphQL or whatever million other architectural shenanigans you want to do. There is a general craft and art a practice to convincing people that your new proposal is the right way to go, and that general art oftentimes involves figuring out what their wants, needs, desires are, figuring out what their pain points are, and how your thing can fit into those things. In TypeScript specifically, that oftentimes becomes you have pains around frequent bugs, around developers not documenting, and it generally being hard to develop in your code base because JavaScript is wild and wacky, and it's hard to apply refactors without types. And most teams suffer through all three of those, maybe only two of those. So if you're trying to convince people to switch to TypeScript, you convince them based on the pain points they have and how TypeScript fits it to them. Hey, I see that you've been complaining about bugs a lot. Well, TypeScript will fix those bugs, or rather, TypeScript will stop you from causing those bugs in the first place and will detect bugs that have yet to be reported by users. So when I try to convince people of something, I try to really speak to what's driving them in that way. That being said, at this point, TypeScript is such a buzzword in the industry that a serious, legitimate point in its favor is you'll have an easier time hiring senior plus talent if you say you have TypeScript because we all care about it. So between those two areas, I think there's a pretty convincing case to be made.

Robbie Wagner: [31:55] Yeah, that's fair. So in the process of implementing it, though, I know I frequently just want to iterate quickly, and I'm just writing stuff, and then I go to run it and I get ten errors. I'm like, oh, I forgot to type these things, and I don't actually even know what the types are, or they might change because I'm iterating quickly. What is your advice on that? I know that you're not supposed to just make everything any, of course, but is there a correct way? Or maybe you just type things as best you can for now or what's your advice on that?

Chuck Carpenter: [32:30] TS ignore, and then when you're ready, come out of it. I mean, if you are in a highly complex bit of code, I'm not going to lie, I have done that. I'm like, okay, I need to iterate and kind of figure out a few things. I need to see some outputs. I need to sort of get this where it needs to be and then I need to make it right. So sometimes it is that. I mean, I'm not going to lie. I will. Oh, crap. Crap. I've got 80% of this done correctly. Getting caught here kind of like getting in the weeds on the types and I'll TS ignore, get where I need to be and then clean it up, obviously before it goes somewhere into a real PR or something. But anyway, that's my advice.

Josh Goldberg: [33:12] No, I do the same. Strongly agree. Why would you spend 20 minutes figuring out the exact, precise way to document these nuanced types when the nuanced types are just an artifact of your experimentation that you may not even keep? It's not worth it unless you really want to use that as an exercise to build up your TypeScript expertise. But that's not always the case. So yeah, I'd say there's a cascading layers situation where you're trying to just get something to compile in the first place and using any TS expect error or TS ignore, whatever those are in that level of stuff where I'd say first try, just make it unknown because that's a safer any. Second try, if you're still getting errors, you don't have the time to fix them, just set it as any if it's any, and you're still getting complaints from some weird, wacky conditional type somewhere. Yeah, TS expect error in a way that's fine, but this is all when you're experimenting and eventually you will hopefully put it into a pull request. And that brings up Robert. You asked the broader discussion of how do you take a code base or team or both and convert it to TypeScript. And I'd say the strategy we used at Code Academy to convert to TypeScript is the one that I highly recommend. We have a trio of blog posts from Code Academy. I think it's the technical approach, the behavioral approach, and then the conclusions or some similar mix-up. But I'd say the first and most important thing is to convert the team, the people, the individuals. Explain to them why you're converting to TypeScript. Even before that, convince them of converting to TypeScript. And then, as I was saying before, figure out what pain points they have that can be addressed by TypeScript. Then, as you're converting, do some sort of incremental strategy. You don't have to convert every file from JS to TS or TSX. You can just do one or two files at a time, and in those one or two files at a time conversions, use that as an opportunity to be two pair program or mob program with people because no one will learn anything unless they're forced to, and you might as well be with them while they're learning it. It's a much more pleasant experience and gives you much better user feedback about what's going well or poorly with your conversion. And then, while you're doing those pairs or mobs or small conversions, one at a time, first, always be on the lookout for things that you can brag about. Oh, hey, we found a bug here. Oh, hey, this was actually really easy. We only added one type in this file. Oh, wow, this person really likes TypeScript now. Great. They're one of my advocates. Or cheerleaders, I think we call them in a blog post. But also, eventually, you do have to get that thing shipped. So, yeah, it's fine to use an any. It's not ideal, but sometimes you have to do it. Then finally, one last recommendation I have is do a graph traversal of your files to figure out which ones can be converted to TypeScript first, such that you never have a TypeScript file importing a JavaScript file. If you have a TS file, importing a JS file. Then the types are poor. You don't know what's in the JS file in the type system. It's hard. So find your leaf nodes, the files that don't import in the other files, and convert them first.

Chuck Carpenter: [36:08] Nice.

Josh Goldberg: [36:08] That will give you a much easier time.

Chuck Carpenter: [36:10] Yeah, good advice. That's great advice.

Josh Goldberg: [36:12] Sorry, I realized that was a giant blob of of information. But I'm very excited about you, too, both going out and converting code bases to TypeScript.

Chuck Carpenter: [36:20] Yeah, I mean, I already do it. I don't know about Robbie. I mean, he's still working on my level of expertise.

Robbie Wagner: [36:27] But I do have one more. Sorry for all these random questions. So, where do you draw the line on what should and shouldn't be typed? Because I know frequently I'll open PRs and, like, type most files, let's say, and then maybe I have a config file or a test or something that I use just normal JavaScript for. And then people go, oh, why didn't you type this? And I'm like, well, because one, I don't really know what the types are in this thing. It's different than my usual workflow. Like, I don't know what all the types for a testing file might be or a config file for Tailwind or something. Do you think it's okay to keep some of those JavaScript or do you think there are benefits to making those TypeScript or do you have any lines you fall on either side of on that?

Josh Goldberg: [37:14] I don't think there's one right answer, and I don't think there are very many wrong answers. I think it's fine for config files in general, but it is better to make them TypeScript. Vitest randomly allows you to define as a dot TS, which is really nice, and then you get a little nicer type checking. A lot of libraries now have started putting in their documentation little JS doc comments so that even if you're in a JS file, you can still have the doc comment explain to the editor that this is some JavaScript type. I think Docusaurus I think does that, which is really nice. But my general rule of thumb is the number three. If you have three developers touching a thing and or if you have three or more files in the thing, whatever that thing is, convert it to TypeScript, it's probably worth it. So if you have a config file that multiple people are editing, which means it's a config file that's going through turnover churn, people are changing it, it's probably worth it to put it in TypeScript. Or if you have a project that has two files, maybe not worth it. Maybe the overhead of TypeScript isn't worth it because there is overhead. We should always recognize that each tool we use brings with it overhead and perhaps other downsides, such as the random weird error messages you sometimes get with TypeScript. But once you get three files in a project, in my experience, that's generally the sign that, okay, this thing is big enough. It's got enough things that are talking to each other. We should probably put some types in there. But again, if you're not a big TypeScript person, if no one on your team team size one or greater is a big type of good person, maybe it's not worth it to TypeScriptify all the things that's fine up to you.

Robbie Wagner: [38:46] Okay, that's fair.

Chuck Carpenter: [38:47] It's a decent rule of thumb I was going to ask about. So your current career is that as a full-time open source maintainer. I'd love to know a little bit about that journey.

Robbie Wagner: [38:58] Yes. How do we get people to give us money for that?

Chuck Carpenter: [39:02] Exactly.

Josh Goldberg: [39:03] Robbie, this was mentioned. Are you hopeful to becoming a full-time open sourcer?

Chuck Carpenter: [39:09] I mean, you manage how many.

Josh Goldberg: [39:11] Either of you?

Chuck Carpenter: [39:12] No, not my dream. But Robbie, you work on how many open-source repos?

Robbie Wagner: [39:17] I have probably, I don't know, I maintain like over 100 Ember add-ons probably. And then we have Shepherd. We don't really do anything with Tether anymore.

Chuck Carpenter: [39:29] And then we have like Shepherd wrappers and stuff like that.

Robbie Wagner: [39:31] But I don't know enough stuff that I probably could work on in a good chunk of time but no one wants to pay me to do it. Because it's free and open source.

Josh Goldberg: [39:42] So, isn't that such a situation? We do these things as open source people that are so beneficial, that have generated millions if not billions of dollars of worth, saved time, whatever you want to phrase it, and nothing. So I think the industry is slowly and perhaps with an exponentially increasing speed starting to recognize a that it's a problem b that there is stuff that can be done about it. But no. This past month as recording middle December, in November, I hit federal minimum wage for the states for my computed monthly intake. I'm very excited about that. That's a legitimate achievement for open-source people getting minimum wage.

Chuck Carpenter: [40:19] Yeah.

Josh Goldberg: [40:21] The way I did it was first I wrote a book which generates income, but within open source, specifically TypeScript ESlint gets sponsorship from companies, random individuals, all of whom are nice people and organizations. And then I also have a personal GitHub Sponsors but that's not a lot of money. My personal GitHub is maybe 300 a month. My take from TypeScript ESLint is a little over 1000 a month. It's not a lot of money. So yeah, I think systemically, it's crap. The industry does not incentivize companies to donate to open source strongly enough. Most companies don't. And if you even look at developer-focused companies, there are some really nice big names like Microsoft and Google, and Apple who do give a lot to open source. But outside of dev-focused companies, when you look at fashion, shopping, retail Target, what does Target do? I don't know. I legitimately haven't looked into them. But it's not a name in open source. You don't see them come up on ReadMes the way you do, for example, with Microsoft. So I think as an industry, we need to first have better documentation for explaining to companies why they should donate to open source. I think that's a real gap in the industry. We have a lot of activist-style stuff. You should do it. It's better for the world. All of which is true but not particularly convincing. And then I would also love to see a site that grades companies has some sort of metric on this. Like Microsoft would probably get a good grade given how much they contribute to open source eg, TypeScript, and VSCode. But then, I'm not going to name names here because I don't want to be wrong or rude, but other companies don't.

Chuck Carpenter: [41:53] Right.

Josh Goldberg: [41:53] I'm starting a project middle of December with Rizell Scarlett from GitHub on trying to make a site that starts to tackle those problems of documenting why we should do this positively, calling out companies. But it's a real problem in the industry. So to answer your question of how I get paid, I don't really. It's something I'm working on.

Robbie Wagner: [42:10] That's fair.

Chuck Carpenter: [42:12] So a healthy savings before you go down this path, and then you decide that this is like a passion that you want to really dive into and enjoy and take that as long as you can. I can appreciate that.

Josh Goldberg: [42:25] Yeah, this is actually good advice. There are a lot of people who are interested in going full-time open source or that there'll be split time. It's a great place to be. I'm learning a lot. I'm working with cool people. I get to go on podcasts like this that freaking mail me some of the best whiskey I've ever had. This is wonderful, but I wouldn't recommend going into this without a lot of prior work to build up your network to get a full-time job in a development team that gets you mentorship and management and helps you grow that way so that you are well equipped to go into open source first. The way it seems, Robbie is and perhaps will be doing soon. Question mark.

Chuck Carpenter: [42:58] Yeah. There you go. His newish baby probably disagrees, but.

Robbie Wagner: [43:03] Yeah. He eats a lot and poops a lot.

Josh Goldberg: [43:05] 18 years from now, then, maybe.

Chuck Carpenter: [43:07] Yeah. I do think that's, like, great advice that you touch on the fact of not just becoming an open-source contributor, because I think it takes a lot more of that. I think it takes a good level of self-discipline, and I think that there are soft skills associated with that, with, like, evangelizing the work that you're doing. Like you've found different ways to sort of speak to that and create a personal brand around it. And all of that will probably be beneficial to you down the line, too, for whatever the next steps are. So I think that's important to mention to people who probably hear that and like, oh, yeah, I just want to code for a year or whatever else, I'll save some money. But I think there's a lot more to that. I think there's levels of personal discipline and knowing how to work with people, work with teams. You're not going to have the benefit of a Jira board listing out all the things you need to do on your roadmap for the next year. You've got to self-drive and be your own product evangelist to a degree, not just for yourself, but for the project you're a part of, and steer that in a way that continues to make it more successful and picking the issues that have great impact and all of those things across the board.

Chuck Carpenter: [44:13] I think that is really important that that is known to our listeners who might be thinking about a path like that. Yes, it's great. It's fulfilling in ways, but you need a skill set. You need a toolbox to come into it and really do well.

Josh Goldberg: [44:27] Absolutely. 100%. That's a very good phrasing of it. Plus one.

Chuck Carpenter: [44:32] Yeah, I'll type it up, send it to you. Just send me a little of that cash you're making every month. And we'll go from there.

Josh Goldberg: [44:37] Yeah, you'll get five pennies a month, and that'll be all.

Chuck Carpenter: [44:40] Perfect. See, we just take care of each other. Cool. So less techy things. I know we're like starting to run longer on time, so I want to make sure we have a little bit of time for some of these things. A thing that I found very interesting to learn about you is that you have applied to over 100 conferences and spoken at about a third of them. And I know you have a whole blog post around becoming successful in applying for conferences, but just in general, like, oh, what was your idea and strategy to wanting to do that to begin with and then kind of go from there?

Josh Goldberg: [45:10] Sure. Speaking both to the question you just asked and the discussion prior. Most of my open source work is as a developer advocate, which is something that is never explicitly said to people. Before you get into open source, there is a project, say TypeScript ESLint, that I need to work on. The vast majority of the work for that has been documentation. So great. Now that's what I do. But for conferences, I really enjoy conferences. I like them. I like meetups. I like getting to go to new and fun places. I visited Berlin and Amsterdam and all these other places for the first time this year. I like meeting with people I've met, all these wild and wacky names like Kent C. Dodds, like these people who you see on the Twitter with tens upon tens of thousands of followers, and they're actually real human beings. And fun fact, Kent is actually a very lovely person in real life. Dan Jutan, all these random other names, lovely people. And I really like how at conferences, you get to see people kind of hone their craft and discuss the latest and greatest in tech. Like if you look at a particular speaker who goes to a lot of conferences over time, and you watch their talks, you can see them craft that talk over time, much like how a stand-up comedian crafts their routine, their five-minute fire, whatever it's called, the thing they do. I think that's really interesting. So you learn a lot, you meet cool people, and there's a craft to it. So that's what I like about it. But I don't otherwise have too much of a strategy. You mentioned I do have a blog post. I just find all the conferences that are in any way related to what I do. I've been applying to PHP conferences because that's open source. For the record, I haven't written a line of PHP since an internship in college, and I just apply to them because I want to get the word out there about the projects I work on and or my other interests like accessibility or open source in general. And I want to meet new and cool people. So I'd say to anyone thinking about applying to conferences, do it. It's helpful if you've spoken at meetups both because it makes you look good and also because it's good practice. But just get yourself out there, keep doing it, and eventually you'll get and expand your bubble.

Chuck Carpenter: [47:11] I like that.

Josh Goldberg: [47:12] Yeah.

Robbie Wagner: [47:13] So I want to get to this very important bullet point here about I myself am also a Halo fan, which I hear you are. I've played all of them. I had a similar trajectory to you where I played until I bought five, and I didn't even play it because my roommate at the time played it for like an hour and said, don't even bother playing that. And then a friend also came over and played like an hour like I was working while they were playing or something to where I wasn't watching it. And he had the same response of, like, don't play this. All right, if two people say not to play it, I'm not going to play it.

Chuck Carpenter: [47:54] Yeah, it wasn't me. I didn't play Halo, so I don't know.

Josh Goldberg: [47:57] You're missing out. What a great series.

Robbie Wagner: [48:00] Other than that, I've loved it. I liked the new one, and yeah, I never played the story of the new one. So I don't know. I think you said the story of that one wasn't good either.

Josh Goldberg: [48:11] Oh, man, I need to check what I sent over the email.

Robbie Wagner: [48:15] You said Halo Infinite was fun, but you were personally offended by the story again.

Josh Goldberg: [48:22] Yeah. So my journey with Halo, I know I've been giving kind of longer answers. I'm talking not to, but this one, really, this is going to be the pinnacle.

Robbie Wagner: [48:30] Go for it.

Chuck Carpenter: [48:30] Okay.

Josh Goldberg: [48:31] I get obsessive about things. It's a part of me that I try to tone down. In high school, it was Halo and Marathon, the Sci-Fi first-person trilogy that Bungie made before Halo. Marathon is a great game, by the way, to any of your listeners, highly recommend if you like 80s sci-fi, if you like existential contemplations on the meaning of life, the nature of consciousness, what to do with your immortal fantastic series of games, beautiful and open source. [unintelligible]. I really liked Halo because it was fun gameplay. I liked the story. The Halo Extended Universe is fantastic, but I really peaked around. Halo Three. Halo ODST. Halo Reach. When I worked at Microsoft, I managed to get myself into the Halo Gala, which was this yearly event they threw at three, four, three. And I met like Joseph Statin and Frankie O'Connor. And I actually have a signed copy of a signed painting that Frankie O'Connor made for my team. We bid on it, and one of Mr. Chief, which is like this parody, Halo mascot, Master Chief in the marathon, like one of the quintessential marathon posters, which is fun fact, the original is actually lost. My old team at Microsoft moved buildings, and the painting got lost. In the move. We don't know where it is. I swear to God, if it's thrown out, I'm going to be so mad at my old manager.

Chuck Carpenter: [49:44] Lost. No, I'm sure it was lost in a trash can that ended up in somebody's house.

Josh Goldberg: [49:50] If it's lost in your bedroom, dear listener, please let me know. I paid for a majority of that painting I want it back. Halo has this beautiful storyline, especially the first two and a half, where it's talking about the struggle of humans versus the Covenant and these really interesting characters like the Master Chief, who's this emotionally stunted warrior, and Cortana, who's this AI who knows she's going to die within the next seven years. All this stuff. And then Halo Five comes out, which is a completely different story than the advertising campaign, and it's fine. It's one misstep. But then Halo Infinite comes out, and Halo Infinite story. Halo Infinite story isn't a story. It's half of a story. I legitimately loved the story until it ended. And then I realized, wait, those were the story beats. They spoilers. They tease an enemy that's never shown. They set up these characters, half of whom you never actually see on screen. The big inciting incident. Halo Infinite gets sorry, the Infinite Warship, whatever it's called, Infinity gets attacked by these banished people. They never explain the banish in the game. They don't show you the events. They set up this major villain Atriox who never actually appears in the game. There's exactly one and a half variety of landscape that you play on. It is clearly half of a game, and respect and props to them for managing to finish that half of the game because I know Microsoft has a huge problem with they have this overreliance on vendors and [unintelligible] industries, and they have no persistent staff, and it's this whole thing. But it was so offensive to me that they shipped this thing that was so clearly half of a game, which had some of the best gameplay in Halo and this offensively short story. I was so upset by this. There was so much goodness in there, stifled by the crap that was the output. And then, of course, it's on the Xbox, so every time I play it, I have to wait more than half an hour for the Xbox to realize it's offline and let me play the deistically darn game.

Robbie Wagner: [51:47] So I'm guessing you probably also don't like Destiny then.

Josh Goldberg: [51:52] You know I bought Destiny one. I enjoyed it. I just never got into it. It was a good game. The gameplay was really good. I enjoyed the story. I thought they did a really good job with the, like the atmosphere in the context of setting. But at that time, I was so burned out I just I couldn't get into it.

Robbie Wagner: [52:07] Yeah, the story for that one was like totally gone as well. It's like, okay, we have these enemies, but they're just. Kind of part of the darkness. We don't really know why it's here. They exist. And I don't know if you saw the post about that, but I think they fired the guy who wrote all the story for several years or something, and he had a Reddit post of, like, this is what the story was supposed to be, and put it all up on there and it was, like, really good.

Josh Goldberg: [52:34] That's fantastic.

Robbie Wagner: [52:35] And it makes sense, like, why the story was they, like, ripped out half the game because they couldn't use the story anymore. I don't know, but I think the gameplay is still really good. I think Bungie makes good stuff.

Josh Goldberg: [52:47] Bungie does make good stuff.

Chuck Carpenter: [52:48] Interesting.

Josh Goldberg: [52:49] That's upsetting. Thank you for telling me about this. I'd love to know what the story was actually going to be. It's like, Halflife two, episode three. This story apparently was supposed to be very good. I would love to experience it someday.

Robbie Wagner: [52:59] Yeah, for me, if the game is fun, I don't get too hung up on the story, but I know several of my friends won't even touch Destiny because they're like, I want the story to be more complete and understand why things happen. And it's just not that we just shoot stuff.

Chuck Carpenter: [53:15] Okay, fair enough.

Josh Goldberg: [53:16] Yeah, there's a gap, and if you aren't looking for the gap, you can just exist with what's adjacent to the gap. But if you were looking for that, if you were looking forward to it, it's such a disappointment. And I think that's such a problem with the games industry today that we've hit the software development lifecycle of agile ship things first, and then you have games like Destiny, Halo, Infinite, Cyberpunk, where they're clearly incomplete. I haven't even bought the new Pokemon.

Chuck Carpenter: [53:38] Wait, Cyberpunk is bad too? Crap.

Robbie Wagner: [53:41] You didn't hear about all that?

Chuck Carpenter: [53:43] No, I know just enough about the game to be like, oh, I'd like to play that someday, but that gets tabled. I play FIFA for 30 minutes every couple of weeks, and that's like my life at this point.

Josh Goldberg: [53:54] Yeah, it was a whole thing.

Robbie Wagner: [53:55] I think they fixed some of it, but when it came out, everyone was super pissed off because it was, like, unplayable in certain parts and just totally broken, and they were like, oops.

Chuck Carpenter: [54:09] And they do a really bad job of post-release updates. Right, that's what I understand, too. It happens in a bunch of things. So it was sort of like, I had Stadia and Stadia is going away, and that's where I played FIFA and I loved it because it was, like, basically device agnostic. You could play wherever you're at, and that's going away. So, like, what am I going to replace with? I thought Steam Deck might be pretty cool, but then apparently EA, with some sort of, like, anti-piracy thing, broke the PC version, ergo, the Steam Deck version of FIFA, and they don't really care, and their updates have nothing to do with ever fixing it again. So it's like people paid $100 for this game, and you don't give a shit enough because next year, you'll just buy the next version, I guess.

Josh Goldberg: [54:50] That's so upsetting.

Chuck Carpenter: [54:52] Yeah, very upsetting. So before we run out of time so, I'm in Arizona, and I caught in your notes about hobbies and whatnot that you've started to get into hiking. And one of the things that has inspired this hiking desire is a visit to Sedona, Arizona, and going on some hikes here because it is fucking beautiful.

Josh Goldberg: [55:14] Yes.

Chuck Carpenter: [55:15] And you're just going to kind of take it from there. So yes, you went on a hike in Arizona a little over a year ago. I don't know why you didn't hit me up, but maybe next time. And that's just it. Like you want to hike beautiful places.

Josh Goldberg: [55:28] Yeah. I mean, to be fair, you didn't send me whiskey then.

Chuck Carpenter: [55:32] Right. I know how relationships work. You must buy them.

Josh Goldberg: [55:36] I love this industry.

Chuck Carpenter: [55:37] Yeah.

Josh Goldberg: [55:38] I thought I always wanted to get into hiking, but if you're in pain physically, it's hard to get into things, and just people kept bringing me on these hikes.

Chuck Carpenter: [55:45] Oh yeah.

Josh Goldberg: [55:46] No, this is a beginner-level hike. It'll be fine. 3 hours and much sweat later. It's not a beginner hike.

Chuck Carpenter: [55:52] No.

Josh Goldberg: [55:53] But no. My wife and I have this wonderful relationship for him. The more miserable the other is, the happier we are. So she was annoyed on our hike because we took a wrong turn on a beginner-level trail and somehow managed to get lost within eyesight of everyone else. And I thought that was the funniest thing ever, and I just really enjoyed it. But yeah, shout out to Arizona. What a beautiful state. Especially, but not exclusively the Sedona. Aria really liked it there. It's beautiful.

Chuck Carpenter: [56:18] Yeah. But Sedona does kind of have it. So it has the red rocks and it gets a little bit colder up there than it does here in Phoenix. But so if we want a little break from the heat in the summer, you go up north, you have the red rocks, you have some nice waterways and stuff like that, like little creeks and stuff that are fun. It's a good place to go camping. And then you go further up, and you start to get more and more evergreens and cooler weather. And then in the winter, you come here. We've got a bunch of really beautiful hikes, too, throughout all the winter. So there you go, open invitation. Let's go hiking.

Josh Goldberg: [56:52] Next time I'm there, I'll hit you up. This sounds great. You know all the things, right? All the Arizona things?

Chuck Carpenter: [56:57] Yeah. Okay. I don't know all the things. Well, I think I know all the things and then you ask my wife and I don't know all the things, but hiking, I can definitely take you good places.

Josh Goldberg: [57:06] Excellent. I also really enjoyed there are a lot of stray cats in Sedona, I think because it's a tourist location. And my wife and I, we really like cats. We don't go out of our way to experience them, but we found they keep coming to us like we had a backyard with a dozen strays. It was this whole thing, and there were just a bunch of stray cats around our hotel that we were just hanging around. Feeding was great.

Chuck Carpenter: [57:28] Interesting.

Robbie Wagner: [57:29] So there's not a mouse problem there?

Josh Goldberg:[57:31] Yeah, absolutely not.

Chuck Carpenter: [57:33] That's one plus side. And you're a big Brian Setzer fan, right? The Stray Cats was a band back in the then. Brian Setzer is the guitarist of that. Yeah, singer and all that.

Robbie Wagner: [57:44] Well, on that note, we're at time here. Is there anything we missed you would like to plug before we end?

Josh Goldberg: [57:51] People should buy my book or sponsor me on GitHub sponsors and or sponsor TypeScript ESlints on OpenCollective. All of which can be attained by going to my website joshuakgolberg.com and or TypeScript-ESLint.io. Please give us money because we will a promote your company on our homepage if you give us enough, and b we're actively trying to make TypeScript development better for everyone. So let us do that sustainably, please.

Chuck Carpenter: [58:16] Cool.

Robbie Wagner: [58:17] Thanks, everybody, for listening. If you liked it, please subscribe, leave us some ratings and reviews, hit that five stars, and we will catch you next time.

Chuck Carpenter: [58:27] Thanks for listening to Whiskey Web and Whatnot. This podcast is brought to you by Ship Shape and produced by Podcast Royale. If you like this episode, consider sharing it with a friend or two and leave us a rating, maybe a review. As long as it's good.

Robbie Wagner: [58:42] You can subscribe to future episodes on Apple, Spotify or wherever you get your podcasts. For more info about Ship Shape and this show, check out our website at shipshape.io.