M 37

> How did you first get into programming? Were any books, blogs, forums, or people particularly helpful for your growth? What is it about coding that got you hooked?

My family got our first computer when I was in middle school. A Pentium 90MHz with 14MB of RAM, a 200MB hard drive, SoundBlaster 16 sound card, 5.25" and 3.5" floppy drives, 4x CD-ROM drive, running MS-DOS 6.22 and Window for Workgroups 3.11. There was no consumer-facing internet at that time. Just figuring out how to play a game with a joystick required learning about CPU interrupts and DMA channels for the sound card (and telling games which to use for what), serial ports for the joystick, and adjusting memory allocation in `config.sys` and `autoexec.bat` for DOS because none of those things were done automatically back then and different games had different needs, particularly with the memory allocation, so making special 3.5" floppy boot disks was also common.

All of this required learning how to navigate on the DOS command line and editing text files by keyboard only, so it was a pretty high activation energy to play games on the computer instead of my Game Boy, but the difference in the experience drove me to get there.

One day I randomly stumbled upon `qbasic` and the `gorillas.bas` file, a fully working game of two giant gorillas standing on top of skyscrapers throwing exploding bananas at each other, that I could edit and run. It had a few global variables at the top with explanations of what they were for. I recall laughing at changing the gravity to 100x Earth's and watching the CPU player try to throw the bananas and having them drop instantly and explode itself.

From there I tried to make changes to the rest of the code below the commented constants but that usually ended in disaster. I eventually figured out the parts of the code that were used to draw rectangles, lines, and circles, as well as the random number generator, and I ripped them out into separate files and started making "screensavers" that would spam pseudo-random garbage onto the screen in different patterns as fast as the CPU could do it (because I just put the logic inside of an infinite loop, though I think I also had a space bar press check at some point so I wouldn't have to restart the computer to exit).

For as much shit BASIC gets (rightly, for the most part), that immediate feedback and ease of development let me experiment quickly and experience the almost magical ability of computers to turn your imagination into reality if you can make "the right incantation."

I knew that BASIC was too limited to do what the games I was playing could do, and I would need to learn a language like C to get to that point. I was also drawn to seemingly simple things like Microsoft Paint (and later Corel DRAW!) and the simple Sound Recorder application in Windows, and I could not comprehend how these tools were made.

Flipping through some books on Windows programming and OLE and etc in a local bookstore discouraged me because I didn't have the CS background and technical jargon knowledge to understand most of what I was reading. I projected from the simplicity of DOS to what I was seeing with Windows and assumed in a decade it would be even further along and completely beyond my comprehension, so I didn't push much harder than that in middle school.

In the summer between middle school and high school, my uncle gave us a copy of Visual Studio 6.0, which included VisualBASIC 6.0, which let me make desktop applications that looked like the ones I thought were impossible for me, which got me back into software.

My (public) high school was very forward thinking at the time, and offered electives in C/C++ (it was C but with the silly `cout << "Hello, World!" << endl;` stuff from C++) and web development. The C course helped me finally figure out what pointers were, which helped demystify a lot of stuff. There was also a brilliant and humble kid in my class who was one or two years older than me that was working for a local ISP after school (in 1999) that basically knew all of this inside and out. It left a strong impression on me -- that I had taken far too long to figure these things out and that while I found it very interesting, I probably shouldn't try and "compete" directly as a developer, and should instead choose a field where programming knowledge would give me a boost.

The web class was a combination of learning HTML and Frontpage, but the teacher was very nice and didn't discourage me when I started experimenting with this JavaScript I found while poking around, and I made some sites that would make the text appear a letter at a time in a typewriter font as if it was being typed by someone, I made a Single-Page App in 2000 by putting all of the contents of the site into JS strings and having menu navigation presses replace the `innerHTML` property, etc.

That also made me aware of software development outside of what Microsoft provided to consumers, and I was getting fed up with the Visual C++ books I found in the book store that didn't explain anything but walked you through step by step on how to do things in "Wizards."

Near the end of high school or the beginning of college I found Red Hat Linux and I enjoyed playing with that alternate operating system that I could (theoretically) change any part of it that I wanted to. And I ran across a plain text C programming tutorial centered on GCC and Make that explained exactly what was going on and how a binary was made and how it worked with the operating system, and that's when I was hooked on Linux.

Even after that, I was still pursuing a different field from actual CS. I started with Physics and then switched to Electrical Engineering, even getting a Master's there. Along the way I also learned Perl and CGI scripts for web hosts and used that plus my Linux knowledge to help manage my Research Lab's 2U servers, and write helper tools for parsing all of the measurement data we were making.

I had actually entered grad school in 2007 because I felt like the economy was shaky and I had lucked out, avoiding the 2008 crash where I probably would have been fired during those layoffs. I stayed in grad school until 2012 pursuing a PhD, but a combination of getting married and having a kid, my wife also being in EE (and so our economic eggs being in one basket), and a part-time job at the university working on a CRUD web app for gathering, storing, and approving/denying animal research proposals pushed me to go for programming full time.

Since I had mostly happy experiences with Javascript (pre-jquery), I decided to learn Node.js in my spare time while looking for a job, and I started writing some OSS libraries for Node. Most companies I applied to rejected me immediately from "lack of experience" since I didn't have a CS degree, others would interview me but I was rejected by all except 2. One was a super tiny startup run by a husband and wife where the husband gave me a creepy vibe that I rejected, and the other was an early-ish startup that had traction and high growth, but was also having technical issues and had built a core piece of their technology in Node.js for some reason: Uber.

That was the wildest job I had ever held. The highest highs and lowest lows of my career were all there. I gained a lot of operational experience and architectural knowledge there, helped scale the Node.js-based dispatching system, part of the team that did the second version of Surge pricing, part of the team that built UberPOOL in 3 weeks, built a "hot rod" stream processing system from scratch in Java (the various Apache projects weren't reliable enough, not even Kafka) for the third version of surge, and helped build UberEATS' first and second versions of surge.

The technical side was great, but I was emotionally drained at that point and didn't like what I was seeing from the top, so I left to join another startup that had many technical similarities to Uber but in a different market, but it sold itself to a competitor two years later, so I left.

That's when I co-founded a startup with a friend and colleague from Uber since then, which gets me to the present day. Not going to advertise the startup, we're still too early-stage to have customers, but I've learned a lot about compilers, virtual machines, and type theory in this startup, things that high school me had assumed were beyond my abilities, and I really enjoy what I'm doing and the people I'm working with.

The uncertainty of whether we will be able to reach product-market fit and have the startup actually take off is what I dislike the most about the startup, but it's up to me and the rest of my team to figure this out. That uncertainty is the price that has to be paid for the freedom of choosing exactly what to work on, and I think I'm finally confident-enough in myself to be ready to pay that price.