C#razy
144 subscribers
253 photos
51 videos
2 files
389 links
Путь в IT, рост, менторство, поддержка, прокачка, мотивация

👨‍💻 Senior .NET dev с 12+ лет опыта
📚 Учусь в MIT по Computer Science
🖥 100+ дней подряд LeetCode
⚒️ Работаю на зарубеж
💻 Веду блог про рост в IT с нуля
🧭 Помогаю понять, куда двигаться
Download Telegram
Friday 13th 😬

This is the address 💻

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1🤣1
404 😱

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Instructions for fire and for end of working day 🐴

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
This media is not supported in your browser
VIEW IN TELEGRAM
Inventions of my mother's friend's son.
TAKE MY MONEY 💵 📞

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
What? 🌚

#crazy

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1😁1
🌳 B-Tree индексы в PostgreSQL

🔎 Индексы в PostgreSql нужны, чтобы ускорять поиск данных. Представь, что без индекса — это как искать нужную страницу в книге, перелистывая каждую. А с индексом — как использовать оглавление или указатель. Индексы позволяют быстро находить строки по значениям, улучшая скорость запросов, особенно в больших таблицах. Однако они занимают место и могут замедлять операции записи, потому что индекс нужно обновлять при изменении данных.

B-Tree (Balanced Tree) — это основной тип индексов в PostgreSQL.

Вот почему они так круты нужны
🚀 Быстрее поиск
B-Tree индексы ускоряют запросы на поиск, сортировку и диапазонные запросы, уменьшая количество данных, которые нужно просмотреть.

🔄 Сбалансированность
Дерево всегда сбалансировано, поэтому глубина дерева минимальная, и доступ к данным происходит быстро независимо от размера таблицы.

💡 Идеально для сравнения
Если ваши запросы часто используют операторы сравнения (>, <, =, и их комбинации), то B-Tree индекс ваш лучший друг.

🛠 Автообновление
Индексы автоматически обновляются при добавлении или изменении данных — не нужно беспокоиться о поддержке актуальности (autovacuum привет)

Отличное свежее видео по B-Tree в PostgreSql: YouTube
Сложность видео: 7 из 10

#sql #postgresql

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
C#razy pinned «🌳 B-Tree индексы в PostgreSQL 🔎 Индексы в PostgreSql нужны, чтобы ускорять поиск данных. Представь, что без индекса — это как искать нужную страницу в книге, перелистывая каждую. А с индексом — как использовать оглавление или указатель. Индексы позволяют…»
Open source: Какие бывают лицензии на ПО и как они работают

📌Однажды я делал ревизую проекта и нужно было просмотреть какие библиотеки используются у нас. Вопрос стал о лицензиях на программный продукт. Давайте разберём самые популярные Open Source лицензий на ПО.

📌Лицензии на программное обеспечение — это как правила пользования продуктом. Они определяют, что можно делать с кодом, а что нельзя.

Свободные лицензии грубо делятся на два вида:
Copyleft и Permissive License

➡️Permissive License
Permissive лицензии, такие как MIT, BSD и Apache дают максимальную свободу разработчикам. Любой может использовать код в любом виде, изменять его, интегрировать в свои проекты и не делиться изменениями. Главное требование — указать оригинального автора. Так же они могут распространяться под любой лицензией, но есть нюансы.

🟦MIT License
Самая простая и популярная лицензия. Вы можете делать с кодом почти всё, что угодно — копировать, модифицировать, даже продавать, но с одним условием: указать оригинального автора. Пример: React.js

🟦Apache License 2.0
Очень похожа на MIT, но с дополнительной защитой от патентных претензий. Если вы используете код под этой лицензией, никто не может вас засудить за использование их патентов. Пример: Apache HTTP Server.

🟦BSD License
Похожа на MIT, но позволяет вам изменять и распространять код, не требуя открывать исходники. Вы можете делать с ним что угодно, даже внедрять в проприетарные продукты. Пример: Git

➡️Copyleft
Концепция, такие как GPL, которая обязывает сохранять свободу программного обеспечения. Любые изменения или дополнения к коду должны быть также доступны всем. Это обеспечивает развитие программного обеспечения в рамках open-source сообщества, сохраняя его открытым и доступным для всех

🟥GPL (General Public License)
Под этой лицензией код полностью открытый, но есть условия. Любые модификации или улучшения, которые вы сделаете, тоже должны быть открыты и распространяться под той же лицензией. Пример: Linux.

