I have been quite impressed with Levels.fyi website which shows a mapping of career levels between companies. E.g., what does a level 66 in Microsoft map to in Uber? How does it do it? How would I do it? Let’s say we have data from users when they switch jobs that tells us the level of the person in company A and what level the person joined in company B. So this would e.g., give us a table of the form:
So to get a mapping between Microsoft and Uber, for each level x in Microsoft:
- filter data and select rows where
From = Microsoft,From_Level = x,To = Uber - and average the
To_Levelcolumn of rows from previous step
That gives mapping of level x in Microsoft to Uber. Call it M(Msft,x,Uber) = M(from,level,to)
This will not work. To see why, consider the fact that when people switch they usually accept a lateral level or better yet level up. Rarely do they level down. So when we run the above algorithm, we might get a table that looks like (assuming people aggresively level up when they switch):
and if we re-run the algorithm, but switch the roles of Microsoft and Uber i.e., we compute M(Uber,x,Msft) we might get a mapping that looks like:
Clearly this is wrong. It implies level 63 at Microsoft = level 66 at Microsoft. For a correct mapping, we require
M(Uber, M(Msft,x,Uber), Msft) = x
How to find such a M? Well, the solution is simple. Plot all the points where people have switched between Microsoft and Uber on a 2D graph and fit a straight line through them. One might be tempted to do fancy things like clustering to handle non-linearity but it will only make things worse. Hint: Try making a scatter plot where candidates constantly level up. How will you cluster?
Levels.fyi goes beyond this: it actually allows one to select more than two companies and instantly see the mapping between levels. How could this be possible? Well, the answer is simple. In practice it does none of the above. In reality, all levels are mapped to compensation and using compensation as a common hidden variable, it is very easy to get a mapping of levels between arbitrarily selected companies. So in the end, level is nothing but a proxy for money. There you have it. In fact, the table From, From_Level, To, To_Level doesn’t even exist. When levels.fyi collects data, their form only records compensation and level at current company, not the levels when a person switches from company A to B.


