Author Archives: admin

3 Types of Technical Interviews

This is the third post in the recruiting series that I’m currently writing! I’ve written two other posts, about my recruiting goals, and sourcing companies. In this one, I’ll be laying out the structure of the 3 different types of technical interviews I encountered, what studying techniques worked best for me to prepare for each type, and what my candidate experience was like for each of them.

I’d like to start by sharing that I’m not naturally gifted at technical interviews; they’re a far cry from what day to day work looked like for me. Last time I recruited, I underestimated how nerve-wracking and unfamiliar live coding would feel, and blew interviews with companies I was really interested in because of it. Even this time, I was rusty and stumbled over random things I’d forgotten about in my first few interviews, but over time, my pass rate increased, and my interviewing anxiety decreased. The best way I got better at interviewing, was by doing more interviews.

The goal of technical interviewing is to detect signals that the candidate would be a good fit for the role. I like to think that interviewers really want candidates to pass their interviews so they can spend less time interviewing and bring on more people to share their workload. But this needs to square with the risk that interviewers have of bringing on a teammate that ends up creating more hurdles than they help the team clear. As a candidate, everything I did in technical interviews was with the goal of giving my interviewer confidence that I’d be an asset to the team, and I kept in mind the general rubric that I used when I was an interviewer:

  1. Did the candidate solve the problem?
  2. Was their solution efficient and clean? Did they consider edge cases?
  3. How well did the candidate communicate their thought process?
  4. Were there any red flags during the interview?

The 3 types of technical interviews I encountered were: general data structure and algorithms (roughly 60% of my technical screens), building something practical (roughly 30%), and take home projects (roughly 10%). The structure of each is fairly different, so my prep varied accordingly. Before interviews, I asked recruiters the following questions to gain a better understanding of expectations before each technical screen, and what type of interview I’d be doing:

  • What interviewing tools will we be using? CodeSignal, CoderPad, and CodePen are examples of shared coding environments I’ve used. It was helpful to play around with new tools to familiarize myself with how to navigate them and how packages like React or lodash were compiled.
  • Should I have my own dev environment set up with some boilerplate? If yes, is it okay to install and make use packages such as lodash or jest?
  • What am I being assessed on? Most recruiters would tell me what I needed to emphasize.

Data Structures & Algorithms

Prepping for data structure and algorithms was pretty straightforward – I use two resources: Interviewing Cake (paid subscription was 100% worth the value) and Leetcode. I did about ~50 Leetcode questions, and focused mainly on classic data structures and common strategies: strings, arrays, hashmaps, trees, recursion, sliding window algorithms, matrices, dynamic programming, and graphs. I didn’t bother studying more esoteric stuff because I wanted to be efficient with my time, and, well, I told myself I probably wouldn’t want to work at a place that was going to haze me through interviewing.

My strategy for practicing Leetcode:

  • Pick a topic and do problems on that topic until I feel comfortable doing a random medium level question. The more I did, the more I noticed patterns in the solutions.
  • Give myself an hour to attempt the problem as if I am in a real interview (e.g. talking out loud and verbalizing my thought process) before looking at the solution.
  • Make sure I really understand the mechanics of the solution, rather than simply memorizing it. This helps me recognize how to adapt an approach for a slightly different problem.
  • Schedule mock interviews with friends or via tools such as Pramp to mimic live coding pressure.

My strategy for actually doing the technical interview is pretty much ripped off of Amy Nguyen’s technical interviewing blog post, so I won’t repeat it here. I think the most important thing I had to remember in interviews was to avoid diving into coding before I had a full and complete plan of what I was going to do.

Building Functionality

Building interviews were definitely my favorite kind because they most closely resembled the type of work that I expected on the job, and was already doing at my day job. The exercise was usually something along the lines of building a small feature (for example, the UI for a basic calendar app, or APIs to support a chatroom app). The problem is usually presented vaguely (let’s build a calendar) to get a sense of how engineers take a vague requirement and turn it into real functionality. While there wasn’t as much new material to refresh myself on, I took a very structured approach when I did these types of interviews that mimics how I build bite-sized functionality in real life:

  1. Clarify the domain: What functionality do we want to support? How does the typical user interact with what I build? Since I tend to be forgetful in high-stress settings, so I wrote down all requirements down to make sure I covered them.
  2. Identify edge case: What error states could the user hit? How would we handle those in our application?
  3. Communicate my plan: I talked about my approach and how I planned to organize my logic (this usually involved writing more than one component for UI work or multiple endpoints for server side work) and validated that my interviewer thought my plan was okay. I talked about technical tradeoffs if I could think of more than one approach, and interviewers would usually guide me towards the preferable ones. This is also usually where interviewers would drop hints about other things they wanted to see, or stuff I didn’t need to cover.
  4. Code: I compiled my code and validated my logic through user interactions often. As someone who has also been on the interviewer side of this process, it’s very hard to help candidates debug errors if they’re not validating it often. As a bonus, it gave me confidence that I was making forward progress in the exercise, and I could catch errors early by testing my own code regularly.
    • As I code, I called out what I would do differently in a real life scenario: placing a component in a different file, creating a new child component, writing tests for my code, etc. and would sometimes ask my interviewer if they’d like to see these things. The answer was always no, but I think this signaled that I do think about things like code organization.

