Блог пользователя Emettant

Автор Emettant, 10 лет назад, По-русски

Всем привет!

Вопрос:

Всем известно, что Сodeforces очень помогает развивать свои способности в решении ординарных и далеко не очень [ординарных] задач. Спасибо за это огромное.

И никому не секрет, что часто подобные задачи спрашивают на собеседованих в компании такие как Amazon, Google, Microsoft etc.

Но также в, как правило, спрашивают задание, которыое относится к разделу тестирования или System Design. И тут вопрос:

Если тестирование можна где-нибудь здесь почитать, а интервьюшные задачки посмотреть (кроме Codeforces и TopCoder), например, еще тут, то вот как быть с System Design? Где можна поднатаскаться-потренироваться (или хотя бы почитать) о System Design, положим для разных уровней исходных знаний и умений?

Спасибо

UPD: тут классный набор q&a. Спасибо OutSide!

  • Проголосовать: нравится
  • +43
  • Проголосовать: не нравится

»
10 лет назад, # |
Rev. 2   Проголосовать: нравится +19 Проголосовать: не нравится

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

Если вас архитектура вообще интересует, гуглите "Мартин Фаулер", у него как минимум две книжки которые вам нужны.

Однако новичков и середнячков чаще спрашивают более простые вещи, в частности паттерны, реализации MVC (ну и для изврата MVP, CQRS).

Тут я отмечу что на деле подходы к архитектуре сильно различаются порой. Например Фаулер начинает ядом плеваться когда упоминают "анемичные модели", хотя по-моему 90% веб-приложений на джаве пишут именно с анемичными моделями ,,,>^.,.^<,,, (в то время как rich-models популярны в большинстве PHP, Ruby, Python фреймворков, а в Java например юзаются в Play)

Фаулер это обзывает в отместку "general java anti-pattern".

