Приветствую всех. Сегодня расскажу вам как я проходил собеседования в Москве на позицию .Net Developer. Усиленно готовился к собеседованиям месяц, целыми днями сидел и смотрел вопросы и пытался отвечать на них, а также читал книжки по С#. В статье привожу интересные задачки и вопросы, которые мне задавали в разных компаниях в Москве. Заранее скажу, что я попал в ту компанию, в которой хотел. Я прошел 4 собеседования в этой компании и меня наконец то взяли! Много статей было прочитано в частности здесь и надеюсь, что эту статью тоже будут читать начинающие Net разработчики и спрашивать все в комментариях.

Кому интересна тема прохождения собеседований, прошу под кат!

При поиске работы я пользовался Head Hunter. Там очень много вакансий с подробным изложением того, что хотят фирмы от кандидата. Решил откликнутся практически на все вакансии «C# разработчик», потому что для меня главное было пройти как можно больше собеседований, набраться опыта, а также во время таких собеседованиях найти интересную работу в интересной компании (забегая вперед скажу, что я нашел очень интересную работу). Некоторые компании (всего 2), для того, чтобы откликнуться на предложенную ими вакансию, хотели, чтобы кандидат решил предложенные ими задачи (напоминаю это при отклике). На мой взгляд это даже правильно, ведь это показывает, что компания очень ценит свое время и хочет, чтобы кандидат на собеседовании умел решать простые задачи. Обычно на таких собеседованиях спрашивают более «узкие» вопросы.

Практически во всех компаниях есть несколько этапов собеседований. На первом обычно собеседует hr, на второй — старший разработчик, на третьем — технический директор. Бывали компании, в которых на первом же приходили и старший разработчик, и Team Lead и технический директор, что конечно чуть заставляет нервничать. Пройдя 5 собеседований, я выяснил такую вещь: чем позитивнее и свободнее ведешь себя на собеседовании, тем легче и быстрее оно проходит.

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

Я не ожидал так много вопросов по базам данных, мне пришлось быстро осваивать (точнее вспоминать) sql язык. Вот какие вопросы и задания мне задавали:

  1. Что такое кластеризованный и некластеризованный индекс? Когда какое надо использовать?
  2. Что такое Join? Чем он отличается от Left Join, Right Join? Inner Join? Outer Join?
  3. Есть три таблицы: CUSTOMERS (ID, NAME, MANAGER_ID); MANAGERS (ID, NAME); ORDERS (ID, DATE, AMOUNT, CUSTOMER_ID). Написать запрос, который выведет имена Customers и их SalesManagers, которые сделали покупок на общую сумму больше 10000 с 01.01.2013.
  4. Делаем электронный справочник по книгам. Ищем:
    А) В каком магазине купить данную книгу.
    Б) В каких магазинах купить книги этого автора (авторов).
    В) Кто автор книги.
    Г) Какие книги написал автор.
    Нарисовать БД. Написать запрос Б. (Не забыть учесть, что у одной книжки — может быть несколько авторов)
  5. Что такое агрегирующие функции? Операторы Group By, Having? Приведите примеры их использования.
  6. Table «PC» (id, cpu(MHz), memory(Mb), hdd(Gb))
    1) Тактовые частоты CPU тех компьютеров, у которых объем памяти 3000 Мб. Вывод: id, cpu, memory.
    2) Минимальный объём жесткого диска, установленного в компьютере на складе. Вывод: hdd.
    3) Количество компьютеров с минимальным объемом жесткого диска, доступного на складе. Вывод: count, hdd.
  7. Дана следующая структура базы данных в MS SQL: Departments (Id, Name), Employees(Id, DepartmentId, Name, Salary).

    Необходимо:

    • Написать запрос получения имени одного сотрудника, имеющего максимальную зарплату в компании, и название его отдела.
    • Получить список отделов, средняя зарплата в которых больше 1000$.
  8. Ado Net – что за технология? и как и когда она используется?
  9. Что такое Entity Framework? Какие подходы проектирования БД знаете? Расскажите про Code First.

Конечно вопросы про ООП.

  1. Назовите и объясните основные парадигмы ООП.
  2. Назовите преимущества объектно-ориентированного подхода к программированию перед структурным программированием.
  3. Перечислите недостатки ООП парадигмы.
  4. Что такое раннее и позднее связывание?
  5. Перечислите модификаторы доступа и когда они используются?

Вопросы про паттерны проектирования.

  1. Расскажите про SOLID и примеры его использования.
  2. В чем отличие паттерна «Стратегия» от паттерна «Шаблонный метод»?
  3. Паттерн Адаптер и его применение.
  4. Расскажите про паттерн «Фасад».

Ну и конечно, огромное количество вопросов по С#.

  1. using (SomeClass sc = new SomeClass()){}
    Что делает данная конструкция?
  2. int i = 1;
    Console.WriteLine(«i = {0}», ++i);
    Что выведет данный код?
  3. Различие класса и структуры? И что будет если их передать в метод в виде параметров?
  4. Задача: есть нули и единицы в массиве. Надо для каждого нуля посчитать сколько единиц правее него и вывести сумму таких чисел. Сделать за один проход.
  5. Различие абстрактного класса и интерфейса? Можно ли отказаться от интерфейсов и использовать только абстрактный класс, ведь мы можем в абстрактном классе просто указать сигнатуры методов?
  6. Что такое интернирование строк?
  7. Расскажите про интерфейс IEnumerable? Зачем он используется?
  8. Когда мы можем пройтись по собственной коллекции foreach- ом? Что для этого надо сделать и почему? (Рассказать про утиную типизацию)
  9. Различие между IEnumerable and IQueryable?
  10. Как устроен Dictionary внутри? Как борются с коллизиями?
  11. Есть обычный пользовательский класс. Нужно его использовать как ключ в Dictionary. Что для этого надо поменять (добавить) в классе?
  12. Какова алгоритмическая сложность для операций чтения и записи для коллекции Dictionary?
  13. В чем различие между ключевыми словами «ref» и «out»?
  14. Расскажите, как работает try, catch, finally? Когда вызывается каждый?
  15. Чем отличаются друг от друга классы String и StringBuilder? Зачем нужно такое разделение?
  16. Какие отличие между значимыми и ссылочными типами? Зачем придумали такое разделение? Нельзя было придумать только либо значимые либо ссылочные?
  17. В чем отличие использования Finalize и Dispose?
  18. Что такое управляемый код и CLR? Основные требования к управляемому коду?
  19. Что такое assembly manifest (манифест сборки)?
  20. Что такое Boxing и Unboxing?
  21. В чем суть полиморфизма?
  22. Чем отличается event от delegate?
  23. Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Если да, то каким образом?
  24. Что такое абстрактный класс? В каком случае вы обязаны объявить класс абстрактным?
  25. В чем разница инкапсуляции и сокрытия?
  26. Что такое частные и общие сборки?
  27. Что такое .Net Framework?
  28. LINQ lazy loading, eager loading в чем разница?
  29. Можно ли запретить наследование от своего собственного класса?
  30. Определение паттерна синглтон.
  31. Что такое интеграционные тесты и unit-тесты?
  32. Что такое MVC, MVVM, WEB API?
  33. Каким образом можно присвоить значения полям, которые помечены ключевым словом readonly?
  34. Когда вызывается статический конструктор класса?
  35. Чем отличаются константы и поля, доступные только для чтения?
  36. Чем отличаются константы и поля, доступные только для чтения?
  37. Разница между асинхронностью и параллельностью?
  38. У вас есть сайт, вы заметили что он долго отвечает, как вы будете искать причину?