It was helpful for me to watch other implementation interviews on YouTube so I could mimic some of the approaches around communication or explaining technical decisions. Ben Awad has a good one that was fairly representative of most of my frontend implementation interviews, and after I watched it, I had a better sense of what I could expect.

Take Home Interviews

Take home interviews usually involved building something over a longer period of time. Companies liked to say that they should only take 2-3 hours, but I spent at least 6 hours on them each time I received one of these. There are always ways to make code better, and when I’m not time-boxed, work expands to fill the available time I have.

As an interviewer, I thought these were a great idea: there’s no live coding pressure, I can use whatever resources I want, and there’s no time limit. I think take homes are designed with the intention of improving the candidate experience, but they miss the mark when it comes to providing a good candidate experience:

  • Feedback was never provided on the submission, so it also didn’t help me improve at all as an engineer. At least in live coding scenarios, there’s some collaboration and back and forth with the interviewer and you can identify areas that you’d improve upon.
  • There was no way to gauge collaboration with other engineers. In real life, engineers typically ask clarifying questions and think of different ways to approach a problem, along with accompanying tradeoffs. Removing collaboration or visibility into the candidate’s thought process means you miss out on the why of particular approaches, and the candidate has no way of explaining.
  • There was a huge opportunity cost for me to be working on a project for 6 hours because I could have used this time to study for my other interviews!

I guess this is a copout section because I don’t have good prep advice here – even though I passed most of these interviews, I never got feedback on why I passed or failed, and it was really hard for me to know what I was doing well or could improve on. I’m probably going to continue my experience of dropping out of interviews that want me to spend my weekends on their projects.

General Thoughts on Technical Interviewing

  • If I had a nagging sense that there was something I could have done way better in my interview, I would work on the problem after the interview, and email an updated solution to my interviewer or recruiter, explaining that I fully understood my updated code might not be factored into the debrief. This is one of those things that doesn’t always work, but as a candidate, I felt like I didn’t have a lot to lose with this approach. The worst that could happen is that it wasn’t taken into consideration, and the best is that it changes the outcome of a decision because the company has a better sense of what I’m actually capable of.
  • Communication is really, really key in technical interviewing. I’ve passed interviews where I didn’t complete every part of the problem (and some interviews are intentionally designed as such) but was given feedback that my communication provided a strong enough signal to move ahead. Interviewers don’t know what candidates are thinking if they don’t explicitly communicate it, and I do think that interviewers tend to drop more hints to candidates who communicate that they could use them.
  • I focused on making forward progress rather than worrying about a complete solve because it was a way for me to remain calm and focus on the piece in front of me that I had to solve. When I encountered something I don’t know, I methodically tried different ideas that hopefully bring me closer to a solution, such as mocking data, googling a method (if allowed), brute forcing, or even writing the logic in pseudocode.
  • When I received decisions about my interview, I always responded and asked for feedback. Surprisingly, what seems different from interviewing a few years ago is that I felt like many companies were willing to give me feedback if I asked for it. There wasn’t a single company I asked who said they couldn’t or wouldn’t. I took notes on my interview performance and tried incorporating feedback to help with future interviews, and it was really helpful to hear what I did well and could improve on to compare against my own perception of how I did in the interview.

If you read this post, I’d love to know what you thought! Drop me a comment here or on Twitter @chrystalzou.

Detecting Signal Among the Noise

When I tell my friends that I talked to over 50 companies, most of them are understandably shocked. Seeing this number at the end of my process, I’m a little daunted myself, even though I didn’t kick off interview processes with all of them. There are countless companies that are solving meaningful problems, so I needed to figure out which ones I wanted to learn more about. How would I validate that these companies aligned with what I was looking for? In case context is helpful, I wrote about why I started recruiting again in the first place here, which elaborates on my goals.

Building the List

When I started interviewing, I already had a list of companies that I was interested in. “Interested” here means anything from “I ended up on their website and thought it looked cool” to “I knew a friend who worked on a team with open headcount who seemed really happy.” I keep a running Notion page of the companies I think are cool, so when I started recruiting, I already had a pool of close to ~40 places to start with. Not many of them were in the three areas I wanted to work in (climate tech, health tech, and fintech), so I had to do some extra research to put companies specifically aligned with my interests on the list as well. There are a few things I did to source interesting companies:

  1. I turned on the option to signal interest and expose my profile to recruiters and hiring managers on LinkedIn. Prior, I’d been getting a few outreach emails a week about joining a company. Once I did this, the amount of inbound increased to a few emails a day.
  2. I reactivated my profile on Work at a Startup. I was surprised that most people I spoke to didn’t know about this job portal for all YC companies, but it was an underrated resource in my search (full disclosure: I know the person who is building it, and have a lot of respect for him). While YC isn’t the only place to look for promising startups, it’s still where many successful ones have gotten their start. The profile I filled out was a lot more intentional than LinkedIn and prompted some healthy reflection on my part, and it was clear that most people took the time to read through what I was looking for. I had a lot of strong leads from the product and recommend it to a ton of my friends who are looking for new opportunities.
  3. I reached out to a few friends in the investing and startup space to ask if they knew of anything interesting. Any of my friends having confidence in a company is a really strong sign to me.
  4. I looked at companies with founders and investors who’d had a good track record of success. YC, Sequoia, a16z, Greylock, and First Round are a few portfolios I perused to see if anything aligned with my interests, and I looked at individual investors I respected to see what they’d invested in. I was also actively looking for female CTOs and leadership.