©️Заключение
Выбор лицензии зависит от того, насколько вы хотите открытым сделать свой код и какие правила использования других людей вам важны. Разработчики часто выбирают MIT или Apache для свободы использования и распространения, но GPL тоже остаётся популярной среди сторонников Open Source.

#opensource

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Garbage Collector: Что это такое и помогает ли он разработчикам?

📌 По простому Garbage Collector (GC) — это уборщик, который автоматически наводит порядок в вашем доме (программе), чтобы вам не приходилось самому думать о том, когда и как выбросить ненужные вещи (объекты).

📌 Garbage Collector — это механизм автоматического управления памятью в некоторых языках программирования, таких как C#, Python, Go и другие. Его основная задача — освобождать память, которая больше не используется программой, чтобы предотвратить утечки памяти и улучшить производительность.

🙉 Зачем нужен этот ваш GC?
Это всё для упрощения управлением памяти и сделать ПО более безопасными и избежать ошибки. Он освобождает разработчиков от необходимости думать о том, когда и как освобождать объекты, что особенно важно в сложных и многопоточных приложениях. C# и другие современные языки выбирают GC для повышения продуктивности разработчиков и улучшения общей стабильности программ.

Почему GC внедряют в современных языках программирования
▶️ Автоматизация управления памятью
В C# и подобных языках программисты не занимаются ручным управлением памятью, как это нужно в C или C++. Вручную выделять и освобождать память можно, но это сложно и чревато ошибками. GC делает этот процесс автоматическим. GC отслеживает объекты, которые больше не нужны и освобождает память, предотвращая утечки памяти. Помним только новое, а не давно забытое старое 🤓

▶️Предотвращение утечек памяти
Когда объекты больше не используются, но остаются в памяти, это называется утечкой памяти. В ручном управлении памятью разработчику нужно помнить, когда освобождать объекты. GC в C# берет это на себя, минимизируя вероятность утечек.

▶️Циклические ссылки
Если два объекта ссылаются друг на друга, но больше не нужны программе, в ручном управлении памятью их нельзя просто так удалить. GC может найти такие циклические ссылки и освободить их. Это делает код более безопасным и предотвращает зависание ненужных объектов в памяти.

▶️Упрощение разработки и быстрое прототипирование
GC сильно упрощает жизнь программистам, потому что они могут сосредоточиться на логике программы, а не на низкоуровневом управлении памятью.

▶️Повышение безопасности
Языки с GC более "безопасны", не будет таких ошибок как с CrowdStrike. Т.е. не будет объектов, которые больше не существуют, но к ним продолжают обращаться или когда программа пытается дважды освободить одну и ту же область памяти, что может вызвать ошибки или сбои.

▶️Оптимизация использования памяти
GC использует разные алгоритмы для оптимизации управления памятью. Разбитие на поколения, Перемещение или дефрагментация памяти для эффективного использования памяти

Как работает Garbage Collector
➡️ Сбор мусора. Когда программа больше не использует объект, GC идентифицирует его как "мусор". Это происходит, когда на объект больше нет ссылок, то есть он больше не доступен программе или не нужен.
➡️ Освобождение памяти: GC освобождает память, занимаемую этими объектами, возвращая её системе для дальнейшего использования.
➡️ Механизмы отслеживания. Разные реализации GC используют разные алгоритмы для отслеживания неиспользуемых объектов.

Какие плюсы
➡️ Автоматизация управления памятью. Сборка мусора делается сама.
➡️ Упрощение разработки. Меньше необходимости беспокоиться о низкоуровневых деталях управления памятью (С++ привет)
➡️ "Безопасность". Сборка мусора снижает вероятность доступа к уже освобождённой памяти.

А вот и минусы
➡️ Паузы во время выполнения программы. GC должен приостановить выполнение програмы.
➡️ Потеря контроля. Сборка мусора может начаться внезапно.
➡️ Издержки производительности. В языках с GC некоторые ресурсы тратятся на работу самого сборщика мусора.

📝 В Итоге
Помогает GC - безусловно да, GC позволяет сосредоточиться на задачах, не отвлекаясь на ручное управление памятью. Однако в высокопроизводительных или системах реальном времени может потребоваться ручная оптимизация работы с памятью, и тогда GC может быть как и минусом.

