Делюсь впечатлениями как я поучаствовал в конкурсе Яндекс "One Day Offer Frontend". Суть в том, что надо пройти онлайн соревнование - решить за 3часа 5 задач, можно частично. Задачи на алгоритмы и верстку на 5, 45, 70, 90 и 90 баллов. Надо набрать >=100 баллов и тогда будет уже онлайн собес с людьми 25 сентября и оффер в одну из команд Я.Такси, Маркет или Поиск если все будет ОК.

Итак, мне на почту упало письмо от Я с предложением поучаствовать

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

Для начала решил подготовиться

В письме была классная ссылка как проходят собесы в Я у фронтов: https://yandex.ru/recruitment-guide/frontend

Почитал теорию по структурам данных и алгоритмам (списки, деревья, графы, рекурсия, сортировки), освежил как считать оценку сложности, посмотрел видосики и порешал задания в тестовом контесте: https://contest.yandex.ru/contest/8458/problems/

Задачи из тестового соревнования:
A. Камни и украшения
B. Последовательно идущие единицы
C. Удаление дубликатов
D. Генерация скобочных последовательностей
E. Анаграммы
G. Интересное путешествие

Решил задачи A-E. Задача G была на поиск минимального пути в графе с доп условием. В принципе, ясно как решать - надо нагуглить и реализовать алгоритм: https://ru.wikipedia.org/wiki/Задача_о_кратчайшем_пути Но время поджимало, поэтому решил стартовать без него.

Еще пару скринов с решения

Мысли по результатам тестовых задач

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

  2. Надо прям очень сильно не тупить, сразу врубаться в задачу, накидать на бумажке варианты решения, посчитать сложность выбранного алгоритма (O(n!) - ужасно, O(n^2) - плохо, O(logN) - отлично, O(1) - вы божественны!) и решать задачу сразу правильно оптимальным способом.

  3. Перед тем, как решать задачи кратко просмотреть их все, чтобы понять, какие осилишь, чтобы не тратить время на нерешаемые/трудоемкие варианты.

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

  5. Код на JS лучше писать тут: https://jsfiddle.net Там у меня не заработало полное решение, как его нужно было подавать в окно в Я.Контесте (со всеми этими "Напишите CommonJS-модуль c экспортируемой функцией" или "представьте себе, что с клавиатуры вам ввели символы"). Но в Я.Контесте можно написать "обвязку/каркас" решения, т.е. такой код:

    module.exports = function (str, symbol) {
    let result = 0;
    return result;
    }


    ... А затем вынести функцию и только эту функцию отладить в фиддлере:

    function countSymbol(str, symbol) {
    //debugger;
    var regex = new RegExp(symbol, 'g');
    let result = (str.match(regex) || []).length;
    return result;
    }


    ... И вставить ее назад в окно решений контеста.

  6. Лучше использовать браузер Хром, там точно работает дебаггер. Или надо написать самому в коде, чтобы остановилось где надо: debugger; Или вот так можно подебажить окно фиддлера: https://stackoverflow.com/questions/19460046/how-to-debug-the-js-in-jsfiddle Хотя как там у меня не сработало, поставил debugger; и у меня Хром сам остановился на странице с моим кодом: /_display/?editor_console=true А далее уже по F10 можно прыгать по брейкпоинтам куда надо.

  7. Лайфхак от меня (дарю!). Даже на очень-очень сложных задачах можно набрать баллы за частное решение за 5 секунд. Надо всего-то написать не код, решающий задачу, а код, проходящий часть тестов. Например, на сложной задаче на 90 баллов, которая должна принимать на входе json со структурой проекта (модули и тесты), где надо было выдать список тестов к измененным модулям я сразу закинул такое решение:

    module.exports = function (input) {
    return [];
    }


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

  8. Суперполезный совет в видео от разраба Я - начинать решение задачи с написания набора тестов.

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

    Что-то в этом роде:

    let lines = ['qiu','iuq'];
    const [one, two] = lines;
    console.log(one);
    console.log(two);

    function areAnagrams(one, two) {
    let result = false;
    return result;
    }

    console.log(areAnagrams('qiu','iuq') == true);
    console.log(areAnagrams('q','q') == true);
    console.log(areAnagrams('','') == true);
    console.log(areAnagrams('zprl','zprc') == false);
    console.log(areAnagrams('zprl','z') == false);

    или так:
    function getTests(input) { return []; }

    console.log(JSON.stringify(getTests({})) == JSON.stringify([]));
    console.log(JSON.stringify(getTests({a: 'что то более сложное'})) == JSON.stringify(['/var/www/projects/project1/src/specs/1.js']));

  9. Фрустрация - даже правильно решенные задачи (как у меня пробные задачи C и D) могут признаваться ошибочными (и давать 0 баллов) с вердиктом: ML: Превышен лимит использования памяти. Т.е. кроме правильного решения надо писать еще и оптимально с т.з. памяти.

  10. Фрустрация 2 - для некоторых задач можно потерять уйму времени на то, чтобы закинуть в окно решения просто компилящееся без ошибок решение, пусть даже оно и выдает неверный результат. Имхо, тут перемудрили разрабы Я. Если проверяется знание алгоритмов, то лучше не заставлять угадывать, в каком виде ожидается результат, а дать сразу заготовку результата с пустым ответом такого вида:

    module.exports = function (input) {
    let result = [];
    return result;
    }


    или так:

    function generate(count) { return '((()))'; }

    const readline = require('readline');
    const rl = readline.createInterface({
    input: process.stdin
    });

    let lines = [];
    rl.on('line', (line) => {
    lines.push(line);
    }).on('close', () => {
    const [count] = lines;
    generate(count);
    });

    или так:

    class TaskManager {}
    module.exports = { TaskManager };


    Иногда, если сразу не можешь выдать компилящееся без ошибок решение, то нет смысла даже решать задачу, т.к. потратишь время, а баллов все равно наберешь 0. Так у меня произошло с последней задачей в реальном контесте «Джаваскриптович». Хотя, возможно, так и задумано. Если слишком много людей успешно решают задачи в контесте, то проблема с вводом/выводом данных - это доп условие, по которым, скажем, 30% отваливаются и до рекрутера доходят самые упор[н/от]ые :)