В целом же в подобные вещи начинаешь вникать уже сменив контору-другую :)

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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

    За советы благодарен.

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +13 Проголосовать: не нравится

      А какие именно вопросы вам задавали? Вы вообще на разработчика собеседовались? На какой язык?

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

      Ещё весьма полезен Роберт Мартин "Чистый Код" — ну там первая треть это в общем почти must have — а остальные две как раз в сторону тестов и архитектуры (правда не обязательно хватит терпения его рассусоливания читать).

      как без опыта контор адекватно (для уровня, как вы выразились, новичка) отвечать на подобные вопросы?

      Можете достаточно смело отвечать что "я интересовался данными вопросами, но конечно я понимаю что без реального опыта работы в серьёзных проектах (как ваш!) мои представления довольно туманны и дальше паттернов я не слишком продвинулся" (конечно на вопросы о самих паттернах нужно уметь отвечать бойко — википедия и книжки дают неплохую инфу)

      Тут полезно понимать что из четырёх популярных грэйдов junior, middle, senior, lead обычно "этими вопросами" всерьёз занимаются только последние два :)

      Если вы попадаете в контору где новичку предлагают архитектурить приложение — обычно это плохая контора. Ну т.е. новичок-то получит бесценный опыт и спокойно свалит дальше, а контора останется с его программулиной... Со мной такое было! :D

      • »
        »
        »
        »
        10 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А какие именно вопросы вам задавали? Вы вообще на разработчика собеседовались? На какой язык?
        

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

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

        P.S. как правильно цитировать собеседника? : )

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится +6 Проголосовать: не нравится

          P.S. как правильно цитировать собеседника? : )

          http://codeforces.net/blog/entry/11696#comment-164976

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится

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

          Тогда заранее сильно не парьтесь. По крайней мере System Design для вас сейчас не главное я думаю.

          Собеседование от собеседования сильно отличаются, и вопросы и т.п. Мне порой везло — давали небольшие тестовые задания (ну такие на два-три дня дома поделать).

          Сходите на парочку — и уже будете гораздо лучше представление иметь :)

          Если я правильно помню, то язык не главное.

          Ну... Как сказать... Вакансий где язык не главное довольно мало. Мне чтобы с Си на Джаву переключиться пришлось год усиленно практиковаться (я тогда и зарегался на CodeForces) и то взяли после десятка собеседований (правда сразу в два места).

          Зачастую важно не знание самого по себе синтаксиса языка, а опыт с популярными в нём библиотеками, фреймворками и инструментами. В отношении C++ я тут не могу сильно много чего рассказать, так что вам стоило бы отдельный пост завести.

          чего ожидают услышать от человека, учитывая его уровень

          Про архитектуру новичка спрашивать не будут почти наверняка. Вероятно спросят о других языках, опыте с вебом, ну и дальше специфично по конторам — представлениях о TCP/IP, опыте разработки GUI, познаниях Qt или Windows API например. Это что меня обычно спрашивали когда я на Си писал. Три раза задавали вопрос о том как развернуть связный список. :)

          Опять же для C++ с дизайном приложений и архитектурами дела чуть менее очевидно обстоят (на мой взгляд), поэтому там больше "знатоков" и противоречивых мнений, и к новичкам соответственно относятся снисходительно. :)

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

          P.S. как правильно цитировать собеседника? : )

          Я ставлю значок > в начале строки. Это вроде не маркдауновская фича но работает :)

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Вероятно спросят о других языках, опыте с вебом, ну и дальше специфично по конторам — представлениях о TCP/IP, опыте разработки GUI, познаниях Qt или Windows API например

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

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

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

            • »
              »
              »
              »
              »
              »
              »
              10 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится

              Извиняюсь, что влезаю. Мне кажется, Вы сильно пытаетесь срезать путь в этой теме. Задачи проектирования, так же как и многие вопросы "хорошего кода" приходят только с опытом. Вы не поймете, что такое хорошая архитектура, пока не начнете заниматься архитектурой (и не наступите на грабли несколько раз, скорее всего). Поэтому вопрос "как охватить класс подобных задач?" это примерно как "какие 5-6 алгоритмов надо выучить, чтобы стать красным?". Книги могут немного помочь, но в основном нужен опыт и здравая голова на плечах. Но даже если голова есть, то опыт нужен все равно.

              Моя точка зрения — если вы новичок, то рано над этим париться. Если уже не новичок, а прогресса все ещё никакого, то поздно париться. Эти знания придут естесственным путем — через опыт. Так что, если хотите накачать этот навык, то надо просто начать писать что-то, что с архитектурной точки зрения будет хоть как-то нетривиально для Вас. Ну и плюс, так как это интервью, то надо еще уметь объяснять свою точку зрения собеседнику.

              • »
                »
                »
                »
                »
                »
                »
                »
                10 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                какие 5-6 алгоритмов надо выучить, чтобы стать красным

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

                Моя точка зрения — если вы новичок, то рано над этим париться

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

                P.S. таки полезная штука >

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  10 лет назад, # ^ |
                  Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

                  =====================================================================

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

                  Понимаю. Просто мне оно звучит реально так. Не хотел обидеть.

                  Вы предлагаете лучше не готовиться вообще по даному вопросу?

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

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

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

                  P.S.: давайте, если хотите в личку, не люблю устраивать чат на КФ, он тут не выглядит круто :)

            • »
              »
              »
              »
              »
              »
              »
              10 лет назад, # ^ |
                Проголосовать: нравится +5 Проголосовать: не нравится

              как охватить класс подобных задач

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

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

              Ну и конечно "в краткие сроки" — это совсем перебор. Вы можете 10 раз прочесть про разницу между OOD и OOA, но без практического опыта вы никогда не сможете её донести.

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

              Например я ставил перед собой примерно такие цели (с интервалом примерно в год):

              • устроиться "куда-нибудь", получить первый опыт промышленной разработки;
              • поднабраться опыта в разработке на C/C++, поработать в более крупной команде (первая была из 3 человек);
              • переключиться на Java;
              • набраться опыта в разработке фронтенда на Java;
              • поработать в роли сеньора, девопс;
              • теперь вот решил углубить опыт в джаванском бэкенде;
              • в будущем, возможно, хочется в бигдату переключиться.

              Вы полагаете я мог бы опыт полученный за 6 лет "в краткие сроки" накопить перед первым собеседованием? И то я его сейчас расцениваю как весьма недостаточный, хотя зарплата за это время выросла раз в пять :)

              • »
                »
                »
                »
                »
                »
                »
                »
                10 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится

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

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится

          Но если что, то С++ мне ближе

          о таких вещах на интервью надо заявлять с крайней осмотрительностью. В C++ есть адская объектная модель, многопоточность, особая шаблонная магия — и про что-то из этого вас наверняка спросят. Что такое RAII и/или виртуальные деструкторы, и для чего они нужны. В каком порядке обрабатываются исключения. Какая из спецификаций шаблона будет вызвана в том или ином случае, и так далее.

          На контестах из всего этого используется только небольшая часть STL.

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            адская объектная модель, многопоточность, особая шаблонная магия

            да, с вами пожалуй сложно не согласиться :D

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Да уж, сложность C++ была для меня одним из поводов учить джаву. Правда джава тоже оказалась сложнее чем я думал :)

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
»
10 лет назад, # |
  Проголосовать: нравится +4 Проголосовать: не нравится

