Сообщество - Лига программистов
Добавить пост

Лига программистов

1 533 поста 11 431 подписчик

Популярные теги в сообществе:

Сборщик мусора в .NET

Сборщик мусора в .NET Кросспостинг, Pikabu Publish Bot, Csharp, Dotnet, Interview, Текст, Длиннопост

Одним из самых популярных на собеседованиях C# разработчиков является вопрос о работе сборщика мусора в .NET. Мне также приходилось рассказывать о нём интервьюерам на моих собесах. Сегодня я хотел бы кратко рассказать о сборщике мусора, заодно и сам вспомню.

🔍 Зачем нужен сборщик мусора?
Сборщик мусора автоматически обеспечивает освобождение памяти, занятой объектами, которые больше не используются. Такой подход предотвращает утечки памяти и снимает с разработчика бремя ручного освобождения памяти (привет С++), что позволяет сосредотачиваться на более важных аспектах программирования.

Когда вызывается сборщик мусора?
Сборщик мусора активируется автоматически, например, когда одно из поколений заполнено (о поколениях позже). Если вам требуется инициировать сборку мусора вручную, используйте GC.Collect().

🔗 Как определяется, какие объекты больше не используются?
Сборщик мусора опирается на концепцию "GC Roots" (корни сборки мусора):

1. Локальные переменные: Объекты, на которые существуют ссылки в локальных переменных.
2. Статические переменные: Объекты, на которые ссылаются статические переменные классов. Эти корни живут в течение всего времени выполнения приложения.
3. Активные элементы стека: Если во время выполнения функции происходит сборка мусора, то локальная переменная внутри данной функции не будет удалена сборщиком мусора. Такая переменная считается активным корнем, до тех пор пока кадр стека метода не будет разрушен.

Сборщик мусора создаёт граф (фаза маркировки), который содержит все объекты, достижимые из GC Roots. Объекты, на которые нет ссылок из GC Roots, считаются недостижимыми и готовыми для удаления.

🔄 Как работает сборщик мусора?
Сборщик мусора использует концепцию поколений (поколения 0, 1 и 2) для эффективной работы с объектами различной "старости".

- При создании объекты помещаются в поколение 0. Если объект слишком большой (по умолчанию объекты размером больше 85 000 байт), то он будет помещён в Large Object Heap (очищается вместе с поколением 2).
- Когда поколение 0 заполнено — запускается сборка мусора. Неиспользуемые объекты удаляются (недостижимые из GC Roots), оставшиеся перемещаются в поколение 1.
- Аналогично происходит сборка мусора, когда заполнено поколение 1. Все выжившие объекты перемещаются в поколение 2. Затем происходит сборка мусора в поколении 0.
- Когда заполнено поколение 2, происходит полная сборка мусора. Сперва очищается поколение 2, а затем 1 и 0. Если после этого недостаточно места для новых объектов — происходит исключение OutOfMemory.
- В самом конце происходит фаза сжатия, в которой сборщик мусора перемещает живые объекты так, чтобы они располагались в памяти непосредственно друг за другом.

🔄 Для чего нужно разделение на несколько поколений?
- Сборка мусора поколения 0 выполняется чаще и занимается удалением объектов, которые быстро выходят из области видимости.
- С увеличением поколения редкость запуска сборки позволяет более эффективно использовать ресурсы. Поколение 0 очищается чаще всего, поколение 2 очищается реже всего.

🌐 Ещё по теме:
- .NET Memory Management Concepts — очень кратко об основных концепциях сборщика мусора
- Поколения объектов — одна из очень подробного цикла статей о сборщике мусора

https://t.me/cherkashindev/117

Показать полностью 1

Попытка для интереса

Я как сраный старпер тупо в ит (22 года стаж, но нихера не знаю). Забейте на языки. Думайте о предоставлении данных. Язык программирования - херня, инструмент типа отвёртки. А от структуры данных зависит и платформа, и архитектура, и язык.Я что ща модно? Питон? Душите его. почитайте, бля, программной с дипломом.

Программирование в PL/SQL (ORACLE). Массивы, Циклы