Ну и как же без логических задач:

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

    Ваша задача при помощи управления светом в вагонах и перемещения по ним узнать сколько в этом кольце вагонов.
  2. У вас есть 100 монет по одному рублю. Они все лежат на столе. У вас также есть два носка. Вам нужно распределить все монеты по 2 носкам, так чтобы в одной из них было в два раза больше монет, чем во второй, при этом:
    • не разрешается ломать их (они должны остаться целыми);
    • надо использовать все 100 монет (прятать нельзя);
    • они все одинаковые (по весу, по виду).


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

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

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

Другая компания решила дать интересную задачу. Я думаю, что это часть задачи, которую решают внутри компании. Решили проверить, как решают другие. Вот как она звучит:

Реализовать программу анализа текста. Входной текст произвольный и может быть большим по объему. Количество и содержание метрик определяется самостоятельно. Требования к алгоритму: Программа должна быть расширяема к изменению списку метрик. Масштабируемость. На что обращаем внимание и что анализируем:

  1. Какие метрики предложены кандидатом и их смысл — аналитическое мышление
  2. SOLID анализ предложенного решения — навыки проектирования
  3. Какие шаблоны применены для масштабируемости и расширяемости — архитектурные скилы кандидата. повод при общении затронуть более глубоко вопрос проектирования
  4. Какие синтаксические конструкции языка применены и какая технология используется — использование сахара и средств упрощения кода
  5. Написаны ли unit тесты — что и как тестирует, какие фреймворки и стили тестов использует
  6. Сравнение с когнитивными сервисами — знание трендов применения технологий в реальных проектах
  7. Время, сложность решения, активность дополнительных вопросов выполнения — заинтересованность к решаемым задача/получению оффера

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

Также положительным фактом оказалось преподавание информатики в ВЦНМО. Расспрашивали каково преподавать и трудно ли объяснять сложные вещи на пальцах.

Для меня было неожиданностью, что меня пригласили работать практически все компании (80%), в которых я проходил собеседование. Может это чувство из-за моей низкой самооценки?! После прохождения собеседований, с уверенностью могу сказать, что это несложно, а даже легко и интересно. Так что друзья, не бойтесь собеседований и крупных компаний, будьте самоуверенными, верьте в свои силы и все будет на 5!