#NoAI #GC #s01e01

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Garbage Collector: Marking Phase

В .NET есть управляемая куча, которая используется для динамического управления памятью. В отличие от стека, который "убирает" за собой автоматически после завершения функций, куча нуждается в "уборщике" — Garbage Collector.

📌 GC состоит из нескольких фаз и Marking Phase – по сути первая и одна из самых важных. Именно здесь начинается магия очистки памяти.

*Самая первая часть это приостановка потоков Stop-the-world - приложение приостанавливается, чтобы обеспечить целостность данных на время сборки мусора.

🤔 Что происходит в Marking Phase?
Итак, представьте: у нас есть объекты в памяти, они могут ссылаться друг на друга, создавая такие себе цепочки зависимости. У каждого приложения есть так называемый корневой объект Root с которого начинаются все связи. В Marking Phase, GC обходит все объекты, начиная с этого корня, и помечает те, которые по-прежнему доступны и используются программой.

В Marking Phase если объект не имеет связи с корневым объектом, он становится "невидимкой" для программы и помечается для удаления. В этот момент GC уже готов освободить память, но пока еще не делает этого — это задача следующей фазы.

🙉 Почему это важно?
Marking Phase помогает определить, какие объекты больше не нужны программе и могут быть очищены, освобождая драгоценную память. Без такой "маркировки" программа могла бы накапливать "мусор" (ненужные объекты), что привело бы к утечкам памяти и снижению производительности.

📈 Как это работает на практике?
Когда вы создаёте объекты в коде, GC строит граф зависимостей — набор объектов, связанных друг с другом. Если объект не связан с корнем, он "сирота" и подлежит очистке. Marking Phase использует этот граф для маркировки ненужных объектов.

➡️Пример
Представьте, что у вас есть несколько объектов в приложении: объект A, который ссылается на объект B, а B ссылается на объект C. Все эти объекты связаны цепочкой. Теперь, объект A считается корневым Root, и пока он существует, B и C тоже будут существовать, потому что они связаны через цепочку ссылок. Это как будто вы держите верёвку, которая соединяет все объекты. Но как только объект A больше не нужен (например, вы завершили работу с ним в коде), связь между A и другими объектами теряется. Теперь B и C остаются "сиротами", потому что они больше не связаны с корнем. В этом случае, GC помечает B и C как ненужные объекты, и они подлежат удалению. То есть, как только исчезает последняя связь с корнем, все зависимые объекты становятся кандидатами на удаление. Таким образом, если объект уже не связан с "корнем", его можно безопасно удалить, освободив память.

📝В итоге
Marking Phase — это важнейший процесс, который помогает GC определить, что можно удалить, а что оставить. Это снижает потребление памяти и помогает вашему приложению работать эффективнее и стабильнее.

#NoAI #GC #s01e02

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Friday. When It guys want to fix a bug in production 😎

#humor

💡 Channel | ✏️ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
This media is not supported in your browser
VIEW IN TELEGRAM
Friday. Just a little more and that is it 💪

#humor

💡 Channel | ✏️ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничный созвон

#humor

💡 Channel | ✏️ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Media is too big
VIEW IN TELEGRAM
Это гипнотрюк 😵‍💫

#humor

💡 Channel | ✏️ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Something went wrong 😅

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Garbage Collector: Sweep Phase

После того как сборщик мусора завершает этап Marking Phase (маркировки), на котором определяются живые объекты, наступает фаза Sweep Phase (очистки). В этой фазе GC освобождает память от неиспользуемых объектов, которые не были помечены как "живые." Это критически важный шаг для предотвращения утечек памяти и обеспечения эффективного использования ресурсов.

После Marking Phase всех живых объектов GC освобождает память от неиспользуемых объектов, которые не были помечены как живые.

🤔 Что происходит в Sweep Phase?
Определение неиспользуемых объектов. Сборщик мусора имеет информацию о том, какие объекты доступны, а какие — нет. Он удаляет объекты, которые не были помечены в предыдущем этапе. Но остались объекты которые используются (Чтобы идти дальше для этого нужно сделать остановку и узнать что такое поколения)

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

