Табы, пробелы и ваша зарплата — какая связь?

в 11:43, , рубрики: open source, Блог компании Mail.Ru Group, визуализация данных, математика, никто не читает теги, открытые данные, пробелы, табуляция

image

Пару дней назад Дэвид Робинсон опубликовал на Stack Overflow статью с очень провокационным названием: Разработчики, использующие пробелы, зарабатывают больше использующих табуляцию (перевод на Хабре). Автор взял данные из исследования разработчиков, проведённого Stack Overflow, и в самом деле показал, что использование пробелов ассоциируется с более высокими зарплатами, даже принимая в расчёт одинаковый уровень опыта. Так что, нужно вместо табуляций использовать пробелы, чтобы увеличить свою зарплату?

image

Ответ однозначно «нет», потому что проведённая корреляция не подразумевает причинности, и интуиция подсказывает, что отступы в коде не имеют прямой связи с чьей-либо зарплатой. Вся эта история озадачила многих людей и даже попала в новостной выпуск ВВС.

Я верю, что конечная цель теории анализа и обработки данных — получение ответов на вопросы и выявление новых причинно-следственных связей. К сожалению, исходная статья не даёт ответов на многие вопросы. Это забавная корреляция, но что за ней стоит? В своей статье я попытаюсь пролить свет на этот вопрос. Первоисточник многих заставил подумать над этой проблемой, в том числе и меня. Так что предлагаю вам свою небольшую научно-детективную историю с глубоким изучением данных из исследования Stack Overflow. Вы увидите, что табуляция и пробелы не то, чем кажутся. Спойлер: ваша зарплата больше зависит от типа компании и окружения, в котором вы работаете, чем от типа используемых отступов.

Исходные данные

В своей статье Дэвид показывает, что использование пробелов вместо табуляций ассоциируется с более высокой зарплатой, и этот эффект проявляется вне зависимости от уровня опыта. При этом те, кто использует и пробелы, и табуляцию, имеют те же зарплаты, что и те, кто использует табуляцию.

image

Кроме того, этот эффект якобы не зависит от языка программирования или вашей специализации как разработчика. То же самое можно сказать и о размере компании. Так почему более высокооплачиваемые разработчики предпочитают пробелы? Очевидно, что тут должен быть какой-то искажающий фактор, но я не была уверена, что он был упомянут в исследовании. Я начала проводить собственное расследование, анализируя линейно-регрессионную модель из исходной статьи.

Данные для линейной регрессии

Исходная статья включает в себя линейно-регрессионную модель, прогнозирующую зарплаты на основе нескольких переменных:

  • Страна.
  • Стаж программирования.
  • Использование табуляций и пробелов.
  • Специализация разработчика и язык программирования.
  • Формальное образование (бакалавр, магистр, кандидат).
  • Наличие вклада в open source.
  • Является ли программирование хобби.
  • Размер компании.

Я решила внимательнее изучить данные и поиграть с модифицированными моделями. Для своей линейной регрессии я взяла разработчиков из США. Отчасти потому, что это крупнейшая выборка в исследовании, и анализ по одной стране избавляет от многих региональных различий, и отчасти потому, что я сомневалась в достоверности уровня зарплат в некоторых странах (об этом ниже). Теперь давайте возьмём статистические данные и проанализируем их. Я хочу показать вам цепочку своих рассуждений, которые привели меня к определённым выводам.

Анализируем линейную регрессию

Хочу отметить, что я изменила регрессионную модель, использованную Дэвидом, потому что она не включала в себя постоянное смещение (bias term, постоянное слагаемое), что привело к модели типа ANOVA. Я воспользовалась стандартной линейной регрессией с постоянным смещением и применила две модели:

  • Полную модель с информацией о табуляциях и пробелах.
  • Сокращённую модель без информации о табуляциях и пробелах.

Сравнение моделей должно было подсказать мне, сколько информации можно получить за счёт использования предпочтительного вида отступов. Обе модели одинаково хорошо прогнозируют зарплаты — или одинаково плохо, в зависимости от вашей точки зрения. Откуда это известно? Можно посмотреть на коэффициент детерминации R2, определяющий степень отклонения зарплаты, которую можно объяснить с помощью входных переменных (стаж, язык и так далее). Чем выше коэффициент, тем лучше можно смоделировать зарплату как комбинацию других факторов.

Модель R2 R2adj
Полная модель 0,4008 0,3892
Сокращённая модель 0,3938 0,3892