Уроки программирования в PL/SQL (ORACLE). Разбираем задачу с массивами, циклами. Оптимизация решения, поиск ошибок.

Как лучше сформулировать причины увольнения?

Вот такой вопрос, коллеги...

С 2019 года мне не везло с работой.

Сначала устроился в организацию-1. Там мне не зашёл коллектив и стек технологий. Уволился через три месяца.

Потом была работа на организацию-2. Через год - в 2020м сокращение штатов из-за ковида.

Долго искал.

Затем - организация-3. В процессе работы они решили поменять стек, и мы расстались через три месяца.

Выгорел, летом 2021 отдыхал.

Вышел на работу осенью в организацию-пять. Работал до конца августа 2022. В процессе получил кучу депрессняка из-за ковида, начала СВО, накрывшейся из-за СВО медным тазом подработки на фрилансе, проблем с жутко забитым графиком тестировщика, увольнением тимлида и чехардой временных тим-лидов, и, под конец, разгоном команды новым тим-лидом. (Разгонять он начал с меня, но в итоге разогнал всех. Новых людей в команду ищут до сих пор, так как никто этого мудака не выдерживает больше двух месяцев. )

В апатии сидел до января.

В январе вышел на работу по контракту в фирму-6. Контракт фирмы с заказчиком закончился через три месяца, до конца мая ничего не нашёл. Уехал на море до середины августа, сейчас в поиске.

Вопрос - как все причины увольнений сформулировать так, чтобы не обосрать ни себя, ни работодателей?

С работодателем-1 часто задают вопросы - чем вам не понравился коллектив, чем вам не понравился стек, а что, вы не захотели получить новые знания? Как тут отвечать (Хм... От ряда коллег не было поддержки, зато постоянно шли придирки по мелочам, технологии выглядели примитивными - ГИГАБАЙТНЫЕ файлы журналов надо было просматривать в блокноте!!!, много времени уходило на отчёт о выполненной работе с точностью до минуты).

Работодатель-3 - тоже у всех вопрос - а почему вы не захотели остаться? Честный ответ - не хотелось терять накопленный багаж знаний по своему стеку и переезжать на чужой.

Работодатель-6 - тут выходит ответ, что заказчик не стал с работодателем-6 продлевать контракт, а других контрактов по моему стеку у них не было (итоги общения с коллегами это подтверждают).

Так как все причины увольнений сформулировать так, чтобы не обосрать ни себя, ни работодателей, и не дать возможности задавать дополнительные вопросы?

Показать полностью

Как я, Java разработчик, делаю курс для Java разработчиков? Выпуск #1

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

Как я, Java разработчик, делаю курс для Java разработчиков? Выпуск #1 Программирование, IT, Онлайн-курсы, Онлайн-школа, За кадром, Закулисье, Длиннопост

#1. Много новых ИНТЕРЕСНЫХ задач

Из-за того, что курс является моим первым крупным детищем и на него пока нет крупных инвестиций, мне приходится решать задачи "оптимизации" - пространства, ресурсов и прочего.

Пример: Каждый месяц я беру на курс не больше 10 человек и рассчитываю на то, что все они будут выполнять домашние задания. Пока что я использую обычный сервер и пытаюсь оптимизировать его так, чтобы можно было запустить на нем множество микросервисов (и при этом чтобы студенты друг другу не мешали).

Естественно (и небезобразно) все запускается в Docker.

Вот вам один из интересных кейсов: одно из первых домашних заданий - создать мини-веб-проект на Java без использования Spring / Spring Boot.

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

Так вот, для этой домашки каждому Java приложению выделяется 48 мегабайт для его оперативной памяти, а для контейнера в целом - 64 мегабайта.

Знал ли я, как регулировать размер доступной оперативной памяти (RAM) для Docker контейнера? Нет, раньше я об этом не задумывался, так как это не было необходимостью. В средах, таких как Kubernetes, за это обычно отвечали другие инструменты, и напрямую регулировать размер RAM не требовалось. Однако, было ли мне интересно узнать об этом? Конечно!

