Блог Андрея

 
 

Пример анализа спроса на фреймвёрки на сайте moikrug.ru

Вы узнаете, какой бэкенд и фронтенд фреймвёрк был наиболее востребован в вакансиях, размещённых на сайте МойКруг 11 октября 2019-ого года, а при желании обзаведётесь скриптом, который поможет вам собрать аналогичную статистику в тот день, когда вы зададитесь вопросом, какой фреймвёрк выбрать.

Web-программист сейчас очень «модная» специальность. Хорошие зарплаты, новые технологии, чуть ли не навязчивая реклама курсов от GeekBrains, Html Academy - всё это притягивает людей. Однако, изучив язык программирования вы довольно скоро поймёте, что вам необходим ещё какой-то фреймвёрк. Кто-то понимает преимущества фреймвёрков, кого-то просто интересует более высокая зарплата. Более того, программист не умеющий работать ни с одим из фреймвёрков становится менее востребован на рынке труда.

И вот вы изучили php и (или) javascript, попробовали пройти собеседование в одну компанию, а там Yii (или Vue.js), попробовали пройти собеседование в другую компанию, а там Symfony и (или) React.js, в третьей вас ждёт какой-нибудь Phalcon или Angular.

Хорошо, если в одной из компаний вам скажут: «Подтяните знания по Yii Framework 2 и мы ждём вас на собеседование через пол-года», но эта ситуация кажется не особенно реальной.

Начинающий соискатель работы неизбежно задастся вопросом, какой же фреймвёрк всё-таки стоит изучать.

Можно загуглить этот вопрос в Яндексе :), что вы и сделали, иначе не оказались бы на этой странице. Но скорее всего ещё раньше вы оказались бы на Хабре, и там вы можете прочесть статью, в которой приводится результат анализа количества проектов использующих тот или иной фреймвёрк на github (по данным на октябрь 2019-ого года лидирует Laravel и грозится вытеснить всех остальных, так что если вы вообще нуб, стоит навалиться на него).

Но меня в аналогичной ситуации гораздо больше заинтересовала статистика сайта с вакансиями на сайте мой круг. Я написал простенький юзерскрипт, который подсчитывает число вакансий с каждым из фреймвёрков на странице. Скрипт может учитывать Symfony, Yii, Phalcon, Kohana, Codeigniter, Vue.js, React.js, Laravel, Angular, но я учитывал для бэкенда Laravel и Symfony, а для фроненда Vue.js, и React.js. Со всем, кроме React.js я хоть немного, да работал и решил теперь изучить более углубленно. Дело за малым, выбрать, во что именно углубляться.

Я разлогинился на моем круге, чтобы список вакансий не зависел от указанных мной в портфолио навыков, выбрал фильтры «Фронтенд», «Бэкенд», «Указана зарплата», «Удалённая работа».

Затем запустил свой скрипт на каждой из 8-ми страниц (было бы круто доработать скрипт, чтобы он сам делал полный анализ, но так как я пока не собираюсь проводить подобный анализ ежедневно, я исходил из минимума затрачиваемого времени).

01

Laravel: 1, 100 000 р.	
Symfony: 3, 83 333 р.
Vue.js: 4, 90 000 р.
React.js: 4, 68 375 р.

02

Laravel: 1, 70 000 р.		
Vue.js: 3, 210 000 р.
React.js: 4, 93 750 р.
Symfony: 7, 120 000 р	

03
Symfony: 3, 110 433 р.	
Vue.js: 3, 93 333 р.
React.js: 3, 24 266 р.
Laravel: 3, 130 000 р.        

04
Symfony: 2, 95 000 р.       
Laravel: 2, 35 000 р.          
Vue.js: 3, 110 000 р.
React.js: 5, 75 400 р.

05
Symfony: 1, 30 000 р.        
Vue.js: 2, 95 000 р.
Laravel: 2, 75 000 р.           
React.js: 4, 38 500 р.

06
Symfony: 1, 200 000 р.	
Laravel: 3, 50 000 р.		
Vue.js: 4, 87 500 р.
React.js: 4, 87 500 р


07

Symfony: 1, 200 000 р.
Laravel: 1, 200 000 р. 
Vue.js: 3, 73 600 р.
React.js: 8, 104 687 р

На восьмой странице вакансий требующих Laravel или Symfony не оказалось.

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

По этим критериям Symfony набрал 5 баллов, против одного у Laravel.

Посчитав общее число вакансий, я обнаружил, что знание Symfony требуется в 18 вакансиях, а знание Laravel в 13 вакансиях (иногда это были одни и те же вакансии, пока мне кажется что это ни на что не влияет).

Посчитав среднюю зарплату для всех страниц я получил 91 252 для Symfony и 87 142 для Laravel, что говорит о том, что Symfony в плане дохода также может быть лучше.

Итак, по моим данным, Symfony оказался наиболее востребован у работодателей в октябре 2019-ого года.

Выполнив тот же расчёт для фреймвёрков фронтенда я получил равное количество баллов (по 5).

По общему количеству вакансий React.js значительно опередил Vue.js (22 вакансии для Vue.js и 32 вакансии для React.js).

