company_banner

Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале



    Привет, Хабр!

    В июле мы проводили рекрутинговое мероприятие для PHP-разработчиков, по результатам которого пять человек получили оффер в наш лондонский офис. Мы продолжаем быстро расти: Android- и iOS-команды с того времени стали на 11 человек больше, поэтому мы снова запускаем конкурс для PHP-разработчиков.

    Правила те же: покажи высокий результат в тесте, успешно пройди интервью 10 или 11 февраля в Москве — получи оффер в лондонский офис Badoo.

    Все расходы по приезду на интервью в Москву компания берёт на себя, равно как и всё связанное с дальнейшим переездом в Лондон: рабочие визы членам семьи, 10 000 фунтов стерлингов (≈ 770 000 рублей) на переезд, совершенствование английского, поиск жилья.

    Чтобы выполнять тестовое задание было интереснее, по многочисленным просьбам (1, 2, 3) под катом мы разберём задачи с предыдущего мероприятия, рассмотрим их правильные решения, и я объясню, почему мы выбрали именно их, а также приведу некоторые примеры, статистику и варианты решений от кандидатов.

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

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

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

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

    Итак, тест позволяет нам решить две задачи:

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

    Первичный отбор


    Проблему первичного отбора мы решаем при помощи задач на написание SQL- и PHP-кода с автоматической проверкой. Благодаря автоматизации в прошлый раз из 950 полученных решений только 150 мы проверяли вручную. То есть примерно 15%.

    В качестве базовых мы установили такие требования:

    • владение PHP (на «среднем» уровне);
    • владение SQL (на «среднем» уровне);
    • общие представления о computer science;
    • минимальные знания английского языка;
    • возможность применять перечисленные навыки для решения задач.

    Выбор лучших


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

    Как же выбрать лучших среди потенциально подходящих? Этот процесс формализовать сложнее. Поэтому на этом этапе мы решили использовать задачи с большим простором для демонстрации знаний и опыта из различных областей. И каждое удачное применение таких способностей считали плюсом.

    Охватить одним списком все области невозможно, поэтому я приведу несколько примеров тем, на знание которых мы обращали внимание:

    • консоль Linux;
    • отладка разных частей LNMP-стека;
    • представление о сети, HTTP(S), TCP/IP;
    • очереди, брокеры сообщений, параллельная обработка;
    • оптимизация (My)SQL;
    • обеспечение целостности данных (транзакционность, изоляция);
    • highload-специфичные вещи (масштабирование, шардинг, кеширование);
    • общее представление о работе CPU, памяти, планировщике задач в ОС;
    • проектирование, архитектуры систем.
    • ...

    Задачи


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

    • три автоматически проверяемые на написание кода: две на PHP и одну на SQL;
    • три на рассуждения в свободной форме.

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

    Здесь для удобства я приведу тексты на русском и максимально сокращу их, оставив только суть.

    Для примера разберём три задачи из прошлого теста.

    Задача №1. «Сумма больших чисел»


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

    Типичное решение
    function sum_str($str)
    {
        list($s1, $s2) = explode(' ', $str); 
        $l1 = strlen($s1);
        $l2 = strlen($s2);
        
        $result = "";
        $rest = 0;
        
        for($i = 1; $i <= max($l1, $l2) + 1; $i++) {
            $d1 = $s1[$l1 - $i] ?? 0;
            $d2 = $s2[$l2 - $i] ?? 0;
            
            $sum = $d1 + $d2 + $rest;
            $rest = intval($sum > 9);
            
            $result .= $sum % 10;
        }
    
        return strrev(rtrim($result, '0'));
    }


    Задача простая. С её помощью мы проверяем умение программировать на PHP. Полностью правильно её решил 201 человек. Ещё у 63 кандидатов проходила часть проверочных сценариев, но не проходили какие-то краевые случаи.

    Одна из возможных оптимизаций решения — в каждой итерации цикла брать не один разряд числа, а сразу несколько (N). Тут важно учесть, что как сами числа, состоящие из N разрядов, так и сумма двух таких чисел, должны умещаться в 63 бита, поскольку в PHP все int’ы знаковые. Выходит, что за раз можно брать максимально 18 разрядов.

    Такие решения мы помечали как интересные, хотя и прибегли к ним единицы.

    После публикации задачи мы выяснили, что платформа не позволяет управлять доступными PHP-расширениями для её решения. Поэтому задачу можно было решить также при помощи GMP (gmp_add()) и BC Math (bcadd()). Мы расценивали такие решения как верные наравне с остальными, несмотря на то, что в таком случае они сводились к паре строк кода.

    Задача №2. «Скобки»


    Условие
    На входе есть строка, содержащая только скобки из набора {}()[]. Необходимо определить, является ли она сбалансированной или нет.

    Под сбалансированной подразумевается строка, в которой выполняются три условия:

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

    То есть [([]{[]})] — сбалансированная, а {[}], [{)] и ]{}[ — нет.

    Типичное решение
    function balanced($str)
    {
        $braces = [
    		'}' => '{',
    		')' => '(',
    		']' => '[',
    	];
        
        $stack = [];
        for($i = 0; $i < strlen($str); $i++) {
            $char = $str[$i];
            
            if (isset($braces[$char])) {
                $el = array_pop($stack);
                if ($el != $braces[$char]) {
                    return 'NO';
                }
            } else {
                array_push($stack, $char);
            }
        }
        
        return $stack ? "NO" : "YES";
    }


    Задача проверяет как общее знание PHP, так и computer science (алгоритмов). Полностью правильно её решил 231 человек. Ещё у 99 кандидатов проходили некоторые тестовые сценарии, но не все.

    Самый короткий способ решить эту задачу — в цикле удалять из строки все сочетания “()”, “{}” и “[]” до тех пор, пока строка не перестанет меняться. Такое решение мы хоть и принимали, но помечали как неоптимальное. В этом случае требуется совершать множество проходов по строке и перевыделений памяти, в то время как решение на стеке выполняется за один проход и обладает сложностью O(N).

    Некоторые участники использовали для реализации стека SplStack вместо array(). Мы считали такие решения равнозначными, хотя, впрочем, SplStack использовали единицы.

    Задача №3. «Википедия»


    Условие
    Есть задача скачать все страницы англоязычной «Википедии» (только HTML, без картинок, CSS, JS).

    В наличии имеется десять серверов (на каждом по 24 ядра), бесконечный быстрый диск и ОЗУ, гигабитный Интернет.

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

    Пояснение
    С помощью этой задачи мы хотели оценить способность кандидатов декомпозировать реальную задачу «из жизни», отделять важную информацию из условия и верно определять/обосновывать сроки.

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

    • определить количество страниц в «Википедии» (на данный момент 5 548 604), найти индекс её страниц;
    • прикинуть, сколько времени займёт трансфер содержимого с точки зрения пропускной способности сети. Если взять за средний размер страницы в 30 Кб, то вся “Википедия” будет занимать 5548604 * 30 Кб ≈ 166 Гб. Передача по сети займёт (5548604 * 30000 * 8) бит / 10^9 бит/с ≈ 1331 с. ≈ 22 мин.;
    • оценить время отклика сети. Если взять за среднее время отклика 50 миллисекунд, то сумма всех задержек будет равна 5548604 * 0,05 = 277430.2 с. ≈ 3,2 дня;
    • предложить распараллелить задачу в рамках каждого сервера и по серверам. Принимались любые работающие решения: завести где-то сервер очередей, БД, каким-то другим образом разбить задачу на части;
    • обосновать выбор количества параллельных обработчиков (N). Поскольку процессорное время значительно меньше времени ожидания ответа по сети, N можно брать больше, чем количество ядер (> 10*24). Также здесь можно упомянуть возможность использования “асинхронного кода” в рамках одного потока выполнения (event loop, curl_multi_exec и т. д.);
    • например, при N = 1000 получаем 5548604 * 0.05 / 1000 = 277 с. ≈ 4,6 мин., что уже очень мало по сравнению со временем на реализацию;
    • добавить какое-то время на разработку, отладку и запуск. Мы принимали любой более-менее обоснованный срок, при изучении решения уделяли внимание в основном как раз обоснованию. Были кандидаты, которые предлагали достаточно длительные сроки (недели и больше) без какого-либо объяснения, на что это время уйдёт. Такие решения мы считали не очень удачными.

    Более-менее успешно с этой задачей справились 12 человек. Ещё 55 решили её частично.

    Где пройти новый тест


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

    Более подробно о команде и задачах можно узнать из анонса предыдущего мероприятия на Хабре. А здесь можно прочитать success story о переезде в Лондон нашего коллеги Антона Русакова.

    Есть вопросы? Смело задавайте их в комментариях или присылайте мне на Хабропочту.

    Проходите тест, приходите к нам на интервью — и присоединяйтесь к нашей дружной команде! Будет интересно!

    Good luck!

    Павел Мурзаков, PHP Team Lead, Badoo.

    UPD: дадим ответ до 7-8 февраля.
    Badoo 355,78
    Big Dating
    Поделиться публикацией
    Похожие публикации

    Вакансии компании Badoo

    Комментарии 85
    • +10

      Вот не понимаю я этой любви к всяким "хитрым" задачкам.
      В 1, я бы сказал, что gmp/bcmath — единственно верное решение. Но проще было бы просто спросить работал ли человек с большими числами.
      Во 2, ну ок… Надеюсь, никогда такого писать не придется в реальной работе.
      3 — да, что-то уже близкое к жизни.

      • +3

        В 1 я бы написал что-то вроде


        if (function_exists('bcadd')) {
            return bcadd($a, $b);
        } else if (function_exists('gmp_add')) {
            return gmp_strval(gmp_add($a, $b));
        } else {
            return my_bigint_sum($a, $b);
        }

        2 — что-то подобное в смысле "конечный автомат со стеком" писать приходится нередко

        • +3
          Но проще было бы просто спросить работал ли человек с большими числами.

          Это не совсем то, что мы хотим проверить. Для нас работал ли человек с большими числами или нет — не так важно. Важно, сможет ли он сориентироваться, если работать придётся.


          Во 2, ну ок… Надеюсь, никогда такого писать не придется в реальной работе.

          Зависит от конкретной области.
          Например, некоторые могут не знать о существовании pcntl_fork() в PHP и успешно решать большие крутые задачи, некоторым fork может быть жизненно необходим в повседневной работе.

          • 0

            Если человек не знает про BCMath, и решает первую задачу так, как вы показали, то это сразу провал. Нельзя не знать про BCMath, а если даже и не знать, то нельзя не уметь пользоваться поиском. Это профессиональная непригодность.

          • +1
            2 — не ок. Такая задача гуглится за 30 секунд.
            • +1
              Это если знаешь, что гуглить. Часто люди пытаются решить её регэкспами с печальным результатом.
              • +1

                Да можно и регулярками PCRE-шными.


                /^(\((?1)*\)|\[(?1)*\]|{(?1)*})(?1)*$/

                Другое дело, что с pcre-рекурсией наверняка похуже O(N) будет.

            • +2
              10^9 это не большое число.
              • +2
                Нужны не задроты библиотек, а шарящие в решении задач. Библиотеку можно вызубрить за неделю. А мозг — нет.
              • +4

                а вот если ко второй задаче добавить еще и между скобками текст и причем еще добавить escape charter чтобы можно было писать (\{) и это было сбалансированно, то задачку мы усложним и тут уже можно ее решение к автоматам сводить, но только зачем это в пхп ?


                и еще почему во второй задаче цикл написан будто бы задачи решали программисты С


                 for($i = 0; $i < strlen($str); $i++) 

                Может быть заменено на


                foreach ($str as $char)
                • +2
                  Ну как минимум нужно сделать так
                  $str = '12345678';
                  $strSplitted = str_split($str);
                  foreach ($strSplitted as $char) {}

                  а потом уже foreach.
                  • +1

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

                    • +2
                      Ну тоже вопрос :) в for() длина строки каждый раз считаться будет.
                      • +1

                        Переходите на современные версии PHP, у нас есть плюшки!

                        • +2

                          "Считаться" — слишком громко сказано. Это же не сишный null-terminated с O(N), длина строки в PHP — O(1).


                          (Дикий случай с mbstring overload я, конечно, не рассматриваю).

                          • +1
                            Чтобы не считалась на каждой итерации, можно так делать:
                            for($i = 0, $length = strlen($str); $i < $length; $i++) 

                            Тогда функция strlen() будет вызвана только один раз.
                            • +2

                              Можно, только в PHP смысла в этом не особо много. Оба варианта условия выхода из цикла — O(1). В вашем варианте единичка, правда, поменьше будет немножко :-) но все равно это бессмысленная микрооптимизация.

                              • +1
                                Интереса ради проверил на строке в миллион символов. Средние результаты 0.29 сек и 2.51 сек — видимо микрооптимизация не совсем бессмысленная.
                                • 0

                                  Ну я и говорю — единички разные. O(1) still sucks for large values of 1, %username%. :-)


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

                    • +9
                      А вариант решеия скачать базу wikipedia из браузера en.wikipedia.org/wiki/Wikipedia:Database_download как засчитывался? :)
                      • 0

                        Так же, как и вариант с постраничным скачиванием страниц:


                        • если алгоритм достаточно объяснён и даны обоснованные расчёты, то максимально
                        • если в задаче просто написано "скачаю дамп", то это плохое объяснение

                        Под "достаточно объяснён" я подразумеваю, что, например, в случае с дампом отсюда https://dumps.wikimedia.org/enwiki/latest/ ещё требуется пояснение, как из XML-файла с разметкой в Wiki-формате будут воссозданы исходные страницы в HTML-разметке, какие мы видим на сайте Википедии.

                        • 0
                          А меня, как википедиста, другое улыбнуло: автор предлагает «узнать число всех страниц английского раздела». Страница Википедии и статья Википедии — это не одно и то же! Страниц в английской вике сейчас 43 975 482. Подробнее см. en.wikipedia.org/wiki/Special:Statistics.

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

                            Не переживайте! Если кто-то написал 43 975 482 млн, он так же мог получить максимальный балл.
                            Само число для решения не играет никакой роли, как я писал выше: важно то, как будет объяснён порядок действий и необходимое время.


                            Зануда mode

                            Хоть это и не играет никакой роли, справедливости ради, изначально в задании подразумевались именно статьи(Content pages из вашей ссылки), которых сейчас 5.5 млн. Оригинальный текст из задания: "download English version of Wikipedia (only pages with articles)"

                        • +1
                          Решил попробовать тест для интереса, оставил фейк данные, кроме email.
                          В итоге прорешал все задачи, стесняюсь спросить, ничего страшного что только email реальный? =)
                          • +1

                            В таком случае мы свяжемся с вами по email.
                            Для надёжности можете скинуть мне в Хабрапочту недостающие данные, по телефону всё же оперативнее.

                          • +1
                            Первую и вторую задачу решал еще на Codewars пару лет назад. Причем в те времена не думал, что это может быть полезным для получения работы, но уже во второй раз вижу, как кто-то их использует. Возможно стоит дорешать остальные :)
                            • +1
                              Зарегистрировался и сразу время пошло…
                              • +1
                                Как только получили ТЗ время пошло )
                              • +1
                                Наверное, я как многие, зашел посмотреть и потом понял, что пошло время(
                                Ответил на первых три вопроса и приходится уезжать(
                                • +1
                                  Я только на один успел ответить :) 5 минут было) Думал зарегистрируюсь, а потом посмотрю :)
                                • +2

                                  Если не хватило пару минут на последнюю задачу, то никто и не напишет? Нужно было решить все?

                                  • +2

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


                                    Напишем что-то в любом случае, даже если это "отказ".

                                    • 0
                                      По всей видимости, это не совсем так. Бегло порешал тесты в лоб. Давно не занимался php и sql, кроме поверхностного просмотра чужого кода. Все задачи прошли автотесты — думал, что обратная связь в каком-либо виде да придет. И, конечно, интересно в общем прикинуть, какая при таком подходе будет оценка в общем зачете. Не пришел не только отказ — вообще ничего, кроме подтверждения о прохождении теста.
                                      На результат не надеялся — сами задачи простые, и очевидно, что многие смогут их решить, так что надо было как-то подойти серьезно. Но отсутствие какого-либо фид-бэка совсем, конечно, огорчает. Получается, что время потрачено совсем впустую.
                                      • 0

                                        Пришлите, пожалуйста, в личку E-Mail, с которым вы проходили тест, проверим.

                                  • –10
                                    А я вообще не понимаю, почему я должен решать эти тесты при приёме на работу? Это хитрый ход работодателей за дёшево получить решение своих проблем. Вкладываться не хотят или что? Первые две задачи типовые. Решения есть. Третья задача по оценке производительности и пропускной способности сети действительно нетривиальная. Здесь всё зависит от личных предпочтений. Можно взять первое попавшееся решение, и пусть задача молотится, к примеру три дня. А можно начать поиск оптимизационного метода, отлаживать его, тратить на это время. Пусть задача после этого вычисляется за два часа, но время потраченное на это, тоже денег стоит. И работодатель не всегда готов платить за это. Так что…
                                    Тут вообще вспоминаются и довольно курьёзные и смешные случаи, когда народ возится, находит оптимальное решение, когда задача решается мгновенно или достаточно быстро. Но начальству нужны солидные временные затраты. Так ребятам пришлось в основном цикле вычислений выполнять временные задержки. Тогда боссы уходили с проверки с чувством «глубокого удовлетворения». Вот так.
                                    Кстати, последние, скандальные новости про какие-то версии iPhone, где производительность аппаратов специально занижалась, как раз из этой серии
                                    • +11
                                      Это хитрый ход работодателей за дёшево отсеять тех, кто вообще не понимает, почему он должен решать эти тесты при приёме на работу.
                                      • –1
                                        Насколько я понял, когда регистрировался здесь, что тут площадка для освещения технических, технологических проблем. А тут который раз пишут, как они хорошо отсеивают народ. Причём не стесняясь пишут, что двести претендентов отсекли или даже больше. Я лично уже давно не участвую в этих тестах. Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!
                                        • +2
                                          Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!

                                          Если с вами так поступил работодатель — приходите к нам. :) У нас противоположные ценности: мы впервую очередь обращаем внимание на способность адекватно мыслить, а не на специфические теоретические знания.


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

                                          Технический разбор технических задач — разве это не техническое?

                                          • +1
                                            Спасибо за предложение. Но я сам по себе. Не люблю, когда вокруг меня бегают счетоводы и оценивают тебя штангенциркулем. Мне больших заграничных зарплат не нужно. Со своими заказчиками я сам разберусь. ;-)
                                    • +3
                                      Расскажите пожалуйста, как оценивать кандидатов не давая им решать задачи?
                                      • 0
                                        В трех местах мне давали сделать какие-то элементы сайта или даже несколько полноценных разделов. Это как бы не совсем задачки на время. Зато ты делаешь реальный функционал, который понадобится пилить на работе потом.
                                      • +1

                                        Эти три задания — это полный набор фильтров кандидатов или это толко нулевой этап "проверки на адекватность"?

                                        • +1

                                          Смотря что вы подразумеваете под "нулевым этапом проверки на адекватность".
                                          Это 3 задания из онлайн-теста. Всего в онлайн-тесте их было 6.


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

                                        • +3

                                          О, а почему @fisher-овский тест (http://php.feedme.ru/) не используете? Он, как по мне, явно намного более адекватен вашим требованиям, чем очень простые задачки из пп.1,2 (хотя третья нормальная). Или его уже никто пройти не может? :-)

                                          • 0

                                            Те, кто его круто прошёл, уже были на наших интервью. Но сам тест никто особо не пиарит, потому потока кандидатов с него нет и, как мне кажется, никогда и не было.

                                            • 0
                                              Те, кто его круто прошёл, уже были на наших интервью.

                                              А, ну хорошо если так. Я как-то раз в топе помимо основного ника засветился левым именем (просто так, смотрел новые вопросы), и никакого фидбэка не было. Уж не знаю, ваш косяк это был, или просто меня спалили. :-)

                                          • –3
                                            Скажу наверно ересь, за которую меня закидают тапками. Но когда я вижу подобные задачки, то понимаю, коллектив состоит из вчерашних студентов, для которых не существует другого паттерна проверки кандидатов кроме как по школьновузовскому принципу. Т.е. решить их удачно, в рамках ограниченного времени, может только сам бывший студент. Сейчас бы еще бухгалтеров теоремы спрашивать при приеме. Сам работал около 6 лет на крупную соцсеть, распределенная система (около 100 серверов) — мне задали ровно один вопрос, очень похожий на 3-ий только про нагрузку системы. По поводу других задачек — решение в принципе понятное чисто алгоритмически, но вот некоторые функции, я за 8 лет в пхп ни разу не видел.
                                            • 0
                                              Каждому своё
                                              • 0
                                                но вот некоторые функции, я за 8 лет в пхп ни разу не видел

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

                                                • 0
                                                  strrev — что-то ни разу не пригодилась (пришлось гуглить), как и rtrim, хотя trim часто. intval как то попадалось Касательно фидбека, хорошо когда задание позволяет увидеть логику кандидата, а не энциклопедические знания фунций. И если не изменяет маразм, в универе, вроде давали задание на сложение больших чисел, правда на С++.
                                                  • 0

                                                    Не проблема!
                                                    Можно было, например, прислать такое решение без strrev(), rtrim() и intval(). Мы бы его оценили максимальным баллом.
                                                    Для нас всё именно так, как вы говорите: в первую очередь важно умение решать задачи, а не энциклопедические знания.


                                                    Решение
                                                    function sum_str($str)
                                                    {
                                                        list($s1, $s2) = explode(' ', $str); 
                                                        $l1 = strlen($s1);
                                                        $l2 = strlen($s2);
                                                    
                                                        $result = "";
                                                        $rest = 0;
                                                    
                                                        for($i = 1; $i <= max($l1, $l2); $i++) {
                                                            $d1 = $s1[$l1 - $i] ?? 0;
                                                            $d2 = $s2[$l2 - $i] ?? 0;
                                                    
                                                            $sum = $d1 + $d2 + $rest;
                                                            $rest = $sum > 9 ? 1 : 0;
                                                    
                                                            $result = ($sum % 10) . $result;
                                                        }
                                                    
                                                        if ($rest > 0) {
                                                            $result = $rest . $result;
                                                        }
                                                    
                                                        return $result;
                                                    }
                                                • 0
                                                  Поддерживаю.
                                                  • 0
                                                    Поддерживаю, коллега. Вообще публикация шуму наделала. Народ зацепили своими подходами поизголяться.
                                                  • 0

                                                    А можно ли так просто делить задержки на 1000 — что с производительностью самой Википедии?

                                                    • 0

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

                                                      • +1

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

                                                        • +1

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

                                                          • +1

                                                            Мне не нужно. :-)


                                                            А градации — вещь относительная. Обычное дело — в одном месте ты сеньор, а в другом на джуниора еле тянешь.


                                                            Мне самому привычнее мыслить почасовой ставкой.

                                                        • +2
                                                          Всегда считал, что программирование это прежде всего мыслительный процесс

                                                          Не нужно ничего считать. Покажите ваши проекты. Не намыслили еще? Очень жаль, мы вам перезвоним.
                                                          • +1

                                                            Разместите вакансию, может и покажу. А может и нет. Уж больно вы агрессивны и заносчивы.
                                                            Не только вы выбираете, но и вас выбирают. Не забывайте об этом.

                                                          • 0

                                                            Фикс. Перепутал темы. Прошу извинения.

                                                          • +1
                                                            haskell
                                                            1. Prelude> sum . map read $ words 
                                                            2.  go [] string where
                                                                go [] [] = True
                                                                go acc (x:xs)
                                                                  | x elem "([{" = go (x:acc) xs
                                                                  | x elem ")]}" && not (null acc) && head acc == x = go (tail acc) xs
                                                                  | otherwise = False 
                                                            3. Database_download


                                                            • 0
                                                              Это задачи на 3-4 часа. С учетом того, что вы их видите впервые.
                                                              Лидер мирового рынка по виртуализации и автор самой популярной в мире виртуальной машины — Parallels. Они на собеседовании специально уточняют видел ли кандидат ту или иную задачу раньше. Им важно проверит ькак работает мозг, а не зубрежка.
                                                              • 0

                                                                Мы в Баду, кстати, тоже так делаем. Это, правда, не отменяет того факта что после простых задач мы обычно спрашиваем задачи на посложнее, в обсуждении которых можно подчас сильно отойти от темы и даже если кандидат её уже решал, обсуждал или видел решение в интернете, это не гарантирует 100% успех.

                                                            • +1
                                                              А можно на Perl решить задачи?
                                                              И вообще, реально ли опытному перловику получить оффер?
                                                              • +1

                                                                На Perl проходить тест, к сожалению, нельзя.
                                                                В новом тесте на написание PHP-кода всего 2 задачи. Если вы пишете на PHP хотя бы на базовом уровне и имеете хороший опыт с Perl, то у вас есть все шансы. Каких-то сильно специфичных для PHP вещей мы не спрашиваем в тесте.

                                                                • +1
                                                                  Ой! А я увидел в дропдауне с выбором языка Python, и засабмитил код как раз на нём. Это была фатальная ошибка? (Если да, то в будущих тестах вам стоит убрать возможность выбрать «запрещённые» языки.)
                                                                  • +1

                                                                    Это было сделано намеренно: мы решили оставить "близкие" к PHP языки, чтобы была возможность для прохождения тем, кто программирует на чём-то другом, но готов перейти на PHP.
                                                                    На каком-то этапе Perl выпал из поля зрения, сейчас уже сложно сказать почему.


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

                                                              • +2
                                                                Мне одному кажется, что эти задачи легко гуглятся, а 90% php разработчиков занимаются совершенно другим?
                                                                • +1
                                                                  Описание вопроса про анаграммы очень плохое (ИМХО). я и так эту задачу крутил и сяк, пока не понял, что надо было делать (и то не факт). Пока крутил время кончилось) описательную задачу даже посмотреть не успел)
                                                                • 0
                                                                  Неудобно, что нельзя переключаться с одной задачи на другую в ходе решения. В итоге на последнюю (простой sql-запрос) просто не осталось времени.
                                                                  Можно было бы переключаться, проще было бы пробежаться, сразу написать решения для простых, и сосредоточиться на чуть более сложных. А так, увы. Жалко немного.
                                                                  • +1
                                                                    Вообще-то можно, слева по кружочкам можно было щелкать.
                                                                    • 0

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

                                                                      • 0

                                                                        … потом заходим с реального аккаунта и получаем совсем другой набор задач из пула. :)


                                                                        Если там один набор задач на всех — это fail.

                                                                        • 0

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

                                                                        • 0

                                                                          А смысл так делать, дальше же будет очный этап.

                                                                    • +1
                                                                      Кстати, в PHP 7.1 добавили поддержку отрицательных индексов в строках. Из-за этого пример кода первой задачи работает неправильно в этом месте:
                                                                      $d1 = $s1[$l1 - $i] ?? 0;
                                                                      $d2 = $s2[$l2 - $i] ?? 0;
                                                                      

                                                                      Условие всегда будет выполняться. Нужно добавить проверку отрицательных индексов. Например так:
                                                                      $o1 = $l1 - $i;
                                                                      $d1 = $o1 >= 0 && $s1[$o1] ? $s1[$o1] : 0;
                                                                      $o2 = $l2 - $i;
                                                                      $d2 = $o2 >= 0 && $s2[$o2] ? $s2[$o2] : 0;
                                                                      

                                                                      • +1
                                                                        Задачи конечно простые очень, от этого вдвойне жаль что не хватило времени на оптимальные решения (т.е. все 4 задачи тесты проходят, но решения самые не оптимальные).
                                                                        Описательная задача интересная, но на описание всех проблем и продумывание решений времени не оставалось.
                                                                        Поэтому совет тем кто давно в таком режиме ничего не решал: набейте руку на hackerrank сначала немного, чтобы привыкнуть и потом не паниковать в условиях нехватки времени. Тогда 4 задачи с тестами решите быстро и останется достаточно времени на обдумывание описательной задачи.
                                                                        • +1
                                                                          А для слоупоков вроде меня можно выложить где вопросы? Просто почитать интереса ради.
                                                                          • +1

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

                                                                          • +1
                                                                            Добрый день. Скажите, когда будут оглашены результаты теста?
                                                                            • +1

                                                                              В связи с большим количеством участников, процесс затянулся, не успеваем всем дать ответ. Вынуждены взять ещё несколько дней.
                                                                              Планируем закончить до середины следующей недели: 7-8 февраля.

                                                                            • +3
                                                                              Спасибо товарищам из баду за прекрасный евент!
                                                                              Не вдаваясь в бытовые подробности (логистика, питание), скажу что все было на хорошем уровне. Впечатления от общения с работниками и ребятами которые проводили собеседования исключительно положительные. В общем, хоть и прошел все круги но оффер не получил (а второе место, как известно, самое обидное) о проделанном пути не жалею, было здорово! Вспоминая негативные комменты о собеседованиях в баду прочитанные ранее, можно сказать испытал легкое недоумение :)
                                                                              Единственный минус — фидбек почему то так и не получил, ну и ладно, обязательно попробую свои силы через пол года!

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

                                                                              Самое читаемое