У обеих моделей очень близкая точность, обе могут объяснить около 40 % отклонения зарплаты. У полной модели R2 выше, что вполне ожидаемо для модели с большим количеством переменных. Скорректированное значение R2adj можно использовать для сравнения двух моделей, чтобы понять, какая удовлетворяет лучше. У полной модели R2adj тоже выше, но разница составляет всего 0,0068. Похоже, что информация об использовании табуляций и пробелов важна, но не вносит заметного вклада. В сокращённой линейно-регрессионной модели отсутствующие данные можно отчасти компенсировать использованием других переменных.

Я проверила на коллинеарность, которая всегда опасна для прогнозных моделей. Коллинеарность — это ситуация, когда какие-то переменные высоко коррелируют друг с другом, что затрудняет выделение их отдельного влияния. Я не нашла признаков её наличия, а коэффициенты регрессии не изменяются массово в зависимости от модели.

Так в чём отличия между полной и сокращённой моделью? Я решила взглянуть на р-значения регрессионных коэффициентов, отражающих значимость каждой переменной в модели. Значимость хотя бы одного параметра увеличилась существенно? Я искала переменные, чьи р-значения упали как минимум на порядок (в 10 раз), чтобы выяснить, какие из переменных в сокращённой модели оказались важнее, чем в полной.

Выяснилось, что в сокращённой модели выросла значимость переменных:

  • Стаж программирования.
  • Вклад в open source.
  • PHP.

Коэффициенты для этих переменных тоже изменились, но не драматично. Всё вместе это означает, что если убрать данные о табуляциях и пробелах, то модель скомпенсирует это за счёт стажа и вклада в open source (а также тем, работаете ли вы с PHP). Опыт — очевидный фактор, влияющий на зарплату, что не удивительно. Моим следующим кандидатом для расследования стал opensource.

Я подробнее рассмотрела данные о вкладе в opensource и сделала интересный вывод о том, что это связано с более высокой зарплатой, как минимум если вы живёте в США. Вероятно, люди с более высокими зарплатами чаще вносят свой вклад в движение за открытый код? Этот эффект наблюдается во всём диапазоне опыта.

image

Сторонники open source чаще используют пробелы

Как opensource связан с нашими дебатами относительно пробелов и табуляций? Похоже, участники opensource-движения используют пробелы гораздо чаще других. Среди тех, кто не участвует в opensource, примерно поровну использующих табуляцию и пробелы.

image

Среди участников opensource «пробельщиков» более чем вдвое больше, чем использующих табуляцию. Это различие также статистически значимо учитывая р-значение 9,1981718×10−24. Та же тенденция наблюдается и в других странах, хотя там сторонники opensource используют табуляцию чуть чаще.

image

Думаю, теперь мы ближе к потенциальному объяснению причин полученных Дэвидом результатов. Главное преимущество табуляций — возможность настройки их отображения в IDE, а с пробелами получается фиксированный макет. Это означает, что для разных людей один и тот же код с табуляциями будет выглядеть совершенно по-разному. А когда начинают смешивать пробелы и табуляция в одном файле, то это приводит к бардаку. Я думаю, что когда над opensource-проектом работают без принятия единого стиля кода, то возможные проблемы с форматированием заставляют людей использовать пробелы, чтобы код выглядел для всех одинаковым.

Это лишь одна из возможных теорий. Я не оценивала, насколько активно участвуют в opensource сообщества языков, где преимущественно используются пробелы (например, Python или Ruby). Повторюсь, корреляция не предполагает причинности.

Табуляция, пробелы, open source и зарплата: как всё это совместить?

Теперь вопрос: объясняет ли работа в opensource более высокие зарплаты у тех, кто использует пробелы чаще табуляций? Если построить график зарплат на основе данных о вкладе в opensource и виде отступов, то получим более сложную картину, чем в исходной статье, где сравнивались только пробелы и табуляция.

image

Джуниоры, использующие пробелы и табуляцию, участвующие в opensource, имеют чуть более высокую среднюю зарплату, чем не участвующие «пробельщики». А участвующие в opensource, имеющие стаж более 15 лет и использующие табы, имеют более высокую среднюю зарплату, чем «пробельщики». Кроме того, если у вас стаж меньше 15 лет и используете табуляцию, то участие в opensource не влияет на зарплату. Но если используете пробелы, то при участии в opensource будете получать больше, чем если участвовать не будете. Эти результаты можно воспринимать с определённой долей скепсиса, потому в некоторых группах результаты относительно малы.

