March 19
Harry W.
I originally wanted to title this as “How to beat the technical interview”, or something of that nature. But, at the last moment, I felt that this is better than that. Sure, my plan originates from how to properly beat the technical interview, which is an idea I got from my last writing; but, I realized that the point of my plan is so that you 10x yourself as a programmer, and as one of its applications of your skillset, you can beat the technical interviews. For a really long time now, it doesn’t sit right with me that for the rest of my career as a dev, I need to spend 200 hours every recruiting cycle to just survive the interview stage. To spend this amount of time during your prime time to just have a possibility of a career choice, while already in the field, is an insult. The most efficient way for me to become a programmer who can make a meaningful impact is to spend the most of my time learning, experimenting, and producing. If the technical interview is here to stay, then the best question I should be asking is “What’s the most important knowledge/skill to have, that will allow me to spend the most of my time develop meaningful products, and minimize the time I need to spend to maintain my ability to beat the interview game”. This is what I will attempt to answer.
I think the appropriate endgame for the technical interview, if I want to answer the question, is to be able to genuinely solve those problems on the fly during the interview, and provide a satisfactory program. On the surface level, this sounds insanely difficult, I have solved a total of 12 leetcode questions; How can I possibly solve an involved problem for a selective company, let alone be able to solve it under the interview constraint without prior exposure to that problem? I think if we limit ourselves to just “how to become a leetcode machine”, our viable solutions are indeed limited. But, recalling my own life story, I went from a mediocre student within an uncompetitive pool, to be able to hang around and occasionally rise above competitive students internationally. The key was that I spent seven years before just focusing on my fundamentals, which allowed me to pursue new fundamentals and develop new insights and combinations without needing prior exposures. The takeaway is that don’t worry about falling behind or ahead of your peers now, if you can truly develop the fundamentals better than everyone else, then the acceleration of compound effect is unbeatable years from now.
This is what I am proposing: focusing on the fundamentals of a programmer, and becoming better than everyone else in the seemingly basic techniques and knowledge domains. And I can bet that by doing that, it will allow you to be able to truly solve convoluted problems at work or at an interview (i.e. without needing to look up a tutorial). This sounds incredibly risky, and you are going to ask: “How is this going to work? There are millions of us trying to get the most competitive positions, why would doing the basics make us better? And if such solutions would work, why isn’t everyone doing it?” Look, when the 13 year old Harry got to the U.S., there isn’t a solution for him to make true American friends, to be able to compete with American born students for college admissions, to compete with international students in stem fields, yet here I fucking am. Even now, no one is saying: “holy shit, if I talk to new people everyday, read interesting books, try to converse with Americans, and spend time with textbooks, I can actually engage in this culture meaningfully and have an amazing time with everyone”. No, you still see every international Chinese student within their own group, you still see those students struggle during behavioral interviews, you still see them unable to engage within the culture they spend millions of dollars to get in. Even when there is a solution that worked, millions and millions of people still fail to succeed. Because the fear of being the first to try, held them back. That’s how I know. Chinese international students are the overwhelming majority of international students in any college, any country, yet none of them, or only very limited few, are able to talk with you guys like I do. I think that tells you everything you need to know about how likely it actually is to beat the odds.
So, what are the basics we need to master? In modern programming, that doesn’t concern with language choices, is data structures and algorithms. A true mastery of DS and algos can easily be 10x if not 100x of a programmer's ability and potential. And remember, it doesn’t matter how complicated any interview question is, at the end of the day, they are still built upon fundamental data structures and algorithms. So I will devise a plan to master these two domains over the next year and half. Since an average CS major already has a decent amount of exposure to these topics in their junior year, I think 1.5 years of dedicated learning/practice will set up a fantastic foundation for the rest of your career. Of course, the continued practice of these fundamentals is still needed, much like you still practice the most basic techniques in boxing after 10 years of training, but it will be only there to keep you grounded.
From past experience from my math classes, generally you only need one or two great resources to concentrate on. I will be using “Open Data Structures” for Ds, and “Algorithms by Jeff Erickson” for algos. The following plan follows the philosophy of actually studying a book from start to finish, and only doing appropriate exercise at the right place, and actually solve every problem on your own, without looking up any solutions. (Again, from past experience from my math classes, doable, can be painful at times, but you learn infinitely more) This is the key, if you are stuck on a topic, don’t bail out and watch a 5 minute youtube video, instead, spend 5 hours and truly understand the underlying construct. These 5 hours added up will truly consolidate your understanding; More importantly, these hours spent will help you to read/decipher documentations when there’s no youtube tutorial to help you.
Data structures: End of May to End of August (roughly 12-15 weeks)
Week 1-2: Intro + array_based lists
Week 3: linked lists + Skiplists
Week 4: Hash Tables
Week 5: Binary tree + Random Binary search tree
Week 6: scapegoat tree
Week 7: Red-Black tree
Week 8: Heaps
Week 9-10: Sorting: merge, quicksort, heap_sort, counting, radix,
Week 11-12: Graphs
Week 13: DS for integers
Week 14: external memory search
Note: yes, I do realize this is basically cs400. But I don’t think I did myself justice during the course. And I was way too focused on the programming side that I didn't understand a lot of the fundamentals of the basic trees or search or sorting. If you cheated a bit during the class, especially if you got caught cheating, I think that’s a great reason to do it properly this time.
Algorithms: (since algos is really really hard, I am planning to spend a year)
Graph fundamentals: 1 month
Recursion + backtrack: 1 month
Dynamic programming: 1 month (or even more)
Greedy algorithms: 3 weeks
Depth first search: 3 weeks
Minimum spanning trees: 2-3 weeks
Shortest paths: 1 month
All pairs shortest paths: 2 weeks
Max flows + min cuts: 3 weeks
Application of networks: 2 weeks
Advanced DP: 3 weeks
Minimum cost flows: 2 weeks
Linear programming: 2 weeks
Linear programming algos: 2 weeks
Nuts and Bolts: 2 weeks
Hashing: 2 weeks (optional)
Amortized analysis: 1-2 week
String matching: 2 weeks
Solving recurrences: 2-3 weeks