Как проходит интервью мобильных разработчиков в Тинькофф

Привет! Я Максим Коробов, руководитель отдела разработки мобильного приложения Тинькофф. В статье расскажу о том, как проходит отбор кандидатов на вакансии разработчиков iOS и Android, что спрашивают на первичном и техническом интервью и какие задачи предлагают решать во время практической секции. 

Материал будет полезен разработчикам, которые ищут точки роста, интересуются проектами в крупных компаниях или хотят работать именно в Тинькофф. Если это про вас, не переключайтесь. 

Этапы отбора 

В Тинькофф кандидаты проходят три этапа отбора: два технических интервью и финальный — cultural fit. Вот как они выглядят в таблице: 

Первичная проверка для разработчиков iOS и Android
Первичная проверка для разработчиков iOS и Android

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

Второй этап — 45-минутный технический скрининг с разработчиком из любой команды, во время которого мы проверяем базовые теоретические знания о платформе и языках. 

Третий этап различается для разработчиков iOS и Android. В первом случае это полуторачасовая практическая секция, где вам предлагают решать прикладные программистские задачи. Во втором — классическое собеседование, но с февраля 2022 года планируем переходить на решение задач. 

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

Техническое интервью: что оценивают 

На этом этапе вам нужно показать свои знания и навыки в формате «вопрос-ответ». Вот каких знаний мы ждем от разработчиков iOS: 

  • память;

  • многопоточность;

  • персистентность;

  • Swift — чаще всего, но бывают и олды со знанием Obj-C;

  • UI;

  • паттерны проектирования;

  • архитектура.

А это — для тех, кто работает с Android:

  • базовые компоненты Android;

  • многопоточность;

  • UI. Свои View;

  • Java — возможности языка (Java Core);

  • Kotlin — возможности языка;

  • архитектура;

  • общие вопросы.

Во время технического интервью кандидаты отвечают на вопросы и набирают баллы, а интервьюеры пишут свое заключение и передают его рекрутерам
Во время технического интервью кандидаты отвечают на вопросы и набирают баллы, а интервьюеры пишут свое заключение и передают его рекрутерам

Ответы на вопросы оценивают по семибалльной шкале. В каждом блоке — по три вопроса: простой, средней сложности и на уровне сеньора. За первые два максимум можно заработать по 2 балла, за третий — 3 балла. 

Максимальное количество баллов, которое вы можете набрать в каждом блоке, — 7
Максимальное количество баллов, которое вы можете набрать в каждом блоке, — 7

После этого интервьюер составляет саммари, отправляет его рекрутеру, и тот возвращается с фидбэком к кандидату. 

Практическая стадия iOS: как проходит 

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

Вот так выглядит одна из практических задач для разработчиков iOS
Вот так выглядит одна из практических задач для разработчиков iOS

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

Здесь нужно понимать, что речь идет не об олимпиадных задачах, а о повседневной работе программиста. Например, вам могут предложить кусок кода, в котором есть какая-то проблема, а вы должны найти ее и устранить. На этом этапе важно то, как именно вы рассуждаете и ищете варианты решений. 

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

Финальное интервью: знакомство с командой 

На финальное интервью мы зовем кандидатов, которые прошли технический отбор. На этом этапе остается понять, подходим ли мы друг другу по культуре и задачам, поэтому здесь происходит двусторонняя оценка. Поскольку мы ищем схему win-win, дальше могут быть разные итерации с проектами. 

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

Тайминг: сколько времени занимают этапы

Первичный телефонный разговор длится 20—25 минут, после этого рекрутер сразу присылает приглашение на техническое интервью. Дата и время зависят от пожеланий кандидата, мы готовы проводить второй этап на следующий день. 

Техническое интервью длится до 45 минут, после него интервьюер сразу направляет обратную связь рекрутеру. Если все складывается хорошо, зовем на следующий этап — практическую секцию с задачами. Здесь дата и время также зависят от пожеланий разработчика, а сама секция длится 1,5—2 часа.

Фидбэк по практической части мы получаем за 1—2 часа. Дальше приглашаем на финальное интервью, после которого берем паузу, чтобы обсудить, в какой проект пойдет разработчик. Обычно это занимает один день, но иногда может занять несколько. После этого мы уточняем финальное решение кандидата и начинаем согласовывать оффер. Этот процесс тоже длится до 3 дней. 

В среднем от первичной проверки до оффера проходит 14 календарных дней
В среднем от первичной проверки до оффера проходит 14 календарных дней

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

Например, человек может проходить собеседования по процессу «Оффер на следующий день»: тогда Dev-скрининг и секция задач идут в один день. 

Когда зовем в конкретный проект, то иногда пропускаем этап cultural-fit и делаем оффер после секции задач. 

Как прошел первый One Day Offer в Тинькофф

Компании, в которых отбор состоит из нескольких этапов интервью, все чаще проводят One Day Offer — формат, когда на все этапы отводится один день. Для компании это возможность быстро нанять специалистов, а для кандидата — получить оффер. За один день можно пообщаться с командой, узнать о проектах, пройти технические секции и принять оффер, если работа подойдет по условиям, а задачи — по скиллам.

В прошлом году мы провели One Day Offer для мобайл-разработчиков с опытом от 2 лет. Кандидаты смогли пообщаться с командой Тинькофф, а те из них, кто успешно прошел все этапы отбора, получили оффер в Мобильный банк. 

