ASP.NET, поиск работы, вопросы собеседований

    Возможно, этот топик будет интересен начинающим ASP.NET программистам. Я тут в последнее время хожу по собеседованиям, хочу поменять работу. Собрал некоторые вопросы, которые спрашивает технический персонал на собеседовании (на позицию Senior .NET developer).
    Итак:

    ASP.NET


    Есть ли в ASP.NET механизм кеширования и что он предоставляет?
    Когда в жизненном цикле страницы возникает событие Button1_OnClick? (Считается, что на форме есть кнопка. На кнопку кликнули.)

    Расскажите, как бы Вы сделали такую задачу:
    Есть список объектов (например, входящих сообщений).
    1. Вывести их на страницу Репитером так, что бы около каждого заголовка был ЧекБокс.
    2. Юзер выделяет некоторые сообщения (через ЧекБоксы), жмет «ОК», выбранные сообщения должны быть удалены.

    .NET, OOP


    Назовите концепции ООП.

    As, is – что это, как применяется?

    В чем разница между абстрактными и виртуальными классами? Между виртуальными и абстрактными методами?

    Dispose(), Finalize() – что это за методы, как используются в .NET?

    Для чего в .NET используется конструкция using(…){…}? Причем тут IDisposable?

    Что выведет этот код (чур в студию не подглядывать! :):
    — XmlDocument x = new XmlDocument();
    x.LoadXml("<root />");
    Console.WriteLine(x.ToString());
    Console.ReadKey();

    SQL


    Какие джоины знаете? В чем разница?

    Есть схема

    Customer (Id, Name)
    Sale (Id, CustomerId, Date, Sum)

    Написать запросы:
    1. Лучший покупатель за все время (тот Customer, у которого суммарно больше всего поле Sum)
    2. Лучший покупатель для каждого месяца (то же самое, что и 1, только для каждого месяца текущего года)

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

    UPD!
    1. В топике — только те вопросы, которые я запомнил. Были ещё вопросы совсем простые (как инвертировать строку?) и вопросы, которые я забыл :)
    2. Место действия — Москва.
    3. Перенёс в .NET
    Поделиться публикацией

    Комментарии 78

      +1
      Какие-то простые вопросы на Senior'а. Когда начинал работать джуниором вопросов было больше и сложнее.
        0
        Я сам не ожидал такого, поэтому и написал, что "этот топик будет интересен начинающим ASP.NET программистам".
          +2
          Они то вроде и простые, но, к примеру, далеко не всякий ответит на вопрос -В чем разница между абстрактными и виртуальными классами? И даже просто на вопрос, что такое виртуальный класс?
            0
            Поведаете, что это такое? ;)
            • НЛО прилетело и опубликовало эту надпись здесь
                0
                Вопрос - "что такое виртуальный класс?". "Невозможно создать экземпляр абстрактного класса" - не ответ на этот вопрос.
                Не понял как перешли на исключения, мне было непонятно только про виртуальный класс. Мой ответ на ваш вопрос - отличается тем, что второй вариант компилятор не осилит ;)
                Согласен, вопросы джуниорские :)
                  0
                  Во втором варианте синтаксическая ошибка. Правильно - throw; (без скобок).
                  Если это поправить, работать оба варианта будут одинаково.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      Я все-таки не до конца осмыслил ваш вопрос :)
                      Приведенные варианты будут отличаться стек-трейсом. Первый вариант не сохраняет предыдущее состояние стека, поэтому при получении исключения не будет видно, что к нему привело. Во втором варианте все более правильно.
                      • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Первая линка, полученная от гугла, ведет на топик, где тоже пытаются выяснить, что же такое "виртуальный класс".
                    +1
                    В .NET нет понятия виртуальный класс. Вопрос скорее был в чем разница между абстрактным классом и интерфейсом.
                      0
                      Да я тоже так думаю, просто странно, что народ уперся в виртуальные классы. Хабразаговор...
                        0
                        Так, может быть, в этом и была вся соль вопроса? :)
                          0
                          Скорее был вопрос по виртуальный конструктор, которых в .Net тоже нет, но есть такой паттерн
                            0
                            Ну, это вообще куда-то в другую степь :)

                            Можно предположить, что любой класс, содержащий виртуальный член (метод, свойство, индексатор или событие) считается виртуальным. Подобно тому, как в C++ были сделаны абстрактные классы.
                              0
                              Возможно, но такого определения я не встречал.
                        0
                        Скорее просто не знает и ищет работу :)
                        0
                        хмм. Что значит нету.

                        http://msdn.microsoft.com/en-us/library/…(VS.80).aspx
                        В .Net есть виртуальные классы, методы, свойства и индексаторы. Их отличие в том что в унаследованных классах они могут быть переопределены (override) а могут и нет.

                        В абстрактных классах, все элементы имеющие абстрактный идентификатор должны быть реализованы в унаследованном классе.

                        http://msdn.microsoft.com/en-us/library/…(VS.80).aspx

                        abstract class ShapesClass
                        {
                        abstract public int Area();
                        }
                        class Square : ShapesClass
                        {
                        int x, y;
                        // Not providing an Area method results
                        // in a compile-time error.
                        public override int Area()
                        {
                        return x * y;
                        }
                        }

                        По поводу различий между абстрактным классом и интерфейсами:
                        http://en.csharp-online.net/Should_I_use…
                          +1
                          Виртуальных классов в .Net нету: The virtual keyword is used to modify a method, property, indexer, or event declaration (из первой ссылки). virtual class CTest { void test() {} } не скомпилится
                            0
                            да действительно, как то на автомате прочел... то что хотел увидеть видимо...
                      +1
                      А вообще, в .NET разве есть такое понятие как "виртуальный класс"? Насколько помню, в C++ это связано с множественным наследованием. А в .NET - чего-то не припомню...
                        +1
                        Да и в C++ было скорее "виртуальное наследование" или "виртуальный базовый класс"
                          0
                          .NET это платформа. C++ - язык. Или вы пишете .NET подразумевая C#?
                            0
                            Да, я согласен с вами, что не очень корректно (или очень некорректно?) сравнивать платформу и язык. Но аналогии так или иначе провести можно. Я думаю, вы понимаете, о чем я.
                        0
                        реальное простые вопросы какие то. У меня на каждой джунировоской позиции либо нет вопросов кроме как по технологии либо ужас стр на 5. Основные вопросы из разряда напиши мне алгоритм в котором конь обследует все клетки шахматной доски и можно ли это сделать.

                        Бывает еще тест стр на 10-50 на англ. язык (отн. к международным компаниям или работающим на зарубеж).
                        +2
                        В принципе интересно, хоть работу менять и не собираюсь.

                        Фигово когда приходишь в серьезную фирму, главного девелопера у них нету, на его должность и претендуешь. К тебе присылают кого-то из программеров, чтобы он тебя протестировал с "технической" стороны. Один раз так попал, ну такую лабуду спрашивал. Как сделать бекап базы? Говорю либо такой-то командой, либо из средства визуального управления. Так в бесплатной же версии SQL нет такого средства (пытается поймать), говорю уже года 3 как есть. Чешет репу, а какими средствами Visual Studio вы пользовались, спрашивает. На вопрос что именно вы имеете ввиду под средствами Visual Studio - уточнить не смог. Не могу вспомнить какие остальные вопросы были, но тоже реально на каком-то вообще непонятном уровне и к делу как-то мало относящиеся.. Не знаю что он потом про меня говорил директору по персоналу, но мне потом не перезвонили :)

                        С помощью добрых людей сможете перенести топик в блог .NET, думаю там это будет полезно.
                          0
                          Это, к стати, интересно в каком городе?
                            0
                            Москва
                            Спасибо за комментарии, обновил топик.
                              0
                              В Киеве мне часто шлют просто предложения, мог бы вас предложить.
                            0
                            И правда как-то совсем просто. Даже для джуниора просто.
                              +1
                              А эти вопросы задавались в одной фирме? Какую зарплату предлагали?
                                +1
                                Я ошибаюсь, или вы опубликовали пост с целью облегчить людям прохождение собеседования, тогда как реальный уровень их знаний ниже требуемого для данной вакансии?
                                  0
                                  Что-то в Ваших словах есть =)) Но вот я, на пример, хотя и уверен(наверное даже силен:) в себе как разработчик, но подобные собеседования у меня слабое место и почитать возможные варианты вопросов считаю полезным. Вот-с..
                                  P.S.: Под .net не разрабатываю.
                                    0
                                    Вообще все зависит от того как человек, читающий, пост к этому подойдет.
                                    Эти вопросы — как тест для себя. А я все тесты использую для систематизации своих знаний, поэтому одно время штурмовал MS и Brainbench, в общем-то, +/- успешно. Хотя, всех мелочей, а иногда и не мелочей, до сих пор не знаю. Поэтому и из вышеперечисленных вопросов кое что для себя пометил.

                                    А человек который не разбирается в технологии.. хоть читай, хоть не читай вопросы — все равно по нему можно понять в большинстве случаев, заучил он сабж или понимает.
                                    0
                                    Перечисленные вопросы, особенно в области ASP.NET/.NET/OOP по идее знает практически каждый кто хоть чуть-чуть работает с платформой .NET.
                                    Уровень этих вопросов тянет не то что на junior, а скорее на сотрудника которого набирают чтобы с 0 обучить программированию вообще и на данной платформе.
                                      0
                                      А я вот к стыду своему не на все готов ответить. К примеру репитером не пользовался ни разу, сразу не берусь рассказать как сделать. Но через мсдн бы сделал наверное за полчаса. Или вот про кэширование, о чем этот вопрос? Кэширования страниц у клиента или на сервере? Что значит виртуальные классы? Не знаю такого, абстрактные знаю, интерфейсы знаю, виртуальные классы - не знаю (и гугл похоже не знает)... Using тоже не пользовал ни разу, но теперь вот гляну ради любопытства... Остальное, вроде знаю.

                                      Судя по комментам от Хабралюдей, я совсем ламер, даже не джуниор...

                                      Кстати, я однажды устраивался на работу, проходным вопросом был один: чем left join отличается от inner join... Не Москва.
                                        0
                                        Помоему когда есть внушительный список работ, по-крайней мере такие вопросы, отпадают.
                                          0
                                          Какой-то куцый и неинтересный набор вопросов.

                                          Вот для интереса более полный:
                                          http://rsdn.ru/Forum/message/1098486.1.a…
                                            0
                                            Огромное спасибо. Как раз надо менять место работы и готовиться к собеседованиям, а то, сидя на одном саппортовом проекте, забыл даже простейшие вещи.
                                              0
                                              Блин, вопросы там конечно интересные. Их можно учить, больше для своего развития и выявления слабых областей своих знаний. Но кто это все применял на практике по необходимости? Я, вроде, и долго работаю с .NET, но, к примеру, PID не разу не приходилось получать. Работаю в основном в ASP.NET, но там это в самых базовых и общих вопросах. Даже не знаю.

                                              PS. Этот перечень вопросов - перевод. В инете накопал подробное разъяснение первых семи впосросов на английском, но на остальние ничего нету. Ни у кого ссылки нету?
                                            0
                                            спасибо, полезно1
                                              0
                                              Сам не раз собеседовал людей по .NET и вот, что могу сказать - всегда найдется что спросить, чтобы человек любой квалификации не смог ответить.
                                              Главное, по-моему в этой ситуации дать понять собеседователю, что да, я в этом конкретном аспекте не шарю, но зато капните рядом, и там все есть.
                                                0
                                                Мои 5 копеек

                                                ООП:
                                                В чем принципиально отличие интерфейсов от абстрактных классов без реализации
                                                Почему нельзя наследовать структуры
                                                Что такое полиморфизм, как работает (про остальные концепции ООП в принципе можно и не спрашивать :))
                                                Тут же про gof что-нибудь спрашивают

                                                .NET:
                                                Различие value и referece типов
                                                Боксинг, анбоксинг. Тут же обычно спрашивают об отличие коллекций первого фрейморка от второго и выше
                                                Почему string Является immutable
                                                отличие const от readonly
                                                  0
                                                  Хотелось бы получить ответы на 2 вопроса. Желательно, аргументированные.
                                                  1. Отличие коллекций первого фреймворка от второго и выше
                                                  2. В чем различие между XML Web Services с использованием ASMX и .NET Remoting с использованием SOAP?
                                                    0
                                                    1. Ну основное отличие заключается в появлении дженериков. Соответвтенно первое - коллекции стали типизироваными и второе: пропала необходимость в боксинге/анбоксинге в случае с value типами и преобразовании типов в случае c reference Типами.

                                                    2. На вскидку мого назвать одно отличие. Ремотинг типы могут хоститься как в IIS, так и в любом другом приложении, включая консольные, windows services, и т.д. А asmx только в iis
                                                      0

                                                      ...А asmx только в iis

                                                      Ошибаетесь. Читайте, например, про System.Web.Hosting.ApplicationHost
                                                        0
                                                        Хорошо, Вы правы. Надо было написать не iis, а web сервер.
                                                        VS, к примеру, тоже свой собственный веб сервер имеет
                                                          0
                                                          И не веб-сервер. У меня, например, рантайм ASP.NET хостится внутри NT-службы (которая, формально, веб-сервером стала ровно после того, как в ней появился AppDomain ASP.NET'а).
                                                        0
                                                        Спасибо. Насчет первого - так и думал.
                                                    0

                                                    Были ещё вопросы совсем простые (как инвертировать строку?)

                                                    Ой ли? Не такой уж он и простой, этот вопрос. Вот вы как эту задачу решили?
                                                      0
                                                      Если мне не изменяет память, то выглядит это так:


                                                      public string Reverse(string str)
                                                      {
                                                      char[] array = str.ToCharArray();
                                                      char temp;

                                                      for (int i = 0, len = Math.Floor((float)((array.Length - 1) / 2); i <= len); ++i)
                                                      {
                                                      temp = array[i];
                                                      array[i] = array[array.Length - (1 + i)];
                                                      array[array.Length - (1 + i)] = temp;
                                                      }
                                                      return new String(array);
                                                      }
                                                        0
                                                        *зря я условие цикла решил оптимизировать — ошибка вкралась.
                                                        правильно так:


                                                        for(int i = 0, len = (int)Math.Floor((float)((array.Length - 1) / 2)); i <= len; ++i)
                                                        ...
                                                          0
                                                          Я бы прям на собеседовании ударил по рукам за такое условие прямо в цикле. :)
                                                            0
                                                            Согласен, выглядит не очень, но вычисление Math.Floor((float)((array.Length - 1) / 2)) на каждом шаге, ИМХО, не очень хорошо.
                                                              0
                                                              Именно об этом я и говорю.
                                                                0
                                                                У меня это значение вычисляется один раз.
                                                                Вот математика на поверку там была не к месту, хватит и (array.Length - 1) / 2.
                                                            +1
                                                            Жутковато :) Вот вам навскидку три варианта (сравните условие в for в Reverse2 с вашим), ни один из которых, однако, до конца верным не является:

                                                            using System;
                                                            using System.Diagnostics;
                                                            using System.Text;

                                                            namespace StringReversal
                                                            {
                                                            class Program
                                                            {
                                                            static void Main()
                                                            {
                                                            Console.WriteLine(Reverse1("Hello world!"));
                                                            Console.WriteLine(Reverse2("Hello world!"));
                                                            Console.WriteLine(Reverse3("Hello world!"));

                                                            Debug.Assert(Reverse1("Hello world!") == Reverse2("Hello world!") &&
                                                            Reverse2("Hello world!") == Reverse3("Hello world!"));
                                                            }

                                                            static string Reverse1(string source)
                                                            {
                                                            char[] chars = source.ToCharArray();
                                                            Array.Reverse(chars);

                                                            return new string(chars);
                                                            }

                                                            static string Reverse2(string source)
                                                            {
                                                            StringBuilder builder = new StringBuilder(source);
                                                            for(int i = 0; i < source.Length / 2; ++i)
                                                            {
                                                            char temp = builder[i];
                                                            builder[i] = builder[source.Length - i - 1];
                                                            builder[source.Length - i - 1] = temp;
                                                            } // for

                                                            return builder.ToString();
                                                            }

                                                            static string Reverse3(string source)
                                                            {
                                                            return
                                                            source.Length > 0
                                                            ? source[source.Length - 1] + Reverse1(source.Substring(0, source.Length - 1))
                                                            : string.Empty;
                                                            }
                                                            }
                                                            }
                                                              0
                                                              Сдаюсь :)
                                                              Про Array.Reverse() даже не задумался.
                                                                0
                                                                Тип System.Char хранит Code Unit'ы в UTF-16. Для символов в кодировке BMP один объект класса Char представляет ровно один символ текста. А вот для символов, закодированных в, например, Supplementary Plane, каждый символ будет либо High, либо Low Surrogate (возможно, не все варианты перечислил, но идея должна быть ясна). Об этом даже в MSDN сказано:

                                                                Most Unicode characters can be represented by a single Char object, but a character that is encoded as a base character, surrogate pair, and/or combining character sequence is represented by multiple Char objects. For this reason, a Char structure in a String object is not necessarily equivalent to a single Unicode character.

                                                                Так вот если взять и просто перевернуть все char'ы в строке, то в результате получится неверная UTF-16 строка.

                                                                Выход из положения выглядит примерно так:

                                                                static string Reverse4(string source)
                                                                {
                                                                return new string(new List<char>(ReverseImpl(SurrorgateAwareStringEnumerable(source))).ToArray());
                                                                }

                                                                static IEnumerable<T> ReverseImpl<T>(IEnumerable<T> source)
                                                                {
                                                                Stack<T> stack = new Stack<T>();
                                                                foreach(T value in source)
                                                                stack.Push(value);

                                                                return stack.ToArray();
                                                                }

                                                                static IEnumerable<char> SurrorgateAwareStringEnumerable(string source)
                                                                {
                                                                for(int i = 0; i < source.Length; ++i)
                                                                {
                                                                if(char.IsSurrogate(source[i]))
                                                                {
                                                                yield return source[i];
                                                                yield return source[++i];
                                                                } // if
                                                                else
                                                                yield return source[i];
                                                                } // for

                                                                yield break;
                                                                }
                                                                  0
                                                                  Спасибо, возьму на заметку!
                                                                0
                                                                Используйте пожалуйста это для подсветки кода: http://poison.qsh.ru/
                                                                  0
                                                                  Пытался. Хабр не проглотил расцвеченный кусок кода.
                                                                    0
                                                                    Да ладно? Что-то сказал?

                                                                    Я попробую:

                                                                    using System;

                                                                    using System.Diagnostics;

                                                                    using System.Text;



                                                                    namespace StringReversal

                                                                    {

                                                                      class Program

                                                                      {

                                                                        static void Main()

                                                                        {

                                                                          Console.WriteLine(Reverse1("Hello world!"));

                                                                          Console.WriteLine(Reverse2("Hello world!"));

                                                                          Console.WriteLine(Reverse3("Hello world!"));



                                                                          Debug.Assert(Reverse1("Hello world!") == Reverse2("Hello world!") &&

                                                                            Reverse2("Hello world!") == Reverse3("Hello world!"));

                                                                        }



                                                                        static string Reverse1(string source)

                                                                        {

                                                                          char[] chars = source.ToCharArray();

                                                                          Array.Reverse(chars);



                                                                          return new string(chars);

                                                                        }



                                                                        static string Reverse2(string source)

                                                                        {

                                                                          StringBuilder builder = new StringBuilder(source);

                                                                          for(int i = 0; i < source.Length / 2; ++i)

                                                                          {

                                                                            char temp = builder[i];

                                                                            builder[i] = builder[source.Length - i - 1];

                                                                            builder[source.Length - i - 1] = temp;

                                                                          } // for



                                                                          return builder.ToString();

                                                                        }



                                                                        static string Reverse3(string source)

                                                                        {

                                                                          return

                                                                            source.Length > 0

                                                                              ? source[source.Length - 1] + Reverse1(source.Substring(0, source.Length - 1))

                                                                              : string.Empty;

                                                                        }

                                                                      }

                                                                    }


                                                                    * This source code was highlighted with Source Code Highlighter.
                                                                      0
                                                                      Получилось. :)
                                                                        0
                                                                        Почему оно вставляет между строками пустую строку? Раньше вроде нормально было.
                                                                          0
                                                                          Он сам не вставляет пустую строку. Если только вы ему сами её вставляете в коде.
                                                                            0
                                                                            Да, точно.
                                                                            Это народ ставит наверное флаг "Place "Line Break" as newline".
                                                                            Хотя сам пробовал - было нормально, потом начало вставлять.. Может я сам случайно нажал :)
                                                              0
                                                              Можно еще сделать со стеком, два цикла, в одном push в другом pop :\
                                                              0
                                                              Как видно из обсуждения, сложно с этими виртуальными классами. :-)
                                                              А всё потому, что вопрос очень не хороший. Такое понятие есть и явно торчит действительно в C++. В C# и Java их нет.

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

                                                              А вообще это беда, большинство людей с завидным отервенением начинают оптимизировать какой-нить плёвый цикл обработки строк. В то время, как хорошее проектное решение покрывает всю эту мелкую оптимизацию, как бык овцу. :-)
                                                                0
                                                                Согласен. Как уже где-то писали:
                                                                Хороший программист пишет гениальные вещи тупым кодом, а не наоборот.
                                                                0
                                                                Интересно. Продолжайте обязательно.
                                                                  0
                                                                  думаю на сеньйора не хватает вопросов по архитектуре.

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

                                                                  2) вообще вопросы из опыта кандидата могут показать многие вещи как например: какие проблемы он решал и почему именно пршел к даному решению. это помоему важнее чем перевернуть стринг.

                                                                  3) задачи по решению проблемы с нагрузкой на сервер.
                                                                    0
                                                                    Набор схожих фокусов с последующим разоблачением: http://ewwwo.com/renny/.NET%2C%20собесед…
                                                                      0
                                                                      А вот это как:

                                                                      Есть список объектов (например, входящих сообщений).
                                                                      1. Вывести их на страницу Репитером так, что бы около каждого заголовка был ЧекБокс.
                                                                      2. Юзер выделяет некоторые сообщения (через ЧекБоксы), жмет «ОК», выбранные сообщения должны быть удалены.

                                                                      Если не трудно, поделитесь кодом. Спасибо.
                                                                        0
                                                                        Надо просто у каждого checkbox задать имя в формате name[n], где n — числа… имена выделенных чекбоксов уйдут сервер
                                                                          0
                                                                          Я обычно через добавление CommandArgument делаю.

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

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