#SimpleCode - Сергей Журавльёв
6.6K subscribers
24 photos
10 videos
2 files
175 links
Канал о программировании и не только.
Download Telegram
Channel name was changed to «#SimpleCode - Сергей Журавльёв»
Никому не говорите пока, что меня здесь видели. 😉
З.Ы. Эта телега скоро станет полезнее!
З.З.Ы. А совсем скоро выйдет кое-что слегка безумное. 🤘
Итак, начнём с чего-то слегка безумного 😊. Сегодня я сделал то, что давно хотел 🎉. Благодаря AI, я смог использовать свои старые музыкальные наброски и идеи, чтобы превратить их вот в это 😎🎶.

Встречайте — SOLID Клавиатор (Software Metal Ballad)! 🤘🔥
https://www.youtube.com/watch?v=eQNmHW9HZrY
SimpleCode — SOLID Клавиатор (Software Metal Ballad)
Меня много людей (целых 3 человека, а это уже много 😁) просили рассказать, как этот трек сделан. Поясняю:
Всё сделано с помощью нейронки Suno . Чтобы её использовать, никакой специальный гайд не нужен. Наклепать всякого рода музыку там можно за пару кликов, причём бесплатно.
Для меня лично это клепание особой ценности не несёт, но что действительно прикольно — туда можно загрузить свою собственную музыку и текст. На основе этого с вашим текстом будет создан новый трек в том стиле, который вы опишете.
Я довольно давно увлекался игрой на электрогитаре. Ну, как игрой — я называю это "побрынькиванием". Хотя я уже три года не держал гитару в руках, записи и риффчики остались. Один из них я и загрузил в нейронку — его в чистом виде можно услышать в первые 10 секунд трека.
А текст — это полёт моей буйной фантазии, слегка подправленный ChatGPT для рифмы. То, что он такой абсурдный, — сделано специально (держу в курсе если кто не понял) 🤓.
Риффов у меня осталось ещё много, да и тексты есть (тоже с прибабахом 😎). Может, даже стоит создать отдельный канал под всё это?
Как затирать про Singleton на собесе
Итак, вы на интервью на .NET-разработчика, и вас спрашивают: какие паттерны проектирования вы чаще всего использовали в своей работе? И вы не придумали ничего лучше, чем Singleton. Всё OK, Singleton тоже паттерн. Вопрос в том, как его правильно «готовить».
Во-первых, вы реально должны знать, что такое Singleton, для чего он нужен и как работает. А дальше начинается самое интересное — это то, куда этот вопрос может вас привести.
Если бы этот вопрос задал я, то хотел бы услышать вот что:
Во-первых, если позиция предполагает работу с ASP.NET Core, можно сразу рассказать, что именно этот паттерн вы часто используете. И не потому, что сами всё это ручками пишете, а потому что используете DI (dependency injection). Работая с ASP.NET Core, вы так или иначе его юзаете.
Таким образом, отвечая на вопрос о Singleton, вы выходите на рассказ о том, что такое DI, и упоминаете модели внедрения зависимостей с использованием методов:
• AddSingleton,
• AddScoped,
• AddTransient.
На этом не останавливаемся. Дальше рассказываем, какие проблемы могут возникнуть с Singleton в многопоточной среде. Например, что будет, если работать с этим Singleton из нескольких потоков?
Тут нужно упомянуть:
• Race Condition
• механизмы синхронизации потоков (Lock, Mutex, Semaphore и т.д.)
Естественно, нужно знать, чем они отличаются.
Если нужно, вас всегда остановят и зададут уточняющий вопрос. Но благодаря такому подходу вы показываете, что не просто формально выучили паттерн. К тому же, если из вас не нужно «выдавливать» знание, это сильно упрощает задачу интервьюеру и создаёт впечатление человека, который шарит.
И, что немаловажно, вы хоть немного, пусть и не гарантированно, управляете тем, куда пойдёт интервью — туда, где с вашими знаниями всё ок. А время на интервью, сами понимаете, ограничено. 😉
Продолжаем тему вопросов о паттернах проектирования на собеседовании. Напоминаю, что наша цель — проявить инициативу, показать свои знания и убедить, что мы разбираемся в теме. Также мы, хоть немного, но всё же можем управлять ходом интервью, направляя его в ту область, где способны проявить себя с лучшей стороны, если, конечно, нас не прервут =)
Напоминаю, что вас спросили о том, какие паттерны проектирования вы чаще всего использовали в своей работе. На этот раз вы вспомнили паттерн "Стратегия". Хороший выбор! 😊 Давайте разберём, к чему это может вас привести.
Как всегда, вы безусловно должны знать, что представляет собой классический паттерн "Стратегия" и для чего он нужен. А помимо этого, наша с вами стратегия следующая: нужно привести пример, который связан с основами платформы .NET. Здесь важно вспомнить, что паттерн "Стратегия" отлично реализуется через делегаты. А где мы чаще всего используем делегаты? Правильно — в LINQ. Таким образом, "Стратегия" оказывается одним из наиболее часто применяемых паттернов.
Кстати, как раз сейчас я работаю над большим курсом по LINQ! 😊
Итак, рассказываем, что такое LINQ, для чего оно нужно. Обязательно упоминаем, что паттерн "Стратегия" в LINQ (если мы говорим о синтаксисе методов) реализован через extension methods (рассказываем, что это) и встроенные (универсальные) делегаты. Рассказываем о том, что такое делегаты. Основным делегатом, который используется в LINQ, является Func, но если будет возможность, упомяните также Action и Predicate. Обязательно следует упомянуть, что LINQ реализован на базе интерфейса IEnumerable (скоро будет видео). Тут вас, кстати, могут спросить про паттерн "Итератор", но это тема другого поста. Учтите, что разговор про IEnumerable может плавно перерасти в разговор про IQueryable и expression tree, где довольно часто возникает затык, так что подготовьтесь 😊
Ну и как вишенка на торте — вас могут попросить написать свой собственный LINQ-метод.
Учтите, что практически на любом собеседовании, кроме, пожалуй, Senior-позиций, все эти вопросы всё равно спросят. Так что лучше сразу показать, что вы в теме! 💪
💡 В продолжение темы о вопросах на собеседовании и паттернах, одним из наиболее часто используемых вами паттернов так же является Итератор и вот почему.
Коллекции в C# могут работать с циклом foreach благодаря реализации паттерна Итератор, который, в свою очередь, может быть реализован благодаря тому, что эти коллекции реализуют интерфейсы IEnumerable и IEnumerator. Такой подход даёт возможность, не разбираясь в деталях реализации коллекции, перебирать её элементы в цикле.
🎥 В этом уроке мы разберём цикл foreach на атомы, разберёмся с тем, при чём тут паттерн Итератор, а также с интерфейсы IEnumerable и IEnumerator.
https://www.youtube.com/watch?v=YpRSnUkepv8
🔄 Вернёмся к теме вопросов на job interview!
В продолжение предыдущего поста о паттерне Итератор.
Само собой, вы уже рассказали об интерфейсах IEnumerable и IEnumerator, перечислили методы и свойства интерфейса IEnumerator:
• MoveNext()
• Reset()
• Current
Рассказали, как они работают.
🤔 Логичным будет следующий вопрос:
Что вы знаете про yield?
Уже в следующем уроке мы этот самый yield подробно разберём!
Будут бенчмарки с пруфами!
🔑 А пока, вот основные моменты, которые стоит помнить о yield:
1️⃣ Разворачивается в стейт-машину
При компиляции метод с yield преобразуется в скрытый класс, который управляет состоянием итерации (реализует IEnumerator).
2️⃣ Отложенное выполнение
Код внутри метода с yield не выполняется сразу, а только тогда, когда последовательность начинает перечисляться (например, в цикле foreach).
Это может значительно повысить производительность, так как позволяет получать элементы по одному, а не всю коллекцию сразу. Чем больше элементов в коллекции, тем больше мы выигрываем в производительности.
3️⃣ Эффективное использование памяти
Поскольку элементы обрабатываются по очереди, yield позволяет работать с большими коллекциями, не занимая много оперативной памяти. Это особенно полезно при обработке сотен тысяч объектов, когда нет необходимости хранить всю коллекцию в памяти. Используем меньше памяти. Реже отрабатывает сборщик мусора, что довольно накладно.