Detecting Signals Among Noise

I think what I really want to communicate is that a compelling narrative and a good reputation made a big impact at the beginning of my job search. At this stage, it was the difference between me pursuing or not pursuing a role because I didn’t have firsthand interactions to draw from, and limited time to interview. So while these signals are imperfect, publicly available information was all I had to work with at this point. Tangentially, a recurring theme of interview processes that I noticed was there was no single factor in my job search that could commit me to a job; it had to be a combination of the right things coming together. However, there were some things that could cause me to quickly lose interest, and I imagine some of these are true for when companies do due diligence on candidates too:

  1. Words of warning from anyone I trusted
  2. Employee reviews on Glassdoor and Blind. Blind gets a bad rep (some of which is deserved), but I found it useful to see unfiltered discussion from employees about their own companies and how they felt about the future outlook. It also gave me insight into the types of people who worked at various places (as in, were they assholes in anonymous forums?).
  3. Companies who seemed to be endlessly embroiled in Twitter drama.

On the flip side, here are a few unique things companies did that really piqued my interest in talking to them:

  1. Documented engineering values: As someone who believes in the power of documentation and writing, I really appreciated when an engineering team published their values! I usually ask about these in the interview anyways, so it was great to have a lot of my questions answered up-front.
  2. Public roadmaps: Similar to documented engineering values, some companies published their roadmaps for everyone to see, which I thought was awesome. It gave me a clear sense of how prioritization worked, and how the company viewed transparency.
  3. Transparency around the interview process: Many companies (yes, even tiny startups) have internal documents that detail their interview format, timeline, expectations, and example problems, which is then sent to candidates at the beginning of the process. This is a signal of effective organization and candidate empathy to me, and I wish more companies would share these publicly so others could see good examples of well-run processes.
  4. Examples of team socialization: I really liked seeing pictures and videos of team members and hearing them describe their workplace. It was a nice personal touch to put faces to names in remote times, and to see a slice of different personalities that I might get to work with.

I now had a list of about ~60 or so companies, and ordered them by how much I thought I wanted to work at that place. The guiding question I used to rank companies against each other was “Based on what I know right now, would I be more excited if I woke up tomorrow and worked at company A or company B?” which is a very personal thing! There were a handful of companies where the answer to this question ended up being “Eh, I think I’d want take a few more hours of sleep instead”, and I cut them from the list. At this point, I was back to ~40 companies, but over the course of my recruiting process, I added a few more that reached out and seemed interesting.

Leveraging Warm Intros

I perused LinkedIn to see who I knew at these companies, or if I’d had contact with them in the past. If I didn’t know someone at the company, I found people who knew people who knew someone, and asked them for intros so I could make a direct connection with the company. I also reconnected with recruiters from these places who had emailed me in the past, as a way to get my foot in the door. This brings me to the next point I want to emphasize: there were only 4 companies I cold-applied to, and I didn’t end up interviewing with any of them. All of them responded several weeks later, when I was well into my onsites. Warm intros have always been the most effective way for me to recruit, especially because I neither studied CS, nor went to an Ivy.

What I’d Do Differently Next Time

No process is perfect. Throughout mine, and since it’s concluded, I’ve been reflecting on what I’d do differently in the sourcing stage next time around:

  1. I think I’d be more strict about adhering to my non-negotiables. When I started sourcing, I had written down my non-negotiables, but I was also spoke to companies that didn’t sit exactly at the confluence of these three things (they were usually lacking in one), so I accumulated an unmanageable volume of interviews. I ended up with offers from a few of these places, and realized that the hesitations I’d had from the start never resolved themselves throughout the process because my non-negotiables were simply that: crucial pieces I needed to feel really excited. Someone once told me that I should feel more and more excited as I go through the interview process and gather more signals, and that definitely resonated with me.
  2. I would quit my job and recruit full-time. I didn’t do that this time around because I was scared that I wouldn’t be able to land any offers (hello, imposter syndrome) I felt really excited about, and that I’d be left stressed and jobless, in a poor position to negotiate or push for what I wanted. In addition, I think the context-switching between work and recruiting multiple times a day contributed to the feeling of total burnout by the time I’d finished. On top of that, I didn’t like having to keep my process secret for 3 months so my team wouldn’t find out. Stealth recruiting limited my ability to freely talk about my process and interesting opportunities on public channels like Twitter and LinkedIn.
  3. Next time, I actually don’t plan to cold apply to any companies; it’s never been a tactic that has worked out for me. I think this is one of the core issues that makes designing an effective recruiting process challenging: how can candidates and companies who would be a good fit for each other connect with each other? Unfortunately, I don’t have a great proposal; some of the ones that come to mind all have their own tradeoffs that I think companies need to test out and wrestle with depending on what type of skill they’re looking for.

If you read this post, let me know what you thought on Twitter @chrystalzou, or leave me a note in the comments, especially if you have thoughts about how to improve the discovery process among candidates and companies!

Special thanks to Rochit Gupta and Sharon Xie, who gave me a lot of support in my previous role, and provided feedback on this post 🌱

How I Started Recruiting Again

I’ve been thinking about how I want to go about sharing my most recent recruiting experience, which I’m documenting for two reasons: 1) posterity – it’ll be interesting to look back on this the next time I do recruiting to see how things have changed, and 2) recruiting is this whole mysterious black box, and I think that interviewers and candidates would both benefit from a more transparent process. We can’t really do that unless we’re willing to talk in detail about what happens, so here’s me trying to shed some light onto it. My hope is that someone reading this might learn something that they can apply to their recruiting process, regardless of which side they stand on.

