Русский
Русский
English
Статистика
Реклама

Вопросы на собеседовании

Небезопасный сервис про безопасность

02.06.2021 10:16:01 | Автор: admin

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

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

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

Продукт включал в себя приложения Android/iOS, фронт и бэк. Я писала мобилки, двое моих коллег занимались фронтом и бэком соответственно.

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

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

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

Согласовав с заказчиком маневр, мы очистили базу. Началась пресс-конференция, а вместе с ней начали появляться первые регистрации.

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

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

Выстрелили два фактора - целочисленный id у пользователей и вечный токен, который генерировался однозначно из этого id.

Поясню подробнее на примере.

Вася создал учетную запись. База данных присвоила Васе id под номером 1, сервер взял этот id, сгенерировал из него токен и отдал Васе. Вася сохранил токен и ходит с ним на сервер за приватными данными. Теперь мы очистили базу. Аккаунта Васи больше не существует, но токен на его устройстве всё ещё хранится. В сервисе регистрируется первый новый пользователь Аня. База теперь уже Ане выдает id под номером 1, сервер генерирует из этого id такой же токен. В результате у Васи хранится токен Ани, и Вася может делать запросы от имени ничего не подозревающей Ани.

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

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

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

Подробнее..

Задачи с собеседований (front-end) часть 2

22.06.2020 14:22:01 | Автор: admin
С момента выхода моей предыдущей статьи о вопросах на собеседованиях Задачи с собеседований (front-end) прошло практически два года.
Но так сложилось, что я снова вышла на тропу войны собеседований, что дало благодатный материал для нового списка вопросов.
Этот виток собеседований ознаменовался большим обилием алгоритмических задач. Сложно сказать тенденция ли это, или это мне так повезло.
Когда вся страна уже вышла на работу, а программисты, как избранные, продолжают работать из дома, еще не поздно найти какую-нибудь вторую работу.




Задача: Написать полифилл для Promise.

Целесообразность такого вопроса вызывает вопросы, даже если нужно поддерживать пресловутый IE 11 (процент использования которого на момент написания статьи колеблется где-то в районе 0.5% 1.5% по разным статистическим данным), то есть куча готовых полифиллов.
Однако, он, вероятно, призван показать знание того, как в принципе работает Promise, что из себя представляет и как с ним работать. Ну что же, можно и с этой стороны зайти, конечно, но можно было бы и просто спросить как работать с Promise.
Еще пару раз просто спрашивали теоретически, как бы я реализовала.

Решение
function Promise(fn) {this.thenHandlers = [];this.catchHandlers = [];this.isResolved = false;this.isRejected = false;setTimeout(() => fn(this.applyResolve.bind(this), this.applyReject.bind(this)));}Promise.prototype = {applyResolve: function () {this.thenHandlers.forEach((handler) => handler());this.isResolved = true;},applyReject: function () {this.catchHandlers.forEach((handler) => handler());this.isRejected = true;},then: function (handler) {if (this.isResolved) {handler();} else {this.thenHandlers.push(handler);}return this;},catch: function (handler) {if (this.isRejected) {handler();} else {this.catchHandlers.push(handler);}return this;}};const p = new Promise((resolve, reject) => (Math.round(Math.random() * 10) % 2 === 0? resolve(): reject()));p.then(function () {console.log('resolved');}).catch(function () {console.log('rejected');});



Задача: Реализовать аналог Promise.all.

Решение
function promiseAll(promises) {return new Promise((resolve, reject) => {const results = [];let resolvedCount = 0;promises.forEach((promise, index) => {promise.then((result) => {results[index] = result;resolvedCount++;if (resolvedCount === promises.length) {resolve(results);}}).catch((err) => reject(err));});});}promiseAll([new Promise((resolve) => {setTimeout(() => resolve('foo'), 5000)}),new Promise((resolve, reject) => {setTimeout(() => resolve('bar'), 1000);}),new Promise((resolve, reject) => {setTimeout(() => {Math.round(Math.random() * 10) % 2 === 0? resolve('baz'): reject(new Error());}, 300);}),]).then((res) => console.log('RESOLVED: ', res)).catch((err) => console.log('REJECTED: ', err));



