Конференция Highload++ 2017 отгремела, и это было круто — как всегда. Мы пересматриваем доклады, вовсю пользуемся опытом, которым с нами поделились коллеги, и с удовольствием вспоминаем разные активности, которые проводились вне зоны докладов.


На нашем стенде, например, можно было пройти тест на знание одного из языков программирования (Python, Go, PHP) или тест для DevOps и получить красочную тематическую футболку. Сегодня хотим предложить вам ещё раз окунуться в атмосферу конференции и разобрать ответы на самые Highload-задачи из нашего теста. А может, вы сможете решить их, не заглядывая под спойлер?


Enjoy!



Топ-3 вопросов по тематикам


Python


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


cls.get_bases()

cls.__mro__ 

cls.__bro__

Это невозможно

Верный ответ
cls.__mro__ 


2. Как импортировать объект obj из модуля my_module, если он не указан в my_module.__all__ последовательности?


Это невозможно

from my_module import *

import my_module; obj = my_module.obj

from my_module import obj

Верный ответ
from my_module import obj


3. Python 2, что вернёт z[x == y]?


x = x[0] = [0]
y = y[0] = [1]
z = {(2-1, ): 'equal', (1-1, ): 'not equal'}

equal

not equal

RuntimeError

KeyError

Верный ответ
RuntimeError


Golang


1. Выберите верное утверждение для программы, запущенной с GOMAXPROCS=5:


  1. Программа не может создать более пяти потоков ОС.
  2. Количество горутин на поток не может превышать пяти.
  3. Программа не может одновременно выполняться более чем в пяти потоках ОС.
  4. Программа резервирует пять потоков ОС для эксклюзивного выполнения.

Верный ответ
Программа не может одновременно выполняться более чем в пяти потоках ОС.

2. Как в Go получить прямой доступ к ячейке памяти?


  1. Указатели в Go всегда разыменовываются при использовании, прямой доступ к памяти невозможен.
  2. Воспользоваться пакетом unsafe.
  3. Использовать встроенную функцию readMemory().
  4. Доступ возможен только в специальной системной горутине.

Верный ответ
Воспользоваться пакетом unsafe.

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


go tool pprof

go vet

go tool objdump

go profile

Верный ответ
go tool pprof



PHP


1. Какой алгоритм используется в PHP для сборки мусора?


  1. Алгоритм Бейкера.
  2. Naive mark-and-sweep.
  3. Balanced binary trees.
  4. Reference counting, tri-color marking.

Верный ответ
Reference counting, tri-color marking.

2. Что исчезло из PHP в седьмой версии?


  1. Внутренние указатели массива.
  2. Поддержка переменных в переменных внутри global.
  3. Исключения класса ParseError.
  4. Функция list().

Верный ответ
Поддержка переменных в переменных внутри global.

3. Кто спасёт, если нужно записать HTTP-заголовок после первого вызова echo в коде?


  1. Output Buffering.
  2. ACL.
  3. SPL.
  4. Opcode Cache.

Верный ответ
Output Buffering.

DevOps


1. У директории права доступа rwxrwS--t, владелец alice, группа users. ACL не используются. Выберите верное утверждение.


  1. Если пользователь root создаст в этой директории файл, то у этого файла владелец и группа будет root.
  2. Пользователь bob, не входящий в группу users, не может просмотреть содержимое файлов в этой директории, но может просмотреть содержимое самой директории.
  3. Пользователь alice может удалить из этой директории файл, принадлежащий пользователю root.
  4. Пользователь charlie, входящий в группу users, может создать в этой директории новый файл, но не может удалить из неё файл, созданный пользователем alice.

Верный вариант
Пользователь alice может удалить из этой директории файл, принадлежащий пользователю root.

2. Для чего используются физические адреса в протоколе Ethernet?


  1. Для того, чтобы обмениваться данными с устройствами в других сетях.
  2. Для того, чтобы различать кадры (2 сетевой уровень) и пакеты (3 сетевой уровень).
  3. Для определения порядка передачи данных в домене коллизий.
  4. Для того, чтобы устройства в одной сети могли обмениваться данными.

Верный ответ
Для того, чтобы устройства в одной сети могли обмениваться данными.