One Day Offer начался получасовой встречей с участниками, на которой мы рассказали про формат мероприятия, команды Мобильного банка и ответили на вопросы разработчиков. После этого участники отправились на техническое интервью. Оно проходило в 2 раунда по 40 минут. В следующий этап прошли те, кто успешно справился с первым. Второе интервью (кодинг и общение с экспертами) длилось примерно 1,5 часа. Всех участников поделили на три потока, каждый подключался к Zoom в назначенное время. 

После первого One Day Offer в нашу команду пришли 11 классных специалистов. Это был наш первый опыт, и не все прошло гладко: кандидаты прошли все этапы за день, но получили офферы позже. К следующему One Day Offer мы учли ошибки, и проблем с выставлением оффера больше не было. 

Если вы пишете на Swift под iOS или на Kotlin или Java под Android, то ждем вас 19 февраля на новый One Day Offer. В этот раз приглашаем в команды Мобильного банка, Тинькофф Инвестиций, Тинькофф Бизнеса и еще трех проектов. Заявки принимаем до 15 февраля включительно. 


ссылка на оригинал статьи https://habr.com/ru/company/tinkoff/blog/648825/

Как попасть на стажировку по фронтенду в крупную компанию

За свою карьеру в Сбере я провел около 35 интервью со студентами старших курсов, которые пытались попасть на стажировку. Из них мы взяли всего 5 человек.

Почему так получилось?

Не сказал бы, что ребята совсем были непригодны, а скорее наоборот. Полный отказ (не подходит нам и другим) получали примерно 30%. Остальные сортировались по рейтингу, который формировал я сам для личного удобства. Из одной сессии на 10 человек “финалистами” становились 1-2 человека с первых мест, которых брали на стажировку, хотя талантливых и достойных было примерно 7 из 10.

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

Начинаем интервью

Интервью с одним кандидатом занимает примерно 30-40 минут. Это достаточно мало, поэтому я имею четкий план:

  1. Получить общее представление о человеке и его опыте (5 мин)

  2. Знания JavaScript и CSS (20 мин)

  3. Задача (10 мин)

  4. Ответы на вопросы кандидата (5 мин)

Общее представление о человеке

Сначала я прошу человека рассказать немного о себе, буквально пару минут, то что он сам считает нужным.

Обычно со стажера нечего взять: у него нет опыта, нет понимания о процессах работы, что вообще делают программисты в крупных компаниях. И это нормально! Если человек говорит, что сейчас учится на 4 курсе и не имел никакого опыта, то это ок. Такие факты не поставят его ниже того, кто успел где-то подработать, что-то на фрилансе сделать и т.д.

Но. Всегда важно послушать про домашние проекты (туду листы, мессенджеры, чат-боты, дипломные проекты на React и прочее). Чем больше у вас такого опыта, тем лучше!

Я могу спросить про технологии, которые использовались в этих проектах (React, Redux, Vue, TypeScript, Node.js, styled-components, SCSS и т.д). Буквально пару минут, не углубляясь в точные вопросы. Ваша заинтересованность в изучении различных инструментов показывает, что вы выбрали фронтенд-направление осознанно и уже проделали огромную работу над собой, чтобы скрестить инструменты вместе и выдать работающий прототип чего-либо.

Знание языка JavaScript

Это один из самых главных этапов. Не секрет, что JavaScript – это основной инструмент фронтенд-разработчика. Поэтому вы обязаны его знать, а также уметь применять в решении прикладных задач. Попробуем разобрать сейчас какие именно темы нужно знать. Я приведу для примера по несколько вопросов из каждой темы. Сами темы примерно остаются такими же, но вопросы могут меняться, потому что некоторые ребята возвращаются в новый сезон стажировок, если не получилось предыдущий раз.

Тема 1: Общее понимание особенностей языка

☝️ Что будет храниться в следующих переменных?

const var1 = true || false; const var2 = true && false; const var3 = 1 && 2; const var4 = 1 || 2; const var5 = 0 || 1; const var6 = '1' + '2'; const var7 = '1' + 2;
Ответ
console.log(var1); // true console.log(var2); // false console.log(var3); // 2 console.log(var4); // 1 console.log(var5); // 1 console.log(var6); // '12' console.log(var7); // '12'

Тема 2. Переменные и области видимости

☝️ Каким ключевыми словами можно объявить переменные?

Ответ

var, let, const

☝️ В чем различия этих ключевых слов?

Ответ

var:объявляет переменную, инициализация переменной значением является необязательной

let: объявляет локальную переменную, инициализация переменной значением является необязательной.

const: объявляет именованную константу, доступную только для чтения

☝️ Какая область видимости у переменных в js?

Ответ

У var функциональная или глобальная область видимости. У let и const блочная

☝️ Что будет в результате выполнения следующего кода?

var test1 = 2;  function fn1 () {   var test1 = 3;   console.log(test1); }  fn1(); console.log(test1);
Ответ
3 2

Так как у переменной с ключевым словом var блочная или глобальная область видимости, то var test1 = 2 инициализируется в глобальной области видимости, а var test1 = 3 в функции fn1, не перезатирая первую переменную.

☝️ Что будет в результате выполнения следующего кода?

