转一个 Google L5 Mountain View, CA 过经

Status: Software Engineer with 15 years of Professional Experience
Position: Google L5
Location: Mountain View, CA
Date: October 14, 2019

Background:

Hi, my name is Clayton. First off I’d like to give a big thanks to the folks at leetcode (both problem setters and problem solvers), the questions and solutions posted on this site are helpful for understanding algorithms from multiple perspectives expressed via different thought processes and languages. I’ve paid for two 1-year leetcode subscriptions so far, and I strongly feel those were the two best investments I’ve made in years. I’ve been a professional software engineer since I graduated with a B.S. in Computer Science in 2004 from the University of Arizona. I honestly never really learned much about algorithms in my undergraduate studies. I simply learned enough about them to pass some tests. During my career, I slowly forgot whatever I did learn about algorithms. The majority of my professional work was performed in the wireless industry where I developed a highly proprietary skillset. When it was time for me to move on to the next chapter of my career, I had a very hard time with interviews. I was extremely uptight, nervous, and anxious about interviewing; and I failed 100% of the technical phone screens I attempted. I thought to myself, “What’s wrong with me? Why am I receiving so many NOs?” Then I took a leetcode contest for the first time and answered none of the questions during that contest. This was a shock for me: as if this objective measurement of sub-optimal performance slapped me straight in the face. So I decided to start learning again, basically from scratch. This was an extremely slow and frustrating experience at first. I would regularly take 1 or 2 weeks to solve easy leetcode problems. However, I stuck with it and found help in the solutions posted in discussion boards associated with each problem. I also believe the following 3 online courses were extremely beneficial to help my mind “shift gears” to understand the fundamental basics of algorithms and data structures:

  1. Learning How to Learn: Powerful mental tools to help you master tough subjects
  2. Tim Roughgarden’s Algorithms Specialization
  3. UCSD’s Data Structures and Algorithms Specialization

Preparation:

I started using leetcode to study algorithms and data structures about 2 years ago in 2017 after I totally bombed a handful of technical phone screens. I consistently set aside 30-60 minutes each day to solve leetcode problems. As of today, I currently solve just 1 or 2 questions during each Leetcode contest. You can check out my Leetcode profile here: https://leetcode.com/claytonjwong/. I’m definitely not the sharpest tool in the shed, but I am willing and able to learn (…and keep learning …and never give up!).

  1. 1005. Maximize Sum Of Array After K Negations
  2. 1006. Clumsy Factorial
  3. 1007. Minimum Domino Rotations For Equal Row
  4. 1008. Construct Binary Search Tree from Preorder Traversal

Phone Interviews: I had two technical phone interviews, each about 1 hour to answer 1 question. I believe I had a second technical phone interview because I barely “passed” the first technical phone interview.

Onsite Interviews: I had 4 technical interviews, 1 lunch break “interview”, and 1 behavioral interview. The first 3 technical interview questions were similiar to the following 3 categories of Leetcode questions:

Summary and Advice:

  1. Don’t try to “fake” it.
  • Either you actually know algorithms and data structures XOR you know about algorithms and data structures. This small difference is a huge difference! It is impossible to “fake” algorithmic thinking and understanding. Objective measurement of your individual performance can be derived from weekly leetcode.com contests.
  • There are 3 stages to acquire a new skill:
    1. Cognitive: focused thought required to perform a task
    2. Associative: improved accuracy and efficiency, much less concentration required to perform a task
    3. Autonomous: perform task automatically with barely any concious effort at all with optimal accuracy and efficiency
  • In order to “pass” the onsite interview, I strongly feel that one needs to be at the autonomous stage for understanding and coding all basic algorithms and data structures. Google provides candidates more than enough preparation material to understand what “basic” means (ie. Trees, Graphs (BFS/DFS/DFS+BT), DP (top-down/bottom-up), Stacks/Queues, Hash Tables, etc.). I estimate studying 10-20% of the preparation material provided by Google a few weeks prior to interviews; it’s significant amount of information to “digest” in a short period of time.
  1. Know when to use which data structure and algorithm.
  • Most questions are open-ended and require additional information gathering. Clearly and concisely communicate your thought process while solving the problem. My perfectionist tendencies are to create an elegant solution on the first try. However, all questions asked onsite were non-trivial for which there exists no immediate “perfect” solution. Start off with a “good enough” working solution, then optimize it. There’s no sense optimizing an incorrect solution! Start off with basic fundamentals, and incrementally refactor “as needed”.
  1. Be a humble, life-long learner. Never give up! Never surrender!
  • There’s a lot of information to acquire for simply understanding the fundamentals of algorithms. For example, the CLRS “Intro to Algorithms” book is 1292 pages long; that’s a loquacious “introduction”! It takes time to fundamentally understand these algorithms by sharpening the mind’s eye. However, the brain can slowly restructure itself to meet cognitive demands. Just learn a little bit each day and stick with it. The compounding interest (ie. pay day) will come. That’s the law of the harvest, you reap what you sow.

Final Thoughts: I really hope this is a helpful and motivational post for “older” software engineers like myself. Have fun and keep learning! Continually re-invent yourself as a modern software engineer.