пятница, 2 июня 2017 г.

Как я не попал в Яндекс.

Update 15.06.2017
Я действительно не ожидал такого количества просмотров/лайков/ретвитов и т.д. Спасибо вам всем, но большого смысла в этом не было.
13 июня 2017 года мне позвонили из Яндекса ещё раз. Со мной разговаривал очень вежливый молодой человек, по имени Андрей, сотрудник отдела HR (точную должность я забыл). Он сказал, что хочет пролить свет на некоторые проблемы, которые возникли в процессе моего собеседования, и рассказать какие изменения в процессе найма произошли в Яндексе с тех пор, как я у них был. Ему за это искреннее спасибо, т.к. я вообще удивлён, что достоин того, чтобы мне позвонили и что-то объясняли. Изменения, которые они делают не связаны с моим постом, они начали их делать до публикации, так что я тут не причём. Итак, если коротко. Теперь все, кто собеседуют в Яндексе проходят специальное обучение. Собеседуемые могут оперативно оставить фидбэк о том, как собеседование прошло. Листики и напитки больше не пропадают из переговорных. И собеседующие теперь ознакамливаются с предысторией соискателя.
Конкретно по моему случаю проблема была в том, что HR написала в Яндекс, что я готов не только на Java перейти, но ещё и на C++. И по результатам скайп-интервью они решили, что я больше пригожусь в Хранилище, Почте и т.д., чем в разработке под Android. Собственно из-за этого и начались все проблемы.
Спасибо, что Андрей мне позвонил и всё объяснил.
Сейчас я расскажу, как я не попал в Яндекс.
Эта статья чистая субъективщина. Всё, что описано здесь, сугубо моё видение ситуации.
В принципе, можно было и не писать эту статью, а дать вот эту ссылку: https://habrahabr.ru/post/322602/. В самой статье и в комментариях к ней описаны все проблемы, с которыми я столкнулся в попытках попасть в Яндекс.
Кому-то может показаться что я в этом посте ною, но увы это не так. Меня отговаривали идти в Яндекс люди, которые там работали и даже если бы я получил положительный ответ, я бы очень долго думал идти мне туда или нет. И да, я понимаю, что HR просто делали свою работу, чтобы заработать премию за привод кандидата. Но пускай они тогда свою работу делают несколько честнее.

Призрачная угроза

В июле 2016 мне на почту пришло письмо вот такого содержания:
Дмитрий, добрый день! Меня зовут *****, я работаю с командой Яндекс.Поиска. Вас рекомендовали как очень сильного разработчика и успешного участника ACM. Наши инженеры-разработчики работают с высоконагруженными и отказоустойчивыми системами, выдерживающими сотни миллиардов ссылок и десятки петабайт данных, разрабатывают алгоритмы для оптимизации производительности и получают уникальный опыт в области машинного обучения. Языки реализации зависят от проекта - С++/Python/Java. В нашей команде очень ценятся глубокие знания алгоритмов и хорошая математическая подготовка, которыми Вы обладаете в полной мере. В связи с этим я хотела бы обсудить с Вами возможность сотрудничества и рассказать вам более подробно о тех проектах и продуктах, которыми мы активно занимаемся. Так как проектов достаточно много и у каждого из них свой стек технологий, то прежде чем рассказывать о них, я хотела бы уточнить, что сейчас вам может быть интересно и чем хотелось бы заниматься?Могли бы мы поговорить более детально и обсудить, чем можем быть друг другу интересны?В любом случае буду очень благодарна за ответ.
Это письмо меня несколько рассмешило, т.к. вряд ли меня кто-то мог бы им порекомендовать как сильного разработчика (расскажите это моим коллегам, пусть тоже посмеются) и уж тем более как успешного участника ACM. В ACM (вообще оно называется ACM/ICPC) я ни разу не участвовал. Мой максимум - это областные студенческие и олимпиада в КРОК для студентов МГТУ им. Н.Э. Баумана. Даже на Codeforces я только пару раз побывал в первом дивизионе.
На это очень лестное письмо я ответил, как есть: рассказал, что успехов в ACM у меня нет и приложил ссылку на CodeForces. Рассказал, что моё знакомство с C++/Python и Java ограничилось парой утилит и курсовыми/лабораторными. Сказал, что предпочитаю всё-таки C# и если появится что-то для шарпистов, то рассмотрю их предложения.
В ответ на это я получил письмо с вакансией https://yandex.ru/jobs/vacancies/dev/bs_back_dev/ и предложением подумать о работе. Тут мне пришлось в ответном письме изъясняться уже более прямо, и я написал дословно следующее:
Здравствуйте, ******. Буду вынужден отказать в предложении, т.к. не считаю свои знания Python, Perl и алгоритмов хорошими и достаточными для работы в Яндекс.
На этом письма от Яндекса не некоторое время прекратились.

