Как я попал на стажировку в Яндекс / Хабр

Как я попал на стажировку в Яндекс / Хабр Аналитика

Introduction

Для тех кто мало знаком с системой отбора на стажировку в Яндексе расскажу вкратце. На

, за несколько месяцев до лета объявляется оплачиваемая вакансия для начинающих разработчиков, в том отделе, в котором вы бы хотели работать (i.e. Яндекс.Диск, Яндекс.Алиса). По ссылке, нужно заполнить форму, о том где Вы учитесь, чем занимаетесь, какой был опыт работы, о чем писали дипломную работы итп.

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

В тестовом задании было 6 задач разной тематики, и разной сложности. Были задачи на графы, на строки, на динамическое программирование, и Ad-Hoc о форматировании времени и чисел с плавающей точкой.

Глубже в технологии

Тем временем я понял, что мне также интересна it сфера и я начал думать, как бы мне продолжить её осваивать и что выучить в первую очередь. Уже не помню почему, но выбор пал на курсеровский курс “ HTML, CSS and JavaScript” Гонконгского университета.

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

Дополнительный анализ:  Экспресс-анализ финансового состояния компании по данным годовой бухгалтерской отчетности

Затем было много разных других курсов с курсеры, edx, степика, главным курсом первого времени был наверное знамений курс Гарвардского университета cs50 на котором я впервые познакомился с алгоритмами и структурами данных и языком си. Это был очень непростой, но интересный курс по основам computer science.

Задача 1. ошибка

Для решения данной задачи я решил использовать Java.

Алгоритм работы предельно прост: считываем a, b для n случаев, перемножаем a и b, и сохраняем результат умножения в arr[i], также суммируем результат в переменную total, чтобы посчитать чему равно 100%. Для вывода нужно просто разделить arr[i] на 100%

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

Задача 2. встречи

Условия задания

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

Формат ввода
В первой строке входного файла содержится одно число n (1 ≤ n ≤ 1000) — число запросов.

В следующих n строках содержатся запросы по одному в строке. Запросы бывают двух типов:

APPOINT day time duration k names1 names2… namesk
PRINT day name
day — номер дня в 2021 году (1 ≤ day ≤ 365)

time — время встречи, строка в формате HH:MM (08 ≤ HH ≤ 21, 00 ≤ MM ≤ 59)

duration — длительность встречи в минутах (15 ≤ duration ≤ 120)

k — число участников встречи (1 ≤ k ≤ 10)

namesi, name — имена участников, строки, состоящие из маленьких латинских букв (1 ≤ |name| ≤ 20). У всех коллег уникальные имена. Кроме того гарантируется, что среди участников одной встречи ни одно имя не встречается дважды.

Формат вывода
Если удалось назначить встречу (первый тип запросов), выведите OK.

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

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

HH:MM duration names1 names2 … namesk

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

7
APPOINT 1 12:30 30 2 andrey alex
APPOINT 1 12:00 30 2 alex sergey
APPOINT 1 12:59 60 2 alex andrey
PRINT 1 alex
PRINT 1 andrey
PRINT 1 sergey
PRINT 2 alex
Вывод
OK
OK
FAIL
alex andrey
12:00 30 alex sergey
12:30 30 andrey alex
12:30 30 andrey alex
12:00 30 alex sergey

Я потратил много времени на обдумывание решения этой задачи, перепробовал много вариантов, но так и не решил как наиболее эффективно упаковать время день количество человек. Я хотел написать struct {int day; int time_ms; string people[];}, но это бы неэффективно занимало память.

Другим вариантом было представить все дни и время линейно, и создать струтуру(meeting) которая хранит три переменные — начало встречи как (day * 24 * 60) (hour* 60 minute), конец встречи (start duration), имена людей этой встречи. Все объекты данной структуры можно упаковать в вектор(vec).

vec[i] -> start<= meeting->start && vec[i] -> end >= meeting->start
or
vec[i] -> start <= meeting->end && vec[i] -> end >= meeting->end


Если да, сказать что это время занято, если нет, добавить новый элемент в вектор.

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

Задача 3. автодополнение

Условия задания

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

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

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

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

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

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

Формат ввода
В первой строке входных данных записано одно целое число n (1 ≤ n ≤ 100 000) — количество слов, которые собирается набрать Аркадий. Во второй строке записаны n слов si (1 ≤ |si| ≤ 1000). Все слова в строке состоят только из строчных букв английского алфавита и разделены одиночными пробелами.