#2. Много НОВЫХ интересных задач

Делать домашки и запускать их на своем компьютере – это конечно здорово, но что, если домашка прикольная, а никому это не покажешь?

Даже друзьям, даже санитарам IT-леса – специалистам из HR.

И тут я однажды такой: "А ЧТО, ЕСЛИ СДЕЛАТЬ ХОСТИНГ ДЛЯ СТУДЕНТОВ?"

И мой мозг такой:

Как я, Java разработчик, делаю курс для Java разработчиков? Выпуск #1 Программирование, IT, Онлайн-курсы, Онлайн-школа, За кадром, Закулисье, Длиннопост

А как?! А как это делать?! Я никогда такого не делал. Нужен будет какой-то выстроенный и изолированный друг от друга процесс публикации домашек на сервере. А еще и чтобы это было красиво.

Да, задача в целом очень простая, если вытаскивать наружу порты.

от сделал один студент две домашки, а другой — три.

Например, в первой домашке, мы делаем веб проект который занимает порт 8080, во второй домашке используется порт 8081, в третьей 8082.

И получается, что запустить на сервере две первых домашки от двух разных студентов я не смогу (так как будет конфликт портов).

Как я, Java разработчик, делаю курс для Java разработчиков? Выпуск #1 Программирование, IT, Онлайн-курсы, Онлайн-школа, За кадром, Закулисье, Длиннопост

Окей, значит, надо им выдавать порты последовательно и делать маппинг этих портов. То есть для первого студента и его домашек выдаем порта 8000-8002. Для второго студента порты 8003-8005. Но что, если они будут выполнять домашки не последовательно? И, например, первый сделает три домашки, а второй только одну?

Хм... Значит, алгоритм провальный. Что насчет реестра?

Кто-то первый делает домашку, и она заливается на сервер. Анализируется порт из домашки и привязывается на первый свободный порт, начиная с 8000. А для пущей надежности еще и в Бд сохраняется. Возьмем для этого SQLite. Ну а что? Многопоточки пока нет, а работать с SQLite из Bash очень удобно.

А еще динамически меняем или дополняем конфиги в Nginx, чтобы пробрасывать нужную домашку на нужный путь. И порт. И еще и домен.

Точно! Домен!

# 3. МНОГО новых интересных задач

С доменом все плюс-минус просто. Покупаем за 200 рублей домен и...

И понимаем, что нам нужно делать новые поддомены для каждого студента.

Думаем как это сделать. Окей, можно использовать wildcard.

То есть если бы мы купили домен example.com, то в настройках DNS можно всего одну настройку добавить (*.example.com) вместо того чтобы править эти настройки каждый раз для каждого нового студента.

И тогда для студента с юзернеймом ivan будет свой собственный поддомен:

ivan.example.com

Пробрасываем порт домашки на 80 порт и открываем в браузере и...

И понимаем что нужен HTTPS.

А как? Как сделать HTTPS для *.example.com? А так вообще можно?

А Let's Encrypt так сможет?

Как оказалось сможет)

В итоге после прочтения нескольких статей, и настройки всего необходимого получаем хостинг для студентов своими руками с HTTPS на чистом Bash + SQLite + Docker + Nginx + Let's Encrypt.

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

Показать полностью 3

Ретроспектива спринта

Ретроспектива спринта IT, Agile, Программирование, Компьютер, Программа
Показать полностью 1

Первая программа на C#

С начала этого года я взялся изучать C#. Некоторое представление о программировании уже было т.к. в школе, году так в 2005-м, закончил курсы по Delphi. В принципе каких либо проблем с пониманием материала при изучении Шилдта, статей и видео-уроков у меня не возникало. Проблемы есть с большими перерывами в обучении и иногда отсутствием желания. С начала обучения прошло уже почти 9 месяцев, но в общей сложности занимался дай бог месяца 4. Не знаю на сколько глубоко можно постичь программирование за такой срок самообучаясь, но хочу показать свой маленький проект.

Это простенькая программка для учета товара в цветочном магазине. Функционал минимальный и есть над чем работать. За внешний вид прошу не пинать. С визуальным оформлением я еще не знакомился.

  1. Это главное окно. Тут думаю все понятно