З.Ы. На Udemy эта тема уже есть. Там я буду выкладывать всё немного раньше в качестве благодарности за финансовую поддержку. https://www.udemy.com/course/simplecode-cshap/?referralCode=53C0314076F77DCC2A02
В этом уроке мы разберёмся с механизмом отложенного возврата значений yield return, рассмотрим стейт-машину, в которую это всё компилируется, а также с помощью бенчмарков проверим, как использование yield может существенно оптимизировать производительность. https://www.youtube.com/watch?v=aUbFYuBMDqU
🔄 И снова к теме вопросов на job interview!
Одной из ключевых тем собеседования будут вопросы о строках и классе StringBuilder, поскольку знания о них так же охватывают понимание того как устроена работа с памятью в .NET.

🔑 Что следует знать о строках и StringBuilder:
1️⃣ Строки неизменяемы (immutable)
• Когда строки объединяются с помощью оператора + (то есть выполняется конкатенация), происходит создание нового объекта строки в памяти.
• Старые объекты остаются в памяти до сборки мусора (Garbage Collector).

2️⃣ Конкатенация строк в цикле == проблемы с производительностью
• Если конкатенация выполняется внутри цикла, это может сильно замедлить работу программы.
• Причина в том, что строки являются неизменяемыми: на каждой итерации создается новый объект в памяти, а старые объекты ожидают удаления сборщиком мусора, что является дорогостоящей операцией.

