Future of Coding - Stop Being A Sysadmin For Your Own Machine: Nick Santos

Episode Date: May 22, 2018

Do you hate Makefiles and YAML config files? Do you feel your soul slowly dying as you wait for your tests to run? Do you yearn for even-more-continuous integration? Nick Santos, the CTO and founder o...f Windmill Engineering, is here to help. Windmill's a cloud-based build-system that intelligently runs your relevant tests in the cloud, in parallel on every file save. How's that for a tight feedback loop? futureofcoding.org/episodes/24Support us on Patreon: https://www.patreon.com/futureofcodingSee omnystudio.com/listener for privacy information.

Transcript
Discussion (0)
Starting point is 00:00:00 Hello and welcome to the Future of Coding. This is Steve Krause. So, surprise! I have three episodes for you this month. As you can see, this is number three. I hope this makes up for missing March and April. I think I can stick to this one episode per month thing from now on, but occasionally I'll have to make up for missing months with more episodes in other months. So this interview with Nick Santos actually came about because I bumped into him at a party at my friend Kyle's house. Thanks, Kyle. And usually the conversations I have with people at parties when we talk about work is pretty sparse. They say, what do you do? And I say, I work on developer tools and
Starting point is 00:00:47 programming languages. And that's where the conversation ends. But this time, when I said that, Nick said, Oh, me too. And we were both kind of shocked to meet someone else at a party pretty, pretty randomly. You know, I will say, to be fair, that this is a party thrown by a computer science engineer, and many of the people who are at the party also studied computer science with him or worked with him at other companies. So we all are engineers, but still within engineering, DevTools is a pretty small niche. By way of introduction, Nick Santos studied computer science and math at Dartmouth College. He was a staff software engineer at Google, where he worked on consumer projects like Google Docs.
Starting point is 00:01:29 And he was also a software engineer at Medium, where he worked on the editor experience. And now he's the CTO of Windmill Engineering, a dev tools company that brings a live editing experience to your build process. Please enjoy. I'm here with Nick from Windmill Engineering. We're here today in New York City at Workbench, which is a venture capital firm and also a co-working space. Welcome, Nick.
Starting point is 00:01:54 Hi, Steve. So I guess to start with, I wanna talk about why you started this company, like what brought you to it, and yeah, the background, what you guys do. Okay. How best to approach this? So Woodmill is a dev tools company.
Starting point is 00:02:14 We believe that engineers spend too much time waiting for dev tools. How I got into dev tools, I'm not from a dev tools background much. Most of my career has been on consumer work tools. I worked on Google Spreadsheets for a long time. I worked on Forms. After that, I worked at Medium working on their editing tools and their writing tools. One of the common themes of all of that was that JavaScript tooling was really terrible, that just working with a large team and a large code base in JavaScript was always a pain.
Starting point is 00:02:53 So we ended up writing a lot of our own tooling. I ended up working a lot on a tool called Closure Compiler at Google, which was a JavaScript type checker. And through Clojure compiler, I ended up meeting my co-founder at WinMill, who also worked a lot at DevTools at Google. And one of the things that we talked a lot about is how the DevTools experience today is kind of sad and requires you to keep a lot of state in your head about how the tool works. The classic example being Git has all this complicated state about where you are in the
Starting point is 00:03:33 rebase and where you are in a branch. And we really wanted dev tools that were a little bit more visual and a little bit more like Google Docs or Google Spreadsheets where you can just play on a web page and start typing, and it starts giving you feedback immediately. And that's kind of how we got here. Cool. Yeah, that makes sense, how you were inspired by the consumer work and the developer work together. You wanted the developer experience to be similar to the consumer experience.
Starting point is 00:04:02 I think a lot of us are motivated by that sort of vision. I'd be curious to hear more about your experience on Google Closure and how it relates to what you're doing now. Oh, boy. Closure Compiler is an interesting project in the sense that it grew very much out of what we needed at the time, that it became way bigger of a project than we expected. It was very much, hey, we have this team of, you know,
Starting point is 00:04:34 dozens of engineers working on this JavaScript code base. They're constantly making mistakes, constantly passing the wrong arguments, and mistakes that like, hey, some team is developing a sharing library and another team is using that sharing library and the team that's using that sharing library is passing the wrong argument in and they're in an argument about, okay, whose fault is this? They're in an argument about arguments?
Starting point is 00:04:58 Yeah, exactly. And so Clojure and product started out as, okay, let's just push everyone to start writing their types in comments. And then after the fact, we're going to rigorously write a type checker for the types in the comments. And that way, people can start writing their types now. And we will gradually, over time, be able to check them better and better. Got it. So it sounds similar to TypeScript and that kind of movement. Yes.
Starting point is 00:05:30 We started Closure Compiler in 2006-ish. We started the type check of Closure Compiler in 2006 or 2007-ish when everyone thought that ES4 would be a thing. I don't know if you know the history of ES4. No. ES4 was this proposal for JavaScript to add pipe checking to JavaScript to the main language. Wow.
Starting point is 00:05:50 That was really exciting, but just never got released. Huh. That's fascinating. I never heard about that. There is a spec. I'm sure you can find a PDF somewhere. It was very ambitious. Maybe someday there will be real types in JavaScript. Closure Compile was very much the seat of the pants. We're taking the spec. We got a
Starting point is 00:06:13 spec. Let's start implementing it now. Maybe a score will happen. Cool. I get it. TypeScript had the benefit of being more well designed up front. Or Flow, Facebook's project, Flow.js. I don't want to say that, yeah, Closure Compiler was certainly not as well engineered as either of those projects. Let's talk more, I want to get a better understanding of what you're working on. So what is, yeah, what is, what problem does WinML solve and how does it try and solve it? So we believe that developers spend too much time just searching in the dark to try to figure out if the change they just made broke anything. That you've made a change, you don't
Starting point is 00:07:03 know if it's going to work or not, and you have to figure that out. What Windmill does is you describe your build pipeline, and you try to describe it in as small units as possible, and we try to figure out what you should be running next for your next 10 seconds of development. The next 10 seconds of development. So when I first heard about this, I thought it sounded very similar to continuous
Starting point is 00:07:28 integration testing in the cloud, but instead of increments of every commit, it's every control-S save. Right, exactly. Yeah, every time you save, we try to say, we're going to upload your change to the cloud and try to figure out, okay, based on what you just changed,
Starting point is 00:07:44 what should you be running? Yeah, there's kind of a branding problem in the sense that continuous integration is taken and it's actually continuous. It's more continuous than continuous integration. So what are you gonna call it? Live integration, maybe. Live integration is a cool one
Starting point is 00:08:00 because it kind of evokes the kind of live reload workflow that we really wanna evoke, that we really admire. Yeah, that makes sense. It feels also very Google Docs-y, that you're patching changes very live. You still wait for save. You don't do it as a- We still wait for save, yes. You don't wait for the, not just on keystrokes.
Starting point is 00:08:21 Yes. That makes sense. We could. You could. We've talked about, there's got to be a. That makes sense. We could. You could? We've talked about it. There's got to be a way to do it. Maybe someday. So one obvious advantage of using a cloud-based built system on every save is that it can definitely speed things up.
Starting point is 00:08:39 You can paralyze things. And you mentioned that you could also order things smarter. How does that work? So right now we look at the file that you just edited and we try to figure out, first of all, what does that affect? Which sometimes depends on language. It's a very basic analysis. And what is the likelihood that based on what you just edited that something will break? And try to figure out, I mean, this is kind of, I hate to say machine learning because I think machine learning is so
Starting point is 00:09:10 overblown right now, but like machine learning has this great concept of information gain. That like, what is the amount of information I expect to get from this action? And figuring out, okay, what's, what is the thing that can get me the most information now? And trying to figure out, and then running math. So you're figuring out which tests to run? Yes. And so how are you connecting a test to a file? So right now, we look at just basic dependency information is the first thing when we have it.
Starting point is 00:09:49 So like a test will depend on a file. You'll see that it calls methods that are in a file? Right. Or like for Go, for example, Go has a tool called GoList, which lets you say, what does this test depend on? We can figure out the depends on this file. There is a statistical approach, which is just saying, hey, if you're editing this file and we're seeing every edit,
Starting point is 00:10:13 we have this stream of data. And we can say, hey, we can see that you've made a bunch of changes to this file, but it's never broken this test. We can be pretty confident it doesn't break that test. And there's some statistical kind of fuzz factor you can add in there to make sure that it still runs at some time and just double checks. But over time, we can build confidence of whether it changes this file or changes this test. Got it. Yeah. So you're bringing machine
Starting point is 00:10:42 learning to the build process and testing. I would say we are, yeah. I would also, but I would clarify this, 80s machine learning, not deep learning. Got it. Cool. That's good.
Starting point is 00:10:55 I like your insistence on anti-bubble and anti-hype. Like, this is simple technology that's going to make things better. This is, I'm not trying to promise something that I can't deliver. There's no Alexa, what is it, Samantha from that movie. Yeah, I'm not going to be like a human intelligent person. It's just very basic. Yeah, we think this is a basic statistical tool that we can use to kind of take it to the side.
Starting point is 00:11:21 Got it. So you're running this whole company to make the feedback loop tighter for developers. Why is the feedback loop so important to you or developers? I mean, I think you're a Brett Victor nerd. I am not so much of a Brett Victor nerd. But I definitely believe that in all of things, not just in programming, that just feedback makes people better, that feedback is made to be better,
Starting point is 00:11:49 and that it is important that feedback be instant. For, yeah, for anything. Yeah, like one, and you're definitely right, I'm a Brett Victor nerd, and this is his thing, and so I'm all about it. One, just to hold the other side of the argument, I saw a study that showed that if you have a GUI-based interface, or this is like an analogy,
Starting point is 00:12:16 if you have a GUI-based interface or a keyboard-based interface, even if the GUI-based interface is faster to accomplish a task and you can time the tasks, people will say that the keyboard interface feels faster, even though it's like empirically slower because it just feels more fluid than moving. But you don't, because you don't notice the time it takes to like do multiple keystrokes, but you notice the time it takes to move your mouse and just feels clunkier.
Starting point is 00:12:42 And so sometimes I wonder when I'm frustrated, when things take time to build or run tests, I wonder, is this frustration worthy? I am frustrated, and that's a problem we could fix, but is it actually slowing me down, or does it feel slow? Is it a perceived problem or a real problem? Yes. Yes, that is an important distinction.
Starting point is 00:13:10 The perceived latency versus real latency. I'm not sure. I have to think about that, I think. Okay. I think we believe to some extent that there is a value in having the feedback be automatic. And being able to say, hey, the feedback is automatic and we're pushing the data towards you before you need it.
Starting point is 00:13:38 Or before you think to ask for it. for. So I think I would make the distinction between the GUI versus the command line interface, which I think is a separate access than the interface of is the feedback automatic or do you have to ask for it? Can it push versus pull? Interesting. Okay. Yeah, I could see that distinction. So it sounds like you're working on both sets of problems. You're making the feedback push and you're making the feedback easier to get. Yes. I think Windmill has a lot of interesting problems
Starting point is 00:14:24 and kind of distributed build system space, but we also believe that there's a very difficult UI problem. That is, hey, we're pushing five tests running in parallel at you, and that can clearly be overwhelming. Or, you know, 100 tests running in parallel at you. We don't want to do that. We don't want to be Clippy for testing. Oh, interesting. Yes, I'm glad you brought up Clippy. There are a lot of developers you were talking about. I've talked to a lot of people who
Starting point is 00:14:54 are working in this space who call what they do Clippy for developers. Oh, yeah. I hate that. Yeah, why do you hate that? To me, Clippy is the example of pushing data that's not relevant and not useful, and pushing it, being too aggressive.
Starting point is 00:15:15 And to me, there's very much a UI problem of trying to figure out, based on what the user is doing right now, what they want. And I don't know that we have an answer for it yet. I mean, the closest example I can give is maybe the medium text editor. There is no bold tool on the screen.
Starting point is 00:15:37 There's no bold button on the screen until you select something. And then the bold button appears. We thought a lot about how that interaction should work and how that should surface. Oh, I see. That's an example of a solution to a UI problem. Yes.
Starting point is 00:15:53 Then we try to make sure that the tool, that if the tool is on the screen at all times, that is a UI failure. That really, we need to kind of watch your actions and try to figure out when you need the tool. That's fascinating. Just to see if you need the tool. I never thought about that in Medium, that there's no bold button. But it's there when I want it.
Starting point is 00:16:14 But it is, yeah, perfect. Yeah, I wonder if other Word document editors are gonna adopt that UI. There's some, I think, that do, but yeah. Fascinating. So there were a few words that I read in some of your initial blog posts that I want to dig into. One of the words is reactive, that you're building a reactive system for build tools. Another is the difference between imperative and declarative build system languages.
Starting point is 00:16:53 So you take a pick which one you want to address first. I'm curious how you define reactive, since reactive is a big buzzword now. I think it's a buzzword that I'm very excited about, to be clear. I think I just stole the word from your blog post. Oh, okay. Good, good, good. You can read the blog post then. Reactive to me just means I update one thing
Starting point is 00:17:17 and the thing that depends on it updates without me having to tell it to update. And there's kind of various definitions of what that means. Dependencies managed automatically. Yeah, it just kind of rebuilds without being told to do so. Rebuilds without being told to do so, okay. And just having that automatic, I mean, that is to me is like the React JS kind of definition of it. You update a model, the view changes.
Starting point is 00:17:46 This seems to be where these tools should go. And so how do you architect a reactive build system? That's a good, that's a very broad question. I think it's... I'm not sure I even know how to answer that in a pithy way. Okay. Maybe I'm misunderstanding what you guys are doing. You're not doing something...
Starting point is 00:18:20 No, we are building a reactive build system, but I'm not sure if I can summarize how you build one. There's definitely the... So there's a couple of schools of thought here. How much do you know about Bazel? Bazel. I think you...
Starting point is 00:18:37 I read your blog post on it. Yes. So Bazel is Google's build system. For Go? Or just for everything? For everything. Oh, Google builds in a huge repo. All the code is in one repo.
Starting point is 00:18:50 And everyone uses the same build system. And that build system is Bazel. Modulo some letters that change. And the idea is that you describe a build graph. Yeah. And that build graph exists in very much an abstract way. And they are literally modeling this build graph. And then they follow the DAG.
Starting point is 00:19:17 They follow the DAG? They follow the DAG. The DAG, yes. The direct exit graph. Yes. We think that might be the way to graph. Yes. We think that might be the way to build build systems. We are not convinced it is the way
Starting point is 00:19:31 to build build systems. One of the things that Windmill is experimenting with is this is going to be a little bit bananas crazy right now, but maybe you don't have to have the whole DAG in memory. maybe you don't have to have the whole DAG in memory. Maybe you don't have to have the whole build graph in memory.
Starting point is 00:19:50 Maybe you can explore that you start with a point and you say, okay, maybe I have two inputs. What if I assume, just for the sake of argument, that one of these inputs is okay? And just rebuild the other one. Or maybe the better way I would put this is that not only do you not have the whole build graph in memory, but one of the great insights in computer science that we keep rediscovering over and over again is branch prediction.
Starting point is 00:20:27 That is, you're giving me a puzzled look. Yeah, what's branch prediction? Branch prediction is when the hardware guesses what the output of this if statement will be. And starts executing on the assumption that it is true or on the assumption that it is false. The hardware makes the prediction. Yes. Based on... You would have to talk
Starting point is 00:20:54 to a more hard... It sometimes records. It records the history. So similar to statistical machine learning-y type things? Not that sophisticated. I mean, this is a great insight type things? Not, yeah. Not that sophisticated? Not that sophisticated. I mean, this is the great insight of the Java VM, too, right? That, hey, the Java VM, if you do, like, an if statement check, right,
Starting point is 00:21:14 or if you do, like, a virtual method call, it will say, hey, I'm pretty sure I know what this is. I'm going to jump assuming that it probably is what I think it is, and then I can rewind if I have to. Interesting. So like if you run a loop a thousand times and every time the if check statement is false, it like, it kind of, it'll just, it'll, yeah. Right, if you know the loop is going to run a thousand times, you don't really have to do the if check. You can just keep running the loop and then, oh, you went too many times, let's back up. I think buildisms could benefit a lot from this kind of thing in the sense of like, hey, 90% of the time you're running a test against the database, you don't actually need
Starting point is 00:21:57 to restart the database. Interesting. Does this make sense? Yeah. So you can just say, I'm just going to leave the database up, and I'm going to run the test again. And in parallel, I'm going to restart the database and run the test. And maybe I was wrong when I left the database up. Maybe the database really does need to restart from scratch to make the test work. But now I can get faster feedback by just assuming everything's OK. Interesting. Yeah.
Starting point is 00:22:25 So yeah, you're using compilation techniques that normally were used for hardware compilation of code, but kind of more in the cloud. You're using similar ideas, but different, like, compile target? Yeah. The idea is, I mean, I guess this is an idea from bytecode execution of, hey, could we just treat a build system as any other interpreter and do all the kind of cool techniques that we think of in any other interpreter to kind of speed things up? Certainly for correctness, there's a big difference to me between what you're willing to do for correctness versus what you're willing to do for fast feedback.
Starting point is 00:23:11 And those can actually be separate pipelines. Oh, interesting. I kind of want to dig into that. Yeah, so why are those distinct? Correctness versus feedback. Because you can cheat. If you're not worried about correctness Because you can cheat. If you're not worried about correctness, you can cheat, right? Isn't correctness important for feedback?
Starting point is 00:23:32 That's a good question. I think it's more of like, hey, we can get you feedback quicker, and we will eventually get you the correct feedback. And maybe we can communicate you two in some way, that hey, this is what we think is going to happen. Like we think this error is going to happen. And in a lot of cases it will be like, hey, this is going to fail.
Starting point is 00:24:02 We're pretty sure this is going to fail. Or we ran compile first without rebuilding the dependencies because we think that's the smart thing to do right now. Got it. So you're giving really fast feedback, but it's not 100% sure correct. And then if I wait a little bit, then I'll get the correctness guarantee.
Starting point is 00:24:24 Or you could just look at the error message and see. Maybe a classic example. Do you program in Go at all? No, I've never programmed in Go. Do you ever use protocol buffers? No. Or Thrift? I'm sure listeners have.
Starting point is 00:24:40 Anyway, suppose you have some JavaScript code, or JavaScript or whatever. But you depend on some generated code. So maybe your grunt build system rebuilds the generated code each time, or does the transpilation each time, because that's what it has to do for calculus. But actually, you don't need to do that. Most of the time, the transpilation will succeed.
Starting point is 00:25:01 And most of the time, it will just count the same results. Yep. Okay. Oh, I see. So you don't need to do that step. Right. And if you see an error message related to, say, the generated toad, okay, you're like,
Starting point is 00:25:17 oh, yeah, it's still regenerating that part of it. And so that's why those error messages are showing up. Yeah, I think, like I said, this is the crazy banana pants kind of build system that we're not even really doing yet, but we are excited about if you have a cloud-based build system, there's a lot of cool things to explore. Yeah. I'm getting excited about the idea of sharing things between colleagues somehow. If it can detect that you're building the same sorts of files as colleagues, it can just share the results from a task? Yes.
Starting point is 00:25:59 Yes, that is another big one. What's another exciting example? Yeah, the sharing results is a good one. The sharing... To me, there's also the sharing... Sharing artifacts, which is the way I would describe it, but also sharing results. That is, hey, if I build something and it failed, but I don't understand why,
Starting point is 00:26:26 I can send that link to a coworker. And the coworker can say, oh, yes, I can look at, because all of this exists in the cloud, I can look at the error message. I can look at exactly what's in your code base and not have to do the dance of, oh, I'm going to shove my failing branch up to GitHub and then copy a bunch of paste and such and stuff.
Starting point is 00:26:46 Yeah, that's a really good point. I was just, when you showed me the demo recently, just to describe what I saw to everyone who didn't get to see it, every time you hit save, it runs all your check. It creates a new URL for you that has all the tests that were run and all the error messages. So there's no copying and pasting error messages. You just copy and paste the build link.
Starting point is 00:27:07 I guess it's similar to when you, like, submit – when you push a commit to Circle or whatever you have in the cloud, you should just send that link to someone. It's that, but for every save. So there's no need to commit. There's no need to worry about Git in order to share links. Right. We can just do it automatically for you.
Starting point is 00:27:30 And yes, the best part about doing it on every save is you can say, like, oh, I broke this. When was the last time it succeeded? Like, has it been broken for a while? And I'm excited about a lot of those possibilities rather than having to explicitly create checkpoints. It's more of the, I mean. Fascinating.
Starting point is 00:27:48 Have you used Glitch? Yes. So Glitch has this live mode that I'm actually super excited about, where you can kind of rewind back to a project and see the rerun state. Yeah, I think this is, oh, yeah, that's exactly. Like Google Docs, like the rerun state. I think this is, oh yeah, that's exactly. Like Google Docs, like the rerun. And you guys can do that too, given that you have every save.
Starting point is 00:28:12 Yes. I guess you can't do keystroke by keystroke rewind. We can't do keystroke by keystroke. Yeah, we can do save by save rewind. Cool. I guess on the downsides of running the cloud, I did some research into Kite, which a lot of people are familiar with. It's similar in that they store the user's code
Starting point is 00:28:33 in the cloud. And I saw on Hacker News and just in a lot of places, there was a lot of backlash against Kite. Well, for other reasons too, but I think there was a lot of negative response for like, ah, I don't want my code in the cloud. Like that's insecure. What are your thoughts on like the downsides of coding the cloud? How to overcome those? This was the hacker news. So this is something we hear a lot, that there are definitely some companies who don't want to store their code in cloud. We think that is not the way the world is going.
Starting point is 00:29:11 Do you have an on-prem solution? We are a very early startup. If someone comes to us tomorrow and says, we will throw money at you to give us an on-prem solution, we will figure it out. You'll do that too. Okay, I got it. Yeah, so you can do it either way. But you think everything's moving to the cloud, GitHub's in the cloud.
Starting point is 00:29:35 It's like a myopic view. Yeah. I mean, I'm actually super interested in the on-prem space and how that space seems to be evolving as, you know, when I worked on Docs, Docs had some interesting, we call them geolocation problems of people who want their data to be restricted to a certain geographic region, right?
Starting point is 00:29:57 Somebody who only wants their data to be in a certain data center, or someone who doesn't want their data to be in a certain country. We won't describe specific countries involved in this. And this would be like a company, like a Fortune 500 company would say, we don't want our data in Turkey, whatever. I'm just making up a country.
Starting point is 00:30:17 And you'd be like, okay, we'll add you to the list of, and they're a paying customer? Or could I contact Google and say, I I don't want to get it stored in California? I think if you were enterprise customer of like Google Apps, you can set restrictions. Oh, interesting. I don't know how it works now, but it's interesting to me, there's definitely, there are definitely some people who believe that on-prem will be a thing for the foreseeable future. And what will end up happening is that you will have these virtual private clouds. And any software as a service will just say, great, I'm on Kubernetes. I can deploy to your cloud if you want me to.
Starting point is 00:30:59 Yeah, I see. The interface will be the same. And it'll be seamless whether or not it's your cloud or their cloud. It's seamless either way. Yes. I'm super interested in that vision. If that vision of the world comes to fruition, I think that will be... I will be surprised by it, but it will still be super interesting.
Starting point is 00:31:19 Yeah. Yeah, fascinating. Because at the end of the day, it'll still be on Amazon's cloud, probably. But I guess if you want to buy a computer, you can buy computers. Yeah. There's also the other interesting question is if you have a couple of clouds, what would be like Coke and Pepsi? If there's two clouds, or if it just ends up just random real estate company is getting
Starting point is 00:31:40 into coasting clouds. It's not a space I'm a lot involved in, but I just, I like hearing about it and gossiping about it. Cool. So I find it fascinating that you're in the build tool space, particularly just randomly. I had a recent experience working, doing some contracting work for a company
Starting point is 00:32:03 and I got like up to speed with their build tool system. And it was just a frustrating, frustrating, like, six hours, like, learning their commands. Things wouldn't compile. It was just, like, the thing that watched files wouldn't work. It was just, like, a whole nightmare. So I'm, like, really excited to find someone who's, like, trying to make this experience better.
Starting point is 00:32:25 Another thing to mention is I think that I particularly don't like build tools more than other engineers. I run this project for kids. I make this online programming language called Woof, and it has logins and stuff. It's like a website, like a normal app. But I refuse to have a build tool. It's like just HTML, CSS, and JavaScript files on GitHub pages. And then there's Firebase.
Starting point is 00:32:53 I hate build tools that much. And a few times it's bitten me, not being able to import files and stuff like that. So I've tried to add build tools. And every time I get an hour or two in, I'm like, I hate this. This is the worst. And I just stop. So I thought he'd be a good person to explore my hatred and terrible experiences
Starting point is 00:33:13 with build tools with. This is super interesting. Can I ask you to a little bit explain more? Have you used a JavaScript linter? Or a CSS linter? Yeah, yeah, I have. Linters are fine.
Starting point is 00:33:30 I don't have a bad experience, especially when they're integrated with the text editor and they show up in the gutter. I have no problem with that. Yeah, so let's dig into that. So you're not opposed to build tools then? You do use a linter. Yeah, yeah, that's true. That's true.
Starting point is 00:33:46 Okay, so what do you not like about the build tool thing you dislike? Build tools, usually there's, like, a lot of frustration involved. Installing the build tool is, like, a headache for everyone involved. So that's, like like one big pain point. That could take hours. And then configuring the build tool isn't a one-time cost. Like once it happens, like they're immediately, like they're like constantly problems and you have to like reconfigure it.
Starting point is 00:34:18 So that's like another series of problems. And then I think there's like a set of abstraction choices that the creator of the build tool makes that don't always make sense to me. And so understanding their way of thinking. Yeah. Do you get a sense of why I'm so allergic to them? Yes. Yes.
Starting point is 00:34:40 Because the app itself is a tool that people use to learn to code, I have a lot of newbies who want to make it better. And I think it's a good project for that. And in order to, there's one piece of the code that needs to be compiled by Babel. And so that's the one thing that needs to be installed and run. And I made that compromise.
Starting point is 00:35:05 And even that causes a whole headache, just running this one val command. Yes. So anyways, I'll let you. I totally agree with that. To me, there's so much about using build tools that is being a sysadmin for your own machine. Yes.
Starting point is 00:35:21 Every time we onboard someone on the windmill, we have to go through the whole Python 2 versus Python 3 dance. And there are just some things on that machine that are Python 2 and some things that are Python 3. And everyone wants to manage it with PYN for whatever the newfangled thing is. I don't want to do that anymore. I don't want to business this man. But that's not why I came into this industry. So how are we, how, like, sometimes it feels like this is an unsolvable problem. Like, you know, you're combining a lot of different languages and they're changing dependencies.
Starting point is 00:35:55 Like build tools kind of like fill in the gaps of where languages kind of leave off or connect to each other. Yeah. Can we ever fix? So the problem exactly is that you're running build tools on your own machine. That's the first problem. And because the build tools all have to live on your own machine, they all have to coexist on your own machine
Starting point is 00:36:17 in a way that once we start running build tools in the cloud, which is what I'm most passionate about, is like, oh, right, you can run the Go compiler in one container and the Babelgen compiler in a different container. And they don't actually have to live on the same solution. Yeah, so that sounds like a dream. But now I'm wondering, I actually
Starting point is 00:36:38 want to see the result. Running the tests in the cloud, that's fine. But what about I want to interact with my whatever code I wrote. I want to, like, you know, like, have a repli experience. Are you, like, sending back, like, how am I interacting with my code? You know, like, just because the tests are in the cloud, does that mean I don't have to build anything on my machine ever? Is that the world you're building towards? Yes. Interesting? Yes.
Starting point is 00:37:07 Interesting. Yes. Okay. I pretty strongly feel that we are moving towards a future where the code will not live on your machine. And there's a question of, to me, the big question is not if that future is, but it's like, what is the path towards that future? Okay. Because, yeah, definitely in the near term, that's not going to happen.
Starting point is 00:37:26 Like, we're not, you know. Right now, you're just running tests. You're not, like, running a REPL kind of thing, you know. You see the, like, because still, even with Windmill, like, the Windmill that might exist a year from now, I'll still have to also run, I'll have to set up all the build tool stuff on my own machine, too,
Starting point is 00:37:43 because I, like I need to interact with it on my machine. Yes. I think one year vision, you also have to build on your machine. Five year vision, maybe you ask Windmill for the artifacts. Artifacts aren't quite compiled code or more of a... Could be. Could be.
Starting point is 00:38:03 You ask Windmill for what you need to run the binary on your machine. I don't know what the path looks like. Honestly, I'll be totally clear with you. I think we're trying to figure out at this point what are the baby steps towards that reality. And we think
Starting point is 00:38:20 tests are a pretty good start. Yeah, we may be wrong. Maybe there's another... It's going to be another path. Got it. Okay. But I'm glad that you are moving towards this world where, yeah, you don't have to be a sysadmin. You don't have to understand, yeah,
Starting point is 00:38:39 I guess it's the sysadmin world in order to be a programmer. Yeah. Yeah, Heroku, I guess. Like all the DevOps as a service companies helped move us in that direction. And this is probably one of the last remaining vestiges of programmers are also sysadmins. Yeah.
Starting point is 00:38:56 I mean, I've definitely talked to people who believe the future of web IDs. I've talked to people that say, no, the future is you're going to keep a persistent VM in the cloud and just put SSH into it all the time. So that's what I do. Really? You do this? Oh, you're one of the few specials. Cloud9 plus, like, Cloud9 provides, like, an SSH, like, box for me.
Starting point is 00:39:20 But, like, sometimes if I want to, like, run Docker, I can't. They run Docker, so I can't run Docker inside Docker. So, like, I need to, like, they run Docker, so I can't run Docker inside Docker. So I need to find my own box. But it's terrible. Like installing. I still have to be a sysadmin. Interesting. So you still have to do a bunch of install commands to get the NPM into a good state.
Starting point is 00:39:39 Yeah, totally. Because you want to install NPM. You want a different version of Node. And then, yeah, it's like a whole mess. Yeah, yeah, yeah. I mean, one of the bets we're making is that you will run around some part of your build process in one container and some part of your build process
Starting point is 00:39:57 in a differently configured container, and that a lot of the system and stuff is just making the tools coexist. I'm not sure if that's the right frame, but I don't know. I'm excited for the future. Let's see what mistakes we make tomorrow. I'm curious what you think the
Starting point is 00:40:13 upper limit on how good we can make, or I guess a lower bound on how bad build tools have to be. How good can it go? Where is the inherent versus incidental complexity in this space? Yeah, what's utopia? I mean, there's different visions for utopia. There's the one vision of utopia, which is that programming languages of the future look very
Starting point is 00:40:37 different than programming languages of today. There's another vision of you have a server and you make a code change and you reload that server and just everything's been recompiled and it's a new server up. A new... So I reload the server? That is, you recompile the complete... You totally recompile the server and bring up a new one every time you... Every time you continue to save. In the same way that JavaScript development works today.
Starting point is 00:41:09 Or live reload JavaScript, not all JavaScript development, but live reload JavaScript development works today. And that's one possible vision. I'm not sure, I don't necessarily have the answers. So your vision of the future is more like, programming looks like the language we have today, but the build tools feel like hot reload React JavaScript development. Right. Yeah.
Starting point is 00:41:32 And will I still have to write a makefile-y type build system, or do you think one day we'll be able to get rid of makefiles? Oh, I dislike. Oh, we haven't talked at all about MIG files. I am frustrated with the current state of build tool configuration. File-y things? Like the NPM... What is it for NPM? The NPM JSON.
Starting point is 00:41:58 Package.JSON. I'm not a big fan of the CircleCI or the Travis YAML files. I'm not a big fan of makefiles. To me, the problem with all of those systems is they're, on the one hand, they're very declarative, which is nice in some ways. But declarative languages are kind of hard to debug and hard to visualize what's going on. And you end up having to do a lot of visualization in your head of what's going on and you have end up having to do a lot of visualization in your head of what's going on uh the windmill build language which is more just configuring what commands to run looks very imperative it looks uh more like just normal python you would
Starting point is 00:42:41 write on a rainy day. I don't know if I, we like that much better as an approach than rather than trying to like voodoo a declarative language into YAML, which I see a lot of people do. Yeah. I think, but I think there's entirely a possible ability like visual build languages, just like being able being able to see the graph and see the steps and say, hey, I want to rerun this step.
Starting point is 00:43:13 OK, yeah, yeah. And you're imagining nodes, like a DAG, like a DAG that you can add a node, wire it out. It could be a DAG. Some people have pushed back against this. There's also one UI paradigm I thought is just layers. You just say, you want to build this thing. Here are the layers that you could rebuild.
Starting point is 00:43:33 And rebuilding one layer builds all the layers of it. Got it. Sometimes I think YAML files approximate this. Like, just so, yeah? And so you just want to make it you know, just... Yeah. And so you just want to make it, like, just a better UI. Yeah. I think, yeah, I think YAMLs are basically not a good UI for this. Interesting.
Starting point is 00:44:02 I want to dig into the declarative, imperative, hard to reason about, hard to debug thing. Yeah, why do you think? So walk me through your reasoning on why declarative's harder to debug. Well, let me twist the question around then. Are there declarative languages that you like? Yeah, that is a good way to think about it. Because SQL, the canonical example of a declarative language, is a mess to debug. Debugging, more or less, is a very breakpointy thing. And imperative makes that very easy to do.
Starting point is 00:44:39 So yeah, you kind of have me there. Is that your argument? When you look at declarative languages and you think about the experiences you had, they're bad. So declarative languages are bad to debug. That's a reasonable argument. I think that is some of the argument. I mean, CSS is the other big one that people use.
Starting point is 00:44:53 And it just took us many, many years to come up with a good debugger for CSS. Yeah, I think they're just very difficult to approach, very difficult for new people to learn. I just know very few really great CSS engineers or really great SQL engineers. To make a declarative language successful, you need to be able to have the computer expand it into understandable steps that a human can read and process and make sense of. The classic example being the CSS debugger, where it gives you that stack of, hey, here are the rules that I applied in the order that I applied them. And here are the rules that override the other rules.
Starting point is 00:45:34 And even though you don't quite understand how it figured that out so fast, you can kind of see the steps. Yeah, yeah. It sounds similar to SQL, like, explain. see the steps. Yeah, yeah. It sounds similar to SQL explain. Yes. Yeah, yeah, yeah. Yeah.
Starting point is 00:45:51 Do you ever use SQL explain? Not in years. Maybe I use it once. I guess the point you're making is that it's, like, not a very good explanation. It's, like, not human readable. I've used SQL explain. It's okay.
Starting point is 00:46:08 I don't always understand why it's doing something or like why it's like, why did this step first instead of that step first? Interesting. And that's frustrating to me. To me, it sounds a little bit like declarative languages are trying to build this beautiful abstraction. So you don't have to care about the details, but you're saying that like the abstractions are always going to be leaky so you need you need someone to make the translation for you so you can like debug the leaks um because in theory we shouldn't have to care like it should just do the smart thing there should be no problems even if the even if the abstraction isn't leaky even if it's a perfect abstraction you will still need to understand when you use this abstraction problem.
Starting point is 00:46:48 And you think imperative is the way? Because I feel like there could be a declarative arrow just saying, oh, on this line, you declared the CSS to be this. But over here, you used important. It could declaratively explain to you the issue. It doesn't have to go like, well, first I did this, then I did, you know. That's interesting. Wait, let's talk about that for a second.
Starting point is 00:47:16 So you imagine like I click on a tree and I ask, why does this, why is this tree blue? And it traces me back through to like figure out why it's blue. Is that, is that your? I'm wondering if the explanation could also be declarative as opposed to an imperative explanation. And so I guess I'm begs the question, what is a declarative explanation? Yeah. I like that.
Starting point is 00:47:38 The declarative languages could work if you just had better ways to kind of interact with them and query the results. Yeah. Yeah, I guess, yeah. Again, I think you're going back to kind of interact with them and query the results. Yeah. Yeah. I guess, yeah. Again, I think you're going back to kind of the Brett Victor approach of just being able to click on something and see why is that?
Starting point is 00:47:53 What's the history of that thing? Yeah, yeah. Interesting. OK, so I want to talk more about the imperative language that you have. Is it truly imperative, or does it just seem imperative? Oh, it's truly imperative. So I'm wondering how do you do concurrently, how do you parallelize things if it's actually
Starting point is 00:48:12 imperative? How does it know what it can parallelize? Sure. So the language we use is called Skylark. It was built by Google for their build system. It is a subset of Python. We use it much differently than Google uses Skylark, whereas Google uses it to set up a build graph. We use it where you write a function, and that function takes as input your code base. Okay. And that code base is immutable.
Starting point is 00:48:43 And you can do things to that code base like, say, install a bunch of dependencies. And when you install a bunch of dependencies, you get a new code base, which is the dependencies overlaid on the old code base. Okay. And then you can pass around, okay, now I have my code base with dependencies. Now I can pass that to, say, go build job. Okay. I'm following.
Starting point is 00:49:14 Are there limitations that, like, because it's defined so imperatively, you can't make certain optimizations that a declarative build system would be able to make? That is a good question. We think no. There's this, when we've talked to people about this, one of the complaints is that one of the nice things about something like Bazel is that Bazel builds the build graph up front. That if you made a mistake, it will be able to tell you we have the entire build graph. Whereas with our imperative language,
Starting point is 00:49:50 it's stepping through a bunch of functions that may or may not schedule runs and or may set up jobs to run. And that we may not actually know that your build graph is wired up completely incorrectly until we get pretty far down the line. Oh, okay. Yeah, yeah. Yeah, that's a perfect example of why you want something that's more declarative. Right. The declarative can check up front that, like, hey, this dependency doesn't exist,
Starting point is 00:50:22 whereas we have to, like, go all the way down and then realize, oh, wait, we don't know what this is. Yeah, because you're evaluating the lines of code as you get to them, like a normal imperative language. Yes, exactly. Interesting. But I guess you think the benefits outweigh the costs. And so the benefits are the imperative languages
Starting point is 00:50:40 are easy to pick up, easier to debug. And is there another? Yeah, those are the big ones. Just much more approachable. Much more approachable. Cool. Yeah, maybe. Yeah, I'm curious.
Starting point is 00:50:52 I've never. I uniformly dislike build tools. They're also uniformly declarative. So I'm curious. Maybe I would not hate an imperative one. Maybe the whole time you just hated declarative tools. It's interesting. I like the idea of declarative languages.
Starting point is 00:51:11 It seems like a good idea. Were you also someone who thought declarative languages were a good idea and then you kind of reacted negatively to them? Yeah. Or you never liked them? I think that's exactly, yeah, I'm kind of a languages nerd. I wish declarative languages were better because they seem so cool when when you see in the abstract and then when you try to use them
Starting point is 00:51:31 you're just because they're like they're dense they're elegant they're you know mathematically kind of interesting yeah and then it's not fun in practice yeah i mean, yeah. Have you ever read, you've probably read worse is better, right? Yes. Yeah, I mean, I think that, it's functional languages I think have the same problem, I really, really want to like functional languages. But there's just so many ways to shoot yourself in the foot. Like code up an n factorial algorithm accidentally. Yeah, it's true. code up an n factorial algorithm accidentally.
Starting point is 00:52:05 Yeah. Yeah, it's true. I, you know, like, a language like Haskell is, like, my favorite language until you ask me to write some Haskell. Then it's like, never mind. Have you ever built anything in Haskell? Like, no. Nothing that's non-trivial.
Starting point is 00:52:28 I guess, sorry, the easier way to say that is I've only built trivial things at Haskell. Yeah. I really like building trivial things at Haskell. It's actually just a lot of fun. Yeah. It is. So, yeah. Yeah.
Starting point is 00:52:40 Tough stuff. Let's see. A few more. Maybe one or two more questions. So it sounds like you're going the for-profit company route for this project. Maybe walking through, like, have you raised money? What was your thinking
Starting point is 00:52:55 to go for-profit? Did you consider other routes? Oh. It's funny you put it that way. We definitely did, we spent a bunch of time, we were kind of very interested in this idea of live build tools and reactive build tools that kind of automatically built as you went and built in the cloud. And we thought about what would it be like to do this at a big company. And we just kind of decided this would not,
Starting point is 00:53:28 because it cannibalizes CI in some ways, that we would be competing for resources with CI at a big company. And that would not be a successful way to run this kind of experiment. And we talked to various people, we of experiment. And, you know, we talked to various people. We just kind of decided, you know what, this is a good thing to start a company around, just to experiment with it, and this is what we're going to focus on.
Starting point is 00:53:54 I mean, to me, that has kind of been the advantage of a small company, is that you can pick a problem, just really focus on it, and not have to worry about competing resources. Cool. Have you guys raised any money at this point? Yeah, we've raised money. We've raised enough money to do this for a while. Do you have a sense of when launching will happen?
Starting point is 00:54:18 A lot of what we're doing right now is showing it to companies who are interested in the idea, who are excited in the idea, who are excited about the idea, but are willing to kind of put up with the warts, that I will be very clear that we have a production tool that you can use, but it is not easy to use. It is not really that fun to use.
Starting point is 00:54:41 We are still figuring out the UX and still figuring out how to make it a fun to use. We are still figuring out the UX and still figuring out how to make it a joy to use. So a lot of what we're figuring out right now is, how can we make this a tool that a few companies really love using? And then once we have that, we raise more money and really go out the door
Starting point is 00:55:05 trying to grow it to as many people as possible. We're definitely in the phase as a company of just doing a lot of product experimentation. And there are certainly things that we built where we're like, yeah, we built this, it's not very good, let's go in a slightly different direction. That sort of thing. Got it, cool.
Starting point is 00:55:21 So you're still making something worth trying. Yeah. And then you start doing some early testing with users. Cool. So you're still making something worth trying. Yeah. And then you start doing some early testing with users. Cool. Yeah. You mentioned that you're not a huge Brett Victor nerd like I am. I'd be curious to know, you seem very passionate about this very specific problem. Whether you would do it at a big company or this company, it seems like you're excited about this problem. I'd be curious to know
Starting point is 00:55:46 where does this motivation and inspiration come from? Do you just have really terrible experiences with the lack of a solution, or is there someone else who's motivating this or inspiring this work? I think this is mostly just working on
Starting point is 00:56:05 WYSIWYG editors in general for consumers and just realizing and I have a strong belief that is just the way people interact with the world people interact with their tools like close feedback
Starting point is 00:56:20 you instantly see the change you made and you feel that direct connection to the change you made. That's cool that you were inspired by your work on, yeah, WYSIWYG, Medium. Yeah, and I certainly don't want to denigrate the perfect talk, because I think it just gets thrown around a lot as the kind of city on the hill. Yeah, of course. Cool dev tools tools demos.
Starting point is 00:56:45 Yeah, well, so many of the people I talk to are overly obsessed with it, so I'm excited to find someone who has different motivations. Yeah, yeah. I mean, to me, the more interesting problem is how we get there, which I think he talks about less. I mean, the classic example is that everyone who writes
Starting point is 00:57:05 WYSIWYG text editors, or WYSIWYG rich text editors specifically, the first thing they do is say, oh, let's store HTML in a database. And I just, no, no, that's actually a terrible way to write a WYSIWYG text editor, because HTML is a terrible editing service. And to me, what excites me is, OK, we want WYSIWYG with dev tools, but what is the path
Starting point is 00:57:27 to get there? How do we store them? What is the data model that supports that WYSIWYGness? Yeah, yeah. That reminds me of one question I meant to ask earlier. Maybe this question doesn't even make sense to you, but what would a language that was designed for build tools look like? Yeah, does that make sense? Oh, that is a really good question.
Starting point is 00:57:56 I have no idea. I am a programming language enthusiast, but I don't feel like I know what that future looks like. I'll let somebody else invent that future. Okay. Cool. Well, thanks so much for spending time with me. This was great. Steve, this was fun.
Starting point is 00:58:16 Thanks for having me on. Cool.

There aren't comments yet for this episode. Click on any sentence in the transcript to leave a comment.