Эти понятия, как и многое другое, пришло с запада. В России, знаю на примере текущей компании, есть разделение на "Инженер-программист 3й категории", 2й категории и высшей категории (ведущий инженер-программист). В нормативных документах, в том числе и в рамках должностной инструкции описано, что например инженер программист 2й категории - это сотрудник с высшим образованием по специальности и таким-то количеством лет опыта. Это формальный подход, на практике мне дали 2ю категорию существенно раньше, чем "положено".
Тем не менее, сейчас все равно используются эти 3 понятия (с довольно плавающими границами) для того, чтобы как-то разделяться уровень программист. Точное определение можно получить только в рамках компании и тех требований, которая она предъявляет. Например где-то один и тот же программист может быть сеньором, а в другой - максимум мидл.
Может ли использоваться с целью занижения зарплаты? Может. Мое мнение, что в данном вопросе важно не "звание", а то как твой опыт и твои навыки покрывают запросы чужого бизнеса. Отсюда и вытекает твоя стоимость на рынке. И где-то будучи джуниором можно получать больше, чем мидл в другом месте, зависит от предъявляемых требований. Хочет ли работодатель купить дешевле тот же скилл? Хочет. Есть компании, где критерии формализованы, в рамках этой компании рост более прозрачен.
Можно ли ответить быстро на этот вопрос? Можно. Все зависит от человека и по какой шкале он себя будет оценивать. Есть те, кто пытаются поднять свой статус, есть те, кто наоборот предпочитает предъявлять к себе повышенные требования. А есть средняя температура по больнице. Все-таки колоссального разброса в представлениях работодателей нет, поэтому есть от чего отталкиваться.
Это все лично мое мнение, не претендующее на истину)