#Ruby
🔖 Ruby пожирает память: как управлять ресурсами без миграции на Go
Пока разработчики спорят о скорости языков, Ruby-приложения тихо съедают гигабайты оперативки. Shopify, GitHub, Basecamp решили эту проблему без смены технологического стека.
Секрет — правильное управление памятью, а не переход на другие языки.
📎 Что происходит прямо сейчас:
Shopify — обрабатывает миллионы заказов на Ruby с оптимизированным потреблением памяти. Правильная работа с GC сократила расход ОЗУ в 3 раза.
GitHub — 100M+ пользователей, монорепозиторий на Ruby работает быстрее многих микросервисов. Мемоизация и символы творят чудеса.
Basecamp — монолит на Ruby стабильно работает 20+ лет. DHH доказывает: проблема не в языке, а в подходе к оптимизации.
📎 Как работает память в Ruby:
Object Space + Heap
Все объекты размещаются в куче. При создании нового объекта выделяется память в объектном пространстве.
Mark & Sweep GC
Сборщик мусора помечает используемые объекты, затем очищает неиспользуемые. Два этапа: маркировка → очистка.
Memory Bloat Problems
Раздувание памяти, утечки из-за случайных ссылок, избыточное создание объектов перегружает GC.
📎 Боевые техники оптимизации:
Мемоизация против дублирования
Символы вместо строк
Контроль сборщика мусора
📎 Инструменты профилирования:
• Memory Profiler — точная диагностика расхода памяти
• ObjectSpace — анализ объектов в runtime
• GC.stat — статистика сборщика мусора в реальном времени
• Пулы объектов — переиспользование вместо создания/уничтожения
Ruby не медленный язык — просто разработчики не умеют с ним работать. Правильное управление памятью решает 80% проблем производительности.
📎 Статья
🎙 Новости
📝 База вопросов
Пока разработчики спорят о скорости языков, Ruby-приложения тихо съедают гигабайты оперативки. Shopify, GitHub, Basecamp решили эту проблему без смены технологического стека.
Секрет — правильное управление памятью, а не переход на другие языки.
Shopify — обрабатывает миллионы заказов на Ruby с оптимизированным потреблением памяти. Правильная работа с GC сократила расход ОЗУ в 3 раза.
GitHub — 100M+ пользователей, монорепозиторий на Ruby работает быстрее многих микросервисов. Мемоизация и символы творят чудеса.
Basecamp — монолит на Ruby стабильно работает 20+ лет. DHH доказывает: проблема не в языке, а в подходе к оптимизации.
Object Space + Heap
Все объекты размещаются в куче. При создании нового объекта выделяется память в объектном пространстве.
Mark & Sweep GC
Сборщик мусора помечает используемые объекты, затем очищает неиспользуемые. Два этапа: маркировка → очистка.
Memory Bloat Problems
Раздувание памяти, утечки из-за случайных ссылок, избыточное создание объектов перегружает GC.
Мемоизация против дублирования
def expensive_operation
@result ||= calculate_expensive_operation
end
Символы вместо строк
status = :active # Память экономится
status = "active" # Расточительно
Контроль сборщика мусора
GC.start(full_mark: true, immediate_sweep: true)
puts GC.stat # Мониторинг производительности
• Memory Profiler — точная диагностика расхода памяти
• ObjectSpace — анализ объектов в runtime
• GC.stat — статистика сборщика мусора в реальном времени
• Пулы объектов — переиспользование вместо создания/уничтожения
Ruby не медленный язык — просто разработчики не умеют с ним работать. Правильное управление памятью решает 80% проблем производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
#JavaScript
🔖 JavaScript массивы медленные? Хэш-таблицы решают проблему производительности за O(1)
Пока разработчики перебирают массивы циклами, умные используют хэш-таблицы для мгновенного доступа к данным. Google Maps, Netflix, Instagram строят поиск на хэшировании, а не на линейном переборе.
Время сложности O(n) убивает UX в реальном времени.
📎 Что происходит прямо сейчас:
Google Maps — поиск адресов среди миллиардов записей за миллисекунды. Хэш-таблицы индексируют координаты по ключам локаций.
Netflix — рекомендации для 260M+ пользователей в реальном времени. Хэширование по user_id + content_id дает O(1) доступ к предпочтениям.
Instagram — поиск по хэштегам среди триллионов постов. Hash-функции превращают #travel в точный адрес в памяти.
📎 Проблемы массивов в production:
Linear Search Horror
Insertion Performance
Вставка в массив требует сдвига всех элементов. В хэш-таблице — просто хэширование ключа и запись по адресу.
Memory Overhead
Динамические массивы удваиваются при переполнении. Хэш-таблицы выделяют память точечно по мере необходимости.
📎 Архитектура хэш-таблиц:
Hash Function
Преобразует ключ в индекс массива за константное время.
Collision Resolution
Когда два ключа дают одинаковый хэш — используется chaining (цепочки) или open addressing.
Key-Value Storage
📎 Реальные кейсы оптимизации:
• Database Indexing — хэш-индексы для мгновенного поиска записей
• Caching Systems — Redis использует хэш-структуры для кэширования
• Browser Engines — DOM элементы индексируются по ID через хэширование
• SessionStack — анализ пользовательских сессий с O(1) доступом к данным
Выбор структуры данных определяет масштабируемость продукта. O(n) поиск убивает производительность при росте пользователей.
📎 Статья
🎙 Новости
📝 База вопросов
Пока разработчики перебирают массивы циклами, умные используют хэш-таблицы для мгновенного доступа к данным. Google Maps, Netflix, Instagram строят поиск на хэшировании, а не на линейном переборе.
Время сложности O(n) убивает UX в реальном времени.
Google Maps — поиск адресов среди миллиардов записей за миллисекунды. Хэш-таблицы индексируют координаты по ключам локаций.
Netflix — рекомендации для 260M+ пользователей в реальном времени. Хэширование по user_id + content_id дает O(1) доступ к предпочтениям.
Instagram — поиск по хэштегам среди триллионов постов. Hash-функции превращают #travel в точный адрес в памяти.
Linear Search Horror
// O(n) - перебор всех элементов
users.find(user => user.id === targetId)
// O(1) - прямой доступ по ключу
usersMap[targetId]
Insertion Performance
Вставка в массив требует сдвига всех элементов. В хэш-таблице — просто хэширование ключа и запись по адресу.
Memory Overhead
Динамические массивы удваиваются при переполнении. Хэш-таблицы выделяют память точечно по мере необходимости.
Hash Function
hash = (key.charCodeAt(i) * i) % tableSize
Преобразует ключ в индекс массива за константное время.
Collision Resolution
Когда два ключа дают одинаковый хэш — используется chaining (цепочки) или open addressing.
Key-Value Storage
hashTable["user_123"] = userData // O(1)
const user = hashTable["user_123"] // O(1)
• Database Indexing — хэш-индексы для мгновенного поиска записей
• Caching Systems — Redis использует хэш-структуры для кэширования
• Browser Engines — DOM элементы индексируются по ID через хэширование
• SessionStack — анализ пользовательских сессий с O(1) доступом к данным
Выбор структуры данных определяет масштабируемость продукта. O(n) поиск убивает производительность при росте пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#CSS
🔖 Зернистые градиенты в CSS — тренд, который покорил дизайнеров
Если листали Dribbble или Behance, наверняка видели эти крутые текстурные градиенты с зернистостью. Дизайнеры их обожают — они добавляют реализма и глубины любому интерфейсу. Раньше такое делали только в Фотошопе, но теперь можно прямо в CSS!
Секрет техники: комбинируем SVG-фильтры с CSS-градиентами. SVG создает шум Перлина, CSS накладывает его на градиент, а фильтры яркости превращают всё это в магию.
Пошаговый код:
1️⃣ SVG-фильтр для шума:
2️⃣ Накладываем на градиент:
3️⃣ Смешиваем цвета (опционально):
Где использовать:
• Hero-секции с вау-эффектом
• Карточки товаров и услуг
• Стильные кнопки и тени
• Фоны для креативных проектов
• Голографические эффекты
Техника работает во всех современных браузерах. Особенно круто выглядит на ретина-дисплеях — зерно получается естественным и живым, как настоящая текстура.
Лайфхак: меняйте
📎 Статья
🎙 Новости
📝 База вопросов
Если листали Dribbble или Behance, наверняка видели эти крутые текстурные градиенты с зернистостью. Дизайнеры их обожают — они добавляют реализма и глубины любому интерфейсу. Раньше такое делали только в Фотошопе, но теперь можно прямо в CSS!
Секрет техники: комбинируем SVG-фильтры с CSS-градиентами. SVG создает шум Перлина, CSS накладывает его на градиент, а фильтры яркости превращают всё это в магию.
Пошаговый код:
<svg xmlns='http://www.w3.org/2000/svg'>
<filter id='noise'>
<feTurbulence type='fractalNoise'
baseFrequency='0.65'
numOctaves='3'/>
</filter>
<rect width='100%' height='100%'
filter='url(#noise)'/>
</svg>
.grainy-gradient {
background:
linear-gradient(45deg, #ff6b6b, transparent),
url('noise.svg');
filter: contrast(170%) brightness(1000%);
}.overlay {
background: #4ecdc4;
mix-blend-mode: multiply;
}Где использовать:
• Hero-секции с вау-эффектом
• Карточки товаров и услуг
• Стильные кнопки и тени
• Фоны для креативных проектов
• Голографические эффекты
Техника работает во всех современных браузерах. Особенно круто выглядит на ретина-дисплеях — зерно получается естественным и живым, как настоящая текстура.
Лайфхак: меняйте
baseFrequency от 0.1 до 1 для разной грубости зерна, экспериментируйте с цветами градиента и значениями контрастности. Каждая комбинация даёт уникальный результат!Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
#IOS
🔖 6 принципов качественных iOS-модулей
Создание библиотек и модулей для iOS — это искусство баланса между функциональностью и простотой. Хорошо спроектированный модуль может сэкономить коллегам недели работы, а плохой — стать источником головной боли на годы.
Вот шесть ключевых принципов, которые помогут вам создавать модули, за которые коллеги будут благодарить, а не проклинать.
1️⃣ Ограничьте поверхность API
Принцип: Делайте публичный интерфейс как можно меньше.
Каждый публичный метод, свойство или тип — это обещание, которое вы даете пользователям. Чем больше обещаний, тем сложнее их выполнять и изменять в будущем.
Почему это важно:
- Удалить функцию = breaking change
- Добавить функцию = безопасное изменение
- Меньше кода = меньше багов = меньше поддержки
Следствие: Предоставьте только один способ выполнения операции. Никаких дублирующих методов "для удобства".
2️⃣ Отдавайте должное семантическому версионированию
Принцип: Используйте формат
- Patch (1.0.1): Исправления багов, внутренние изменения
- Minor (1.1.0): Новые функции без breaking changes
- Major (2.0.0): Breaking changes, изменения API
Золотое правило: Пользователи должны обновляться на patch и minor версии без изменений в своем коде.
Не забывайте про changelog и migration guides для major версий!
3️⃣ Предоставляйте информативные сообщения об ошибках
Принцип: Никогда не возвращайте
Следствие: Никаких
4️⃣ Всегда уважайте клиентское приложение
Принцип: Не переопределяйте делегаты и настройки приложения.
Если вашему модулю нужен доступ к
5️⃣ Всегда проверяйте входные данные
Принцип: Создавайте строго типизированные входные параметры вместо примитивов.
Преимущества:
- Валидация выполняется один раз в начале
- Невозможно перепутать параметры местами
- Компилятор помогает отловить ошибки
6️⃣ Пишите четкую и краткую документацию
Принцип: Документируйте не только "что", но и "почему", "когда" и "как".
Хорошая документация включает:
- Назначение метода
- Описание параметров
- Возвращаемые значения
- Возможные ошибки и их причины
- Сложность алгоритма (если важна)
- Примеры использования
📎 Статья
🎙 Новости
📝 База вопросов
Создание библиотек и модулей для iOS — это искусство баланса между функциональностью и простотой. Хорошо спроектированный модуль может сэкономить коллегам недели работы, а плохой — стать источником головной боли на годы.
Вот шесть ключевых принципов, которые помогут вам создавать модули, за которые коллеги будут благодарить, а не проклинать.
Принцип: Делайте публичный интерфейс как можно меньше.
Каждый публичный метод, свойство или тип — это обещание, которое вы даете пользователям. Чем больше обещаний, тем сложнее их выполнять и изменять в будущем.
Почему это важно:
- Удалить функцию = breaking change
- Добавить функцию = безопасное изменение
- Меньше кода = меньше багов = меньше поддержки
Следствие: Предоставьте только один способ выполнения операции. Никаких дублирующих методов "для удобства".
Принцип: Используйте формат
Major.Minor.Patch осмысленно.- Patch (1.0.1): Исправления багов, внутренние изменения
- Minor (1.1.0): Новые функции без breaking changes
- Major (2.0.0): Breaking changes, изменения API
Золотое правило: Пользователи должны обновляться на patch и minor версии без изменений в своем коде.
Не забывайте про changelog и migration guides для major версий!
Принцип: Никогда не возвращайте
nil без объяснения причины.// ❌ ПЛОХО
init?(value: Int) {
guard isPrime(value) else { return nil }
self.value = value
}
// ✅ ХОРОШО
init(value: Int) throws {
guard isPrime(value) else {
throw Error.notPrime
}
self.value = value
}
Следствие: Никаких
fatalError и принудительных крашей. Ваша библиотека не должна "ронять" чужое приложение.Принцип: Не переопределяйте делегаты и настройки приложения.
Если вашему модулю нужен доступ к
NavigationController или другим компонентам приложения, создавайте wrapper-делегаты:class SDKNavigationDelegate: UINavigationControllerDelegate {
private weak var appDelegate: UINavigationControllerDelegate?
init(navigationController: UINavigationController) {
self.appDelegate = navigationController.delegate // Сохраняем оригинал
navigationController.delegate = self
}
func unload() {
navigationController?.delegate = appDelegate // Возвращаем обратно
}
}Принцип: Создавайте строго типизированные входные параметры вместо примитивов.
// ❌ Вместо String
func processPayment(cardNumber: String)
// ✅ Используйте типизированные обертки
struct CreditCardNumber {
let number: String
init(number: String) throws {
guard !number.isEmpty else { throw Error.empty }
guard number.count == 16 else { throw Error.wrongLength }
guard number.allSatisfy(\.isNumber) else { throw Error.invalidCharacters }
self.number = number
}
}
Преимущества:
- Валидация выполняется один раз в начале
- Невозможно перепутать параметры местами
- Компилятор помогает отловить ошибки
Принцип: Документируйте не только "что", но и "почему", "когда" и "как".
Хорошая документация включает:
- Назначение метода
- Описание параметров
- Возвращаемые значения
- Возможные ошибки и их причины
- Сложность алгоритма (если важна)
- Примеры использования
Please open Telegram to view this post
VIEW IN TELEGRAM
#Spring
🔖 Тайна игнорируемых Spring-аннотаций
Удивительно, как работают аннотации Spring вроде
Проблема кэширования
При создании службы уведомлений по email мы решили кэшировать дорогостоящую генерацию шаблонов с помощью
Секрет прокси
Изучив документацию Spring, мы узнали главное: функционал аннотаций поддерживается через прокси — специальные объекты-обертки, перехватывающие вызовы методов. Но есть важный нюанс: прокси не перехватывают внутренние вызовы.
Когда метод с
Решение через разделение
Проблема решается просто — вынесением кэшируемого метода в отдельную службу. Теперь вызов проходит через прокси, и кэширование работает как ожидалось.
Два типа прокси
В Spring используются два вида прокси:
Динамические прокси JDK реализуют тот же интерфейс и делегируют вызовы. Применяются по умолчанию для классов с интерфейсами.
Прокси CGLIB создают подкласс целевого класса и переопределяют методы. Используются для конкретных классов без интерфейсов.
Выбором прокси можно управлять через конфигурацию, но обычно стандартного поведения достаточно.
Понимание механизма прокси Spring сэкономит часы отладки при работе с транзакциями, кэшированием и асинхронными операциями.
📎 Статья
🎙 Новости
📝 База вопросов
Удивительно, как работают аннотации Spring вроде
@Transactional, @Cacheable, @Async. Но что происходит, когда они внезапно «отказываются» работать?Проблема кэширования
При создании службы уведомлений по email мы решили кэшировать дорогостоящую генерацию шаблонов с помощью
@Cacheable. Но в тестах обнаружилось: кэширование не работает! Метод выполнялся заново при каждом вызове, словно аннотация невидима для Spring.Секрет прокси
Изучив документацию Spring, мы узнали главное: функционал аннотаций поддерживается через прокси — специальные объекты-обертки, перехватывающие вызовы методов. Но есть важный нюанс: прокси не перехватывают внутренние вызовы.
Когда метод с
@Cacheable вызывается напрямую из другого метода того же класса, он выполняется в обход прокси. Отсюда и проблема с кэшированием.Решение через разделение
Проблема решается просто — вынесением кэшируемого метода в отдельную службу. Теперь вызов проходит через прокси, и кэширование работает как ожидалось.
Два типа прокси
В Spring используются два вида прокси:
Динамические прокси JDK реализуют тот же интерфейс и делегируют вызовы. Применяются по умолчанию для классов с интерфейсами.
Прокси CGLIB создают подкласс целевого класса и переопределяют методы. Используются для конкретных классов без интерфейсов.
Выбором прокси можно управлять через конфигурацию, но обычно стандартного поведения достаточно.
Главное — помнить: Spring-аннотации работают только через прокси. Избегайте внутренних вызовов, выносите функционал в отдельные компоненты, используйте только публичные методы.
Понимание механизма прокси Spring сэкономит часы отладки при работе с транзакциями, кэшированием и асинхронными операциями.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В мире технологий каждый день появляются новые инструменты разработки с открытым исходным кодом. Они популярны благодаря гибкости, производительности и поддержке сообщества.
AutoMQ — альтернатива Apache Kafka с 10-кратной экономией затрат через S3 и автомасштабирование. 100% совместим с Kafka. *3k+ звезд*
PR-Agent — ИИ-инструмент для автоматического code review. Используйте
@CodiumAI-Agent в PR-комментариях. *5k звезд*Hyperswitch — глобальный платежный коммутатор для Stripe, PayPal, Adyen и других систем через единую платформу. *11k+ звезд*
Logto — современное IAM-решение с социальным входом и аутентификацией без пароля. *8k звезд*
Passbolt — менеджер паролей для команд со сквозным шифрованием. *4.5k+ звезд*
PostHog — аналитика продуктов с отслеживанием пользователей и флагами функций. *20k звезд*
Aptabase — альтернатива Firebase Analytics, ориентированная на приватность. *800+ звезд*
Supabase — альтернатива Firebase с PostgreSQL, аутентификацией и хранилищем. *70k+ звезд*
Appwrite — BaaS-платформа с базой данных, auth и бессерверными функциями. *5k звезд*
Penpot — платформа для UI/UX дизайна с коллаборацией в реальном времени. *29k звезд*
Hoppscotch — экосистема для тестирования API и создания документации. *63k+ звезд*
Temporal — платформа оркестрации микросервисов с управлением состоянием. *10.9k+ звезд*
Traefik — обратный прокси и балансировщик с автоконфигурацией для Docker/Kubernetes. *49.5k звезд*
OpenFaaS — бессерверная платформа для функций в любой инфраструктуре. *24.8k+ звезд*
Rocket.Chat — платформа командного общения с видеоконференциями. *39.7k звезд*
Focalboard — альтернатива Trello/Notion с досками и карточками. *21k+ звезд*
Cachet — система страниц статуса для информирования о простоях. *13.9k+ звезд*
Dendron — инструмент заметок для разработчиков с интеграцией в VS Code. *6.6k+ звезд*
Litlyx — ИИ-инструмент для создания интерактивных визуализаций, поддерживает 15+ платформ.
Эти инструменты покрывают основные потребности разработки — от управления данными до коллаборации, предлагая качественные альтернативы коммерческим решениям.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3
#GitHub
🔖 3 способа ускорить code review на GitHub
GitHub скрывает возможности, которые экономят часы при просмотре pull request'ов. Большинство разработчиков их не использует, теряя время на рутине.
📎 Split View для больших изменений
По умолчанию GitHub показывает diff в одной колонке - неудобно для крупных правок.
Решение: нажмите шестеренку → "Split". Старый и новый код отображаются рядом, как в IDE. Идеально для рефакторинга и переименований.
📎 Фильтр "Changes since last review"
После исправлений автора GitHub показывает все изменения, включая уже просмотренные. Информационный шум.
Решение: в меню "Files changed" выберите "Changes since last review". Видны только свежие правки с желтыми маркерами на измененных файлах.
📎 Suggested Changes вместо текстовых комментариев
Вместо "добавь проверку на null" предлагайте готовый код.
Как использовать:
• Наведите курсор на строку → синий плюс
• В комментарии нажмите иконку файла
• Отредактируйте код между ```suggestion
• Автор применит одним кликом "Commit suggestion"
Эффективно для опечаток, мелких оптимизаций и недостающих проверок.
📎 Результат
Split view ускоряет анализ, фильтр экономит время на повторных проверках, suggested changes устраняют лишние коммиты. GitHub превращается из хранилища в инструмент качественного ревью.
📎 Статья
🎙 Новости
📝 База вопросов
GitHub скрывает возможности, которые экономят часы при просмотре pull request'ов. Большинство разработчиков их не использует, теряя время на рутине.
По умолчанию GitHub показывает diff в одной колонке - неудобно для крупных правок.
Решение: нажмите шестеренку → "Split". Старый и новый код отображаются рядом, как в IDE. Идеально для рефакторинга и переименований.
После исправлений автора GitHub показывает все изменения, включая уже просмотренные. Информационный шум.
Решение: в меню "Files changed" выберите "Changes since last review". Видны только свежие правки с желтыми маркерами на измененных файлах.
Вместо "добавь проверку на null" предлагайте готовый код.
Как использовать:
• Наведите курсор на строку → синий плюс
• В комментарии нажмите иконку файла
• Отредактируйте код между ```suggestion
• Автор применит одним кликом "Commit suggestion"
Эффективно для опечаток, мелких оптимизаций и недостающих проверок.
Split view ускоряет анализ, фильтр экономит время на повторных проверках, suggested changes устраняют лишние коммиты. GitHub превращается из хранилища в инструмент качественного ревью.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤1👍1
#Rust
🔖 Rust: Первые впечатления
Что привело к Rust?
• Неудача с поиском Go-библиотеки для медицинских снимков
• Проблемы с GC в высоконагруженных системах
• Желание изучить что-то новое
📎 Особенности языка:
Производительность — скорость C без сборщика мусора
Безопасность — система владения предотвращает 70-80% багов
Современность — выразительный синтаксис + функциональные возможности
Универсальность — 84 целевые платформы (от встроенных систем до WebAssembly)
Сильные стороны:
✅ Максимальная производительность
✅ Встроенная безопасность памяти
✅ Отличная документация
✅ Мощная система пакетов Cargo
Слабые стороны:
❌ Длинная кривая обучения
❌ Сложность чтения кода
❌ Медленная компиляция
❌ Требует глубоких знаний архитектуры
Вывод:
Rust не заменит Go, но отлично дополняет его. Go — для быстрых проектов с частыми изменениями. Rust — для критичных систем, где важна каждая наносекунда.
📎 Статья
🎙 Новости
📝 База вопросов
Что привело к Rust?
• Неудача с поиском Go-библиотеки для медицинских снимков
• Проблемы с GC в высоконагруженных системах
• Желание изучить что-то новое
Производительность — скорость C без сборщика мусора
Безопасность — система владения предотвращает 70-80% багов
Современность — выразительный синтаксис + функциональные возможности
Универсальность — 84 целевые платформы (от встроенных систем до WebAssembly)
Сильные стороны:
Слабые стороны:
Вывод:
Rust не заменит Go, но отлично дополняет его. Go — для быстрых проектов с частыми изменениями. Rust — для критичных систем, где важна каждая наносекунда.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#Probability
🔖 Находка дня: как "увидеть" теорию вероятности
Знаете, что самое сложное в изучении теории вероятности? Представить, как работают все эти формулы и теоремы в реальности.
Держите невероятный ресурс — Seeing Theory от Университета Брауна. Это интерактивный учебник, где можно буквально "поиграть" с теорией вероятности:
✨ Подбрасываете монетку и наблюдаете, как формируется нормальное распределение
✨ Двигаете ползунки и видите, как меняется корреляция между переменными
✨ Экспериментируете с центральной предельной теоремой в реальном времени
Вместо скучных формул — живые графики. Вместо абстрактных концепций — наглядные эксперименты.
Идеально для всех, кто хочет понять теорию вероятности интуитивно, а не просто заучить формулы⬇️
📎 Сайт
🎙 Новости
📝 База вопросов
Знаете, что самое сложное в изучении теории вероятности? Представить, как работают все эти формулы и теоремы в реальности.
Держите невероятный ресурс — Seeing Theory от Университета Брауна. Это интерактивный учебник, где можно буквально "поиграть" с теорией вероятности:
Вместо скучных формул — живые графики. Вместо абстрактных концепций — наглядные эксперименты.
Идеально для всех, кто хочет понять теорию вероятности интуитивно, а не просто заучить формулы
Please open Telegram to view this post
VIEW IN TELEGRAM
seeing-theory.brown.edu
Seeing Theory
A visual introduction to probability and statistics.
❤2👍1
#Game
🔖 Теория игр: как математика объясняет наши решения
Теория игр — область математики, изучающая принятие решений среди соревнующихся игроков. Создана в 1940-х годах математиком Джоном фон Нейманом и экономистом Оскаром Моргенштерном. Применяется в психологии, биологии, политике, экономике и бизнесе.
Основные элементы:
• Игрок — лицо, принимающее решения
• Стратегия — правила конкретной игры
• Исход — результат решения
• Равновесие — точка, когда игроки приняли решения
🔸 Некооперативная теория игр
Классический пример — дилемма заключенного. Двое арестованных в разных камерах выбирают: обвинить партнера или сознаться.
Возможные исходы:
• Оба обвиняют друг друга — по 2 года каждому
• Один обвиняет, другой сознается — 0 лет и 3 года
• Оба сознаются — по 1 году каждому
Рациональный выбор — обвинить партнера, независимо от его действий. Это доминирующая стратегия и равновесие Нэша. Парадокс: взаимное признание выгоднее, но нерационально с точки зрения личной выгоды.
🔸 Кооперативная теория игр
Игроки работают вместе над общей целью, формируя коалицию. Задача — определить справедливое распределение вклада и вознаграждения через вектор Шепли.
Принципы распределения:
• Маржевой вклад каждого игрока
• Равная ценность взаимозаменяемых игроков
• Нулевая ценность фиктивного игрока
• Пропорциональное распределение по частям
Пример: Вы производите 10 напитков в час, друг — 20. Вместе — 40. Ваш маржевой вклад: 40-20=20, друга: 40-10=30. По вектору Шепли: вам (10+20)/2=15 рублей, другу (20+30)/2=25 рублей.
Вывод: В индивидуальной конкуренции нужна смекалка для личной выгоды, в групповой работе приоритет — честность.
📎 Статья
🎙 Новости
📝 База вопросов
Теория игр — область математики, изучающая принятие решений среди соревнующихся игроков. Создана в 1940-х годах математиком Джоном фон Нейманом и экономистом Оскаром Моргенштерном. Применяется в психологии, биологии, политике, экономике и бизнесе.
Основные элементы:
• Игрок — лицо, принимающее решения
• Стратегия — правила конкретной игры
• Исход — результат решения
• Равновесие — точка, когда игроки приняли решения
Классический пример — дилемма заключенного. Двое арестованных в разных камерах выбирают: обвинить партнера или сознаться.
Возможные исходы:
• Оба обвиняют друг друга — по 2 года каждому
• Один обвиняет, другой сознается — 0 лет и 3 года
• Оба сознаются — по 1 году каждому
Рациональный выбор — обвинить партнера, независимо от его действий. Это доминирующая стратегия и равновесие Нэша. Парадокс: взаимное признание выгоднее, но нерационально с точки зрения личной выгоды.
Игроки работают вместе над общей целью, формируя коалицию. Задача — определить справедливое распределение вклада и вознаграждения через вектор Шепли.
Принципы распределения:
• Маржевой вклад каждого игрока
• Равная ценность взаимозаменяемых игроков
• Нулевая ценность фиктивного игрока
• Пропорциональное распределение по частям
Пример: Вы производите 10 напитков в час, друг — 20. Вместе — 40. Ваш маржевой вклад: 40-20=20, друга: 40-10=30. По вектору Шепли: вам (10+20)/2=15 рублей, другу (20+30)/2=25 рублей.
Вывод: В индивидуальной конкуренции нужна смекалка для личной выгоды, в групповой работе приоритет — честность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#Java #YDB
🔖 Почему Java-разработчики не хотят изучать новые базы данных?
Потому что каждая новая СУБД — это месяцы изучения специфичных API, отказ от привычных инструментов и переписывание существующего кода.
А что если новая база данных будет работать с вашими текущими инструментами? Hibernate, Spring Data, jOOQ, Liquibase — все то, что вы уже знаете и любите.
За 2024 год команда YDB проделала путь от базового нативного клиента до полной интеграции с Java-экосистемой. Теперь переход на распределенную СУБД не требует изучения новых технологий — только замена строки подключения.
Что вы получаете:
• Ваш существующий Hibernate-код работает без изменений
• DataGrip и DBeaver подключаются как к обычной БД
• Liquibase/Flyway мигрируют схемы штатными средствами
• jOOQ генерирует типобезопасный код из YQL-схем
Это история о том, как сделать мощную технологию доступной разработчикам, не заставляя их начинать с нуля⬇️
📎 Статья
🎙 Новости
📝 База вопросов
Потому что каждая новая СУБД — это месяцы изучения специфичных API, отказ от привычных инструментов и переписывание существующего кода.
А что если новая база данных будет работать с вашими текущими инструментами? Hibernate, Spring Data, jOOQ, Liquibase — все то, что вы уже знаете и любите.
За 2024 год команда YDB проделала путь от базового нативного клиента до полной интеграции с Java-экосистемой. Теперь переход на распределенную СУБД не требует изучения новых технологий — только замена строки подключения.
Что вы получаете:
• Ваш существующий Hibernate-код работает без изменений
• DataGrip и DBeaver подключаются как к обычной БД
• Liquibase/Flyway мигрируют схемы штатными средствами
• jOOQ генерирует типобезопасный код из YQL-схем
Это история о том, как сделать мощную технологию доступной разработчикам, не заставляя их начинать с нуля
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#Go
Почему SOLID принципы — это ваш спасательный круг в мире Go разработки?
Представьте: вы пишете платежную систему, а через месяц нужно добавить новый способ оплаты. В плохо спроектированном коде вас ждут часы переписывания и риск сломать существующий функционал. С SOLID принципами — просто добавляете новый тип, и всё работает!
5 принципов, которые изменят ваш код:
1️⃣ Single Responsibility (Единственная ответственность)
Один класс — одна задача. Вместо Invoice, который считает, печатает И сохраняет в БД, делаем отдельные InvoicePrinter и InvoiceRepository.
2️⃣ Open/Closed (Открытость/Закрытость)
Код открыт для расширения, закрыт для изменения. Новый способ оплаты? Просто добавляем новый тип, реализующий Payment интерфейс!
3️⃣ Liskov Substitution (Подстановка Лисков)
Любой подтип должен заменять базовый тип без поломки логики. ValidatedPayment работает везде, где ожидается Payment.
4️⃣ Interface Segregation (Разделение интерфейса)
Много маленьких интерфейсов лучше одного большого. PaymentProcessor, Refundable, Reportable — каждый класс реализует только нужное.
5️⃣ Dependency Inversion (Инверсия зависимостей)
Зависьте от абстракций, а не от конкретики. PaymentService работает с интерфейсом PaymentProcessor, а не конкретным процессором.
💡 Результат: чистый, тестируемый, расширяемый код, который легко поддерживать и развивать.
SOLID — это не просто теория, это практические инструменты для создания качественного ПО на Go! 🚀
📎 Статья
🎙 Новости
📝 База вопросов
Почему SOLID принципы — это ваш спасательный круг в мире Go разработки?
Представьте: вы пишете платежную систему, а через месяц нужно добавить новый способ оплаты. В плохо спроектированном коде вас ждут часы переписывания и риск сломать существующий функционал. С SOLID принципами — просто добавляете новый тип, и всё работает!
5 принципов, которые изменят ваш код:
Один класс — одна задача. Вместо Invoice, который считает, печатает И сохраняет в БД, делаем отдельные InvoicePrinter и InvoiceRepository.
Код открыт для расширения, закрыт для изменения. Новый способ оплаты? Просто добавляем новый тип, реализующий Payment интерфейс!
type Payment interface {
Process() string
}Любой подтип должен заменять базовый тип без поломки логики. ValidatedPayment работает везде, где ожидается Payment.
Много маленьких интерфейсов лучше одного большого. PaymentProcessor, Refundable, Reportable — каждый класс реализует только нужное.
Зависьте от абстракций, а не от конкретики. PaymentService работает с интерфейсом PaymentProcessor, а не конкретным процессором.
SOLID — это не просто теория, это практические инструменты для создания качественного ПО на Go! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
#Terminal
🔖 10 команд терминала для продвинутых
🔸
🔸
🔸
🔸
🔸 Работа с файлами:
🔸 Навигация по строке:
-
-
-
Какие команды используете вы? 🤔
🎙 Новости
📝 База вопросов
cd - — возврат в предыдущую папку!! — повторить последнюю команду ctrl + R — поиск по истории команд^опечатка^правильно — быстрое исправление$ gti status
> Command 'gti' not found
$ ^gti^git
> git status
# Переместить несколько файлов сразу
$ mv file{1..5}.png backup/
$ mv hello.{js,html} static/
-
ctrl + A — в начало-
ctrl + E — в конец -
ctrl + W — удалить словоКакие команды используете вы? 🤔
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
#Angular
🔖 RxJS + Angular Signals: Идеальная команда для современных приложений
Долгое время RxJS был главным инструментом реактивности в Angular, но с появлением Signals всё изменилось. Теперь у нас есть мощная синергия, которая решает старые проблемы!
🔸 Главное правило: Никаких Observable в шаблонах!
До свиданья,
🔸 Зачем это нужно?
Signals идеальны для управления состоянием — они всегда знают своё текущее значение и отлично интегрируются с системой обнаружения изменений Angular.
RxJS остается незаменимым для событийно-управляемой логики — обработки кликов, навигации, API браузера.
🔸 Крутые возможности:
- Привязка к хост-элементу:
- Реактивные входы:
- Простые выходы:
Теперь мы получили лучшее из двух миров: стабильность сигналов + мощь RxJS операторов!
📎 Статья
🎙 Новости
📝 База вопросов
Долгое время RxJS был главным инструментом реактивности в Angular, но с появлением Signals всё изменилось. Теперь у нас есть мощная синергия, которая решает старые проблемы!
До свиданья,
async pipe! Теперь мы используем toSignal() для преобразования потоков в сигналы:readonly copied = toSignal(
fromEvent(button, 'click').pipe(
exhaustMap(() =>
timer(2000).pipe(
map(() => false),
startWith(true)
)
)
),
{ initialValue: false }
);
Signals идеальны для управления состоянием — они всегда знают своё текущее значение и отлично интегрируются с системой обнаружения изменений Angular.
RxJS остается незаменимым для событийно-управляемой логики — обработки кликов, навигации, API браузера.
- Привязка к хост-элементу:
'[class.active]': 'isActive()'- Реактивные входы:
toObservable(this.duration)- Простые выходы:
outputFromObservable(stream$)Теперь мы получили лучшее из двух миров: стабильность сигналов + мощь RxJS операторов!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#binarysearch
🔖 Бинарный поиск: как найти иголку в стоге сена за 3 шага
Представьте: вы ищете номер телефона в огромном справочнике на 1000 страниц. Будете листать с первой страницы?
Есть способ лучше! Откройте справочник посередине. Если нужная буква идет после той, что видите — выбросьте левую половину. Если раньше — правую. Повторите с оставшейся частью.
Поздравляю, вы только что изучили бинарный поиск!
🔸 Как это работает?
Ищем число 89 в отсортированном массиве:
Шаг 1: Средний элемент = 56. 56 < 89 → отбрасываем левую половину
Шаг 2: Средний элемент = 97. 97 > 89 → отбрасываем правую половину
Шаг 3: Средний элемент = 89. Найдено!✅
🔸 Эффективность впечатляет:
- Линейный поиск: до 1000 шагов для 1000 элементов
- Бинарный поиск: максимум 10 шагов!
Секрет в том, что каждый шаг вдвое сокращает область поиска.
🔸 Важное условие:
Массив обязательно должен быть отсортирован! Иначе алгоритм не работает.
🔸 Где применяется:
📎 Статья
🎙 Новости
📝 База вопросов
Представьте: вы ищете номер телефона в огромном справочнике на 1000 страниц. Будете листать с первой страницы?
Есть способ лучше! Откройте справочник посередине. Если нужная буква идет после той, что видите — выбросьте левую половину. Если раньше — правую. Повторите с оставшейся частью.
Поздравляю, вы только что изучили бинарный поиск!
Ищем число 89 в отсортированном массиве:
[12, 25, 38, 47, 56, 89, 97, 108, 234]
Шаг 1: Средний элемент = 56. 56 < 89 → отбрасываем левую половину
Шаг 2: Средний элемент = 97. 97 > 89 → отбрасываем правую половину
Шаг 3: Средний элемент = 89. Найдено!
- Линейный поиск: до 1000 шагов для 1000 элементов
- Бинарный поиск: максимум 10 шагов!
Секрет в том, что каждый шаг вдвое сокращает область поиска.
Массив обязательно должен быть отсортирован! Иначе алгоритм не работает.
- Поиск в базах данных
- Автодополнение в поисковиках
- Системы рекомендаций
- Игры (угадайте число!)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#C++
🔖 C++ вложенные If-Else: от хаоса к порядку
Знакомая картина? Код превратился в лестницу из условий, и вы уже потерялись на третьем уровне вложенности?
❌ Антипаттерн "Стрелка"
Это классический код-спагетти! Каждый новый уровень делает код менее читаемым и более подверженным ошибкам.
✅ Решения:
1. Ранний return:
2. Разбивка на функции:
3. Switch вместо if-else цепочек:
Практические применения:
- Валидация данных - проверка форм по шагам
- Игровая логика - разветвленные сценарии
- Обработка ошибок - каскадные проверки
Золотое правило:
Если вложенность больше 3-х уровней — пора рефакторить! Ваш код должен читаться как книга, а не как ребус.
📎 Статья
🎙 Новости
📝 База вопросов
Знакомая картина? Код превратился в лестницу из условий, и вы уже потерялись на третьем уровне вложенности?
if (user.isActive()) {
if (user.hasPermission()) {
if (data.isValid()) {
if (connection.isAlive()) {
// Наконец-то делаем что-то полезное!
}
}
}
}Это классический код-спагетти! Каждый новый уровень делает код менее читаемым и более подверженным ошибкам.
1. Ранний return:
if (!user.isActive()) return false;
if (!user.hasPermission()) return false;
if (!data.isValid()) return false;
// Чистый код без вложенности!
2. Разбивка на функции:
bool validateUser(const User& user) {
return user.isActive() && user.hasPermission();
}
bool processRequest() {
if (!validateUser(user)) return false;
// Логика стала понятнее!
}3. Switch вместо if-else цепочек:
switch (userRole) {
case ADMIN: return processAdminRequest();
case USER: return processUserRequest();
default: return handleUnknownRole();
}Практические применения:
- Валидация данных - проверка форм по шагам
- Игровая логика - разветвленные сценарии
- Обработка ошибок - каскадные проверки
Золотое правило:
Если вложенность больше 3-х уровней — пора рефакторить! Ваш код должен читаться как книга, а не как ребус.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
#Linux
🔖 Linux Mint 22.2: стабильность без экспериментов
Вышел новый релиз любимого многими дистрибутива! И знаете что? Никаких радикальных изменений интерфейса — только стабильность и комфорт.
✔️ Что нового:
▫️ Биометрия стала проще
Новое приложение Fingwit — сканируй отпечаток и входи без пароля! Работает для входа в систему, разблокировки экрана и sudo-команд.
▫️ Свежий дизайн
- Темы с легкой синевой вместо серого
- Эффект размытия на экране входа
- Акцентные цвета автоматически подстраиваются под тему
▫️ Улучшенные приложения
- Sticky (заметки) теперь работает на Wayland
- Hypnotix (IPTV) получил "театральный" режим просмотра
- Warpinator теперь доступен на iOS
📎 Под капотом:
- Ядро 6.14 — поддержка Wi-Fi 7, новых процессоров и GPU
- LTS до 2029 года — установил и забыл на 4 года!
- Но для старых ПК лучше оставить ядро 6.8
Философия Mint:
Пока GNOME экспериментирует с минимализмом, Mint остается классическим:
- Привычная панель задач
- Понятное меню
- Никаких сюрпризов в интерфейсе
📎 Статья
🎙 Новости
📝 База вопросов
Вышел новый релиз любимого многими дистрибутива! И знаете что? Никаких радикальных изменений интерфейса — только стабильность и комфорт.
Новое приложение Fingwit — сканируй отпечаток и входи без пароля! Работает для входа в систему, разблокировки экрана и sudo-команд.
- Темы с легкой синевой вместо серого
- Эффект размытия на экране входа
- Акцентные цвета автоматически подстраиваются под тему
- Sticky (заметки) теперь работает на Wayland
- Hypnotix (IPTV) получил "театральный" режим просмотра
- Warpinator теперь доступен на iOS
- Ядро 6.14 — поддержка Wi-Fi 7, новых процессоров и GPU
- LTS до 2029 года — установил и забыл на 4 года!
- Но для старых ПК лучше оставить ядро 6.8
Философия Mint:
Пока GNOME экспериментирует с минимализмом, Mint остается классическим:
- Привычная панель задач
- Понятное меню
- Никаких сюрпризов в интерфейсе
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#ChatGPT
🔖 ChatGPT теперь подключается к внешним сервисам!
OpenAI сделала революционный шаг — ChatGPT научился работать с внешними MCP-серверами. Это больше не просто чат-бот!
🔸 Что это означает?
До: ChatGPT генерировал только текст
Сейчас: Выполняет действия в ваших приложениях!
🔸 Реальные возможности:
Работа с корпоративными системами — ChatGPT может обращаться к вашей CRM, базам данных, внутренним инструментам
Автоматизация процессов — создание задач в Jira, отправка писем, обновление документов
Персонализированные AI-агенты — настройка под специфику вашей компании
🔸 Как активировать:
1. Подписка Pro/Plus
2. Developer mode в настройках
3. Раздел *Connectors* → включить MCP
🔸 Главное изменение:
ChatGPT превращается из генератора текста в рабочую платформу. Теперь он может:
- Читать ваши документы
- Обновлять данные в реальном времени
- Интегрироваться с любыми сервисами
- Выполнять сложные бизнес-процессы
🎙 Новости
📝 База вопросов
OpenAI сделала революционный шаг — ChatGPT научился работать с внешними MCP-серверами. Это больше не просто чат-бот!
До: ChatGPT генерировал только текст
Сейчас: Выполняет действия в ваших приложениях!
Работа с корпоративными системами — ChatGPT может обращаться к вашей CRM, базам данных, внутренним инструментам
Автоматизация процессов — создание задач в Jira, отправка писем, обновление документов
Персонализированные AI-агенты — настройка под специфику вашей компании
1. Подписка Pro/Plus
2. Developer mode в настройках
3. Раздел *Connectors* → включить MCP
ChatGPT превращается из генератора текста в рабочую платформу. Теперь он может:
- Читать ваши документы
- Обновлять данные в реальном времени
- Интегрироваться с любыми сервисами
- Выполнять сложные бизнес-процессы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
#Webdevelopment
🔖 12 инструментов, которые изменят вашу разработку
Топ-инструменты для разработчиков, которые реально экономят время и упрощают жизнь
🔥 Мои фавориты:
🔹 RunJS — JS-песочница с мгновенным выводом
Пишешь код → сразу видишь результат. Поддержка NPM, TypeScript, ИИ-помощник!
🔹 LocalCan — делитесь localhost с командой
Покажите проект коллегам одной ссылкой. Тестируйте веб-хуки на лету!
🔹 VisBug — дизайн прямо в браузере
WYSIWYG-редактор для отладки CSS. Направляющие, выравнивание, live-правки!
🔹 JSON Crack — визуализация JSON
Превращает JSON в понятные диаграммы. Интерактивное редактирование!
🔸 Для оптимизации:
- CompressX — сжатие до 90% без потери качества
- Antimetal — экономия на AWS автопилотом
- Lightspeed — анализ производительности сайтов
🔸 Для продуктивности:
- DevToys — "швейцарский нож" разработчика (кодировщики, форматеры, генераторы)
- TiinyHost — быстрый хостинг статики
- File.Rocks — безопасный обмен файлами
🔸 Документация:
- Docz — красивая документация на MDX
- ScreenshotOne — скриншоты сайтов через API
Вывод:
📎 Статья
🎙 Новости
📝 База вопросов
Топ-инструменты для разработчиков, которые реально экономят время и упрощают жизнь
Пишешь код → сразу видишь результат. Поддержка NPM, TypeScript, ИИ-помощник!
Покажите проект коллегам одной ссылкой. Тестируйте веб-хуки на лету!
WYSIWYG-редактор для отладки CSS. Направляющие, выравнивание, live-правки!
Превращает JSON в понятные диаграммы. Интерактивное редактирование!
- CompressX — сжатие до 90% без потери качества
- Antimetal — экономия на AWS автопилотом
- Lightspeed — анализ производительности сайтов
- DevToys — "швейцарский нож" разработчика (кодировщики, форматеры, генераторы)
- TiinyHost — быстрый хостинг статики
- File.Rocks — безопасный обмен файлами
- Docz — красивая документация на MDX
- ScreenshotOne — скриншоты сайтов через API
Вывод:
Правильные инструменты = больше времени на код, меньше на рутину
Сохраняйте пост — пригодится!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
#Vibecoding
🔖 Вайб-кодинг глазами разработчика с 20-летним стажем
Опытный разработчик провел эксперимент: за 4 часа создал полноценное веб-приложение с интеграцией Bitrix24, не написав ни строчки кода вручную — только через диалог с ИИ.
В статье он честно рассказывает о граблях, на которые наступил, сравнивает GPT-4.1, Claude Sonnet 3.7 и Grok на реальных задачах, объясняет когда нужна экспертиза разработчика, а когда справится и новичок, и делится опасениями о влиянии вайб-кодинга на профессиональные навыки программистов⬇️
📎 Статья
🎙 Новости
📝 База вопросов
Опытный разработчик провел эксперимент: за 4 часа создал полноценное веб-приложение с интеграцией Bitrix24, не написав ни строчки кода вручную — только через диалог с ИИ.
В статье он честно рассказывает о граблях, на которые наступил, сравнивает GPT-4.1, Claude Sonnet 3.7 и Grok на реальных задачах, объясняет когда нужна экспертиза разработчика, а когда справится и новичок, и делится опасениями о влиянии вайб-кодинга на профессиональные навыки программистов
Please open Telegram to view this post
VIEW IN TELEGRAM
#BigO
🔖 Big O: почему ваш код тормозит в продакшене
Код работает мгновенно на тестах, но ползёт как черепаха на реальных данных? Дело в Big O — нотации, которая предсказывает поведение алгоритма при росте нагрузки. O(1) работает всегда быстро, O(n) растёт линейно, а O(n²) превращается в кошмар на больших объёмах.
В отличие от замеров времени, Big O показывает закономерности роста сложности. Понимание четырёх основных категорий — константной, логарифмической, линейной и квадратичной — помогает писать код, который выдержит любую нагрузку.
Разберём на примерах: как превратить O(n²) в O(1), почему indexOf в цикле убивает производительность, и как бинарный поиск находит число среди миллиарда за 31 попытку. Готовы понять, что творится под капотом?⬇️
📎 Статья
🎙 Новости
📝 База вопросов
Код работает мгновенно на тестах, но ползёт как черепаха на реальных данных? Дело в Big O — нотации, которая предсказывает поведение алгоритма при росте нагрузки. O(1) работает всегда быстро, O(n) растёт линейно, а O(n²) превращается в кошмар на больших объёмах.
В отличие от замеров времени, Big O показывает закономерности роста сложности. Понимание четырёх основных категорий — константной, логарифмической, линейной и квадратичной — помогает писать код, который выдержит любую нагрузку.
Разберём на примерах: как превратить O(n²) в O(1), почему indexOf в цикле убивает производительность, и как бинарный поиск находит число среди миллиарда за 31 попытку. Готовы понять, что творится под капотом?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1