Для тех, кто будет готовится или уже готовится к собеседованиям, ниже перечислю ссылки, которые помогут вам (по моему мнению) подготовится к собеседованию на должность Junior C# Developer, .Net Developer.

  1. Здесь собран большой материал по C#, А также есть специальный раздел «Вопросы к собеседованию». Рекомендую пока пройти теоретический материал, а потом попробовать тесты. Тесты находятся здесь (https://metanit.com/sharp/interview/).
  2. Сайт направлен именно на собеседования по разным направлениям разработки, где вы также сможете найти и C#. Там есть очень много «острых» и хитрых вопросов.
  3. CLR via C#. Программирование на платформе Microsoft.NET Framework 4.5 на языке C#. Джефри Рихтер. Эта классическая книга по освоению .Net. Там очень хорошо написано про CLR, про сборки и манифесты. Книга написано на довольно простом языке.
  4. Здесь
    довольно хорошо и просто описывается язык запросов SQL.
  5. Здесь также можете пройти туториал по SQL. В конце будет тест, который очень легко сдать(опять- таки, это лично субъективное мнение).
  6. Здесь собраны наиболее интересные логические задачи с ответами.
  7. Здесь собраны задачи по C#, которые часто бывают на собеседованиях
  8. Здесь собраны задачи по C#, которые часто бывают на собеседованиях
  9. Здесь собраны задачи по C#, которые часто бывают на собеседованиях

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


  1. koldyr
    17.09.2017 14:51
    +26

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


    1. chibiryaev
      17.09.2017 14:54
      +8

      Положить в оба носка по 50 монет, а затем один носок положить во второй


      1. koldyr
        17.09.2017 15:05
        +15

        Спасибо, действительно оригинально. Но, Имхо, слабо отражает реальность. Это скорее ребус, а не задача. Вот про кольцо вагонов мне понравилась.


      1. terrier
        17.09.2017 15:18
        +32

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


        1. gnaeus
          17.09.2017 19:39
          +9

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

          Вот говоришь ты такой: «Нам для БД нужно два сервера, master и hot standby».
          А тебе в ответ: «У нас будет только один сервер».
          А ты: «Ok, давайте развернем standby в виртуалке на том же сервере. Так еще и количество ядер удвоится».

          Все довольны. Занавес =)


          1. nomoreload
            18.09.2017 02:08
            -1

            А толку если физически машина умрёт..)


            1. gnaeus
              18.09.2017 07:00
              +5

              Наверное, мне стоило добавить тег sarcasm :)


            1. Germanets
              18.09.2017 13:34

              Основной толк — заказчик доволен :)


    1. Busla
      18.09.2017 09:43
      +1

      Это же всё не с одного собеседования: в каждой компании по одному-два вопроса по SQL вот, наверное, и накопилось. Скорее всего это не решающие вопросы, а проверка кругозора, насколько известны-понятны кандидату смежные темы/технологии.


  1. sentyaev
    17.09.2017 16:46

    Если вы ответили на все перечисленные вами вопросы, я удивлен, что не 100% компаний сделали вам оффер.
    Интересно что когда в 2007 я собеседовался на позицию начинающего разработчика вопросы были теже (за вычетом новых фич типа LINQ и EF).


  1. Ichimitsu
    17.09.2017 16:47
    +15

    Я конечно не шибко в теме знаний конкретно .Net девелопера, но проведя аналогию, меня такими вопросами заваливали на тех. лида/директора.
    Как то страшно и радостно, что уровень джуниоров так вырос (или это частный случай?)


    1. ukt
      17.09.2017 18:17
      +8

      Смотрят не сколько ты сделаешь/знаешь, а где сломаешься.


      1. Ichimitsu
        17.09.2017 19:10
        +3

        И в чем смысл (для работодателя)? Он кого ищет? Того кого можно сломать или человека, который выполнит задачу?


        1. ukt
          17.09.2017 19:51

          «Сломать» не следует понимать буквально, а следует понимать в контексте возможностей претендента.
          Людей обычно «ломают» не вопросами, рабочей обстановкой.


        1. x67
          18.09.2017 12:44
          +4

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


      1. gnaeus
        17.09.2017 20:04
        +7

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


        И если человек ответил на все вопросы, то тут два варианта:


        • У него есть 10 лет опыта в разноплановых проектах на C#.
        • Он заучил справочник перед собеседованием.

        И в случае собеседования на джуна / мидла ответ очевиден :)


        1. ukt
          17.09.2017 21:38
          +4

          Я ответил на многие вопросы, но с C# слабо знаком.


          1. CrazyFizik
            17.09.2017 23:46

            Ну вообще там были вопросы про LINQ, что чисто C#-фича. Абстрактные классы и интерфейсы на уровне синтаксиса — тоже фича C# и Java, а в том же C++ нету интерфейсов и это уже вопрос, что называть платоновским человеком — вроде две ноги, нет перьев, а [ощипанная] курица.
            MVVM — это тоже MVC--костыль к WPF и Силверлайт (или WPF это костыль к MVVM — это дискуссионный вопрос).
            Event и delegate — опять таки чисто .NET мозгокрутка. В Жабе делгатов нет, а в С/C++ вместо этого дотнетовского зоопарка хватает обычного теплого и лампового указателя. Да и вообще вопрос холиварный ИМХО


            1. ukt
              18.09.2017 17:51

              Собственно, поэтому и было обозначено, что не все, а многие.


          1. gnaeus
            18.09.2017 07:02

            В том-то и дело, что шкала оценки нелинейна. 80% ответов без подготовки лучше, чем 100% с подготовкой.


            1. ukt
              18.09.2017 17:51

              Осталось убедить в этом работудавателей.


    1. xoralex
      17.09.2017 19:14

      Ну может спрашивают то же самое, но ожидания ниже.


    1. DistortNeo
      17.09.2017 19:36
      +4

      Я на половину вопросов про паттерны и ООП вообще в интернет лазил, потому что раньше помнил, но забыл за ненадобностью. Лично для меня вызывает удивление, почему такие очевидные вещи, как использование интерфейсов и абстрактных классов теперь называется паттернами проектирования, и требуется их знание на уровне определений.


      1. Ichimitsu
        17.09.2017 19:44
        +5

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


        1. mclander
          18.09.2017 09:38
          +3

          Я обычно спрашивал в ответ. А вы уверены, что вам надо, чтобы я это знал?

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

          Хотя сеньоров больше по практике гоняют. Что сделал, что не сделал. А вот такой проблемы у вас не было. Была? И как решали? Что правда так? А мы-то почти без извращений обошлись…


          1. Busla
            18.09.2017 09:49
            +2

            Паттерны вводились в разработческий обиход для упрощения общения. А сотрудники которые «всё понимают, а сказать не могут» явно востребованы меньше.


            1. Ichimitsu
              18.09.2017 11:38
              +5

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

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

              Всему свое место.


            1. DistortNeo
              18.09.2017 11:50
              +1

              > Паттерны вводились в разработческий обиход для упрощения общения

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

              > А сотрудники которые «всё понимают, а сказать не могут» явно востребованы меньше.

              То есть сотрудник, которые использует термины «прокладка»/«прокси», «враппер» вместо «фасад», «адаптер» востребован меньше? А термин «шаблонный класс» для программиста на С++ вообще означает совсем другое, а не паттерн.


              1. playermet
                19.09.2017 10:31
                -1

                > А термин «шаблонный класс» для программиста на С++ вообще означает совсем другое, а не паттерн.
                Вы путаете с «шаблонным методом». Паттерна «шаблонный класс» не сущестует.


                1. DistortNeo
                  19.09.2017 14:06
                  +1

                  > Вы путаете с «шаблонным методом». Паттерна «шаблонный класс» не сущестует.

                  От этого суть моего комментария не меняется. Вот шаблонный метод:

                  template <class T>
                  void DoSomething(const std::vector<T> &data);


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


      1. nikolayv81
        17.09.2017 23:42
        +2

        Может смысл в том что на junior-а и изучить насколько хорошая память и знает теорию?
        К примеру в вопросах по sql попался кластеризированный индекс, это же не про sql как таковой а про mssql(в oracle это будет ibdex organazed table), причём же тут .net платформа?
        И в принципе проработав много лет с .net можно с половиной тем не встретится :)


        1. ad1Dima
          18.09.2017 06:55

          причём же тут .net платформа?
          Юольшинство вакансий на .NET это Asp.NET, по крайней мере, субъективно выглядит так. Автор, похоже, тоже на эти выкансии пробовался. Ну а там где asp.net там почти всегда mssql. Вот и вся история.


        1. mclander
          18.09.2017 09:41

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

          Если на теорию отвечает — значит читал, разбирался, помнит. По хорошему можно ещё допвопросы задавать на предмет догадается ли как это применить. Но доп вопросы ещё придумать надо ))))


    1. Femistoklov
      18.09.2017 04:12

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


      1. DesolatoR
        18.09.2017 11:27

        а где же набираться практики как не на позиции джуна?


  1. Zuy
    17.09.2017 18:58
    +1

    Трижды проходил собеседования на позицию Sr.Firmware Engineer в компаниях Tesla, Apple и в каком-то стартапе. Нигде не было задач на логику типа вагонов и монет с носками. В стартапе только были задания на знание школьной математики и физики. Их задают, когда нормальных вопросов для интервью придумать не могут?


    1. timiskhakov
      17.09.2017 20:55
      +3

      Если не секрет, какого рода вопросы были на собеседованиях в Tesla и Apple?


      1. splatt
        17.09.2017 22:18

        Не проходил собеседования в Tesla / Apple, но проходил в других больших компаниях, и советую книжку "Cracking the Coding Interview by Gayle Laakmann McDowell". Автор работала в Google, Microsoft, и Apple, и вопросы в больших компаниях в основном очень похожи.


        1. CrazyFizik
          17.09.2017 23:58
          +2

          У меня походу одна из коллег (девушка, как и автор) походу тайно фанатеет от этой книги. Где-то к 10-ой минуте собеседования с ней мне стало грустно и уныло, захотелось пойти домой и попить кофе с зефирками.
          Если что, то собеседовали человека ко мне и под мою задачу, а она за компанию пошла…

          С другой стороны может и правильный подход


          1. splatt
            18.09.2017 00:23

            Неправильный. Крупные компании, в основном, задают такие вопросы на этапе phone screen / skype interview, потому что они не могут позволить себе возить к себе в офис всех за свой счет, и им нужно отсеять 90%. Они отсеивают тех ребят, которые умеют быстро за ограниченное время решать сложные логические задачи.


            В небольшой компании в таких вопросах смысла нет, гораздо лучше спросить то, с чем необходимо иметь дело в работе (особенности языка, паттерны, boxing / unboxing, итд).


            1. CrazyFizik
              18.09.2017 01:37
              +2

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

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

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

                Point pt = new Point();
                Console.WriteLine(pt);  
              

              Что в принципе нифига не смертельно.
              Или
              int i = 10;
              ArrayList arrlst = new ArrayList();
              arrlst.Add(i);  
              int j = (int)arrlst[0]; 
              

              Хотя ArrayList наверное никто не использует уже… на самом деле .NET в этом плане несколько более дружелюбный. Это вот в Жабе можно испытать батхерт от Long и long например.


              1. DistortNeo
                18.09.2017 09:13

                > Потом все равно по какой-то магической причине у человека который рассказывал на собеседовании про boxing/unboxing но все равно пишет:

                А что не так с первым кодом? Да, там есть боксинг, но накладные расходы на него пренебрежимо малы по сравнению со стоимостью вызова `Console.WriteLine`, а усложнять читаемость кода явным вызовом `pt.ToString()` не хочется.


                1. TraumLeben
                  18.09.2017 12:05

                  `Console.WriteLine` сам вызывает метод ToString() передаваемого в него параметра (MSDN). Так что не совсем даже понимаю где здесь boxing/unboxing


                  1. DistortNeo
                    18.09.2017 12:07

                    Console.WriteLine принимает на вход object. Собственно, при преобразовании структуры Point в object и происходит boxing.


                    1. TraumLeben
                      18.09.2017 12:14

                      Ох, прощу прощения, не сталкивался с Point, думал это просто какой-то произвольный класс, а это структура из System.Drawing. Спасибо за разъяснение.


        1. timiskhakov
          18.09.2017 10:46

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


      1. Zuy
        18.09.2017 01:59

        Во всех местах просили реализовать какой-нибудь вариант очереди либо стэка. Часто спрашивают про static, const, volatile в С. Почему-то популярный вопрос, как определить, что число — степерь двойки. Разные задачки на простые манипуляции с битами, проверяют знания, как работают сдвиги и логические операции. Простые имплементации связанных списков. Спрашивают как работает RTOS, как происходит переключение контекста, семафоры, мьютексы, зачем это все нужно и чем одно отличается от другого. По алгоритмам самыми сложными были вопросы реализовать binary heap и определить, что связанный список имеет кольцо и разорвать его. Никогда не спрашивали ничего про деревья и графы.
        Много вопросов по железу т.к. позиция Firmware Engineer то проверяют есть ли хоть базовые понятия о том, как работает электроника.


        1. DistortNeo
          18.09.2017 09:16

          > Почему-то популярный вопрос, как определить, что число — степерь двойки

          Вызвать инструкцию POPCNT через интринсик компилятора. Такой ответ принимается?


          1. Zuy
            18.09.2017 09:27

            Ответ то примется, но сразу возникнет уточняющий вопрос, как это будет работать на ARM, MIPS, Power, C2000 и т.д. Обычно хотят видеть вот это:
            v && !(v & (v — 1));


            1. DistortNeo
              18.09.2017 09:38
              +2

              В смыле v & (v - 1) == 0 ?


              1. Zuy
                18.09.2017 17:04

                Ну так это тоже что и я написал. Только, в начале, принято аргумент проверить не равен ли он нулю.


                1. DistortNeo
                  18.09.2017 17:30
                  +1

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


                  Тогда я бы написал v != 0 && (v & (v - 1)) == 0.
                  Это выражение будет работать одинаково и в С, и в С++, и в Java, и в C#, и в Javascript.


        1. timiskhakov
          18.09.2017 10:58

          Интересные вопросы. Спасибо за подробный ответ.


  1. Mayurifag
    17.09.2017 19:46
    +15

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

    А ведь это даже не песочница, — приветствую тебя, Хабрахабр образца 2017 года! O tempora, o mores!


    1. Mayurifag
      17.09.2017 22:20
      +1

      JosefDzeranov, спасибо. Вы и сами, наверное, cогласитесь с тем, что стало гораздо лучше.


  1. Caraul
    17.09.2017 20:23
    +3

    sql-ex.ru — для начинающих самое оно


  1. JekaMas
    17.09.2017 22:25
    +6

    Удивлен, что вам, автор, не предложили middle позицию.


    1. Busla
      18.09.2017 09:57

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


      1. JekaMas
        18.09.2017 11:24
        +1

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


        1. Ichimitsu
          18.09.2017 11:41

          Разработка, это не просто набор символов в редакторе. Умение адаптироваться и предвидеть, быстро решать то, чего не ожидал это опыт и джуниор его получит не после полугода на проекте, а после 2-3 выпущенных проектов.


          1. JekaMas
            18.09.2017 11:57

            От новичка зависит. Про адаптироваться, предвидеть, решать то, что не ожидал — не знаю, кто-то бы назвал это senior, а middle — только решение типовых задач, но полностью самостоятельно, а для предвидения использовать опыт старших товарищей вплоть до VP of engineering, который видит общую картину.


  1. dmitry_dvm
    17.09.2017 22:29
    +2

    Про 80% не удивительно, удивительно, что не 100. Такие вопросы и джуниорская зп.


    1. ankh1989
      18.09.2017 06:29

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


      1. JeStoneDev
        18.09.2017 08:33

        это говорит только о бездарности руководства и неспособности отличить квалифицированного специалиста, подходящего на должность, от посредственности


      1. nikolayv81
        18.09.2017 08:35
        +1

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


        1. ankh1989
          18.09.2017 22:08

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


  1. evseev
    17.09.2017 22:44
    +5

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

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

    Может быть кто-то знает ответы на эти вопросы. Зачем это все?


    1. laphroaig
      18.09.2017 02:20
      +2

      А что у него еще спрашивать? Джун на то и джун, что у него еще нет опыта, но должно быть максимум зазубренной теории, которую он через практику, превратит в опыт, и тогда он не будет уже джуном. Смысл слушать как он рассуждает? Опыта нет, рассуждать будет по книгам, которые написали люди, которые хорошо пишут книги, не более. Конечно, пообщаться с ним на предмет его адекватности необходимо, ну а дальше только логические задачки и пр.


      1. Ichimitsu
        18.09.2017 07:21

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


      1. evseev
        18.09.2017 08:44
        +5

        А зачем этот зазубренный максимум? Лично вам как работодателю или коллеге? У вас это «все-все-все» применяется? Вот сильно сомневаюсь. К тому-же по моему опыту обычно так: есть те, кто может запомнить только если понял до мелочей и те, кто может выучить как стишок. Первые могут рассказать куда меньше, чем вторые, но при этом с практической точки зрения первые безмерно полезнее, чем вторые. Вы все еще думаете, что вам нужен максимум? ;)

        По поводу логических задачек. Они славятся тем, что нужно «догадаться». Если ты не догадался, то однозначно не решил. К тому-же такие задачки как с носками и монетками вообще неоднозначны. Скажем решил человек задачку положив половину монеток в каждый из носков, а потом запихнул носок в носок. Решил? Да. Но если мы говорим о программисте, то лучше будет если он ее не решит. Потому, что на практике массив и массив с вложенным массивом не одно и то же. Вот и думай теперь хорошо, что он решил или нет.

        Хотите задачку? Дайте математическую. Для примера. Найти наименьшее натуральное число сумма цифр которого равна 40. Вроде бы ничего сложного. Правда? Но при этом вы проверите как хорошо соискатель знает основы математики, исчисления, как хорошо ориентируется за что отвечает каждый разряд. Начнет-ли он хаотично метаться или пойдет равномерно. Будет использовать прямой перебор или будет, к примеру, использовать максимальное число в каждой разрядности. Решил? Молодец! А 42? И тут могут быть несколько сценариев от мгновенного ответа до повторения части вычислений. Хотите устроить стресс-тест? Не вопрос. Предложите решить эту же задачу с помощью программы. На любом другом языке. Сейчас мало кто требует только один язык. Наверняка в резюме будет Python, а может быть что-то из модного типа Lisp или Haskell. Предложите ему ноут с Linux. Логинитесь в консоль и отдаете. Безусловно нужного языка быть не должно. Мало того, что вы мгновенно узнаете правду ли он написал по поводу администрирования, так еще и узнаете как он себя поведет в экстренной ситуации. Даже если соискатель действительно не первый раз видит Linux он как минимум должен попросить пароль. И даже если первый- не беда. Пусть признается, что нужна помощь и ее стоит оказать и посмотреть как себя поведет дальше и как он решит задачу. Как минимум можно использовать традиционный путь или функциональный подход. Не знаю как вам, а лично мне так нравится куда больше. Во всяком случае намертво заклинить не должно. А потерять перспективного кандидата только потому, что он не умеет монетки по носкам раскладывать — глупо.


        1. vesper-bot
          18.09.2017 11:37
          +2

          Найти наименьшее натуральное число сумма цифр которого равна 40

          Так как система счисления не указана, ответ 4041. ("40" это одна цифра)


          1. evseev
            18.09.2017 17:29

            Если приведет запись суммы цифр числа 40 в 41-ричной системе так что бы в результате получилось 40 — великолепно. А если потом еще и программу напишет, то вообще великолепно ;)


            1. vesper-bot
              18.09.2017 18:04

              Кстати, если не подойдёт 41-ричная, всегда есть палочная. В ней сумма цифр натурального числа всегда равна самому числу. ;)


              1. evseev
                18.09.2017 21:41

                Я ж не против того, что бы от собеседования или теста получали удовольствие все. У меня как-то был случай когда меня отправили по работе на курсы Linux. А так как уровень был продвинутый, то прислали анкету что бы убедится, что не совсем нулевые приедут. А вопросы как всегда какая команда используется для просмотра файлов в директории? И три варианта на выбор. И так мне скучно стало, что я решил, что отнесусь к заданию серьезно. И на каждый вопрос я отвечал, что все команды подходят с примером использования. И так на все вопросы. С курсов позвонили на работу и сказали, что я могу на курсы не ехать и сертификат мне дадут просто так. И что это была самая ржачная анкета за все время проведения всех курсов.


            1. ad1Dima
              19.09.2017 06:23

              А что не так с 41-ричной? знак для числа означающего 40 придумать? ну пусть будет


              1. ad1Dima
                20.09.2017 09:13

                о как, парсер все порезал, оказывается… :(


  1. QtRoS
    17.09.2017 22:46
    +7

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


    1. splatt
      18.09.2017 00:20
      -7

      Возможно потому, что знание теории computer science и типов данных (вроде всяких односвязных-двусвязных списков, двоичных деревьев итд) не имеет отношения к прикладному программированию, только если вы не разрабатываете свой ЯП или свою базу данных.
      И человек может это знать, только если у него в университете был CS101 (чего в российских реалиях ожидать глупо), либо если он готовился к собеседованиям по книгам.


      А вот что такое Boxing/Unboxing при разработке на C# знать надо, но джуниорам не знать это простительно.


      1. Nevod
        18.09.2017 00:54
        +5

        Разве структуры данных и алгоритмы не являются типовым предметом на Ит-факультетах? У меня был такой предмет, хотя назвать свой ВУЗ хоть как-то выдающимся я явно не могу.


      1. laphroaig
        18.09.2017 02:36
        +2

        Ну вы со списками и деревьями тут перегнули конечно. Это основы, без понимания которых, даже к написанию к первому «hello world» приступать нельзя. Я тут тоже перегнул, но это так, для баланса


        1. evseev
          18.09.2017 09:43

          Для баланса нужно было перегибать куда меньше, чем сделали вы. Когда вы в последний раз в боевом проекте реализовывали хоть что-то из основных алгоритмов? Уверен, что в подавляющем большинстве проектов прожект если увидит такой код просто скажет заменить вызовом из библиотеки и попросит больше так никогда не делать. И ведь будет более чем прав. Во-первых вы можете налажать. От этого вообще никто не застрахован. А во вторых вы потратили время на то, что уже сделано и отлично работает. Я уже не говорю про то, что сопровождать ваш код будет сложнее.

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


          1. petuhov_k
            19.09.2017 06:48

            А никто и не говорит, что нужно каждый день релизовывать односвязные списки. Их нужно знать и понимать, чтобы сделать правильный «вызов из библиотеки». Нужно понимать, когда использовать массив, когда словарь, а когда списки. Понимать в каких частях системы это критично, а в каких нет. Вот зачем всё это надо хорошему программисту, которым хочет стать джуниор.

            Если джун не знает списков, это, конечно, не приговор, но как минимум это заставляет задуматься, а чем же он занимался в техникуме/колледже/институте и даёт повод задать дополнительные вопросы.


            1. evseev
              19.09.2017 07:25

              Допустим я не знаю как устроен связанный список. Я только знаю его «свойства». Скажем просто узнал что на каком случае лучше работает. Не могли бы вы привести пример как я мог бы его «неправильно» вызвать? Где там вообще можно ошибиться?


              1. petuhov_k
                19.09.2017 07:48
                -1

                Допустим я не знаю как устроен связанный список. Я только знаю его «свойства».

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


      1. ad1Dima
        18.09.2017 07:02
        +6

        Я никак не могу взять в толк, толи у меня ВУЗ действительно такой офигенный, толи болшая часть хабровчан учили программирование в пирожковых техникумах (Я как-то был на олимпиаде ссузов и ИТшных техникумов там было представлено 3, ещё пяток технических, остальные какие угодно).

        Связанные списки мы проходили на первом курсе колледжа. Это обязательная программа на специальность программиста. В госстандарте это первый год обучения специальности, неважно среднетехническое это образование или высшее. Если их в программе нет, то и госдиплом вряд ли в таком учебном заведении можно получить. Разве что «оператор ЭВМ».


        1. ls18
          18.09.2017 10:26

          Жесть, в моем ССУЗе такого и близко не было. Правда и ССУЗ не в РФ. Еще раз убеждаюсь, что даже средне-специальное образование в РФ лучше, чем в Казахстане.


          1. dimka11
            19.09.2017 09:44
            -1

            Такое не в каждом российском ВУЗе есть.


            1. ad1Dima
              19.09.2017 14:49
              +1

              Давайте так, в каком вузе и на какой специальности этого нет?


    1. ankh1989
      18.09.2017 06:31

      Ну так и интегратор средней руки это не работа мечты для крутого студента.


      1. QtRoS
        18.09.2017 08:45

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


  1. CrazyFizik
    17.09.2017 23:22
    +5

    Вы точно проходили собеседование на .NET Junior?
    Когда меня заставляли собеседовать народ, то на джуниора я обычно спрашивал в какие игры играет, какой сорт виски предпочитает, ну можно было спросить опционально про какие-нибудь общие понятие ООП, чтоб совсем несерьезно не выглядеть.
    А вот решение тестовых задачи и/или ссылки на свой какой-нибудь код — по-моему единственная эффективная по которой можно хоть как-то оценить человека.

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

    Угу и задают вопросы:
    Вы находитесь в пустом поезде...

    Внезапно это как раз олимпиадная задачка…

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


  1. Ivnika
    17.09.2017 23:49

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


    1. CrazyFizik
      18.09.2017 00:22

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

      Но с другой стороны эта задачка не из воздуха — есть такая штука как «кольцевой(циклический) список» — вот и ходи по нему бесконечно, т.к. хрен его знает где начало, а где конец :-)

      С монетками — делим по полам, и один носок вставляем в другой…


    1. vesper-bot
      18.09.2017 14:52
      +1

      Присваиваем n=0. Включаем свет, идем вперед на 2^n шагов, выключаем везде свет по пути, идем 2^n шагов назад, если свет в вагоне выключен, значит 2^n больше или равен числу вагонов (и значит, что больше нет вагонов со светом), включаем, считаем, пока не упремся в вагон со светом, возвращаем посчитанное, иначе увеличиваем n и goto 2. Решение честно вычитано где-то в параллельном потоке трепа.


    1. Sybearian
      19.09.2017 05:48
      +1

      тоже задумался… пока родил такое:
      нужно создать упорядоченную последовательность «включенных» и «выключенных» вагонов при этом откатываться назад и проверять не достигли ли мы конца стека вагонов. И желательно поменьше бегать.

      1) включаем свет в первом. ****1****
      2) двигаем направо выключая свет в двух справа. Затем заходим в следующий и включаем там.*****100*****
      3) возвращаемся по изученным вагонам следим чтоб не произошло изменений 2 темных 1 светлый ***000100***
      4) идем налево и оставляем 3 вагона темными и в следующем за ним включаем свет *111110001001111**
      5) в итоге мы с каждой итерацией увеличиваем последовательность упорядоченных светлых или темных вагонов и при этом проверяем на ошибки прежние «записи» и при обнаружении ошибки понимаем что кольцо замкнулось. Там уже проще вычислить через сумму чисел до числа равного количеству итераций до ошибки плюс число вагонов в «участке с ошибкой».


    1. nomix
      19.09.2017 05:48
      -1

      С поездом же совсем просто, проходишь по кругу, всё включаешь потом выключаешь и считаешь. Или я чего-то не понимаю? Единственная видимая засада — надо знать, что вагоны ограничены определённым количеством, теоретически их же м.б. миллиард/триллион, без ограничения сверху задача не имеет решения.


      1. JosefDzeranov Автор
        19.09.2017 05:49
        -1

        Ну это естественно)


      1. JeStoneDev
        19.09.2017 07:43

        А как определить, что ты уже все включил? Вот идешь ты по вагонам, включаешь свет. А потом 500 вагонов подряд свет включен. И какой вывод из этого делать? Во всех вагонах свет включен? Или же в 501 выключен? Пройти еще 500? А если и там включен, а в 1001 выключен? Когда остановиться и начать выключать?


        1. nomix
          19.09.2017 10:21

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


    1. AlekseyVS
      19.09.2017 05:49

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


      1. JosefDzeranov Автор
        19.09.2017 05:49

        Это вы решили использовать решение с другой задачи про выключатели и лампочки!


      1. Germanets
        19.09.2017 08:31

        Выкручиваем лампочку в нашем вагоне, кладём себе в карман(чтобы диверсант обратно не вкрутил), и идём вперёд, до тех пор, пока не найдём вагон с выкрученой лампочкой…


        1. vesper-bot
          19.09.2017 09:12

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


  1. marshinov
    18.09.2017 00:55
    +4

    Вот без интернирования строк джун ну никак не проживет. Живо себе представляю, как младший разработчик начинает заниматься оптимизацией memory traffic и первым делом приступает к написанию unsafe-кода. Тут ему как раз и помогают эти знания.


    1. ad1Dima
      18.09.2017 07:14
      +2

      Будто только для написания unsafe-кода нужно это знание. Это отличный вопрос для входа в тему работы строк в c#. Все же есть много новичков пишущих s1+s2+s3+s4+s5 в цикле. Есть и много людей требующих любую конкатенацию из двух строк заменять стрингбилдером или string.Format.


      1. marshinov
        18.09.2017 08:12

        Все же есть много новичков пишущих s1+s2+s3+s4+s5 в цикле. Есть и много людей требующих любую конкатенацию из двух строк заменять стрингбилдером или string.Format.
        Без сомнения. Я имел в виду, что лучше задать вопрос «строки — это ref или value type». Чаще всего говорят ref. Потом спрашиваешь, «а почему же они не изменяемые»? И кто такой StringBuilder? Если уже в этом контексте кандидат упомянет интернирование — честь ему и хвала, но на практике моих собеседований такого не происходило :) Может не те джниоры приходят? А «те» только в Москве?


  1. Alex_T666
    18.09.2017 08:57
    -2

    Мне одному показалось, что автор кокетничает, говоря о своем удивлении, что его взяли в 80% случаев и о своей низкой самооценке? Мне показалось что он наоборот несколько самоуверен.


  1. mclander
    18.09.2017 09:30
    -4

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


    — Привет, чувак. Ты что-ли тут самый крутой техдиректор-всех-эректор?
    — Спасибо. До свидания.

    14 секунд. Весело. Быстро. Рекорд.

    PS. А по фразе действительно так. Ищут/ищем же людей, которые не будут меньжеваться на работе. А если товарищ уже на собеседовании зажат и вопроса про промис стремается… Нужен такой, даже если потея ответит правильно? )


  1. Mugik
    18.09.2017 13:10
    +2

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

    Реально, хреново видимо джниорам, кто шарп выбрал. Если там такие джуниоры, то миддлы там наверно вообще какие-то полумифические нереальные типы, чьё прикосновение может исцелять безнадёжных больных.


    1. F0iL
      18.09.2017 14:25

      Честно говоря, удивляют комментарии здесь типа «куда это вы собеседовались, что столько всего спрашивали?». У меня жена два года назад в Петербурге искала работу на C# Junior позицию — все было примерно так же как и написано.
      Разве что джуниора никто не просит на интерью реализовать систему используя десяток паттернов, которая будет построена целиком на асинхронных вызовах и прямо сразу стопроцентно покрыть все тестами — обычно оценивают базовое понимание и спрашивают пару простых вопросов по каждой теме.
      Ну и я бы не сказал что это какая-то C#-специфика. В Java-мире все обстоит примерно так же, да и даже в C++-мире при подборе джуниоров (вспоминаю свой опыт много лет назад) «глубина допроса» примерно аналогична, только с учетом специфики языка и более высокой цены ошибок.


  1. Tsimur_S
    18.09.2017 20:31

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


  1. tomnolane
    19.09.2017 05:48

    благодарю за интересный материал!


    1. JosefDzeranov Автор
      19.09.2017 05:50

      Спасибо!


  1. sadon
    19.09.2017 05:51

    Количество задач — сильно много, на позицию junior — однозначно overhead. Как правило дают 1-3 задачи, иногда, как Вы заметили, задачи дают из трекера компании. Честно говоря, мало тут профильных задач на .Net, скорее они все применимы практически к эдакому универсальному пулу программистов языка/платформы X.


  1. Bugamed
    19.09.2017 05:51

    Уважаемый, не прибедняйтесь. Самооценка у Вас в порядке, если Вы написали статью, уж поверьте


  1. nithrous
    19.09.2017 05:51

    Вопросы про SOLID — это точно не джуниоровский уровень. Конечно, их можно просто зазубрить, но толку от этого…


  1. a-panasenko
    19.09.2017 05:51

    А с поездом решение может кто-то точно сказать? Я вижу так: проходим по всем вагонам, отключаем везде свет, дальше включаем в одном и идем по кругу до него, включая свет в остальных. Получается круг пройти 2 раза.


    1. Ti_Fix
      19.09.2017 09:15

      Решение было выше в комментариях, а в вашем случае, как вы определите, что уже во всех отключили? Ведь количество вагонов не известно, может там просто много подряд отключенных уже до ваших манипуляций было…
      Ссылка на комментарий


  1. Konvergent
    19.09.2017 05:52

    Бывает, что работодатель спрашивает — есть ли к нему какие-нибудь вопросы. У вас такое было? Поделитесь тем о чём спрашивали?
    Хм… интересно, есть топ вопросов работодателю на собеседовании? )

    Да, и действительно, а почему бы не проверить уровень работодателя встречными задачами? )) А то может придётся работать на тугодума)


    1. JosefDzeranov Автор
      19.09.2017 05:53

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


  1. russlansen
    19.09.2017 05:54

    Мне скоро тоже предстоят собеседования на позицию junior .net developer. Прочитал статью, и выпал в осадок, осознав, что ещё не готов, особенно касаемо паттернов и sql. Потом почитал комменты и как то отлягло)))


    1. JosefDzeranov Автор
      19.09.2017 05:54

      SQL точно обязательно, паттерны еще можно не знать.


      1. ad1Dima
        19.09.2017 06:26

        на позицию ASP.NET разраба, ну или .NET Core бекендера. Давайте не уподобляться плохим HR и уточнять область работы.


        1. russlansen
          19.09.2017 13:41

          Вы правы, asp.net developer. Просто мыслью комментария было не это.


        1. Free_ze
          19.09.2017 19:26

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

          ЗЫ Звучит, будто желание узнать область работы — это признак плохого HR'а (=


          1. ad1Dima
            20.09.2017 06:36

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

            ЗЫ. либо вы там лишнюю частицу «не» увидели, либо я не знаю. «не уподобляться» и «уточнять» — однородные сказуемые.
            «Давайте не уподобляться и уточнять» == «Давайте уточнять, а не уподобляться»


            1. Free_ze
              20.09.2017 10:50

              Бывает, конечно, всякое, но типичное десктопное приложение на .NET будет работать в энтерпрайзном окружении с выделеным БД-сервером и часть бизнес-логики на хранимках и жирные джойны на больших объемах данных — это то, с чем реально можно столкнуться.


              1. ad1Dima
                20.09.2017 11:51

                И конечно же в этом ынтырпрайзном окружении клиент напрямую с базой на сервере работает?


                1. Free_ze
                  20.09.2017 12:00

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

                  Слыхал, что в некоторых компаниях бывают специальные БД-разработчики, абстрагирующие всю работу с DAL через хранимки, но на практике такого не встречал.


                  1. ad1Dima
                    20.09.2017 12:06

                    Я слыхал, в других компаниях бекенд пишут, а клиент с API работает. Иногда даже с Rest.


                    1. Free_ze
                      20.09.2017 12:40

                      Суть дела не изменится, даже если нагородить прослоек.


                      1. ad1Dima
                        20.09.2017 12:43

                        Действительно. Клиенту как не надо было знать SQL так и не надо. О чем я и писал.


                        1. Free_ze
                          20.09.2017 15:51
                          +1

                          Я же вам уже оппонировал примером, что полно проектов, где пишут разного плана морды на C# в фулл-стек и SQL — маст ноу (= Сказать, что SQL совсем не нужен джуниору — это сильно сузить круг возможных вакансий для него.


                          1. ad1Dima
                            20.09.2017 16:03

                            Вот еще раз, нахрена «жирные джойны» на клиентах? Все жирные джойны должны быть на серверной стороне. Не важно, на хранимках это будет делаться, на вьюхах, или будет полноценный клиент с Rest-api.
                            Гнать SQL по сети, а уж тем более делать «жирный джойн» на клиенте идея очень плохая.

                            Вот и остается, что SQL нужен бекендерам и ASP.Net-чикам.


                            1. Free_ze
                              20.09.2017 16:32
                              +1

                              Прежде всего, этот холивар на тему идеальной архитектуры не имеет отношения к объективной реальности — джуниор не будет ее строить) Проекты есть и SQL там требуют.

                              Вот еще раз, нахрена «жирные джойны» на клиентах?

                              Вот и я думаю, откуда вы взяли это?) Джойны на сервере, в хранимках. А хранимки должен кто-то писать. Этот «кто-то» должен получать зарплату. Почему бы не писать их самому разработчику, что клиент пишет?) И дешевле выйдет, и лишнее звено коммуникации уйдет.
                              Почему не фигачить дополнительный REST-сервис? А зачем это делать, если для своих внутренних нужд можно обойтись шаренной сборкой?) Больше кода — больше багов, больше систем — больше интеграции, больше API-тестов и прочих сложностей с поддержкой. Не нужно множить сущности и втыкать веб-стек там, где в нем нет нужды.


      1. russlansen
        19.09.2017 13:43

        Ну пробелов по sql не так много, можно покрыть, с паттернами наверное поможет только практика


  1. beavis88
    19.09.2017 11:05

    Какое решение у задачи про поезд? Из того что написано в комментах я не увидел критерия остановки работающего для любой длины состава.


    1. JeStoneDev
      19.09.2017 12:06

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

      Частный случай — 1 вагон. Включаем свет. Выходим из вагона в соседний и оказываемся в изначальном вагоне. c = 1. Выключаем свет. Возвращаемся на 1 вагон назад. Оказывамся в вагоне с выключенным светом => кол-во вагонов равно 1.

      Асимптотическая сложность алгоритма:
      O(n?) — везде свет включен;
      ?(n) — свет включен только в изначальном вагоне.

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


      1. beavis88
        19.09.2017 12:40

        Спасибо. Я на этапе определения цикличности застрял, надо было еще подумать прежде чем сдаваться.


        1. JeStoneDev
          19.09.2017 12:56

          В треде есть и более оптимальное решение с верхним пределом асимптотической сложности O(n*lg(n)) habrahabr.ru/post/338102/#comment_10421568


    1. nitrocaster
      19.09.2017 13:11

      Критерий такой: свет в вагоне с индексом x-n переключается при переключении света в вагоне с индексом x+n, где x — индекс текущего вагона, а n — предположительная длина состава.


  1. taujavarob
    19.09.2017 21:32

    Для меня было неожиданностью, что меня пригласили работать практически все компании (80%), в которых я проходил собеседование.

    То есть из-за некомпетентности собеседующих большинство компаний остались с… носом!

    Спрашивается - что не так так эти компании делали, что упустили нужного им программиста?