3. Что нужно сделать для того, чтобы nginx повторно резолвил имя backend-сервера в IP с помощью DNS?


  1. Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в переменную.
  2. Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в upstream.
  3. Вынести имя backend-сервера в upstream, добавить в upstream директиву resolve_dynamic.
  4. Указать DNS-сервера в директиве resolvers, после этого nginx автоматически будет повторно резолвить имена backend-серверов.

Верный вариант
Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в переменную.

Топ участников


Итоги были такие. Тест начали проходить 273 человека. Некоторые не закончили его (нельзя сказать, что им не дало закончить — интересный доклад, сомнение в своих силах или слабая связь). Максимальное количество баллов, которые можно было набрать по всем четырём направлениям — 60.



Ну а вот топ-5 реальных героев. Ребята, знайте — вы круче всех.


  1. Святослав Думченко — 39 баллов
  2. Вячеслав Злодеев — 37 баллов
  3. Владимир Протасов — 24 балла
  4. Светлана Шагалина — 24 балла
  5. Илья Лебедев — 22 балла

Вот футболки, которые получили 50 лучших по каждому направлению:



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

Комментарии (13)


  1. JekaMas
    12.01.2018 15:38

    Golang, первый вопрос… Делаем cgo вызов или osThreadLock и удивляемся тому, что потоков может быть больше заданного.


  1. vesper-bot
    12.01.2018 15:43

    Угадал 8 из 12. Как-то нелогично. Знал из этого дай Бог один (про Ethernet), подозревал ещё один (про заголовки после echo). Остальное просто по логике и рандомом.


  1. ushliy
    12.01.2018 15:48
    +1

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


    1. r3nic1e
      13.01.2018 00:26

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


  1. KorP
    12.01.2018 16:19
    +2

    Ну всё верно — питон ещё учить и учить, php откуда то с подкорки или интуитивно, уж не знаю :) голанг пропустил, а вот девопс 2 из 3… ну с правами в линуксе у меня сложности, не запоминаю, ибо редко пользуюсь
    А футболки топовые! Хотел бы верхние 2 :)


  1. KirEv
    13.01.2018 03:28

    интересно узнать полный список вопросов, по Go в частности =)


    1. SerafimArts
      13.01.2018 03:36

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


  1. nomadmoon
    13.01.2018 16:24

    Сделайте авторизацию через госуслуги, пожалуйста


  1. Rinnve
    13.01.2018 19:38

    Python, 3-й вопрос.

    x = x[0] = [0]

    Как это работает? Если x уже определена как список, x = x[0] зациклит его, это-то понятно. Но здесь x ещё не существует, и при этом успешно используется в правой части!


    1. alvassin
      15.01.2018 11:31

      Интересный пример) модуль dis показывает что сначала ссылка на список (DUP_TOP) присваивается переменной x (STORE_FAST), а только потом уже идет зацикливание (STORE_SUBSCR):

      In [1]: def f():
      ...: x = x[0] = [0]
      ...:

      In [2]: f.__code__.co_consts
      Out[2]: (None, 0)

      In [3]: f.__code__.co_varnames
      Out[3]: ('x',)

      In [4]: from dis import dis

      In [5]: dis(f)
      2 0 LOAD_CONST 1 (0)
      2 BUILD_LIST 1
      4 DUP_TOP
      6 STORE_FAST 0 (x)
      8 LOAD_FAST 0 (x)
      10 LOAD_CONST 1 (0)
      12 STORE_SUBSCR
      14 LOAD_CONST 0 (None)
      16 RETURN_VALUE

      Работает только с мутабельными объектами)


  1. ALexhha
    13.01.2018 22:20

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


  1. el777
    14.01.2018 00:51

    Ошибся в 1 вопросе — про nginx DNS, и, можно сказать, случайно угадал про Python 2 z[x == y] (уж сильно мутная конструкция :))


  1. nukler
    15.01.2018 12:47

    Интересно было бы послушать не сами вопросы, а именно как они применяются на практике.
    Вопрос: Чему равно x = 2 в случае если x объявлен как str().
    x = str()
    x = 2
    Назначение вопроса: В этом вопросе мы хотели узнать такие то такие то вещи, для того что бы понять это, то.
    Применяется: Для того то, для того то.

    А то получается, мы хотим определить у Ваш уровень, то вдруг Вы полы мыть не сможете.

    Заранее спасибо.