In total, I talked to 52 companies, did 30 technical phone screens, 10 onsites, and received 6 offers. The full process from starting to study to signing an offer was about 3 months. My pass rate was ~98% for recruiter screens, ~70% for phone screens, and ~60% for onsites. It’s worth noting if you’re doing the math yourself, these numbers won’t add up; I dropped out of some processes at each stage for various reasons (more on why and how this in a specific post coming later).

This is also probably a good place to include a disclaimer that I’m not making blanket recommendations to anyone to copy paste my process expecting the same result (I ended with 6 offers, but the process was very taxing to get there). The role that career plays is different for everyone; I’m sharing my personal goals and experience, and there may or may not be stuff that folks find interesting enough to do due diligence and exploration on!

This will be written as a series of blog posts over a few weeks; I tried condensing everything I learned into a Twitter thread, or a single blog post, but found that it was too difficult to condense without omitting things I found important. This post will focus on the first part: namely, how did I know I was ready for something new, and what did I want in my next role?

Assessing my readiness

There are a lot of frameworks I’ve encountered that are supposed to help pinpoint the inflection point at which I feel like I want a change, but the one that has held most effective for me over time is how I viscerally and emotionally feel when I think about the work that I do. In particular, there are three guiding questions I’ve always found to give me clarity as to how ready I feel for a change that I’ve used for most of my career:

  • How do I feel about Mondays? When I find myself looking forward to Mondays, I know that I’m not ready for a change. It means I’m excited about the work that I’m doing and that I’m in a good rhythm of learning and feeling like my contributions matter, and I want to continue to ride out this wave! Of course, a bad week doesn’t mean I kick off a job search. I give the “I wish the weekend was longer” feeling about 2-3 months before I start thinking about something else.
  • How excited am I to refer people to my current company? I care about getting good people into good places, and I actively promote companies and hiring managers who I think would be fantastic to work with. Hopefully, this includes my own workplace! If I find myself in a place where I can’t confidently and excitedly shill for my employer, I interpret that to indicate waning excitement about where I’m at. Similarly, I’m curious about talking to employers who people I trust are excited about! This is less important than how I feel about Mondays because what may be a good fit for me, may not be a good fit for others.
  • How do I feel about the opportunities I have at work now? Put another way, if future prospects don’t work out in a specific way, will I wish I had left sooner? A lot of people stay at companies in hopes of something happening in the future – they may think that they’re close to a promotion, will get an equity refresh with another round raised, their boss will finally see they are a programming god, whatever. My personal philosophy on this is that the future is never guaranteed, so I usually don’t factor in future prospects in this decision unless there’s documented acknowledgement of the promise. In most cases, there are simply too many factors outside of my control to account for. The most common narrative I’ve heard is “I’m going to look for a new opportunity once I’m promoted,” but after the individual’s promotion is thwarted by a reorg, an overhaul of the promotion process, or a change in expectations, the individual is now understandably upset and feels like they were strung along for several months.

Distinguishing the non-negotiables from the nice-to-haves

When it came time to think about what I wanted in my next role, some of this reflection was done from the perspective of “What don’t I think I can get at my current company, even if I were to change teams or projects?” and some of this reflection was done from the perspective “What do I already have that I would never want to let go of?”. When I thought about the times I felt the most energized and empowered in my career, it boiled down to three non-negotiables:

  1. A mission or product that I could feel personally invested in: The world has countless problems to solve, and I still feel optimistic that a lot of these can be helped by software. When I thought back to places where I’d felt the most motivated, places that came to mind were those where I loved the product and felt connected to the mission (this cliche happens to ring true for me). Climate change, the healthcare system, and the financial system were top of mind for me because I see these as the three areas underpinning quality of life outcomes for everyone. I especially wanted to focus on companies who were building for underserved communities traditionally neglected by tech. Broadly speaking, the common theme across my interests has always been wanting to create positive impact for someone else’s life.
  2. Learning and impact opportunities: I wanted to give my intellectual curiosity room to flourish. As someone who has always biased towards action when I see a problem, I was looking for more flexibility and room to take ownership of opportunities to create impact, and to feel that others were energized about making things happen in the same way–even if that meant experimenting outside of our defined responsibilities. I was searching for that energy where people broke down silos and stepped over org lines to move promising ideas forward, or encouraged questioning of existing assumptions in pursuit of better outcomes. Naturally, I gravitated towards a lot of earlier-stage startups as a result of wanting less bureaucracy, although there were some more mature companies that embodied this type of attitude as well.
  3. D&I as an existing and internalized part of the culture, rather than a vanity metric to optimize for at the company level. I was the only non-male engineer on my former team of 12, and our eng org was <10% women. I’m lucky to have worked with really nice people, but I was absolutely yearning for a place where I felt more represented, especially in positions of power. I actively searched for startups with female founders, CTOs, and lots of diverse engineers, and discussed D&I in every interview to gauge how it was embodied by my potential coworkers.