В целом какой-то эффект есть, но он не меняет общей картины: «пробельщики» в целом зарабатывают больше, чем те, кто использует табы. Есть ещё что-то, что можно проанализировать?

Исследуем распределения зарплат

В этот момент я была убеждёна, что любые переменные, влияющие на зарплаты «пробельщиков» и тех кто использует табуляцию, не входили в простую регрессионную модель. Я не хотела выполнять мартышкин труд и добавлять все доступные переменные (их более 150, и все категорийные). Я решила проанализировать распределения зарплат для разных видов отступов: имеют ли «пробельщики» в целом более высокие зарплаты, или есть подгруппы «пробельщиков», искажающих результаты?

Я построила график с разными стажами. Ниже показаны плотности распределения зарплат для разработчиков со стажем менее 5 лет, здесь эффект наиболее заметен. Все три распределения имеют основной пик в районе одного уровня зарплаты в районе $65 000—70 000. Этот пик отражает большинство джуниоров, и судя по всему, здесь использование пробелов и табуляций никак не влияет на зарплату.

image

Любопытно, что распределение зарплат «пробельщиков» является бимодальным (имеет два пика). Большинство получает те же деньги, что и другие разработчики, но есть две подгруппы, преимущественно использующие пробелы и получающие гораздо больше остальных. Чем они отличаются? Я поискала ответ на этот вопрос в результатах исследования. Для этого использовала χ2, чтобы посмотреть, сильно ли различалось количество «пробельщиков» и тех кто использует табы в разных категориях.

Важность версионирования

Поскольку количество программистов в категории с высокими зарплатами было невелико, у меня получилось много потенциальных кандидатов. Меня удивило, что одной из переменных, чьи значения сильно отличаются для высокооплачиваемой группы и остальных, является версионирование. Я отфильтровала системы версионирования, часто использующиеся джуниорами в США (как минимум по 20 пользователей в исследовании):

Зарплата выше Зарплата ниже
Git 168 660
Другая система 17 30
Subversion 4 47
Team Foundation Server 6 92

Оказывается, использование системы версионирования зависит от используемого вида отступов, и это справедливо для разработчиков по всему миру, не только для джуниоров в США (p-значение 1,5336476 х 10-44)! Это означает, что есть твёрдая связь между табуляциями, пробелами и системами версионирования.

Давайте проанализируем этот факт. Две самые популярные среди американских разработчиков системы (как минимум по 200 пользователей в датасете) — Git и Team Foundation Server (TFS). Как они влияют на зарплаты?

image

Пользователи Git зарабатывают больше вне зависимости от опыта. Интересный вывод, который может быть связан с нашим предыдущим исследованием участников opensource. Но куда интереснее, как связано всё вместе: версионирование, табуляция с пробелами и зарплата?

image

Системы версионирования разрушают шаблон, что высокие зарплаты всегда ассоциируются с использованием пробелов. Компании, использующие Git, платят больше денег вне зависимости от вида отступов, как минимум разработчикам со стажем вплоть до 10 лет! Использующие Git и табы, зарабатывают больше «пробельщиков», использующих TFS, вне зависимости от опыта. В группе пользователей Git «пробельщики» всё ещё имеют более высокие зарплаты. Но в группе TFS ситуация иная: «пробельщики» получают меньше всего.

В других странах картина несколько отличается, но вы всё равно вряд ли захотите быть программистом со стажем 15+ лет, использующим пробелы и TFS.

image

Также я проанализировала пользователей системы Subversion, в мире она чуть популярнее TFS. Subversion тоже не подтверждает утверждение, что «пробельщики» в целом зарабатывают больше. Пользователи «Git + табуляция» зарабатывают почти столько же, сколько «Subversion + пробелы» и «Git + пробелы и табуляция».

image

Итог №1: Почему важно версионирование?

Подводя итоги, комбинация факторов «участие в opensource» и «использование системы версионирования» как минимум отчасти влияет на разницу зарплат между пользователями табуляций и пробелов. Это не означает, что вы должны начать использовать Git и вносить вклад в opensource, чтобы вам платили больше (хотя в любом случае это приветствуется!).

