Как пройти СОБЕСЕДОВАНИЕ на C# & .Net РАЗРАБОТЧИКА? (2)
HTML-код
- Опубликовано: 31 май 2024
- 🤚Привет! Вы на канале IT школы TeachMeSkills. И я ведущий рубрики НАТИВ Илья Рублевский.
Ну что ж, вы, наверняка, ждали этот выпуск. Мы делаем продолжение.
Наш наставник Паша Львов продолжит давать ответы на каверзные вопросы с собеседований по C# и .Net.
Погнали к вопросам!
❗️Ссылка на курс TeachMeSkills (BY) - clck.ru/34qTbR
❗️Ссылка на курс TeachMeSkills (RU) - clck.ru/34qTdB
🧔Профайл Паши - / pavel-lvou-328139146
🧔Telegram Ильи (для ваших предложений по контенту) - @ilyarublevsky
Что еще будет в видео👇
0:00 - Интро
2:22 - Концепция сборщика мусора в C#
10:32 - Цель использования операторов в C#
12:27 - Разница между статичным методом и методом экземпляра
13:59 - В чем суть виртуального метода
17:25 - Разница между private и protected методами
20:20 - Разница между throw и throw ex
22:50 - Разница между структурой и классом в C#
25:01 - Что такое лямбда-выражение и как оно используется
27:58 - Разница между var и dynamic в C#
31:07 - Какова цель ключевых слов ref и out в С#
33:20 - Какова цель ключевого слова lock в С#
36:45 - В чем разница между StringBuilder и String в С#
38:15 - Что такое extension methods в C#
40:09 - Каковы преимущества при использовании внедрения зависимостей в код
46:05 - В чем разница между списком и массивом
48:24 - Как реализовать singleton
52:51 - Какие типы шаблонов проектирования существуют в C#
Ну парень неплохо на вопросы отвечает, остался главный вопрос, чтобы взять его на джуна - есть ли у него 15 лет коммерческого опыта?
А можно в коммерческий опыт сложить опыт работы программиста и преподавателя? Если да, то с большим запасом хватит :D
@@JinOptimistОчень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
@@user-si3xd9kc9d по сути всё просто. Если метод абстракнтый, то он не содержит в себе никакой реализации и ты обязан реализовать его в классе-наследнике через override (как и в случае с интерфейсом), а если виртуальный, то ты просто наследуешь его реализацию, но, если потребуется, можешь его переопределить внутри класса-наследника и этот метод внутри наследника будет считаться приоритетным, в случае, описаном в этом видео на 14:00
Модификатор sealed же запрещает переопределение метода. Пример: Есть класс Person с виртуальным методом SayHello, от него наследуется класс User, который переопределяет этот метод через override, и следующим указываем модификатор sealed, что будет значить следующее - если какой-либо класс наследуется от класса User, он не сможет переопределить метод SayHello, но, так как этот метод был виртуальном в классе Person, то предпочитаемым, в таком случае, будет именно метод класса User. Как-то так, а в целом, более толково и подробно можно почитать здесь:
metanit.com/sharp/tutorial/3.19.php
У Паши без сомнений преподавательский талант. Так хорошо и просто получается обьяснить сложные темы.
вне всякого сомнения. полностью согласны)
Настоящее испытание "рассказать просто о сложном" ещё впереди, но я безусловно буду стараться )))
@@JinOptimist Паша ты просто молодец. Удачи тебе и счастья в жизни)
Меня так часто подозревали сеньором, но не брали на джуна)
К сожалению, та же херня :(
Очень хотелось бы увидеть подобный ролик, но с уклоном в web разработку на c#. Обкашлять все тонкости с ASP и EF. Думаю очень многим было бы интересно посмотреть.
Всё таки с одним только знанием языка и ООП далеко не уехать на собесе. Но видео всё-равно - огонь!!!🔥🔥🔥
А по математике что то спрашивают - логику, теорвер, матстатистику и т.д. ?
@@ei2292дают полностью исписанную тетрадь, но с небольшим местом на полях и просят доказать ВТФ(Великую Теорему Ферма), не прибегая к методам эллиптических кривых
@@ei2292 смотря куда идешь
@@ei2292нет
dynamic - это не попытка сломать строгую типизацию, это необходимый инструмент, которым не просто можно, а нужно пользоваться тогда, когда вы из c# пытаетесь взаимодействовать с объектами, которые не принадлежат инфраструктуре C# (внешние по отношению к языку) и пришли к вам в код из динамически типизированной парадигмы. Например, когда вы из C# пытаетесь взаимодействовать со структурой DOM из Js или пользуетесь Python рантаймом из шарпа (да, такой вполне себе возможно, см. IronPython). Когда то взаимодействие между разными системами в винде происходило только через интерфейсы COM объектов, которые существовали задолго до C# и были полностью динамическими, что доставляло довольно много проблем там, где казалось бы никаких проблем быть не должно, ведь и то и другое разрабатывает одна и таже контора. В целом, без dynamic было очень не просто с динамическими структурами, приходилось изобретать дикие костыли с рефлекшеном, что сложно с точки зрения кода и медленно с точки зрения рантайма. Сейчас, конечно, такое уже реже встречается, потому что и COM уже не так актуален и есть TypeScript, с которым из шарпа можно работать нативно, ведь оба строготипизированные.. да и необходимость пользоваться питоновскими или другими рантаймами и их классами из шарпа - довольно специфическая история. Но и сейчас динамические структуры встречаются, например json с точки зрения C# - вполне себе динамически типизированный, если не десериализован в какой то конкретный тип.. и вы можете десериализовать его в dynamic и и работать с ним как с динамической структурой, без необходимости описывать заранее в классе. Для быстрого прототипирования - очень крутая штука, для продакшена, конечно, так лучше не делать) Без dynamic все это было бы намнооооого геморойнее.
То чувство, когда по мнению Павла "сеньорский вопрс" про DI container, задают на каждом собеседовании джуна. Говорю не от балды, а прошел около 10 собесов и на каждом спрашивали про внедрение зависимостей, время жизни и что от чего не желательно ставить в зависимость (привет чистая архитектура). А вообще у Паши дар приподносить информацию, вроде всё что он говорил тут я знаю, но после просмотра многие вещи лучше устаканились! Жду 3 выпуск😅
Стоит задуматься и сделать!) спасибо
Вопросы про DI сильно отличаются по глубине ожидаемого ответа.
Для джуна достаточно знать, что DI есть. Вот тут регистрирует, вот тут запрашиваем.
А вот архитектурные вопросы, например, о возможности ограничения доступа на уровне DI, это уже совсем не для джуна вопрос.
PS Приятно знать, что эта работа кому-то приносит пользу. Буду и дальше стараться ))
@@JinOptimistУ моего друга на стажировке спрашивали про время жизни. И в чем проблема когда в компонент с большим временем жизни попадает компонент с меньшим временем жизни.
@@DimaBriquezда ладно, только хотел об этом написать)
Тоже на стажировку проходил, и тоже спрашивали, что будет если в скоупе транзиент, и наоборот. И по архитектуре тоже спрашивали...
Не прошел, наверное мидла искали на стажёра)
@@gengerlolблин, как вы вообще попадаете на собеседования, у меня за последнюю неделю 5 отказов при том, что резюме далеко не пустое(много пет проектов), но без коммерческого опыта пока только нахер иду
Первый ролик смотрел несколько раз! Очень рад второму выпуску, спасибо, очень познавательно!
Большое спасибо за выпуск!
Ооочень многие моменты прояснил для себя! Жду 3 часть ❤️
тоже большое спасибо за просмотр) были рады стараться)
Фантастика! Сложные темы, но быстро и простым языком. Так держать!
Спасибо)
Огонь видео! Вот бы побольше таких!
Чудесное и понятное объяснение!!!!
Очень хочется курс от Паши для Middle-Senior уровня. Про преподавательский дар это факт
Все со временем. Мб, и сделаем)
Ооо, приятно видеть продолжение, повод сделать чай
Емое ,целый час пролетел как мгновенье .Так интересно слушать ,и все понятно почти сразу .Идеально
Спасибо)
Супер! Спасибо за оба выпуска! Жду новых видео с Пашей))
Было бы круто мидл-синьор собес посмотреть😀
спасибо большое) что-нибудь придумаем обязательно)
Спасибо большое за первую и вторую части видео! Сегодня проходила собеседование, вопросы и их разбор очень помогли)
Прошла?
@@victoriash6047 да)
@@magiccreature7225 Привет, собес на джуниор позицию? Долгий был поиск работы?
@@ds-vs привет, на позицию стажёра, поиск относительно долгий)
Ахах, он так артистично объясняет. Надеюсь в будущем буду также говорить на собеседованиях
Большое спасибо за ролик, про DI для себя многое почерпнул)
И вам спасибо)
Спасибо вам за ваш труд! Узнал много новых фич, получил небольшое прозрение о DI (Dependency Injection).
Спасибо огромное) очень приятное) 5 марта будет следующий ролик с Пашей) будет тоже интересно)
Ребят, это реально круто! Спасибо🤩
Всегда пожалуйста :)
Спасибо)
Очень много полезной информации. Спасибо
Спасибо большое)
Спасибо большое! Четко и понятно :D
И вам спасибо)
У него преподавательский талант. Хоть бери и конспектируй, много нового узнал. С удовольствием бы посмотрел 3ью серию)
Спасибо. Рад стараться ))
Павел, вы говорили в прошлом выпуске, что стек лежит в куче. В этом выпуске вы рисуете их отдельно. Это разные стеки все таки или стек таки не лежит в куче?
А вас тоже заставили лайкнуть, шантажируя вашими интимными фото?
1) Это тот самый стек
2) Рисуют их отдельно, что бы наглядней донести основную мысль
3) А вот касательно, лежит ли он в куче...
Многие на этом моменте заострили внимания и просили поделиться первоисточником. Я уже делал пару забегов в интернет, но ни старую статью, где это я впервые увидел, ни обратного утверждения, что стек и куча создаются отдельно, я пока не нашёл.
Так что пока ни подтвердить, ни опровергнуть я это утверждение пока не могу.
Если кто-то найдёт, поделитесь информацией. В конце концов если я ввёл людей в заблуждение, нужно будет исправиться и извиниться в очередном видео.
@@JinOptimistэто какой то бессмысленный вопрос сам по себе, и стэк и куча - фактически просто адресные пространства в одной и той же памяти и все. Физически они ничем не отличаются, только алгоритмом работы с ними. К тому же эти адресные пространства - виртуальные и принадлежат конкретным процессам, что бы одни процессы не могли ходить в чужие кучи. А вот стэк привязан не к процессу, а к треду и треды не должны беспокоиться, что к их стэку может получить доступ другой тред из того же самого процесса. Что значит стэк в куче? Типа, пересекается ли виртуальное адресное пространство стэка с виртуальным же адресные пространством кучи? Нет, не пересекается, нахера? У них даже адресация может быть принципиально разной, стэку просто не нужна 64-битная адресация с его размерами, а вот куче нужна. А как это все физически организовано в памяти - вообще не важно, вы все равно из режима, в котором процессор запускает пользовательский код, в физическую организацию памяти никакого доступа иметь не будете. А если вы там свою ОС пишите, ну тогда наверное придётся в теме лучше разбираться)
Цитата "На схемах организации памяти младшие адреса обычно располагаются вни- зу (начиная с адреса 0), а старшие - вверху. Помните обсуждение стека и кучи в главе 1? По принятому соглашению, стек располагается в старших адресах, а куча - под ним. Стек растет вниз, куча - вверх." Источник Кокоса К Управление памятью в NET 2020 страница 105 и ниже на страницы 112 про windows подробне.
Так интересно его смотреть, приятный человек:)
это да)
Вы меня прямо застесняли )))
Но всё равно, спасибо за добрые слова
Нуу, честно говоря лучше я не видел. Паша огонь.
Согласны) спасибо большое)
Благодарю за ценный материал! Пару минут послушать Пашу по конкретному вопросу = потратить около часа на прочитывание различных статей и не факт, что будет так же понятно))
Спасибо и вам большое) рады быть полезными)
Паша вообще молодец)) всегда нравится слушать именно его) все грамотно и доступно)) благодаря Паше я решил выбрать для себя C# как основной язык программирования, несмотря на то, что склонялся больше в сторону Java и конечено IDE от JetBrains.
Мы полностью согласен) спасибо и вам за просмотр. И надеемся, что выбором довольны)
@@teachmeskills ну C# похож на JAVA вот только до сих пор не привыкну к Visual Studio) как по мне IntelliJ удобнее но уверен что это дело привычки))) спасибо за видео))почаще Пашу приглашайте)))
@@Alex_Noizzzz сделаем! Спасибо! Вам удачи в учебе)
@@Alex_Noizzzzесли вам idea больше нравится, то можете использовать Rider от той же конторы, это таже самая idea ток для c#.
@@Alex_NoizzzzНикогда не использую VS для разработки. Rider куда приятнее
Мне стыдно. Я в тот день просто слишком много дебажил, так что Stack я не иначе как CallStack называл. Это конечно не правильно, речь идёт именно, что о Stack.
Чистосердечное признание)
Спустился сюда специально в поисках этого комментария
Очень интересно и очень полезно! Я не фанатка изучения сухой теории, но спикера увлекательно слушать
Рад что вам понравилось :)
Воу. Я только посмотрел первую часть и вот вторая!
)
Выпускай больше таких видео по C#, особенно с Пашей
будем)
@@teachmeskillsждём!
extension methods- методы расширения.
Этим подходом можно расширять функционал классов к исходникам которых ты не имеешь доступа.
Например есть класс из DLL но в этом классе не хватает для твоих нужд какого-то метода, вот тут ты можешь этот класс расширить.
Спасибо, кажется я начинаю понимать dependency injection.
Спасибо за вторую классную часть. А будет ли выпуск(или возможно уже есть) про веб и HTTP? На собеседованиях во многих языках это необходимо и устройство того же HTTP можно отлично прочесть на мозиле, но будет ли это так же прозрачно понятно как если бы об этом рассказали такие спецы и классные преподаватели как есть у вас в школе...) Мне кажется такой материал был бы актуален для многих направлений разработчиков, так как веб это неотъемлемая часть многих, если не всех проектов) Буду благодарен в любом случае
Да, видео в котором в том числе будет HTTP, сейчас уже в производстве
@@JinOptimistПривет. Видео про веб ещё в производстве?
Ждем третью часть
Оч крутой выпуск👍
Очень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
В комментарии постараемся ответить) спасибо большое за апрув!)
Такие же вопросы мне задавали 18 лет назад, на моём первом собеседовании на C# разработчика. ОДин в один, я как раз Рихтера прочитал, и был хорош.
Как выбрать из толпы человека, который будет показывать лучше результат... Вот есть два кандидата - один опытный практик - П, другой лучше подготовлен к собеседованию, теоретик - Т.
Какого человека вы себе хотите? , наверное - практика, который быстро покажет результат без багов. На большинство вопросов из видео лучше ответит Теоретик.
Что до практики, то IDE + AI подсветит, где virtual, где using, где protected, где StringBuilder вместо string, и держать это всё в голове - у меня не хватает места.
Также я делал много задач по оптимизации, и всё, что обсуждается в подобных собеседоавниях про выделение памяти к 99% промышленных задачах не имеет смысла, так как затыки в других местах - базы данных и всё что связано с ними, большие объёмы передаваемых данных, специфики работы конкретных библиотек, повторные вычисления, парсинг, отсутствие кэширования - это секунды, а класс или структура - это 0.000001 секунды. Ну вот правильный выбор типа коллекции может ещё что то дать, если много поисков там по ней.
Я больше доверяю методике, когда расшаривается экран, и делается простое тестовое задание за 40 минут.
По тому что человек делает, как уверенно, как быстро набирает код, какие варианты решения проговаривает, какие уточняющие вопросы задаёт можно гипотезы построить. А также - можно полученный код как то сравнить между собой, а не "ну тот вроде про сборщик мусора лучше ответил, давай его возьмём.".
Но кроме знаний ещё как то надо понять, что человек в принципе порядочный, энергичный, инициативный, пытливый ум, кропотливый...
Возможно я ошибаюсь, и сравниваю поиск сеньора с поиском джуна...
У меня нет ответа как правильно искать специалиста, но то, что общеустоявшаяся практика собеседоаний и список вопросов, который не меняется десятилетия, не работают - для меня очевидно.
Я с вами по многим пунктам согласен. Но обратите внимание, что тут в основном речь про собеседования для Джуна.
То есть для человека без опыта работы. Было бы странно, ждать от него, что он будет хороший Практик. Поэтому и дают ему теоретические вопросы, которые покажут насколько он усидчивый, целеустремленный, серьёзно ли он настроен на профессию и т.д.
Но конечно, если такие вопросы идут на позицию Сеньора, то это странно
если используешь ref или out получается что value type будет на куче?
Супер!
Спасибо большое)
как поместить ссылку в кол стек, чтобы объект не был удален в куче?
Кайф, вот бы на вышке также учили :(
По вопросу про разницу String и StringBuilder я бы хотел услышать более развернутый ответ:
Когда вы изменяете объект типа String, например, конкатенируете строки или выполняете другие операции над ней, создается новый объект строки, содержащий изменения. Изначальная строка остается неизменной. Это означает, что каждая операция изменения строки создает новый объект в памяти, что может вызывать накопление мусора и иметь негативное влияние на производительность при выполнении большого количества операций над строками.
В отличие от этого, StringBuilder предоставляет изменяемую последовательность символов. Вы можете модифицировать объект StringBuilder, добавляя, удаляя или изменяя символы в нем, и сам объект будет изменяться без создания новых объектов в памяти. Это позволяет сэкономить ресурсы и повысить производительность в случаях, когда требуется множество операций изменения строки.
Таким образом, StringBuilder обеспечивает более эффективное использование памяти и скорости выполнения операций изменения строки по сравнению с использованием операций изменения String.
Хороший ответ. Но если вы на собеседовании скажете, что StringBuilder лучше, у меня тут же возникнет вопрос, а почему бы не использовать только его. Зачем вообще тогда существует String если StringBuilder лучше во всём.
Когда описываете инструмент, не забывайте уточнять для каких он задач лучше подходит, и какие у него есть минусы ;)
@@JinOptimist Верно, каждый инструмент для своей задачи.
Спасибо за интервью, было приятно послушать простые и в тоже время грамотные ответы на не всегда простые вопросы.
У Павла отличная подача, если бы сейчас начинал, то обязательно пошёл бы к нему! Но на сегодняшний день есть твёрдая уверенность, что рынку не нужно столько программистов, даже программисты с опытом идут под сокращение. Но что самое удивительно, так это то что сейчас развелось очень много паразитов, которые предлагают платные стажировки. То есть, заплати нам за то что ты у нас работаешь и выполняешь задачи для нашей компании. Недавно даже скинули опросник по стартапу, который направлен на такие вот стажировки, там был вопрос "Сколько вы готовы платить за стажировку?" Вы в своём уме? Даже бесплатную стажировку мало кто может себе позволить, а тут плати им они поделятся с тобой своим опытом))) А схема тут простая, эти гуру берут заказы, получают за них деньги а эти заказы делаешь ты. В итоге они получают деньги от заказа и от лоха-програмера, который сам платит что бы им этот заказ сделать. И да самый сок, джун сейчас в Минске может получить со старта 300-400 у.е. скажу я вам это совсем не серьёзно.
Нужен следующий выпуск, но уже с вопросами поинтереснее. а лучше и с примерами кода. я вот год не собесился и даже несложные вопросы некоторые подзабыл, чуть стыдно было)
Попробуем) спасибо за наводку)
А про ваш случай - это нормально)
Уже по первой теме появился вопрос (задача инженерная):
Записан файл на 16 гб. В нем идут пачки данных с синхрой crc и т.д. Самое долгое - это считывание из файла и чем большими кусками ты будешь это делать, тем быстрее отработает программа. Но в этом случае много крупных объектов да и выделенной памяти в целом. Решение к которому склонился я - использовать шаблон IDisposable и в ручную вызывать сборщик мусора.
Ваше мнение?
Как бы поступили в данном случае?
Былобы неплохо иногда вставлять примеры выражений о которых идет речь, но в таком случае будет уже лекция про с#)
Ребят, сделайте пожалуйста такой же формат только на middle позицию!
Интересная идея. Подумаю над возможными вопросами
Запугал интервьюера насчет экстеншена :) А просто ответить, что это добавление (расширение) новых методов к имеющимся типам путем написания нового кода в отдельном статическом методе с параметром this и ссылкой на этот тип .
Предлагаю в следующий выпуск добавить побольше вопросов про коллекции. Например, в чём отличие словаря от хеш-таблицы.
Что-нибудь придумаем)
Да, а еще в чем отличие множества от set, очереди от queue, стэка от stack, массива от array. Полезно было бы узнать, конечно
действительно, об этом же информации нет в интернете
Памяти пользователю может и хватать, но GC запуститься сам в зависимости от её заполнения. Это не зависит от самочувствия пользователя или "места не хватает". Для этого есть специальное значение процентного уровня превышения памяти с трешхолдом.
Слушаю после окончания курса Java, как будто почти все также)
ну не зря языки похожи между собой и постоянно конкурируют)
По поводу GC. Реально задумался про то, Что изначально для него все объекты мусор, а потому он изначально помечает(маркирует), добавляет бит в SyncBlockIndex всем объектам сразу. А затем идя по стеку и корням - убитает на тех объектах, до которых добрался.
Надо Рихтера перечитать кусочек. Почему у меня было другое понимание?
Рад что материал оказался полезным, даже для тех кто неплохо разбираться в вопросе :)
Классный специалист!
Плюсуем)
String и StringBuilder - это одно и тоже даже на уровне методов, просто первый тип неизменяемый, а второй да. "Намерения" не собираются, а сразу выполняются как метод модификации строки.
Вот не соглашусь, что ref - это просто ностальгия по плюсам! Да, востребованное и эффективное применение этого ref довольно редко и специфическое, но оно имеет свою нишу. Значимые типы иногда бывают относительно большими, те же структуры с десятками полей или энумы с сотнями значений. Если в структуре, скажем, сотня значений, это будет 400 байт. При передаче без ref эта структура будет скопирована в стеке, малейший цикл вызовет сами знаете какое исключение (это даже если отбросить момент различного поведения при передаче по ссылке или по значению)
А про DI и сеньора вообще улыбнуло. По-моему, понимание слабой связанности классов - это вообще мастхев и без её понимания вообще к программированию коммерческих продуктов допускать нельзя!
У Стива Джобса была водолазка, у Павла - сандали)
Босоножки реально тема
:D
Это что бы проще было зайти за своего среди программистов староверов.
Думаю, на последний вопрос можно было бы и правильно было бы ответить: порождающие, структурные, поведенческие. Именно такой ответ, обычно, хотят услышать на вопрос о "типах" паттернов.
Согласен. Это классический ответ, но обычно его ожидают услышать на вопрос: какие типы паттернов вы знаете?
А тут вопрос был достаточно странно сформулирован про шаблоны для C#.
Но в целом да, думаю ваш вариант будет надёжней ))
"Какие типы шаблонов проектирования существуют в C# " -> дан четкий ответ!
StringBuilder и String похожи тем что они являются классами.
StringBuilder как видно по названию он создает строку.
Насчет var - с помощью него можно создавать анонимные типы
Сглазил немного) Хочу маленькую ремарку вставить про то, как Singleton нарушает SRP из SOLID.
Р.Мартин «Чистая Архитектура», Глава 7, стр. 79:
“…функция должна делать что-то одно и только одно. Этот принцип мы используем, когда делим большие функции на меньшие, то есть на более низком уровне. Но он не является одним из принципов SOLID - это не принцип единственной ответственности. Соответственно, окончательная версия принципа единственной ответственности выглядит так: Модуль должен отвечать за одного и только за одного актора.”
Singleton скорее нарушает Шаблон High Cohesion из GRASP, К. Ларман «Применение UML 2.0 и шаблонов проектирования», Глава 17, п. 17.14, стр. 341:
«Проблема: как обеспечить сфокусированность обязанностей объектов, их управляемость и ясность, а заодно выполнение принципа Low Coupling?»
То есть, Singleton конечно же наделяет дополнительной обязанностью класс, но если им пользуется только один актор, то этот паттерн не нарушает SRP; но конечно уменьшается степень зацепления, т.е. в некоторой смысле противоречит High Cohesion. А вот в какой степени - это надо решать в конкретном случае, возможно при всех доступных вариантах проектирования будет лучше применить Singleton, т.к. остальные варианты расфокусируют еще больше другие модули/классы или повысят еще связность (или нарушать еще другие принципы).
Но это все не умоляет подачу материала, спасибо дуэту!🤗
Кроме передачи параметров по "ref"/"val" в .NET добавили "in" - это когда параметр передаётся как бы по "ref" (избегаем копирования - передаём ссылку на объект), но при этом - менять параметр внутри функции - НЕЛЬЗЯ.
Крмое этого из спецификаторов доступа упущен "internal" который виден в пределах проекта, но не виден ВНЕ текущего проекта. А также комбинации, но там чёрт ногу сломит - проще забить и использовать стандартные public/protected/private, иногда разбавляя internal.
В промышленном программировании ни разу не видел, что бы использовали internal.
Хотя да, про такой модификатор, программисты обычно знаю.
Про In большинство и не слышали вовсе. К тому же применение для такого поведения проблематично придумать. Те же record куда как более органично в проектах используют. По крайней мере в моей практике.
Но в любом случае, спасибо за ваш комментарий. Приятно встречать коллегу, который так же радеет за качество информации )))
@@JinOptimist Потому что "in" относительно недавно появился - по моему только пару версий языка назад. Я сам про него узнал в марте этого года, когда освежал знания C# для преподавания.
internal можно использовать в EntityFramework для создания конфигураций - public для этого слишком много, а private - определённо не хватает.
Очень абстрактно
Очень непонятна «абстрактность») конкретики дайте
Про virtual методы ...я бы хотел все таки услышать про таблицу виртуальных методов.... а не сказку как компелятор сам понимает куда ему идти ))) а так спасибо большое )))
Ну, я всегда пытался рассказывать про поведение, которое влияет на то, как мы пишем код.
Как компилятор это делает важно знать, либо если пишите свой компилятор, либо если вы просто любите теорию.
Поэтому такие вещи я пытаюсь опускать. Например, тоже самое касается и стринг пула. Это прикольный механизм для оптимизации от самого языка, но спрашивать про него на собеседовании с моей точки зрения странно.
И я рад, что вам понравился ролик ))
Опять буду негодовать и говорить, что структура не всегда хранится в стеке :)
Сейчас out переменную предварительно объявлять не нужно.
Всё напутал. Параметры сортировки передаются вместе со ссылкой (или телом ф.) на функцию сортировки. А лямбда - это просто запись этого.
Из стека зависшие ссылки мы не удаляем, они там удаляются сами.
А как же вопрос про инкапсуляцию?))
В случае с virtual. Может это упоминалось в ролике, но я не заметил. Я проходил тест в компанию, и там было несколько заданий с ним. Именно что меня заинтересовало, так это когда в родительском классе был virtual метод, а в дочернем(который от родителя унаследовался) вместо override было написано new virtual. Я тогда немного удивился, ибо даже не знал что так можно, и сути я тоже не понял. Единственное что я заметил, если мы в переменную с типо "A", например, пихаем инстенс "B"(тот что дочерний), то в отличии от override метод не переопределяется. Можете подсказать в чем тут нюанс и зачем так делать, или это из ряда задачек на собеседование?
Нюанс в том, что вы не переопределяете метод базового класса, а просто подменяете методом дочернего класса. Соответственно, на объекте с дочерним типом выполнится метод дочернего же класса, а на объекте базового типа выполнится метод базового же класса. То есть в зависимости от того, в какой тип вы один и тот же объект засунете, выполняется два разных метода. На самом деле такое вряд ли вообще где то зачем то применяется, такое просто делать не принято, это антипаттерн. Вам и иде об этом скажет, если вы new не напишите. По сути new просто означает, что вы в курсе, что вы творите какую то дичь. То, что он и в базовом и в дочернем помечен как виртуал - на результат абсолютно никак не влияет, это просто что бы вас запутать. А вот если у базового класса метод как virtual НЕ помечен, то его можно подменить с помощью new в дочернем и сделать его virtual, что все наследники от дочернего класса могли его нормально переопределить (но переопределить именно метод дочернего класса, не базового,базовый останется таким же как был, просто будет спрятан).
@@DF-ov1zm понял, спасибо за обьяснение👍
Главный момент статики в том, что она хранится в отрыве от класса, где была создана. В своем участке памяти.
И если некий экземпляр класса перестает существовать в памяти, то статика продолжает.
За интервью спасибо, очень доступно и понятно)
Было бы ещё круто пригласить Пашу одновременно с Unity кодером и поговорить с ними о С# в контексте гэймдев.
С большим удовольствием пообщался бы с кем-нибудь из геймдева.
Как навреное любой мальчика, всегда мечтал сделаю свою игру, так что будет интересно послушать как там у них на Unity всё работает и какие особенности в работе с C# у них есть.
@@JinOptimist Блин, лайк! Было бы очень интересно. Тем более сам этому учусь,
Мне одному стало любопытно, почему на вопрос про разницу массивов и списков речь вдруг зашла про коллекции? 😁
Наверное потому, что это одна предметная область.
Когда задают вопрос о String вполне нормально если тут же всплывают String Builder, char[], large object heap
Тоже самое и со списком. Это как слово триггер, после которого тут же хочется рассказать про коллекции, про алгоритмическую сложность, массивы и т.д.
А мидл что, может пока умолчать о самом интересном, об уровнях генерации объектов при сборке мусора? Видно, что ещё пока не разобрался... По стеку никто не лазит в поисках ссылок, они хранятся в спец. таблицах ссылок с которыми работает GC.
а как поколения не влияют, если 0 поколения переменные быстрее уничтожаются тк находятся рядом!?
ссылки на видео не оставили
держите - ruclips.net/video/zQbk4hVzVyU/видео.html
Ну вот дожили, не можем указать главное отличие класса и структуры. Тут даже в джуны не возьмут :)
Статические методы и свойства потокобезопасны, поэтому достаточно статики для реализации синглтона. Локи никакие не нужны
Точно-точно?
Поддержу комментатора выше.
А вы уверены что любой Статичный метод и тем более свойство потокобезопасны? Может вы что-то конкретное имеете ввиду, потому что пока ваше утверждение выглядит, мягко говоря ложным
Но про DI только практика, по теории ничего не сказано, про Inversion of Control ни слова.
Дуже круто, дякую з України!
І вам дзякуй! Вельмі прыемна)
Ребята, я конечно понимаю что надо завлекать людей все дела. Но обьективно покажите мне работодателя который сейчас наймет с такими знаниями как вы тут показываете. Не в одну компанию даже на трайнее брать скорее всего не будут. Слишком простые базовые вопросы. Покажите мне такие вакансии и я пойду туда работать)
Есть необходимо, а есть достаточное.
Вопросы которые мы тут разбираем, это необходимое для прохождение собеседования.
Никто и не утверждает, что ответов на эти вопросы будет достаточно. Мы просто взяли самые базовые и соответственно самые частые частые вопросы и попытались из как можно детальней разъяснить.
Можете обратить внимание, что это уже второе видео из этой тематики. Полагаю не последнее.
@@JinOptimist не последнее)
в геймдеве в нормальных проектах есть DI, просто тут любят писать говно и оправдывать это всем, что только можно
Вам нужно приглашать народ. И собесы им устраивать))
Ну, на своём основном месте работы, я как раз много собеседований провожу :)
@@JinOptimistНу это круто разумеется. Но я про то, что если была бы рубрика. В которой иногда подобие собесов на трансляции проводили.
Было бы топ. Ну типа стрессовая ситуация, многим бы помогло :D Ну тебе в любом случае виднее))
@@zjloo Тут дело в том, что у каждой компании, есть свои "любимые" вопросы и она их расскрывать не хочет. Потому что важно посмотреть, как кандидат будет справляться с задачей. О чём он будет думать, столкнувшись с проблемой. Зачастую нам нужен не правильный ответ, а увидеть, как человек к нему идёт.
Поэтому проводить полноценной собеседование мало кто будет. Скорее это будет как тут, какие-то общие вопросы, которые ты можешь и так легко нагуглить.
Собствено поэтому, я в этих роликах и пытаюсь не просто краткие ответы давать, а рассписывать мыслительный процесс :)
@@JinOptimistKуча разделяется на Small Object Heap (SOH) и Large Object Heap (LOH). Когда размер объекта превосходит 85кб - он отправляется в LOH. Сделано для производительности процессов взаимодействия. Исходя из этого в одной куче не может быть слишком маленьких и слишком больших объектов вместе.
Garbage Collector анализирует корни программы. Каждый такой корень может иметь указатель (переменную типа IntPtr, которая представляет адрес) либо может иметь значение NULL. GC организует объекты в управляемой куче по поколениям в зависимости от того, как долго они существуют. Объекты, которые только что созданы, находятся в поколении 0. Если они выживают после сборки мусора, они перемещаются в поколение 1, а затем в поколение 2. Объекты в поколении 2 считаются долгоживущими и редко проверяются на наличие мусора. GC обычно собирает мусор в одном поколении за раз, начиная с поколения 0. Сборка мусора может быть вызвана автоматически, когда доступная память становится недостаточной, или принудительно с помощью методов класса System.GC.
К тому же GC работает постоянно в фоновом режиме. Механизм оптимизации сборщика мусора определяет наилучшее время для выполнения сбора, основываясь на произведенных выделениях памяти.
Профессионал в .NET должен знать все азы платформы.
Как пройти собеседование на C#, когда в стране всего 16 вакансий?) И то половина из них, это middle/senior.
Не в той стране ищите)
Из ваших слов следует, что прямо сейчас есть как минимум 8 (половина от 16) вакансий, где требуются Джуны.
Так что ответ просто, ходить на собеседования и учиться ;)
Лайк однозначно. Зачем джуну знать про то, как сборщик мусора работает с памятью? Это уже перебор по-моему 🙂
Вопросы про GC это как вопросы на общую образованность. Знать об этом для работы не обязательно, но поговорив на эту тему, можно увидеть насколько человек понимает общие принципы. Наверное по этому такие вопросы и продолжают задавать
А вы почитайте требования к джунам, рынок перполнен, требования как к мидлу года 3 назад.
@@JinOptimist Всё равно мне это кажется странным.. Время на собеседование ограничено, и важно понять может ли джун писать добротный код, и с какой скоростью решает поставленные задачи. Поэтому если этот вопрос не влияет на результат собеседования, то ИМХО нет смысла тратить на это время, а если влияет, то это странно 🙂.
Кстати, Вы прекрасно обьясняете сложные вещи простыми словами, очень приятно и полезно слушать! 🔥И ведущий тоже большой молодец! 👍
@@pulsar1934 Я бы предпочёл за это время лучше что-нибудть практическое поспрашивать. Если конкуренция большая, то я бы усиливал и углублял проверку именно практических навыков. Если бы мне как джуну начали задавать такие вопросы на собеседовании, то я бы при наличии других предложений, выбрал бы другую фирму, даже если бы на все такие вопросы ответил 🙂
@@ivansusanin9448 А мне кажется собеседование это конечно хорошо, хотя бы на человека посмотреть, но всё что нужно знать об уровне программиста это его гит и его проекты, достаточно посмотреть его код и всё становится предельно понятным. А собес это просто трёп, который к практике не имеет ни какого отношения.
Что-то к третьей части интервьюер выглядит уставшим
Почему такие легкие вопросы. Где вопросы про REST, GRPc, Microservices, MessageBroker, SOLID, тестирование NUnit, REST vs GRPc, Паттерны обычно спрашивают каждого вида и по несколько, Dapper vs EF, зачем нужна Reflection. И это не все.
В общем как по мне сейчас от джуна требуют куда больше знаний технологий ибо знаниями самого языка не особо кого то удивишь. Вернее сейчас это считается пост фактум базой.
Как вы правильно заметить, начинаем мы с базовых вопрос о C#. То что как вы заметили этими знаниями никого не удивишь, не значит, что об этом не спрашивают или что этого знать не нужно.
В тоже время, спасибо за список вопросов. Думаю если будет следующее видео, обязательно поговорим там о NUnit, ORM, Reflection, REST и много другом )))
Если бы я так отвечал на собеседовании, я бы вряд ли прошёл его :/
много деталей опущено.
Собеседование это диалог. Если интервьюеру нужно будет больше деталей, он задаст уточняющие вопросы или попросит рассказать подробней.
Плюс вопросы которые мы тут поднимаем это скорее начало собеседования. Более сложные и специфичные вопросы мы тут не поднимали.
Так что не волнуйтесь, если так вы будете отвечать в начале собеседования это вам не навредит. Главное что бы вы могли выдать больше деталей если это потребуется
ппц, я оказывается все это знаю, много лет, как избавится от чувства самозванца? много проектов веду с коммерческим опытом, но нет уверенности в себе чтобы попросить больше ЗП ((
Возможно стоит попробоватся на вакансию где изначально предлагают больше чем есть у вас сейчас?
Так и не понял что выбрать Java или C#?
По дефлоту всегда C#. Java ток если вам очень хочется разработчиком под какой нибудь SAP, для всего остального java уже давно мертва как язык и как платформа
На Java почему-то вакансий в 2 раза больше. Вот это смущает. И вроде ревирсинжинирингу код легко поддается.
@@DenisDenis-zq8mk смотря в какой стране, в России, да и думаю во всем СНГ, на Шарп намного больше спрос, чем на джаву, так уж повелось.. в остальном мире наверное да, но тут надо понимать какие вакансии вам интересны... если в допотопном тырпрайз говне ковыряться - это, то чем вы мечтаете - то велкам в джаву, SAP тащем то про это же. Это все писалось десятилетиями и ещё много десятилетий будет поддерживаться, поэтому и спрос на джаву огромный. Если вы хотите работать с современным кодом и интересными проектами - то альтернатив шарпу не так уж много. Что касается реверсинжениринга, я так понимаю вы про декомпиляцию? Любой язык, компилируемый в промежуточный язык, очень хорошо декомпилируется почти в первозданный вид.. в эту категорию попадает множество языков, в том числе и джава с c#'ом.
C cовременным кодом и интересными проектами ? кроссплатформенность? .net core пишут что урезан..
@@DenisDenis-zq8mk во первых, вы всему, что в интернете пишут, верите? Во-вторых, такой конструкции как Net Core не существует уже скоро 3 года как, даже поддержка последней его версии закончилась уже скоро год как) В-третьих, я даже спрашивать не буду причём тут вообще язык: это абсолютно разные никак друг с другом не связанные вещи, у .net множество языков (VB, F#, Q# итд), а у c# множество фреймворков (net framework, net core, net, asp net, asp net core, wpf, wf, xamarin, maui, unity, nano, итд итп) .. Ну и чего там урезали и где - это абсолютно бессмысленное и глупое утверждение, которое даже джун произносить не должен, если хочет что бы его хотя бы собеседовпть начали.
Видео устарело на момент своего создания. Еще год назад на собесах это были вопросы скорее для менти, чем для джуна. Оттого смешнее слышать, что в вас подозревают сеньора.
Закон спроса предложения сделал свое дело, сейчас средне-статистический джун с докером работает и RabbitMQ.
А можно столбиком эти вопросы и список компаний, а то звучит так, что мы в вакууме живем, а у вас актуалочка на руках)
Жалко не было моего любимого вопроса из собесов про DI и DIP из SOLID.
DI было)
Ref для экономии памяти имхо
А ещё если по ref передать reference type то можно проинициализировать новый объект, ссылка на который будет подложена в старую переменную )))
Но всё же думаю, это не основная причина использования ref
@@JinOptimist спасибо за видео вы очень уверенно отвечаете на вопросы. Мне бы так на собесах
@@JinOptimistещё можно делать return ref
Жалко не раскрыли кто такой Паша Львов. Хотя бы вкратце кто он?
У нас с его участием до этого выходили ролики. Когда приглашаем гостя в первый раз, просим пройтись по его биографии) вот ссылочка - ruclips.net/video/4ZykAmPUtrw/видео.html
@@teachmeskills спасибо