📌 Что такое поколения и значения их в .NET
Концепция поколений возникла из наблюдений, что большинство объектов имеют короткий срок жизни, то есть вы создали экземпляр класса, вызвали метод класса и больше вам этот обьект не нужен. В .NET объекты делятся на три поколения для оптимизации работы сборщика мусора. Нужно было определится что делать с объектами которые "пережили" первую сборку мусора, была выбрана магическая цифра 3, три поколения. (Было выбрано три это своего рода компромисс между быстродействием, эффективностью и простотой)

Итого, в .NET объекты делятся на три поколения для оптимизации работы сборщика мусора.
Разделение же на поколения помогает улучшить производительность сборки мусора и объекты, которые созданы недавно, с большей вероятностью будут неиспользуемыми и будут находится в первом поколении. (Первое поколение начинается с 0, в действительности корни 0 лежат где то между простой сравнением с 0 и начала индекса массива)

➡️ Generation 0
Это "молодые" объекты, только что созданные. Сборка мусора для этого поколения происходит чаще, поскольку большинство объектов быстро теряет актуальность. Это позволяет эффективно очищать память и минимизировать затраты на управление ресурсами. Сборка мусора для этого поколения происходит чаще всего, и Sweep Phase также выполняется для них чаще. Большинство объектов в этом поколении быстро освобождаются, что выливается в эффективное управление памятью.

➡️ Generation 1
Объекты, которые пережили одну сборку в поколении 0, перемещаются (promoted) в поколение 1. Здесь сборка мусора происходит реже, так как эти объекты считаются более устойчивыми, но всё равно подлежат проверке. Sweep Phase здесь происходит реже и объекты могут оставаться в памяти дольше.

➡️ Generation 2
Это "старые" объекты, которые пережили несколько сборок. Поскольку они имеют больший срок жизни, сборка мусора для этого поколения происходит значительно реже. Тем не менее, периодическая очистка необходима для управления памятью и предотвращения переполнения. Сборка мусора для этого поколения происходит ещё реже, но фаза Sweep Phase необходима для предотвращения переполнения памяти. Объекты из этого поколения нужно обрабатывать более осторожно.

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

🙉 Почему это важно?
Sweep Phase и концепция поколений имеют решающее значение для производительности приложения. Неправильное управление памятью может привести к утечкам и фрагментации, что замедляет работу всего приложения.

📝В итоге
Sweep Phase в сборке мусора C# — это критически важный этап, который помогает поддерживать высокую производительность ваших приложений. Понимание того, как фаза связана с поколениями объектов, позволит вам лучше управлять ресурсами и избегать проблем с памятью.

#NoAI #GC #s01e03

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Garbage Collector: Relocating and Compact Phases

После того как сборщик мусора завершает этап Sweep Phase (очистки), Relocation Phase (перемещение) где GC перемещает оставшиеся активные "живые" объекты в памяти, чтобы организовать их более компактное размещение и устраняю возможные "дыры" между объектами. Дальше наступает Compact Phase (сжатие) и устраняет оставшиеся "дыры" между объектами, чтобы они находились последовательно в памяти.

🤔 Зачем нужна Relocation Phase?
Если бы память была бесконечной, запросы на выделение памяти можно было бы удовлетворять бесконечно тогда Relocation Phase и не нужна бы была, но память была заполнялась не оптимально и это бы влияло на производительность. Но ресурс конечен и вообщем вернёмся в реальность.

В Relocation Phase перемещаются "живые" объекты так, чтобы они находились как можно ближе друг к другу, но могут оставаться промежутки между некоторыми объектами. Например, объекты могут быть сгруппированы в определенной области памяти, но не обязательно последовательно с "дырами". Основная цель это локализация и смена ссылок на объекты и уменьшение фрагментации.

🤔 Зачем нужна Compact Phase?
Relocating Phase всё сгруппировала, сменила адреса и дальше вступает Compact Phase которая копирует объекты ближе к началу пула памяти. Этот процесс удаляет как бы "дыры" между объектами и оптимизирует размещение данных в памяти. По сути основная цель фазы это создать последовательный блок живых объектов, который улучшит переход ссылок и эффективность кэширования. В итоге это даст прирост эффективности использования доступности памяти и уменьшатся время доступа к данным.

🙉 Почему не сделать две фазы сразу?
- Перемещение объектов требует накладных расходов и затрат времени. По сути это компромисс и сначала иногда легче переместить объекты для оптимизации их расположения, хоть как то за то группой, опять же если это необходимо, а дальше произвести дополнительное сжатие.
- Реализовать фазы разными алгоритмами
- Разные сценарии использования

