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

В июле мы проводили рекрутинговое мероприятие для 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.

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


  1. Gemorroj
    15.01.2018 16:19

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


    1. symbix
      15.01.2018 16:35

      В 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 — что-то подобное в смысле "конечный автомат со стеком" писать приходится нередко


    1. lu4e3ar Автор
      15.01.2018 17:42

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

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


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

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


      1. alexkbs
        16.01.2018 11:10

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


    1. Shvonder
      16.01.2018 02:24

      2 — не ок. Такая задача гуглится за 30 секунд.


      1. corvette
        16.01.2018 10:59

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


        1. symbix
          16.01.2018 13:11

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


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

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


    1. shushu
      16.01.2018 09:02

      10^9 это не большое число.


    1. suppa-duppa
      16.01.2018 14:24

      Нужны не задроты библиотек, а шарящие в решении задач. Библиотеку можно вызубрить за неделю. А мозг — нет.


  1. smple
    15.01.2018 16:37

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


    1. wispoz
      15.01.2018 17:18
      +1

      Ну как минимум нужно сделать так

      $str = '12345678';
      $strSplitted = str_split($str);
      foreach ($strSplitted as $char) {}

      а потом уже foreach.


      1. smple
        15.01.2018 17:45

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


        1. wispoz
          15.01.2018 18:34
          +1

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


          1. Sannis
            15.01.2018 20:34
            +1

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


          1. symbix
            15.01.2018 20:59
            +1

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


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


          1. mortimoro
            16.01.2018 12:49

            Чтобы не считалась на каждой итерации, можно так делать:

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

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


            1. symbix
              16.01.2018 13:49
              +1

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


              1. mortimoro
                16.01.2018 14:11

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


                1. symbix
                  16.01.2018 14:39

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


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


  1. FallDi
    15.01.2018 17:35

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


    1. lu4e3ar Автор
      15.01.2018 22:43

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


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

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


    1. StjarnornasFred
      15.01.2018 23:19

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

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


      1. lu4e3ar Автор
        16.01.2018 00:01

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


        Зануда mode

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


  1. godzie
    15.01.2018 21:24

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


    1. lu4e3ar Автор
      15.01.2018 22:45

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


  1. AlexndrNovikov
    15.01.2018 23:07

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


  1. shushu
    16.01.2018 09:03

    Зарегистрировался и сразу время пошло…


    1. wispoz
      16.01.2018 10:29

      Как только получили ТЗ время пошло )


  1. negasus
    16.01.2018 10:34

    Наверное, я как многие, зашел посмотреть и потом понял, что пошло время(
    Ответил на первых три вопроса и приходится уезжать(


    1. shushu
      16.01.2018 11:55

      Я только на один успел ответить :) 5 минут было) Думал зарегистрируюсь, а потом посмотрю :)


  1. nelson
    16.01.2018 13:06

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


    1. lu4e3ar Автор
      16.01.2018 15:07

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


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


  1. WitNt
    16.01.2018 13:18

    А я вообще не понимаю, почему я должен решать эти тесты при приёме на работу? Это хитрый ход работодателей за дёшево получить решение своих проблем. Вкладываться не хотят или что? Первые две задачи типовые. Решения есть. Третья задача по оценке производительности и пропускной способности сети действительно нетривиальная. Здесь всё зависит от личных предпочтений. Можно взять первое попавшееся решение, и пусть задача молотится, к примеру три дня. А можно начать поиск оптимизационного метода, отлаживать его, тратить на это время. Пусть задача после этого вычисляется за два часа, но время потраченное на это, тоже денег стоит. И работодатель не всегда готов платить за это. Так что…
    Тут вообще вспоминаются и довольно курьёзные и смешные случаи, когда народ возится, находит оптимальное решение, когда задача решается мгновенно или достаточно быстро. Но начальству нужны солидные временные затраты. Так ребятам пришлось в основном цикле вычислений выполнять временные задержки. Тогда боссы уходили с проверки с чувством «глубокого удовлетворения». Вот так.
    Кстати, последние, скандальные новости про какие-то версии iPhone, где производительность аппаратов специально занижалась, как раз из этой серии


    1. mortimoro
      16.01.2018 13:49
      +1

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


      1. WitNt
        16.01.2018 14:25

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


        1. lu4e3ar Автор
          16.01.2018 15:15

          Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!

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


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

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


          1. WitNt
            16.01.2018 16:10

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


  1. demi_urg
    16.01.2018 13:35
    +1

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


    1. camradee
      18.01.2018 18:10

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


  1. pae174
    16.01.2018 13:42

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


    1. lu4e3ar Автор
      16.01.2018 13:50

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


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


  1. symbix
    16.01.2018 13:55
    +1

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


    1. Sannis
      17.01.2018 19:37

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


      1. symbix
        18.01.2018 05:02

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

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


  1. camradee
    16.01.2018 14:32

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


    1. suppa-duppa
      16.01.2018 14:48

      Каждому своё


    1. lu4e3ar Автор
      16.01.2018 15:02

      но вот некоторые функции, я за 8 лет в пхп ни разу не видел

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


      1. camradee
        16.01.2018 16:40

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


        1. lu4e3ar Автор
          16.01.2018 16:54

          Не проблема!
          Можно было, например, прислать такое решение без 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;
          }


    1. WitNt
      16.01.2018 16:11

      Поддерживаю.


    1. WitNt
      16.01.2018 16:15
      +1

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


  1. pronvit
    16.01.2018 14:35

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


  1. AndreyMtv
    16.01.2018 17:12

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


    1. symbix
      16.01.2018 17:20
      +1

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


      1. AndreyMtv
        16.01.2018 17:29

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


        1. symbix
          16.01.2018 18:23
          +1

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


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


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


    1. suppa-duppa
      16.01.2018 17:35
      +1

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

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


      1. AndreyMtv
        16.01.2018 17:59

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


        1. suppa-duppa
          16.01.2018 18:16
          -4

          а не количество кода и время сидения на стуле и долбания по клаве.

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

          Ты походу сам забыл, хуйло обоссаное. За языком блядь следи. АГРЕССИВНЫЙ И ЗАНОСЧИВЫЙ!


    1. AndreyMtv
      16.01.2018 18:09

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


  1. isalnikov
    16.01.2018 17:50
    +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



    1. suppa-duppa
      16.01.2018 17:53

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


      1. Sannis
        17.01.2018 19:44

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


  1. dmrt
    16.01.2018 22:03

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


    1. lu4e3ar Автор
      16.01.2018 22:23

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


  1. Wade2k
    16.01.2018 22:23

    Мне одному кажется, что эти задачи легко гуглятся, а 90% php разработчиков занимаются совершенно другим?