Суммарная длина всех слов не превосходит 1 000 000 символов.

Формат вывода
В единственной строке выведите одно целое число: количество нажатий буквенных клавиш на клавиатуре.
Пример 1
Ввод
3
hello world hello
Вывод
11
Пример 2
Ввод
5
an apple a big apple
Вывод
13
Пример 3
Ввод
5
aaaaa aaaab aaaaa abaaa abaaa
Вывод
22

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

В целом эту задачу можно разбить на два больших случая: вводится новое слово (word is not in the set) и вводится слово, которое уже вводилось ранее (word in set).

Второй случай разбивается на несколько других случаев, и проверяется 1. есть ли слова в set начинающиеся с таких же символов(символа), что и наше вводимое слово, 2. является ли наше слово subsequence какого-то другого слова в set. Как видно в коде, в каждом из случаев суммируются разное количество нажатия на клавиши в переменную count.

Задача 4. тимбилдинг

Условия задания

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

Вам дан граф, в котором каждому человеку сопоставлена ровно одна вершина. Ребро (u, v) означает, что коллега u хорошо знает коллегу v (и в то же время коллега v хорошо знает коллегу u). Проверьте, можно ли разбить вершины графа на два множества требуемым образом, и, если это возможно, выведите любое подходящее разбиение.

Формат ввода
В первой строке даны два целых числа n и m (2 ≤ n ≤ 5000, 0 ≤ m ≤ 200000) — число вершин и число рёбер в графе.

В следующих m строках даны описания рёбер — пары целых чисел a b (1 ≤ a, b ≤ n, a ≠ b), означающих наличие ребра между вершинами a и b.

Гарантируется, что каждая пара вершин соединена не более чем одним ребром, и что никакая вершина не соединена с собой.

Формат вывода
Если разбить вершины требуемым образом нельзя, выведите -1.

Иначе в первой строке выведите число k (1 ≤ k < n) — количество вершин в одной из частей разбиения.

В следующей строке выведите k чисел — вершины из этой части разбиения.

В следующей строке выведите n — k чисел — вершины из второй части разбиения.

Каждая вершина должна принадлежать ровно одной из этих частей.
Пример 1
Ввод
3 1
1 2
Вывод
2
1 2
3
Пример 1
Ввод
3 0
Вывод
-1

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

Здесь я тоже решил использовать set. А точнее, 3 Set’a: initial — где хранятся значения от 1 до n, teamA, куда будут добавляться первые звенья графа, и teamB куда будут добавляться звенья, не соедененные с teamA, а также все оставшиеся звенья в initial.

Мой алгоритм прост, но видимо, Яндекс ждал от меня большего. WA на третьем кейсе.

Задача 5. библиотека

Условия задания

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

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

Формат ввода
В первой строке входного файла даны три целых числа k, m, d — лимит на количество книг, которые можно взять в библиотеке в день, количество книг дома у Коли и сегодняшний день недели (1 ≤ k ≤ 109, 0 ≤ m ≤ 109, 1 ≤ d ≤ 7). Суббота и воскресенье обозначаются числами 6 и 7.

Формат вывода
Выведите одно число — максимальное количество дней в периоде, в течение которого Коля каждый день сможет читать столько книг, чтобы оставаться довольным.
Пример 1.
Ввод
4 2 5
Вывод
4
Пример 2.
Ввод
4 3 5
Вывод
5

Решая эту задачу, я понял как сильно мне не хватает

. Мое решение выкинуло WA на 10м тесте.

Задача 6. мобилизация

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

Условия задания

В Яндексе снова стартует проект «Мобилизация»! Компания набирает на трёхмесячную подготовку n молодых людей, увлечённых мобильной разработкой. В начале проекта был проведён тест, где скилл участника i в разработке был оценен как ai, а скилл в управлении как bi.

На время проекта участников необходимо разделить на две равные по количеству участников команды — разработчиков и менеджеров. Планируется сделать это таким образом, чтобы максимизировать суммарную пользу, приносимую всеми участниками. Если участнику достанется роль разработчика, его польза будет равняться ai, в противном случае — bi.

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

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