3️⃣ Класс StringBuilder решает проблему конкатенации
• StringBuilder использует внутренний изменяемый буфер, что позволяет добавлять, изменять и удалять текст без создания новых объектов.
• Вместо создания нового объекта строки изменения происходят внутри буфера, что позволяет избежать лишних выделений памяти и сборок мусора.

🛠 Когда использовать StringBuilder?
• Если строки изменяются часто (например, в циклах).
• При конкатенации большого количества строк.

📌 Интернирование строк (String Interning)
Отдельным пунктом следует упомянуть о механизме интернирования строк.
• Интернирование строк — это механизм оптимизации памяти, который позволяет хранить только одну копию каждой уникальной строки в специальном пуле строк (intern pool).
• Все литеральные строки (например, "Hello") автоматически интернируются и добавляются в пул строк на этапе компиляции.
• Если создается строка с таким же значением, которое уже есть в пуле, ссылка будет указывать на существующую строку, а не создавать новый объект.
Для поддержания актуальности этого курса разбираемся с тем, куда пропал метод Main и класс Program, а также с тем, что такое Top-level statements. Далее пойдут более интересные технические темы.
З.Ы. Для тех, кто купил этот курс на Udemy, не переживайте — эта тема раскрыта в самом начале курса в видео о том, как создавать проект. (Там заменить устаревшее видео и расширить курс проще, чем на YouTube) https://www.youtube.com/watch?v=iFWcob1ttNg
Вчера весь вечер тестил китайский DeepSeek (если кто не в курсе – аналог ChatGPT). Первые впечатления – довольно неплохо! 🤔
Кажется, он менее осторожен в высказываниях и более прямолинеен в суждениях – наваливает без лишних церемоний. 😎
Тестим дальше.
📢 Запускаем LLM локально за 5 минут! ⚡️
По комментариям под прошлым видео я заметил, что многим интересен запуск больших языковых моделей (LLM) на своём ПК, но не все знают, как это сделать. 🤔
Поэтому вот один из самых простых и быстрых способов! 🚀 Запускаем DeepSeek R1 локально с помощью LM Studio. 🔧💻 https://www.youtube.com/watch?v=UPdtp4l7IjE
В этом видео разберёмся с делегатами в C# – что это такое, как они работают и зачем нужны. Рассмотрим встроенные делегаты Func и Action, а также их связь с LINQ и лямбда-выражениями. Покажу примеры использования, создание собственных делегатов и работу с Multicast Delegate. https://www.youtube.com/watch?v=vkOnfEn8tFU