Lessons (for those who don’t care for my rambling narrative account):
- Figure out what great looks like.
- You have to get lucky, but you also have to capitalize on the lucky opportunities.
- It’s ok to miss out on your top choice. Your optimization function might be different in a couple of years.
- It’s hard to spot great businesses, but if you can spot great people to work with, you can narrow the window.
- Failing gives you better perspective than being told that you will fail.
- Great engineers aren’t defined by years of experience. They need to care deeply about the product and have the technical prowess to build a great experience.
- Early decisions at a company have compounding effects.
Contributing to Ruby on Rails
Lesson: Figure out what great looks like.
In my junior year of MIT, I took a class on open source software. By far my favorite memory was going to an open source conference and meeting Aaron Patterson (aka Tenderlove). Aaron is a legend: a member of the Rails core team and an incredibly fascinating person (just take a look at his website and you’ll understand why). I had never seen someone fix bugs as quickly as him or have such deep knowledge of knowledge of Linux, Rails, and Ruby.
After I met Aaron, I knew I wanted to be just as good as him at programming. So I started contributing to Rails and fixing as many small bugs as I could find. For the next 6 months, I spent my extra hours before class (and during my least favorite classes) working on Rails bug reports. By sheer luck, my first taste of professional software development happened to be on one of the most influential and widely used web frameworks. The core team members held every pull request to a very high standard, and I learned a lot about how to write good code.
Lesson: You have to get lucky, but you also have to capitalize on the lucky opportunities.
Over the summer, I got assigned to my first big project. I was asked to complete a major refactor of the structure of the Rails application. Unfortunately, my patch ran into many issues and never made it into Rails. I learned that making big changes in heavily used code usually leads to bad outcomes (especially when you don’t fully understand a system).
However, I persisted and kept making smaller patches. As the summer came to a close, I had climbed up to become one of the top 50 Rails contributors (to this day, I’m still in the top 100). But my commits started petering out as the school year started and I began looking for jobs.
Looking for a job in Silicon Valley
Lesson: It’s ok to miss out on your top choice. Your optimization function might be different in a couple of years.
As I started job hunting, one company stood out amongst all the others: Meteor. I was incredibly excited about Meteor’s team and product. They were a team of ex-Asana engineers building a new open source web framework that automatically pushed database changes out to the frontend. Meteor combined my love of open source software with the new exciting technologies of the time. The only problem was that I didn’t get the job.
I was devastated at the time, but looking back, this ended up being a good thing. I was lucky enough to get job offers from a range of small to large companies. I decided to accept an offer from a little known company called Stripe.
At the time, Stripe wasn’t an obvious choice. My parents had never heard of it, nor had any of my friends (and it would be years before any of my friends had any idea what Stripe did). It was hard to square Stripe’s salary with the money and stability offered at larger tech companies. When I tried to negotiate, I was given the party line: “all engineering salaries are the same.” And I still wanted to work on open source software (ya, I was pretty bummed about Meteor).
I loved the excitement of Silicon Valley and wanted to be a part of it, so I was determined to find a company where I could be a sponge. There were a lot of companies doing exciting things, from big data companies started by world renowned professors to companies producing the next cutting edge frontend web framework. Every startup seemed to be growing. But it became apparent that external factors were lagging indicators of great companies.
Lesson: It’s hard to spot great businesses, but if you can spot great people to work with, you can narrow the window.
Stripe was ever so slightly different because it had intelligent people doing things with humility and care. Everyone I talked to genuinely cared about their job and about me as a person, and everyone was high powered. I remember being in awe of Nelson Elhage and Evan Broder who worked on technology to hot-swap a linux kernel without rebooting. They were always excited to talk about problems and how to solve them.
I also remember the care Stripe put into the recruiting process. Patrick Collison went on a coffee walk with me, chatting about everything from Stripe’s machinations to acquire a defunct bank to the economic drivers of productivity growth. They introduced me, a random college student, to their investors. I was in awe and quite literally shaking when they had Michael Moritz and Paul Graham do 20 minute chats with me.
In the end, it was the thoughtfulness and drive in Stripe’s culture that set it apart. Many companies had one or the other, but very few had both.
Starting a YC company
So there I was, ready to start working at Stripe in the summer, when Max Kolysh (now the CEO of Dover) sat me down for lunch at Chipotle. It was November of my senior year in college and I was excited to spend my last semester learning and not having to care about grades.
I listened intently to Max talk about how he and Doug Feigelson had gotten into YC to build an API to connect online shopping. I thought the idea was a bit ridiculous, but Max and Doug were incredibly smart, driven, and humble people. I’ve always optimized my environment for learning and being around great people, so next thing I knew I was signing incorporation documents and flying out to Mountain View. I had no idea what I’d do about the Stripe offer come summer, but I would figure it out when the time came.
I packed up a duffel bag of clothes and headed out to Palo Alto to start Zinc. During this time, I learned to grind. Each morning, we’d wake up around noon and code until 8pm. We’d eat a quick dinner and go to the gym before returning at 11pm to continue coding until 3 or 4am in the morning. Many people would say we worked too hard, but I loved it. We were doing something exciting and I poured my heart and soul into it.
Lesson: Failing gives you better perspective than being told that you’ll fail.
However, as YC came to an end, we still hadn’t come up with a real product. We had been instilled with the YC mentality that growth is paramount and we did everything we could to achieve growth. This led us to create a consumer app that lost money on every transaction. YC was a great forcing function for us to focus exclusively on growth, but we didn’t spend enough time figuring out the fundamentals of what we were doing. What’s more, I learned that coding 13 hours a day doesn’t guarantee anything.
These were hard lessons that I’d carry into the future. As we shut down our product, I knew my startup experience was coming to an end. I had already accepted Stripe’s offer and I was going to stay true to my word. So in June of 2014, I had a somber meeting with Max and Doug and went to work for Stripe.
Working at early Stripe
When I started at Stripe, I asked to delay my start date until after a family vacation, but my manager just told me to start sooner and take time off later (Stripe was just shy of 100 employees and moving incredibly quickly). I now had an artificial deadline of one month to ship my first project.
I was assigned to improve email receipts with Michelle Bu. We spent the month touching different parts of the Stripe infrastructure and writing a ton of code. Just before launch date, we stayed up the entire night fixing polish items. I remember going to sleep in a phone booth and waking up early in the morning to try to finish out some last edits while Michelle worked on the blog post.
Lesson: Great engineers aren’t defined by years of experience. They need to care deeply about the product and have the technical prowess to build a great experience.
One of the things that struck me at Stripe was how humble and hardworking people were. Even though Michelle was a veteran of the Stripe codebase, pushed forward a ton of the project, and even wrote the blog post for the launch, she put my name on the final result (amazingly, this post is still up on Stripe’s blog). I thought that said a lot about her and Stripe in general.
Michelle also taught me that there are different flavors of great engineers. Some great engineers can act like oracles because of their knowledge and experience. Michelle was only one year out of college, but still one of Stripe’s best engineers (in an unsung hero kind of way). She kept standards high, fixed bugs when she saw them, talked to customers to understand problems, and shipped a ton of changes.
Building a profitable, (mostly) bootstrapped business
Stripe was doing incredibly well and was on track to be a very special company. It had an electric atmosphere that combined ambition and humility. But after a year and a half, I started longing for something different. Many of my friends were shocked by my decision to work at Stripe, and many were equally shocked when I quit Stripe to return to Zinc. However, I wanted to optimize for learning and I believed I would learn a broader set of skills at a smaller company.
Zinc began to find traction among a very specific niche of users. Before Plaid pioneered a similar business model for finance, our team built out a set of APIs to e-commerce websites for a clientele of small businesses selling items on Amazon and eBay. Within a couple of years, we had built a very profitable business making millions of dollars per year with only about $400k in pre-seed funding. We followed the lead of Basecamp who espoused the benefits of work-life balance, small teams, and eschewing venture capital.
Lesson: Early decisions at a company have compounding effects.
I loved being at Zinc because the feedback loop was extremely fast. We could see how our decisions a couple of months ago affected our current day to day. For example, building our backend in NodeJS with callbacks haunted us for years. Every time we wrote code, we would contribute more cruft to a sprawling callback hierarchy. On the other hand, our investment in our DevOps infrastructure allowed us to cheaply scale thousands of servers across many cloud hosting providers. Every cent we saved in server costs led directly to a dollar in profit.
Applying lessons and learning new ones at Assembled
After a few years, we were in great shape at Zinc. However, I itched to throw myself at even bigger problems and started talking to my brother, Ryan Wang, and my old friend, Brian Sze. They were leading a team that built internal tools for the support team at Stripe.
Stripe had seen triple digit growth for years, but still cared about a great support experience. Patrick Collison used to invite engineers over to his apartment to help answer support tickets. However, this didn’t scale as volume grew and Stripe increasingly had to rely on a set of outdated tools to manage its support team. We saw that many companies had very similar problems as Stripe and that the support ecosystem was lacking good tools.
I vividly remember our first meeting with GoFundMe’s support team when Morgan Wood showed us a Google Sheet containing thousands of rows, a litany of color-coordinated cells, and multiple people trying to make edits. While we were at their office, someone had made an accidental edit on the spreadsheet and the operations lead, Jordan Philyaw, had to manually recreate the entire sheet. The level of wizardry was amazing, but it was clear that the tooling needed to get better.
Seeing these types of struggles across the industry led Brian, Ryan, and I to start Assembled to transform and elevate customer support. We recently raised a $16M Series-A and I’m now applying many of the lessons I’ve learned to creating a long-lasting, impactful company:
- Figure out what great looks like. For the first couple of years of Assembled, we didn’t have a clue about how to market ourselves. So we talked to a few dozen experts who showed us what the best of the business did. This made it really easy for us to determine what we needed. We interviewed quite a few marketers with amazing resumes, but when we met Megha Narayan, we knew immediately she was someone who had the skills and temperament to overhaul our marketing organization. All the pre-work we did allowed us to quickly identify Megha’s talent and switch to sell mode much sooner than we would have. Luckily, Megha joined us and is now building the future of marketing at Assembled.
- You have to get lucky, but you also have to capitalize on the lucky opportunities. When we started Assembled, we had little product and even fewer customers. When we were introduced to Casper by a potential investor, our point of contact Amanda Kwasniewicz mentioned that she would be in San Francisco. We invited her over to our (nonexistent) office and she miraculously agreed to come see a demo. We scrambled to find a temporary office space and worked nonstop to address all of the product issues we foresaw. Luckily, Amanda took a bet on us and we eventually were able to build something valuable for Casper.
- Great engineers aren’t defined by years of experience. Great engineers need to care deeply about the product and have the technical prowess to build a great experience. My Stripe experience taught me that 10x engineers exist and that they have a special combination of skills. For Assembled, it’s not sufficient for our engineers to simply meet the technical hiring bar. We’re looking for people who can change the course of our company with a combination of technical skills, user centric-ness, great communication, and practical mindedness. Looking for these attributes has helped us build a world class product team that’s been able to scale a multi-million dollar business with just 5 engineers.
Looking back, I’ve had many ebbs and flows along my journey, but I wouldn’t trade the lows for anything. I’ve learned the most from the worst times and they’ve helped concentrate my focus. I’m forever grateful for all of the amazing people I’ve met and the people who have taken bets on me.
Here’s to the future.