Конференция 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:
- Программа не может создать более пяти потоков ОС.
- Количество горутин на поток не может превышать пяти.
- Программа не может одновременно выполняться более чем в пяти потоках ОС.
- Программа резервирует пять потоков ОС для эксклюзивного выполнения.
Программа не может одновременно выполняться более чем в пяти потоках ОС.
2. Как в Go получить прямой доступ к ячейке памяти?
- Указатели в Go всегда разыменовываются при использовании, прямой доступ к памяти невозможен.
- Воспользоваться пакетом unsafe.
- Использовать встроенную функцию readMemory().
- Доступ возможен только в специальной системной горутине.
Воспользоваться пакетом unsafe.
3. Какая команда пригодится для поиска узких мест в программе?
go tool pprof
go vet
go tool objdump
go profile
go tool pprof
PHP
1. Какой алгоритм используется в PHP для сборки мусора?
- Алгоритм Бейкера.
- Naive mark-and-sweep.
- Balanced binary trees.
- Reference counting, tri-color marking.
Reference counting, tri-color marking.
2. Что исчезло из PHP в седьмой версии?
- Внутренние указатели массива.
- Поддержка переменных в переменных внутри global.
- Исключения класса ParseError.
- Функция list().
Поддержка переменных в переменных внутри global.
3. Кто спасёт, если нужно записать HTTP-заголовок после первого вызова echo в коде?
- Output Buffering.
- ACL.
- SPL.
- Opcode Cache.
Output Buffering.
DevOps
1. У директории права доступа rwxrwS--t, владелец alice, группа users. ACL не используются. Выберите верное утверждение.
- Если пользователь root создаст в этой директории файл, то у этого файла владелец и группа будет root.
- Пользователь bob, не входящий в группу users, не может просмотреть содержимое файлов в этой директории, но может просмотреть содержимое самой директории.
- Пользователь alice может удалить из этой директории файл, принадлежащий пользователю root.
- Пользователь charlie, входящий в группу users, может создать в этой директории новый файл, но не может удалить из неё файл, созданный пользователем alice.
Пользователь alice может удалить из этой директории файл, принадлежащий пользователю root.
2. Для чего используются физические адреса в протоколе Ethernet?
- Для того, чтобы обмениваться данными с устройствами в других сетях.
- Для того, чтобы различать кадры (2 сетевой уровень) и пакеты (3 сетевой уровень).
- Для определения порядка передачи данных в домене коллизий.
- Для того, чтобы устройства в одной сети могли обмениваться данными.
Для того, чтобы устройства в одной сети могли обмениваться данными.
3. Что нужно сделать для того, чтобы nginx повторно резолвил имя backend-сервера в IP с помощью DNS?
- Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в переменную.
- Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в upstream.
- Вынести имя backend-сервера в upstream, добавить в upstream директиву resolve_dynamic.
- Указать DNS-сервера в директиве resolvers, после этого nginx автоматически будет повторно резолвить имена backend-серверов.
Указать DNS-сервера в директиве resolvers, вынести имя backend-сервера в переменную.
Топ участников
Итоги были такие. Тест начали проходить 273 человека. Некоторые не закончили его (нельзя сказать, что им не дало закончить — интересный доклад, сомнение в своих силах или слабая связь). Максимальное количество баллов, которые можно было набрать по всем четырём направлениям — 60.
Ну а вот топ-5 реальных героев. Ребята, знайте — вы круче всех.
- Святослав Думченко — 39 баллов
- Вячеслав Злодеев — 37 баллов
- Владимир Протасов — 24 балла
- Светлана Шагалина — 24 балла
- Илья Лебедев — 22 балла
Вот футболки, которые получили 50 лучших по каждому направлению:
А вам удалось решить задачи, не глядя под спойлер? Пишите в комментариях.
И, конечно, до следующих встреч!
Комментарии (13)
vesper-bot
12.01.2018 15:43Угадал 8 из 12. Как-то нелогично. Знал из этого дай Бог один (про Ethernet), подозревал ещё один (про заголовки после echo). Остальное просто по логике и рандомом.
ushliy
12.01.2018 15:48+1Черт, решил, что вопросы будут довольно сложными, решил не тратить время и пробежал мимо. Теперь жалею о недополученной футболке
r3nic1e
13.01.2018 00:26Я тоже сначала думал, что вопросы будут сложноваты. А в 3 ночи не мог уснуть и решил хотя бы в одной категории пройти тестик.
Хотя для меня большинство вопросов в итоге решались логикой, а не знаниями.
KorP
12.01.2018 16:19+2Ну всё верно — питон ещё учить и учить, php откуда то с подкорки или интуитивно, уж не знаю :) голанг пропустил, а вот девопс 2 из 3… ну с правами в линуксе у меня сложности, не запоминаю, ибо редко пользуюсь
А футболки топовые! Хотел бы верхние 2 :)
KirEv
13.01.2018 03:28интересно узнать полный список вопросов, по Go в частности =)
SerafimArts
13.01.2018 03:36Присоединяюсь, но хотелось бы по PHP, т.к. по крайней мере в его «Top» попали какие-то уж совсем элементарные, а я не считаю себя гуру этого языка.
Rinnve
13.01.2018 19:38Python, 3-й вопрос.
x = x[0] = [0]
Как это работает? Если x уже определена как список, x = x[0] зациклит его, это-то понятно. Но здесь x ещё не существует, и при этом успешно используется в правой части!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
Работает только с мутабельными объектами)
el777
14.01.2018 00:51Ошибся в 1 вопросе — про nginx DNS, и, можно сказать, случайно угадал про Python 2 z[x == y] (уж сильно мутная конструкция :))
nukler
15.01.2018 12:47Интересно было бы послушать не сами вопросы, а именно как они применяются на практике.
Вопрос: Чему равно x = 2 в случае если x объявлен как str().
x = str()
x = 2
Назначение вопроса: В этом вопросе мы хотели узнать такие то такие то вещи, для того что бы понять это, то.
Применяется: Для того то, для того то.
А то получается, мы хотим определить у Ваш уровень, то вдруг Вы полы мыть не сможете.
Заранее спасибо.
JekaMas
Golang, первый вопрос… Делаем cgo вызов или osThreadLock и удивляемся тому, что потоков может быть больше заданного.