Заманивание

В самом начале сентября 2016 на мой почтовый ящик упало письмо от уже знакомого адреса job@yandex-team.ru. Начало письма было следующим:
Дмитрий, добрый день!
Меня зовут ****, компания Яндекс.
В июле вы уже общались с моей коллегой *****, но на тот момент не нашлось подходящих для вас вакансий.
Хотела уточнить, открыты ли вы сейчас для наших предложений?
Наша команда работает над приложением, которое называется просто Яндекс, — визитной карточкой компании на мобильных устройствах.
Ваша экспертиза в С# очень интересна для нас. Я понимаю, что для вас, наверно, неожиданно получить такое предложение, но на данный момент мы хотели бы привлечь в команду мобильной разработки специалиста с сильной базой без требований к опыту мобильной разработки. В нашей команде работают эксперты, которые готовы делиться своим опытом. Насколько вам могли бы быть интересны мобильные приложения как область применения своих талантов?
Чувствуя, что они опять ошиблись в выборе меня, я ответил на это письмо несколькими довольно очевидными уточняющими вопросами: "Можно подробнее узнать про вакансию? Какие языки программирования надо знать (в письме есть упоминание C#, но не говорится что разработка будет на нём)? Что понимается под сильной базой? И т.д." Также я ещё раз отправил ссылку на свой профиль на CodeForces, чтобы они ещё раз убедились, что в алгоритмах я не гений.
В ответ на это HR предложила созвониться и пообещала подробно ответить на все мои вопросы по телефону. Этот вариант мне очень понравился. Из разговора с HR выяснилось, что Яндекс запускает (сейчас уже запустил и без меня 😭) мобильное приложение "Яндекс", которое будет агрегировать в себе все сервисы Яндекса, будет точкой входа в них и т.д. Приложение будет разрабатываться под Android на Java и на Swift под iOS. HR сказала, что Яндекс в курсе, что я знаю достаточно хорошо C# и очень поверхностно Java и Swift. Но фирма готова потратить 3 месяца на моё переобучение на ту платформу, которую я выберу. Я выбрал Java, т.к. имхо он ближе к C#. По деньгам HR сказала, что зп на той должности, на которую меня хочет нанять Яндекс, стартует от 150 тыс. руб. на руки (если бы я тогда согласился на эти деньги, то с учётом съёмной квартиры в Москве, метро и т.д. - потерял бы в деньгах). HR также объяснила, что собеседование в Яндекс проходит в два этапа: собеседование по скайпу, где проверяется умение писать алгоритмы и очное собеседование в офисе, проезд до которого мне оплатит Яндекс. Всё выглядело довольно хорошо, к тому же мне было интересно пройти собеседование в такую крутую фирму, и я решил попробовать. Мне дали возможность самому выбрать период времени и дни, в которые Яндекс назначит скайп-собеседование.

Скайп-интервью

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

class Tree {
    Tree left;
    Tree right;
    int data;
}
class ZTree {
    ZTree left;
    ZTree right;
    int data;
}
Нужно реализовать функцию ZTree copyTree(Tree src), которая создаёт ZTree полную копию дерева src типа Tree. Интервьюер разрешил мне писать код в студии и отправлять ему его в скайп в чистом виде. Язык программирования его не сильно интересовал. Через 3 минуты я отправил вот такой код в ответ:
static ZTree copyTree(Tree src) {
    if (src == null)
        return null;
    ZTree result = new ZTree();
    result.data = src.data;
    result.left = copyTree(src.left);
    result.right = copyTree(src.right);
    return result;
}
        На том конце скайпа этим ответом были довольны и предложили другую задачу.