Things that were important to me, but not dealbreakers:

  1. I didn’t want to take more than a 10% pay cut in terms of total comp (salary + equity, even if it was paper money). One of the benefits of working at a startup is that early equity can generate outsized returns if the company ends up being successful, and I was more than willing to trade cash and RSUs for that, but not to an extent where I’d need to drastically compromise my existing financial obligations or quality of life.
  2. Work-life balance: I believe that I operate at my best when I have adequate space away from work, but the balance of time across rest and work is different depending on the type of work I’m doing, and the particular goals at hand. I love losing myself in hard problems, but am easily discouraged when I feel like it doesn’t make an impact, so I was looking for a place that had product-market fit (less thrash), prioritized effectively, and where overwork was an exception rather than the expectation.
  3. Interesting engineering problems: I wanted exposure to fun and complex technical problems that would afford me a big learning curve, but I’m the type of engineer who will gravitate towards work that has the most impact, rather than work that is interesting for the sake of interesting work. Documentation, testing, and direct customer engagement are examples of things I enjoy that don’t fall under the umbrella of ‘gnarly technical problem’ if I know that they can have an outsized impact. I know many other engineers who would qualify this as non-negotiable! We would bring different strengths to the table.
  4. A hub in SF, but with the optionality of working remotely. I miss physical offices for their collaboration and organic socialization, but I will admit that my output is higher when I’m working in isolation at home because I’m free of distractions. More importantly, I’ve always believed that companies should support flexible working arrangements because employees know how they work best (and because this disproportionately benefits URGs and parents).
  5. A business model aligned with the mission: I ideally didn’t want to work at a place that sold user data and ads as the main revenue model, though if I could easily see how much benefit the product created, it could be something that I’d overlook. This is perhaps naive, but I ideally wanted to work someplace where buying and using the product made the world better off.
  6. Coworkers I could see myself becoming friends with: A good portion of my friends are former coworkers, and if I’m going to be spending the majority of my waking hours with people, I want to feel excited about that. Though I wasn’t looking for a family cult feel, I did feel drawn to camaraderie and forming social bonds with colleagues outside of code review.
  7. A well-run interviewing process: The rest of the posts are about this, because I learned two very important things in my interviewing process, especially since I’ve been both an interviewer and a candidate now (I was in the midst of designing a summer intern interview process when I was recruiting, and everything I experienced as a candidate funneled into making it approachable and empathetic for candidates). 1) It takes a lot of thoughtful, thorough, and empathetic work to design a good interview process, and even then, it won’t be perfect. 2) From the candidate side, the process (and in particular, the onsite) is where the best signals reveal themselves for what it would be like to work with this company, and what they care about.

It was a helpful exercise for me to identify what my dealbreakers and nice-to-haves were because they formed some consistent principles for my decision making and allowed me to better compare opportunities against each other. Career decisions are important, and now that I’m almost 30 years old, I don’t want to blindly hop from one place to another without defining my goals up front. In contrast to the last time I recruited for jobs (straight out of a coding bootcamp and haphazardly praying that a few places would see enough in my shitty code to take a risk and pay me to get better), I ideally wanted to choose a place where I could see myself staying for at least full 3-4 years (which feels like a decade in software!), so I promised myself I’d make my search intentional and thorough. Spoiler alert: some of my priorities shifted slightly (nothing drastic) over the course of my interviewing; put another way, values I didn’t know how to weigh came into clearer view.

What to expect in coming posts

Here’s what you can expect in upcoming posts if you’re interested in reading about my interviewing experience! I’ll be including resources that I found helpful, as well some thoughts on what I’d do differently for each of these. It was particularly interesting being on the candidate side because I got to see a lot of wonderful, unique ways some companies ran their processes, and I also felt some unexpected pain points. I plan to take both of those in stride to immediately improve the process at my next company (although, perhaps unsurprisingly, one of the reasons I chose them was because they ran one of the most stellar processes)

I’m going to try to hold myself accountable for writing at least one post a week, and I’d love to know what you found interesting or bland! If you catch me slacking or simply want to let me know what you thought, you can find me on Twitter @chrystalzou.

Thank you to Rochit Gupta, Cissy Hu, Katy Culver, and Girish Gupta for your feedback on the first draft of this post (in addition to your endless support through my process) 🙂

Lily (San Francisco, CA)

Edit: I had a couple of friends asking why this item was no longer available, and unfortunately didn’t realize that I posted this during the last weekend this item was on the menu! Lily is no longer offering their fried rice until indoor dining resumes in SF. Stay safe, and hopefully we can all indulge in some of the most amazing fried rice once the pandemic is over.

If there’s anything my friends know, it’s that decadent food is my choice of sin. Lily transforms fried rice, embellishing the classic leftovers dish with wagyu, uni, ikura, and crab, and I’m here for it.

The only thing I’ve had that comes close to this dish is the wagyu beef bowl from Fat Cow in Singapore, where the bowl contains wagyu, uni, caviar, foie gras, and an onsen egg. It’s also $73, and the portion size is definitely only enough for 1 person to eat. Not exactly a staple in my diet, but definitely worthy of a splurge on vacation. I told myself I’d probably make a trip back to Singapore just to have that bowl again, because I’d never come across anything similar in the US.

I originally saw this dish on willwanderforfood‘s instagram, and knew I had to try it! Dac biet fried rice sits at a hefty price tag of $68, which sounds like a lot for fried rice, but I mean it when I say that it was 110% worth every penny I paid for it.