var test1 = 2;  if (true) {   var test1 = 3;   console.log(test1); }  console.log(test1);
Ответ
3 3

Здесь же переменная с ключевым словом var пропускает блочную область видимости, поэтому она переопределяется в блоке if.

☝️ Как сделать так, чтобы переменные из кода выше были изолированны в своей области? В глобальной области осталось 2, а в блоке if было 3?

Ответ

Достаточно просто заменить var на const или let. Тогда переменные будут изолированы в своей области видимости.

const test1 = 2;  if (true) {   const test1 = 3;   console.log(test1); }  console.log(test1);

Тема 3. Контекст

☝️ Что будет в контексте this?

function Person () {   console.log(this); }  const person1 = new Person(); const person2 = Person(); 
Ответ
{} window

В первом console.log() будет выведен пустой объект, потому что конструктор создает новый экземпляр и ссылается на него в this. А в случае вызова без ключевого слова new контекст this будет ссылаться либо на глобальный контекст, либо будет undefined в строгом режиме.

Тема 4. Замыкания

☝️ Что такое замыкание?

Ответ

Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт вам доступ к Scope (en-US) внешней функции из внутренней функции. В JavaScript замыкания создаются каждый раз при создании функции, во время её создания.

https://developer.mozilla.org/ru/docs/Web/JavaScript/Closures

☝️ Допишите функцию так, чтобы можно было получить количество вызовов метода add