class Tree {
    Tree left;
    Tree right;
    Tree ref;
    int data;
}
class ZTree {
    ZTree left;
    ZTree right;
    ZTree ref;
    int data;
}
Тут добавилось у классов третье поле ref, это поле может ссылаться на любой объект соответствующего типа.
Через восемь минут я отправил в качестве ответа вот это:
static ZTree copyTree(Tree src) {
    Dictionary<Tree, ZTree> dict1 = new Dictionary<Tree, ZTree>();
    Dictionary<ZTree, Tree> dict2 = new Dictionary<ZTree, Tree>();
    copyTreeCore(src, dict1, dict2);
    foreach (KeyValuePair<ZTree, Tree> pair in dict2) {
        pair.Key.other = dict1[pair.Value];
    }
}

static ZTree copyTreeCore(Tree src, Dictionary<Tree, ZTree> dict1, Dictionary<ZTree, Tree> dict2) {
    if (src == null)
return null;
    ZTree result = new ZTree();
    result.data = src.data;
    result.left = copyTreeCore(src.left, dict1, dict2);
    result.right = copyTreeCore(src.right, dict1, dict2);
    dict1.Add(src, result);
    dict2.Add(result, src.other);
    return result;
}
После этого собеседующий начал объяснять следующую задачу: "Вот сейчас, когда вводишь слово в строку поиска, появляются подсказки автодополнения. Как бы ты реализовал это автодополнение?". Я ответил, что напишу префиксное дерево. Он попросил код и минуты через 4 я выдал это:
class Node {
    public char Value { get; private set; }
    public Node[] Children { get; private set; }
    public Node(char value) {
        Children = new Node[26];
        Value = value;
    }
}
static void Insert(Node root, string s) {
    Node next = root;
    foreach (char c in s) {
        int childIndex = c - 'a';
        if (next.Children[childIndex] == null) {
            next.Children[childIndex] = new Node(c);
        }
        next = root.Children[childIndex];
    }
}
Следующее задание и последнее было действительно сложным. Работник Яндекса попросил меня разработать алгоритм, который применялся бы при билдёждке для разрешения зависимостей. Надо добиться того, чтобы перед билдёжкой очередного проекта уже были сбилжены все, от которых он зависит. Входными данными являются список зависимостей. Гарантируется, что нет циклов. Алгоритм желательно сделать таким, чтобы он по максимуму использовал процессор, т.е. билдить в несколько потоков, если есть что билдить.
Я сразу решил начать с топологической сортировки и выдал такой код:
class Node {
    public List<Node> dependsFrom { get; private set; }
    public bool Ready { get; set; }
    public bool? Color { get; set; }
    public Node() {
        dependsFrom = new List<Node>();
    }
    public bool ReadyDepends() {
        foreach (Node node in dependsFrom) {
            if (!node.Ready)
                return false;
        }
        return true;
    }
    public void Build() {
        //do things
        Ready = true;
    }
}
static List<Node> sorted = new List<Node>();
static void DFS(Node node) {
    if (node.Color.HasValue)
        return;
    node.Color = false;
    foreach (Node depends in node.dependsFrom) {
        DFS(depends);
    }
    node.Color = true;
    sorted.Add(node);
}
static void Main(string[] args) {
    Node root = ParseMakeFile();
    DFS(root);
    foreach (Node node in sorted) {
        while (!node.ReadyDepends()) {
            Thread.Sleep(100);
        }
        new Thread(()=> { node.Build(); }).Start();
    }
}
Тут всё довольно просто: парсим MakeFile, делаем топологическую сортировку, бежим по отсортированным нодам и билдим каждую из них.
Собеседующий некоторое время думал, а потом указал мне на огромный изъян в коде. Предположим у нас будет такая структура проектов:
Где начало стрелки показывает, что проект нужен для сборки того, который на конце стрелки.
Тогда мой алгоритм, сделав топологическую сортировку получит в sorted последовательность нодов с индексами: 4, 3, 2, 1. И билдить будет в той же последовательности. Получается, что второй проект не соберётся, пока не будет закончена сборка 3 и 4, хотя второй проект совершенно от них не зависит, т.е. я не выполнил одно из условий задания - не загрузил процессор на полную. Потупив минут 5, я выдал ответ, что надо группировать таски по уровням и билдить сначала все таски на одном уровне, потом на уровне выше и т.д.
Интервьюер попросил меня отобразить это в коде, и я выдал это:
static List<List<Node>> groups = new List<List<Node>>();
static void DFS(Node node, int index) {
    if (node.Color.HasValue)
                return;
    node.Color = false;
    foreach (Node depends in node.dependsFrom) {
        DFS(depends, index++);
    }
    node.Color = true;
    sorted.Add(node);
    if (groups.Count <index)
        groups.Add( new List<Node>());
    groups[index].Add(node);
}
static void Main(string[] args) {
    Node root = ParseMakeFile();
    DFS(root, 0);
    for (int i = 0 i< groups.Count;i++){
       foreach(node n in groups[i]){
           while (!node.ReadyDepends()) {
               Thread.Sleep(100);
           }
           new Thread(()=> { node.Build(); }).Start();
       }
    }
}
Этим вариантом работник Яндекса был уже удовлетворён и сказал что собеседование на этом закончилось. Сказал, что всё прошло нормально и надо ждать ответа в течении недели. Собеседование длилось час.