Задача: Реализовать аналог Function.prototype.bind.
С появлением Rest parameters реализация этой задачи стала чуть проще, чем прежде, когда приходилось делать arguments.slice.

Решение
Function.prototype.bind = function(context, ...argsBind) {const fn = this;return function (...args) {return fn.apply(context, argsBind.concat(args))};};



Вопрос: Что такое делегирование событий? Плюсы/минусы/подводные камни.

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

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

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

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


Задача: Логическое продолжение предыдущего вопроса реализовать делегирование.

Решение
<div class="wrapper"><div class="child"><div><div><div>click me</div></div></div></div><div class="child"><div><div><div>click me</div></div></div></div><div class="child"><div><div><div>click me</div></div></div></div><div class="other"><div><div><div>dont't click me</div></div></div></div></div>


const delegate = (eventName, el, selector, handler) => {el.addEventListener(eventName, (event) => {let node = event.target;const items = [].slice.call(el.querySelectorAll(selector));if (items.length) {while (node !== el && node !== null) {const isTarget = items.some(item => node === item);if (isTarget) {handler(node);break;} else {node = node.parentNode;}}}});};delegate('click', document.querySelector('.wrapper'), '.child', (el) => el.style.backgroundColor = 'blue');



Задача: Уникализация значений в массиве.
Необходимо написать функцию, принимающую в аргументах массив целых чисел и возвращающюю новый массив, состоящий только из уникальных значений первого массива.
Например:
unique([1, 1, 2, 2, 4, 2, 3, 7, 3]); // => [1, 2, 4, 3, 7]


Решение в лоб
function unique(arr) {const res = [];arr.forEach((item) => {if (res.indexOf(item) === -1) {res.push(item);}});return res;}



Ожидания интервьюера
function unique(arr) {const res = {};arr.forEach((item) => {res[item] = '';});return Object.keys(res).map(item => Number(item));}



Решение в одну строку
function unique(arr) {return arr.filter((item, index, self) => (self.indexOf(item) === index));}



Задача: Расплющивание массива.
Необходимо написать функцию, принимающую в аргументах многомерный массив неограниченной вложенности и возвращающую новый одномерный массив, состоящий из элементов со всех уровней вложенности исходного массива.
Например:
flat([1, [2, [3, [4,5]]]]); // => [1, 2, 3, 4, 5]


Решение
function flat(arr) {let res = [];arr.forEach((item) => {if (Array.isArray(item)) {res = res.concat(flat(item));} else {res.push(item);}});return res;}



Ну или...
Есть нативный метод Array.prototype.flat
Я считаю, что именно с него надо начать ответ на этот вопрос, и только когда (именно когда, а не если) интервьюер скажет, что такое решение ему не подходит и нужно всё сделать руками, приниматься за вышеупомянутое решение через рекурсию.
[1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]].flat(Infinity);



Задача: Написать функцию, принимающую аргументом массив чисел и возвращающую новый массив, состоящий из удвоенных значений первого.
Например:
f([1, 2, null, 7, 8, null, 3]); // => [2, 4, 14, 16, 6]


Решение
function f(arr) {return arr.filter(item => item !== null).map(item => item * 2);}



Задача: Обход дерева
Дана структура данных в виде дерева:
const tree = {value: 1,children: [{value: 2,children: [{ value: 4 },{ value: 5 },]},{value: 3,children: [{ value: 6 },{ value: 7 },]}]};

Необходимо написать функцию, возвращающую значения всех вершин дерева:
getTreeValues(tree); // => [1, 2, 3, 4, 5, 6, 7]


Решение
Через рекурсию:
function getTreeValues(tree) {let values = [ tree.value ];if (Array.isArray(tree.children)) {tree.children.forEach(item => values = values.concat(getTreeValues(item)));}return values;}

Через цикл:
function getTreeValues(tree) {const tmpTree = [tree];const res = [];let current;while (tmpTree.length > 0) {current = tmpTree.shift();res.push(current.value);if (current.children) {current.children.forEach(item => tmpTree.push(item));}}return res}



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