Формат ввода
В первой строке входного файла дано число n (2 ≤ n ≤ 2 ⋅ 105, n — чётное) — количество участников проекта. Вторая строка задаёт n целых чисел ai (0 ≤ ai ≤ 109) — скилл каждого из участников в разработке. Следующая строка в том же формате задаёт скилл участников в управлении bi (0 ≤ bi ≤ 109).

Следующая строка содержит целое число m (1 ≤ m ≤ 105) — количество принесённых участниками сертификатов. Каждая из следующих m строк содержит три целых числа numi, typei, di (1 ≤ numi ≤ n, 1 ≤ typei ≤ 2, 1 ≤ di ≤ 104) — номер участника, тип увеличиваемого скилла (1 — разработка, 2 — управление) и значение увеличения соответствующего навыка.

Формат вывода
После обработки каждого запроса на поступление нового сертификата выведите текущую суммарную пользу всех участников.
Пример 1.
Ввод
4
7 15 3 4
10 10 0 6
3
1 1 4
4 1 6
2 2 10
Вывод
34
35
43

Знакомство с кодом

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

Преподаватель был современный и за основу учебной программы взял курс по основам программирования с учебной платформы udacity. В процессе нужно было написать простенький web crawler и небольшой поисковый движок для ранжирования веб страниц по количеству ссылок на них с других веб страниц. По определённым обстоятельствам я вынужден был уйти из вуза после третьего курса и стал зарабатывать на жизнь переводами.

Первые попытки заработать на разработке

Долгое время программирование было для меня эдаким хобби и я несильно видел себя в коммерческой разработке, я проходил курсы, делал разные учебные и личные проекты, изучал разные языки программирования (Haskell, java, golang, scheme etc) и парадигмы, в общем всё это было больше в интерес.

В какой-то момент я решил попробовать сделать пару заказов на фрилансе, связанных с веб разработкой и мне удалось заработать первые деньги. После этого я начал помимо переводческой деятельности подрабатывать и веб разработкой, делал простые вещи: правки в вёрстке, подвязка сайта к crm через ajax, калькуляторы стоимостей услуг и товаров и всё в таком духе.

Смена профессии

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

Нужно было освоить какой-нибудь фреймворк, научиться тестировать код, верстать адаптивно, кроссбраузерно, валидно и семантично, освоить препроцессор для css, node js, typescript, webpack. Если до этого моё изучение программирования было в большей степени академичным, то теперь я решил взяться за дело всерьёз.

Выбор пал на react за счёт того, что это javaScript first библиотека с минимумом магии и функциональным подход в построении интерфейсов – ui, как чистая функция от состояния и свойств, переданных компоненту. На данный момент я также знаю на базовом уровне vue js, который меня восхитил своей магией и скоростью разработки, но опечалил отладкой и поиском ошибок, когда что-то ломается в шаблоне.

Хочу в крутую компанию!

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

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

Часть 1. подача заявки и я.контест

После прохождения десятка курсов на степике, я понял, что хочется применить этот опыт где-то и решил подать заявку на стажировку в Яндекс на позицию стажёра по направлению “Аналитик данных”. Зашёл на сайт, заполнил анкету, через час получил ссылку на тестовое задание в Яндекс Контест. Увидел, что даётся 6 часов на решение задач и принял решение выделить утро субботы на прохождение теста.

Тест оказался не очень сложным, было 6 задач. 2 из них на математическую статистику (задачи A и B), 2 стандартные задачи на Питоне (C и D), 1 задача на базовые знание библиотеки Pandas (E) и задача на логику и аналитическое мышление.С последними двумя задачами я справился за полчаса, с первой задачей по матстату ещё минут за 10, на вторую задачу было потрачено 20 минут, и осталось целых 5 часов на 2 задачи на питоне.

На каждую я потратил минут по 30, но в одной задаче не прошёл несколько тестов (скорее всего, условие мною было проинтерпретировано неверно), а в другой выдавал memory limit. В итоге, оптимизировать код и дорешать задачи до конца не вышло. Ещё раз проверил 4 прошлые задачи и отправил решения.

Часть 2. первое интервью

Интересный момент, что получилось провести интервью только через неделю, тк то у меня не получалось, то интервьюера. Мы созвонились в зуме, он представился, сказал, что возглавляет отдел аналитики Яндекс.Маркета, начал общение сразу на “ты”, позднее мне рекрутер сказал, что в Яндексе так принято.