Думаю, эти два фактора указывают скорее на разницу окружений и типов компаний, насколько они придерживаются традиционных подходов и используют современные технологии. Более консервативные олдскульные компании, не использующие Git и opensource-код, в целом платят меньше. Тип окружения трудно оценить напрямую из результатов исследования, так что оба этих фактора лишь косвенно наводят на подобные размышления.

Это не конец истории, и я уверена, что есть другие переменные, которые могут пролить свет на ситуацию с пробелами и табуляциями. Также мои выводы в целом основаны на данных о разработчиках из США, здесь эффект наиболее заметен. Ниже я расскажу, почему у меня возникли проблемы с анализом зарплат в других странах.

Почему я анализировала только американцев?

Когда я оценивала распределения зарплат с учётом других факторов, моё внимание привлекла одна вещь, которая для меня непонятна. Данные, с которыми я работала, относились только к профессиональным разработчикам, работающих полный рабочий день. Но есть и большая группа людей с очень низким годовым доходом меньше $3000. К сожалению, само по себе это неудивительно, потому что доходы в разных странах мира различаются очень сильно. Но странным было то, в каких именно странах люди получают такие низкие зарплаты.

image

Больше всего низкооплачиваемых респондентов было из Индии, что вполне понятно в данном контексте. Средняя зарплата в Индии значительно ниже, чем в других странах ОЭСР. Но после неё идут Польша, Россия и даже Германия. Там, возможно, не гигантские зарплаты, но сильно меньше $3000 в год для разработчика на полную ставку — крайне мало.

Я сам приехала из Чехии, поэтому знаю об особенностях региона и у меня есть предположение, почему такая странная ситуация с данными. Поэтому проверила распределение зарплат в паре стран из Центральной и Восточной Европы, а также сравнила их с распределениями в странах из других частей мира.

image

image

В таких странах, как Великобритания, Франция и даже Индия, распределения зарплат имеют один пик. А во всех странах Центральной и Восточной Европы — два пика. Первый соответствует очень низкой зарплате, второй — большой, куда большее соответствующей годовому доходу. Это менее выражено в Германии, более выражено в Польше и гораздо больше — в России. Я проанализировала ещё несколько стран, включая Чехию и Украину, там эта тенденция тоже существует. Во всех странах этого региона бимодальное распределение зарплат. Что там происходит?

Согласно моему опыту, чехи всегда обсуждают зарплаты с точки зрения не годового, а месячного дохода. Я никогда не слышала от чехов, чтобы они говорили о годовом доходе. Мой польский друг подтвердил эту версию — все оперируют только месячными доходами. Похоже, многие респонденты просто невнимательно прочитали вопросы в исследовании и назвали свои месячные доходы, а не годовые, потому что именно этим понятием они оперируют в повседневной жизни.

Можно ли как-то поправить данные? К примеру, создать смешанную модель и умножить низкозарплатную группу на 12. Так мы получим распределение, усечённое слева, но точнее отражающее реальные зарплаты в странах по сравнению с изначальными распределениями. Вот пример Польши:

image

Итог №2: Ловушки в данных

Главный вывод заключается в том, что к данным всегда нужно относиться внимательно. В результатах исследования есть много искажений, и некоторые из них весьма неожиданные. Если бы я не была знакома с особенностями менталитета, то вероятно предположила бы, что в ряде стран действительно очень много низкооплачиваемых позиций уровня стажёров. Я не уверена, из каких именно стран респонденты называли ежемесячные зарплаты вместо годовых, поэтому ограничился при анализе американской выборкой. Надеюсь, эти данные наиболее консистентны.

К сожалению, люди не всегда корректно отвечают на вопросы исследований, и это очень трудно обнаружить. Возможно, это повлияло и на ситуацию с пробелами и табуляциями. Учитывая реакцию в соцмедиа, кто-то указал использование табуляций, потому что нажимают клавишу Tab, даже хотя табы неявно преобразуются редакторами в пробелы.

Итог №3

Я вполне уверена, что разница в доходах между «пробельщиками» и тему кто использует табы в основном связана с типом компании и рабочим окружением. Окружения, где используется Git и вносится вклад в opensource, больше ассоциируются с более высокими зарплатами и пробелами. Уверена, что есть и другие факторы. Но будьте внимательны: никогда нельзя целиком доверять данным.

В завершение хочу поблагодарить Дэвида за предоставленный им код и Stack Overflow за публикацию данных из исследования. Можете скачать мой код, который я использовала для этого анализа.

Автор: AloneCoder

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js