ПоискПочтаКартыМаркетНовостиСловариБлогиВидеоКартинки
Войти

Работа в Яндексе

Разработчик сервиса Яндекс.Карты (С++)

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

Как следствие, нам требуются ещё разработчики.

Вам придётся:

  • решать нетривиальные алгоритмические задачи;

  • постоянно изучать последние достижения математики в связанных областях;

  • писать код на С++ и иногда на Python, проводить инспекции (code review) чужого кода;

  • участвовать в проектировании высоконагруженных отказоустойчивых систем.

Требования:

  • хорошее знание С++ и STL;

  • умение выражать сложные вещи простым и понятным кодом;

  • отличное знание классических алгоритмов и структур данных;

  • понимание устройства и принципов работы современных ОС;

  • опыт многопоточного программирования.

Дополнительными плюсами будут:

  • опыт использования boost;

  • опыт программирования под *nix;

  • знание python и bash;

  • опыт работы с реляционными базами данных.

Условия

    Работа в московском офисе Яндекса полный рабочий день.

    Подробнее об условиях работы в Яндексе

    Продемонстрируйте свои знания

     

    Что не так в этом коде? Перечислите, какие недостатки вы видите. Предложите свой вариант рефакторинга.

    #include <stdio.h>
     
    class Feature
    {
    public:
        enum FeatureType {eUnknown, eCircle, eTriangle, eSquare};
     
        Feature() : type(eUnknown), points(0) {    }
     
        ~Feature()
        {
            if (points)
                delete points;
        }
     
        bool isValid() 
        {
            return type != eUnknown;
        }
     
        bool read(FILE* file)
        {        
            if (fread(&type, sizeof(FeatureType), 1, file) != sizeof(FeatureType))
                return false;
            short n = 0;
            switch (type) 
            {
            case eCircle: n = 3; break;
            case eTriangle:    n = 6; break;
            case eSquare: n = 8; break;
            default: type = eUnknown; return false;
            }
            points = new double[n];
            if (!points)
                return false;
            return fread(&points, sizeof(double), n, file) == n*sizeof(double);
        }
        void draw()
        {
            switch (type)
            {
            case eCircle: drawCircle(points[0], points[1], points[2]); break;
            case eTriangle:    drawPoligon(points, 6); break;
            case eSquare: drawPoligon(points, 8); break;
            }
        }
     
    protected:
        void drawCircle(double centerX, double centerY, double radius);
        void drawPoligon(double* points, int size);
     
        double* points;
        FeatureType type;        
    };
     
    int main(int argc, char* argv[])
    {
        Feature feature;
        FILE* file = fopen("features.dat", "r");
        feature.read(file);
        if (!feature.isValid())
            return 1;
        return 0;
    }
    

    Ниже приведены три варианта суммирования чисел с плавающей точкой (предполагается, что числа в массиве только положительные).

    double sum1(std::vector<double>& v)
    {    
        if (v.empty()) {
            return 0.0;
        }
        for(size_t i = 0; i < v.size() - 1; ++i) {
            std::sort(v.begin()+i, v.end());
            v[i+1] += v[i];
        }
        return v.back();
    }
     
    double sum2(std::vector<double>& v)
    {    
        if (v.empty()) {
            return 0.0;
        }
        for(size_t i = 0; i < v.size() - 1; ++i) {
            std::partial_sort(v.begin() + i, v.begin() + i + 2, v.end());
            v[i+1] += v[i];
        }
        return v.back();
    }
     
    double sum3(std::vector<double>& v)
    {    
        std::multiset<double> set(v.begin(), v.end());
        while (set.size() > 1) {
            std::multiset<double>::const_iterator itA = set.begin();
            std::multiset<double>::const_iterator itB = ++set.begin();
            double c = *itA + *itB;
            set.erase(itA, itB);        
            set.insert(c);
        }
        return !set.empty() ? *set.begin() 
                            : 0.0;
    }
    

    Оцените, как изменится время работы каждого из вариантов, если размер входного массива увеличится в 1000 раз.

    Аргументируйте свой ответ.


    Предложите более оптимальный вариант решения Задачи 2.

    Точность суммирования должна остаться прежней.


    Есть приложение, написанное на C++, производительность которого необходимо улучшить. Расскажите, какие у него могут быть «слабые места» и как можно их найти и устранить.


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


    Расскажите нам о себе

     

    Пожалуйста, укажите код города

     
    ОтправитьОчистить

     

     

    Мы постоянно растем и ищем талантливых людей

    У нас хорошая компания не только для обсуждения работы

    Коротко о Яндексе

    Все, что вы хотели бы знать о компании перед тем, как идти к нам работать

    Стажировка

    В результате вы сможете узнать Яндекс изнутри и, если вам понравится, устроиться на постоянную работу

    Памятка

    Кто такой менеджер проектов Яндекса и как им стать

     

    Если вы опытный специалист и хотели бы работать в Яндексе, но не нашли для себя подходящей вакансии, не отчаивайтесь, а напишите нам. Вдруг мы договоримся?

    ruRu