Первая программа на C# Программирование, IT, Си, Программист, Длиннопост

2. Это форма добавления товара в базу данных. КомбоБоксы связанны с базой, все работает, база обновляется. Ошибок пока не выявил.

Первая программа на C# Программирование, IT, Си, Программист, Длиннопост

3. Это форма редактирования базы данных. Так же все связанно с БД и можно поправить данные. Все работает корректно.

Первая программа на C# Программирование, IT, Си, Программист, Длиннопост

4. Это форма сборки букета. Тут по кнопкам добавить\удалить происходит добавление или удаление строки которая формирует один из ингредиентов букета. Каждый ингредиент это отдельный экземпляр класса

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

Первая программа на C# Программирование, IT, Си, Программист, Длиннопост

5. Это форма продажи. Выбираем вид цветка, его сорт и количество, потом добавляем в чек. Чек это тоже объект класса имеющий поля в которых хранится цена, название и количество цветов или букета. Можно добавлять в чек много позиций на случай если покупают несколько сортов. Так же в чек можно добавить букет из списка собранных.

Первая программа на C# Программирование, IT, Си, Программист, Длиннопост

Вот такая вот программка. Уверен, что более или менее опытный шарпист размажет мой код, найдет кучу косяков и сделает более грамотно))). Так же программа требует серьезного допила. Но все же она работает и выполняет свой минимум, и для меня это дополнительная мотивация учиться дальше)))

Показать полностью 5

Поиграем в бизнесменов?

Одна вакансия, два кандидата. Сможете выбрать лучшего? И так пять раз.

СДЕЛАТЬ ВЫБОР

Карьера в IT. Системный аналитик, часть 9. Список тем для подготовки к собеседованию на позицию джуна. Часть 1

Всем привет!

Вернулся из отпуска - готов продолжать свою деятельность дальше. Сегодня подытожу, немного, мою длинную серию постов и сведу ее в список тех тем (и тех вопросов), которые необходимо знать начинающему системному аналитику для того, чтобы успешно пройти технический собес.