Решение
Через рекурсию:
function getTreeSum(node) {let sum = node.value;if (Array.isArray(node.children)) {node.children.forEach(item => sum += getTreeSum(item));}return sum;}

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


Задача: Сортировка нечётных.
Необходимо написать функцию, принимающую в аргументах массив и возвращающую новый массив, в котором отсортированы все нечетные числа по возрастанию, в то время как чётные остаются на своих местах.
Например:
oddSort([7, 3, 4, 9, 5, 2, 17]); // => [3, 5, 4, 7, 9, 2, 17]


Решение
function oddSort(arr) {arr.forEach((item, index) => {if (item % 2 === 1) {let sortNumber = item;for (let i = 0; i < index; i++) {if (arr[i] % 2 === 1) {if (arr[i] > sortNumber) {const tmp = sortNumber;sortNumber = arr[i];arr[i] = tmp;}}}arr[index] = sortNumber;}});return arr;}



Задача: Идентичный алфавит
Необходимо написать функцию, принимающую в аргументах две строки и возвращающую true, если эти строки состоят из идентичных букв и false в противном случае.
Например:
isEqualSymbols('кот', 'ток'); // => trueisEqualSymbols('кот', 'тик'); // => false

Я уже писала про эту задачу в предыдущей части, но есть вариант решения получше.

Решение
function isEqualSymbols(str1, str2) {if (str1.length !== str2.length) {return false;}if (str1.split('').sort().join('') === str2.split('').sort().join('')) {return true;}return false;}

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


Задача: Бомба
Надо реализовать бомбу (в виде функции-коструктора), которая получает на входе время, через которое взорвется и некоторый звук взрыва (строку, которую вернет через заданное время). С фантазией задача.