Офлайн собеседование

Спустя 3 часа после скайп-собеседования я получил письмо о том, что Яндекс приглашает меня к себе в офис на полноценное собеседование. В письме говорилось что собеседование может быть до 8 часов и предложили мне самому выбрать день, когда это произойдёт. После всех согласований по дате мне было предложено выслать им чеки о покупке билетов, чтобы Яндекс компенсировал мне потраченные деньги.
Вообще не протяжении всего этапа подготовки к собеседованию HR вели себя очень вежливо, предлагали любую помощь и даже просили звонить, если я задержусь в пробке. Это было хорошо, т.к. я был на собеседовании в Москве ещё в одной фирме в 2013 году и тогда из-за пробки и опоздания на 20 минут (хотя я позвонил и предупредил что опаздываю) мне было отказано в прохождении собеседования вообще.
К очному собеседованию я уже готовился всерьёз. Пробежался в Кормене по всем темам, в которых плаваю. Наконец-то понял и осознал алгоритм Кнута-Морриса-Пратта, в интернете писали, что его любят спрашивать в Яндексе. Прорешал много задачек, гуглил чужие интервью, спрашивал у знакомых, которые там работали и т.д.
На входе в офис меня встретила вот такая лошадь.
В Яндекс я пришёл чуть раньше назначенного времени и успел перед собеседованием оглядеться и пообщаться с другими ожидающими. Рядом со мной сидел парень, который пришёл устраиваться стажёром.
Над ресепшеном у них в офисе висят два монитора: на одном в реальном времени показывают пробки Москвы, на другом показывают, что конкретно сейчас люди ищут в Яндексе, подобный функционал можно увидеть вот по этому адресу: https://yandex.ru/company/
В комнате, в которой я ждал собеседования висели ещё два монитора, но по ним крутили только рекламу сервисов Яндекс. Остальное фотографировать я почему-то не решил.
В назначенное время ко мне спустилась моя HR, она отвела меня в комнату 7-40, на 7 этаже. В комнате был стол, три стула, телевизор, какое-то ещё оборудование. На столе были напитки: кола, чай холодный, вода с газом и без. Стены представляли собой знаменитые сплошные маркерные доски. В этой комнате на стенах натурально можно было писать везде. HR предложила кофе или чай. Спросила есть ли у меня какие-то вопросы и рассказала, как будет проходить собеседование. Мной заинтересовались 3 команды. Казалось, что я крут, но на самом деле стоило насторожиться, т.к. изначально меня звали в одну конкретную команду. Какие команды хотят меня видеть она не сказала, но сказала, что по два человека по отдельности из каждой команды проведут со мной часовое собеседование. Также будет перерыв на обед за счёт Яндекса. Каждый человек после собеседования поставит оценку мне и даст характеристику в их специальной системе. При этом заявлялось, что собеседующие не могут смотреть оценки друг друга.
Тут стоит напомнить, что происходило до этого. Яндекс настойчиво звал меня к себе, но я отказывался и потом согласился. Я им очень много раз говорил, что знаю только C#. В алгоритмах не силён. Писал последние 4 года под WinForms. Яндекс ни разу не просил меня выслать резюме, т.е. они считали, что знают обо мне достаточно. Я шёл в команду разработки под Android на Java с переобучением. Почему я решил об этом напомнить? Потому что все, кто меня собеседовал не знали совершенно ничего обо мне. Вообще.
HR сказала, что мне будут давать задачи, решение которых я буду писать на листах A4. Желательно писать сразу правильно. Тут и возникла первая проблема. На столе в комнате действительно лежала стопка листов А4, но как выяснилось годной для письма была только одна сторона верхнего листа. Остальные были исписаны другими собеседуемыми. Мне пришлось достать мою дежурную тетрадку из рюкзака. Мои листы (из моей тетрадки!), на которых я писал, после собеседования уносили с собой интервьюеры. Может у них в фирме кризис?
Первый собеседующий меня был из бэкэнда почты.
Задачи были такие: дана строка из маленьких букв латиницы, нужно для каждой буквы из тех, что встречаются в этой строке выдать максимальную длину подряд идущих символов. Например, aaaabaabbaaaaacf. Ответ: a - 5, b - 2, c - 1, f - 1. Задача не сложная.
Потом написать метод, который принимает два отсортированных массива и на выходе даёт отсортированный массив с элементами из первых двух. Это вообще составная часть сортировки слиянием и пишется на автомате.
Потом написать класс, которому в конструкторе передаётся массив пар интов: число и вес. Написать в этом классе метод GetRandom, который будет возвращаться рандомное число из заданных, где веса - отношения вероятности выпадения. Т.е. если задано 10, 1; 20, 2 ;30, 4, то 30 должно выпадать в 4 раза чаще чем 10. Тут я потупил чуть, но предложил создать массив, в котором буду для каждого числа хранить сумму частоты выпадания всех чисел перед ним, тогда мы можем использовать обычный рандом и через бинарный поиск находить в этом массиве нужное число. Если учесть, что используемый нами рандом даёт случайное число в промежутке от 1 до суммы всех частот, то мой алгоритм будет решать поставленную задачу. Для примера, указанного выше это выглядит так: массив: [[10, 1], [20, 3], [30, 7]]. В таком случае мы берём рандомом число x от 1 до 7 и выбираем из массива такую пару, у которой x будет больше сумме частот до этой пары и меньше сумме частот этой пары. В итоге, первый собеседующий сказал, что всё нормально и ушёл.
Второй человек был из Яндекс.Хранилище (там хранится почта, Я.Диск и истории запросов). Задача была такая: дан компьютер с известными параметрами процессора, памяти, харда и сети. Написать там сервер умеющий два метода: POST/key/data и GET/key, где key - всё что угодно, любого размера, value соответственно тоже. Сервер должен работать с кучей пользователей самым лучшим и быстрым способом. Тут я конечно нёс всякую чушь, т.к. в подобном я не силён. Предложил хэшировать key допустим 8 байтами, сделать дерево каталогов на компьютере, в котором в корневой папке лежали все варианты первых двух байт хэша, в них варианты всех вторых байт хэша и т.д. Это всё чтобы ускорить поиск по таблице размещения файлов. Пытался что-то говорить про B - деревья, но не нашёл нормально как их тут применить. Вопрос, который меня интересует до сих пор: зачем это всё надо разработчику под Android?
После второго собеседования мне устроили перерыв и отвели на обед в столовую в соседнее здание. HR говорила постоянно, что мы опаздываем, что мне надо есть быстрее и прочее, потому столовую нормально сфотографировать я не успел. В туалет я сходить тоже не успел, т.к. уже пришёл другой человек меня собеседовать.
Третий человек тоже из Хранилища. Попросил написать LRU кэш на плюсах в условиях какой-нибудь железки с ограниченной памятью, т.е. все локальные переменные, аллокации и т.д. тоже влияют на размер кэша и их надо считать. Очень удивился, когда я сказал, что не буду писать на плюсах, т.к. пришёл со знанием C# и переобучением на Java. Спорил почти с каждой строчкой. Доказывал, что в .NET есть reference counting, иначе не будет работать GC. Просил везде учитывать его при подсчёте размеров объектов и подобные загоны. На мои попытки объяснить, что в .NET нет счётчика ссылок сказал, что я не понимаю, как устроена память в .NET. LRU кэш я сначала начал писать с использованием кучи и словаря, но потом решил переделать кучу на двусвязный список. Интервьюер регулярно задавал вопросы в процессе написания кода. Это отвлекало. Кода пришлось писать очень много, я исписал два листа A4 и не написал толком ничего, т.к. уже пришёл следующий меня собеседовать. Пришлось на словах объяснять, как и что я бы дальше писал. Также он спрашивал нравится ли мне писать высоконагруженные сервисы на питоне. Этот вопрос у него не возник, если бы он взял у HR данные обо мне.
Четвёртый человек из бэкэнда почты. Судя по его разговорам с предыдущим интервьюером у него какой-то очень высокий и почти невозможный рейтинг во внутренней системе оценки работы программиста. И кстати, он единственный из тех, кто меня собеседовал пришёл с ноутбуком и смотрел почти всегда в него. От него задачи были такие. Дано n написать программу, выдающую все правильные скобочные последовательности длины 2n. Эту задачу я всегда давал на третьем занятии на факультативе по алгоритмам. Собственно, её решение напишу даже во сне. Он сидел с моим решением минут 15 и сказал, что оно не работает. Контрпример подобрать не смог, но всё равно сказал, что не работает. На споры с ним я потратил очень много времени. Контрпример он так и не подобрал, но сказал, что задача возможно правильная, но он не уверен. Как бы он решал эту задачу он не сказал. Потом была такая задача: дан массив точек на плоскости в декартовых координатах, нужно написать метод, который возвращает true если существует такая вертикальная прямая, что весь этот массив точек будет симметричен относительно этой прямой. Такую задачу я уже решал когда-то. И хотел предложить следующее. Мы находим самую левую и самую правую точку из заданных. Середина между ними должна быть искомой вертикальной прямой. Остаётся проверить остальные точки на то, что они симметричны относительно этой прямой. Для этого достаточно завести HashSet и хранить в нём все точки. Тогда можно в цикле пробежаться по заданным точкам, для каждой из них посчитать где должна располагаться симметричная ей точка и проверить есть ли в хэшсете такая точка. Если хотя бы одна не подходит под эти условия, то ответ к задаче отрицательный. В процессе решения задачи интервьюер уточнил, что может быть задано несколько точек с одинаковыми координатами. Тогда мне пришлось хэшсет заменить на словарь.
Собственно, на этой задаче и произошёл полный пиздец. Задача не сложная, но он меня постоянно перебивал. Говорил, что я кругом не прав, нервничал и не давал закончить предложения вообще. Минут 10 у нас был такой диалог:
- Берём первый элемент массива.
- И?
- Бежим дальше по массиву и для всех точек у которых y такой же как у первой находим minx и maxx.
- Зачем?
- Ты дослушай алгоритм до конца и поймёшь.
- Ок. Берёшь число и что дальше?
- Бегу по массиву.
- Зачем?
- Бляяяя.
В итоге он сказал, что я задачу решил неправильно. Тест, на котором она падает он опять не привёл. На мои просьбы дать свой e-mail, чтобы я выслал ему по обеим задачам код, идентичный тем, что на листе и он бы проверил этот код на любом тесте, был отрицательный ответ.
В общем, в процессе спора я на него повысил голос и сказал ему "заткнись, блядь", т.к. он вообще не давал мне закончить предложения, в ответ на это собеседующий сказал, что я кругом не прав и ушёл. Потом пришла HR и сказала, что на сегодня всё. Предложила посидеть в кабинете и успокоиться.
Интервьюеры вообще не знали на каких языках я пишу. Для них было удивление что я не буду писать на их любимом Python/Java/C++. И постоянно спрашивали на какую должность я собеседуюсь. В ответ я у них спрашивал тоже самое. Каждый из приходящих на собеседование забирал какой-нибудь напиток со стола комнаты, к вечеру мне уже было нечего пить на собеседовании. Хорошо, что я заранее купил воды в магазине по дороге. 
В целом выглядело всё несколько странно. HR Яндекса явно делали вид, что им обо мне всё известно, что я им очень сильно нужен и нужен именно на позиции Senior Java под Android. Те, кто меня собеседовал вообще не понимали для чего я к ним пришёл, на какую платформу и что я буду там делать. Это за гранью понимания, когда меня звали в одну команду, а потом выясняется, что мною заинтересовались 3 другие и потом эти 3 другие мне отказывают в работе. Может стоило спросить ту, в которую меня звали? Если бы мне ещё по телефону HR сказала, что надо будет писать хранилища под Linux и LRU кэши на плюсах, то я бы сразу отказал и жил счастливо.