Список тем и вопросов к ним:

  1. Методологии разработки ПО и жизненный цикл разработки ПО.

    1. Какие методологии разработки вы знаете? (Тут нужно рассказать про эджайл, водопад хотя бы. Можно и про остальные упомянуть, но обычно не требуется).

    2. В чем отличия между ними? Какие у них есть особенности?

    3. Расскажите про жизненный цикл разработки ПО. Какие этапы проходит задача\продукт до выхода в прод? (Лучше рассказывать своими словами, просто как понимаете)

    4. Расскажите про состав команды разработки - какие есть позиции и какие функции выполняет каждая из них? Какую роль выполняет системный аналитик? (Кстати, очень "забавно", но когда собесил людей на стажировку СА и даже некоторых джунов - много кто не смог толком ответить на последний вопрос. Т.е. люди банально даже не погуглили хоть чуть-чуть и не проходили по первым ссылкам гугла, чтобы немного подготовиться к собесу и понять куда они вообще идут. Про какую уж тут позицию СА можно говорить - не надо так)

  2. Требования.

    1. Самый частый задаваемый вопрос для джунов (потому что, ну а что еще спрашивать?) - расскажите про виды требований, которые знаете. Приведите примеры таких требований.

    2. Какие качества требований вы знаете? Приведите пример требования, которое удовлетворяет всем качествам.

    3. Какие методологии сбора требований вы знаете? Какими из них пользовались?

    4. Тут может быть еще любая кастомная задача на сбор требований. Т.е. интервьюер обрисовывает вам какую-то задачу и вам нужно у него собрать требования и их устно зафиксировать. Очень полезная, кстати, вещь для собеседований - тоже помогает хорошо понять то, насколько человек вообще ориентируется в теме, насколько он может применять теорию на практике и насколько хорошо он может формулировать вопросы (это важно даже для СА). Один из примеров, про шкаф, которые лично мне задавали на собеседовании, разбирал недавно в ТГ - ссылка на пост.

    5. Вопрос со звездочкой. Как вы думаете, есть ли прямое влияние методологий разработки на требования? Какое? (Спойлер - есть)

    6. Какими инструментами для фиксирования требований вы пользовались? Какие в принципе существуют? (Тут есть достаточное разнообразие инструментов - от ворда и согласований ТЗ по почте до связки asciidoc + git. Дефолт - это jira\confluence)

    7. Как определить, что задача успешно вышла в прод? (Тут просто на рассуждение. Можно сказать, что признаки успешности - отсутствие инцидентов на проде, положительные фидбеки от пользователей, стабильность работы системы и вот это всё)

    8. Как управлять требованиями? Что делать, если релиз уже распланирован и тут бизнес-заказчик прибегает с горящими глазами и требует внести срочную доработку в текущий релиз. Как бы вы отработали эту ситуацию?

  3. Диаграммы.

    1. Какие нотации вы знаете? (UML\BPMN\IDEF0 и вот это всё)

    2. Какие виды UML-диаграмм вы знаете? Для чего они предназначены? (Тут тонкий момент, что если вас начнут спрашивать, а какие вы знаете типы стрелочек и когда какую применять - имхо это уже эребор и не нужно это знать наизусть. Я, например, не знаю, хотя регулярно это использую и обучаю - всегда можно за 30 секунду загуглить это. Но общую теорию по типам диаграмм надо знать)

    3. Что вы знаете о BPMN, для чего эта нотация нужна? Приходилось ли использовать на практике?

    4. В чем отличия между этими нотациями? Какие у них преимущества?

    5. Могут показать, как вариант, какую-нибудь схему и спросить что на ней нарисовано. Такой подход мне нравится.

  4. UC\US.

    1. Что такое пользовательские истории? Приведите шаблон, по которому они составляются и пару произвольных примеров.

    2. Что такое варианты использования, для чего нужны? Как их оформлять и какие шаблоны вы знаете?

  5. Любые задачи, которые только можно придумать на сбор требования\моделирование каких-либо ситуаций\игра в аналитика-заказчика - насколько хватит фантазии и желания у интервьюера.

Почти на все эти вопросы вы можете найти ответы в этой серии постов.

Эта часть собеседования не требует от вас идеального зазубривания материала и того, чтобы вся теория отскакивала от зубов. Она по большей части вольная и вам главное показать то, что вы понимаете о чем вас спрашивают и можете сформулировать ответ своими словами.

А что еще важнее - если вы чего-то точно не знаете\не помните, то вы можете хотя бы порассуждать об этом (мне кажется, что нет более важного навыка для аналитика). Поэтому старайтесь размышлять над теми вопросами и кейсами которые вам задают, обычно в процессе этого будут задаваться наводящие вопросы и вполне неплохо можно на этом вырулить - это абсолютно точно лучше, чем молчать.

Тем более, что почти на все эти вопросы нет однозначного правильного ответа. По своему опыту могу сказать, что я скорее проголосую за человека, который не всё знает, но очень бодро отвечает, по делу рассуждает (важное уточнение, что именно по делу, а не просто засоряет эфир болтовней), чем за того, кто четко отвечает по любой теории, но теряется, если задать какой-то не стандартный вопрос.

Ну и стоит понимать, что каждый интервьюер за годы практики ведения собеседований выстраивает свою картину этого собеседования, свой список вопросов и задач. И как правило именно на этом, первом этапе собеседования, он составляет оценку вашим софт-скиллам в первую очередь.

В следующей части перейдем к списку вопросов уже по хард-скиллам.

P.S.: По традиции - буду признателен за вопросы про карьеру\профессию\чему угодно связанному со сферой IT - постараюсь ответить на всё.

P.P.S.: Также веду телеграмм-канал, в котором делюсь разным про профессию и про свой путь в ней. Есть и хардовая информация (асинхронные, синхронные интеграции, примеры ТЗ\шаблонов написания микросервисов), так и более софтовая - см. закрепленный дайджест.

Показать полностью
Отличная работа, все прочитано!