Интервьюер, назовём его Сергей, рассказал как будет устроено интервью: 10 минут я должен рассказать о себе, потом ТЗ (задача на питоне) и задачи на теорвер.Я вкратце рассказал о себе, своем проекте про алгоритмы кластеризации, которым я занимаюсь в институте.

Он позадавал пару стандартных вопросов из разряда: “Почему Яндекс?”, “Какие качества мне стоит развивать?”, “Что было моим успехом?” .Далее была ТЗ: вывести список уникальных слов, считываемых из файла. Я код написал, в целом, ему важна была идея и знания синтаксиса. Всё подводные камни я разгадал у этой задачи, но не сразу. Вот сами камни:

  1. Если файл пустой

  2. Английский и русский язык (что будет?)

  3. Отделение знаков препинания

  4. Первые слова в предложении

Сергей сказал (в конце интервью), что я с задачей справился и что были ребята, которые не до всех пунктов могли додуматься(я был польщён). Далее были задачи по теорверу:

  1. Бросаем монетку 10 раз. Какова вероятность, что выпадет 10 орлов? [(1/2)^10] 

  2. Бросаем монетку 10 раз. Какова вероятность, что выпадет 9 орлов? [10*(1/2)^10]

  3. В ящике есть 4 вида носков. Носков бесконечно много. Сколько нужно изьятий, чтобы получить пару? [5]

Далее, задача на математику: “У Аркадия много жён. У него есть коллекция кактусов, которые он решил раздать всем жёнам. Первой жёне отдал 1000 кактусов и 10% от остатка. Второй жене 2000 кактусов и 10% от остатка. И так далее… Каждая жена получила поровну.

Сколько жён у Аркадия?Ход решения я тоже рассказал. Чтобы не ждать, пока я посчитаю, он мне сказал, сколько всего было кактусов и я дал ответ. [81000 всего кактусов, 9000 каждой жене]. Последней была задачка на проверку аналитических способностей:20 детям в детском садике задали вопрос: живут ли их родители вместе?

На что 2 ребёнка ответили, что не живут. На следующий день в местной газете выходит статья с заголовком: “10% семей в нашем городе в разводе”. Почему данное утверждение неверно? Всего есть 6 ключевых пунктов, до 2х последних я, к сожалению, не додумался:

  1. Дети могут быть из одной семьи

  2. Разный возраст детей, и, соответственно, разные группы, то-то более осознанный, кто-то ещё не понимает вопроса.

  3. Месторасположение садика, может выборка была только в благополучном/неблагополучном районе.

  4. У ребёнка может быть один родитель или у ребёнка может быть мачеха/отчим, отсюда неверные результаты.

  5. Дети врут.

  6. Есть семьи, где дети не ходят в садик.

После этой задачи Сергей рассказал мне как я в целом отвечал и рассказал, чем занимается отдел аналитики.У них есть 2 типа задач:

  1. Визуализация данных, представление менеджерам отчётов, в частности, работа в Tableau, то есть создание дашбордов.

  2. Прогонка данных из одного сервиса в другой

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

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

Часть 4. решение

На следующий день от рекрутера приходит письмо:

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

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

Часть 5. заключение

Пройдусь по каждому пункту.

1) Задачи на Яндекс Контесте – 9/10

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

2) Общение с рекрутером – 10/10

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

3) Первое интервью – 10/10

Первое интервью мне очень понравилось. Задачи, подсказки от Сергея, лёгкое и приятное общение.

4) Второе интервью – 5/10

Было слишком много стандартных вопросов, словесная нагрузка в начале интервью от Светланы. Считаю, что можно было кратко и менее нагружено представиться и рассказать, чем занимается отдел. Непростые вопросы на аналитику, сейчас поясню. Должен ли человек, который подаёт на позицию стажёра “Аналитик данных” знать продуктовую аналитику? Наверное, да.

5) Выводы

К сожалению, я получил только фидбек, только написанный в части 4. Проанализировав 2 интервью, я сделал вывод о том, что нужно подтянуть sql. Насчёт продуктовой аналитики я не знаю, в каждой компании свои процессы и заранее вникать в особенности ее работы, наверное, тяжело и затратно по времени. Я согласен, что если ты работаешь уже внутри, то ты обязан знать все подробности, но до этого – вряд ли.

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

Буду рад, если этот пост поможет кому-то подготовиться и попасть в Яндекс.

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

Итоге

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

Всем спасибо!

Оцените статью
Аналитик-эксперт
Добавить комментарий