@@JinOptimistОчень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
@@Tera-h7e по сути всё просто. Если метод абстракнтый, то он не содержит в себе никакой реализации и ты обязан реализовать его в классе-наследнике через override (как и в случае с интерфейсом), а если виртуальный, то ты просто наследуешь его реализацию, но, если потребуется, можешь его переопределить внутри класса-наследника и этот метод внутри наследника будет считаться приоритетным, в случае, описаном в этом видео на 14:00 Модификатор sealed же запрещает переопределение метода. Пример: Есть класс Person с виртуальным методом SayHello, от него наследуется класс User, который переопределяет этот метод через override, и следующим указываем модификатор sealed, что будет значить следующее - если какой-либо класс наследуется от класса User, он не сможет переопределить метод SayHello, но, так как этот метод был виртуальном в классе Person, то предпочитаемым, в таком случае, будет именно метод класса User. Как-то так, а в целом, более толково и подробно можно почитать здесь: metanit.com/sharp/tutorial/3.19.php
эх да.... еще когда на джуна устраиваешься ща любят поспрашивать про бизнес процессы....чисто чтоб удостовериться что уже есть опыт работы в компании =)
dynamic - это не попытка сломать строгую типизацию, это необходимый инструмент, которым не просто можно, а нужно пользоваться тогда, когда вы из c# пытаетесь взаимодействовать с объектами, которые не принадлежат инфраструктуре C# (внешние по отношению к языку) и пришли к вам в код из динамически типизированной парадигмы. Например, когда вы из C# пытаетесь взаимодействовать со структурой DOM из Js или пользуетесь Python рантаймом из шарпа (да, такой вполне себе возможно, см. IronPython). Когда то взаимодействие между разными системами в винде происходило только через интерфейсы COM объектов, которые существовали задолго до C# и были полностью динамическими, что доставляло довольно много проблем там, где казалось бы никаких проблем быть не должно, ведь и то и другое разрабатывает одна и таже контора. В целом, без dynamic было очень не просто с динамическими структурами, приходилось изобретать дикие костыли с рефлекшеном, что сложно с точки зрения кода и медленно с точки зрения рантайма. Сейчас, конечно, такое уже реже встречается, потому что и COM уже не так актуален и есть TypeScript, с которым из шарпа можно работать нативно, ведь оба строготипизированные.. да и необходимость пользоваться питоновскими или другими рантаймами и их классами из шарпа - довольно специфическая история. Но и сейчас динамические структуры встречаются, например json с точки зрения C# - вполне себе динамически типизированный, если не десериализован в какой то конкретный тип.. и вы можете десериализовать его в dynamic и и работать с ним как с динамической структурой, без необходимости описывать заранее в классе. Для быстрого прототипирования - очень крутая штука, для продакшена, конечно, так лучше не делать) Без dynamic все это было бы намнооооого геморойнее.
Очень хотелось бы увидеть подобный ролик, но с уклоном в web разработку на c#. Обкашлять все тонкости с ASP и EF. Думаю очень многим было бы интересно посмотреть. Всё таки с одним только знанием языка и ООП далеко не уехать на собесе. Но видео всё-равно - огонь!!!🔥🔥🔥
@@ei2292дают полностью исписанную тетрадь, но с небольшим местом на полях и просят доказать ВТФ(Великую Теорему Ферма), не прибегая к методам эллиптических кривых
То чувство, когда по мнению Павла "сеньорский вопрс" про DI container, задают на каждом собеседовании джуна. Говорю не от балды, а прошел около 10 собесов и на каждом спрашивали про внедрение зависимостей, время жизни и что от чего не желательно ставить в зависимость (привет чистая архитектура). А вообще у Паши дар приподносить информацию, вроде всё что он говорил тут я знаю, но после просмотра многие вещи лучше устаканились! Жду 3 выпуск😅
Вопросы про DI сильно отличаются по глубине ожидаемого ответа. Для джуна достаточно знать, что DI есть. Вот тут регистрирует, вот тут запрашиваем. А вот архитектурные вопросы, например, о возможности ограничения доступа на уровне DI, это уже совсем не для джуна вопрос. PS Приятно знать, что эта работа кому-то приносит пользу. Буду и дальше стараться ))
@@JinOptimistУ моего друга на стажировке спрашивали про время жизни. И в чем проблема когда в компонент с большим временем жизни попадает компонент с меньшим временем жизни.
@@DimaBriquezда ладно, только хотел об этом написать) Тоже на стажировку проходил, и тоже спрашивали, что будет если в скоупе транзиент, и наоборот. И по архитектуре тоже спрашивали... Не прошел, наверное мидла искали на стажёра)
@@gengerlolблин, как вы вообще попадаете на собеседования, у меня за последнюю неделю 5 отказов при том, что резюме далеко не пустое(много пет проектов), но без коммерческого опыта пока только нахер иду
Благодарю за ценный материал! Пару минут послушать Пашу по конкретному вопросу = потратить около часа на прочитывание различных статей и не факт, что будет так же понятно))
Паша вообще молодец)) всегда нравится слушать именно его) все грамотно и доступно)) благодаря Паше я решил выбрать для себя C# как основной язык программирования, несмотря на то, что склонялся больше в сторону Java и конечено IDE от JetBrains.
@@teachmeskills ну C# похож на JAVA вот только до сих пор не привыкну к Visual Studio) как по мне IntelliJ удобнее но уверен что это дело привычки))) спасибо за видео))почаще Пашу приглашайте)))
Мне стыдно. Я в тот день просто слишком много дебажил, так что Stack я не иначе как CallStack называл. Это конечно не правильно, речь идёт именно, что о Stack.
extension methods- методы расширения. Этим подходом можно расширять функционал классов к исходникам которых ты не имеешь доступа. Например есть класс из DLL но в этом классе не хватает для твоих нужд какого-то метода, вот тут ты можешь этот класс расширить.
Павел, вы говорили в прошлом выпуске, что стек лежит в куче. В этом выпуске вы рисуете их отдельно. Это разные стеки все таки или стек таки не лежит в куче?
1) Это тот самый стек 2) Рисуют их отдельно, что бы наглядней донести основную мысль 3) А вот касательно, лежит ли он в куче... Многие на этом моменте заострили внимания и просили поделиться первоисточником. Я уже делал пару забегов в интернет, но ни старую статью, где это я впервые увидел, ни обратного утверждения, что стек и куча создаются отдельно, я пока не нашёл. Так что пока ни подтвердить, ни опровергнуть я это утверждение пока не могу. Если кто-то найдёт, поделитесь информацией. В конце концов если я ввёл людей в заблуждение, нужно будет исправиться и извиниться в очередном видео.
@@JinOptimistэто какой то бессмысленный вопрос сам по себе, и стэк и куча - фактически просто адресные пространства в одной и той же памяти и все. Физически они ничем не отличаются, только алгоритмом работы с ними. К тому же эти адресные пространства - виртуальные и принадлежат конкретным процессам, что бы одни процессы не могли ходить в чужие кучи. А вот стэк привязан не к процессу, а к треду и треды не должны беспокоиться, что к их стэку может получить доступ другой тред из того же самого процесса. Что значит стэк в куче? Типа, пересекается ли виртуальное адресное пространство стэка с виртуальным же адресные пространством кучи? Нет, не пересекается, нахера? У них даже адресация может быть принципиально разной, стэку просто не нужна 64-битная адресация с его размерами, а вот куче нужна. А как это все физически организовано в памяти - вообще не важно, вы все равно из режима, в котором процессор запускает пользовательский код, в физическую организацию памяти никакого доступа иметь не будете. А если вы там свою ОС пишите, ну тогда наверное придётся в теме лучше разбираться)
Цитата "На схемах организации памяти младшие адреса обычно располагаются вни- зу (начиная с адреса 0), а старшие - вверху. Помните обсуждение стека и кучи в главе 1? По принятому соглашению, стек располагается в старших адресах, а куча - под ним. Стек растет вниз, куча - вверх." Источник Кокоса К Управление памятью в NET 2020 страница 105 и ниже на страницы 112 про windows подробне.
Такие же вопросы мне задавали 18 лет назад, на моём первом собеседовании на C# разработчика. ОДин в один, я как раз Рихтера прочитал, и был хорош. Как выбрать из толпы человека, который будет показывать лучше результат... Вот есть два кандидата - один опытный практик - П, другой лучше подготовлен к собеседованию, теоретик - Т. Какого человека вы себе хотите? , наверное - практика, который быстро покажет результат без багов. На большинство вопросов из видео лучше ответит Теоретик. Что до практики, то IDE + AI подсветит, где virtual, где using, где protected, где StringBuilder вместо string, и держать это всё в голове - у меня не хватает места. Также я делал много задач по оптимизации, и всё, что обсуждается в подобных собеседоавниях про выделение памяти к 99% промышленных задачах не имеет смысла, так как затыки в других местах - базы данных и всё что связано с ними, большие объёмы передаваемых данных, специфики работы конкретных библиотек, повторные вычисления, парсинг, отсутствие кэширования - это секунды, а класс или структура - это 0.000001 секунды. Ну вот правильный выбор типа коллекции может ещё что то дать, если много поисков там по ней. Я больше доверяю методике, когда расшаривается экран, и делается простое тестовое задание за 40 минут. По тому что человек делает, как уверенно, как быстро набирает код, какие варианты решения проговаривает, какие уточняющие вопросы задаёт можно гипотезы построить. А также - можно полученный код как то сравнить между собой, а не "ну тот вроде про сборщик мусора лучше ответил, давай его возьмём.". Но кроме знаний ещё как то надо понять, что человек в принципе порядочный, энергичный, инициативный, пытливый ум, кропотливый... Возможно я ошибаюсь, и сравниваю поиск сеньора с поиском джуна... У меня нет ответа как правильно искать специалиста, но то, что общеустоявшаяся практика собеседоаний и список вопросов, который не меняется десятилетия, не работают - для меня очевидно.
Я с вами по многим пунктам согласен. Но обратите внимание, что тут в основном речь про собеседования для Джуна. То есть для человека без опыта работы. Было бы странно, ждать от него, что он будет хороший Практик. Поэтому и дают ему теоретические вопросы, которые покажут насколько он усидчивый, целеустремленный, серьёзно ли он настроен на профессию и т.д. Но конечно, если такие вопросы идут на позицию Сеньора, то это странно
String и StringBuilder - это одно и тоже даже на уровне методов, просто первый тип неизменяемый, а второй да. "Намерения" не собираются, а сразу выполняются как метод модификации строки.
Думаю, на последний вопрос можно было бы и правильно было бы ответить: порождающие, структурные, поведенческие. Именно такой ответ, обычно, хотят услышать на вопрос о "типах" паттернов.
Согласен. Это классический ответ, но обычно его ожидают услышать на вопрос: какие типы паттернов вы знаете? А тут вопрос был достаточно странно сформулирован про шаблоны для C#. Но в целом да, думаю ваш вариант будет надёжней ))
Спасибо за вторую классную часть. А будет ли выпуск(или возможно уже есть) про веб и HTTP? На собеседованиях во многих языках это необходимо и устройство того же HTTP можно отлично прочесть на мозиле, но будет ли это так же прозрачно понятно как если бы об этом рассказали такие спецы и классные преподаватели как есть у вас в школе...) Мне кажется такой материал был бы актуален для многих направлений разработчиков, так как веб это неотъемлемая часть многих, если не всех проектов) Буду благодарен в любом случае
Сглазил немного) Хочу маленькую ремарку вставить про то, как 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 - это просто ностальгия по плюсам! Да, востребованное и эффективное применение этого ref довольно редко и специфическое, но оно имеет свою нишу. Значимые типы иногда бывают относительно большими, те же структуры с десятками полей или энумы с сотнями значений. Если в структуре, скажем, сотня значений, это будет 400 байт. При передаче без ref эта структура будет скопирована в стеке, малейший цикл вызовет сами знаете какое исключение (это даже если отбросить момент различного поведения при передаче по ссылке или по значению) А про DI и сеньора вообще улыбнуло. По-моему, понимание слабой связанности классов - это вообще мастхев и без её понимания вообще к программированию коммерческих продуктов допускать нельзя!
По вопросу про разницу String и StringBuilder я бы хотел услышать более развернутый ответ: Когда вы изменяете объект типа String, например, конкатенируете строки или выполняете другие операции над ней, создается новый объект строки, содержащий изменения. Изначальная строка остается неизменной. Это означает, что каждая операция изменения строки создает новый объект в памяти, что может вызывать накопление мусора и иметь негативное влияние на производительность при выполнении большого количества операций над строками. В отличие от этого, StringBuilder предоставляет изменяемую последовательность символов. Вы можете модифицировать объект StringBuilder, добавляя, удаляя или изменяя символы в нем, и сам объект будет изменяться без создания новых объектов в памяти. Это позволяет сэкономить ресурсы и повысить производительность в случаях, когда требуется множество операций изменения строки. Таким образом, StringBuilder обеспечивает более эффективное использование памяти и скорости выполнения операций изменения строки по сравнению с использованием операций изменения String.
Хороший ответ. Но если вы на собеседовании скажете, что StringBuilder лучше, у меня тут же возникнет вопрос, а почему бы не использовать только его. Зачем вообще тогда существует String если StringBuilder лучше во всём. Когда описываете инструмент, не забывайте уточнять для каких он задач лучше подходит, и какие у него есть минусы ;)
@@JinOptimist Верно, каждый инструмент для своей задачи. Спасибо за интервью, было приятно послушать простые и в тоже время грамотные ответы на не всегда простые вопросы.
Уже по первой теме появился вопрос (задача инженерная): Записан файл на 16 гб. В нем идут пачки данных с синхрой crc и т.д. Самое долгое - это считывание из файла и чем большими кусками ты будешь это делать, тем быстрее отработает программа. Но в этом случае много крупных объектов да и выделенной памяти в целом. Решение к которому склонился я - использовать шаблон IDisposable и в ручную вызывать сборщик мусора. Ваше мнение? Как бы поступили в данном случае?
Запугал интервьюера насчет экстеншена :) А просто ответить, что это добавление (расширение) новых методов к имеющимся типам путем написания нового кода в отдельном статическом методе с параметром this и ссылкой на этот тип .
Памяти пользователю может и хватать, но GC запуститься сам в зависимости от её заполнения. Это не зависит от самочувствия пользователя или "места не хватает". Для этого есть специальное значение процентного уровня превышения памяти с трешхолдом.
Очень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
С большим удовольствием пообщался бы с кем-нибудь из геймдева. Как навреное любой мальчика, всегда мечтал сделаю свою игру, так что будет интересно послушать как там у них на Unity всё работает и какие особенности в работе с C# у них есть.
Нужен следующий выпуск, но уже с вопросами поинтереснее. а лучше и с примерами кода. я вот год не собесился и даже несложные вопросы некоторые подзабыл, чуть стыдно было)
Кроме передачи параметров по "ref"/"val" в .NET добавили "in" - это когда параметр передаётся как бы по "ref" (избегаем копирования - передаём ссылку на объект), но при этом - менять параметр внутри функции - НЕЛЬЗЯ. Крмое этого из спецификаторов доступа упущен "internal" который виден в пределах проекта, но не виден ВНЕ текущего проекта. А также комбинации, но там чёрт ногу сломит - проще забить и использовать стандартные public/protected/private, иногда разбавляя internal.
В промышленном программировании ни разу не видел, что бы использовали internal. Хотя да, про такой модификатор, программисты обычно знаю. Про In большинство и не слышали вовсе. К тому же применение для такого поведения проблематично придумать. Те же record куда как более органично в проектах используют. По крайней мере в моей практике. Но в любом случае, спасибо за ваш комментарий. Приятно встречать коллегу, который так же радеет за качество информации )))
@@JinOptimist Потому что "in" относительно недавно появился - по моему только пару версий языка назад. Я сам про него узнал в марте этого года, когда освежал знания C# для преподавания. internal можно использовать в EntityFramework для создания конфигураций - public для этого слишком много, а private - определённо не хватает.
Про virtual методы ...я бы хотел все таки услышать про таблицу виртуальных методов.... а не сказку как компелятор сам понимает куда ему идти ))) а так спасибо большое )))
Ну, я всегда пытался рассказывать про поведение, которое влияет на то, как мы пишем код. Как компилятор это делает важно знать, либо если пишите свой компилятор, либо если вы просто любите теорию. Поэтому такие вещи я пытаюсь опускать. Например, тоже самое касается и стринг пула. Это прикольный механизм для оптимизации от самого языка, но спрашивать про него на собеседовании с моей точки зрения странно. И я рад, что вам понравился ролик ))
Наверное потому, что это одна предметная область. Когда задают вопрос о String вполне нормально если тут же всплывают String Builder, char[], large object heap Тоже самое и со списком. Это как слово триггер, после которого тут же хочется рассказать про коллекции, про алгоритмическую сложность, массивы и т.д.
По поводу GC. Реально задумался про то, Что изначально для него все объекты мусор, а потому он изначально помечает(маркирует), добавляет бит в SyncBlockIndex всем объектам сразу. А затем идя по стеку и корням - убитает на тех объектах, до которых добрался. Надо Рихтера перечитать кусочек. Почему у меня было другое понимание?
Главный момент статики в том, что она хранится в отрыве от класса, где была создана. В своем участке памяти. И если некий экземпляр класса перестает существовать в памяти, то статика продолжает. За интервью спасибо, очень доступно и понятно)
Ребята, я конечно понимаю что надо завлекать людей все дела. Но обьективно покажите мне работодателя который сейчас наймет с такими знаниями как вы тут показываете. Не в одну компанию даже на трайнее брать скорее всего не будут. Слишком простые базовые вопросы. Покажите мне такие вакансии и я пойду туда работать)
Есть необходимо, а есть достаточное. Вопросы которые мы тут разбираем, это необходимое для прохождение собеседования. Никто и не утверждает, что ответов на эти вопросы будет достаточно. Мы просто взяли самые базовые и соответственно самые частые частые вопросы и попытались из как можно детальней разъяснить. Можете обратить внимание, что это уже второе видео из этой тематики. Полагаю не последнее.
@@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 должен знать все азы платформы.
А мидл что, может пока умолчать о самом интересном, об уровнях генерации объектов при сборке мусора? Видно, что ещё пока не разобрался... По стеку никто не лазит в поисках ссылок, они хранятся в спец. таблицах ссылок с которыми работает GC.
В случае с virtual. Может это упоминалось в ролике, но я не заметил. Я проходил тест в компанию, и там было несколько заданий с ним. Именно что меня заинтересовало, так это когда в родительском классе был virtual метод, а в дочернем(который от родителя унаследовался) вместо override было написано new virtual. Я тогда немного удивился, ибо даже не знал что так можно, и сути я тоже не понял. Единственное что я заметил, если мы в переменную с типо "A", например, пихаем инстенс "B"(тот что дочерний), то в отличии от override метод не переопределяется. Можете подсказать в чем тут нюанс и зачем так делать, или это из ряда задачек на собеседование?
Нюанс в том, что вы не переопределяете метод базового класса, а просто подменяете методом дочернего класса. Соответственно, на объекте с дочерним типом выполнится метод дочернего же класса, а на объекте базового типа выполнится метод базового же класса. То есть в зависимости от того, в какой тип вы один и тот же объект засунете, выполняется два разных метода. На самом деле такое вряд ли вообще где то зачем то применяется, такое просто делать не принято, это антипаттерн. Вам и иде об этом скажет, если вы new не напишите. По сути new просто означает, что вы в курсе, что вы творите какую то дичь. То, что он и в базовом и в дочернем помечен как виртуал - на результат абсолютно никак не влияет, это просто что бы вас запутать. А вот если у базового класса метод как virtual НЕ помечен, то его можно подменить с помощью new в дочернем и сделать его virtual, что все наследники от дочернего класса могли его нормально переопределить (но переопределить именно метод дочернего класса, не базового,базовый останется таким же как был, просто будет спрятан).
Вопросы про GC это как вопросы на общую образованность. Знать об этом для работы не обязательно, но поговорив на эту тему, можно увидеть насколько человек понимает общие принципы. Наверное по этому такие вопросы и продолжают задавать
@@JinOptimist Всё равно мне это кажется странным.. Время на собеседование ограничено, и важно понять может ли джун писать добротный код, и с какой скоростью решает поставленные задачи. Поэтому если этот вопрос не влияет на результат собеседования, то ИМХО нет смысла тратить на это время, а если влияет, то это странно 🙂. Кстати, Вы прекрасно обьясняете сложные вещи простыми словами, очень приятно и полезно слушать! 🔥И ведущий тоже большой молодец! 👍
@@pulsar1934 Я бы предпочёл за это время лучше что-нибудть практическое поспрашивать. Если конкуренция большая, то я бы усиливал и углублял проверку именно практических навыков. Если бы мне как джуну начали задавать такие вопросы на собеседовании, то я бы при наличии других предложений, выбрал бы другую фирму, даже если бы на все такие вопросы ответил 🙂
@@ivansusanin9448 А мне кажется собеседование это конечно хорошо, хотя бы на человека посмотреть, но всё что нужно знать об уровне программиста это его гит и его проекты, достаточно посмотреть его код и всё становится предельно понятным. А собес это просто трёп, который к практике не имеет ни какого отношения.
Собеседование это диалог. Если интервьюеру нужно будет больше деталей, он задаст уточняющие вопросы или попросит рассказать подробней. Плюс вопросы которые мы тут поднимаем это скорее начало собеседования. Более сложные и специфичные вопросы мы тут не поднимали. Так что не волнуйтесь, если так вы будете отвечать в начале собеседования это вам не навредит. Главное что бы вы могли выдать больше деталей если это потребуется
Поддержу комментатора выше. А вы уверены что любой Статичный метод и тем более свойство потокобезопасны? Может вы что-то конкретное имеете ввиду, потому что пока ваше утверждение выглядит, мягко говоря ложным
Почему такие легкие вопросы. Где вопросы про REST, GRPc, Microservices, MessageBroker, SOLID, тестирование NUnit, REST vs GRPc, Паттерны обычно спрашивают каждого вида и по несколько, Dapper vs EF, зачем нужна Reflection. И это не все. В общем как по мне сейчас от джуна требуют куда больше знаний технологий ибо знаниями самого языка не особо кого то удивишь. Вернее сейчас это считается пост фактум базой.
Как вы правильно заметить, начинаем мы с базовых вопрос о C#. То что как вы заметили этими знаниями никого не удивишь, не значит, что об этом не спрашивают или что этого знать не нужно. В тоже время, спасибо за список вопросов. Думаю если будет следующее видео, обязательно поговорим там о NUnit, ORM, Reflection, REST и много другом )))
У нас с его участием до этого выходили ролики. Когда приглашаем гостя в первый раз, просим пройтись по его биографии) вот ссылочка - ruclips.net/video/4ZykAmPUtrw/видео.html
Из ваших слов следует, что прямо сейчас есть как минимум 8 (половина от 16) вакансий, где требуются Джуны. Так что ответ просто, ходить на собеседования и учиться ;)
ппц, я оказывается все это знаю, много лет, как избавится от чувства самозванца? много проектов веду с коммерческим опытом, но нет уверенности в себе чтобы попросить больше ЗП ((
Видео устарело на момент своего создания. Еще год назад на собесах это были вопросы скорее для менти, чем для джуна. Оттого смешнее слышать, что в вас подозревают сеньора. Закон спроса предложения сделал свое дело, сейчас средне-статистический джун с докером работает и RabbitMQ.
Не, дружище, если из стека никто не ссылается, то не важно, что в куче.... Джун был прав!!! И вообще - покажите мне место с кодом мусорщика??!! До того задрали темой мусорщика - ссылку на исходники - в студию!!! А гребные легенды и сказки рассказывайте кому угодно!!! Или это повод самому залезть, посмотреть как работает на самом деле и обосрать всех синьеров? Подобный пример есть у Мурыча - про js спецификацию... Всякую херню придумывают про приведение типов, а читаешь спецификацию - там все по другому описано...
А ещё если по ref передать reference type то можно проинициализировать новый объект, ссылка на который будет подложена в старую переменную ))) Но всё же думаю, это не основная причина использования ref
Ну парень неплохо на вопросы отвечает, остался главный вопрос, чтобы взять его на джуна - есть ли у него 15 лет коммерческого опыта?
А можно в коммерческий опыт сложить опыт работы программиста и преподавателя? Если да, то с большим запасом хватит :D
@@JinOptimistОчень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
@@Tera-h7e по сути всё просто. Если метод абстракнтый, то он не содержит в себе никакой реализации и ты обязан реализовать его в классе-наследнике через override (как и в случае с интерфейсом), а если виртуальный, то ты просто наследуешь его реализацию, но, если потребуется, можешь его переопределить внутри класса-наследника и этот метод внутри наследника будет считаться приоритетным, в случае, описаном в этом видео на 14:00
Модификатор sealed же запрещает переопределение метода. Пример: Есть класс Person с виртуальным методом SayHello, от него наследуется класс User, который переопределяет этот метод через override, и следующим указываем модификатор sealed, что будет значить следующее - если какой-либо класс наследуется от класса User, он не сможет переопределить метод SayHello, но, так как этот метод был виртуальном в классе Person, то предпочитаемым, в таком случае, будет именно метод класса User. Как-то так, а в целом, более толково и подробно можно почитать здесь:
metanit.com/sharp/tutorial/3.19.php
эх да.... еще когда на джуна устраиваешься ща любят поспрашивать про бизнес процессы....чисто чтоб удостовериться что уже есть опыт работы в компании =)
У Паши без сомнений преподавательский талант. Так хорошо и просто получается обьяснить сложные темы.
вне всякого сомнения. полностью согласны)
Настоящее испытание "рассказать просто о сложном" ещё впереди, но я безусловно буду стараться )))
@@JinOptimist Паша ты просто молодец. Удачи тебе и счастья в жизни)
dynamic - это не попытка сломать строгую типизацию, это необходимый инструмент, которым не просто можно, а нужно пользоваться тогда, когда вы из c# пытаетесь взаимодействовать с объектами, которые не принадлежат инфраструктуре C# (внешние по отношению к языку) и пришли к вам в код из динамически типизированной парадигмы. Например, когда вы из C# пытаетесь взаимодействовать со структурой DOM из Js или пользуетесь Python рантаймом из шарпа (да, такой вполне себе возможно, см. IronPython). Когда то взаимодействие между разными системами в винде происходило только через интерфейсы COM объектов, которые существовали задолго до C# и были полностью динамическими, что доставляло довольно много проблем там, где казалось бы никаких проблем быть не должно, ведь и то и другое разрабатывает одна и таже контора. В целом, без dynamic было очень не просто с динамическими структурами, приходилось изобретать дикие костыли с рефлекшеном, что сложно с точки зрения кода и медленно с точки зрения рантайма. Сейчас, конечно, такое уже реже встречается, потому что и COM уже не так актуален и есть TypeScript, с которым из шарпа можно работать нативно, ведь оба строготипизированные.. да и необходимость пользоваться питоновскими или другими рантаймами и их классами из шарпа - довольно специфическая история. Но и сейчас динамические структуры встречаются, например json с точки зрения C# - вполне себе динамически типизированный, если не десериализован в какой то конкретный тип.. и вы можете десериализовать его в dynamic и и работать с ним как с динамической структурой, без необходимости описывать заранее в классе. Для быстрого прототипирования - очень крутая штука, для продакшена, конечно, так лучше не делать) Без dynamic все это было бы намнооооого геморойнее.
Меня так часто подозревали сеньором, но не брали на джуна)
К сожалению, та же херня :(
Очень хотелось бы увидеть подобный ролик, но с уклоном в web разработку на c#. Обкашлять все тонкости с ASP и EF. Думаю очень многим было бы интересно посмотреть.
Всё таки с одним только знанием языка и ООП далеко не уехать на собесе. Но видео всё-равно - огонь!!!🔥🔥🔥
А по математике что то спрашивают - логику, теорвер, матстатистику и т.д. ?
@@ei2292дают полностью исписанную тетрадь, но с небольшим местом на полях и просят доказать ВТФ(Великую Теорему Ферма), не прибегая к методам эллиптических кривых
@@ei2292 смотря куда идешь
@@ei2292нет
@@ei2292спрашивают, если ты выбрал направление машинное обучение, bigdata
То чувство, когда по мнению Павла "сеньорский вопрс" про DI container, задают на каждом собеседовании джуна. Говорю не от балды, а прошел около 10 собесов и на каждом спрашивали про внедрение зависимостей, время жизни и что от чего не желательно ставить в зависимость (привет чистая архитектура). А вообще у Паши дар приподносить информацию, вроде всё что он говорил тут я знаю, но после просмотра многие вещи лучше устаканились! Жду 3 выпуск😅
Стоит задуматься и сделать!) спасибо
Вопросы про DI сильно отличаются по глубине ожидаемого ответа.
Для джуна достаточно знать, что DI есть. Вот тут регистрирует, вот тут запрашиваем.
А вот архитектурные вопросы, например, о возможности ограничения доступа на уровне DI, это уже совсем не для джуна вопрос.
PS Приятно знать, что эта работа кому-то приносит пользу. Буду и дальше стараться ))
@@JinOptimistУ моего друга на стажировке спрашивали про время жизни. И в чем проблема когда в компонент с большим временем жизни попадает компонент с меньшим временем жизни.
@@DimaBriquezда ладно, только хотел об этом написать)
Тоже на стажировку проходил, и тоже спрашивали, что будет если в скоупе транзиент, и наоборот. И по архитектуре тоже спрашивали...
Не прошел, наверное мидла искали на стажёра)
@@gengerlolблин, как вы вообще попадаете на собеседования, у меня за последнюю неделю 5 отказов при том, что резюме далеко не пустое(много пет проектов), но без коммерческого опыта пока только нахер иду
Очень хочется курс от Паши для Middle-Senior уровня. Про преподавательский дар это факт
Все со временем. Мб, и сделаем)
@@teachmeskills Вчера наткнулся на ваш канал. Паша максимально приятный человек. Какой-то курс будет? Я бы даже купил чтобы освежить память по .NET
Емое ,целый час пролетел как мгновенье .Так интересно слушать ,и все понятно почти сразу .Идеально
Спасибо)
Первый ролик смотрел несколько раз! Очень рад второму выпуску, спасибо, очень познавательно!
У него преподавательский талант. Хоть бери и конспектируй, много нового узнал. С удовольствием бы посмотрел 3ью серию)
Спасибо. Рад стараться ))
Ахах, он так артистично объясняет. Надеюсь в будущем буду также говорить на собеседованиях
Благодарю за ценный материал! Пару минут послушать Пашу по конкретному вопросу = потратить около часа на прочитывание различных статей и не факт, что будет так же понятно))
Спасибо и вам большое) рады быть полезными)
Паша вообще молодец)) всегда нравится слушать именно его) все грамотно и доступно)) благодаря Паше я решил выбрать для себя C# как основной язык программирования, несмотря на то, что склонялся больше в сторону Java и конечено IDE от JetBrains.
Мы полностью согласен) спасибо и вам за просмотр. И надеемся, что выбором довольны)
@@teachmeskills ну C# похож на JAVA вот только до сих пор не привыкну к Visual Studio) как по мне IntelliJ удобнее но уверен что это дело привычки))) спасибо за видео))почаще Пашу приглашайте)))
@@Alex_Noizzzz сделаем! Спасибо! Вам удачи в учебе)
@@Alex_Noizzzzесли вам idea больше нравится, то можете использовать Rider от той же конторы, это таже самая idea ток для c#.
@@Alex_NoizzzzНикогда не использую VS для разработки. Rider куда приятнее
Выпускай больше таких видео по C#, особенно с Пашей
будем)
@@teachmeskillsждём!
Так интересно его смотреть, приятный человек:)
это да)
Вы меня прямо застесняли )))
Но всё равно, спасибо за добрые слова
Нуу, честно говоря лучше я не видел. Паша огонь.
Согласны) спасибо большое)
Очень интересно и очень полезно! Я не фанатка изучения сухой теории, но спикера увлекательно слушать
Рад что вам понравилось :)
Фантастика! Сложные темы, но быстро и простым языком. Так держать!
Спасибо)
Спасибо большое за первую и вторую части видео! Сегодня проходила собеседование, вопросы и их разбор очень помогли)
Прошла?
@@victoriash6047 да)
@@magiccreature7225 Привет, собес на джуниор позицию? Долгий был поиск работы?
@@ds-vs привет, на позицию стажёра, поиск относительно долгий)
Большое спасибо за выпуск!
Ооочень многие моменты прояснил для себя! Жду 3 часть ❤️
тоже большое спасибо за просмотр) были рады стараться)
Супер! Спасибо за оба выпуска! Жду новых видео с Пашей))
Было бы круто мидл-синьор собес посмотреть😀
спасибо большое) что-нибудь придумаем обязательно)
Ооо, приятно видеть продолжение, повод сделать чай
Мне стыдно. Я в тот день просто слишком много дебажил, так что Stack я не иначе как CallStack называл. Это конечно не правильно, речь идёт именно, что о Stack.
Чистосердечное признание)
Спустился сюда специально в поисках этого комментария
Огонь видео! Вот бы побольше таких!
Чудесное и понятное объяснение!!!!
extension methods- методы расширения.
Этим подходом можно расширять функционал классов к исходникам которых ты не имеешь доступа.
Например есть класс из DLL но в этом классе не хватает для твоих нужд какого-то метода, вот тут ты можешь этот класс расширить.
Очень много полезной информации. Спасибо
Спасибо большое)
Спасибо вам за ваш труд! Узнал много новых фич, получил небольшое прозрение о DI (Dependency Injection).
Спасибо огромное) очень приятное) 5 марта будет следующий ролик с Пашей) будет тоже интересно)
Ребят, это реально круто! Спасибо🤩
Всегда пожалуйста :)
Спасибо)
Большое спасибо за ролик, про DI для себя многое почерпнул)
И вам спасибо)
Воу. Я только посмотрел первую часть и вот вторая!
)
"Какие типы шаблонов проектирования существуют в C# " -> дан четкий ответ!
Павел, вы говорили в прошлом выпуске, что стек лежит в куче. В этом выпуске вы рисуете их отдельно. Это разные стеки все таки или стек таки не лежит в куче?
А вас тоже заставили лайкнуть, шантажируя вашими интимными фото?
1) Это тот самый стек
2) Рисуют их отдельно, что бы наглядней донести основную мысль
3) А вот касательно, лежит ли он в куче...
Многие на этом моменте заострили внимания и просили поделиться первоисточником. Я уже делал пару забегов в интернет, но ни старую статью, где это я впервые увидел, ни обратного утверждения, что стек и куча создаются отдельно, я пока не нашёл.
Так что пока ни подтвердить, ни опровергнуть я это утверждение пока не могу.
Если кто-то найдёт, поделитесь информацией. В конце концов если я ввёл людей в заблуждение, нужно будет исправиться и извиниться в очередном видео.
@@JinOptimistэто какой то бессмысленный вопрос сам по себе, и стэк и куча - фактически просто адресные пространства в одной и той же памяти и все. Физически они ничем не отличаются, только алгоритмом работы с ними. К тому же эти адресные пространства - виртуальные и принадлежат конкретным процессам, что бы одни процессы не могли ходить в чужие кучи. А вот стэк привязан не к процессу, а к треду и треды не должны беспокоиться, что к их стэку может получить доступ другой тред из того же самого процесса. Что значит стэк в куче? Типа, пересекается ли виртуальное адресное пространство стэка с виртуальным же адресные пространством кучи? Нет, не пересекается, нахера? У них даже адресация может быть принципиально разной, стэку просто не нужна 64-битная адресация с его размерами, а вот куче нужна. А как это все физически организовано в памяти - вообще не важно, вы все равно из режима, в котором процессор запускает пользовательский код, в физическую организацию памяти никакого доступа иметь не будете. А если вы там свою ОС пишите, ну тогда наверное придётся в теме лучше разбираться)
Цитата "На схемах организации памяти младшие адреса обычно располагаются вни- зу (начиная с адреса 0), а старшие - вверху. Помните обсуждение стека и кучи в главе 1? По принятому соглашению, стек располагается в старших адресах, а куча - под ним. Стек растет вниз, куча - вверх." Источник Кокоса К Управление памятью в NET 2020 страница 105 и ниже на страницы 112 про windows подробне.
Спасибо большое! Четко и понятно :D
И вам спасибо)
Такие же вопросы мне задавали 18 лет назад, на моём первом собеседовании на C# разработчика. ОДин в один, я как раз Рихтера прочитал, и был хорош.
Как выбрать из толпы человека, который будет показывать лучше результат... Вот есть два кандидата - один опытный практик - П, другой лучше подготовлен к собеседованию, теоретик - Т.
Какого человека вы себе хотите? , наверное - практика, который быстро покажет результат без багов. На большинство вопросов из видео лучше ответит Теоретик.
Что до практики, то IDE + AI подсветит, где virtual, где using, где protected, где StringBuilder вместо string, и держать это всё в голове - у меня не хватает места.
Также я делал много задач по оптимизации, и всё, что обсуждается в подобных собеседоавниях про выделение памяти к 99% промышленных задачах не имеет смысла, так как затыки в других местах - базы данных и всё что связано с ними, большие объёмы передаваемых данных, специфики работы конкретных библиотек, повторные вычисления, парсинг, отсутствие кэширования - это секунды, а класс или структура - это 0.000001 секунды. Ну вот правильный выбор типа коллекции может ещё что то дать, если много поисков там по ней.
Я больше доверяю методике, когда расшаривается экран, и делается простое тестовое задание за 40 минут.
По тому что человек делает, как уверенно, как быстро набирает код, какие варианты решения проговаривает, какие уточняющие вопросы задаёт можно гипотезы построить. А также - можно полученный код как то сравнить между собой, а не "ну тот вроде про сборщик мусора лучше ответил, давай его возьмём.".
Но кроме знаний ещё как то надо понять, что человек в принципе порядочный, энергичный, инициативный, пытливый ум, кропотливый...
Возможно я ошибаюсь, и сравниваю поиск сеньора с поиском джуна...
У меня нет ответа как правильно искать специалиста, но то, что общеустоявшаяся практика собеседоаний и список вопросов, который не меняется десятилетия, не работают - для меня очевидно.
Я с вами по многим пунктам согласен. Но обратите внимание, что тут в основном речь про собеседования для Джуна.
То есть для человека без опыта работы. Было бы странно, ждать от него, что он будет хороший Практик. Поэтому и дают ему теоретические вопросы, которые покажут насколько он усидчивый, целеустремленный, серьёзно ли он настроен на профессию и т.д.
Но конечно, если такие вопросы идут на позицию Сеньора, то это странно
Предлагаю в следующий выпуск добавить побольше вопросов про коллекции. Например, в чём отличие словаря от хеш-таблицы.
Что-нибудь придумаем)
Да, а еще в чем отличие множества от set, очереди от queue, стэка от stack, массива от array. Полезно было бы узнать, конечно
действительно, об этом же информации нет в интернете
String и StringBuilder - это одно и тоже даже на уровне методов, просто первый тип неизменяемый, а второй да. "Намерения" не собираются, а сразу выполняются как метод модификации строки.
Думаю, на последний вопрос можно было бы и правильно было бы ответить: порождающие, структурные, поведенческие. Именно такой ответ, обычно, хотят услышать на вопрос о "типах" паттернов.
Согласен. Это классический ответ, но обычно его ожидают услышать на вопрос: какие типы паттернов вы знаете?
А тут вопрос был достаточно странно сформулирован про шаблоны для C#.
Но в целом да, думаю ваш вариант будет надёжней ))
Ребят, сделайте пожалуйста такой же формат только на middle позицию!
Интересная идея. Подумаю над возможными вопросами
Кайф, вот бы на вышке также учили :(
Спасибо за вторую классную часть. А будет ли выпуск(или возможно уже есть) про веб и HTTP? На собеседованиях во многих языках это необходимо и устройство того же HTTP можно отлично прочесть на мозиле, но будет ли это так же прозрачно понятно как если бы об этом рассказали такие спецы и классные преподаватели как есть у вас в школе...) Мне кажется такой материал был бы актуален для многих направлений разработчиков, так как веб это неотъемлемая часть многих, если не всех проектов) Буду благодарен в любом случае
Да, видео в котором в том числе будет HTTP, сейчас уже в производстве
@@JinOptimistПривет. Видео про веб ещё в производстве?
Спасибо, кажется я начинаю понимать dependency injection.
Слушаю после окончания курса Java, как будто почти все также)
ну не зря языки похожи между собой и постоянно конкурируют)
Сглазил немного) Хочу маленькую ремарку вставить про то, как 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 - это просто ностальгия по плюсам! Да, востребованное и эффективное применение этого ref довольно редко и специфическое, но оно имеет свою нишу. Значимые типы иногда бывают относительно большими, те же структуры с десятками полей или энумы с сотнями значений. Если в структуре, скажем, сотня значений, это будет 400 байт. При передаче без ref эта структура будет скопирована в стеке, малейший цикл вызовет сами знаете какое исключение (это даже если отбросить момент различного поведения при передаче по ссылке или по значению)
А про DI и сеньора вообще улыбнуло. По-моему, понимание слабой связанности классов - это вообще мастхев и без её понимания вообще к программированию коммерческих продуктов допускать нельзя!
По вопросу про разницу String и StringBuilder я бы хотел услышать более развернутый ответ:
Когда вы изменяете объект типа String, например, конкатенируете строки или выполняете другие операции над ней, создается новый объект строки, содержащий изменения. Изначальная строка остается неизменной. Это означает, что каждая операция изменения строки создает новый объект в памяти, что может вызывать накопление мусора и иметь негативное влияние на производительность при выполнении большого количества операций над строками.
В отличие от этого, StringBuilder предоставляет изменяемую последовательность символов. Вы можете модифицировать объект StringBuilder, добавляя, удаляя или изменяя символы в нем, и сам объект будет изменяться без создания новых объектов в памяти. Это позволяет сэкономить ресурсы и повысить производительность в случаях, когда требуется множество операций изменения строки.
Таким образом, StringBuilder обеспечивает более эффективное использование памяти и скорости выполнения операций изменения строки по сравнению с использованием операций изменения String.
Хороший ответ. Но если вы на собеседовании скажете, что StringBuilder лучше, у меня тут же возникнет вопрос, а почему бы не использовать только его. Зачем вообще тогда существует String если StringBuilder лучше во всём.
Когда описываете инструмент, не забывайте уточнять для каких он задач лучше подходит, и какие у него есть минусы ;)
@@JinOptimist Верно, каждый инструмент для своей задачи.
Спасибо за интервью, было приятно послушать простые и в тоже время грамотные ответы на не всегда простые вопросы.
У Стива Джобса была водолазка, у Павла - сандали)
Уже по первой теме появился вопрос (задача инженерная):
Записан файл на 16 гб. В нем идут пачки данных с синхрой crc и т.д. Самое долгое - это считывание из файла и чем большими кусками ты будешь это делать, тем быстрее отработает программа. Но в этом случае много крупных объектов да и выделенной памяти в целом. Решение к которому склонился я - использовать шаблон IDisposable и в ручную вызывать сборщик мусора.
Ваше мнение?
Как бы поступили в данном случае?
Запугал интервьюера насчет экстеншена :) А просто ответить, что это добавление (расширение) новых методов к имеющимся типам путем написания нового кода в отдельном статическом методе с параметром this и ссылкой на этот тип .
Памяти пользователю может и хватать, но GC запуститься сам в зависимости от её заполнения. Это не зависит от самочувствия пользователя или "места не хватает". Для этого есть специальное значение процентного уровня превышения памяти с трешхолдом.
Очень понравилось видео, большой лайк! Но хотелось бы услышать немного больше об override методах. Дело в том, что помимо виртуальных методов есть и абстрактные, хотелось бы узнать, каковы их различия и в каких случаях использовать тот, или иной тип метода. Так же интересно узнать, зачем использовать модификатор sealed для класса? (да, я знаю, что в видео не было о них сказано, мне интересно услышать ваше мнение)
В комментарии постараемся ответить) спасибо большое за апрув!)
Было бы ещё круто пригласить Пашу одновременно с Unity кодером и поговорить с ними о С# в контексте гэймдев.
С большим удовольствием пообщался бы с кем-нибудь из геймдева.
Как навреное любой мальчика, всегда мечтал сделаю свою игру, так что будет интересно послушать как там у них на Unity всё работает и какие особенности в работе с C# у них есть.
@@JinOptimist Блин, лайк! Было бы очень интересно. Тем более сам этому учусь,
Нужен следующий выпуск, но уже с вопросами поинтереснее. а лучше и с примерами кода. я вот год не собесился и даже несложные вопросы некоторые подзабыл, чуть стыдно было)
Попробуем) спасибо за наводку)
А про ваш случай - это нормально)
Ждем третью часть
Насчет var - с помощью него можно создавать анонимные типы
Классный специалист!
Плюсуем)
Босоножки реально тема
:D
Это что бы проще было зайти за своего среди программистов староверов.
Былобы неплохо иногда вставлять примеры выражений о которых идет речь, но в таком случае будет уже лекция про с#)
Кроме передачи параметров по "ref"/"val" в .NET добавили "in" - это когда параметр передаётся как бы по "ref" (избегаем копирования - передаём ссылку на объект), но при этом - менять параметр внутри функции - НЕЛЬЗЯ.
Крмое этого из спецификаторов доступа упущен "internal" который виден в пределах проекта, но не виден ВНЕ текущего проекта. А также комбинации, но там чёрт ногу сломит - проще забить и использовать стандартные public/protected/private, иногда разбавляя internal.
В промышленном программировании ни разу не видел, что бы использовали internal.
Хотя да, про такой модификатор, программисты обычно знаю.
Про In большинство и не слышали вовсе. К тому же применение для такого поведения проблематично придумать. Те же record куда как более органично в проектах используют. По крайней мере в моей практике.
Но в любом случае, спасибо за ваш комментарий. Приятно встречать коллегу, который так же радеет за качество информации )))
@@JinOptimist Потому что "in" относительно недавно появился - по моему только пару версий языка назад. Я сам про него узнал в марте этого года, когда освежал знания C# для преподавания.
internal можно использовать в EntityFramework для создания конфигураций - public для этого слишком много, а private - определённо не хватает.
StringBuilder и String похожи тем что они являются классами.
StringBuilder как видно по названию он создает строку.
Супер!
Спасибо большое)
Про virtual методы ...я бы хотел все таки услышать про таблицу виртуальных методов.... а не сказку как компелятор сам понимает куда ему идти ))) а так спасибо большое )))
Ну, я всегда пытался рассказывать про поведение, которое влияет на то, как мы пишем код.
Как компилятор это делает важно знать, либо если пишите свой компилятор, либо если вы просто любите теорию.
Поэтому такие вещи я пытаюсь опускать. Например, тоже самое касается и стринг пула. Это прикольный механизм для оптимизации от самого языка, но спрашивать про него на собеседовании с моей точки зрения странно.
И я рад, что вам понравился ролик ))
Мне одному стало любопытно, почему на вопрос про разницу массивов и списков речь вдруг зашла про коллекции? 😁
Наверное потому, что это одна предметная область.
Когда задают вопрос о String вполне нормально если тут же всплывают String Builder, char[], large object heap
Тоже самое и со списком. Это как слово триггер, после которого тут же хочется рассказать про коллекции, про алгоритмическую сложность, массивы и т.д.
Оч крутой выпуск👍
Опять буду негодовать и говорить, что структура не всегда хранится в стеке :)
По поводу GC. Реально задумался про то, Что изначально для него все объекты мусор, а потому он изначально помечает(маркирует), добавляет бит в SyncBlockIndex всем объектам сразу. А затем идя по стеку и корням - убитает на тех объектах, до которых добрался.
Надо Рихтера перечитать кусочек. Почему у меня было другое понимание?
Рад что материал оказался полезным, даже для тех кто неплохо разбираться в вопросе :)
Про поколения стопудово спросят. Потому что ведь GC не убивает сразу насколько я помню, или точнее не ищет одинаково часто в разных поколениях.
Главный момент статики в том, что она хранится в отрыве от класса, где была создана. В своем участке памяти.
И если некий экземпляр класса перестает существовать в памяти, то статика продолжает.
За интервью спасибо, очень доступно и понятно)
Сейчас out переменную предварительно объявлять не нужно.
Ребята, я конечно понимаю что надо завлекать людей все дела. Но обьективно покажите мне работодателя который сейчас наймет с такими знаниями как вы тут показываете. Не в одну компанию даже на трайнее брать скорее всего не будут. Слишком простые базовые вопросы. Покажите мне такие вакансии и я пойду туда работать)
Есть необходимо, а есть достаточное.
Вопросы которые мы тут разбираем, это необходимое для прохождение собеседования.
Никто и не утверждает, что ответов на эти вопросы будет достаточно. Мы просто взяли самые базовые и соответственно самые частые частые вопросы и попытались из как можно детальней разъяснить.
Можете обратить внимание, что это уже второе видео из этой тематики. Полагаю не последнее.
@@JinOptimist не последнее)
Очень абстрактно
Очень непонятна «абстрактность») конкретики дайте
Всё напутал. Параметры сортировки передаются вместе со ссылкой (или телом ф.) на функцию сортировки. А лямбда - это просто запись этого.
Ну вот дожили, не можем указать главное отличие класса и структуры. Тут даже в джуны не возьмут :)
если используешь ref или out получается что value type будет на куче?
Млин, чел, вот про мусор, прям как наши люди, пока есть куда сложить мусор - вывозить не будут :)))))) !!!
Меня 3 собеса подряд спрашивают про паралельность ,лок и гонки и прочую асинхронщину и многопоточность. Куда делись вопросы про солид и полиморфизм )
как поместить ссылку в кол стек, чтобы объект не был удален в куче?
Дуже круто, дякую з України!
І вам дзякуй! Вельмі прыемна)
Вам нужно приглашать народ. И собесы им устраивать))
Ну, на своём основном месте работы, я как раз много собеседований провожу :)
@@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 должен знать все азы платформы.
А как же вопрос про инкапсуляцию?))
А мидл что, может пока умолчать о самом интересном, об уровнях генерации объектов при сборке мусора? Видно, что ещё пока не разобрался... По стеку никто не лазит в поисках ссылок, они хранятся в спец. таблицах ссылок с которыми работает GC.
В случае с virtual. Может это упоминалось в ролике, но я не заметил. Я проходил тест в компанию, и там было несколько заданий с ним. Именно что меня заинтересовало, так это когда в родительском классе был virtual метод, а в дочернем(который от родителя унаследовался) вместо override было написано new virtual. Я тогда немного удивился, ибо даже не знал что так можно, и сути я тоже не понял. Единственное что я заметил, если мы в переменную с типо "A", например, пихаем инстенс "B"(тот что дочерний), то в отличии от override метод не переопределяется. Можете подсказать в чем тут нюанс и зачем так делать, или это из ряда задачек на собеседование?
Нюанс в том, что вы не переопределяете метод базового класса, а просто подменяете методом дочернего класса. Соответственно, на объекте с дочерним типом выполнится метод дочернего же класса, а на объекте базового типа выполнится метод базового же класса. То есть в зависимости от того, в какой тип вы один и тот же объект засунете, выполняется два разных метода. На самом деле такое вряд ли вообще где то зачем то применяется, такое просто делать не принято, это антипаттерн. Вам и иде об этом скажет, если вы new не напишите. По сути new просто означает, что вы в курсе, что вы творите какую то дичь. То, что он и в базовом и в дочернем помечен как виртуал - на результат абсолютно никак не влияет, это просто что бы вас запутать. А вот если у базового класса метод как virtual НЕ помечен, то его можно подменить с помощью new в дочернем и сделать его virtual, что все наследники от дочернего класса могли его нормально переопределить (но переопределить именно метод дочернего класса, не базового,базовый останется таким же как был, просто будет спрятан).
@@DF-ov1zm понял, спасибо за обьяснение👍
Сейчас нужны с зарплатой джуны со знанием сениор
Всегда так было
В unity(BDW) нету поколении, только в NET
Лайк однозначно. Зачем джуну знать про то, как сборщик мусора работает с памятью? Это уже перебор по-моему 🙂
Вопросы про GC это как вопросы на общую образованность. Знать об этом для работы не обязательно, но поговорив на эту тему, можно увидеть насколько человек понимает общие принципы. Наверное по этому такие вопросы и продолжают задавать
А вы почитайте требования к джунам, рынок перполнен, требования как к мидлу года 3 назад.
@@JinOptimist Всё равно мне это кажется странным.. Время на собеседование ограничено, и важно понять может ли джун писать добротный код, и с какой скоростью решает поставленные задачи. Поэтому если этот вопрос не влияет на результат собеседования, то ИМХО нет смысла тратить на это время, а если влияет, то это странно 🙂.
Кстати, Вы прекрасно обьясняете сложные вещи простыми словами, очень приятно и полезно слушать! 🔥И ведущий тоже большой молодец! 👍
@@pulsar1934 Я бы предпочёл за это время лучше что-нибудть практическое поспрашивать. Если конкуренция большая, то я бы усиливал и углублял проверку именно практических навыков. Если бы мне как джуну начали задавать такие вопросы на собеседовании, то я бы при наличии других предложений, выбрал бы другую фирму, даже если бы на все такие вопросы ответил 🙂
@@ivansusanin9448 А мне кажется собеседование это конечно хорошо, хотя бы на человека посмотреть, но всё что нужно знать об уровне программиста это его гит и его проекты, достаточно посмотреть его код и всё становится предельно понятным. А собес это просто трёп, который к практике не имеет ни какого отношения.
Из стека зависшие ссылки мы не удаляем, они там удаляются сами.
Что-то к третьей части интервьюер выглядит уставшим
в геймдеве в нормальных проектах есть DI, просто тут любят писать говно и оправдывать это всем, что только можно
а как поколения не влияют, если 0 поколения переменные быстрее уничтожаются тк находятся рядом!?
ссылки на видео не оставили
держите - ruclips.net/video/zQbk4hVzVyU/видео.html
Если бы я так отвечал на собеседовании, я бы вряд ли прошёл его :/
много деталей опущено.
Собеседование это диалог. Если интервьюеру нужно будет больше деталей, он задаст уточняющие вопросы или попросит рассказать подробней.
Плюс вопросы которые мы тут поднимаем это скорее начало собеседования. Более сложные и специфичные вопросы мы тут не поднимали.
Так что не волнуйтесь, если так вы будете отвечать в начале собеседования это вам не навредит. Главное что бы вы могли выдать больше деталей если это потребуется
Статические методы и свойства потокобезопасны, поэтому достаточно статики для реализации синглтона. Локи никакие не нужны
Точно-точно?
Поддержу комментатора выше.
А вы уверены что любой Статичный метод и тем более свойство потокобезопасны? Может вы что-то конкретное имеете ввиду, потому что пока ваше утверждение выглядит, мягко говоря ложным
Почему такие легкие вопросы. Где вопросы про REST, GRPc, Microservices, MessageBroker, SOLID, тестирование NUnit, REST vs GRPc, Паттерны обычно спрашивают каждого вида и по несколько, Dapper vs EF, зачем нужна Reflection. И это не все.
В общем как по мне сейчас от джуна требуют куда больше знаний технологий ибо знаниями самого языка не особо кого то удивишь. Вернее сейчас это считается пост фактум базой.
Как вы правильно заметить, начинаем мы с базовых вопрос о C#. То что как вы заметили этими знаниями никого не удивишь, не значит, что об этом не спрашивают или что этого знать не нужно.
В тоже время, спасибо за список вопросов. Думаю если будет следующее видео, обязательно поговорим там о NUnit, ORM, Reflection, REST и много другом )))
Но про DI только практика, по теории ничего не сказано, про Inversion of Control ни слова.
Жалко не раскрыли кто такой Паша Львов. Хотя бы вкратце кто он?
У нас с его участием до этого выходили ролики. Когда приглашаем гостя в первый раз, просим пройтись по его биографии) вот ссылочка - ruclips.net/video/4ZykAmPUtrw/видео.html
@@teachmeskills спасибо
Как пройти собеседование на C#, когда в стране всего 16 вакансий?) И то половина из них, это middle/senior.
Не в той стране ищите)
Из ваших слов следует, что прямо сейчас есть как минимум 8 (половина от 16) вакансий, где требуются Джуны.
Так что ответ просто, ходить на собеседования и учиться ;)
ппц, я оказывается все это знаю, много лет, как избавится от чувства самозванца? много проектов веду с коммерческим опытом, но нет уверенности в себе чтобы попросить больше ЗП ((
Возможно стоит попробоватся на вакансию где изначально предлагают больше чем есть у вас сейчас?
Видео устарело на момент своего создания. Еще год назад на собесах это были вопросы скорее для менти, чем для джуна. Оттого смешнее слышать, что в вас подозревают сеньора.
Закон спроса предложения сделал свое дело, сейчас средне-статистический джун с докером работает и RabbitMQ.
А можно столбиком эти вопросы и список компаний, а то звучит так, что мы в вакууме живем, а у вас актуалочка на руках)
Жалко не было моего любимого вопроса из собесов про DI и DIP из SOLID.
DI было)
Не, дружище, если из стека никто не ссылается, то не важно, что в куче.... Джун был прав!!! И вообще - покажите мне место с кодом мусорщика??!! До того задрали темой мусорщика - ссылку на исходники - в студию!!! А гребные легенды и сказки рассказывайте кому угодно!!! Или это повод самому залезть, посмотреть как работает на самом деле и обосрать всех синьеров? Подобный пример есть у Мурыча - про js спецификацию... Всякую херню придумывают про приведение типов, а читаешь спецификацию - там все по другому описано...
Ref для экономии памяти имхо
А ещё если по ref передать reference type то можно проинициализировать новый объект, ссылка на который будет подложена в старую переменную )))
Но всё же думаю, это не основная причина использования ref
@@JinOptimist спасибо за видео вы очень уверенно отвечаете на вопросы. Мне бы так на собесах
@@JinOptimistещё можно делать return ref