Посчитав среднюю зарплату для всех страниц я получил 108 490 для Vue.js и 70 354 для React.js.

То есть вакансий на Vue меньше, а платят там больше.

Код юзерскрипт для статистики:

// ==UserScript==
// @name        MoiKrugStat
// @namespace   https://moikrug.ru/*
// @include     https://moikrug.ru/*
// @version     1
// @grant       none
// @description Подсчитывает для каждой страницы сайта moikrug.ru количество вакансий требующих знания популярных фреймвёрков. Установите этот скрипт, пройдите на страницу вакансий и когда загрузка страницы будет завершена нажмите Ctrl+C. Вы увидете отчёт популярности фреймвёрков в проектах с вакансиями и среднюю предлагаемую зарплату. В случае, если зарпплата указана в формате "от... до...", учитывается значение "от".
// ==/UserScript==

function onLoad() {
  
  window.targets = {
    'Symfony':{count:0, pays:[]},
    'Yii':{count:0, pays:[]},
    'Vue.js':{count:0, pays:[]},
    'React.js':{count:0, pays:[]},
    'Laravel':{count:0, pays:[]},
    'Angular':{count:0, pays:[]},
    'Phalcon':{count:0, pays:[]},
    'Kohana':{count:0, pays:[]},
    'Codeigniter':{count:0, pays:[]},
    'MySQL':{count:0, pays:[]},
    'PostgreSQL': {count:0, pays:[]}
  };
  
  var body = document.getElementsByTagName('body')[0];
  body.addEventListener('keyup', onKeyUp, false);
  //alert('Aga');
}

function showStat() {
  var ls = document.getElementsByClassName('skill'), i, item, title, j, a, pay;
  for (i = 0; i < ls.length; i++) {
    item = ls[i];
    if (item.tagName == 'A') {
      title = item.innerHTML;
      for (j in window.targets) {
        if (~title.indexOf(j)) {
          pay = grabPay(item);
          window.targets[j].count++;
          window.targets[j].pays.push(pay);
        }
      }
    }
  }
  console.log( window.targets );
  
  //sort
  var aBuf = [], o;
  for (j in window.targets) {
    o = new Object();
    o.name = j;
    o.count  = window.targets[j].count;
    o.pay = avg(window.targets[j].pays);
    aBuf.push(o);
  }
  
  aBuf = aBuf.sort( (oI, oJ) => {
    if (oI.count < oJ.count) {
      return -1;
    }
    if (oI.count > oJ.count) {
      return 1;
    }
    if (oI.count == oJ.count) {
      return 0;
    }
    
  } );
  
  console.log(aBuf);
  
  //generate report
  
  var a = [];
  
  for (j = 0; j < aBuf.length; j++) {
    a.push(aBuf[j].name + ': ' + aBuf[j].count + ', ' + money(aBuf[j].pay) + ' р.');
  }
  alert(a.join('
'));
}


function avg(aInt) {
  var i, price = 0;
  for (i = 0; i < aInt.length; i++) {
    price += parseInt(aInt[i]);
  }
  return parseInt(price / aInt.length);
}


function grabPay(el) {
  var raw = '0', allow = '0123456789', s = '', i, ch, a, j, from, to;
  try {
  	raw = el.parentNode.parentNode.getElementsByClassName('salary')[0].innerText.toLowerCase();
  } catch(e) {
    console.log(e);
  }
  
  if (~raw.indexOf('до')) {
    a = raw.split('до');
    from = extractNumsFromString(a[0]);
    to = extractNumsFromString(a[1]);
    
    if (!isNaN(from)) {
      raw = String(from);
    } else {
      raw = String(to);
    }
  }
  
  
  return extractNumsFromString(raw);
}


function extractNumsFromString(raw) {
  var allow = '0123456789', s = '', i, ch;
  for (i = 0; i < raw.length; i++) {
    ch = raw.charAt(i);
    if (~allow.indexOf(ch)) {
        s += ch;
    }
  }
  return parseInt(s);
}

/**
	 * @description Remove all no numbers chars  
	*/
	function nums(s){
		s = s.replace(/[D]/mig, '');
		return s;
	}

/**
	 * @description Splits a long number of three characters. For example argument 1000000 return '1 000 000'
	*/
function money(s){
  s = String(s);
  var i, a = [], j = 0;
  s = nums(s);
  for (i = s.length - 1; i > -1 ; i--, j++) {
    if (j > 0 && (j % 3) ==  0) {
      a.push(' ');
    }
    a.push(s.charAt(i));
  }
  s = a.reverse().join('');
  return s;
}


function onKeyUp(evt) {
  console.log(evt);
  if (evt.ctrlKey == true && evt.keyCode == 67) {
    showStat();
  }
}

window.onload = onLoad;

Установить скрипт в браузер можно аналогично любому другому userscript, например можете прочитать про установку моего скрипта TrollKiller.

Понятное дело, вместо ссылки «Страница установки TrollKiller» надо перейти по ссылке Страница установки MoiKrugStat

В заключении хочется напомнить, что есть ложь, есть наглая ложь, а есть статистика.