The fried rice is superb, without being too greasy, too soggy, too salty, or too dry. They were spot on with the texture, taste, and seasoning. Without all of the fancy embellishments, I’d still consider this fried rice A+. There are bits of crab hidden throughout the fried rice that are juicy and succulent, and a generous portion of wagyu. The ikura and uni both tasted extremely fresh (no fishy, briny aftertaste), and the vivid orange yolk with edible gold flakes on top was chef’s kiss on top of the entire thing.

Each bite of this fried rice really held all of the flavors it had to offer. I tasted rice, chives, crab, egg, and wagyu / ikura / uni in each bite! There were two things I was unexpectedly really impressed by:

  1. The ingredients in the fried rice seemed to be evenly distributed and chock-full of what they promised to include. There was no skimping on any of the portions of wagyu, ikura, uni, or crab.
  2. I thought this dish was going to be small in size and that I’d want a second portion, but I actually couldn’t finish it in one sitting (and I was VERY hungry before I dove in). I ended up eating it over three meals, and I don’t have a dainty appetite by any means!

It’s uncommon for me to eat a dish and not have a single bad thing to say about it, but I guess there’s a first for everything! I’ve read rave reviews about their bo kho and sinh to, and if they’re anything like this special fried rice, I think I’m going to be a regular customer.

Lily was really responsive on Instagram, and throughout the pandemic, we’ve seen small businesses squeezed out of operating. F&B margins are thin, especially during times like this, and delivery services take up to 30% from a restaurant when orders are placed through their platform. If you want to, and are able to, support Lily directly, you can phone in orders directly for pickup (their takeout menu can be found here)

Ginger Chicken Congee with Preserved Egg · 皮蛋鸡肉粥

Congee is a special recipe for me. When I was growing up, if I ever came down with a bout of food poisoning, or wasn’t feel well, my parents would make me a bowl of congee to help settle my system. Plain rice congee is a common breakfast in China, but my favorite has always been either chicken porridge, or preserved egg porridge. I decided to try combining the two so I wouldn’t have to choose between two flavors I love, and this recipe ended up having my favorite parts of both congee types! It’s perfect for warming you up on a cold, rainy, day, but you can really have it any time.

basic info

  • gluten-free
  • nut-free
  • paleo
  • Yield: 4 servings
  • Prep Time: 20 minutes
  • Cook Time: 60 minutes
  • Nutrition (per serve): 454 calories – 11g fat, 47g carb, 44g protein


  • 200g white rice (uncooked)
  • 300g celery
  • 9 cups water
  • 2 cups chicken stock
  • 4 preserved duck eggs
  • 50g ginger root, minced
  • 2 tbsp soy sauce
  • 1lb chicken breast


  1. Add your rice, minced ginger, water, and chicken stock to a pot on high heat, and bring it to a boil, stirring and scraping the bottom of the pot occasionally to make sure rice doesn’t stick to the bottom.
  2. Once boiling, add your chicken breasts, and reduce the heat to a low simmer.
  3. Poach the chicken breasts until the internal temperature is 165F (about 15-20 minutes).
  4. Continue simmering the congee for about 30 more minutes. Set a timer!
  5. While the congee is simmering, remove the chicken breasts, and shred the chicken (I use two forks for this).
  6. Marinate the chicken breasts in the soy sauce, and set aside.
  7. Chop the celery and the preserved egg.
  8. Once the congee has finished simmering for 30 minutes, add the celery, preserved egg, and chicken. Simmer for another 5 minutes.
  9. Salt to taste. I personally prefer adding salt to my own bowl because everyone likes a different amount of salt, and if I’m eating it with a salty side (such as 榨菜) I don’t want my congee to be too salty either!
  10. Garnish with scallions and cilantro.

I love serving this dish with some salty side dishes, such as smashed cucumber (拍黄瓜), fermented bean curd (豆瓣), or pickled mustard stems (榨菜).

Recipe Notes:

  • I love the taste of preserved egg, but you can omit it if it’s not for you, and it’ll still taste like a healthy, nourishing bowl of congee.
  • Celery isn’t traditionally used in either chicken congee or the original pork version, but trust me – it adds amazing texture to this congee.
  • Poaching is a technique that cooks food in lower temperature water, which is great at getting a more even cook and retaining moisture, especially for things like chicken breast that tend to dry out easily.

Dry-Fried String Beans · 干煸四季豆

When I was living in China, my roommate Lili and I had staple dishes that we’d order at almost every restaurant we ate at. Dry-fried string beans were one dish that always made that list. The kick of heat from the chilis, the umami from the 芽菜, and the sumptuously blistered texture of the green beans was simply irresistible.

Now that I’m back in America, the toughest part of this dish is achieving that coveted ‘dry-fried’ texture, which usually requires deep-frying the beans in a hot wok, which can be difficult without a gas stove. I tried replicating the feel by blanching, steaming, and soaking the beans, but nothing would produce the same mouthfeel as the dishes I ordered in restaurants. I was actually feeling kind of hopeless and thought I’d have to resort to ordering from restaurants, until I tried roasted the green beans!

Roasting produces a really nice charred surface that is super close to the ‘dry-fried’ texture, but omits so much of the oil that accompanies a deep fry. The reason I can claim success on this recipe is because my current roommate (a friend I met in China) said this actually tasted better than the deep-fried restaurant version. It’s super easy, so I want to share it with people who love this dish as much as I do!