Итог.

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

воскресенье, 12 марта 2017 г.

Мои быстрые 1500

В пятницу вечером после работы мне было скучно, и я решил скоротать время за просмотром заказов на fl.ru. Как обычно я искал что-нибудь простое на один вечер. Среди кучи однотипных заказов был один с ТЗ на 56 строк, с подробнейшим описанием того что надо сделать, как будет проходить проверка работы, какими долями и когда будут переводится деньги и т.д. Основное задание же звучало так: "Изменить файл программы exe", и короткое описание: "Изменить файл Viewer.exe таким образом, чтобы окно ввода пароля вообще не появлялось, а зашифрованный файл (.mp3) запускался из зашифрованного контейнера сразу при открытии двойным щелчком."

четверг, 31 июля 2014 г.

"Море шумит за волнистой шторой." (С) Бродский

Меня много пугали перед поезкой в Украину. Говорили что я еду в самое пекло, что тут русских убивают и т.д. В принципе, особо страшно не было, т.к. из достоверных источников я знал что если не ехать в Донецк и Луганск - всё остальное будет нормально.
В общем,  когда покупал билеты кассир на вокзале сказала что у меня будут проблемы с въездом. Знакомые и родные говорили что меня не пустят или будет что ещё хуже. В погранслужбе Украины мне сказали что для въезда теперь необходимо иметь обратный билет и гарантийное письмо принимающей стороны, либо определённую сумму денег на каждый день пребывания. С деньгами на самом деле какая-то хрень у них там: во-первых с ними менее охотно пускают чем с письмом, а во-вторых у каждого погранца свои понятия о том сколько надо брать, в-третьих светить деньгами в поезде перед непонятными людьми было мало желания. Т.о., я попросил родственников с Украины чтобы они организовали мне гарантийное письмо. Делать его надо у нотариуса, изготовление этого письма на двоих человек обошлось в переводе на наши в 1500 руб. Собственно, имея на руках все документы, я собрался и поехал.
До границы я жутко нервничал и напридумывал себе всякого. В общем, наша таможня шмонала будь здоров: я открывал все сумки и показывал содержимое. Украинский же погранец посмотрел паспорт, забрал миграционную карту и пожелал счастливого пути. Всё. Проблем не было никаких.
Дорога шла ровно. Кроме нас в вагоне я так понял был только один гражданин РФ. Остальные все с украинскими паспортами. Видели танки на железке. Даже сфоткали (фотки будут в вк).
В самом Херсоне народ конечно на нас косился, так как говорим мы с Лизой естественно без акцента. Процентов 90 людей вокруг говорили на русском и за всё время человек 5 было только, кто говорил без акцента. Одна только женщина сказала: "Идите у себя фотографируйте там.". В принципе и всё. Народ местный не любит Путина и Порошенко почти одинаково. Вообще украинцы что живут  на юге более спокойные, имхо, и не любят когда кто-то мутит воду.
В обменнике я менял доллары, но впереди меня человек 5 меняли рубли и на выходе ещё одна женщина без акцента на русском  спрашивала где обменник.
Отдыхал я у моря там же где и в том году: в бунгало у моря. Тут круто! Правда ветер немного сильный и волны, и  медузы. Цены в ресторане у моря в нашем отеле дешевле чем в калужских кафе. В день мы двоём ели на меньше чем 1200 руб и ни в чём себе не отказывали. Еда вкусная. Хозяин отеля как выяснилось сам из Серпухова и когда узнал что мы Россияне и из Калуги стал здороваться с нами и спрашивать всё ли нормально. Хозяин сказал что мы первые россияне здесь и что раньше половину выручки делали россияне, теперь отель почти пустой и он не знает чем платить зимой за охрану. Также он рассказал как ему звонят родственники из Москвы и рассказывают как его русскоязычного здесь убивают, а он смеётся им в ответ.
Вообще никто никого не трогает. Мы гуляли до поздна по Херсону, ходили по посёлку где отель, были на рынке, в магазинах. Разговаривали с людьми - хоть бы одно слово плохое услышали, было бы о чём написать.
Далее рванём на поезде в купе-люкс в Крым. Там на великах попробуем от Севастополя до Алушты. Буду скучать по Марсу, который здесь каждый вечер напротив бунгало появлялся.
З.Ы. : Я жутко боюсь пауков, а Лиза наоборот. На веранде у нас их живёт восемь штук и Лиза постоянно их рассматривает и мне про них рассказывает, а мне от этого плохеет.
З.З.Ы.: Данный текст написан полностью на блютуз клавиатуре, подключённой к моему СГС 4. Частично я писал его лёжа на шезлонге у моря. Завидуйте =)

