Pull to refresh

Как я проходил опросник по c#

Level of difficultyMedium
Reading time3 min
Views8.8K

Только что мне предложили пройти анкету с вопросами по c#, ну я быстро ответил и довольный отправил его эйчару. Удивило потом то что я оказывается мало на что ответил правильно. Было странно, вопросы то вроде простые, ну я начал разбираться и сравнивать правильные ответы с неправильными. Итак вот что было:

  1. На какие сегменты делится память в .NET?

    Мой: Куча, стек

    Правильный: На стек и кучу

  2. Сколько поколений внутри кучи малых объектов?

    Мой: 3

    Правильный: 3 (0, 1, 2)

  3. В чем разница алгоритмов сборки кучи малых и больших объектов?

    Мой: При сборке малых она сжимается, дефрагментируется, при сборке loh остаются "дыры", но при указании нужного параметра и там можно запустить сжатие.

    Правильный: В наличие у кучи малых объектов дефрагментации

  4. Что такое интернирование строк?

    Мой: Оптимизация когда все одинаковые строки заменяются одним объектом строкой.

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

  5. Что такое StringBuilder?

    Мой: Построитель строк, более оптимизирован чем обычная конкатенация, выделяется меньше объектов строк.

    Правильный: Способ оптимизации построения больших строк

  6. var list = new List { 1, 2, 3, 4, 1, 2 };
    var result = list.Where(i => i > 1);
    Что будет лежать в переменной result и сколько раз выполнится проверка i > 1?

    Мой: 2,3,4,2 Выполнится столько сколько там элементов: 6

    Правильный: Нисколько, в result будет IEnumerable

  7. Во что разворачивается конструкция lock?

    Мой: monitor

    Правильный: Monitor.Enter и Monitor.Exit

  8. Чем Monitor отличается от Mutex?

    Мой: mutex сквозной для ОС, монитор в рамках процесса

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

  9. Как запустить Task?
    Мой: .Run( => ...)

    Правильный: Через методы Run, StartNew и через вызов асинхронного метода без ожидания

  10. Кто управляет потоками на кготорых запускаются Task'и?
    Мой: ThreadPool

    Правильный: TaskScheduler

  11. В чем разница между Task.WaitAll и Task.WhenAll?

    Мой: второй вариант асинхронный, можно эвейтить, первый блокирует поток.

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

  12. О чем паттерн Dependency Injection?

    Мой: Суть в том что конструирование объекта и его временем жизни управляют из вне

    Правильный: О том через какие точки модуля (класса) может произойти инъекция зависимости

  13. Расскажите о чем буква S в акрониме SOLID

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

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

  14. Чем паттерн Repository отличается от UnitOfWork?
    Мой:

    UnitOfWork накапливает изменения происходящие в программной модели и применяется их сразу за одно действие не создавая долгой транзакции.

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

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

Итак, в 3м у меня оказалось правильнее «правильного», если задать GCSettings.LargeObjectHeapCompactionMode, то loh так же сожмется.

В 4 "правильный" ответ не содержит саму суть почему строки куда то там перемещаются? Нет информации то что это именно для одинаковых.

5е опять у меня более полное объяснение. Это частая замена конкатенации.

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

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

10, тут без комментариев, все помнят что потоки для задач из ThreadPool, но планирует это шедулер, ошибся, поспешил, справедливо.

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

13, очень специфическая формулировка в "правильном" ответе, все же принято говорить про причину изменения, что является ей. Или ответственность класса. То что бизнес процесс имеет части это неоспоримо, но какие это части и кто их information expert?

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

"UnitOfWork" = "абстрактная транзакция" это конечно жестко, даже Fowler бы не прошел такой простой опросник.

В общем мне интересно мнение еще кого то по этому поводу.

Tags:
Hubs:
Total votes 15: ↑10 and ↓5+8
Comments34

Articles