We don't know any books that could help with that. (Google Recruiter)

Я прочитал следующие статьи:

The Google File System

Bigtable

The Google Cluster Architecture

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Это всё оч интересные вещи (сюда можно добавить классный курс по BigData с Coursera — его проводит дядечка из IIT) — но я б сказал что вакансий куда это требуется очень-очень мало и "новичком" в них обычно считается разработчик с изрядным опытом в обычных проектах но не имеющий опыта именно в бигдата, хадупе и т.п. :)

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Вопросы по дизайну систем типичны для Google. Думаю, неплохо будет ознакомиться с решениями, реализованными в этих системах. С чего Вы взяли, что это стоит читать на специализированные вакансии? Я про Map-Reduce забыл добавить в список.

      • »
        »
        »
        »
        10 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        С чего Вы взяли, что это стоит читать на специализированные вакансии?

        Ну покажите по Минску или Питеру несколько вакансий куда это требуется? Я за год в Питере насчитал около 5 штук, на одну собеседовался и на пару отсылал резюме ещё.

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

        Я про Map-Reduce забыл добавить в список.

        Ага, а также про Locality Sensitive Hashing, Message Queues, репликацию баз, Hadoop (внутри которого пусть будут YARN, Pig, Hive, HBase), распределённые кэши, OLAP и т.п.

        Только я сомневаюсь что это всё новичку надо :)

        • »
          »
          »
          »
          »
          10 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Я же сказал, вопросы по дизайну систем типичны для Google. Общее представление о Map-Reduce не помешает.

          • »
            »
            »
            »
            »
            »
            10 лет назад, # ^ |
            Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

            Гугл не типичная контора, мягко говоря.

            Да и для неё это не всегда типично. Подозреваю что в Питерском офисе будут спрашивать в основном про джаваскрипт и разные навороты на его основе. Шансов что поинтересуются биг-датой что-то около 1%.

            В то же время просто от нечего делать вставлять умные слова в разговор я бы не стал. Например, заикнусь я про MapReduce — меня спросят какие я знаю реализации. А я знаю только что есть в хадупе здоровенная, убогая в MongoDB и учебных парочка для питона есть. И тут станет ясно что "слышал звон". Ну или попросят задачку через него показать как решать. Вы только собираетесь сказать "например TF-IDF" и тут они говорят "кроме TF-IDF"... В общем тут уж тогда надо готовиться к подвохам, а то случалось "накалываться"... :)

            • »
              »
              »
              »
              »
              »
              »
              10 лет назад, # ^ |
                Проголосовать: нравится +3 Проголосовать: не нравится

              Зачем знать реализации? Никто не ожидает от Вас подробностей реализации. Определите каким образом будут обрабатывать данные mapper-ы и reducer-ы. Да и вообще, можете не вспоминать эти слова, просто пробуйте рассуждать в рамках данной концепции.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Отлично, спасибо

»
10 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Здесь есть задачки с реальных интервью и обсуждения.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо конечно, но хотелось бы больше конкретнее по теме System Design (что бы под этим не подразумевали люди, анонсирующие задания для интервью)

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Пожалуйста конечно, но просто здесь выберите "System design", "Distributed computing", "Large scale computing", etc. Так же может быть полезно посортить по дате.

»
10 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

По-моему, Вы просто не умеете правильно ставить вопросы.

Из Вашего поста и комментариев очевидно, что Вы прошли на онсайт-собеседование в Google, в котором пятое интервью — как раз System Design. RodionGork дал Вам много полезных советов, и я могу подтвердить это, поскольку сходил на собеседования примерно в 30 питерских компаний, так что советую прислушаться к его советам, если будете искать работу в своем городе.

Что касается собеседования в Google, это совершенно нетипичный случай. System Design — это просто условное название, там не требуется никаких знаний архитектуры систем и всего, о чем говорили RodionGork и marat.snowbear.

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

Правильным алгоритмом решения было бы найти на Codeforces тех, кто работает в Google, например RAD, RAVEman, Jacob, и спросить их, как подготовиться к этому интервью и какие вопросы задавали в свою очередь им, когда они устраивались работать в компанию.

Совет от меня — возьмите любой продукт Google (например, Google Maps, Google Search, YouTube, Android) и попробуйте ответить на вопрос, как его разработать. В поисковик можно вбивать вопросы вида "как сделать свои карты", "как написать свой поисковик", "как запрограммировать видеоплеер", "как создавался Android".