Basic Info

  • nut-free
  • gluten-free
  • refined sugar-free
  • paleo
  • vegan (just omit the beef)
  • Yield: 4 servings
  • Prep Time: 10 minutes
  • Cook Time: 20 minutes
  • Total Time: 30 minutes


  • 150g (5.2oz) ground beef
  • 600g (21oz) green beans
  • 10g (0.35oz) dried chili
  • 5g (0.35oz / 1tbsp) sichuan peppercorn
  • 20g (0.7oz) garlic (~7 cloves)
  • 20g (0.7oz) ginger
  • 50g (1.8oz) preserved vegetable


  1. Preheat oven to 425F (218C).
  2. Toss green beans with a drizzle of olive oil & salt.
  3. Roast for 20 minutes. Set aside after.
  4. Preheat a wok (any high-heat pan, like stainless steel or cast iron, will do) on medium-high heat.
  5. Brown the ground beef and set aside.
  6. Add a drizzle of oil, and toast the dried chilis and peppercorns until fragrant.
  7. Add garlic and ginger, stirring for 1-2 minutes.
  8. Add the preserved vegetables, stirring for a minute.
  9. Add the beans and beef back, combining well.
  10. Serve immediately with rice!

Steamed Whole Seabass · 蒸全鱼

Fish is commonly prepared whole in a lot of Chinese seafood dishes. The striking appearance, along with the flavors of the different parts of the fish, is a delicate, but impressionable, way to prepare whole fish. While this dish looks complicated, preparation is so easy and simple, and always satisfying!

Basic info:

  • nut-free
  • gluten-free
  • refined sugar-free
  • paleo
  • keto
  • Yield: 2 servings
  • Prep Time: 5 minutes
  • Cook Time: 10 minutes
  • Total Time: 15 minutes


  • 1 whole fish, about 1lb (453g)*
  • 3 stalks scallions
  • nub of ginger, roughly half the size of your palm
  • soy sauce
  • a handful of cilantro stalks
  • cooking oil with high-smoke point (I used avocado oil)
  • 1 pack firm tofu, drained and cubed (optional)


  1. Julienne the ginger and scallions.
  2. Place the fish in a steam-proof pan.
  3. Top the fish with the ginger and scallions, and stuff some into the cavity.
  4. Optional: add cubed tofu in the pan, around the fish.
  5. Douse the fish and tofu with soy sauce.
  6. Steam the fish for 8 minutes.**
  7. Remove fish from steam, and top with cilantro.
  8. Heat oil until it begins to shimmer.
  9. Pour the hot oil over the fish to finish.
  10. Serve immediately with rice.***

Recipe Notes:

  • I look for black bass or seabass, as their delicate flesh cooks wonderfully with this recipe. I normally buy the fish at a Chinese supermarket, where there’s a wide selection of live seafood that the fishmonger can clean and scale for you when you purchase.
  • 8 minutes is for a 1lb fish, but you may need 10 minutes for a 1.2 lb fish, or 13 minutes for a 1.5 lb fish. The fish is fully cooked when the flesh is opaque and flakes easily from the bone. If it’s not done, you can steam it for another few minutes.
  • I love spooning the sauce and scallions from this dish onto my rice to eat with the fish.
  • Simmer any leftover sauce with tofu for a quick and easy bite.

Authentic Sichuan Mapo Tofu · 麻婆豆腐

As autumn rolls around, there’s nothing that feels more comforting to the soul than rich, spicy dishes. If I’m being totally honest, I love spicy food year-round. It’s as common for Chongqingers to say that they eat spicy food in the summer to sweat and cool themselves down, as it is for them to claim it warms them up in the winter.

Mapo tofu is a Chinese dish that is now ubiquitous throughout the world, but it originated centuries ago from the Sichuan province, in my hometown of Chengdu. So it should come as no surprise that the version nearest and dearest to my heart is the original, numbingly-spicy version of the dish, one that I grew up with in my household.

I’ve found that there are three ingredients that trademark mapo tofu: chili bean paste (豆瓣), fermented black beans (豆豉), and of course, Sichuan pepper. In my opinion, omitting any of these three ingredients distinctly changes the dish, so I’d caution against substitutions.

Dietary restrictions:

  • nut-free
  • gluten-free
  • refined sugar-free
  • paleo
  • Yield: 4 servings
  • Prep Time: 5 minutes
  • Cook Time: 10 minutes
  • Total Time: 15 minutes


  • 1 lb (450g) medium-firm tofu*
  • 5 oz (115g) ground meat*
  • 1 scallion stalk, chopped
  • 1 tbsp (15mL) chili bean paste
  • 1 tbsp (15mL) fermented black beans
  • 1 tbsp (20g) minced garlic
  • 1 tbsp (8g) minced ginger
  • 1 tsp (5g) dried chili peppers
  • 3 tsp (3g) finely ground Sichuan peppercorns
  • 1/4 tsp (1g) ground black pepper
  • 5 tbsp cooking oil


  1. Boil water and pour into a bowl. Add salt and mix well.
  2. While the water is boiling, cut the tofu into medium-sized cubes. Add the cubes to the water to soak and soften.
  3. Grind the peppercorns. Set aside about half for garnish later.
  4. Grind the rest of the peppercorns, black pepper, and dried chilies in a food processor or mortar and pestle.
  5. Chop the scallions, and set aside.
  6. Mince the garlic and ginger, and set aside.
  7. In a pan that can handle high heat (I used a flat-bottomed wok), heat a tablespoon of cooking oil and cook the ground meat, making sure to salt it. Break it up into little pieces. Remove and set aside.
  8. Adjust the heat to medium heat, and add the rest of the cooking oil until the wok begins to smoke. Add the chili bean paste, black beans, ginger, and garlic, stir-frying patiently while the mixture blooms and the colors deepen.
  9. Add the ground spice mix, continuously stirring to make sure heat is being distributed evenly. Add a splash or broth or water as needed to deglaze the wok bottom.
  10. Drain the tofu, and add the cubes and beef back to the wok, gently spooning sauce over them.
  11. Top with the scallions and ground peppercorn.
  12. Serve immediately with rice.*