🟥TL;DR
в Relocating Phase и Compact Phase перемещение живых объектов ближе друг к другу предотвращает фрагментацию, что повышает производительность за счёт подряд идущих свободных участков памяти и объектов. Когда объекты располагаются рядом, система лучше использует кэш и снижает время доступа к памяти.


📝В итоге
Sweep Phase очищает, Relocation Phase перемещает объекты, Compact Phase обеспечивает более компактное распределение памяти и сжатие.

Недостатком этих подходов это увеличение продолжительности паузы сборщика мусора, так как необходимо копировать объекты в новое место и обновлять ссылки на такие объекты.

#NoAI #GC #s01e04

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
✍3
Android 15 для разработчиков

Android 15 официально вышел, и для разработчиков он приносит массу интересных изменений по сравнению с Android 14.

📌 ОС стала лучше управлять ресурсами и более эффективное энергопотребление ну и работу в режиме ожидания. Время перехода в спящий режим было уменьшено на 50%.

📌 Ключевых изменений для разработчиков
➡️Как всегда улучшили поддержку складных устройств (всё улучшают и улучшают, надеюсь они туда свернули куда надо) ну и экранов разных размеров.
➡️Что то улучшается в NFC-оплаты в одно касание (хотя это как бы было) и улучшенные API для работы с NFC и камерой.
➡️Не обошлись апдейты в AI, в статьях говорится что всё стало проще и проще из кода использовать встроенные функции с AI (надежда есть что обратная совместимость в порядки у них).
➡️Мультитаск пофикшен, когда несколько приложения работают одновременно, вообщем как будто не надо ломать голову над кастомным лайаутом.
➡️Добавили новые режимы для игр, будет буст до максимума для игр (наверно с какой то эвристикой иначе батарея будет улетать быстро)

🤔 Если вы работали с предыдущей версией Android, можно заметить что Android 15 улучшил работу с системой жестов и добавил поддержку поиска даже для выключенных устройств через сеть.

📎 Ссылки: developer.android.com, source.android.com, habr

#android #news

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Функциональные и нефункциональные требования на примере сайта продажи столов для IT специалистов.

Начнём, что есть разработчик и команда которая работает над сайтом по продаже столов для IT-специалистов. Клиент приходит с интересной задачей: нужно создать идеальный сайт, где ITшники смогут подобрать себе рабочий стол, идеально подходящий под их требования. Конечно, дело не только в дизайне столов, а в том, как сайт будет работать. И тут начинается..

📌 Функциональные требования
Клиент говорит: "Нам нужно, чтобы пользователи могли легко находить столы по параметрам". ОК, понятно — нужен поиск и фильтры. Пользователь должен уметь задать нужный размер, материал и типы регулировки высоты, а также сайт должен сразу показать подходящие варианты.

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

Регистрация пользователей, создание аккаунта, корзина, редактировать количество и оформлять заказ. Оплата? Конечно, интеграция с разными платежными системами — от PayPal/Apple Pay/Эквайринги/Платёжные шлюзы. Так же доставка — пользователь должен легко выбрать метод доставки и получить расчёт стоимости.

📌 Нефункциональные требования
Тут на митинги поднимаются вопросы: "А как насчёт скорости работы сайта?"

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

Дальше клиент спрашивает про безопасность. Мы обсуждаем шифрование данных, защищённые соединения и соответствие стандартам ведь будем обрабатывать платежные данные. Каждый IT-специалист хочет быть уверен, что его данные в безопасности.

И ещё одна важная штука — масштабируемость. "Что если наш сайт взорвётся популярностью?" — говорит клиент. Мы закладываем архитектуру так, чтобы система выдерживала рост пользователей. Добавляем балансировщики нагрузки, настраиваем серверы под пиковые нагрузки, ведь могут быть дни акций или скидок, когда нагрузка резко возрастает.

Конечно, не забываем про доступность сайта — 99.9% аптайма. Айтишникам важна стабильность, и если сайт ляжет, это будет сразу удар по репутации. Ну и юзабилити — интерфейс должен быть простым и интуитивным, ведь целевая аудитория — это люди, которые проводят за компьютерами 24/7 и ценят время.

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

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

#systemdesign

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1👍1
C#razy pinned a photo
Friday 🏃‍♂️

#humor

💡 Channel | ✏ Chat
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣3