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

Interview

А ты точно senior? или ожидания продуктовых компаний

07.01.2021 14:19:53 | Автор: admin

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

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

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

Для себя я выделил два основных направления - аутсорс и продуктовые компании.
Для аутсорс важнее широкий спектр технологий с которыми сталкивался кандидат.
В продуктовой будет важнее глубокое понимание технологий и принципы написания поддерживаемого кода.

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

Итак первое знакомство с кандидатом - резюме

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

На что обращаю внимание:
Как долго работает в одной компании, есть ли рост/смена позиций за время работы.

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

Красным флагом могут быть:
частая смена проектов
большие количество проектов с CMS
пустое перечисление ключевых слов от CSS до IDE.

Если будет интересно к теме хорошего оформления резюме как-нибудь вернемся.

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

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

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

Под таблицей есть спойлер с картинкой если на вашем экране таблица поползла)

Junior

Middle

Senior

Архитектура приложений

Есть базовое понимание принципов ООП

Слышал про SOLID

Может придерживаться соглашений проекта и прослеживать аналогии

Знает пару паттернов

Хорошо понимает SOLID

Слышал про GRASP

Знает про модульную архитектуру

Знает какие есть паттерны, понимает когда нужно применять

Знает основные подходы к проектированию приложения(CQRS,ES,Modular,SOA)

Хорошо понимает как предупредить каскадные изменения

Может рассуждать про метрики качества кода

Знает паттерны вне GOF

Код

Знает базовые конструкции языка

С помощью гугла может решить основные задачи

Знает основные возможности языка, ряд популярных дополнений/библиотек

Может решить сложные задачи и направить Junior разработчика

Может грамотно построить структуру проекта

Код понятен легко читаем без лишнего усложнения

Структуры данных/алгоритмы

Знает какие есть структуры данных

Может подобрать подходящую для простых случаев

Может написать простой алгоритм, посчитать его сложность

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

Может выбирать, создавать сложные алгоритмы

При выборе алгоритма и структуры данных размышляет про эффективность выбора в разрезе RAM/CPU

Реляционные базы данных

Может строить простые запросы(выборки, простые джоины)

Понимает что такое индексы

Может построить отношения между таблицами

Может строить сложные запросы(сложные джоины, подзапросы, агрегации)

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

Может профилировать запросы, знает explain

Может спроектировать простую структуру базы данных

Понимает как работать с большими таблицами

Знает про репликацию

Может построить сложную структуру базы данных(шардинг, денормализация)

Знает ограничения и возможности популярных баз данных

Понимает ограничения CAP, PACELC

Безопасность

Слышал основные уязвимости

Знает основные OWASP уязвимости и как их предотвращать

Знает ряд техник для мониторинга, предотвращения уязвимостей.

Понимает как действовать при атаке

Тестирование

Есть базовое понимание для чего и как писать юнит тесты

Понимает различия между разными видами тестов

Может эффективно их писать

Понимает как избегать хрупких тестов

Знает разные подходы к написанию тестов(TLD, TDD)

Может рассуждать о пирамиде тестирования

Знает что дает и как создать нагрузочное тестирование

Как плюс знает AB тестирования

API

Знает базовые методы HTTP

Слышал про RPC,REST

Хорошо понимает принципы проектирования API

Знает какие есть варианты авторизаций

Знает основные подходы стандартизации/версионирования API

Может выбрать тип авторизации для проекта

Очереди/ Шина сообщений

Понимает зачем они и как работать на уровне интерфейса языка/библиотек

Понимает разницу между очередью и шинной данных

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

Знает основные решения по настройке, мониторингу очередей

Может выбрать подходящий брокер

Спроектировать подход к обработке данных (очередь, пайплайн, асинхронный ответ)

Многопоточность/ Асинхронность
Если поддерживает язык

Владеет на уровне интерфейса языка

Знает как работать с многопоточностью
(блокировки, синхронизация)

Знает как работать с асинхронностью

Понимает что такое итоговая согласованность

Когда и как лучше распараллелить процесс

Кеширование

Может работать на уровне интерфейса языка/библиотеки

Догадывается когда использовать

Знает как организовать кеш, какие бывают проблемы

Хорошо знаком с проблемами нагруженного кеша(прогрев, волна запросов, конкурентный доступ)

Инфраструктура/Сети

Знание базовых команд операционной системы

Знает какие этапы проходит запрос перед тем как попасть в приложение

Знаком с одним из средств виртуализации

Понимает какие вещи и как нужно настроить для продакшн среды

Понимает виртуализацию и контейнеризацию

Знает базовые сетевые протоколы TCP, UDP, HTTP, HTTPS

Понимает как устроена сеть DNS, NAT, OSPF, BGP, RIP

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

Хорошо понимает принципы работы CDN и как решать базовые проблемы

Знает ограничения текущей платформы, как их обойти

Метрики/логи

Знает зачем логи, как их писать

Знает варианты сбора логов

Понимает зачем проекту мониторинг, как им пользоваться

Может выбрать необходимые метрики

Знаком с рядом вариантов сбора метрик/логов

Способен настроить алертинг, сбор необходимых метрик

Желательно знакомство с TSDB

CVS/ Релиз процесс

Понимает зачем нужна CVS

Может выполнять базовые операции CVS

Может рассказать как сделать простой релиз через CVS и SSH руками

Хорошо знает команды CVS

Знает пару фреймворков построения процесса

Знает как работает CI

Может построить CI процесс, знает какие для этого есть инструменты

Хорошо знает подходы к ветвлению, может выбрать подходящий

PNG

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

Подробнее..

Изучаем React 300 вопросов для подготовки к собеседованию

21.01.2021 08:19:12 | Автор: admin


Доброго времени суток, друзья!

Представляю вашему вниманию первую версию репозитория с большим количеством вопросов (с ответами, разумеется) по React и связанным с ним технологиям. А много это сколько? Это 322.

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

Текущая версия является адаптированным, исправленным и дополненным переводом этого репозитория.

Вопросник включает в себя следующие разделы:

  • Ключевые концепции React
  • React Router
  • Интернационализация в React
  • Тестирование в React
  • React Redux
  • React Native
  • Библиотеки для React
  • Разное (много разного, включая хуки)


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

Планируется, что со временем репозиторий превратится в хороший русскоязычный ресурс по изучению React и наиболее популярных инструментов, предназначенных для работы с ним (решил сделать 2021 год годом React и TypeScript). В ближайшее время в нем появятся краткие руководства по Create React App, стилям в React, включая Styled Components, и React Router. Постепенно ресурс обретет формат прогрессивного веб и, возможно, мобильного приложения.

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

Благодарю за внимание и хорошего дня.
Подробнее..

Перевод 7 вопросов про замыкания в JavaScript

15.03.2021 14:07:31 | Автор: admin

Привет, Хабр. Для будущих студентов курса "JavaScript Developer. Professional" подготовили перевод интересного материала.

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


7 Вопросов из интервью по замыканиям (closures) в JavaScript. Можете ли вы ответить на них?

Каждый разработчик JavaScript должен знать, что такое замыкание (closure). Во время собеседования по кодированию JavaScript есть большая вероятность, что вас спросят о концепции замыкания.

Я составил список из 7 интересных и наиболее сложных вопросов по замыканиям в JavaScript.

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

Развлекайтесь!

Если вам нужно освежить свои знания о замыкании, я рекомендую ознакомится с публикацией A Simple Explanation of JavaScript Closures (Простое объяснение замыканиям в JavaScript).

Содержание

Вопрос 1: Замыкания развязывают твои руки

Вопрос 2: Утерянные параметры

Вопрос 3: Кто есть кто

Вопрос 4: Хитроумное замыкание

Вопрос 5: Правильное или неправильное сообщение

Вопрос 6: Восстановление инкапсуляции (Restore encapsulation)

Вопрос 7: Умное перемножение

Резюме

Вопрос 1: Замыкания развязывают твои руки

Рассмотрим следующие функции: clickHandler, immediate, и delayReload:

let countClicks = 0;button.addEventListener('click', function clickHandler() {  countClicks++;});
const result = (function immediate(number) {  const message = `number is: ${number}`;  return message;})(100);
setTimeout(function delayedReload() {  location.reload();}, 1000);

Какие из этих 3 функций получают доступ к переменным внешней области видимости (outer scope)?

Расширенный ответ

  1. clickHandler обращается к переменной countClicks из внешней области видимости.

  2. immediate не обращается ни к каким переменным из внешней области видимости.

  3. delayReload обращается к глобальной переменной location из глобальной области видимости (так же известной как крайняя область видимости (outermost scope)).

Вопрос 2: Утерянные параметры

Что будет записано в консоль для следующего фрагмента кода (code snippet):

(function immediateA(a) {  return (function immediateB(b) {    console.log(a); // What is logged?  })(1);})(0);

Расширенный ответ:

0 записывается на консоль. Посмотрите демо.

immediateA вызывается с аргументом 0, таким образом, параметр равен 0.

Функция immediateB, будучи вложенной в функцию immediateA, является замыканием, которое захватывает переменную a из внешней области видимости immediateA, где a равно 0. Таким образом, console.log(a) записывает в журнал 0.

Вопросы 3: Кто есть кто

Что будет записано в консоль для следующего фрагмента кода (code snippet):

let count = 0;(function immediate() {  if (count === 0) {    let count = 1;    console.log(count); // What is logged?  }  console.log(count); // What is logged?})();

Расширенный ответ:

1 и 0 записываются в консоль. Посмотрите демо.

Первое утверждение let count = 0 объявляет переменную count.

immediate() это замыкание, которое захватывает переменную count из внешней области видимости. Внутри области видимости функции immediate() count равна 0.

Однако внутри этого условия другая команда let count = 1 объявляет count локальной переменной, которая перезаписывает count из внешней области видимости. Первая console.log(count) записывает 1.

Вторая console.log(count) записывает 0, так как здесь переменная count доступна из внешней области видимости.

Вопрос 4: Хитроумное замыкание

Что будет записано в консоль в следующем фрагменте кода (code snippet):

for (var i = 0; i < 3; i++) {  setTimeout(function log() {    console.log(i); // What is logged?  }, 1000);}

Расширенный ответ:

3, 3, 3 записано на консоль. Посмотрите демо.

Фрагмент кода выполняется в 2 этапа.

Фаза 1

  1. for() выполняет итерацию 3 раза. Во время каждой итерации создается новая функция log(), которая захватывает переменную i. setTimout() планирует исполнение log() через 1000мс.

  2. Когда цикл for() завершается, переменная i имеет значение 3.

Фаза 2

Вторая фаза происходит после 1000 мс:

  1. setTimeout() выполняет запланированные функции log(). log() считывает текущее значение переменной i, которое равно 3, и записывает в консоль 3.

Поэтому 3, 3, 3 записывается в консоль.

Дополнительная задача: как бы вы изменили в этом примере сообщение для консоли со значениями 0, 1, 2 ? Запишите ваше решение в комментариях ниже!

Вопрос 5: Правильное или неправильное сообщение

Что будет записано в консоль в следующем фрагменте кода (code snippet):

function createIncrement() {  let count = 0;  function increment() {     count++;  }  let message = `Count is ${count}`;  function log() {    console.log(message);  }    return [increment, log];}const [increment, log] = createIncrement();increment(); increment(); increment(); log(); // What is logged?

Расширенный ответ:

'Count is 0' записывается в консоль. Посмотрите демо.

Функция increment() вызывалась 3 раза, в итоге увеличивая count до значения 3.

Переменная message существует в рамках функции createIncrement(). Ее начальное значение 'Count is 0'. Однако, даже если переменная count была увеличена несколько раз, переменная message всегда имеет значение 'Count is 0'.

Функция log() это закрытие, которое захватывает переменную message из области видимости createIncrement(). console.log(message) записывает 'Count is 0' в консоль.

Дополнительная задача: как бы вы исправили функцию log(), чтобы она возвращала сообщение, имеющее фактическое значение count? Запишите ваше решение в комментариях ниже!

Вопрос 6: Восстановление инкапсуляции (Restore encapsulation)

Следующая функция createStack() создает элементы структуры стековых данных:

function createStack() {  return {    items: [],    push(item) {      this.items.push(item);    },    pop() {      return this.items.pop();    }  };}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => [10]stack.items = [10, 100, 1000]; // Encapsulation broken!

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

Это неприятная деталь, так как она нарушает инкапсуляцию стека: только методы push() и pop() должны быть публичными, а stack.items или любые другие элементы не должны быть доступны.

Рефакторизуйте описанную выше реализацию стека, используя концепцию замыкания, так, чтобы не было возможности доступа к массиву items вне области видимости функции createStack():

function createStack() {  // Write your code here...}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => undefined

Расширенный ответ:

Вот возможный рефакторинг (refactoring) функции createStack():

function createStack() {  const items = [];  return {    push(item) {      items.push(item);    },    pop() {      return items.pop();    }  };}const stack = createStack();stack.push(10);stack.push(5);stack.pop(); // => 5stack.items; // => undefined

Посмотрите демо.

items был перемещен в переменную внутри области видимости createStack().

Благодаря этому изменению, за пределами области видимости createStack(), теперь нет способа получить доступ к массиву itemsили изменить его. Элементы сейчас являются приватной переменной, а стек инкапсулирован: только методы push() и pop() являются публичными.

Методы push() и pop(), будучи замкнутыми, захватывают переменную items из области видимости функции createStack().

Вопрос 7: Умное перемножение

Напишите функцию multiply(), которая умножает 2 числа:

function multiply(num1, num2) {  // Write your code here...}

Если multiply(num1, numb2) будет вызвана с 2 аргументами, то она должна вернуть умножение 2 аргументов.

Но в том случае, если вызывается 1 аргумент const anotherFunc = multiply(numb1), то функция должна возвращать другую функцию. Возвращаемая функция при вызове anotherFunc(num2) выполняет умножение num1 * num2.

multiply(4, 5); // => 20multiply(3, 3); // => 9const double = multiply(2);double(5);  // => 10double(11); // => 22

Расширенный ответ:

Вот возможная имплементация функции multiply():

function multiply(number1, number2) {  if (number2 !== undefined) {    return number1 * number2;  }  return function doMultiply(number2) {    return number1 * number2;  };}multiply(4, 5); // => 20multiply(3, 3); // => 9const double = multiply(2);double(5);  // => 10double(11); // => 22

Посмотрите демо.

Если параметр number2 не является undefined, то функция просто возвращает number1*number2.

Но если number2 является undefined, то это означает, что функция multiply() была вызвана с одним аргументом. В таком случае вернем функцию doMultiply(), которая при последующем вызове выполняет фактическое умножение.

doMultiply() является замыкающей, поскольку она захватывает переменную number1 из области видимости функции multiply().

Резюме

Сравните ваши ответы с ответами в статье:

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

  • Если вы правильно ответили менее чем на 5 вопросов, вам нужно хорошенько освежить тему замыкания,. Я рекомендую изучить мой пост A Simple Explanation of JavaScript Closures (Простое объяснение замыкания в JavaScript).

Готовы к новому испытанию? Попробуйте ответить на 7 вопросов в интервью по ключевому слову "this" в JavaScript.


Узнать подробнее о курсе "JavaScript Developer. Professional".

Смотреть
открытый карьерный вебинар.

Подробнее..

Каверзные вопросы по Python

18.11.2020 12:16:11 | Автор: admin

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



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


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


Первый пример


Очень короткий. Про операторы и порядок их вычислений.


11 > 0 is True

С ходу можно интерпретировать это выражение следующим образом:


  • Приоритет операторов сравнения и is одинаков.
  • 11 > 0 это True.
  • Упрощаем выражение, получая True is True.
  • Всё выражение в итоге станет True.

На самом же деле это выражение вернёт False.


Вот еще пара похожих выражений.


0 < 0 == 0             # False1 in range(2) == True  # False

Также обратите внимание, что расстановка скобок изменит результат.


(11 > 0) is True         # True(0 < 0) == 0             # True(1 in range(2)) == True  # True

Как всегда, никакой магии в этих примерах нет. Приведенные выражения это chained comparisons, которые следует читать так: a op1 b op2 c ... y opN z эквивалентно a op1 b and b op2 c and ... y opN z.


Итак, ответ: исходное выражение эквивалентно (11 > 0) and (0 is True), что, очевидно, является ложью.


Остался вопрос про скобки? Расстановка скобок превращает выражение в обычное, не chained comparisons. То есть благодаря скобкам приоритет смещается на выражение в них, оно вычисляется первым, а затем выполняется вторая операция.


Второй пример


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


a = 123b = 123a == ba is b

Двойное равно проверяет объекты на равенство (и очевидно, что 123 == 123). А оператор is проверяет, что переменные ссылаются на один и тот же объект. a и b разные объекты, поэтому a is b вернёт False.


На самом деле в Python есть оптимизация, касающаяся небольших int-ов (от -5 до 256 включительно). Эти объекты загружаются в память интерпретатора при его запуске. Получается небольшой кеш. Из-за этого объект получается один, и результат будет True.


Аналогичный пример для числа > 256 сработает ожидаемо:


a = 257b = 257a == b  # Truea is b  # False

Второй пример. Продолжение


Давайте попробуем копнуть глубже и посмотрим на следующий пример:


def test():    a = 257    b = 257    print(a is b)test()

257 не входит в кеш, и должно отобразиться False.


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


import disdis.dis(test)

Мы увидим следующие инструкции:


  2           0 LOAD_CONST               1 (257)              2 STORE_FAST               0 (a)  3           4 LOAD_CONST               1 (257)              6 STORE_FAST               1 (b)  4           8 LOAD_GLOBAL              0 (print)             10 LOAD_FAST                0 (a)             12 LOAD_FAST                1 (b)             14 COMPARE_OP               8 (is)             16 CALL_FUNCTION            1             18 POP_TOP             20 LOAD_CONST               0 (None)             22 RETURN_VALUE

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


Получается, что интерпретатор способен на подобные оптимизации: код предварительно анализируется, и некоторые константы переиспользуются (float-ы тоже, но не tuple-ы).
Итак, исходный код выведет True.


Третий пример


Этот вопрос однажды встретился мне на собеседовании. Он про классы и методы.


class C:    a = lambda self: self.b()    def __init__(self):        self.b = lambda self: Nonec = C()c.a()

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


Вспоминаем, что вызов метода применительно к экземпляру класса c.method() это то же самое, что вызов метода применительно к классу с первым аргументом в качестве экземпляра: C.method(c).


Теперь проверим, во что превратились параметры a и b класса C.


type(c.a)  # <class 'method'>type(c.b)  # <class 'function'>

Параметр а превратился в метод класса, такой же, как при определении метода внутри класса через def a(self).


А вот b это обычная функция, потому что она присваивается атрибуту экземпляра класса, а не определяется (как a) в момент создания класса.


Получается, что при вызове c.a() мы получаем C.a(c). Тут в качестве аргумента self в метод валидно передастся экземпляр класса. Далее внутри a вызывается функция b. Поскольку это обычная функция, то автоматической передачи экземпляра в качестве первого аргумента не произойдёт. И получается, что функция b вызовется без аргументов. Но она требует аргумент! Ведь она задана как lambda self: None. Не обращайте внимание, что аргумент называется self. Это сделано для дополнительного запутывания.


Итак, ответ:


Traceback (most recent call last):  File "<input>", line 1, in <module>  File "<input>", line 2, in <lambda>TypeError: <lambda>() missing 1 required positional argument: 'self'

Это происходит потому, что функции b не передан аргумент.


Четвёртый пример


Он про определение переменных в замыкании. Взят из списка хитрых вопросов с toptall:


def create_multipliers():    return [lambda x : i * x for i in range(5)]for multiplier in create_multipliers():    print(multiplier(2))

Кажется, ничего сложного. create_multipliers вернёт список из 5 функций (назовём их list_lamba_f). Каждая list_lamba_f будет умножать свой аргумент на свой индекс в результирующем массиве.


Получается, что на экране мы увидим:


02468

Дальнейший разбор предполагает, что вам знакомо замыкание (closure) при использовании вложенных функций (nested functions).


Свои коррективы в наивное объяснение выше вносит позднее связывание. Согласно ему, значение переменной из замыкания (это переменная i) вычисляется в тот момент, когда вызывается внутренняя функция (наши list_lamba_f).


Получается, что значение i в list_lamba_f вычисляется в момент вызова multiplier(2) в пятой строчке. Но в этот момент create_multipliers уже отработала целиком. и значение i это 4. То есть для всех list_lamba_f значение i равно 4.


Итак, ответ:


88888

Надеюсь, вам было интересно и понятно. С удовольствием почитаю комментарии с вопросами и задачами, которые кажутся вам полезными для понимания Python и просто занятными. Только не пишите ответ сразу!

Подробнее..

Какие вопросы ожидать на позицию автоматизатора и причем тут сортировка?

03.04.2021 16:09:23 | Автор: admin

Здравствуйте, коллеги.

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

Само собой, если вы проходите собеседование на позицию junior, от вас не будут требовать опыта и знаний по всем вопросам. Будет круто, если вы разбираетесь хотя бы в ~30% всего этого. От позиции middle я бы ожидал примерно ~50%-60% знаний перечисленных мною тем. Ну и далее по восходящей. :)

Кто такой автоматизатор?

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

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

  1. Разбираться в тестировании. Иначе не получится писать хорошие тесты, проверяющие именно то, что необходимо.

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

  3. Знать, как развернуть необходимый софт на серверах. Читай - немного понимать в системном администрировании или девопсе. Ведь тесты чаще всего запускаются в CI-системе, привязываются к Pull Requestам, а сам код запускается в Docker. И со всем этим надо уметь работать.

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

Тестирование

Обычные вопросы по тестированию чаще всего затрагивают теорию и практику.

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

Скорее всего спросят про знание устройства самого продукты, который вы будете тестировать. Например, если вам предстоит работать с Web, надо понимать как он работает: разбираться в протоколе HTTP, знать о связке HTML / CSS / JavaScript, понимать смысл кросс-браузерного тестирования и так далее.

Для тестирования мобильных приложений надо понимать основное отличие операционных систем iOS и Android, особенности тестирования на симуляторах, эмуляторах и реальных девайсах и многое другое.

Само собой, поскольку все это нам предстоит автоматизировать, еще необходимо разбираться в стеках автоматизации. Для автоматизации тестирования Web необходимо понимать как настроить Selenium или Selenoid, как подбирать CSS или XPath-локаторы для элементов, какие браузеры выбрать для тестов.

Для мобильной автоматизации пригодится знание драйверов (Espresso или XCUITest) или опыт работы с Appium. Умение настраивать ферму девайсов или устанавливать необходимые эмуляторы и симуляторы.

Для автоматизации API необходимо знать про методы HTTP-запросов (GET, POST, PUT, DELETE и т.д.) и их отличия, коды ответа сервера и их основные форматы (JSON, XML).

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

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

Программирование

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

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

Чаще всего причина недовольства простая - мне это не нужно для работы. И в целом это правда. Не каждый день вы будете реализовывать методы сортировки самостоятельно. Тем более для написание тестов. Тогда зачем это спрашивают?

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

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

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

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

Чаще всего человек, который действительно пишет много кода, справится с подобными задачами. Особенно если немного попрактикуется решать именно такие специфичные задачи. Для этого существуют такие ресурсы, как leetcode, codewars и прочие.

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

Еще на собеседовании могут поспрашивать немного про паттерны программирования. Тут хорошо знать про Singleton, Factory, PageObject, PageFactory, Builder и так далее. Можно еще почитать про принципы разработки SOLID, KISS, DRY, SRP.

Девопс

Ну и заключительная часть - это работа с различным софтом и инструментами. Тут могут спросить с какой CI-системой вы чаще всего работали. На мой взгляд, самыми популярными являются Jenkins, Gitlab CI, TeamCity и Bamboo.

Помимо этого спросят про опыт работы с bash: команды cd, ls, ps, mv, cp и так далее. Просто, чтобы убедиться, что вы не растеряетесь, зайдя на какой-нибудь сервер на основе linux по ssh.

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

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

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

Итог

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

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

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

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

Я думаю, про это я напишу как-нибудь в следующий раз.

Ну и минутка рекламы - приходите на наши курсы для тестировщиков. На них мы рассказываем многое как из этого списка, так и в целом о тестировании. Вся информация и ссылки в профиле. :)

А на этом все. Спасибо за внимание.

Подробнее..

Пройти собеседование и не умереть. От смеха

15.04.2021 18:16:38 | Автор: admin

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

Хотя в 99% случаев меня зовут на позицию фронтендера, на собеседовании меня спрашивали совершенно разные вещи: бэкенд, devops, базы данных, сети и администрирование, project management, аналитику, юнит/авто тесты, алгоритмы, парадигмы программирования, криптографию, проверяли английский, давали тесты на IQ и даже устраивали стресс-интервью.

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

Форма скиллов

Бывает, что ты проходишь собеседование на фронтендера, а там задают вопросы не связанные или слабо связанные с ним:

  • Что такое DNS?

  • Что происходит, когда пользователь набирает в браузере адрес сайта?

  • Как расшифровывается SOLID?

  • Чем абстрактный класс отличается от интерфейса?

  • Как реализован алгоритм шифрования?

  • Как оптимизировать SQL-запросы?

  • Чем PATCH отличается от PUT?

Причины не релевантных вопросов:

  1. Нужен человек-оркестр

  2. Интервьюер проверяет форму скиллов

  3. Интервьюер плохо разбирается во фронтенде

  4. Ты не понравился интервьюеру

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

Интервьюер проверяет форму скиллов

Во-втором случае интервьюер пытается прощупать, имеешь ли ты T-shaped или I-shaped skills. T-shaped - это узкая специализация в 1 сфере и поверхностное понимание других. I-shaped - это экспертиза в одной технологии при отсутствии навыков в других.

Такую терминологию впервые предложил David Guest в 1991. Идея была одобрена Тимом Брауном после анализа резюме сотен кандидатов. Второй пункт отличается от первого тем, что у работника есть основная специализация, по которой он будет работать 80-90% времени.

Позже появились теории о существовании Square-shaped skills специалистов, имеющие глубокие компетенции в нескольких сферах. Отдельные авторы предрекают появление О-skills students, которым свойственны эмпатия, забота о будущих поколениях и окружающей среде.

Интервьюер плохо разбирается во фронтенде

Третья ситуация встречается там, где отдел только набирается или просто нет опытных фронтендедеров, собеседованием занимается бэкендер. Ему проще спросить то, что он знает: ООП, паттерны, базы данных, сети, сетевая модель OSI.

Ты не понравился интервьюеру

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

Боюсь, что меня унизят на интервью

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

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

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

Ходить ли на вакансии не по стэку?

Конечно, ходить. Можно поставить себе "junior python dev" будучи "senior java dev" и с интересом понаблюдать за требованиями на других языках/стэках/фреймворках. Делать так лучше, если есть небольшой опыт в новом языке, например, в личных проектах или на работе. Это станет новым опытом, хорошей эмоциональной растяжкой и позволит тебе лучше оценить свои навыки. Возможно ты захочешь сменить стэк.

Резюмируя

Не бойся собеседований, не расстраивайся из-за отказов. Помни принцип Парето: при 80% отказов получать 20% офферов. Возможно ты не силен в алгоритмических задачах, балансировке деревьев у доски, не особо разбираешься в ООП, зато понимаешь функциональное программирование, у тебя крутой гитхаб. Кто-то, наоборот, инвестирует время в алгоритмы, ему интереснее математика, а не создание продукта. Это нормально, у каждой компании свой запрос. Потребности фирмы нельзя унифицировать и привести к единому стандарту.

Подробнее..

Перевод 50 вопросов по Docker, которые задают на собеседованиях, и ответы на них

16.11.2020 16:04:47 | Автор: admin


Docker, первый выпуск которого был еще в 2013 году, весьма удобный инструмент для сборки пакетов, поставки и запуска приложений в контейнерах. Большинство крупных компаний, например, Google, Amazon и VMware рассматривают Docker как зрелую технологию для контейнеров, поэтому сейчас самое время изучить этот инструмент и в результате продвинуться по карьерной лестнице. Хотите? В статье будут приведены вопросы по Docker, ответы на которые нужно знать, если вы идете на собеседование.


Что такое контейнер Docker?


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


Опишите составные части архитектуры Docker


Основные составные части архитектуры Docker это:


  • сервер, содержит сервис Docker, образы и контейнеры. Сервис связывается с Registry, образы метаданные приложений, запускаемых в контейнерах Docker.
  • клиент, применяется для запуска различных действий на сервере Docker.
  • registry, используется для хранения образов. Есть публичные, доступные каждому, например, Docker Hub и Docker Cloud.

Опишите Registry подробнее


Docker Registry служит для хранения образов Docker. Есть два публичных сервиса хранения: Docker Hub и Docker Cloud. Docker Hub наиболее значимая публичная система хранения образов контейнеров, полностью поддерживаемая множеством разработчиков и другими участниками сообщества.


Расскажите кратко о жизненном цикле контейнера Docker


Жизненный цикл контейнера:


  • Создание контейнера
  • Работа контейнера
  • Приостановка контейнера
  • Возобновление работы контейнера
  • Запуск контейнера
  • Остановка контейнера
  • Перезапуск контейнера
  • Принудительная остановка контейнера
  • Удаление контейнера

Назовите наиболее важные команды Docker


Наиболее важные команды Docker:


  • build, сборка образа для Docker
  • create, создание нового контейнера
  • kill. принудительная остановка контейнера
  • dockerd, запуск сервиса Docker
  • commit, создание нового образа из изменений в контейнере

Что такое пространства имен в Docker?


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


Что такое Docker Swarm?


Docker Swarm (теперь это уже swarm mode, прим. переводчика) встроенный инструмент Docker, используемый для организации кластеризации и планирования контейнеров. Разработчики и системные администраторы с его помощью могут легко собрать несколько узлов в единую виртуальную систему Docker и управлять ею.


Как определить состояние контейнера Docker?


Чтобы определить состояние, надо запустить команду:


docker ps -a

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


Что такое образ Docker, что делает команда Docker run?


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


Опишите функции и случаи применения Docker


С помощью Docker можно:


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

Что такое объекты Docker?


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


Еще объектами можно назвать сети и тома.


Какой тип приложений больше подходит для контейнеров Docker: с хранением состояния (stateful) или без хранения (stateless)?


Приложения без хранения состояния (stateless) больше подходят для работы в Docker, чем приложения с хранением (stateful). Мы можем создать контейнер для нашего приложения и принять некоторые его настройки. Таким образом мы можем запускать один и тот же контейнер с разными настройками для различных окружений. Если мы не будем хранить состояние, сможем использовать один и тот же образ в разных сценариях. Также такие приложения проще масштабировать при их работе в контейнерах Docker.


Что такое Dockerfile?


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


Какие сети доступны по умолчанию в Docker?


По умолчанию есть:


  • bridge, сеть, к которой подключаются контейнеры, если не указано иначе.
  • none, сетевой стек без наличия сетевого интерфейса в контейнере.
  • host, подключение к сетевому стеку сервера.

Приведите необходимые шаги для развертывания докеризированного приложения, сохраненного в репозитории Git


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


  • Сборка приложения с использованием Docker build в каталоге с кодом приложения
  • Тестирование образа
  • Выгрузка образа в Registry
  • Уведомление удаленного сервера приложений, что он может скачать образ из Registry и запустить его
  • Перестановка порта в прокси HTTP(S)
  • Остановка старого контейнера

Чем Docker отличается от остальных технологий контейнеризации?


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


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


Если вы остановите контейнер потеряете данные?


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


Как выполняется мониторинг Docker в производственных окружениях?


Для мониторинга есть инструменты Docker stats и Docker events. С их помощью можно получить отчеты по важной статистике. Если запустить stats с некоторым идентификатором контейнера, он вернет использование оперативной памяти и процессорного времени в контейнере. Это схоже с использованием команды top. С другой стороны есть events, показывающая список активностей в процессе работы сервиса Docker. Вот некоторые из них: подключение к консоли контейнера, commit, переименование, удаление и т.п., а также есть возможность фильтрации нужных событий.


Расскажите о рабочем процессе использования Docker


Краткое пояснение рабочего процесса с использованием Docker:


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

Поясните разницу между docker run и docker create


Главная разница между этими командами заключается в том, что вторая создаст контейнер в остановленном состоянии. Также docker create может быть использована для хранения и вывода идентификатора контейнера для будущего использования. Лучше всего это делать с помощью docker run, добавляя --cidfile FILENAME, поскольку повторный запуска не перезаписывает файл.


Что такое виртуализация?


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


Что же в сухом остатке? С помощью виртуализации можно запустить две различных операционных системы на одном и том же оборудовании. Первая операционная система используется для административных целей, все остальные гостевые загружаются как обычно, включая инициализацию, загрузку ядра и т.д. Это также идеально для безопасности, поскольку гостевая ОС не может получить полного доступа к управляющей (host) ОС, что могло бы привести к дырам в безопасности.


Есть три типа виртуализации:


  • Паравиртуализация
  • Эмуляция
  • Контейнерная виртуализация

В чем разница между Registry и Repository?


Registry это сервис хранения и распространения образов, также DockerHub это Registry по умолчанию. Repository это набор связанных образов. У них одно и то же имя, но разные метки.


Можно ли использовать JSON вместо YAML в файле для docker-compose, если да как?


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


docker-compose -f docker-compose.json up

Расскажите о CMD и ENTRYPOINT в Dockerfile


Эти инструкции Dockerfile задают команду, исполняемую при запуске контейнера. При их использовании есть несколько правил, например:


  • Должна быть минимум одна из них, CMD или ENTRYPOINT, в Dockerfile.
  • Если контейнер используется как исполняемый файл ENTRYPOINT должна быть определена.
  • Если контейнер запускается с другими аргументами CMD будет переопределена.

Опишите процесс запуска приложения внутри контейнера Linux, используя Docker


  • Установите и запустите Docker;
  • Скачайте базовый образ с Docker Hub;
  • Загрузите ваше приложение в базовый образ;
  • Запустите контейнер в интерактивном режиме, используя полученный образ;
  • Проверьте контейнеры в системе;
  • Запустите или остановите контейнер;
  • Зайдите внутрь контейнера;
  • Удалите контейнер и образ.

Что такое гипервизор?


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


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

Расскажите о ключевом различии между виртуализацией и контейнеризацией


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



Расскажите об образах Docker, DockerHub, Dockerfile


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


DockerHub: сервис для поиска и совместного использования образов контейнеров. Вы можете выгружать туда свои образы, скачивать их оттуда, работать с частными репозиториями образов контейнеров, собирать автоматически образы с помощью GitHub (Bitbucket), а затем закачивать их в DockerHub. Этот сервис предоставляет компания Docker.


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


Как проверить версии Docker client и Docker server?


Версию Docker можно проверить с помощью docker version [параметры]. Если не указывать параметры, команда выдаст всю информацию, связанную с версией клиента и сервера. Чтобы получить только версию сервера, можно запустить такую команду:


docker version --format '{{.Server.Version}}'

Расскажите о процедуре входа в Docker Repository


Чтобы войти в Docker Repository, используется следующая команда:


docker login [OPTIONS] [SERVER]

Например, для входа в registry, размещенную на своих мощностях (локально), команда будет такой:


$ docker login localhost:8080

Расскажите о наиболее общих командах Docker


  • docker push: Закачать репозиторий или образ в Registry;
  • docker run: Запустить команду в новом контейнере;
  • docker pull: Скачать репозиторий или образ из Registry;
  • docker start: Запустить один или несколько контейнеров;
  • docker stop: Остановить один или несколько контейнеров;
  • docker search: Поиск образа на DockerHub;
  • docker commit: Сохранить изменения в новый образ.

Чем отличается контейнеризация в виде Docker от других технологий?


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


На каких платформах запускается Docker?


Docker работает на Windows (x86_64), Linux (x86_64, ARM, s390x, ppc64le).


Возможен ли самостоятельный перезапуск контейнера?


Да, возможен. Docker задает различные политики перезапуска контейнера:


  • Off: контейнер не перезапускается, если он остановился или аварийно завершил работу;
  • On-failure: перезапуск только в случае аварийной остановки, но не по команде пользователя;
  • Unless-stopped: перезапуск будет работать до тех пор, пока пользователь его не остановит;
  • Always: перезапуск в любом случае, независимо от ошибок или других проблем.

Политику можно задать так:


$ docker run -dit  restart [unless-stopped|off|on-failure|always] [CONTAINER]

Можно ли сравнить облака по возможностям контейнеризации с Docker?


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


Опишите все возможные состояния контейнера Docker


Created контейнер создан, но не активен.
Restarting контейнер в процессе перезапуска.
Running контейнер работает.
Paused контейнер приостановлен.
Exited контейнер закончил свою работу.
Dead контейнер, который сервис попытался остановить, но не смог.


Расскажите о средствах оркестрации и случаях их использования


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


  • Создание и развертывание контейнеров;
  • Балансировка нагрузки;
  • Разделение ресурсов между контейнерами;
  • Мониторинг контейнеров и серверов;
  • Масштабирование контейнеров;
  • Перенос контейнеров с одного сервера на другой, если на первом возникает недостаток ресурсов.

Опишите параметр memory-swap


С помощью параметра memory-swap можно разрешить контейнеру записывать на диск данные, превышающие размер оперативной памяти, выделенной контейнеру. Он работает, только если используется одновременно с параметром memory. Например, если memory = "400m" и memory-swap = "1g", то контейнер может использовать 400мб оперативной памяти и 600мб подкачки (1гб-400мб).


Где хранятся тома Docker?


Тома, создаваемые и управляемые Docker (у не-Docker процессов к ним нет доступа), хранятся в файловой системе сервера Docker по пути /var/lib/docker/volumes/. Тома наиболее эффективный способ сохранения данных в Docker.


Назовите продвинутые команды Docker


Наиболее важные из них:


docker -version: узнать установленную версию Docker;
docker ps: перечислить все запущенные контейнеры вместе с дополнительной информацией о них;
docker ps -a: перечислить все контейнеры, включая остановленные, вместе с дополнительной информацией о них;
docker exec: войти в контейнер и выполнить в нем команду;
docker build: собрать образ из Dockerfile;
docker rm: удалить контейнер с указанным идентификатором;
docker rmi: удалить образ с указанным идентификатором;
docker info: получить расширенную информацию об установленном Docker, например, сколько запущено контейнеров, образов, версию ядра, доступную оперативную память и т.п.;
docker cp: сохранить файл из контейнера в локальную систему;
docker history: показать историю образа с указанным именем.


Расскажите о командах systemd для управления Docker


Для запуска Docker многие дистрибутивы Linux используют systemd. Для запуска сервисов используется команда systemctl. Если ее нет, следует использовать команду service.


$ sudo systemctl start docker$ sudo service docker start

Чтобы добавить сервис в автозагрузку, либо убрать его:


$ sudo systemctl enable docker$ sudo systemctl disable docker

Для проверки параметров запуска сервиса и их изменения:


$ sudo systemctl edit docker

Просмотра связанных с сервисом журналов:


$ journalctl -u docker

Опишите процесс масштабирования контейнеров Docker


Контейнеры могут быть масштабированы с использованием команды docker-compose scale. Процесс масштабирования такой:


  • Масштабируем контейнер и запускаем n экземпляров:

$ docker-compose --file docker-compose-run-srvr.yml scale <service_name>=<n>

В вышеприведенном примере имя сервиса задается в файле docker-compose-run-srvr.yml, а также запускается n копий контейнеров, где n любое целое положительное число.


  • После масштабирования контейнера для проверки можно использовать такую команду:

$ docker ps -a

Что такое CNM?


CNM или Container Network Model описание, формально определяющее шаги, требуемые для предоставления сети контейнерам, где обслуживающая абстракция применяется для поддержки нескольких сетевых драйверов. CNM основан на трех компонентах: sandbox (песочница), оконечная точка и сеть.


Какие типы монтирования доступны в Docker?


  • Bind mount: подключаются к любой точке файловой системы сервера;
  • Volume mount: управляются Docker и хранятся как часть файловой системы сервера;
  • tmpfs mount: хранятся в оперативной памяти сервера, поэтому никогда не пишутся на реальную файловую систему сервера.

Расскажите о Docker Trusted Registry


Это хранилище образов для безопасного хранения и управления образами Docker. Его можно установить на своих мощностях, либо в частном облаке. DTR применятся в процессах CI/CD для сборки, поставки и запуска приложений. Его также можно развернуть в отказоустойчивом варианте, есть встроенная система управления доступом.


Каково назначение docker_host?


Он задает URL или путь к сокету unix, используемые для соединения с API Docker. Значение по умолчанию unix://var/run/docker.sock


Для подключения к удаленному серверу обычно используется TCP, например:
tcp://192.0.1.20:3230


Возможен ли запуск нескольких копий одного и того же compose файла на одном и том же сервере? Как именно?


Это можно сделать с помощью docker-compose, использующего файл YAML для настройки сервисов приложения. После его создания вы можете в одну команду создать и запустить все сервисы. Для того, чтобы начать им пользоваться:


  • Задайте окружение приложения в Dockerfile, так что оно сможет быть реплицировано везде
  • Определите все сервисы вашего приложения в файле docker-compose.yml
  • Запустите docker-compose up для создания и запуска приложения целиком

Объясните метки объектов в Docker


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


Результаты


Это был список вопросов для собеседования по Docker. Как много ответов вы знали? Просим принять участие в опросе ниже. Также рекомендуем вам ознакомиться с руководствами от сообщества


От редакции: Узнать подробно о работе с Docker и пройти практику можно с помощью видеокурса Слёрма.

Подробнее..

Категории

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

  • Имя: Макс
    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