Recipe Notes

  • Soft or firm tofu can be used. If using soft tofu, be gentle when cooking the cubes.
  • Any type of ground meat should work, but I prefer ground beef.
  • This dish is great as leftovers the next day. It can revive leftover, dried out rice very well!

Savory Stir-Fried Tomato Egg · 番茄炒鸡蛋

Growing up, one of my favorite dishes was stir-fried tomato and egg. It was one of the first recipes I learned to cook from my parents, and is one of my go-tos when I want to cook something comforting, healthy, and easy. In high school, I’d often stay up late studying, and my mom would knock on my door to ask if I wanted tomato egg noodles, so I associate this dish with my mom’s care.

This is a staple homestyle Chinese dish, so restaurants and online recipes will each have slight modifications. Variations on stir-fried tomato and egg include a sweeter version, a more savory version, including ketchup, serving it over noodles, and more. There are more possibilities than you’d think with such a simple recipe! My favorite version tends to be on the more savory side, and the texture is thick like stew, which makes it a perfect accompaniment to rice or noodles.

Dietary restrictions:

  • vegetarian
  • soy-free
  • nut-free
  • gluten-free
  • refined sugar-free
  • paleo
  • Yield: 2 servings
  • Prep Time: 10 minutes
  • Cook Time: 10 minutes
  • Total Time: 20 minutes


  • 4-5 medium tomatoes
  • 4 eggs, beaten and salted
  • 1/2 tbsp (15 mL) cooking oil
  • 1/2 tsp (2.5 g) smoked paprika powder
  • 1/2 tsp (2.5 g) onion powder
  • 1/2 tsp (2.5 g) garlic powder
  • 1/4 tsp (1 g) sesame oil
  • 1/4 tsp (1 g) salt
  • 1/4 tsp (1 g) black pepper
  • scallions, chopped
  • ginger, sliced


  1. Boil water and pour into a bowl. Soak the tomatoes in this bowl for at least 5 minutes. This softens the skin and begins to break down some of the flesh inside, which helps the tomatoes release more juice and reduce later.
  2. While the tomatoes are soaking, beat the eggs. Add a pinch of salt to the eggs before beating.*
  3. Peel the skin from the tomatoes and cut them into large chunks.
  4. Heat oil in a skillet or wok over high heat.
  5. When the oil begins to shimmer, add the eggs. Cook them to be fairly well-done.*
  6. When the eggs are fully solid, add the tomato and ginger slices, and stir-fry for about 15 seconds. The tomatoes will begin to release juice.
  7. Add the paprika, onion powder, garlic powder, salt, and black pepper. Stir to combine in the mixture.
  8. Cover the pan with a lid and turn the heat down to medium-low so the juice can reduce and thicken, about 5 minutes.
  9. Remove from heat, add the sesame oil, and garnish with chopped scallions.
  10. Serve immediately over noodles or rice.*

Recipe Notes

  • I’ve always been told not to salt eggs before scrambling them, but I came across this article from Serious Eats that convinced me it doesn’t make a difference.
  • Unlike scrambled eggs, which most people prefer to be soft and silky, I find this dish works best when the eggs hold more structure and firmness, but feel free to experiment with what you like!
  • I love eating this dish with a side of preserved or pickled vegetables (榨菜) because the saltiness balances out the natural sugars in the tomatoes

Sesame Furikake Avocado Toast

Furikake and sesame come together in this fragrant, crunchy rendition of avocado toast. Furikake is a mix of dried seaweed and seasonings that can be found at most Asian supermarkets, but if you don’t have any on hand, any dried seaweed will do.


  • 1 slice of bread
  • 1/2 avocado*
  • 1 tsp (5mL) sesame oil
  • 1/4 tsp (2.5 mL) garlic powder
  • 2 tbsp (30 mL) chopped scallions
  • salt
  • pepper
  • chili flakes or crushed red pepper
  • furikake seasoning**


  1. Warm the bread in a pan on medium heat until the facedown side is slightly browned, about 3 minutes.
  2. While the bread is warming, mash the avocado with a fork until it’s chunky.
  3. Combine the avocado, sesame oil, garlic powder, chopped scallions, salt, and pepper. Mix well.
  4. Flip the bread so the other side can brown. Remove the bread from the pan after about 2 minutes, and spread the avocado mixture over it.
  5. Top your bread with a generous sprinkle of furikake and chili flakes.


* To check if an avocado is ripe, push gently on the stem. You can also squeeze the fruit gently in your hand. The less rigid it feels, the riper it is. Perfectly green avocados will have a medium-firm feeling.

** If you don’t have furikake seasoning on hand, substitute with any dried seaweed.