Introduction to Hansel Minutes and Johnny Marler
00:00:01
Scott Hanselman
Hi, I'm Scott Hanselman. This is another episode of Hansel Minutes. Today I'm chatting with Johnny Marler. He's the lead Windows developer at Tuple. How are you, sir?
00:00:09
Johnny Marler
I am doing good. How are you doing?
00:00:11
Scott Hanselman
Very well. Thanks for hanging out with me today.
Exploring Tuple's Native Feel vs Web Apps
00:00:14
Scott Hanselman
I was checking out Tuple at tuple.app, T-U-P-L-E.app, as I always like to install whatever the new hotness is.
00:00:22
Scott Hanselman
And one of the things I think is common for developers, and hopefully it's not a weird thing to say, is I think to myself, what did they write this in? You know, like I've got, I've installed Claude and I've installed ChatGPT and I've installed Copilot and it all feels like everyone's just doing web views. It's just like a web view. Here's a canvas. i'm going to do some HTML in a box.
00:00:42
Scott Hanselman
But Tuple is immediately, it's like, this is native. Someone wrote this like driving stick shift.
00:00:49
Scott Hanselman
Is that, is that a good guess?
00:00:51
Johnny Marler
Yeah, no, that's
Design Choices and Platform Support of Tuple
00:00:52
Johnny Marler
that's a good summary. right I guess like normal apps, it kind of makes sense to use the web because they contain usually contain a lot of Chrome or UI. And Tuple is kind of the opposite.
00:01:03
Johnny Marler
We actually intentionally try to avoid having a lot of Chrome or UI in the way.
00:01:07
Scott Hanselman
Yeah, kind of hide out.
00:01:09
Johnny Marler
Yeah, it's it's it's not about connecting to your computer. It's more about connecting to other humans.
00:01:15
Johnny Marler
and So if you really want to get, if you're optimizing for that, it's actually more important to get the system APIs correct. Like you want to be talking directly to your system because it knows the best way to transfer video over the network and audio.
00:01:29
Johnny Marler
So that's what we're optimizing for. You know, it's it' it's it's a little bit more of a you know, different use case than the typical app, I would say.
00:01:37
Scott Hanselman
Now, Tuple works on Windows 10 and Windows 11, but also works on Mac and works on both Intel and Apple Silicon. A lot of people have abandoned Mac, Intel, Silicon. Like, is it all the same code base and you just like pound to find your way to glory?
00:01:51
Johnny Marler
Yeah, i wish. um it did It did start out being written specifically for Mac OS.
00:01:57
Johnny Marler
And they were they started to, before I came on, port it to Linux. And so at that point, they started to take some of the common stuff and make ah ah make an engine. So the engine's all C++, plus plus which is the common code base.
00:02:11
Johnny Marler
macOS, which I'm not familiar with, I think there there's a lot of Objective-C in the macOS app. And you know there's Swift as well sprinkled in there. But yeah, they started before me adding Linux support.
00:02:23
Johnny Marler
And they they ended up using a flat pack for that.
00:02:27
Johnny Marler
which was the initial version. That is now no longer supported, and we're going a different direction for Linux now. But yeah, we we pulled all the common parts into a C++ plus plus engine, which has been working well.
00:02:39
Scott Hanselman
Oh, okay. So interesting. So you, as a lead Windows developer, consume the kind of upstream C++ plus plus engine. But doesn't that engine at some point, though, need to call syscalls? It needs to call Win32 APIs. It needs to call Mac APIs.
00:02:54
Scott Hanselman
Do you have a say into how that C++ plus plus looks, or do you stay on the outside shell on the Windows side?
00:03:01
Johnny Marler
That's a good question. So I would say our biggest core piece of code base is actually WebRTC. That's kind of like the backbone that that the engine mostly interacts with. So WebRTC itself has tons of system-level APIs.
00:03:18
Johnny Marler
But when you when you start talking about like your UI or you know the application-specific stuff, the platform-specific stuff, now that's all outside of the engine inside of what we would call the app layer.
Tuple: A Remote Pair Programming Tool
00:03:32
Scott Hanselman
So this is a good opportunity to explain like what Tuple does, right? So this is a remote pair programming app. Is this meant for interviews or is this meant for you and I to pair up on something?
00:03:42
Johnny Marler
Yeah, it's it's meant for programmers, specifically tailored to like make working seamless and easy. And quick. So like one of the things we found is it's sometimes hard to get pairing going. like You got to message somebody. You might have to start a calendar invite. So with Duple, it's just one click to call somebody to just get in that meeting.
00:04:04
Johnny Marler
And it's for there's shared control by default. so You don't have to like change some sort of setting to allow the other person to take over your screen or to to draw on your screen. Everything is just enabled by default.
00:04:15
Johnny Marler
And it's just usually one click to do almost anything. And Tuple also stays out of your way. So we're not you know putting some sort of Chrome over that's covering your code. we mean We, by default, make webcams small and kind of in the corner.
00:04:29
Johnny Marler
So there's just a lot of like little things like that that kind of make Tuple nice specifically for programmers. along with like all the performance things we're doing. The fact the fact that we're a native app, it's not hogging your CPU. So you can still compile your code while you're sharing your screen and pairing.
00:04:45
Scott Hanselman
You know, that's a great point. Like trying to use Zoom or Teams to pair program involves, like you said, a call or an appointment. You do the thing, you share the screen, you throw pixels across the wire, like however you choose to do it.
00:05:00
Scott Hanselman
some Somebody's at 4K, somebody's at 1080p, and then you have to do the whole give control. Are you sure you want to give control? It's whole dance. And i when you when you get with someone who's a programmer who types really fast, that lag as they type and then they wait for it to show up on your, you know, in your environment and your VS code is just
Addressing Lag in Real-time Collaboration Tools
00:05:21
Scott Hanselman
Like as good as Teams and Zoom are, there's there's a lag for typing and it's very uncomfortable.
00:05:26
Johnny Marler
Yeah, and that that matters a lot to developers. ah ah Pretty much everybody at Tuple is a developer. And so these are the sorts of things that we really pay attention to, that if there's any sort of lag and you're trying to type and code, it's not good. So that's something that we immediately flag and and try to optimize out.
00:05:44
Scott Hanselman
That's really interesting because you think about like screen sharing as a as a muggle, as a regular person. I think that if I asked my non-technical partner, she would say, this is just like a solved problem. Like screen sharing is a thing. We just it's it's universal.
00:05:58
Scott Hanselman
But then you start thinking about things like, you know, Nvidia Cloud or Xbox gaming. They're trying to get that down to like nanoseconds. like not milliseconds, but nanoseconds. They want to make that as as fast as possible. So screen sharing isn't a solved problem if you have a a niche you want to fill, like this needs to work for gamers or this needs to work for coders. And it sounds like you've optimized for typing in an editor with more than one mouse and more than one keyboard.
Developing Exciting Programming Tools
00:06:27
Johnny Marler
Yeah, and it's definitely a selfish endeavor. When you are a programmer and you start writing tools for programmers, you the big motivation is because you want a better tool.
00:06:38
Johnny Marler
So that's one of the big appealing things about Tuple for me is I love writing developer tools, you know stuff that makes your builds easier, your editor, things like that.
00:06:49
Johnny Marler
It's it's it's you know my thing. So Tuple is a great fit for me. And it's yeah it's it's fun to work on that sort of thing to make our lives easier.
00:06:58
Scott Hanselman
Do you think that Windows, native Windows apps, which is something that you have a lot of experience in, is a dying art? Are there few people that know how to do this well?
00:07:05
Johnny Marler
Oh yeah. Yeah. Anytime I've told people that we're doing native windows, they, they, you know, give me their blessing. Like I'm sorry that you have to go through that pain.
00:07:18
Johnny Marler
But I also think I have a bit of Stockholm syndrome, right? I've been doing windows for so long. It feels like, you know, that old friend that, you know, has some, some rough edges, but you learn to, you learn to love them because you understand them and you're familiar with them. So I feel like I have a,
00:07:34
Johnny Marler
a parasocial relationship with Raymond Chen from from reading so much of his writing on the inner workings of Windows. And now I get like excited to do something interesting in Windows. So you know one of the features that we have, like App Fail, that was when I when i first started on Windows, I don't think I would have had any idea on how to implement that. But now that I've gotten so familiar, it's it's just a like a fun challenge, you know a fun puzzle to solve. And I have all these niche tools and and ah nu
00:08:04
Johnny Marler
knowledge that that helps me do something like that,
Screen Capture Innovations in Tuple
00:08:07
Johnny Marler
which is fun.
00:08:08
Scott Hanselman
So AppVail that you just brought up is an app that keeps windows that you don't want to be shared from being shared. So if I go right now and I share my screen in the web browser that we're talking in or on Teams or on on Zoom, in the old days, it felt like they were basically just doing a screenshot you know, 10, 15 frames a second, and then doing all of the diff work locally.
00:08:34
Scott Hanselman
But there's like basically screen sharing APIs now, right? Like do operating operating systems have have noticed that people wanted to share their screens, that hitting print screen 20 times a second is not scalable.
00:08:46
Scott Hanselman
And we we we share that. So there is there a screen sharing API in in Windows?
00:08:51
Johnny Marler
Yeah. So I guess a bit of the history initially started out, there's an API called GDI. And GDI was like a like an abstract, nice, high-level API for doing graphics.
00:09:01
Johnny Marler
And they had a screen capture.
00:09:01
Scott Hanselman
Graphics device interface.
00:09:03
Johnny Marler
Yep, exactly. And Tuple actually started out mostly using GDI itself. Tuple's development has kind of followed alongside the history of Windows, where we've moved from the older technologies to the newer stuff.
00:09:14
Johnny Marler
So now we're using DirectX, Direct2D. The new Screen Capture API, there's a newer one that we haven't fully implemented yet, but ah there's there's a slightly older one, which they both share most of the code.
00:09:27
Johnny Marler
We now capture the screen from the Windows compositor via graphics textures, so GPU textures. And so it's called DXGI, I think, duplication something graphics. I don't remember the name.
00:09:41
Johnny Marler
the term. But yeah, now we get back a GPU texture. And there's an interesting story with this too, because you know now that AI is is such such a big part of of so many people's jobs, I can say that because of AI, we actually have a more efficient screen capture implementation, specifically Because with AI, i was actually able to write a shader that would keep the screen on the GPU and do the YUV conversion on the GPU.
00:10:14
Johnny Marler
So I had to write like a custom shader for that. And that's not something that I'm super familiar with. So because of AI, I was able to like immediately ask it, hey, how would you write this shader? And you know the thing that it gave me like kind of worked, like didn't really work that well. But it gave me that starting point so that I could actually get to the finish line in a reasonable amount of time. And so now all of our users have benefited because they're using less CPU to capture that screen and send it, you know eventually get it sent over the network.
00:10:42
Scott Hanselman
Yeah, the rise of screen sharing goes beyond just like Zoom and COVID and Teams and everyone being remote. It's also things like the Xbox Game Bar, like Discord, like Twitch, and people used to go and call Windows.graphics.capture, which is effectively like hitting print screen really fast.
00:11:01
Scott Hanselman
And then DirectX, the interface for that most games use, and the DXGI that you keep saying that DirectX graphics infrastructure, Basically lets you see how many graphics cards there are and how many buffers there are and how many display modes there are, and then grab those rendered frames out. So it was largely to get gamers to have high, you know, high speed graphics capturing things like OBS, the open broadcasting studio use it.
00:11:29
Scott Hanselman
So i would guess when you upgrade it to DXGI, you're going to see, or you have seen ah ah huge performance improvements like gamer level speed.
00:11:36
Johnny Marler
Oh, Yeah, no. We at WebRTC, because it supports screen sharing typically in your browser, it has its own implementation of this stuff. And we were using that initially.
00:11:47
Johnny Marler
But eventually, we ended up implementing our own version of the DXGI API and just like squeezing out. i think I think we were like averaging 50, 60 milliseconds to like capture that screen and get it to the encoder. to send over the network.
00:12:01
Johnny Marler
And I think we saved like 20 or 25 extra milliseconds by implementing it ourselves and like using a threading model that made sense with WebRTC.
00:12:09
Johnny Marler
So you know it takes work, but that's that's what we like to do. That's the fun part.
Technical Hurdles in Content Capture Prevention
00:12:16
Scott Hanselman
So app veil, V E I L veils puts a veil over, you know, sensitive apps. Like you might have, know, QuickBooks or something and you're sharing your screen. You don't someone accidentally see your QuickBooks.
00:12:27
Scott Hanselman
If you're grabbing the pixels as they get all the way out onto the graphics card and you know we're really, really close to the, to the glass of the monitor at this point. Uh, how would you then cover something up that had sensitive information like a social security number or a window that contained sensitive information if it's, if it's so close to the glass?
00:12:48
Johnny Marler
Yeah, I asked the same question like when when we first had this. We we added this feature to Mac OS, and I was just thinking, I have no idea how we're going to do this on Windows. But I did some research, and I found out that Windows actually has some built-in support for this.
00:13:02
Johnny Marler
So they have a concept of,
00:13:06
Johnny Marler
ah You You can maybe say secure windows or like windows that should not be shown when you're capturing your screen. And you can you can have two behaviors. You can either have the window show up as a black box when it's captured by the screen, or you can have it just completely gone so you can see what's behind it.
00:13:23
Johnny Marler
But the problem with that was only the process that creates the window is allowed to change that attribute. So somebody online on GitHub had some project that I found.
00:13:35
Johnny Marler
And what they would do is they would use the classic DLL injection. So i don't know if you're familiar with DLL injection, but it's super interesting if you ever like look into it. But there's like there just happens to be like some APIs. Which one is it? CreateThread happens to have the same signature as like load library.
00:13:54
Johnny Marler
So like you can execute this. like You can load the code. the The DLL that loads DLLs, the function off top of my head, it's like, it might be load DLL, I can't remember.
00:14:05
Johnny Marler
Or load library.
00:14:05
Scott Hanselman
There's load library, there's load library a, load library w depending on width and then create thread, create remote thread.
00:14:11
Johnny Marler
Yeah. Yeah, you use a create remote remote thread. And then you you map in a bit of the remote process's memory, put the DLL name that you want in that memory, and then call load library on the remote.
00:14:25
Johnny Marler
process. So with all that, you can just basically inject arbitrary code into the remote process. So this was the project that I found that this is not how Tuple ended up doing it. But it was like, OK, so we can change these windows in other processes using this injection method.
00:14:43
Johnny Marler
Luckily, we didn't have to do like such a hacky implementation. We ended up using what are called Windows hooks. And this also solved the second problem, which was once we get that window and we were able to like turn it invisible or turn it black, we need a way to be able to have a window behind it or alongside of it that shows it's being veiled.
00:15:05
Johnny Marler
And so what we ended up doing was Since we're hooking into the window, we get all the window messages for every single window on the system. And we can see, OK, hey, they're about to show a window. Is this a window we want to veil? OK, let's set that window attribute to make sure it's not visible in screen capture. So that there's base it should be impossible, if it's correct, to ever get window inside the screen capture using this method. and our window that we put behind to show that it's being veiled.
00:15:33
Johnny Marler
And this also gets captured so that the remote user knows also that there's a window there being veiled. It completely stays in sync when you change the size. There's no like lag that the the the veil border.
00:15:47
Scott Hanselman
Right, yeah, you you would imagine if you move the thing really fast or if you resize it really fast, maybe you'd see a peak of something.
00:15:54
Scott Hanselman
You're saying it's not it's literally not possible by virtue of the way the pipeline works.
00:15:59
Scott Hanselman
There's not a, I'm moving this and then I cover it.
00:16:02
Scott Hanselman
it's it's It's happening in a different order.
00:16:04
Scott Hanselman
and And it's worth calling out that, of course, if people are listening and they're thinking, well, DLL injection is you know ah a a bad thing. You could do malicious things like steal data. Absolutely, you could. But it's also used every day for very legitimate reasons like debugging. Like if you're using a debugger, you're using DLL
App Veil and Potential Standalone Features
00:16:21
Scott Hanselman
injection. The fact that you didn't use that and instead went with window hooks is great.
00:16:24
Scott Hanselman
The window hook for things like WM keyboard or WM paint, like those are normal window messages. You're basically saying, I want to hear about everything you do so I can get my chance to have something to be said about it.
00:16:38
Scott Hanselman
sounds like a very compatible way to do things.
00:16:40
Johnny Marler
Yeah, yeah. it's it's I think it would be compatible you know back to Windows 98, something crazy. so Yeah, exactly.
00:16:48
Scott Hanselman
So what is the relationship between app fail and tuple though? Like is is app fail just a thing you wanted to make or does app fail part of tuples so that if I'm sharing my screen and I'm doing pair programming, and i don't accidentally give away information that I don't want to show.
00:17:01
Johnny Marler
It's just a feature within Tuple. we I've never thought about like making app fail its own thing, but that could be a thing.
00:17:08
Scott Hanselman
Like you could put one suggestion if I could be so bold is you could put it into a windows power toys.
00:17:14
Johnny Marler
Yeah, you totally could.
00:17:15
Scott Hanselman
Right, like call call the PowerToys folks, let them know that this would be a really cool thing, and then everyone would get to use that, and that's kind of a living advertisement for whatever else y'all are doing. So, you know, there's lots of companies that have like their main kind of their main thing, and then they have the little sysinternals utilities that they that they give out to the people.
00:17:33
Johnny Marler
Yeah, yeah that's not that's something to consider for sure.
00:17:36
Scott Hanselman
Now, was that done in C++ as well, or did you use something like ZIG or another kind of language like Rust that can
Using Zig for Performance Optimization
00:17:41
Scott Hanselman
talk to APIs? Yeah.
00:17:44
Johnny Marler
Yeah, so that's interesting because a big part of AFL is actually written in Zig. And there's a technical reason for that.
00:17:54
Johnny Marler
way The way a window hook works is it works actually similarly to DLL injection.
00:18:01
Johnny Marler
You basically make a DLL, and then that DLL gets loaded through the OS into the processes that the when the hook needs to run. So the DLL itself is written in Zig.
00:18:12
Johnny Marler
And by doing that, we don't have to link in libc. And i think I think nowadays when you try to link in libc, it adds about like two megabytes. to the binary so i think like in the end it it ends up being like a couple hundred kilobytes and so that's kind of a big uh percentage and change just by adding just by just by writing it in the c or c++ plus plus language you have to add two megabytes to every single binary so well if you if you can yeah i mean like most most programs don't use most of what's in libc you know
00:18:36
Scott Hanselman
Oh, wow. And that's just unnecessary? You don't want the overhead?
00:18:47
Johnny Marler
especially if you're a small program, right? You're you're probably like using a handful of functions. so you But you have to take the whole entire C library and link it to.
00:18:54
Johnny Marler
There might be like linker optimisation optimizers that can tree shake and get it to be smaller, but
00:19:02
Scott Hanselman
Now, did you tell when you were when you worked at Tuple, did you say, you know, we're doing this in Zig? And they might say, that's a weird, obscure language that's not C. You shouldn't do that. Or does leadership just go, hey, cool, knock yourself out. I've never heard of that language. Enjoy.
00:19:17
Johnny Marler
but It's actually funny because i do a lot of work on GitHub and I made a project called ZigUp, which is one of the main version managers for Zig. And so the CTO at the time,
00:19:30
Johnny Marler
name is Spencer, starred my project. And i that's how I learned about Tuple. I checked out, it oh it's a seat guy's a CTO. what's What's his company? And I watched the pitch for Tuple and it was immediately like, oh, this these are my kind of people. like They care about performance. Like, like okay, let's let me let let me see if they're looking for anybody. And and they were looking for a Linux guy. So i got hired as a Linux guy after that.
00:19:52
Johnny Marler
And so the the guy knew that I was a Zig person. And I do i do try to like sneak Zig in where I can.
00:19:58
Johnny Marler
and I think at this point, it's it's not like, you know, it's not mainly written in Zig, but there's definitely a lot of tentacles that Zig has. A lot of the build system is using cool things from Zig and like this DLL and our installers written in Zig because it has the exact same problem. Our installer is like 12 megabytes.
00:20:18
Johnny Marler
And so adding, just writing it in C, you know, this few hundred lines program would add, make it 14 megabytes. So that's like a, you know, 20% increase in the size just for writing it and see.
00:20:30
Johnny Marler
So, but I really enjoy Zigg. I think it's a great language and and i want to do more of it. so
00:20:36
Scott Hanselman
Two things I want to say. One is just a shout out to like the the Zig friends. I want to make sure that no one comes for me in the comments because when I say Zig is this weird little, you know, obscure language, there's all these languages like Erlang and Zig where people are doing interesting, delightful work.
00:20:52
Scott Hanselman
But like the dark matter developer that like is just working at you know the IT department of like some random company may not have ever heard of Zik. If you're not the hacker news crowd, you've never heard of it.
00:21:03
Scott Hanselman
But it is a zero-dependency drop-in CC++ compiler. It does cross-compilation out of the box. It's tiny. And I think I told you when we when we met the first time that, like,
00:21:15
Scott Hanselman
I would have bet incorrectly. Like when the Zig fellas had the idea, i was like, this kid, God bless him.
00:21:23
Scott Hanselman
You know what i mean? i would i would have And I would have not, quote unquote, invested time or emotion. And I would have said, oh, you know, this is one of those hobby
Efficiency in Software vs Web Pages
00:21:31
Scott Hanselman
things. But gosh darn it, if they haven't built a big old community, just you know it's ah ah it's a simple language, it's fast as heck, which brings me to my comment.
00:21:41
Scott Hanselman
I thought it's funny that you're like, yeah, yeah this would be two megs that would be 12. And I'm like, I know websites with bigger PNGs than that.
00:21:49
Scott Hanselman
And they're like, okay, shipping that website. Like I've go to websites. Now you go to like the verge, you hit F12 and you're like, that's a 25 meg website, but you're shipping executables that do 10 times more in half the size.
00:22:02
Johnny Marler
yeah I just downloaded the the software for this microphone. 500 megabyte download to like control the lights. Yeah, 500.
00:22:10
Scott Hanselman
500 megs to have the microphone for the podcast.
00:22:10
Johnny Marler
Yeah. five hundred and
00:22:12
Scott Hanselman
Thank you for your sacrifice.
00:22:17
Scott Hanselman
But shout out to Zig. I need to get some Zig folks on the show because like these are the delightful things that are happening and what makes open source happen.
00:22:25
Scott Hanselman
And the fact that it's so well compatible with C and C++, plus plus it's just a, you know, Rust and Zig are really doing interesting things right now, I think in the, in the space.
00:22:35
Johnny Marler
Yeah, I just did a podcast with and hook I hooked up the last guy did a podcast with Laura. So Laura says the VP community of Zig. So I can totally pick you guys up.
00:22:49
Scott Hanselman
Yeah, that'd be fun. So writing native Windows apps, it's 2025. You're banged it out in C++ plus plus with a little bit of zig. It's a dying art, but you're getting things down into the milliseconds now. How do you even debug that?
00:23:03
Scott Hanselman
Like, how do you squeeze out 20 milliseconds? Are you unit testing? are you do you have an automated testing suite at the higher level? Like, where do you where did you find those milliseconds?
00:23:15
Johnny Marler
I think I'm going to give you an answer you may not expect. I, so I, I'm a big fan of, uh, like in the handmade community. I don't Uh, so some people may have heard of this, but it's, uh, Casey Muratori kind of inspired by his stream.
00:23:29
Johnny Marler
And he gives a really good talk on this subject and to summarize it, he just says basically write code that doesn't suck.
00:23:40
Johnny Marler
Like write code that.
00:23:43
Johnny Marler
I mean, that's basically the gist of what he's saying. But like like write reasonable code.
00:23:47
Scott Hanselman
Get good is what you're saying.
00:23:48
Johnny Marler
Yeah, it's a skill issue, maybe. But I don't
00:23:50
Scott Hanselman
It's a skill issue. I'm saying that as someone who's like losing to silk song right now and everyone on the line is like, get good, poser.
00:23:57
Johnny Marler
know. Yeah, exactly right. But I'll tell you, i have i do have a really good profiler. It's called Superluminal. it's just You just install it. And with any program, you can just run it. It gives you a like symbols, full profile of everything. It's amazing.
00:24:13
Johnny Marler
I've only had to use it a handful of times.
00:24:15
Johnny Marler
And it's usually just to like find out, OK, is this like, are we to be better off using this GDI thing or this DirectX thing or something? Like really high level, like what's the right approach to doing this?
00:24:26
Johnny Marler
Or like should we should we be caching this sort of object? But like I said, I've only used it a handful of times. In general, though, know after you've been programming for 15 years, is as much programming as I've done in that time as well, you just kind of like learn, like these are the things that you should do, these are the things that you shouldn't do.
00:24:43
Johnny Marler
And now it's just, You don't really have to spend a lot of time thinking about performance if you just write code a certain way, I guess. But you do have to learn.
00:24:50
Scott Hanselman
and Interesting.
00:24:51
Johnny Marler
you know There's a lot lot of time.
00:24:54
Scott Hanselman
So just for for context, Casey Muratori had a project called Handmade Hero.
00:25:00
Scott Hanselman
And the idea was, you know, this daily source code archives, and you can still buy these if you go to computerenhanced.com or mollyrocket.com. But the idea was write a thing from scratch. Like I've talked about this on the podcast before, the idea of learn to drive stick shift, you know, and it's a little bit, I would argue it's a little gatekeepy.
Learning to Code: From Scratch vs High-level Tools
00:25:20
Scott Hanselman
Because like we're at a time now where you could build a Call of Duty clone in Unity and like, you know, hello world is I'm already walking around in a 3D world. So like in a moment where we have like Uber, where you're just like, yeah, a guy just picks me up and drove me over there.
00:25:35
Scott Hanselman
Other people are like, I'm going to do it in Pico 8 and I'm going to do it in 4K. And like, I'm going to make a 3D engine from scratch and I'm going to read the Doom source code. it's It's very interesting to see who is choosing to use these tools and go that way and who is choosing to do it from scratch. And I think there's value in both depending on what you're trying to accomplish.
00:25:54
Johnny Marler
Oh, for sure. For sure. Yeah. you This is definitely the approach where you're making like like, like I said, like Tuple, right? It's for developers. We we care about this stuff.
00:26:06
Johnny Marler
And it's funny you mentioned that the Doom stuff. Casey Muratori also, speaking of since you're from Microsoft, did you ever follow the like controversy that happened with him and the Windows Terminal?
00:26:20
Scott Hanselman
Oh, was he the guy who was salty and he did the whole back and forth with the terminal people and they said such and such a thing is not possible?
00:26:28
Scott Hanselman
And he's like, yeah, it is. And then he went off and did it. And then they had a little back and forth.
00:26:31
Johnny Marler
That's it. Yeah, yeah
00:26:33
Scott Hanselman
Yeah, I remember that. I didn't recognize that that was the same person. I probably would have handled that with a different tone of voice, but that is that is an interesting thing when it's always fun when you're doing open source to say, I don't think this is possible.
00:26:49
Scott Hanselman
And then that's called nerd sniping. Have you ever been nerd sniped?
00:26:52
Johnny Marler
oh yeah. Oh, yeah. Oh, I fall victim to that all the unfortunately.
00:26:57
Scott Hanselman
Right, so nerd sniping is when you tell a programmer something is not possible.
00:27:02
Scott Hanselman
And then they can't function and they stop everything and they go off and they go, I must quit my job and solve problem. Right? So you got nerd sniped when someone told you to make app veil and then you went and did it.
00:27:15
Scott Hanselman
And, uh, yeah, I didn't realize that that was the same person.
00:27:19
Johnny Marler
yeah Yeah, in fact, I took his source code. He wrote a terminal and and published it. And I don't know you're familiar with Ghosty and Mitchell Hashimoto's project.
00:27:31
Johnny Marler
So I contributed a a Windows port to Ghosty.
00:27:36
Johnny Marler
And it sat there.
00:27:37
Scott Hanselman
That's very generous of you.
Appreciating Windows Design and Compatibility
00:27:40
Johnny Marler
I have the Stockholm syndrome with Windows, and now I like find it fun to add Windows support. I just got a native Win32 backend merged into Raylib, for example, too, as well. But yeah, for some reason, I
00:27:51
Scott Hanselman
I think windows Windows gets a bad name. like I like Windows. like I'm non-denominational. I've got a Mac sitting like right here that's updating. I've got ah ah a user ww WSL. I do all of my development for websites in containers in WSL.
00:28:06
Scott Hanselman
But like I literally enjoy Windows. I don't have Stockholm Syndrome. I enjoy it. So I kind of reject that that phrasing.
00:28:11
Johnny Marler
but You know, what maybe
00:28:15
Johnny Marler
I have definitely come to appreciate the design of windows. I'm i'm very impressed with the the whole way that the windowing system works, the messaging system.
00:28:25
Johnny Marler
I think like I've heard the term thrown around like actor pattern, but yeah,
00:28:25
Scott Hanselman
Mm-hmm. Mm-hmm.
00:28:31
Johnny Marler
Like I said, I think it's just Stockholm Syndrome, but maybe it's actually legitimately good. But but at first, it seems like overly complicated. But when you realize all the benefits of it, the way they did the windowing system, I think is is probably you know genius and probably underappreciated.
00:28:49
Scott Hanselman
Well, I think one of the things that Windows doesn't get credit for, and I would also shout out to Tuple for working like on older versions of Windows, is we don't get credit for compatibility.
00:29:01
Scott Hanselman
like i've Like my favorite laptop is an ARM laptop, and I can run x64, I can run x86.
00:29:09
Scott Hanselman
I did not notice when I moved to ARM other than it got cooler and the battery life got more. And on my X64 machine that I'm on right now, if I want to run like DOSBox X and I want to run VisiCalc from 1977, it still runs.
00:29:25
Scott Hanselman
But I've got a Mac that's a Mac Pro, and I tried to upgrade it to a Mac 26, and it was like, nope, sorry, bud. You're on Tahoe for the rest of your life.
00:29:35
Johnny Marler
I love that. You can take a binary that was compiled in the early 90s and run it on modern Windows. like
00:29:42
Scott Hanselman
Exactly. Exactly.
00:29:43
Johnny Marler
That's insane. Mm-hmm.
00:29:44
Scott Hanselman
There's an entire like application compatibility layer, talk about dnl inject DLL injection, where Windows notices you're trying to call old APIs and like you can still run Microsoft Money 95 and it'll be like, oh, he's going to call that. I'm going redirect him over there and it will work.
00:30:00
Scott Hanselman
So shout out to AppCompat people for making that happen.
00:30:03
Johnny Marler
Oh, yeah. Yeah, that's that's definitely one big benefit that Windows and other platforms are suffering because they don't have that compatibility. I think that could be a big reason why, you know, Linux never has has such a struggle, like taking up more of the market because they don't have that backward compatibility.
00:30:19
Johnny Marler
Linus himself, Linus Torvalds, he makes a scuba software and he does not distribute binaries for Linux. He distributes binaries for Windows and Mac OS because too damn hard.
00:30:29
Scott Hanselman
Yeah. Well, look look at how games work.
00:30:31
Johnny Marler
to make diner hits.
00:30:32
Scott Hanselman
Like i'm i'm I'm gesturing to my right where my Steam Deck is. And the geniuses that work on things like Proton to make like most of the games that are running on Steam Deck, which is Linux, are compiled for Windows. And there's that legendary blog post that says that the only reliable Linux API is the Windows ABI, right? If you want your app to run great on Linux, write it to the Windows API, which like Win32 is
Cross-platform Development Challenges and Closing
00:30:59
Scott Hanselman
forever. God help us.
00:31:01
Johnny Marler
Oh, my gosh, that's that's hilarious. and We've thought about too, like, hey, we should work on Linux again. Can we just take the Windows app and run it on Linux? Maybe that's how we support it.
00:31:08
Scott Hanselman
Maybe, right? Like there's a lot of cool stuff going on.
00:31:10
Johnny Marler
Yeah. I mean, yeah. I think we need to change a couple more things in the app. But yeah, but that potentially, like, I'm kind of half joking about that.
00:31:21
Scott Hanselman
Yeah, well, people can find tuple at tuple.app online. Where can they find you? Presumably on GitHub.
00:31:30
Johnny Marler
Yeah, my I have like a four letter, but it's marler8997 is my username on GitHub and other ah ah various places.
00:31:37
Scott Hanselman
All right. Yeah, if you just put in Marler 8997, you go immediately to Johnny's World on GitHub, where you can go and see ZigUp and any Zig and all the fun stuff that you're working That is a very green GitHub graph. You should be very proud of your work.
00:31:53
Johnny Marler
Oh, thank you.
00:31:55
Scott Hanselman
Are you Googling yourself right now? This is great to end on a...
00:31:58
Scott Hanselman
I'm going end the podcast on... Johnny is Googling himself just to confirm that he can find his stuff.
00:32:04
Johnny Marler
I can, yeah.
00:32:05
Scott Hanselman
Fantastic. Well, thanks so much for spending time with me today.
00:32:10
Scott Hanselman
This has been another episode of Hansel Minutes, and we'll see you again next week.