Пару дней назад Дэвид Робинсон опубликовал на Stack Overflow статью с очень провокационным названием: Разработчики, использующие пробелы, зарабатывают больше использующих табуляцию (перевод на Хабре). Автор взял данные из исследования разработчиков, проведённого Stack Overflow, и в самом деле показал, что использование пробелов ассоциируется с более высокими зарплатами, даже принимая в расчёт одинаковый уровень опыта. Так что, нужно вместо табуляций использовать пробелы, чтобы увеличить свою зарплату?
Ответ однозначно «нет», потому что проведённая корреляция не подразумевает причинности, и интуиция подсказывает, что отступы в коде не имеют прямой связи с чьей-либо зарплатой. Вся эта история озадачила многих людей и даже попала в новостной выпуск ВВС.
Я верю, что конечная цель теории анализа и обработки данных — получение ответов на вопросы и выявление новых причинно-следственных связей. К сожалению, исходная статья не даёт ответов на многие вопросы. Это забавная корреляция, но что за ней стоит? В своей статье я попытаюсь пролить свет на этот вопрос. Первоисточник многих заставил подумать над этой проблемой, в том числе и меня. Так что предлагаю вам свою небольшую научно-детективную историю с глубоким изучением данных из исследования Stack Overflow. Вы увидите, что табуляция и пробелы не то, чем кажутся. Спойлер: ваша зарплата больше зависит от типа компании и окружения, в котором вы работаете, чем от типа используемых отступов.
Исходные данные
В своей статье Дэвид показывает, что использование пробелов вместо табуляций ассоциируется с более высокой зарплатой, и этот эффект проявляется вне зависимости от уровня опыта. При этом те, кто использует и пробелы, и табуляцию, имеют те же зарплаты, что и те, кто использует табуляцию.
Кроме того, этот эффект якобы не зависит от языка программирования или вашей специализации как разработчика. То же самое можно сказать и о размере компании. Так почему более высокооплачиваемые разработчики предпочитают пробелы? Очевидно, что тут должен быть какой-то искажающий фактор, но я не была уверена, что он был упомянут в исследовании. Я начала проводить собственное расследование, анализируя линейно-регрессионную модель из исходной статьи.
Данные для линейной регрессии
Исходная статья включает в себя линейно-регрессионную модель, прогнозирующую зарплаты на основе нескольких переменных:
- Страна.
- Стаж программирования.
- Использование табуляций и пробелов.
- Специализация разработчика и язык программирования.
- Формальное образование (бакалавр, магистр, кандидат).
- Наличие вклада в 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 и сделала интересный вывод о том, что это связано с более высокой зарплатой, как минимум если вы живёте в США. Вероятно, люди с более высокими зарплатами чаще вносят свой вклад в движение за открытый код? Этот эффект наблюдается во всём диапазоне опыта.
Сторонники open source чаще используют пробелы
Как opensource связан с нашими дебатами относительно пробелов и табуляций? Похоже, участники opensource-движения используют пробелы гораздо чаще других. Среди тех, кто не участвует в opensource, примерно поровну использующих табуляцию и пробелы.
Среди участников opensource «пробельщиков» более чем вдвое больше, чем использующих табуляцию. Это различие также статистически значимо учитывая р-значение 9,1981718×10−24. Та же тенденция наблюдается и в других странах, хотя там сторонники opensource используют табуляцию чуть чаще.
Думаю, теперь мы ближе к потенциальному объяснению причин полученных Дэвидом результатов. Главное преимущество табуляций — возможность настройки их отображения в IDE, а с пробелами получается фиксированный макет. Это означает, что для разных людей один и тот же код с табуляциями будет выглядеть совершенно по-разному. А когда начинают смешивать пробелы и табуляция в одном файле, то это приводит к бардаку. Я думаю, что когда над opensource-проектом работают без принятия единого стиля кода, то возможные проблемы с форматированием заставляют людей использовать пробелы, чтобы код выглядел для всех одинаковым.
Это лишь одна из возможных теорий. Я не оценивала, насколько активно участвуют в opensource сообщества языков, где преимущественно используются пробелы (например, Python или Ruby). Повторюсь, корреляция не предполагает причинности.
Табуляция, пробелы, open source и зарплата: как всё это совместить?
Теперь вопрос: объясняет ли работа в opensource более высокие зарплаты у тех, кто использует пробелы чаще табуляций? Если построить график зарплат на основе данных о вкладе в opensource и виде отступов, то получим более сложную картину, чем в исходной статье, где сравнивались только пробелы и табуляция.
Джуниоры, использующие пробелы и табуляцию, участвующие в opensource, имеют чуть более высокую среднюю зарплату, чем не участвующие «пробельщики». А участвующие в opensource, имеющие стаж более 15 лет и использующие табы, имеют более высокую среднюю зарплату, чем «пробельщики». Кроме того, если у вас стаж меньше 15 лет и используете табуляцию, то участие в opensource не влияет на зарплату. Но если используете пробелы, то при участии в opensource будете получать больше, чем если участвовать не будете. Эти результаты можно воспринимать с определённой долей скепсиса, потому в некоторых группах результаты относительно малы.
В целом какой-то эффект есть, но он не меняет общей картины: «пробельщики» в целом зарабатывают больше, чем те, кто использует табы. Есть ещё что-то, что можно проанализировать?
Исследуем распределения зарплат
В этот момент я была убеждёна, что любые переменные, влияющие на зарплаты «пробельщиков» и тех кто использует табуляцию, не входили в простую регрессионную модель. Я не хотела выполнять мартышкин труд и добавлять все доступные переменные (их более 150, и все категорийные). Я решила проанализировать распределения зарплат для разных видов отступов: имеют ли «пробельщики» в целом более высокие зарплаты, или есть подгруппы «пробельщиков», искажающих результаты?
Я построила график с разными стажами. Ниже показаны плотности распределения зарплат для разработчиков со стажем менее 5 лет, здесь эффект наиболее заметен. Все три распределения имеют основной пик в районе одного уровня зарплаты в районе $65 000—70 000. Этот пик отражает большинство джуниоров, и судя по всему, здесь использование пробелов и табуляций никак не влияет на зарплату.
Любопытно, что распределение зарплат «пробельщиков» является бимодальным (имеет два пика). Большинство получает те же деньги, что и другие разработчики, но есть две подгруппы, преимущественно использующие пробелы и получающие гораздо больше остальных. Чем они отличаются? Я поискала ответ на этот вопрос в результатах исследования. Для этого использовала χ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). Как они влияют на зарплаты?
Пользователи Git зарабатывают больше вне зависимости от опыта. Интересный вывод, который может быть связан с нашим предыдущим исследованием участников opensource. Но куда интереснее, как связано всё вместе: версионирование, табуляция с пробелами и зарплата?
Системы версионирования разрушают шаблон, что высокие зарплаты всегда ассоциируются с использованием пробелов. Компании, использующие Git, платят больше денег вне зависимости от вида отступов, как минимум разработчикам со стажем вплоть до 10 лет! Использующие Git и табы, зарабатывают больше «пробельщиков», использующих TFS, вне зависимости от опыта. В группе пользователей Git «пробельщики» всё ещё имеют более высокие зарплаты. Но в группе TFS ситуация иная: «пробельщики» получают меньше всего.
В других странах картина несколько отличается, но вы всё равно вряд ли захотите быть программистом со стажем 15+ лет, использующим пробелы и TFS.
Также я проанализировала пользователей системы Subversion, в мире она чуть популярнее TFS. Subversion тоже не подтверждает утверждение, что «пробельщики» в целом зарабатывают больше. Пользователи «Git + табуляция» зарабатывают почти столько же, сколько «Subversion + пробелы» и «Git + пробелы и табуляция».
Итог №1: Почему важно версионирование?
Подводя итоги, комбинация факторов «участие в opensource» и «использование системы версионирования» как минимум отчасти влияет на разницу зарплат между пользователями табуляций и пробелов. Это не означает, что вы должны начать использовать Git и вносить вклад в opensource, чтобы вам платили больше (хотя в любом случае это приветствуется!).
Думаю, эти два фактора указывают скорее на разницу окружений и типов компаний, насколько они придерживаются традиционных подходов и используют современные технологии. Более консервативные олдскульные компании, не использующие Git и opensource-код, в целом платят меньше. Тип окружения трудно оценить напрямую из результатов исследования, так что оба этих фактора лишь косвенно наводят на подобные размышления.
Это не конец истории, и я уверена, что есть другие переменные, которые могут пролить свет на ситуацию с пробелами и табуляциями. Также мои выводы в целом основаны на данных о разработчиках из США, здесь эффект наиболее заметен. Ниже я расскажу, почему у меня возникли проблемы с анализом зарплат в других странах.
Почему я анализировала только американцев?
Когда я оценивала распределения зарплат с учётом других факторов, моё внимание привлекла одна вещь, которая для меня непонятна. Данные, с которыми я работала, относились только к профессиональным разработчикам, работающих полный рабочий день. Но есть и большая группа людей с очень низким годовым доходом меньше $3000. К сожалению, само по себе это неудивительно, потому что доходы в разных странах мира различаются очень сильно. Но странным было то, в каких именно странах люди получают такие низкие зарплаты.
Больше всего низкооплачиваемых респондентов было из Индии, что вполне понятно в данном контексте. Средняя зарплата в Индии значительно ниже, чем в других странах ОЭСР. Но после неё идут Польша, Россия и даже Германия. Там, возможно, не гигантские зарплаты, но сильно меньше $3000 в год для разработчика на полную ставку — крайне мало.
Я сам приехала из Чехии, поэтому знаю об особенностях региона и у меня есть предположение, почему такая странная ситуация с данными. Поэтому проверила распределение зарплат в паре стран из Центральной и Восточной Европы, а также сравнила их с распределениями в странах из других частей мира.
В таких странах, как Великобритания, Франция и даже Индия, распределения зарплат имеют один пик. А во всех странах Центральной и Восточной Европы — два пика. Первый соответствует очень низкой зарплате, второй — большой, куда большее соответствующей годовому доходу. Это менее выражено в Германии, более выражено в Польше и гораздо больше — в России. Я проанализировала ещё несколько стран, включая Чехию и Украину, там эта тенденция тоже существует. Во всех странах этого региона бимодальное распределение зарплат. Что там происходит?
Согласно моему опыту, чехи всегда обсуждают зарплаты с точки зрения не годового, а месячного дохода. Я никогда не слышала от чехов, чтобы они говорили о годовом доходе. Мой польский друг подтвердил эту версию — все оперируют только месячными доходами. Похоже, многие респонденты просто невнимательно прочитали вопросы в исследовании и назвали свои месячные доходы, а не годовые, потому что именно этим понятием они оперируют в повседневной жизни.
Можно ли как-то поправить данные? К примеру, создать смешанную модель и умножить низкозарплатную группу на 12. Так мы получим распределение, усечённое слева, но точнее отражающее реальные зарплаты в странах по сравнению с изначальными распределениями. Вот пример Польши:
Итог №2: Ловушки в данных
Главный вывод заключается в том, что к данным всегда нужно относиться внимательно. В результатах исследования есть много искажений, и некоторые из них весьма неожиданные. Если бы я не была знакома с особенностями менталитета, то вероятно предположила бы, что в ряде стран действительно очень много низкооплачиваемых позиций уровня стажёров. Я не уверена, из каких именно стран респонденты называли ежемесячные зарплаты вместо годовых, поэтому ограничился при анализе американской выборкой. Надеюсь, эти данные наиболее консистентны.
К сожалению, люди не всегда корректно отвечают на вопросы исследований, и это очень трудно обнаружить. Возможно, это повлияло и на ситуацию с пробелами и табуляциями. Учитывая реакцию в соцмедиа, кто-то указал использование табуляций, потому что нажимают клавишу Tab, даже хотя табы неявно преобразуются редакторами в пробелы.
Итог №3
Я вполне уверена, что разница в доходах между «пробельщиками» и тему кто использует табы в основном связана с типом компании и рабочим окружением. Окружения, где используется Git и вносится вклад в opensource, больше ассоциируются с более высокими зарплатами и пробелами. Уверена, что есть и другие факторы. Но будьте внимательны: никогда нельзя целиком доверять данным.
В завершение хочу поблагодарить Дэвида за предоставленный им код и Stack Overflow за публикацию данных из исследования. Можете скачать мой код, который я использовала для этого анализа.
Автор: AloneCoder