function myMath () {   // можно добавлять внутри этой функции что угодно   return {     add: function (a, b) {       return a + b;     }, getNumOfCalls: function() {},   }; }  const math = myMath();  math.add(2, 3); math.add(1, 2); math.add(4, 1);  const numOfCalls = math.getNumOfCalls(); console.log(numOfCalls); // 3
Ответ
function myMath () {   let count = 0;   return {     add: function (a, b) {       count ++;       return a + b;     },     getNumOfCalls: function () {       return count;     },   }; }  const math = myMath();  math.add(2, 3); math.add(1, 2); math.add(4, 1);  const numOfCalls = math.getNumOfCalls();  console.log(numOfCalls); // 3;

Здесь просто создается локальная переменная, которая недоступна снаружи функции myMath.

Тема 5. Event loop

☝️ Что код выведет в консоли?

setTimeout(() => {   console.log('Таймаут'); }, 0);  let p = new Promise((resolve, reject) => {   console.log('Создание промиса');   resolve(); });  p.then(function(){   console.log('Обработка промиса'); });  console.log('Конец скрипта'); 
Ответ
Создание промиса Конец скрипта Обработка промиса Таймаут

CSS

☝️ Какие способы позиционирования знаешь?

Ответ

absolute — указывает, что элемент абсолютно позиционирован, при этом другие элементы отображаются на веб-странице словно абсолютно позиционированного элемента и нет. Положение элемента задается свойствами left, top, right и bottom, также на положение влияет значение свойства position родительского элемента. Так, если у родителя значение position установлено как static или родителя нет, то отсчет координат ведется от края окна браузера. Если у родителя значение position задано как fixed, relative или absolute, то отсчет координат ведется от края родительского элемента.

fixed — по своему действию это значение близко к absolute, но в отличие от него привязывается к указанной свойствами left, top, right и bottom точке на экране и не меняет своего положения при прокрутке веб-страницы.

relative — положение элемента устанавливается относительно его исходного места. Добавление свойств left, top, right и bottom изменяет позицию элемента и сдвигает его в ту или иную сторону от первоначального расположения.

sticky — относительно позиционированный до тех пор, пока содержащий его блок не пересечёт указанный порог (например, установка top в значение, отличное от auto) внутри его корня потока (или в контейнере, в котором он прокручивается), после чего он обрабатывается как «застрявший» до тех пор, пока не встретит противоположный край содержащего его блока

static — элементы отображаются как обычно. Использование свойств left, top, right и bottom не приводит к каким-либо результатам.

inherit — наследует значение родителя.

https://developer.mozilla.org/ru/docs/Web/CSS/position

Задача

Это второй основной этап после знаний языка. Здесь кандидату необходимо решить алгоритмическую задачу с написанием кода решения (желательно на JavaScript).

☝️ Представьте, что в js нет методов сортировки массивов. Попробуйте написать функцию самостоятельно.

function sort(arr) {   // написать код }  const arr = [3, 2, 6, 1, 5]; sort(arr);  console.log(arr); // [1, 2, 3, 5, 6]
Решение
function sort(arr) {   for (let j = arr.length - 1; j > 0; j--) {     for (let i = 0; i < j; i++) {       if (arr[i] > arr[i + 1]) {         [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];       }     }   }   return arr; }  const arr = [3, 2, 6, 1, 5]; sort(arr);  console.log(arr); // [1, 2, 3, 5, 6]

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

Многие на задаче из примера выше вспоминают про пузырьковый метод. Но смысл задания не в знании известных алгоритмов. Можно решить своим любым способом. Здесь оценивается несколько вещей:

  • человек рассказал как должен работать алгоритм по шагам

  • человек написал код алгоритма

  • код запускается и работает

  • человек сам нашел свои ошибки или смог оптимизировать алгоритм

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

Оценка кандидата

На основании всех этих этапов может появиться табличка, которая будет состоять из нескольких полей:

  • Имя

  • Общее понимание особенностей JS (0-10 баллов)

  • Область видимости (0-10 баллов)

  • Контекст (0-10 баллов)

  • Замыкания (0-10 баллов)

  • Event Loop (0-10 баллов)

  • CSS( 0-10 баллов)

  • Задача (0-50 баллов)

  • Общее впечатление

Содержание этой таблички может меняться от серии к серии. Главное, чтобы она будет одна в одной серии собеседований и по ней просто сравниваются кандидаты между собой.

Обратите внимание, что задача имеет примерно такой же вес, как вопросы по JS все вместе. Это не просто так. В компанию нужны не теоретики, не те, кто прочитал очень внимательно книгу по JS, а ребята, которые имеют алгоритмическое мышление и могут применять знания на реальных задачах.

Итог

Подведем небольшой итог! Вы практически со стопроцентной вероятностью пройдете на стажировку, если будете соблюдать следующие советы:

  1. Будьте уверены в себе — не сомневайтесь в себе, говорите уверенно, не производите впечатление будто вы пытаетесь угадать ответ

  2. Изучите как работает JS — прочитайте несколько книг по JavaScript и попробуйте поприменять новые знания на практике

  3. Познакомтесь с основными свойствами CSS — фронтенд разработчик не может существовать без знаний CSS, иначе он будет пытаться все решить через JS. Верстайте больше, делайте компоненты, сетки, изучите для примера как сделан Bootstrap и следуйте принятым стандартам

  4. Научитесь решать алгоритмические задачи — решайте, решайте и решайте больше задач

  5. Расширяйте кругозор — развивайтесь, читайте статьи, эксперементируйте, делайте домашние проекты. Обязательно попробуйте поработать с одной из популярных библиотек (советую React или Vue)

А дальше дело за вами. Стажировка – это отличный шанс начать карьеру сразу в крупной компании. Всем удачи!


ссылка на оригинал статьи https://habr.com/ru/post/648829/

Собеседование по Javascript, мой опыт. Часть первая

“Не люблю темные стекла, сквозь них темное небо.
Дайте мне войти, откройте двери.”

(Виктор Цой)

Введение

Многим из нас время от времени приходиться менять работу и ходить по собеседованиям. На них соискателям задают каверзные вопросы, ответы на которые не всегда связанны непосредственно с кодированием и требуют более детального и глубокого погружения в предметную область. Сложно сказать насколько это необходимо на предлагаемом месте работы, но после некоторых особо запоминающихся собеседований, комичные ситуации описанные в интернете (ссылка) становятся немного грустными. Посетив разные фирмы в качестве соискателя на позицию Javascript разработчика, я решил поделиться ответами на вопросы, которые мне задавались. Статья состоит из двух частей. В первой части речь пойдет о том, как работает Javascript. Во второй части будет список вопросов с ответом на каждый из них.

Как работает Javascript

Кто-то так сразу и спрашивал: «Как работает Javascript?». Но были и те кто заходил издалека и с помощью наводящих вопросов пытались вытянуть из меня эту информацию. Список вопросов, которые мне задавали:

  • Что такое асинхронность в Javascript?

  • Что такое event loop?

  • Что такое контекст выполнения?

  • Что такое стек вызовов?

  • Что такое JavaScript AST?

Ответы на эти вопросы требуют понимания того, как работает Javascript, что он из себя представляет и как он взаимодействует с окружением. Свою популярность он обрёл благодаря Web браузерам, которые выбрали его в качестве языка сценариев, позволяющих гибко взаимодействовать с пользователем. Javascript – это высокоуровневый язык программирования и для работы с ним у каждого браузера есть специальный JavaScript engine, точнее ECMAScript engine. На данный момент самыми популярными ECMAScript engine являются следующие:

  • Chakra, Microsoft IE/Edge

  • SpiderMonkey, FireFox

  • V8, Chrome

Движки (engine) которые работают с Javascript преобразовывают его в байт код, который потом непосредственно исполняется. Преобразование оригинального кода в byte code “движком” V8 от Chrome выполняется по следующей схеме:

  1. Первым шагом, парсер проводит лексический и синтаксический анализ кода. На выходе получается Абстрактное синтаксическое дерево (AST) (ссылка). В AST Explorer можно посмотреть, как выглядит это дерево. Стоит отметить такие узлы дерева как FunctionDeclaration и VariableDeclaration в них хранятся объявления функций и переменных. Парсеры исходного кода в AST могут быть от разных производителей. Ниже список самых популярных среди них:

    1. babel-parser

    2. espree

    3. acorn

    4. esprima

    5. cherow

  2. Interpreter на вход получает AST и строит Byte code, при этом вызывая Profiler. Пока работает Profiler, V8 engine исполняет байт код.

  3. Profiler в это время проводит оптимизацию кода и передаёт оптимизированный код Compiler’у

  4. Compiler создает оптимизированный byte code.

  5. Временный byte code заменяется оптимизированным.

Далее написанный код начинает исполняться. Код, написанный на Javascript, выполняется синхронно – одна команда в один момент времени. Код работает в браузере, в котором множество процессов работают параллельно и для взаимодействия с этими процессами придумали следующее:

  1. Для каждой html страницы в браузере Javascript выполняется в своем отдельном потоке (Main Thread).

  2. Содержимое тега <script>…</script> или содержимое файла переданного в свойстве тега <script src=”file.js”>…</script> начнёт исполняться сразу после загрузки документа в браузер.

  3. Для того чтобы взаимодействовать с Web формой в HTML можно назначить функцию обработки на какое-либо событие:

    1. В HTML: onclick = ‘myFunc()’

    2. В Javascript: element.addEventListener(«click», myFunc(), false);

  4. Для взаимодействия с другими процессами браузера существует набор интерфейсов Web API (ссылка). При вызове функций этих интерфейсов нужно обязательно в качестве параметра передать функцию обратного вызова (callback function), которой будет передано управление после того, как Web API функция отработает. Эти интерфейсы не ограниченны одним потоком и могут работать параллельно. Кстати, setTimeout() так же является частью Web API.

Далее при наступлении события или по окончанию работы функции Web API, функции обработки события и функции обратного вызова попадают в очередь — Task Queue. Откуда их извлекает и передаёт на исполнение Event Loop. Кроме Task Queue есть ещё:

  • Render Queue, которая отслеживает все изменения DOM модели. На данный момент раз в 16.6 мс. (при 60FPS) происходит перерисовка Web страницы и обновляются все связанные с ней элементы DOM.

  • Microtask Queue, которая выполняет код на Javascript, в функциях Promise.prototype.then() и Promise.prototype.catch(), а так же код который выполнится внутри async функций после выполнения таски с ключевым словом await. Микротаски выполняются сразу после завершения Таски, c которой они связанны. Таким образом это не совсем отдельная очередь. Просто это некий довесок к таске, который должен выполнится сразу после неё. Сюда так же входит код, который выполниться сразу после await, в функции с ключевым словом async.

Event Loop работает с очередями в следующем приоритете:

  1. Render Queue

  2. Task Queue (или Callback Queue, Macrotask Queue, Event Queue)

  3. После каждой выполненной Таски выполняются связанные с ней Микротаски

В различных Web browser’ах могут быть свои особенности реализации Event Loop, но суть и принцип его работы в общем похожи.

В Node.js концепт тот же – внешняя функция выполняется параллельно и возвращает результат своей работы в callback функцию, которая будет вызвана в порядке очереди, но есть отличия. Вместо Web API используется библиотека libuv и Node API. DOM, HTML и Render Queue отсутствуют, а callback функции имеют свой приоритет обработки. Сам Event Loop реализован на функциях библиотеки libuv. Так же она используется для взаимодействия с операционной системой, на которой развернут сервер Node.js.

Согласно документации, Event Loop в Node.js выполняет 6 операций в определенном порядке.

  1. timers: в этой фазе выполняются callback функции от функций setTimeout() и setInterval().

  2. pending callbacks: выполняются callback функции от системных операций. Как я понял, обработчики ошибок TCP скорее всего будут здесь.

  3. idle, prepare: выполняется внутренний код Event Loop

  4. poll: на этом шаге выполняется много всего, но для Event Loop важно то, что здесь выполняются callback функции, кроме тех, что в pending callbacks и close callbacks.

  5. check: выполняются callback функции от setImmediate()

  6. close callbacks: callback функции закрывающие различные соединения (socket.on(‘close’, …) и т.п.).

Помимо операций выше, существуют callback функции от process.nextTick(), которые выполняются сразу после завершения текущей таски. Так же код, который содержится в Promise.prototype.then() и Promise.prototype.catch() и в функции async после await, будет выполнятся сразу после таски которая связанна с этим кодом (Microtasks).

Все эти 6 шагов можно найти в коде libuv. Задача libuv поддерживать асинхронный ввод/вывод, основанный на цикле событий. Причем сделать так, чтобы это все могло работать под различными операционными системами.  Отсюда появляется шаг “pending callbacks” и “idle, prepare”, которые появились благодаря нюансам работы операционных систем. Эти 2 шага находятся между Timers и Poll. Получается, что прежде, чем вызвать обычные callback функции сначала вызываются системные, потом небольшая задержка и только потом остальные. Для упрощения схемы можно объединить «pending callbacks», «idle, prepare» и «poll» в один большой шаг, в котором вызываются callback функции. В итоге получается следующая схема:

Заключение:

Надеюсь, что после описания того, как это работает ответить на вопросы будет не так сложно. Итак, краткие ответы на вопросы, которые были озвучены вначале:

  • Что такое асинхронность в Javascript?

    Callback функции и механизм работы с ними в Javascript. (ссылка)

  • Что такое event loop?

    Event loop — это бесконечный цикл в котором движок JavaScript ожидает задачи и исполняет их. (ссылка)

  • Что такое контекст выполнения?

    Контекст выполнения – специальная внутренняя структура данных, которая содержит информацию о вызове функции и включает в себя:

    • конкретное место в коде, на котором находится интерпретатор;

    • локальные переменные функции;

    • значение this;

    • прочую служебную информацию. (ссылка)

  • Что такое стек вызовов?

    стек вызовов — это структура данных, которая используется для хранения контекстов выполнения, создаваемых в ходе работы кода. Стек выполнения действует по принципу “первым вошел последним вышел”. (ссылка)

  • Что такое JavaScript AST?

    AST (Абстрактное синтаксическое дерево) — древовидное представление исходного кода. (ссылка)

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

P.S.

Не стоит забывать и про «глупые вопросы», которые вам могут задать на собеседовании (ссылка). Порой они не такие уж и глупые (ссылка). В этом плане мне очень понравился анекдот:

После лекции для HR-специалистов одна из слушательниц спрашивает у докладчика:
— Собеседования отнимают очень много времени. Скажите, как можно максимально быстро определить, что за человек перед тобой — идиот или нормальный?
— Конечно. Задайте ему какой-нибудь простейший вопрос. Например: «Известно, что Кук совершил три путешествия, во время одного их них он погиб. Во время какого именно?»
— А можно какой-нибудь другой пример? А то у меня в школе было плохо с географией. (
ссылка)

Ссылки:

https://habr.com/ru/post/439564/

https://astexplorer.net/

https://habr.com/ru/post/439564/

https://blog.bitsrc.io/javascript-under-the-hood-632ccae06b27

https://nuancesprog.ru/p/4553/

https://blog.bitsrc.io/javascript-under-the-hood-632ccae06b27

https://dev-gang.ru/article/kak-rabotaet-javascript-pod-kapotom-dvizhka-v-5ew7muxdnq/

https://medium.com/nuances-of-programming/%D0%BA%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-javascript-cdbef3f20a66

https://medium.com/@deedee8/event-loop-cycle-in-node-js-bc9dd0f2834f

https://aldizhupani.medium.com/javascript-async-await-microtask-queue-explained-9844f010bb0f

http://imnotgenius.com/21-sobytijnyj-tsikl-biblioteka-libuv/

http://docs.libuv.org/en/v1.x/design.html

https://russianblogs.com/article/51951362749/

https://habr.com/ru/post/336498/

https://snyk.io/blog/nodejs-how-even-quick-async-functions-can-block-the-event-loop-starve-io/

https://habr.com/ru/post/479062/

https://nexocode.com/blog/posts/behind-nodejs-event-loop/

https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

https://developer.mozilla.org/ru/docs/Web/API

https://javascript.info/event-loop

https://habr.com/ru/company/hh/blog/517594/

https://hackernoon.com/is-javascript-a-single-threaded-language-w6v3ujb

https://bool.dev/blog/detail/obyasnenie-event-loop-v-javascript-s-pomoshchyu-vizualizatsii

https://developer.mozilla.org/ru/docs/Web/API/window/requestAnimationFrame

 https://frarizzi.science/journal/web-engineering/browser-rendering-queue-in-depth

 https://habr.com/ru/post/461401/


ссылка на оригинал статьи https://habr.com/ru/post/646847/

Дефицит экспертов в R&D, упор на узкие специализации: тренды рынка труда и новое исследование

Уже несколько лет подряд мы в Hays проводим исследования рынка труда и формируем отчёты, где смотрим на основные тренды по разным отраслям. Спрашиваем о том, что волнует всех: зарплаты, перспективы, условия труда и мотивация. Результаты этих исследований позволяют увидеть свою сферу со стороны и понять, куда движется индустрия.

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

Каким был 2021-й? Мы проводим опрос среди айтишников. Но к нему позже, а пока — немного фактов из жизни IT-индустрии в 2020 году (для наглядности добавим несколько сравнений с 2019-м). Приведённые ниже данные были получены на основании опроса 7 865 человек, из них 958 говорили от имени компаний-работодателей на территории РФ.

Кстати, в итоги обоих исследований мы включили обзор зарплат по отраслям. Найти данные по своей сфере и сравнить зарплаты можно здесь — за 2019 год — и здесь — за 2020-й.

С одной стороны, в IT бум, но при этом…

В 2020-м в два раза сократилось число тех, у кого доход остался неизменным

Ранее почти 50 % опрошенных айтишников заявляли о том, что довольны уровнем своих доходов. С одной стороны, доходы росли примерно одинаково: об этом сообщали 59 и 61 % опрошенных, но с другой — почти в два раза уменьшилось число респондентов с неизменным доходом (с 35 до 17 %), и в 3,5 раза увеличилось число тех, у кого сократился доход (с 6 до 22 %). Такие изменения могут быть связаны с сокращением/невыплатой бонусов из-за пандемии, а также волной сокращений, затронувшей другие индустрии, в штате которых есть сотрудники IT-специализаций.

Айтишников ценят всё больше, и по уровню удержания они догоняют топ-менеджмент и сейлзов

В топе удерживаемых сотрудников айтишники неизменно находятся лишь на третьем месте после высшего менеджмента и продажников — 17 %. С течением времени эта цифра увеличилась и составила уже 26 %, но обогнать топов и сейлзов айтишникам пока не удалось.

Для 10 % IT-специальностей нет профильного обучения

Около 55 % опрошенных айтишников сообщали, что работают в соответствии с первым образованием, для 26 % IT — работа не по профилю полученного образования, ещё 10 % заявили, что для их профессии образования не существует. В целом растут требования к экспертности ответственных сотрудников и тех, кто тесно коммуницирует с клиентами: продактам, сейлзам.

Айтишников продолжают сокращать, но найм растёт

Ранее 28 % опрошенных айтишников хотели развиваться в своём направлении, но 59 % были готовы рассмотреть работу в другой индустрии, если поступит такое предложение.

А вот данные, над которыми интересно подумать: о сокращениях сообщают только 3 % айтишников-сотрудников, а вот IT-работодатели заявили о масштабных (более 11 % штата) сокращениях. Возможно, это связано с изменением формы найма.

«Слава роботам!», рост зарплат в сфере работы с данными и уход от full stack

По итогам 2020-го в русскоязычном IT-сегменте на пике популярности следующие направления: аналитика, разработка, research and development (R&D).

В соответствии с тенденциями последних лет средний уровень дохода специалистов в области управления данными увеличился примерно на 10 %. В требованиях к Data Scientist всё чаще встречаются знание Python, прикладной опыт работы с Hadoop, Hive и Spark, владение ETL-инструментами, знание SQL.

На рынке разработки зарплаты выросли не более чем на 5–10 %, сохранялся высокий спрос на backend- и frontend-разработчиков, а самые востребованные — Java-разработчики, особенно в финтехе. В лидерах также Python: его считают лучшим в сферах машинного обучения, искусственного интеллекта и анализа данных. Наиболее популярными в автоматизации тестирования считаются всё те же Java и Python, сразу за ними — JS. Fullstack-разработчиков искали единичные компании. А вот на разработчиков для iOS и Android спрос остаётся стабильно высоким.

Развитие виртуализации, увеличение автоматизации и CI/CD-процессов обеспечило стабильный спрос на DevOps-инженеров.

Ещё одна перспективная сфера R&D — искусственный интеллект и Robotics. Здесь выросли требования к экспертным знаниям сразу по нескольким языкам программирования (акцент на Python и C++). Всё более востребованы специалисты с уверенными знаниями в Computer Vision, Deep Learning, Embedded Development (C/C++). Компании активно ищут продакт-менеджеров для работы в этих направлениях.

Меньше криптовалют, больше e-commerce и государственных компаний

Если ранее модной была тема выгорания (с этим явлением столкнулись две трети опрошенных работодателей), то с началом пандемии акцент резко сместился. Стали актуальны вопросы организации работы в remote-режиме, и не все успели адаптироваться к новым реалиям в 2020-м.

Замедлился рост компаний, занимающихся криптовалютой, при этом зафиксирован стремительный скачок в развитии е-commerce. С каждым годом увеличивается и количество IT-проектов среди государственных заказов. С децентрализацией рабочей силы выросли потребности в системах информационной безопасности и бюджеты на покупку таких решений.

Рынок труда остаётся кандидатским, и компании охотятся за соискателями намного больше, чем соискатели за компаниями. Работодателям приходится существенно увеличивать уровень оплаты, уделять больше внимания развитию своего HR-бренда, искать новые способы мотивации сотрудников. Уже сейчас превалирует практика удержания с помощью финансов, но, как показывают опросы, для кандидатов важны и возможности развития карьеры, и интересные проекты.

TLDR

Что же 2020-й принёс айтишникам?

  • Число тех, у кого доход остался неизменным, упало в два раза (с 35 до 17 %), а потеряли в доходе в 3,5 раза больше айтишников (с 6 до 22 %). При этом зарплаты в индустрии в целом стабильно растут.

  • Айтишников стали удерживать больше, но высший менеджмент и сейлзы по-прежнему в лидерах этого топа.

  • IT-работодатели заявили о скачке сокращений: до 11 % штата.

  • Рынок труда остался кандидатским: компании охотились за соискателями намного больше, чем соискатели за компаниями.

  • Выросло количество государственных IT-проектов.

  • С переходом на удалёнку вырос спрос на системы информационной безопасности и DevOps-инженеров.

  • В русскоязычном IT-сегменте на пике популярности следующие направления: аналитика, разработка, research and development.

  • В R&D вырос запрос на экспертные знания в Computer Vision, Deep Learning, Embedded Development (C/C++).

  • Популярные языки разработки — Java и Python, для automation testing ещё и JS.

  • Fullstack-разработчиков искали единичные компании.

  • Стабильно высоким оставался спрос на мобильных разработчиков.

Тренды 2021–2022 годов: приглашаем принять участие в опросе

Мы приглашаем принять участие в опросе по итогам ушедшего 2021-го. Возьмите чашку вкусного кофе — и/или любимого кота 🙂 — и пройдите по ссылке. Опрос займёт приблизительно 15–20 минут. Итоговый отчёт с результатами исследования IT-рынка мы пришлём на почту. Чем больше айтишников примет участие, тем показательнее будет результат. Карьерных успехов!


ссылка на оригинал статьи https://habr.com/ru/company/hays/blog/648377/

Как отличить эмоциональное выгорание от более тяжелых расстройств?

Про эмоциональное выгорание трубят на каждом шагу, и про него знает, особенно в сфере ИТ, фактически каждый. Но могут возникнуть закономерные вопросы: а когда эмоциональное выгорание переходит в более тяжелые состояния? Как разграничить эмоциональное выгорание и пограничные психические расстройства?

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

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

Эмоциональное выгорание в МКБ-10 (международная классификация болезней десятого пересмотра), проходит под литерой Z73.0 и обозначается как переутомление. А на википедии дается следующее определение: эмоциональное выгорание — понимается, как состояние физического и психического истощения, возникшее в ответ на эмоциональное перенапряжение при работе с людьми. Ему особенно подвержены люди, чья трудовая деятельность связана с регулярным общением с другими людьми, эмоциональными сопереживаниями, большой ответственностью, трудящиеся с профессией типа «человек — человек», так как именно они подвержены постоянному взаимодействию и общению с людьми. Выгорание также понимается как профессиональный кризис, связанный не только с межличностными отношениями, но и с работой в целом.

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

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

Для описания тревожно-депрессивного расстройства возьмем выдержку из МКБ-10, где сконцентрированы самые важные для этого состояния диагностические указания: «…Более важную, чем при других расстройствах, роль в риске возникновения и формирования проявлений адаптационных расстройств играет индивидуальная предрасположенность или уязвимость, но тем не менее считается, что состояние не возникло бы без стрессового фактора. Проявления различны и включают депрессивное настроение, тревогу, беспокойство (или их смешение); чувство неспособности  справляться, планировать или продолжать оставаться в настоящей ситуации; а также некоторую степень снижения продуктивности в ежедневных делах».

Приведенное выше описание фактически является «хардкорной» версией  того, что принято обозначать как эмоциональное выгорание.

Как отличить обычное эмоциональное выгорание от более тяжелого расстройства?

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

Итак, если есть:

  • депрессивное настроение (грусть, возведенная в квадрат и преследующая перманентно);

  • тревога, беспокойство (вплоть до не возможности сосредоточиться на простейших задачах);

  • чувство неспособности  справляться, планировать или продолжать оставаться в настоящей ситуации;

  • снижения продуктивности в ежедневных делах (то, что ранее занимало две минуты, сейчас требует целый час);

  • нарушение ночного сна (нет сна совсем, либо он поверхностный, а просыпаясь нет чувства восстановления);

  • нарушение аппетита (тут может все колебаться в разные стороны, от полного отсутствия аппетита, до постоянного чувства голода);

  • раздражительность и агрессивность (готовы вспыхнуть по малозначительному поводу, при этом присутствует четкое понимание, что ваша реакция не соответствует ситуации).

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

 Если заподозрили у себя подобные состояния, тогда можно пройти простой тест: Hospital Anxiety and Depression Scale (HADS). По факту его прохождения возможно оценить степень выраженности тревожной и депрессивной симптоматики, главное проходить его максимально честно отвечая на поставленные вопросы.

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

Поход к врачу. Что будет происходить?

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

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

Инструментальное обследование должно начинаться со стандартных анализов крови, которые каждый может сдать как по месту жительства, так и в различных частных лабораториях, и рутинных обследований. Туда должны быть включены: — Общий анализ крови с лейкоцитарной формулой и СОЭ.

  • Биохимический анализ крови (АЛТ, АСТ, креатинин, мочевина, ГГТП, биллирубин общий, ТТГ, Т3, Т4, общий белок, глюкоза, холестерин общий, С-реактивный белок, Альфа-амилаза, 25­OH витамин D).

  • Общий анализ мочи.

  • ЭКГ.

  • Идеально, если удается провести самостоятельный мониторинг в течении двух-трех дней артериального давления (утро, обед, вечер).

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

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

Приведу небольшой список расстройств, вызывающих подобные состояния

  • Прежде всего это заболевания щитовидной железы (для этого скринингово смотрим гормоны: ТТГ, Т3, Т4. Есть отклонения — тогда УЗИ щитовидной железы и с результатами нужно на прием к эндокринологу).

  • Различные анемии: данные состояния будут видны по результату общего анализа крови. Есть отклонения, тогда направляемся к терапевту, который при более серьезных состояниях отправляет к гематологу.

  • Заболевания печени: видно по отклонению АЛТ, АСТ, биллирубина.

  • Заболевания почек: так же, выражаются в усталости, тревожности, снижении настроения. Смотрим креатинин, мочевину в биохимическом анализе крови и результаты общего анализа мочи.

  • -Артериальная гипертензия: периодическое повышение артериального давления, так же может приводить к формированию схожей симптоматики.

Подходы к лечению

Если исключены все соматические проблемы, тогда остается два основных инструмента для работы. Это психотерапия и психофармакотерапия.

Основой выхода из подобных состояний является психофармакотерапия. Как правило для лечения применяют антидепрессанты, транквилизаторы и нейролептики. Кратко обозначу какие препараты могут применяться для лечения по группам.

Антидепрессанты: могут использоваться селективные ингибиторы обратного захвата серотонина (СИОЗС) и селективные ингибиторы обратного захвата серотонина и норадреналина. Сюда включаются такие препараты как эсциталопрам, сертралин, пароксетин, венлафаксин.

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

Нейролептики: как правило применяются атипичные нейролептики такие как кветиапин. Либо типичные, но с мягким действием, такие как хлорпротиксен.

Важно! Применение любого из выше описанных препаратов возможно только после консультации с врачом. Психотерапия, в свою очередь, подбирается индивидуально. Наиболее часто используется когнитивно-поведенческая психотерапия.

Профилактика

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

Из чего состоит: здоровый сон — как основа всего. Только во сне мы восстанавливаемся.

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

Ограничение поступающей информации — мы не приспособлены к такому потоку информации, который ежедневно обрабатывает среднестатистический человек в настоящее время.

Физическая активность — должна быть достаточной именно для вас.

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

Вывод

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

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

С уважением к сообществу, врач-психиатр Михаил Стрельченко.


ссылка на оригинал статьи https://habr.com/ru/post/648831/