Решение
function Bomb(message, delay) {this.message = message;setTimeout(this.blowUp.bind(this), delay * 1000); // взрываем через delay sec}Bomb.prototype.blowUp = function () {console.log(this.message);};new Bomb("Explosion!", .5);



Задача: Сжатие строк
Необходимо реализовать функцию, принимающую в аргументах строку, состоящую из букв и вернуть новую строку, в которой повторяющиеся буквы заменены количеством повторений.
Например:
rle('AVVVBBBVVXDHJFFFFDDDDDDHAAAAJJJDDSLSSSDDDD'); // => 'AV3B3V2XDHJF4D6HA4J3D2SLS3D4'


Решение
function rle(str) {const result = [str[0]];let count = 1;for (let i = 1; i < str.length; i++) {if (str[i] === str[i - 1]) {count++;if (i === str.length - 1) {result.push(str[i]);if (count > 1) {result.push(count);}}} else {if (i > 1) {result.push(str[i - 1]);}if (i === str.length - 1) {result.push(str[i]);}if (count > 1) {result.push(count);}count = 1;}}return result.join('');}



Вопрос: Что получится в результате выполнения кода и почему?
var obj = {};function func(x) {x = 1;return x;}func(obj); // => ?console.log(obj); // => ?


Ответ
Функция вернёт 1, obj при этом не изменится;
Несмотря на то, что объекты в JavaScript передаются в параметры функций по ссылке, obj не изменится.
Внутри функции создаётся локальная переменная x, в которую изначально попадет ссылка на obj, но позже эта переменная переписывается на числовое значение 1. Т.е. меняется само значение переменной x, но меняется значение, которое находится по ссылке, переданной изначально в функцию.


Вопрос: Как передать изображение размером 10Mb с помощью GET-запроса?

Ожидания интервьюера
Перевести в строку, разбить на кусочки и отправить разными запросами.

P.S.: Вопрос из разряда тех, на которые нет правильного ответа, потому как единственно верным ответом на этот вопрос был бы не делайте так, не отправляйте файлы методом GET, даже не думайте об этом и всё будет хорошо.
И это не тот случай когда хочется услышать размышления, а дойдёт ли собеседуемый до ожидаемого ответа или нет уже не так важно. Потому как в этом случае можно было бы поставить задачу иначе указать некоторые дополнительные требования к загрузке файлов: например, чт файлы могут быть неприлично большого размера и необходимо реализовать загрузку с возможностью догрузки, если в каком-то временном промежутке у клиента будут проблемы с сетью. Я имею ввиду, что если хочется услышать про возможность нарезки файлов на клиенте, то можно придумать условия и поадекватнее.


Вопрос: Назовите известные вам HTTP-методы. Что такое CRUD?

Ответ
Про HTTP-методы и CRUD:
GET read используется только для получения данных.
POST create создание новых сущностей.
PUT/PATCH update обновление данных.
DELETE delete удаление.

Вообще HTTP-методов сильно больше, помимо выше перечисленных есть OPTIONS, HEAD, TRACE и др.


Есть ещё пул вопросов, связанных с фреймворками и смежными с frontend'ом темами, возможно оформлю их в отдельную статью.
Подробнее..

Что тимлиду спросить компанию на собеседовании

27.02.2021 10:19:52 | Автор: admin

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

Вопросы подойдут, возможно, не только тимлиду, но были придуманы для него.

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

Каковы финансовые показатели компании?

Является ли компания прибыльной или тратит деньги инвесторов? Или даже до инвесторов ещё не дошло, и основатели пока платят из своего кармана? Как выглядит бизнесовый план развития?

Если компания имеет представительство в РФ, официальное ли (по ТК РФ) трудоустройство и полностью ли "белая" зарплата?

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

Расскажите про ваше понимание хорошего тимлида

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

Возможно, это понимание даже прописано в должностных инструкциях.

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

Кто ещё (кроме Вас) будет меня собеседовать и зачем?

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

Ну и заодно ответ на этот вопрос даст вам возможность подготовиться, если вы планируете все эти стадии интервью проходить.

Почему и как уволился / был уволен последний ушедший сотрудник?

Ответ на этот вопрос дополнит ответ, данный на вопрос о "качествах хорошего тимлида", а заодно покажет, какое отношение в компании к подобным вопросам.

Внимание: Вопрос может быть быть расценен как провокационный, осторожнее с ним.

За что вообще могут уволить? Что является провалом в плане работы / результатов / поведения?

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

Какие показатели текучести персонала в компании? Удовлетворяют ли они вас? Если нет, что делаете для улучшения показателей?

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

Кто будет заниматься моей адаптацией и каков её процесс?

Часто нового тимлида не адаптируют вообще никак "на тебе команду, плыви дальше". Иногда же бывает полноценный выстроенный процесс адаптации, с целями и задачами (чаще всего перекрещивается с положением об испытании).

Есть ли положение об испытании или нанятый сотрудник сразу считается прошедшим испытательный срок?

Станет понятно, как работает испытательный срок в компании, что в рамках этого срока нужно выполнить, чтобы его пройти, а также оформлено ли испытание по ТК РФ или же на словах.

Об испытательном сроке и особенностях его оформления я напишу отдельно.

Как осуществляется рост и развитие тимлида, куда и как расти, как и за что получать повышение заработной платы?

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

Также стоит прояснить и потенциал роста и развития какие дополнительные роли и обязанности можно брать и какие есть критерии оценки качества исполнения этих обязанностей и какие есть критерии оценки качества исполнения этих обязанностей.

Есть ли схемы дополнительной финансовой мотивации?

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

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

Выдаётся ли оборудование для работы?

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

Какой уровень контроля тимлида над ФОТом команды, каковы процедуры работы с ним?

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

Иногда бывают готовые процессы работы с зарплатами performance review, например, где-то есть правила, что при попытке уйти контрофер делают, где-то просто зарплату за выслугу лет индексируют, где-то зарплата остаётся плюс-минус одна, а вот RSU всякие накидывают изрядно.

Обладает ли тимлид полнотой полномочий в найме, росте/развитии и увольнении сотрудников?

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

Можно добавить сюда же вопрос "кто является хорошим разработчиком, а что неприемлемо?".

Есть ли на предприятии СКУД, является ли график работы жестко заданным или гибким? Есть ли дистанционка, какие правила?

График и условия труда стоит прояснить прямо сразу.

Как осуществляется целеполагание и контроль результатов? Есть ли учёт времени?

Кто ставит цели / задачи, в каком виде? Бывают всяческие виды целеполагание OKR, KPI, прямые указания и документально оформленные приказы руководства.

Как компания обслуживает больничные и отпуска?

У каждой компании своя политика кто-то оплачивает 100% зарплаты во время длительного больничного, кто-то действует по ТК РФ.

В плане отпусков многие компании требуют планировать отпуск на год вперёд, некоторые же более гибкие.

Оплачивает ли компания полис ДМС, если да, то какой компании?

Разные компании-провайдеры ДМС предоставляют разный уровень обслуживания по разным ценам. Последнее время популяризируются сервисы, оптимизирующие стоимость ДМС для компаний и предоставляющие доп. услуги клиентам.

Какие процессы разработки в команде и почему? Есть ли у тимлида возможность менять их?

Этот вопрос перекликается с вопросом о полномочиях тимлида в найме/развитии сотрудников и может показывать ожидаемый уровень компетенций тимлида.

Также важно услышать ответ на вопрос "почему" такие процессы установлены будет виден уровень компетенций руководителя в принятии решений о внедрении чего бы то ни было.

Расскажите про значимое изменение процессов, инициированное и проведенное кем-нибудь из тимлидов

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

Опишите весь процесс производства ПО

На основе ответа на этот вопрос можно "закопаться" глубже и составить более полную картину уровня компетенций и знаний руководителя.

Есть ли в компании переработки, как часто? Боретесь ли вы с ними и если да, то как?

Внимание: вопрос может показаться провокационным, можно смягчить до "есть ли в компании переработки?"

А можно и добавить "Когда это было в последний раз и по какой причине? Как были оплачены переработки сотрудникам?"

Есть ли бюджет на обучение сотрудников? Каким образом выделяется?

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

Список будет обновляться вечно, сама работа ведется на гитхабе, присоединяйтесь. Пул-реквесты, форки всё welcome.

Подробнее..

Что тимлиду спросить о компании на собеседовании

27.02.2021 12:14:40 | Автор: admin

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

Вопросы подойдут, возможно, не только тимлиду, но были придуманы для него.

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

Каковы финансовые показатели компании?

Является ли компания прибыльной или тратит деньги инвесторов? Или даже до инвесторов ещё не дошло, и основатели пока платят из своего кармана? Как выглядит бизнесовый план развития?

Если компания имеет представительство в РФ, официальное ли (по ТК РФ) трудоустройство и полностью ли "белая" зарплата?

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

Расскажите про ваше понимание хорошего тимлида

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

Возможно, это понимание даже прописано в должностных инструкциях.

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

Кто ещё (кроме Вас) будет меня собеседовать и зачем?

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

Ну и заодно ответ на этот вопрос даст вам возможность подготовиться, если вы планируете все эти стадии интервью проходить.

Почему и как уволился / был уволен последний ушедший сотрудник?

Ответ на этот вопрос дополнит ответ, данный на вопрос о "качествах хорошего тимлида", а заодно покажет, какое отношение в компании к подобным вопросам.

Внимание: Вопрос может быть быть расценен как провокационный, осторожнее с ним.

За что вообще могут уволить? Что является провалом в плане работы / результатов / поведения?

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

Какие показатели текучести персонала в компании? Удовлетворяют ли они вас? Если нет, что делаете для улучшения показателей?

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

Кто будет заниматься моей адаптацией и каков её процесс?

Часто нового тимлида не адаптируют вообще никак "на тебе команду, плыви дальше". Иногда же бывает полноценный выстроенный процесс адаптации, с целями и задачами (чаще всего перекрещивается с положением об испытании).

Есть ли положение об испытании или нанятый сотрудник сразу считается прошедшим испытательный срок?

Станет понятно, как работает испытательный срок в компании, что в рамках этого срока нужно выполнить, чтобы его пройти, а также оформлено ли испытание по ТК РФ или же на словах.

Об испытательном сроке и особенностях его оформления я напишу отдельно.

Как осуществляется рост и развитие тимлида, куда и как расти, как и за что получать повышение заработной платы?

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

Также стоит прояснить и потенциал роста и развития какие дополнительные роли и обязанности можно брать и какие есть критерии оценки качества исполнения этих обязанностей и какие есть критерии оценки качества исполнения этих обязанностей.

Есть ли схемы дополнительной финансовой мотивации?

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

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

Выдаётся ли оборудование для работы?

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

Какой уровень контроля тимлида над ФОТом команды, каковы процедуры работы с ним?

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

Иногда бывают готовые процессы работы с зарплатами performance review, например, где-то есть правила, что при попытке уйти контрофер делают, где-то просто зарплату за выслугу лет индексируют, где-то зарплата остаётся плюс-минус одна, а вот RSU всякие накидывают изрядно.

Обладает ли тимлид полнотой полномочий в найме, росте/развитии и увольнении сотрудников?

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

Можно добавить сюда же вопрос "кто является хорошим разработчиком, а что неприемлемо?".

Есть ли на предприятии СКУД, является ли график работы жестко заданным или гибким? Есть ли дистанционка, какие правила?

График и условия труда стоит прояснить прямо сразу.

Как осуществляется целеполагание и контроль результатов? Есть ли учёт времени?

Кто ставит цели / задачи, в каком виде? Бывают всяческие виды целеполагание OKR, KPI, прямые указания и документально оформленные приказы руководства.

Как компания обслуживает больничные и отпуска?

У каждой компании своя политика кто-то оплачивает 100% зарплаты во время длительного больничного, кто-то действует по ТК РФ.

В плане отпусков многие компании требуют планировать отпуск на год вперёд, некоторые же более гибкие.

Оплачивает ли компания полис ДМС, если да, то какой компании?

Разные компании-провайдеры ДМС предоставляют разный уровень обслуживания по разным ценам. Последнее время популяризируются сервисы, оптимизирующие стоимость ДМС для компаний и предоставляющие доп. услуги клиентам.

Какие процессы разработки в команде и почему? Есть ли у тимлида возможность менять их?

Этот вопрос перекликается с вопросом о полномочиях тимлида в найме/развитии сотрудников и может показывать ожидаемый уровень компетенций тимлида.

Также важно услышать ответ на вопрос "почему" такие процессы установлены будет виден уровень компетенций руководителя в принятии решений о внедрении чего бы то ни было.

Расскажите про значимое изменение процессов, инициированное и проведенное кем-нибудь из тимлидов

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

Опишите весь процесс производства ПО

На основе ответа на этот вопрос можно "закопаться" глубже и составить более полную картину уровня компетенций и знаний руководителя.

Есть ли в компании переработки, как часто? Боретесь ли вы с ними и если да, то как?

Внимание: вопрос может показаться провокационным, можно смягчить до "есть ли в компании переработки?"

А можно и добавить "Когда это было в последний раз и по какой причине? Как были оплачены переработки сотрудникам?"

Есть ли бюджет на обучение сотрудников? Каким образом выделяется?

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

Список будет обновляться вечно, сама работа ведется на гитхабе, присоединяйтесь. Пул-реквесты, форки всё welcome.

Подробнее..

Собеседование на позицию Data Scientist 20 типичных вопросов

08.04.2021 12:19:54 | Автор: admin

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


1. В чём разница между контролируемым и неконтролируемым машинным обучением?

Контролируемое машинное обучение:

  • Использует известные и маркированные данные в качестве входных.

  • Имеет механизм обратной связи.

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

Неконтролируемое обучение:

  • Использует немаркированные данные в качестве входных.

  • Не имеет механизма обратной связи.

  • Наиболее часто используемые алгоритмы неконтролируемого обучения кластеризация методом k-средних, иерархическая кластеризация и априорный алгоритм.

2. Перечислите этапы построения дерева решений.

  1. Взять весь набор входных данных.

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

  3. Рассчитать прирост информации по всем атрибутам (информацию о том, как отсортировать разные объекты друг от друга).

  4. Выбрать атрибут с наибольшим объёмом информации в качестве корневого узла.

  5. Повторить ту же процедуру для каждой ветви, пока узел решения каждой ветви не будет завершён.

3. Что такое проблемы взрывающегося и затухающего градиента?

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

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

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

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

4. Как рассчитать точность прогноза, используя матрицу путаницы?

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

Формула точности:

Точность = (истинно положительные + истинно отрицательные) / общее количество наблюдений.

Предположим, что истинно положительных значений у нас 2981, истинно отрицательных 110, а всего 3311. Используя формулу, находим, что точность прогноза составляет 93,36 %.

5. Как работает ROC-кривая?

ROC-кривая это графическое изображение контраста между показателями истинно положительных и ложноположительных результатов при различных пороговых значениях.

Если считать TPR и FPR для фиксированного порога [0,1], то их можно представить в виде функций от аргумента :

TPR = TPR(), FPR = FPR(). При этом обе функции монотонно возрастают от 0 до 1, а значит, определена функция:

ROC(x) = TPR(FPR-1(x)), x [0,1]

ROC-кривая это график функции.

Как правило, у хорошего классификатора кривая лежит по большей части либо целиком выше прямой y=x. Это связано с тем что при хорошей классификации надо получать максимальный TPR при минимальном FPR.

6. Объясните алгоритм машинного обучения SVM

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

Его основная идея построение гиперплоскости, которая разделяет объекты выборки максимально эффективным способом. Сделать это можно с помощью алгоритма линейной классификации.

7. Что такое ансамбль методов?

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

8. Что такое Random Forest?

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

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

9. Какой метод перекрёстной проверки вы бы использовали для набора данных временных рядов?

Нормальная k-кратная процедура перекрёстной проверки может быть проблематичной для временных рядов.

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

  • сгиб 1: тренировка [1], тест [2];

  • сгиб 2: тренировка [1 2], тест [3];

  • сгиб 3: тренировка [1 2 3], тест [4];

  • сгиб 4: тренировка [1 2 3 4], тест [5];

  • сгиб 5: тренировка [1 2 3 4 5], тест [6].

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

10. Что такое логистическая регрессия? Или приведите пример логистической регрессии.

Логистическая регрессия это статистическая модель, которую используют для прогнозирования вероятности какого-либо события.

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

В этом случае результат прогноза будет двоичным, то есть 0 или 1 (выигрыш/проигрыш). В качестве переменных-предикторов здесь будут: сумма денег, потраченных на предвыборную агитацию конкретного кандидата, количество времени, затраченного на агитацию, и так далее.

11. Что вы понимаете под термином нормальное распределение?

Нормальное распределение одно из основных распределений вероятности.

Плотность нормального распределения выражается функцией Гаусса:

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

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

12. Что такое глубокое обучение?

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

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

13. В чём разница между машинным обучением и глубоким обучением?

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

14. Что такое рекуррентные нейронные сети (RNN)?

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

Они используются преимущественно для задач, где нечто цельное состоит из ряда объектов, например при распознавании рукописного текста или речи.

15. Что такое обучение с подкреплением?

Обучение с подкреплением очень схоже по смыслу с обучением с учителем, но в роли учителя выступает среда, в которой система может выполнять какие-либо действия.

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

Машина пытается решить задачу, ошибается, учится на своих ошибках, совершенствуется, и так множество раз.

16. Объясните, что такое регуляризация и почему она полезна.

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

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

17. Что такое рекомендательные системы?

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

18. Какова цель A/B-тестирования?

A/B-тестирование это статистическая проверка гипотез для рандомизированных экспериментов с двумя переменными, A и B.

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

19. Что такое закон больших чисел?

Это принцип теории вероятностей, который описывает результат выполнения одного и того же эксперимента множество раз.

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

К примеру, при бросках шестигранного кубика. Чем больше бросков, тем больше среднее значение близится к математическому ожиданию 3,5.

20. Назовите несколько фреймворков для глубокого обучения.

  • Pytorch.

  • TensorFlow.

  • Microsoft Cognitive Toolkit.

  • Keras.

  • Caffe.

  • Chainer.

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

У нас еще много направлений для состоявшихся профи и новичков
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru