I've certainly been where you are. It definitely sounds like you need a job change, but your next company should be selected with care.

> I don't have good grades in my undergrad

Don't furnish that information. If the company asks you, bow out - it's an absurd question when you have 5 years of experience.

A masters won't help you much and I wouldn't recommend it in your situation. It's the kind of thing a person thinks about when they feel stuck - I've had the same impulse at every career junction.

> Should I work on solving LeetCode questions, and aim to get into FAANG companies

I'd certainly recommend LeetCode, but not just for interviews. There are benefits to it that nobody mentions: your initial code correctness, your debugging skills, your communication skills, and your familiarity with your programming language all go up.

I just went through this process and the time investment has paid off quite well. I used to hate LC and thought I wasn't capable of landing any job, let alone a top tier job.

FAANG is good for compensation, but not necessarily the most exciting work, so keep that in mind. There are many non-FAANG companies that are good catches.

teamblind.com is a great resource for interview tips, if used carefully.

Expect months-long practice and to do a lot of interviews. Rejection is just part of the process. Interview with companies you haven't heard of/don't care much about first. Respond to random recruiters who reach out.

Don't forget to study for behavioral questions (STAR method) and system design (https://github.com/donnemartin/system-design-primer).

For practical LeetCode tips - expect to complete a few hundred of them if you want to get into a top-tier shop. Speak out loud and explain as if you're in an actual interview. Timegate yourself: 7.5 minutes for easy, 12.5 minutes for medium, 20 minutes for hard. These are very aggressive times. If you haven't finished in that time, look at the solution, take notes, and understand it.

Here's a Python script I wrote to help myself with this process. `pip install rich` should take care of the only external dependency. This script randomly selects LeetCode question numbers and creates a markdown file for note-taking. When I failed a question, I would stick it in `attempted` and it would come back up eventually.

#!/usr/bin/env python

import random
import sys
from pathlib import Path

from rich.console import Console

LC_COUNT = 2218
TIME_LIMITS = {
"Hard": "20:00",
"Medium": "12:30",
"Easy": "7:30",
}

crushed = {}

mediocre = {}

attempted = {}

short_list = {
# Blind 75
76,
102,
105,
124,
128,
143,
152,
153,
198,
207,
208,
211,
212,
213,
230,
238,
252,
269,
271,
295,
300,
322,
323,
371,
417,
422,
424,
435,
449,
1143,
}

all_lc = {num for num in range(1, LC_COUNT + 1)}
untried = all_lc.difference(crushed)

lc_options = short_list or attempted or untried or mediocre
lc_options = lc_options.difference(crushed)

if len(sys.argv) > 1:
num = sys.argv[1]
else:
num = random.choice(list(lc_options))

console = Console()

def user_input() -> str:
return console.input(prompt="[bold blue]>>>[/bold blue] ")

console.print("LC:", num)
base_path = Path.home() / "LC/"
for existing_path in base_path.glob(f"*/{num}-*.md"):
console.print("File already exists:", existing_path)
exit()

difficulty = ""
while difficulty not in TIME_LIMITS:
console.print(f"Difficulty {list(TIME_LIMITS.keys())}:")
difficulty = user_input().strip().capitalize()

name = ""
while not name:
console.print("Name:")
name = user_input().strip().replace(" ", " ")

url_name = name.lower().replace(" ", "-")

path = base_path / f"{difficulty}/{num}-{url_name}.md"

template = f"""# Problem: {name.title()}
https://leetcode.com/problems/{url_name}/

*Difficulty:* {difficulty}
*Status:* Untried
*Time:* ? left out of {TIME_LIMITS[difficulty]} minutes

# Notes:

# Attempts:

##

Time: O(?)

Space: O(?)

```
```

# Solutions:

##

Time: O(?)

Space: O(?)

"""

if path.exists():
console.print("File already exists:", path)
else:
console.print("Creating file:", path)
with open(path, "w") as outfile:
outfile.write(template)

console.print("Done", style="bold green")