Заметки по итогам университетского Дня карьеры
Здравствуй, %username%!
Известное выражение «Кадры решают всё» в ИТ-компаниях актуально, как ни в какой другой отрасли. На тему подбора персонала написано много, а мы хотели бы сосредоточиться на таком явлении, как вузовский «День карьеры». Недавно нам довелось поучаствовать в подобном мероприятии на факультете ВМК МГУ. В этом посте мы хотим поделиться некоторыми впечатлениями от увиденного.
Содержание
Часть первая, организационная
Как известно, заполучить грамотного профессионала работодателю можно, пойдя по двум направлениям:
- найти на рынке готового специалиста;
- самостоятельно «вырастить» сотрудника с требуемыми компетенциями.
Оба пути имеют свои достоинства и недостатки. Большинство компаний (и мы в их числе) в своей работе сочетают указанные подходы. И если с поиском подготовленного профессионала всё более-менее понятно, то где брать молодого да раннего, способного за приемлемое время дорасти до нужного уровня?
В этом плане определённые преимущества есть у компаний, имеющих налаженные связи с вузами. Эксперт, читающий спецкурс или руководящий дипломным проектированием, безусловно найдёт контакт и наладит общение с подающим надежды студентом. Но этот вариант ни разу не массовый и развёрнут во времени на долгие месяцы.
Чтобы расширить потенциальную «зону контакта» между будущими работниками и потенциальными работодателями, придуманы «дни карьеры» — такие специальные мероприятия, на которых обе стороны процесса могут быстро понять кто чего стоит и завязать отношения, которые при должном внимании и ответственности могут стать долгими и счастливыми.
В общем, если «дни карьеры» существуют, то не грех ими воспользоваться. Мы решили поработать на факультете ВМК МГУ, а при положительном опыте – распространить его и на другие учебные заведения.
Работодателю стать участником Дня карьеры несложно. Эти мероприятия заранее анонсируются, их организовывают специально назначенные люди — в нашем случае это были специалисты Центра трудоустройства ВМК. После коротких переговоров мы оказались в составе компаний-участников Дня карьеры-2014 (всего таких компаний оказалось шестнадцать).
Времени на подготовку обычно много не бывает. Здесь очень хорошим подспорьем является опыт участия в выставках, форумах, конференциях и других подобных публичных мероприятиях. Точка присутствия компании на Дне карьеры – это стенд с её представителями, рекламными материалами и оборудованием. Только рекламируются на стенде не продукты и услуги, а сама организация как работодатель. Ну и конечно стенд – это то место, где можно присмотреться к потенциальному контингенту начинающих специалистов.
«Открывать Америку» в вопросах подготовки стенда не собираемся. Разве что специфика материалов должна быть соответствующей – идя на День карьеры, работодатель должен запастись как минимум описаниями вакансий и стажировок, которые он может предложить интересующимся. Некоторые наши коллеги выдавали для заполнения желающим бланки анкет – тоже грамотное решение. Всякие сопутствующие плюшки типа небольших корпоративных сувениров, конфет и печенек конечно же приветствуются благодарным студенческим сообществом.
Большим плюсом будет присутствие на стенде симпатичной доброжелательной девушки. Кроме шуток, многим застенчивым студенткам (на ВМК есть и такие!) комфортнее начать общение именно с дамой, нежели с присутствующим здесь же мужественным небритым ИТ-бруталом.
Конечно, надо заранее подготовиться к ответам на вопросы «Чем занимается компания», «Каковы условия работы», а также «Какого цвета стулья в офисе» (ага, ровно такие вопросы советуют задавать здесь.
В принципе, работа представителей компании на Дне карьеры складывается из очевидных вещей – общение, ответы на вопросы, обмен контактами etc. Так что позвольте сюда больше не углубляться, а сказать пару слов о фишках.
Часть вторая, практическая
Чтобы эти обоюдные смотрины были (а) более продуктивными и (б) более интересными — мы на описываемом мероприятии решили устроить небольшие технические конкурсы для посетителей Дня карьеры. Для компании – простейший фильтр, отбирающий активных и сообразительных, для посетителей – возможность себя показать, мозги размять да приз (sic!) получить.
Конкурсные задания мы придумали из трёх различных областей, представляющих интерес для нас как для работодателя. Первое задание было посвящено работе с соцсетями, второе — безопасности беспроводных ЛВС, а третье – восстановлению информации на носителе. Уровень сложности при составлении заданий для себя определили как в целом невысокий, т.к. всё происходит параллельно учебному процессу и достаточным временем для соревнований мало кто располагает.
По просьбам посетителей стенда публикуем информацию по конкурсам.
Конкурс первый. «ВМК в ВК»
Сразу скажем, что, несмотря на наши ожидания, это задание не стало хитом. Возможно, студенты посчитали сложной самую первую задачу из предложенного перечня, а может причина в чём-то ещё. Конкурс предполагал ряд задач на построение и анализ социального графа (у этой штуки масса применений в маркетинге). Граф собирались формировать на основе данных, которые о себе предоставили пользователи одной из популярных социальных сетей.
Итак, стартовой задачей конкурса «ВМК в ВК» был сбор исходных данных для социального графа. Звучала она так:
Напишите или найдите приложение, которое позволит вам получить из социальной сети «Вконтакте» список студентов ВМК МГУ вашего года выпуска, сведения из их профилей (как минимум — имя, фамилию и пол) и их связи между собой.
Поскольку для сбора данных из «Вконтакте» можно использовать API, предполагалось, что участники пойдут по следующему пути. Сначала — регистрируем Standalone приложение по ссылке. После создания приложения откроется страница с информацией о нём, в URL страницы указан ID приложения, его также можно найти на вкладке «Настройки». Для авторизации приложения и получения токена нужно открыть страницу, подставив вместо %ID%
полученный ID приложения
http://oauth.vk.com/oauth/authorize?client_id=%ID%&response_type=token&_hash=0
адресная строка будет иметь вид
http://oauth.vk.com/blank.html#access_token=%TOKEN%&expires_in=86400&user_id=%UID%
Значение %TOKEN%
необходимо сохранить для дальнейшего использования.
Авторизация нужна для использования метода users.search
для поиска заданных пользователей. Списки друзей пользователей можно получать без авторизации по ссылке https://api.vk.com/method/friends.get?user_id=%UID%
в JSON.
Для работы с API можно использовать Ruby-библиотеку VK-ruby. Приведённый ниже простенький скрипт предназначен для получения информации о пользователях, указавших ВМК МГУ в качестве факультета обучения, и их друзьях (что-то подобное мы ожидали увидеть у участников). Собираются данные для пользователей, указавших 2012-2021 год выпуска.
require 'open-uri'
require 'vk-ruby'
require 'json'
token = "%TOKEN%"
(2012..2021).each do |year|
app = VK::Application.new access_token: "#{token}"
users = []
offset = 0
begin
us = app.users.search(university: 2, university_faculty: 23, university_year: year, count: 1000, fields: 'sex', offset: offset)
users += us[1..-1]
offset += 1000
end while us.length > 1
cmc_uids = Set.new users.map{|u| u['uid']}
users.map! do |u|
uid = u['uid']
page = open("https://api.vk.com/method/friends.get?user_id=#{uid}").read
friends_ids = Set.new JSON.parse(page)['response']
u['friends'] = friends_ids.to_a
cmc_friends = friends_ids.intersection cmc_uids
u['cmc_friends'] = cmc_friends.to_a
u
end
File.open('cmc_' + year.to_s + '.json', 'w') { |file| file.write(users.to_json.gsub(/,{/, ",n{")) }
end
Данные сохраняются в JSON формате, имеющем следующий вид
[{"uid":%UID%,
"first_name":"%ИМЯ_ПОЛЬЗОВАТЕЛЯ%",
"last_name":"%ФАМИЛИЯ_ПОЛЬЗОВАТЕЛЯ%",
"sex":%ПОЛ%,
"friends":[%ID_ДРУЗЕЙ%],
"cmc_friends":[%ID_ДРУЗЕЙ_С_ВМК_ТОГО_ЖЕ_ГОДА_ВЫПУСКА%]},...]
Для дальнейшего использования средств графового анализа (а это почти все оставшиеся задачи конкурса «ВМК в ВК») необходимо преобразовать собранные данные в другой формат. Приведённый ниже код позволяет получить список рёбер графа друзей пользователей для каждого из указанных годов выпуска.
require 'json'
require 'csv'
(2012..2021).each do |year|
users = JSON.parse File.read('cmc_' + year.to_s + '.json')
names_hash = Hash[users.map{|u| [u['uid'], "#{u['last_name']} #{u['first_name']}"]}]
sex_hash = Hash[users.map{|u| [u['uid'], u['sex']]}]
res = users.map do |u|
u['cmc_friends'].map do |id2|
["#{u['last_name']} #{u['first_name']}", u['sex'], u['uid'], id2]
end
end.flatten(1)
CSV.open("#{year}.csv", 'w'){|csv| res.each{|u| csv << u}}
end
Каждая строчка полученных CSV файлов будет иметь следующий формат
%ИМЯ_ПОЛЬЗОВАТЕЛЯ%,%ПОЛ%,%ID_ПОЛЬЗОВАТЕЛЯ%,%ID_ДРУГА%
Данные такого формата могут быть загружены в большинстве средств графового анализа.
(В принципе, мы провели работу по получению этих данных заранее и были готовы поделиться ими на стенде. Подсказки анонсировались, но очередь за ними не стояла – вот тебе и интерес к социальным сетям со стороны современной молодёжи)
Задача №2 предполагала выполнение минимального анализа полученных данных: гендерный состав, пользователи с наибольшим числом друзей, среднее число друзей у пользователя. Ожидалось, что задача будет решаться с помощью простеньких скриптов. Подходов к их написанию много, не будем заострять на этом внимание. Цимес задачи (и дополнительные баллы) — в другом. Где же тот аналитик, который подошёл бы к нам и сказал: «Да здесь же немеряно ботов и каких-то левых личностей?» Этот вывод в общем-то прост, достаточно повнимательнее посмотреть на собранные сведения, а точнее – на перечни «друзей».
Как видно из названия, задача №3 — «Урок рисования» — состояла в визуализации нажитого непосильным трудом при решении первой задачи. «Наверное, все будут использовать Gephi, проблем быть не должно» — подумали мы. Но не срослось. Изображения социального графа ВМК в ВК от наших конкурсантов мы так и не дождались. Кстати, в качестве примера для участников демонстрировались социальные графы действующих курсов факультета, отрисованные в i2 Analyst’s Notebook (в отличие от бесплатного Gephi это коммерческий продукт от IBM).
А вообще при желании можно было найти и другие инструменты для визуализации социального графа.
Наконец, заключительная задача №4 этого конкурса была наиболее «математической»: диаметр максимальной компоненты связности графа, плотность графа, метрики центральности вершин, центральность по собственному вектору, центральность по «промежуточности»… Всё тот же Gephi в помощь, а точнее – его встроенные инструменты для анализа социального графа.
Вывод по первому конкурсу такой: несмотря на ожидаемую личную заинтересованность («да это же про нас!») и общий интерес к теме соцсетей — задания «не пошли». То ли времени погуглить и немного покодить было маловато, то ли задание показалось излишне академичным. А может интерес перебили другие конкурсы – там-то предлагалось аж негодяев-террористов отлавливать да головоломки на флэшке решать!
Конкурс второй. «Алекс-Юстасу»
Как следует из задания, собака зарыта в беспроводной сети. Эту сеть мы развернули на период проведения Дня карьеры в вестибюле факультета. По сети гоняли (по протоколу HTTP) с одного ноутбука на другой рисунки в формате GIF. Картинки являли собой QR-коды, в которых скрывались координаты «объектов интереса» в Москве и Санкт-Петербурге (например, Дом Правительства РФ, аэропорт Шереметьево, МИД, Лужники, ВВЦ, крейсер «Аврора» и так далее, заканчивая Московским зоопарком). За повторение передачи серии из 20 рисунков с периодичностью раз в 30 секунд отвечал небольшой скрипт.
Дальнейшее кул-хацкерам и ветеранам вардрайвинга может быть не очень увлекательно, а для тех, кто «угадал все буквы, но не смог назвать слово» — небольшой комментарий.
Включив WiFi-адаптер на ноутбуке и попробовав «послушать эфир», конкурсанты, взявшиеся за это задание, легко обнаруживали незащищённую WiFi-сеть с названием vulkan. Для перехвата открытого трафика в WiFi-сети предполагалось использование конкурсантами инструментария типа Wireshark, tcpdump и тэдэ. Рассказывать о том, как пользоваться этим ПО, здесь пожалуй не совсем уместно, проще посмотреть сюда и сюда.
После перехвата трафика в нём можно было обнаружить рисунки следующего вида:
Дальнейшим логичным шагом является распознавание полученных QR-кодов и получение информации о географических координатах (широта и долгота) объектов. На финальном этапе – вводим координаты в поисковик или в гео-сервис, получаем точку на карте и…
Алекс не зря надеялся на Юстаса. Поздравляем победителей! Кстати, зоопарк кажется никто так и не спас.
Конкурс третий. «Прятки на флэшке»
Этот конкурс оказался едва ли не самым популярным. Возможно потому, что в придачу к листовке с заданием конкурсанту вручалась флэшка. Да и задание умещалось в одно предложение: в недрах флэшки «заботливо» спрятаны файлы: изображение, текст и архив – найдите их! Но за кажущейся простотой скрывался реальный взрыв мозга. Почему?
При подготовке конкурса надо было придумать, как прятать информацию. Высказывались разные идеи: сделать «потерянный» раздел на носителе и сохранить в него информацию, сделать стеганоконтейнер из картинки… Необходимым условием было совмещение «открытой» информации (нашей рекламы, да) и «спрятанной». Мы остановились на идее, когда информация записывается за пределами раздела. Для упрощения поиска информации носитель должен быть изначально проинициализирован нулями. Мы решили записать часть информации перед разделом, а часть после. Касательно подходов к восстановлению – определили три уровня сложности: восстановление в автоматическом режиме (при помощи утилит восстановления данных), вручную (hex-редакторы дисков) и на десерт — простенькая стеганография.
Объектом первого уровня сложности стал jpeg-файл. Его «положили» в 1024 сектор от окончания партиции в виде непрерывного блока. В конце концов, на фоне нулей он должен был быть заметен.
Объектом для ручного восстановления стал текст (позаимствовали некоторые перлы на bash.im). Причём текст — фрагментированный. В конце каждого фрагмента мы записали номер сектора, в котором находится следующий фрагмент. Чтобы задание не показалось слишком простым, для основного текста использовали Unicode, а указатель на следующий сектор представили в виде десятичного номера в ASCII. В качестве стартового сектора для цепочки взяли сектор №1024. Тут нужно сказать, что раздел у нас начинался с сектора №2048. Мы разместили фрагменты в следующей цепочке: 1024=> 964=> 475=> 235=> 1800=> 1720=> 823=> 615=> 1100=> 1920=> 345=> 1418=> 1634=> 1980=> 1320. В первом фрагменте оказался текст «Vulkan — задание.», а в конце –информация о том, что «Вот Вы и дошли до конца задания…»
Объект третьего уровня сложности — архив rar, дописанный в конец jpeg-файла. Как известно, архиватор rar ищет свою начальную сигнатуру по всему файлу, что позволяет сохранить rar-архив в конце произвольного файла, например jpeg. При автоматическом восстановлении jpeg размер файла будет определён по заголовку, а остальное будет отсечено, и только любознательные смогут определить наличие архива. В архив мы положили документ «Vulkan.docx» с цитатой из уважаемого всеми айтишниками А.С. Пушкина. В последний момент мы решили запаролить архив словом «Vulkan» (фраза «Вулкан — «ключ» ко всему» как намёк на пароль к архиву и начальный фрагмент была размещена на листовке с заданием).
Мы предполагали, что участники конкурса сначала восстановят картинку, потом текст, а там и до архива рукой подать. Но понимая, что в условиях ограниченности времени что-то могло «пойти не так» — подготовили несколько подсказок.
Вторая подсказка указывала на необходимость анализа носителя при помощи дисковых hex-редакторов (некоторые из них были перечислены в качестве примера).
Третья подсказка говорила, что в начале диска находится MBR, в котором указываются свободные и занятые сектора. Мы надеялись, что участники обратят внимание на интервал с 1 по 2047 сектор, в котором «вдруг» оказались данные.
Четвёртая подсказка говорила о том, что текстовый документ может представлять собой последовательность символов в какой-нибудь кодировке.
Пятая подсказка говорила о том, что символы можно представить как в UNICODE, так и в ASCII. Переключение между видами отображения кодировок в HEX-редакторе должно было помочь увидеть текст и цифры в конце. Для привлечения внимания использовался символ «=».
Шестая подсказка говорила о том, что в любой файловой системе задаётся последовательность, в которой считывают сектора, и ещё раз было напоминание про пятую подсказку и необходимость поиска начального фрагмента.
Просмотр hex-редакторами открытого раздела (подсказка №2) должен был показать участникам отсутствие дополнительной информации в открытом разделе и подтолкнуть к поиску за пределами раздела (подсказка №3). Начало раздела с 2048 сектора должно было обратить внимание на участок с 1 по 2047 сектор. Конечно, кто-то мог случайно натолкнуться на блок данных, но таких случайностей мы не ждали. Так как носитель был «явно обнулён», то нужно было сравнить этот участок с нулевой областью. Тогда участник сразу увидит сектора с данными. Для упрощения интерпретации данных были сделаны подсказки 4 и 5. Подсказка 6 помогала в конце UNICODE-части перейти на ASCII.
Седьмая подсказка указывала различные типы файлов и их сигнатуры. Среди них указывалась сигнатура rar-архива.
Восьмая подсказка указывала на начальные сектора текстового файла и jpeg-файла.
Девятая подсказка – повтор «намёка» из листовки-задания: «Vulkan – «ключ» ко всему!»
Поиск сигнатуры rar-архива должен был привести участников к концу jpeg-файла. Окончание архива можно было определить по последовательности нулей, записанных в конце. Выделив архив, участники должны были столкнуться с необходимостью указать правильный пароль (девятая подсказка в помощь).
В общем да, организаторы явно намудрили)
В конкурсе решило участвовать несколько десятков человек. Попробовав сходу найти информацию самостоятельно, студенты стали организовывать команды из двух-трёх человек. Кто-то пошёл с заданием на лекцию, а потом пожаловался, что на занятии запретили «играться» на ноутбуках. Дефицит времени был на лицо…
Какие результаты? Объект первого уровня сложности нашли два одиночных участника и три творческих дуэта. Объект второго уровня не дался никому. И наконец одна команда была близка к нахождению третьего объекта за 10 минут до подведения итогов, однако у ребят возникла проблема с определением конца файла.
Тем не менее награды нашли своих героев — участников, добившихся наилучших результатов – как в этом, так и в двух других конкурсах.
Закончилось всё баней и шашлыком мини-лекцией о низкоуровневой работе с машинными носителями.
Заключение
Считаем, что мероприятие удалось. Атмосфера — душевная, интерес – неподдельный. Итоги станут понятны позднее, но уже можно сказать, что при должной подготовке подобные встречи могут быть очень продуктивными. Дни карьеры привлекают буквально всех – от первокурсников до дипломников. Нам даже довелось пообщаться с выпускником позапрошлого года, который решил поискать для себя что-то новое на Дне карьеры родного факультета.
Честно говоря, в это мероприятие мы постарались вложить частичку нашей айтишной души. Надеемся, что все остались довольны и пользу от произошедшего получили немалую.
Автор: bejibx