Every year, thousands of ML engineers grind 500 LeetCode problems and still can't debug a production model that's silently serving garbage predictions. The skills that actually get you hired — and keep you employed — look nothing like a binary tree traversal.
In 2021, I was on the hiring committee at a 200-person ML startup (Series B, ~$40M raised). We brought in a candidate who'd solved 600+ LeetCode problems, had a perfect score on our algorithmic screen, and couldn't tell me why our recommendation model's precision had dropped 18 points overnight. He'd never looked at a confusion matrix in production. Never traced a data pipeline backward from a bad prediction. The offer didn't happen.
We hired someone who failed the graph traversal question. She spotted, in 20 minutes, that our feature store was silently serving stale embeddings because a Kafka consumer had lagged behind by 6 hours. That bug was costing us roughly $60k/month in degraded ad revenue. She got the job. She got a strong offer.
LeetCode tests whether you can pattern-match to problems you've already seen. That's it. Dynamic programming on a grid doesn't transfer to debugging a transformer that's overconfident on out-of-distribution inputs. Topological sort doesn't help you when your training and serving pipelines have different preprocessing logic and your model is 4% worse in prod than in eval — which, by the way, is one of the most common and most quietly devastating ML bugs in existence.
The skills that actually matter in ML engineering fall into three buckets nobody talks about in prep guides.
Your model is a function that learned a mapping from distribution D_train to labels. The moment D_serve drifts from D_train, all bets are off. Can you detect that drift? Can you quantify it?
The practical skill here is computing population stability index (PSI) on your input features, monitoring KL divergence between training and serving distributions, and setting up alerting in something like Datadog or Evidently AI before the business team notices the metrics move. PSI above 0.2 on a key feature is a fire alarm. Most engineers don't know this number exists.
PSI = sum((actual% - expected%) * ln(actual% / expected%))This one formula has saved more ML products than any hash map optimization ever will.
Offline metrics lie. Not because they're wrong — because they're measuring the wrong thing. A model with 94% accuracy on your held-out test set and 87% accuracy in production has a 7-point eval gap that's almost certainly a data leakage or temporal split problem. Learning to construct time-aware train/val/test splits, to audit for target leakage using mutual information between features and labels, and to run shadow deployments before full rollouts — that's the craft. That's what separates researchers who publish from engineers who ship.
Features have lifetimes, latency budgets, and failure modes. A feature computed at training time from a full user history is not the same feature computed at serving time from a 200ms database call. I've seen teams spend months improving model architecture while their feature pipeline was introducing 15% null rates on mobile clients because of a timeout nobody monitored. PyTorch didn't help them. A PagerDuty alert and a feature validation schema would have.
The model is rarely the problem. The data getting to the model almost always is.
Read Chip Huyen's "Designing Machine Learning Systems" cover to cover. Work through the recsys failure post-mortems on Eugene Yan's blog. Set up a real MLflow experiment tracker on a side project and watch how fast your assumptions about reproducibility fall apart. Learn what a training-serving skew actually looks like in Weights & Biases before you interview anywhere.
One good debugging war story in an interview — specific, technical, honest about what went wrong — beats 50 solved LeetCode mediums every single time. At least at any company worth working for.