пятница, 9 мая 2014 г.

Ночь удалась и программист полиглот

Практически одновременно я смог запустить хард сестры, с которым возился неделю и найти плавающий баг по работе, который искать начал две недели назад. Прямо, счастливые полчетвёртого утра!
Теперь об интересном. Замечательным у меня выдались конец апреля и начало мая: больше пятисот строк на VBA, 353 строки на C++, 1500 строк на Java, на C# посчитать не получится + выиграл очередную футболку. На этот раз от 1С :-)

воскресенье, 9 февраля 2014 г.

Тру программист

Пытаюсь заработать все достижения в StarCraft II Wings of Liberty. Застрял на достижениях, связанных с игрой Lost Viking - отсылка к популярной когда-то игре про трёх викингов, каждый со своими способностями и они должны были выбраться из той хрени в которую попали. Брату она очень нравилась раньше.
В общем, а в SC II, в Lost Viking нужно управлять как бы самолётом и стрелять во всё что движется, зарабатывая очки. Суть в том, что надо часто жать на пробел - производить выстрел. Это неудобно по нескольким причинам: во-первых, пробел на моей Microsoft 4000 громкий, а во-вторых, я не умею нажимать с такой скоростью, какую надо иметь чтобы пройти эту игру. В итоге в голове за 10 минут родилось такое прекрасное решение:

var
    wnd:HWND;
    Key:NativeUInt;
begin
    key:=VK_SPACE;
    while (true) do
    begin
        wnd:=GetForegroundWindow;
        sleep(10);
        if not PostMessage(WND, WM_KeyDown, KEY, 0) then break;
        if not PostMessage(WND, WM_KeyUp, KEY, 0) then break;
    end;
end.

Теперь клики по пробелу происходят каждые 10 мск.

суббота, 16 ноября 2013 г.

Пока разогревал еду невольно смотрел первый канал, какую-то очередную говно передачу про Малахова. Итак, что я услышал за эти 5 минут что был у телевизора.
Тётка из Нью-Йорка сказала что перестала сниматься в кино и стала заниматься экстрасенсорикой, т.к. ей стало стыдно быть актрисой. Снималась она в фильмах с Гафтом и Евстигнеевым. Видимо, дурить людей, занимаясь экстасенсорикой - не стыдно.
Дальше, она сказала что когда ей предлагали роли она всегда оказывалась случайно беременна. Это в принципе просто шутка юмора. Но потом был какой-то официант, который сказал что к ним приезжают много жителей из стран бывшего СНГ.
Я в принципе вообще не понимаю на какого дебила рассчитаны эти передачи. Может кто подскажет. Хотя всё равно никто не читает этот блог =)

Как я не попал в Яндекс.

Update 15.06.2017 Я действительно не ожидал такого количества просмотров/лайков/ретвитов и т.д. Спасибо вам всем, но большого смысла в э...