Теперь, собственно, сам процесс реального соревнования

Надеюсь, лонгрид вас еще не утомил.

Итак, 3 часа, 5 задач, минимум 100 баллов.

Были задачи:
A. Подсчитать количество вхождений символа в строку [5 баллов]
B. Ход конём [45 баллов]
C. Принцип «одного окна» [70 баллов]
D. Слишком надежный проект [90 баллов]
E. Межгалактический исследователь «Джаваскриптович» [90 баллов]

Текст задач и свой код по нему не даю, т.к.:

  1. задачи - интеллектуальная собственность Я

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

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

Поэтому объясню все словами на пальцах, если кто-то из Я обратится с просьбой убрать фрагмент текста, без проблем уберу.


A. Подсчитать количество вхождений символа в строку [5 баллов]

Тут все просто, не стал заморачиваться, регулярка, 2 минуты, 5 баллов в кармане.

B. Ход конём [45 баллов]

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

На этой задаче я застрял надолго. Мозг отказывался решать, как это статичный HTML+CSS, самим Богом и Tim Berners-Lee не предназначенный для хранения состояний может таки хранить состояние если очень надо. В результате оставил задачу напоследок, когда время стало подходить к концу психанул и нагуглил аналогичное решение, подпилил его под условие задачи и получил заветные 45 баллов.

Спойлер решения

