Vincent Woo

What inspired CoderPad?

Did you write this yourself, or did you find some libraries?

This was back in 2013?

Some people would have liked that.

Docker's great! It's been gaining a lot of popularity. Can you summarize it and talk about how you use it?

Docker aside, what else is being used?

I do a lot of interviews. It's actually one of my quirks. Even while I was working at Everlane, I interviewed for a lot of other positions. It's so much fun! I like talking about myself. I like trying to figure out the ins and outs of other people's hiring processes. I like seeing how people think. Interviews are stressful environments for both candidates and interviewers. I like applying pressure to the interviewer, and seeing how they react.But, I found the phone screen experience lacking. I thought it was really archaic and bizarre that everyone was using Google Docs, or Etherpad, or Stypi to conduct technical phone screens. I was like, why don't I just take that, slap a compiler on it, and just see if I can use that myself in interviews, and I did! The v1 actually used a Ruby to JavaScript in-browser compiler to do just Ruby, and it was just good enough to work OK.I slapped a few libraries that I found together. There's this great, great project by the Repl.it people, where they cross-compile Ruby 1.8.7 using Emscripten into JavaScript. They compiled the entire MRI Ruby binary from its C source code into JavaScript. It's several megabytes. Your browser hangs while it processes it, but once it's done you can run Ruby 1.8.7 in your browser. It's fantastic!I also found these other crazy kids. They're in some midwestern schools, I forget. I'm doing them grave injustice by not remembering their names right now.[Ed note: The project is Doppio by CJ Carey, Jez Ng, John Vilk, and Jonny Leahey.]They wrote the entire JRE runtime in JavaScript! I was one of the first people to have live online Java compilation because I knew about these guys. They wrote their own JVM in JavaScript that you could download in the context of a browser! It was so slow. It was completely stupid, but at the time I thought there's no way I can ship without Java. No one will use this unless there's Java, right? I had a few dynamic languages, and Java, and that was it. I was looking for other ways to get more languages, and eventually I built my own server-side infrastructure, but at the time I was like, "How can I hack in Java right now?" It would take 10 seconds to compile and run "Hello World," but it was a glorious 10 seconds. Completely unusable, but it a lof of fun.Yeah, CoderPad's been live for about a year. One day I sucked it up and I just realized that there was no way I could scale this completely in-browser execution out as far as I needed it to. The insanity of it is apparent now. What are you going to do, compile every programming runtime into JavaScript? Good luck.Some people would have liked that and I would have liked that too if it was even remotely feasible. We're not in that age yet and there's all these other concerns, like various libraries and so forth. How do you dynamically pull those down? You can't do it. Basically you can't do it at scale right now. Anyway, I ended up transitioning it - the new code uses Docker.Docker is basically cgroups and linux containers sandboxing and standardization. You can restrict privileges. It's perhaps not as thorough as BSD's jailing, but Docker containers present this unified way to think about the world. That's the critical point with Docker. That's the genius innovation. In three years we're all going to be deploying software with Docker. We just don't know it yet. It's definitely coming. This is a tidal wave.What I love about CoderPad it's is a bleeding-edge project at literally every part of the stack. The front end is a crazy mishmash of JavaScript that basically lets you believe that you have a full console in your browser that you are sharing with someone else in real time. Either of you can Ctrl-C out of any program at any time. No one else has that, really. That is connected live through web sockets or some other real-time interface to one of my back-end servers that is running one of a dozen languages in a container shuttling input/output between a language runtime and all the clients connected to that pad instance. At the same time, I'm doing memory and input/output heuristics. So there's a lot of malicious behavior detection, sandboxing, memory limits, I/O limits, that sort of thing.