I first came to the U.S. for college in 2012 knowing nothing about programming. Three and a half years later, I received six software engineering job offers, from Facebook, Airbnb, Salesforce, Gusto, Bloomberg, and Groupon.
I want to share my story because I’m sick of the illusion that programming is complex, difficult, and only for smart, young kids. I’m tired of how all programing stories start with: “I started to code when I was 6 and then built my first video game…”
My story is different. It’s the journey of how an average person went from knowing nothing about programming to receiving six software engineering job offers. It isn’t a miracle. You will read about how I moved toward my goal step by step over the course of three and a half years. Each and every step was hard as hell. You will see my struggles and failures.
My experience made me believe that programming is a skill that’s accessible to everyone. Everyone who can read can code. If you are worried that you are not smart enough for programming, I hope reading my story and seeing my past struggles and failures will give you some strength.
Who is this memoir for?
- for those interested in learning programming but worried that they are not smart enough
- for those starting to learn programming but feeling lost and also worried that they are not smart enough
- for students in college wanting to become software engineers
What will you read?
You will learn a bit about my background and everything I did during those three and a half years that eventually helped me receive those job offers. I will share the *lessons* I learned along the way and #tips# you might find helpful. (Search for * and # for references.)
The memoir is in chronological order:
- Fall 2012 & Spring 2013: learned the basics of programming.(2 min read)
- Summer 2013: went home and did nothing.(1 min read)
- Fall 2013: wrote the most embarrassing resume. (5 min read)
- Winter Break 2013: the hell of interview preparation. (1 min read)
- Spring 2014: landed my first internship in desperation. (3 min read)
- Summer 2014: got ahead of the game. (3 min read)
- Fall 2014: went through hell again. (2 min read)
- Spring 2015: internship and LeetCode. (1 min read)
- Summer 2015: internship and LeetCode again. (1 min read)
- Fall 2015: the dream came true. (1 min read)
You will hear what I did in each semester and summer: how I felt too ashamed to write my first resume because I had nothing to show, how I got rejected by dozens of companies, how I gradually leveled up my game one internship after another…In brief, it’s a story filled with failures and struggles, but also one with a happy ending.
Sounds good? Grab a cup of coffee and some popcorn. It’s story time. =)
My background: not a genius.
When I was a kid, I was told repeatedly by my family, directly and indirectly, that I wasn’t smart. I never loved math. I didn’t start coding until I was 18. I was the first one in my family that went to college. I am the only person in my family that works in tech. But I do have my own strength: once I know what I want, I can always figure out a plan and see it through.
How I came up with my plan.
Before I went to the U.S., I had a big fight with my family. From the fight, I learned an extremely important lesson: if I couldn’t support myself financially, I would have no control over my own life. So since my first day in college, my goal was clear: graduate in four years with skills that could help me support myself.
My initial plan.
At the beginning of my freshman year, I somehow learned that the minimum wage for a software engineer in the US was around $50k. (I don’t know if that’s true, but that’s what I believed back then.) Coming from an undeveloped city, $50k was a lot of money. So my initial plan was to get a job as a software engineer after graduation.
Then my question became “How could I, an international student, get a job and become a software engineer?” I researched online to see how others did it. To my surprise, many international students got employed by famous tech giants: Google, Facebook, Amazon, etc. From their stories, I learned that getting a job at a prestigious tech company involves two steps:
- build an impressive resume to get interviews from these companies (internal referrals could help a lot).
- build the skills required to pass coding interviews.
Both steps seemed totally controllable. I could do internships and side projects to build my resume. I could study data structures and algorithms to pass coding interviews.
What’s great was that most prestigious companies have similar standards for both steps. If a resume looks good to Facebook, it probably also seems impressive to Google. And, despite having different interview styles, companies essentially test the same skills.
Luck might play a big role, but there are so many great tech companies. If I was well-prepared, the chance of getting into at least one of them would be high.
The adjusted plan.
I then adjusted my plan to: follow the above two steps and become a software engineer at a prestigious tech company.
It was my freshman year, and I was confident about my plan because:
- Many people had achieved the same thing. If they could do it, I could do it as well.
- The success of the plan depended on me. I was in control of how much time and effort I would put in. I would reap what I sow.
- I could increase the chance of success by interviewing with more companies. If I was indeed well-prepared and interviewed with 15 companies, the chance of having bad luck with all 15 companies would be low.
With an actionable plan, all I needed to do was to execute on it, adjust it accordingly as I went, and stick with it even in difficult times. Of course, seeing the plan through was much harder than making it. And I did question it many times throughout the process. You will read about that soon. But at that moment, I had a plan and was up for the challenge.
[Freshman Year] Fall 2012 & Spring 2013: learned the basics of programming.
I didn’t know how to code before college. So I started with the basics: Scratch, a language for children to learn code, then C++ and Java.
I knew the sooner I started to prepare for coding interviews the better. And I found two helpful resources: a book named Cracking the Coding Interview and LeetCode, a coding exercise website designed for interview prep.
I didn’t use these resources right away because I was intimidated; I decided to first get comfortable with programming. My plan was to master everything I learned in class by doing lots of exercises from textbooks.
I enjoyed solving those exercises. Each of my solutions meant three things to me:
- I understood how to use the programming language, either C++ or Java.
- I understood the problem stated in the exercise.
- I was able to use what I knew about the language to solve the problem.
The fast feedback loop from programming made the process very addicting. If it worked, that meant I was right. That felt great. If it didn’t work, that meant I was wrong. And since changing code and rerunning a program was fast, I could figure out what I was wrong about, fix it immediately, and learn something new. That felt great, too. Doing those exercises was a very rewarding process. I did get stuck every now and then. But it didn’t happen often because those exercises weren’t too challenging.
# Tip #: Learn by getting your hands dirty. Use whatever you learn as soon as possible. Create and relay on fast feedback loops to test your understanding.
I also put my answers on a WordPress blog to keep track of progress and gain a sense of achievement. I never advertised it. But surprisingly, some students found it helpful. It felt great to know what I put out for personal use had been helpful to others.
# Tip #: Have a blog to share what you are learning. It will give you a sense of progress and keep you motivated. It also helps others that are one step behind you. And remember, no matter how elementary you think you are, there are always people one step behind you who can use your help.
Summer 2013: went home and did nothing.
I didn’t think I could land an internship in the first summer. To protect my fragile ego and self-esteem, I didn’t try at all. I went back to China and did nothing.
[Sophomore Year] Fall 2013: wrote the most embarrassing resume.
It was time for me to look for an internship for summer 2014. I didn’t want to go to my school’s career fair at all because I didn’t have a resume. I was very scared about writing my first resume because I had nothing to show.
I had nothing to put on my resume besides few CS courses I took. But I couldn’t go to a career fair with a half-page-filled resume. I started two side projects just to add them to my resume, marking them as “In Progress”. I also joined a bunch of CS clubs to fill up the rest. (To get a sense of how inexperienced I was, check out my first resume.)
I then went to the career fair. The hall was packed with students. There were huge lines in front of every booth. Students in line had different expressions. Some looked nervous. Some looked impatient. Some looked desperate. I remembered leaving the fair at the end of the day feeling exhausted, discouraged, and scared.
Although I didn’t get any interviews, going to the career fair was beneficial. I learned that being able to make an impression over a short conversation is an important skill. Thanks to the fair, I had my first resume. It also made me realize that I was a poor candidate.
# Tip #: Do the things that scare you the most as soon as possible so you know how far you are from your goal. The first step of anything is always the most intimidating and embarrassing. Don’t let these feelings hold you back. Ignore them, and do whatever you need to get done. You will only become better from there. Everything that follows will be easier.
The fair was a wake-up call. It made me realize the market was competitive and it was really hard to get an internship. I felt panicked because I needed an internship for summer 2014. Otherwise, I would be at a disadvantage compared to other students who had internships, which would make getting the next internship even harder.
I also realized, without an impressive resume, job hunting is scary. Since then, I have been constantly thinking about building a stronger case for myself, one small step at a time. (*lesson*)
The plan for the rest of the semester became to gain more experience so I could attend the next career fair with a less embarrassing resume. I decided to do two things: 1. join a research lab and 2. do side projects.
Joined a research lab
Thanks to my high GPA, I got invited to a research fair. It was like a career fair but for research labs. I met Dr. Rym Zalila-Wenkstern there and found her work very interesting. I got to talk to her for about 15 minutes during the fair but didn’t think I made a strong enough impression. So when the fair ended, I approached her to ask her more questions about her research and to show her that I was passionate and serious about joining her lab.
We walked and talked for a long time. There was another student interested in the lab who also walked and talked with us. After that day, both of us joined Dr. Zalila-Wenkstern’s lab.
Looking back, joining the lab was one of the best decisions I made in college. Dr. Zalila-Wenkstern was a very supportive mentor. I learned more from working at the lab than any course I took. Working at the lab opened many opportunities. Without them, I won’t be where I am today. You will see some of those opportunities in the rest of the post.
# Tip #: Go the extra mile. Don’t play the same book as everyone else. If you really want something, try your best to make sure you get it. Do things that show your passion and help you stand out from the crowd. Most of the time, that extra mile doesn’t require that much extra effort. But it makes all the difference. There were about 60 students that got invited to the research fair, but only the other student and I joined Dr. Zalila-Wenkstern’s lab. The extra mile we went was simply spending 30 minutes after the fair to talk to Dr. Zalila-Wenkstern and sending follow-up emails.
Built my first side project: an Android app
Having research experience is good, but there was more I could do. Since I knew the basics of Java, and Android development uses Java, I naively decided to build an Android app.
I spent couple days brainstorming ideas. I thought about what to build all the time — when walking to classes, showering, eating… Gradually it became a habit and ideas starting flooding in all the time. (The habit stays with me, which almost becomes a “curse”: There are so many things I want to build but not enough time to build them.)
I picked a simple idea. It was the first app I ever made. And the experience of building it was anything but smooth. Everything that could go wrong went wrong. There were multiple times I wanted to pull my hair out of my head. It involved lots of googling, debugging, and swearing. After months of struggling, I finished and published it. I had PTSD from the experience and didn’t touch anything Android related for the next 12 months.
Looking back, I can understand why I had such a hard time. The app was significantly more difficult than anything I had worked on before. All of my previous programs were tiny, each with less than 100 lines of code. It was the first app I built, but also, subjectively, the most challenging one. Everything I built since then has gone much more smoothly.
# Tip #: keep the first version of your app lean and simple. Aim to get something working first. You can always build on top of that.
# Tip #: when you get stuck for a long time, don’t give up yet. Take a break, get some rest, talk to a friend. There were many times when I got stuck and thought I had tried everything but nothing worked. As hopeless as those situations seemed, somehow I always managed to eventually figure a way out. So don’t trust the voice that says: “there’s no way I can make it work”. If you really can’t figure the issue out, try to change the feature so you don’t have to deal with it: so you can move on with your project instead of having to abandon the whole thing.
Followed an online algorithms course
It was also time for me to start practicing for coding interviews. But I wasn’t senior enough to take algorithm courses from my school. So I tried to follow an online algorithm course. I only watched half of the lectures and gave up the rest because I didn’t find it super helpful.
Winter Break 2013: the hell of interview preparation.
Finally, I started to practice coding questions. I mainly practiced questions from Cracking the Coding Interview and LeetCode. The whole experience was a nightmare. Physically, I did nothing besides sit in front of my laptop all day long. But mentally, it was like going through hell. Stress, fear, uncertainty, loss of confidence, frustrations, disappointment from constant failures…these were the emotions I experienced every single day.
It was like asking a kid in elementary school to solve college-level calculus questions. I simply wasn’t equipped to solve those coding challenges. I was lacking many algorithmic mental models.
My failure to solve those questions was unbearable — because being able to solve them was a key part of my plan. If I couldn’t solve those coding questions, no matter how impressive my resume was, I wouldn’t get an offer.
So each day, despite being extremely afraid of those coding questions, I forced myself to sit down and wrestle with them. I experienced failure after failure. Each failure was a signal that said: “maybe I will never get this”. At the end of each day, my confidence was completely destroyed. And I would have doubts whether my plan would eventually work, if any of my practicings was actually working, if I was improving at all. These doubts brought lots of stress. I went to sleep each night with stress, fear, and worries. Then the next morning, I would go through this emotional hell all over again.
Looking back, my skill was certainly improving. But I wasn’t aware of that. My improvement took a long time to become noticeable. I was frustrated and worried because I didn’t feel like I was making progress. If I had noticed my improvement, I wouldn’t have felt so lost and uncertain. (*lesson*)
I later learned that there are more systematic ways to practice. But back then, I knew nothing. I should have questioned my methods. But at least I didn’t give up. If, instead of trying to push through, I gave up, I wouldn’t have had the chance to discover the better method later on. (*lesson*)
# Tip #: when you are not sure if your effort is making a difference, question your method and the way you observe results. Sometimes improvement takes longer than expected to surface. Sometimes, you just have to tell yourself: “If you’re going through hell, keep going.” and “Never, never, never give up.”
By the end of winter break, I ended up going through couple chapters from the book and about 60 questions from LeetCode.
Spring 2014: landed my first internship in desperation.
The journey of landing my first internship had many obstacles. Thanks to luck and persistence, it ended on a happy note.
Got referred to Google
I heard internal referrals were the magic that would almost guarantee you an interview with the company. I learned about Google’s Engineering Practicum Internship. I googled “Google internal referral” and found a few Googlers offering it. I reached out to them explaining my background and passion. One of them replied and agreed to refer me. I ended up with an interview with Google.
The interview went fine. I was naively hoping to get lucky and get an offer. This wishful thinking took some weight off my shoulders. I also started to apply through my school’s system, and to some random companies online.
Career fair for the second time: found my dream company
It was time for the spring career fair. Before the fair, I researched companies that were participating. A company named Dialexa caught my attention. I read that “Dialexa Is The Most Bad Ass Startup In Dallas”.
I read everything about it online and completely fell in love with it. Its founder Mark Haidar is the combination of a bold innovator, a hardware and software genius, and a sophisticated businessman. I learned about the client work they did and was impressed. I became a fan.
At the intern fair, I met Nathan, an engineer at Dialexa. I got very excited and chatted with him for a long time. I told him all the things I learned about Dialexa and how much I admired their work and philosophy. I shared with him the work we did at the lab and showed him my Android app. Before I left, Nathan gave me his business card and invited me to visit the office.
Rejection from Google
Soon after the career fair, I got a rejection from Google. It wasn’t surprising, but it put me back into a panicked state. It was almost summer. I had no offer. Each night I went to sleep worrying if I would eventually get an internship. I kept telling myself it would get better.
An offer coming from nowhere
One day I got an email for a phone interview. It was from a company I applied to through my school’s system. The interview was a simple five-minute chat that ended with a verbal offer.
The offer was a gift from the Universe. I had been dying for an offer for almost a year. Nothing I did seemed to work. But all of a sudden, I got an offer.
I felt relief. I had been carrying a huge weight on my shoulders for almost a year. The moment I got an offer, the weight was lifted. And I could finally breathe again.
I noticed how fast a situation could turn around. A day ago, I was desperate and miserable. Nothing worked. There was no evidence that any of my efforts mattered. I was in the dark. Within a few hours, I got an offer. And my life completely changed from miserable to joyful. This pattern would reappear over and over again. (*lesson*)
I learned that no matter how bad a situation seems at the moment, it can completely turn around within a short period of time. It was one of the most important lessons I have ever learned. This realization has helped me through many difficult times. (*lesson*)
# Tip #: When you are in the dark and feel hopeless, hang in there. There is always hope.
An offer from Dialexa
After my office visit, I got an offer from Dialexa. I was thrilled. Yet, I couldn’t take the offer. Dialexa offered unpaid internships. But my school only accepts paid internships. As an international student, I couldn’t legally accept the offer without paperwork from my school.
It was clear to me that I would learn a lot more from Dialexa than the other company. I asked Nathan if there was any way I could get paid. He said that it was Mark’s decision and he couldn’t do anything. I was in the dark again. I was so close to my dream company, but I was blocked.
I refused to let go of such a great opportunity. I was only one step away from getting the internship. I wouldn’t stop there. I kept emailing Nathan once a week to let him know I really wanted to work there. For a long time, he was busy and didn’t reply. I kept emailing regardless. About a month later, Nathan told me Mark just got back from a trip and suggested I meet with him. Finally, I saw the silver line. (Repeatedly emailing people isn’t always a great move. You should use your best judgment.)
I met with Mark. I told him I came to the U.S. by myself, just like he did years ago. I told him how much I loved the company and how hard I would work. 15 minutes into the meeting, Mark agreed to offer me a paid internship. (Dialexa has been offering paid internships since then.)
Here’s the pattern again: a day ago, the situation seemed hopeless. Within 24 hours, it turned around and I got what I wanted. (*lesson*)
# Tip #: When you are in the dark and feel hopeless, hang in there. There is always hope.
Another side project
After settling my internship, I started another side project. A student from the research lab told me about web apps and why they were so popular. So I bought an ebook online to learn Python and Flask. Then I took a free web development course from Udacity. After that, I built a simple web app as my second side project.
This experience went much more smoothly than the Android one. The book and the course equipped me well. It made me realize how many resources are available online.
It made me believe that one can go a long way by teaching herself programming with online resources: tutorials, documentation, StackOverflow, etc. I fell in love with the programming community: there are so many resources available and so many people helping others and sharing online. (*lesson*)
Participated in 2014 Google Code Jam
In the spirit of building my resume, I participated in the 2014 Google Code Jam: an online coding competition. I didn’t go far in the contest. But I had fun and had one more thing to add to my resume.
Summer 2014: got ahead of the game.
Two things happened in summer 2014 that brought me to the next level: the internship and a hackathon.
The game-changing internship
I was right about choosing Dialexa over the other company. I learned a lot during my internship there. Dialexa operated like a startup. It was a tech firm plus an incubator. Besides providing software and hardware solutions for clients, it also turned ideas into startups.
For the first third of my internship, I worked on a medical desktop app. For the rest of my internship, I worked on an internal hackathon project hosted by Vinli, a startup in the incubator.
My project, Beagle, contained two apps. I used Rails to build the web app and Swift to build the iOS app. Since I had no experience with Ruby/Rails nor Swift/iOS development, I spent two weeks binge watching Rails and iOS development tutorials from CodeSchool. Then I started coding. Rails was a monster with lots of magic. Engineers at Daliexa helped me through many hard times. Swift and iOS were a delight to work with.
At the end of my internship, I won first place at the hackathon. Later that summer, Vinli became one of the six finalists of TechCrunch Disrupt SF 2014 Battlefield. It was very exciting to witness us getting to the finals.
This experience confirmed my belief about self-teaching programming. By leveraging online resources, within two months, I was able to self-teach Rails and iOS development and build fairly sophisticated apps with them. It required lots of hard work. During those two months, I spent about 15 hours per day working on the apps. That’s another thing I love about programming: you reap what you sow. With all of the resources online, nothing can hold you back as long as you are willing to put in the effort. (*lesson*)
Looking back, I’m glad I fought for Dialexa. Although the other company’s compensation was about 3 times more than Dialexa’s, I chose Dialexa because I could learn more there. (*lesson*)
# Tip #: always prioritize investing in yourself. That’s the best kind of investment.
Won another hackathon.
During the summer, I attended a weekend hackathon with a friend. At first, I didn’t want to go because of I thought hackathons were for geniuses who started coding at age six. I felt inferior compared to those people. I didn’t want to face the shame I had. But I went anyway, just to add it to my resume.
When I arrived, I realized all the attendees were normal people just like me. I got excited. In the end, my friend and I built an Android app, Stealth Saver, and won a prize.
What I learned is that we tend to have false impressions about things. Most things are not as hard as they seem and we are more qualified than we think. The key is to ignore the negative voice in your head and just do whatever you need to get done. You don’t have to be controlled by your emotions. (*lesson*)
# Tip #: if you think something is really hard, most likely it’s not as hard as you think. Ignore how unqualified you feel about yourself and do whatever you need to get done. Try your best and let the result take care of itself.
Took classes from community college
Over the summer, I also took some online classes at a community college. They were simple classes like Government I & II, Art History, etc. I took them over the summer so I could take advanced CS classes during the school year. Because of that, I could have a semester without any coursework and still graduate on time. This turned out to be an advantage later.
[Junior Year] Fall 2014: went through hell again.
Fall 2014 was a busy semester, to say the least. I built my first personal website, went to a conference, continued to practice coding challenges, interviewed with about 15 companies and got nothing. Near the end of the semester, I was hopeless. But the situation turned around within a few days, and I got an internship with Salesforce. I did all this while continuing to work part-time at Dialexa. Now, you will read about how going the extra mile and not giving up helped me level up my game.
Got the scholarship to go to the Grace Hopper Conference
Dr. Zalila-Wenkstern strongly recommended that I attend the Grace Hopper Conference. So I applied for a scholarship. And luckily, a strong recommendation letter from Dr. Zalila-Wenkstern and my international background helped. I got the scholarship. Attending the conference was a turning point that opened many opportunities; you’ll read about these soon.
Built my first personal website
I learned that cool kids not only had killer resumes but also personal websites. So I decided to build one for myself. I spent two weeks of free time to build the website. That was a small extra-mile thing I did to stand out from the crowd. I wasn’t sure if it was the best use of my time as there were a lot of other things I needed to do. But I did it anyway. It made a game-changing difference later. You will know what I mean in a second.
Built a much stronger resume.
With the internship experience, the hackathon, and all the other things I did on the side, I had a much stronger resume. I finally didn’t have to worry about filling up a page. I was proud of myself. (Here is how the resume looked, in case you are curious.)
Practiced coding interviews again
After my website was ready, I went back to practicing coding interviews. Although I still didn’t have a clue for most questions, I was used to the frustration and didn’t let it bother me too much. I still wasn’t sure if I could ever master all the required skills. But I decided to try my best and hope it would all work out.
Attended the Grace Hopper Conference
Going to the conference was a lot of fun. I attended a couple of great talks, connected with students from other universities, and met some leading figures in the tech field. Most importantly, it had the best career fair one could image. All the famous tech companies were there and the lines were fairly short. I had the opportunity to talk to engineers from many companies and learn about their roles.
Apple had a huge booth at the fair. I was a bit intimidated. After all, it’s Apple. But I approached anyway. Since I used Swift, I thought at least I had one topic of conversation. I chatted with an Apple engineer. He was impressed by my experience. I got introduced to a hiring manager which later led to two interviews with two different teams at Apple.
That experience really built up my confidence. I realized it’s not all that hard to impress an engineer. All you need to do is to talk to them engineer-to-engineer. Not like a student to a professional, nor a job seeker to an interviewer. But an engineer to another engineer. When you think and act that way, they will respect you as an engineer and will more likely appreciate your experience and skills. (*lesson*)
At the career fair, both sides, companies and students, were eager to learn more about each other. No one was waiting in a long line just for the sake of talking to someone. It was a transformative experience that made me realize I wasn’t just somebody begging to get a job while being judged by companies. I was desirable and had the right to pick the companies I liked. Companies and students were equal partners in this job hunting game. This mental shift was powerful. I’ve never felt nervous about talking to interviewers since then. (*lesson*)
# Tip #: During job hunting, think of yourself as equal to the company you are talking to. An interview is a two-way street. While companies gauge your skills, you select the ones you want to work for. You have as much power to say no as the other side.
I also met many students from prestigious universities: MIT, Harvard, UC Berkeley…Hanging out with them made me realize they were normal people like me. Whatever they could achieve, I could achieve as well. (*lesson*)
Besides students, I also interacted with many females engineers in the field. They were who I aspired to be in a few years. Seeing people who lived out my dream was empowering. It reminded me my dream was not just a dream. It was practical and achievable. (*lesson*)
# Tip #: Try to find people who are living the dream life you want. Connect with them to remind yourself your dream is achievable.
Interviews and failures
A couple of weeks after the conference, I had many interviews lined up with famous tech companies: Apple, Bloomberg, Google, Palantir, etc. At that point, I had finished about 100 questions from LeetCode. My skills weren’t ready but I was hoping to get lucky.
The whole interview process lasted about two months. I fantasized about working with each of them, but eventually got rejected by all of them. I experienced an emotional rollercoaster over those two months. For each company, I would first get hyper because of my fantasies. Then there was an interview followed by a period of obsessively checking emails. Lastly, came the rejection letter that brought me disappointment and sadness.
It was painful to go through the emotional rollercoaster. I learned that it’s stupid to fantasize about anything before getting an official offer. (*lesson*)
The silver lining: an offer from Salesforce
It was almost winter break but I hadn’t received any offers. Just like the last time I looked for an internship, I was desperate and worried. I was a junior so it would be my last internship before looking for a full-time job. I really wanted to intern at a big company to make myself a more competitive candidate. Again, each night I went to sleep worrying if I would eventually get an offer. I kept telling myself it might get better tomorrow.
I remembered I got an email from Salesforce a while back. (I handed my resume to a Salesforce recruiter at the conference.) I thought that email was from a recruiter. It had been sitting in my inbox for a while because I was too busy with other interviews. I naively thought I would have gotten at least one offer from all those interviews, so I never checked out that email.
I opened that email and realized it was actually from an engineering manager, Ronnie. I replied to the email immediately and got an interview scheduled. The next week, an engineer from Ronnie’s team interviewed me over the phone. The interview was fairly straightforward. I was asked how a commonly used data structure was implemented. I passed the interview and received an offer from Salesforce.
This is another example of the silver lining pattern: no matter how bad a situation seems at the moment, it can completely turn around within a short period of time. Never lose hope! (*lesson*)
Since I was a semester ahead of schedule, I asked if I could intern for both Spring 2015 and Summer 2015. Ronnie agreed. I ended up scoring two internships with Salesforce.
Later in Spring, Ronnie told me that he originally planned to give out the last offer to someone else. But he got my email the day before he planned to send out the offer and decided to give me a shot. I have to admit luck played a big role in my success. I was very grateful for the opportunity. I also learned to always plan for the worst. (*lesson*)
I asked Ronnie why my resume caught his attention. His answer surprised me. It was because of my website. He said the extra effort I put in suggested that I was someone serious about her career. That’s another example of how going the extra mile might make all the difference. (*lesson*)
Kept practicing coding challenges
While I was interviewing with different companies, I kept practicing coding challenges from LeetCode. I started to develop a better way to learn. I found two new helpful resources: tutorials from TopCoder and a course in Chinese targeting interview questions. Although I still wasn’t able to solve many challenges, I was getting more and more familiar with the core algorithms. I wasn’t as lost as before. The sense of progress comforted me. I kept going regardless of the pain.
Spring 2015: internship and LeetCode
At Salesforce, I worked on the performance team and learned a lot about databases. My hours were very reasonable. During the three months of the internship, I spent, on average, about four hours each day outside of work practicing coding questions. Since I would be looking for my first job out of college in six months, I wanted to give it my best and be as prepared as possible.
I found a more efficient way to practice. I first grouped all the questions by topic. Then I would focus on a topic and move on to the next topic only after I finished all of the questions related to the current topic. Before doing questions, I would first read about the topic, mainly on TopCoder. Then I would start working on questions starting from easy to hard.
There were about 230 questions on LeetCode back then. I finished all of them near the end of spring.
Summer 2015: internship and LeetCode again
Because of some miscommunication with the HR team, the performance team didn’t have enough headcount to keep me for the summer. I transferred to the IoT team.
If my internship at Dialexa turned me into a developer who could build functional apps, my experience in the IoT team made me start thinking like an engineer.
My first project was a NodeJS app. At first, my code was like spaghetti. Through many iterations of code review, I not only added tests but also learned to break a big chunk of procedure code into small readable methods. This skill provided an algorithmic way of thinking. I learned that all complex problems can be broken down into smaller ones. This way of thinking made tackling many coding challenges a lot easier.
Kept practicing coding challenges
Outside of my internship, I continue to spent about four hours per day practicing coding challenges. I did many questions for the second or third time. Practice over the summer was a lot more enjoyable. I gradually developed an algorithmic way of thinking. It was very encouraging to solve problems I wasn’t able to solve before and feel that my skills were getting better.
Getting ready for the game
Fall 2015: the dream came true
Because of a return offer from Salesforce, this round of job hunting was not as stressful as the previous ones. Through internal referrals and Grace Hopper Conference’s resume database, I was able to get interviews from all the companies I was interested in.
I set my expectation low–the worst case was that I wouldn’t get any offers and would return to Salesforce full-time. Considering my coding interview success rate was zero at that point, I really wasn’t sure if I would pass any interviews at all. I kept my emotions checked and promised myself not to fantasize until the entire interview process ended. That strategy really helped. I managed to stay relatively calm and under control throughout the whole stressful three-month interview process.
# Tip #: Keep your emotions in check.
Besides Salesforce, I ended up receiving offers from Facebook, Airbnb, Gusto, Bloomberg, and Groupon, and withdrew my applications from a couple companies due to time constraints. I accepted the offer from Gusto. The rest is history. (Click here if you are interested in why I chose Gusto over the others.)
There weren’t many obstacles during my senior year. From an outsider’s perspective, I seemed like a genius who aced one interview after another and received a bunch of job offers. But if you read the whole story, you would know that’s not true at all. I struggled, worried, burnt out … I was just a regular human being. It was the process that produced the result. The role my talent played wasn’t as big as many people thought. Anyone willing to go through the same process would have the same chance of success.
What I am not suggesting
- I’m not suggesting everyone should learn programming and become a software engineer. I’m saying if you are interested but worried you are not talented enough, talent isn’t as important as you think. Many “talented” people’s “talent” is the compound result of time and efforts.
- I’m not endorsing the current way tech companies interview candidates. It’s not great. To me, it was a mean to an end.
- “Never give up” can be interpreted at different levels. It can mean don’t give up on trying to solve the current problem. Or don’t give up on finishing the project. Or don’t give up on programming. Or don’t give up on yourself. It’s up to you how to interpret it.
What do you think?
I hope my story expresses my point: programming is not just for “smart kids”. It’s approachable and available to anyone with access to the internet.
Whether you think you can, or you think you can't--you're right.Henry Ford