Под каждой ячейкой доски делаем невидимую радиокнопку, ее переключение и будет хранением состояний, а красим соседние ячейки через CSS тени объекта: input[type="radio"]:checked + label {background: #ff0000;box-shadow: -30px -60px 0 0 #0000ff...,}

C. Принцип «одного окна» [70 баллов]

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

Эту задачу тоже оставил на конец. Поэтому сначала сделал простое решение. Роботы получают список задач, но исполняют их последовательно. Т.е. один берет задачу, остальные ждут, когда он закончил, он записывает в лог результат, идет курить и начинает работать следующий по очереди робот. Технологии Почты России в жизнь! Из-за нехватки времени это решение и ушло в продакшн и набрало 35 баллов. Очевидно, нужно было допилить, чтобы роботы работали параллельно - освободившийся брал задачи из пула и когда все закончат, дать ответ. При этом выход из бесконечного цикла был бы по условию: нет задач в очереди <И> все роботы освободились от работы (глобальная переменная?).

D. Слишком надежный проект [90 баллов]

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

Эта задача показалась слишком простой. Сначала через лайфак №7 выдал пустой массив как решение:

module.exports = function (input) {
return [];
}

Сразу набрал 15 баллов. Для многих тестов пустой массив тестов и был решением. Далее бодро написал штук 7 тестов на json разной степени вложенности и сложности и запрограммил составленный алгоритм:

  1. заменить все алиасы "@/pages/b.js" на "@": "./src", -> "./src/pages/b.js" во всех видах инфо -file, deps

  2. алиасов может быть много, заменить по ходу все по порядку "@": "./src", "@2": "./src2", etc

  3. все пути сделать абсолютными - склеить с absoluteRepoPath: "/var/www/projects/project1", и/или урл модуля

  4. получить список измененных модулей hasChanged: true

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

  6. для измененных модулей получить список их deps - файлов содержащихся внутри них

  7. получить список тестов deps с пред. пункта измененных модулей

  8. отсортировать список тестов

Через 1-1.5ч работы добился, что все тесты у меня прошли успешно. Но Я.Контест показал все те же 15 из 90 баллов. Переделывал код несколько раз, но так и остались 15 баллов. Возможно, неверно выдавал результаты, например, нужно было не заменять пути в тестах на их алиасы или сортировать тесты по-другому и т.п.

E. Межгалактический исследователь «Джаваскриптович» [90 баллов]

Написать функцию, которая на входе принимает массив байтов = изображение с камеры. Далее перевести в градации серого, наложить на фото два фильтра, еще пара тройка манипуляций и выдать результат (определение контуров объектов) менее, чем за 50мс.

Тут были две проблемы:

  1. мне так и не удалось написать код, который бы всего лишь компилировался и без ошибок выдавал даже входной массив обратно без обработки. Что-то в этом роде:

    function run(arr, obj) {
    return new Promise((resolve, reject) => {
    // через 1 секунду готов результат: result
    setTimeout(() => resolve(arr), 10);
    // через 2 секунды — reject с ошибкой, он будет проигнорирован setTimeout(() => reject(new Error("ignored")), 2000);
    });
    }
    module.exports = { run };

  2. Я бы взял на такую задачу где-то неделю разработки. С учетом того, что нужно прочитать про фильтры, научиться с ними работать, подготовить изображения и тесты, которые корректно определяют границы и все это за 50мс. Сделать это за условные ~30-45мин, которые у меня оставались было маловероятно. Поэтому 0 баллов.

Итого, я набрал 5+45+35+15+0=100 баллов

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


Собес с сотрудником я завалил

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

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

Я решил.

Вторая задача.
Написать функцию flatten, которая сплющивает массив чего угодно "строк/функций/вложенных массивов" (аналог lodash/flatten) без использования рекурсии.

Время поджимало, поэтому написал что-то типа такого:
function flattenSubArray(arr) {
let result = [];
let hasSubArray = false;

for(let item of arr) {
if (Array.isArray(item)) {
result = result.concat(item);
hasSubArray = true;
} else {
result.push(item);
}
}

return [result, hasSubArray]
}

function flatten(arr) {
let result = [...arr];
let hasSubArray = false;
do {
[result, hasSubArray] = flattenSubArray(result);
} while(hasSubArray)

return result;
}

console.log(flatten([]));
console.log(flatten([1,2,3]));
console.log(flatten([1,'str', [2,3]]));
console.log(flatten([1,'str', [2, [3,'s', () => { return 4;}]]]));

Интервьюер сказал, что в коде есть ошибки, да и решение неоптимальное (~O(n^2)) и на этом собеседование закончилось. Это сейчас я по памяти код набрал, а тогда написал так: {result, hasSubArray} = flattenSubArray(result); т.е. фигурные скобки вместо квадратных. В этом была ошибка. Блокнот в Яндекс.Контесте или в чем я там писал код не подчеркивает ошибки. Сейчас проверил, код вроде норм, работает.

Что в итоге

Если ставить себе цель "попасть разработчиком в Яндекс", то задача выглядит решаемой.

Но я бы посоветовал взять 2-4 недели фуллтайм подготовки: алгоритмы, структуры данных, технические тонкости используемых технологий по вашему стеку (JS, HTML, CSS, ***). В Я, как я понял, новые проекты пишут на React+Typescript, есть свой виртуальный Гит, NodeJS, Flow, BEM, на старых проектах jQuery, но фронтов собеседуют на чистом JS, поэтому мой опыт в Angular особо роли не играл.

На этом все. Всем удачи и интересной работы!

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


  1. mSnus
    26.09.2021 02:33
    +3

    Любопытно, спасибо!

    Ход конём сразу придумалось решить через чекбоксы, а вот про тени бы не догадался - пробовал бы через nth-child.. надо попробовать, получится ли)


    1. berlicon Автор
      26.09.2021 09:35
      +1

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


      1. Andrew0610
        26.09.2021 12:01

        Я решил. Ничего сложного. Просто у вас мало версточной практики. А вот задачи по js я не решил. У меня мало практики языка)


    1. AndreyKud
      26.09.2021 23:50
      +2

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


      1. berlicon Автор
        26.09.2021 23:57
        +1

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

        Посылаю лучи поддержки. С вашим уровнем уверен, легко найдете достойную работу.


        1. m0tral
          27.09.2021 21:04
          +1

          Серьезно? Вы с HR'ами видимо мало общались, молчать в случае отказа, а порой и долгого фидбека это их кредо


  1. Alexandroppolus
    26.09.2021 02:46
    +2

    Для флаттена всё стандартно - прикинуть рекурсивный вариант и развернуть его на цикл+стек. И главное никаких спредов и конкатов - только православный push в массив-результат.


    1. berlicon Автор
      26.09.2021 09:40

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


      1. Alexandroppolus
        26.09.2021 10:18
        +3

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

        А то что я предложил, это как раз без рекурсии, примерно так

        Кодъ
        function flatten(arr) {
            if (!Array.isArray(arr)) {
                return arr;
            }
            const stack = [{arr, i: 0}];
            const result = [];
        
            outer: while (stack.length) {
                const ctx = stack[stack.length - 1];
                while (ctx.i < ctx.arr.length) {
                    const value = ctx.arr[ctx.i++];
                    if (Array.isArray(value)) {
                        stack.push({arr: value, i: 0});
                        continue outer; // типа рекурсивный вызов
                    } else {
                        result.push(value);
                    }
                }
                stack.pop();
            }
            return result;
        }


        1. Bumbik
          26.09.2021 11:08
          +1

          Можно проще:

          return arr.flat(Infinity)


          1. berlicon Автор
            26.09.2021 11:12
            +1

            Круто! Но думаю рекрутер хотел чтобы я написал аналог flatten, а не использовал flatten из коробки ????


          1. Alexandroppolus
            26.09.2021 11:40
            +1

            Разумеется, нет.

            function depth(n) {
                for (var r = 1; n > 0; --n) r = [ r ];
                return r;
            }
            depth(100000).flat(Infinity); // Maximum call stack size exceeded


            1. berlicon Автор
              26.09.2021 11:48

              Да, запретили использовать рекурсию (или функции из коробки, использующие рекурсию), т.к. есть техническое ограничение на макс вызов кол-ва функций в js/браузере: https://stackoverflow.com/questions/7826992/browser-javascript-stack-size-limit


      1. apachik
        27.09.2021 13:11
        +1

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

        за статью спасибо, отличное получилось описание!


  1. IgorPie
    26.09.2021 04:01
    +6

    Графы на фронтэнде, не оверкилл ли?


    1. GreySS
      26.09.2021 09:33
      +1

      Тем не менее желающих полно и своего человека/людей они найдут.


    1. berlicon Автор
      26.09.2021 09:43

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


  1. TheKnight
    26.09.2021 04:59
    +2

    Тут все просто, не стал заморачиваться, регулярка, 2 минуты, 5 баллов в кармане.

    А почему не цикл + мапка? Вроде ж даже проще.

    есть свой виртуальный Гит

    Если быть чуть более точным, это git-like VCS под названием Arc: https://habr.com/ru/company/yandex/blog/482926/

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


    1. berlicon Автор
      26.09.2021 09:48

      Цикл по буквам и считать сколько вхождений? Образец может быть и многобуквенным. Плюс при своем алгоритме могли быть сюрпризы вида "ищем АБА в слове АБАБА" и получать ответ 1 (правильно) или 2 (неверно) если накосячить в цикле. Лучше решение из коробки. Ну или это я ленивый.

      Да, верно ARC про него говорили.


      1. TheKnight
        26.09.2021 13:18

        Видимо я спутал задачи по названию, так как в описанном мной случае ищется не подстрока в строке. Либо вы про UTF-8, где один видимый "символ" занимает больше одного char.


        1. berlicon Автор
          26.09.2021 13:25

          Видимо я вас недопонял. Речь про задачу определения числа вхождений образца в строке. Я решил ее так:

          function countSymbol(str, symbol) 
            var regex = new RegExp(symbol, 'g');
            let result = (str.match(regex) || []).length;
            return result;
          }

          Не совсем понял вашу идею, как решить эту задачу через цикл (for?) и мапку (arr.map(item => {})?)


          1. TheKnight
            26.09.2021 13:29
            +1

            A. Подсчитать количество вхождений символа в строку [5 баллов] 

            Тут все просто, не стал заморачиваться, регулярка, 2 минуты, 5 баллов в кармане.

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

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


            1. berlicon Автор
              26.09.2021 13:31

              Да, май бэд. Речь о символе, видимо одном, а не подстроке. Вы правы, можно решить это проще.


              1. Alexandroppolus
                26.09.2021 13:50
                +1

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


  1. dopusteam
    26.09.2021 07:55

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

    Звучит как плохой совет


    1. berlicon Автор
      26.09.2021 09:52

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


    1. Bromles
      26.09.2021 09:53
      +1

      Это давняя проблема всех олимпиад по программированию. Даже на школьном Всеросе раньше были задачи, где программа должны была вывести один из двух ответов (условно да/нет), и можно было просто написать код из одной строчки (всегда вывод одного ответа) и набрать половину баллов.

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

      Но у Яндекса на позицию полноценного разработчика, видимо, все в этом плане не так продвинуто, как у школьников на олимпиаде


      1. berlicon Автор
        26.09.2021 09:54

        Да, думаю Яндекс пофиксит этот баг.


    1. mn3m0n1c_3n3m1
      26.09.2021 15:47
      +1

      На самом деле это хороший совет с точки зрения промышленной разработки, и вот почему:

      • проверяется надёжность написанных тестов: проверяют ли они хоть что-то;

      • когда код написан по TDD, тесты, даже при отсутствии кода будут вести по цепочке реализации, поскольку качественные тесты - это знания о работе системы;

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

      • задействуя 20% усилий мы получаем 80% результата, и я сейчас не столько о 15 баллах, сколько о том, что за пару секунд мы получаем рабочий прототип решения;


  1. pronkin
    26.09.2021 09:54
    +1

    С последней задачей, у Вас, конечно, косяк совсем вышел, базовый обход дерева, только без рекурсии :( И все равно вам как-то захотелось написать рекурсивно или красиво, а если бы в тупую побольше переменных, то получилось бы лучше :)
    Спасибо, что поделились!


    1. berlicon Автор
      26.09.2021 09:56

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


  1. Pyku_He_oTTyda
    26.09.2021 09:54
    +4

    После такой работы и появляются статьи "я выгорел на работе".


    1. berlicon Автор
      26.09.2021 09:58
      +2

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


      1. Pyku_He_oTTyda
        26.09.2021 10:04
        +4

        Не только программировать, в яндексе много направлений...

        Кто постарше, отказываются от предложений яндекса, даже за хорошую ЗП.

        Удел молодых, пока энергии больше, чем здоровья.


  1. eeeMan
    26.09.2021 10:42
    +2

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


    1. berlicon Автор
      26.09.2021 10:46

      Меня прям расстроил кейс (тестовая задача D генерация скобочных последовательностей), когда написал правильное решение и прошли корректно 13 из 14 тестов, а последный тест вылетел с Memory limit и все решение считается неверным ????


    1. inooni
      26.09.2021 21:52

      У меня было так (в яндекс не собирался, поэтому не применял гугление задач и не делал попытки читерить получая баллы за однострочные решения):
      1. По-быстрому решил вводную задачу на 5 баллов.
      2. Ход конем пропустил, т.к. знал, что это для меня надолго.
      3. Принцип одного окна. Сделал, дали около половины баллов, т.к. часть тестов "wrong answer". Почему так - мне никто не сообщил.
      4. Слишком надежный проект - отложил
      5. Вот тут у меня пригорело знатно. Вроде понял что к чему и как делать, но из-за формулировочек + собственно


      1. inooni
        27.09.2021 10:06
        +1

        Простите, не дописал (на модерацию ушло после мисклика)
        5. Сам, конечно, дурак. Но, в итоге, решил, немного не уложившись по времени. Прошли все тесты, но поставили по 0.01 балла за каждый

        Дальше была возможность порешать задачи вне конкурса, уже вечером решил про ход конем, сделал сабмит и мне дали максимальное количество баллов (баг1), после этого сел решать задачу 4, попытался засабмитить, но тут меня вообще выкинуло из соревнования: даже вне конкурса нельзя было проверить решение (баг2). В общем, впечатления смешанные. С одной стороны, достаточно интересные задачи (3 и 5 понравились). С другой стороны, совершенно неудобная система проверки: если ошибка рантайма, то можно было бы и написать какой-то текст, потому как с правильным решением вылез за лимит времени из-за того, что долго не мог понять, что данные не в том виде отдаю.


  1. anonymous
    00.00.0000 00:00


    1. berlicon Автор
      26.09.2021 11:53
      +1

      Ну, так себе совет ???? Да и в реальной работе (без друга программера рядом) это быстро всплывет, только время зря потеряешь. Вообще, отзываю свой совет, что нужно готовиться к таким соревнованиям. Т.к. если без подготовки и стимуляторов не можешь каждый день фигачить без выгорания и овертаймов на олимпиадном уровне, нет смысла подаваться на такие вакансии.


      1. PerseforeComplete
        26.09.2021 15:11
        +5

        А почему вы думаете, что вам придётся в Я заниматься ровно этим же ровно в таком же темпе 8 часов 5 дней в неделю? Это соревнование. К соревнованиям готовятся, "тужатся" в течении короткого времени иии всё, соревнование закончено. Вы же не думаете, например, что человек, который способен пробежать марафон, бегает марафон каждый рабочий день?


        1. berlicon Автор
          26.09.2021 15:47

          Да, вероятно, вы правы. Это скорее у меня было понимание (возможно, ошибочное), что на собеседовании в любой компании задают вопросы и проверяют те скилы, которые непосредственно будут использоваться каждый раб день конкретным сотрудником. Глупо проверять навыки программирования, скажем, у продажника. Или нанимать на должность секретарши девушку с красным дипломом МГУ. О, Боже, именно такой пример в Яндексе я и знаю! ????


          1. Mapaxa864
            26.09.2021 18:57
            +1

            Не на пустом же месте устоялось мнение, что на собеседованиях в крупные конторы приходится решать олимпиадные задачи всех сортов, а непосредственно на работе — json'ы перекладывать из http-сервиса в http-сервис.


            1. berlicon Автор
              26.09.2021 19:06
              +1

              Ну, наверно, это правильная стратегия. Т.к. если у тебя в HR воронке на позицию пришли 100 кандидатов и надо быстро выбрать 2-3, их пустить на исп срок и оставить одного, то фильтр по олимпиадным задачам - самое быстрое решение для отсева.


              1. Mapaxa864
                26.09.2021 22:53

                Тут по-разному можно смотреть. Можно как плюсы найти, так и минусы.


  1. Kuch
    26.09.2021 12:45
    +5

    Часто участвую для разнообразия во всяких таких штуках. One day offer прошел в прошлый раз (пол года назад). В Тинькофф много раз проходил и ДР.

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

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

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

    Дальше было интереснее, мне сделали оффер, все были очень вежливы, но оффер был очень маленьким. Трижды его повышали и очень уговаривали, но сумма в итоге просто дошла до моего текущего уровня это ещё и с условием rsu. В итоге, когда я сказал что меня не устраивает новый оффер, то hr просто перестал отвечать)


    1. berlicon Автор
      26.09.2021 13:01

      Крутой коммент! Жаль лайки у меня на сегодня закончились ???? Да, с входными/выходными данными засада. Я был уверен, что 100% правильно решил задачу с модулями и списком тестов, но т.к. не было примера, что программа ожидает на выходе, так и не смог отладить функцию.

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


      1. Kuch
        26.09.2021 13:06
        +1

        Да, зп меньше. Они ставят на то, что типа дают акции, которые ты получаешь не сразу, а в течение 4 лет. Но во первых, даже с ними это было бы ниже уровня моего чистого текущего дохода, я уже не говорю про всякие надбавки. Ещё в Яндексе по слухам переработки это норма. Но вот если вы разработчик с опытом 1-2 года, то возможно Яндекс очень хорош для опыта.

        В далёком прошлом до ит я как раз работал в газ*** и там все таки зп ощутимо ниже чем в ит)


        1. berlicon Автор
          26.09.2021 13:16

          Да, про адские переработки тоже слышал. У одного из ведущих мероприятия (сотрудник Я - А.В.) были черные от недосыпа глаза и заторможенная речь как у робота. Ну или мне так показалось.

          Да, был бы я студентом или выпускником, попасть в Я было бы исполнением всех мечт.

          Насчет нефтянки. Щас П их нагнул, они стали некислые бюджеты жечь на всякие инновации, цифровизацию, импортозамещение, создание цифровых двойников месторождений, дроны, AI/ML и др. Гуглим Сибинтек и аналоги. Отличные там щас ЗП в ИТ ????


      1. APXEOLOG
        27.09.2021 09:59
        +1

        Т.е. если цель $, за ними надо идти в условный роснефтьгазмясметалл ????

        Нет, нужно хорошо подтянуть английский язык и устраиваться в зарубежные компании (обычно из США). Можно вполне найти и варианты удаленной работы, после ковида это стало намного проще, чем раньше