METANIT.COM
6.24K subscribers
1.79K photos
86 videos
10 files
1.26K links
Канал о программировании и разработке сайта metanit.com
Download Telegram
Что такое sharding (шардинг)?
(продолжение в следующем посте)
5👍3🔥2
Что такое sharding (шардинг)?
(продолжение предыдущего поста)

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

Разберём подробно различные стратегии и типы шардинга.

#### 1. Типы шардинга

а) Вертикальный шардинг (Vertical)
- Суть: разбиение базы данных по столбцам (колонкам), а не по строкам.
- Пример на изображении: исходная таблица с колонками ID, First Name, Last Name разделена на две части:
- Partition 1: содержит ID и First Name;
- Partition 2: содержит ID и Last Name.
- Применение: подходит для случаев, когда к определённым колонкам обращаются чаще, чем к другим (например, данные аутентификации пользователей в одном шарде, а журналы активности — в другом).

б) Горизонтальный шардинг (Horizontal)
- Суть: разделение базы данных по строкам (а не по колонкам), при этом каждая строка хранится только в одном шарде.
- Пример на изображении: данные распределены по нескольким шардам, каждый из которых содержит подмножество строк исходной таблицы.
- Применение: идеально для приложений с большим объёмом данных, где строки можно сегментировать (например, по географическим регионам или идентификаторам пользователей).

#### 2. Стратегии шардинга

а) Range Based Sharding (шардинг на основе диапазона значений)
- Суть: данные распределяются по шардам в зависимости от диапазона значений определённого поля (например, возраста).
- Пример на изображении: таблица с полем Age разделена на три диапазона:
- 20 < Age ≤ 30: содержит только запись Rohit (28);
- 30 < Age ≤ 40: содержит записи Alex (32), Adam (34), Foo (36);
- 40 < Age ≤ 50: содержит записи John (45), Anshu (50).
- Особенности: может приводить к неравномерному распределению нагрузки (некоторые шарды перегружены, другие — недогружены).
- Применение: подходит для данных с временными метками или последовательных данных (журналы, события).

б) Key Based Sharding (шардинг на основе ключа)
- Суть: использование хэш-функции для распределения данных по шардам. Хэш-функция принимает ключ (например, ID) и возвращает значение, определяющее, в какой шард попадёт запись.
- Пример на изображении: используется функция ID % 3, которая вычисляет хэш-значение для каждого ID:
- ID 1 → Hash = 1 % 3 = 1 → попадает в Shard #1;
- ID 2 → Hash = 2 % 3 = 2 → попадает в Shard #2;
- ID 3 → Hash = 3 % 3 = 0 → попадает в Shard #3;
- и так далее.
- Особенности: обеспечивает более равномерное распределение данных по шардам.
- Применение: подходит для систем, где важна балансировка нагрузки (например, хранение пользовательских сессий).

в) Directory Based Sharding (шардинг на основе каталога)
- Суть: используется специальная служба (каталог), которая отслеживает, в каком шарде хранятся те или иные данные. Каталог сопоставляет ключи шардов с их местоположением.
- Пример на изображении: таблица ID | Map показывает, в каком шарде хранится каждая запись:
- ID 1 → Map 1Shard #1;
- ID 2 → Map 3Shard #3;
- ID 3 → Map 1Shard #1;
- и так далее.
- Особенности: позволяет работать с неравномерным распределением данных и сложными критериями разбиения.
- Применение: подходит для сложных систем с динамическим распределением данных.

#### 3. Ключевые особенности шардинга, отражённые на изображении
👍42🤝2
- Независимость шардов: каждый шард работает автономно, запросы к одному шарду не влияют на производительность других.
- Распределение нагрузки: данные распределены между серверами, что снижает нагрузку на отдельные серверы и ускоряет обработку запросов.
- Масштабируемость: горизонтальное масштабирование позволяет добавлять новые шарды по мере роста объёма данных.
- Высокая доступность: сбой одного шарда не приводит к потере всей базы данных — недоступны будут только данные этого шарда.
👍63🔥2
Распространенные команды для анализа логов на Linux
👍9💯42🤔2🌚1
Роб Пайк (один из ключевых создателей языка Go, один из разработчиков Unix, в частности, создал первую граф. систему окон для Unix) в своём канале в bluesky в ответ на сообщение, отправленное от лица LLM-модели Claude Opus, эмоционально выразил своё отношение к ИИ и их роли в современной мире:

«Идите [к чёрту], ребята. Вы насилуете нашу планету, тратите триллионы на токсичное, неперерабатываемое оборудование, разрушая при этом основы общества, но ещё находите время, чтобы заставить свои злобные машины поблагодарить меня за моё стремление к более простым программам.

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

Просто валите [к чёрту]. Проваливайте все.

Не помню, когда я последний раз был так зол.

У всех остальных же я прошу прощения за своё, пусть ненамеренное и скорее незначительное, участие в реализации этого насилия против человечества.»

https://bsky.app/profile/robpike.io/post/3matwg6w3ic2s
👏579👍8🤔2
Как работает NAT (Network Address Translation)
(продолжение в следующем посте)
4🔥3🫡2
Как работает NAT (Network Address Translation)
(продолжение предыдущего поста)

1. Основная задача NAT

NAT — это технология, позволяющая нескольким устройствам в локальной сети (LAN) использовать один публичный IP-адрес. Это достигается путём изменения IP-адресов в заголовках пакетов данных при их передаче через маршрутизатор (NAT-шлюз).

2. Компоненты, показанные на изображении

На схеме представлены:
* Локальные устройства с частными IP-адресами (например, 192.168.0.13, 192.168.0.25, 192.168.0.30) — устройства внутри локальной сети.
* NAT-шлюз (роутер) — устройство, выполняющее преобразование адресов. Ему присвоен публичный IP-адрес (184.28.207.5).
* Публичный IP-адрес (184.28.207.5) — адрес, видимый в интернете.
* Таблица NAT — хранит соответствие между частными IP-адресами и портами локальных устройств и преобразованными публичными адресами и портами.
* Внешний ресурс (например, DNS-сервер 8.8.8.8) — цель запроса из локальной сети.

3. Процесс работы NAT по шагам

Шаг 1. Исходный пакет (до трансляции)

Когда устройство в локальной сети (например, с IP 192.168.0.13) отправляет запрос в интернет (например, к DNS-серверу 8.8.8.8:53), пакет имеет:
* Source IP & Port (исходный IP и порт): 192.168.0.13:1000 (локальный адрес и порт устройства).
* Destination IP & Port (целевой IP и порт): 8.8.8.8:53 (адрес и порт сервера в интернете).

Шаг 2. Преобразование адреса NAT-шлюзом

NAT-шлюз перехватывает пакет и изменяет его заголовки:
* Заменяет локальный IP-адрес (192.168.0.13) на свой публичный IP-адрес (184.28.207.5).
* Заменяет локальный порт (1000) на уникальный публичный порт (например, 10000), чтобы различать соединения от разных устройств.
* Сохраняет соответствие «локальный IP:порт → публичный IP:порт» в таблице NAT.

Шаг 3. Пакет после трансляции

После преобразования пакет выглядит так:
* Source IP & Port: 184.28.207.5:10000 (публичный IP и порт NAT-шлюза).
* Destination IP & Port: 8.8.8.8:53 (не изменяется — это адрес цели).

Шаг 4. Ответ от сервера

Когда сервер (8.8.8.8) отвечает, он отправляет данные на публичный IP и порт (184.28.207.5:10000).

Шаг 5. Обратная трансляция

NAT-шлюз:
* Проверяет таблицу NAT и находит запись: «184.28.207.5:10000192.168.0.13:1000».
* Преобразует публичный IP и порт обратно в локальные.
* Передаёт ответ устройству с IP 192.168.0.13.

4. Таблица NAT

Таблица NAT хранит соответствия для всех активных соединений, например:
* 192.168.0.13:1000 ↔️ 184.28.207.5:10000;
* 192.168.0.25:2000 ↔️ 184.28.207.5:20000;
* 192.168.0.30:3000 ↔️ 184.28.207.5:30000.

5. Итог

Благодаря NAT:
* Несколько устройств используют один публичный IP-адрес.
* Локальные IP-адреса скрыты от интернета — это повышает безопасность сети.
* Маршрутизатор управляет трафиком, преобразуя адреса «на лету».

Таким образом, NAT обеспечивает экономию IP-адресов и защиту локальной сети.
👍95🔥2💋2😱1
Расспространенные алгоритмы криптографии/шифрования

Hashing Algorithms (используются для контрольных сумм, обеспечения целостности данных и хранения паролей):
1. MD5 — быстрая функция хеширования, но небезопасна из-за коллизий.
2. SHA-1 — более безопасна, чем MD5, но сейчас взломана (не использовать в новых системах).
3. SHA-256 — часть семейства SHA-2, широко используется и безопасна.
4. SHA-512 — более длинная версия SHA-256, обеспечивает повышенную безопасность.
5. BLAKE2 — быстрее и безопаснее SHA-2, современная альтернатива.
6. RIPEMD-160 — альтернатива SHA, используется для генерации адресов в Bitcoin.
7. CRC32 — лёгкий алгоритм хеширования для обнаружения ошибок, но не криптографически безопасен.

Алгоритмы хеширования паролей и вывода ключей (используются для безопасного хранения или получения ключей из паролей):
8. bcrypt — алгоритм хеширования паролей, специально замедленный для защиты от перебора.
9. scrypt — хеширование паролей с высокой нагрузкой на память, лучше защищён от ASIC-устройств по сравнению с bcrypt.
10. Argon2 — современный рекомендуемый стандарт хеширования паролей (победитель конкурса PHC).
11. PBKDF2 — итеративная функция вывода ключей, используется во многих защищённых системах.
12. HKDF — функция вывода ключей на основе HMAC, используется в TLS, Signal.

Алгоритмы симметричного шифрования (один и тот же ключ используется для шифрования и дешифрования):
13. AES (Advanced Encryption Standard) — промышленный стандарт симметричного шифрования (128, 192, 256 бит).
14. ChaCha20 — быстрый и безопасный потоковый шифр, используется в мобильных и ограниченных устройствах.
15. 3DES — тройной стандарт шифрования данных, устарел и небезопасен.
16. Blowfish — блочный шифр старого образца, заменён более безопасными вариантами, такими как AES.
17. Twofish — преемник Blowfish, был кандидатом на роль AES, но не был выбран.
18. RC4 — небезопасный потоковый шифр, не использовать в новых системах.

Алгоритмы асимметричного (с открытым ключом) шифрования (используют пару открытый/закрытый ключ для шифрования и дешифрования):
19. RSA — классический алгоритм шифрования с открытым ключом, широко используется в TLS и для подписей.
20. DSA (Digital Signature Algorithm) — алгоритм цифровой подписи, в основном заменён более новыми вариантами.
21. Diffie-Hellman — алгоритм обмена ключами, позволяет обмениваться секретами без их раскрытия.
22. Elliptic Curve Cryptography (ECC) — более безопасен при использовании меньших ключей, применяется в современных системах.
23. Ed25519 — высокопроизводительный алгоритм цифровых подписей на эллиптических кривых.
24. ECDSA — вариант DSA на эллиптических кривых, используется в Bitcoin, Ethereum и TLS.
25. X25519 — быстрый алгоритм обмена ключами Diffie-Hellman на эллиптических кривых.

Цифровые подписи и обеспечение целостности:
26. HMAC (Hash-based Message Authentication Code) — объединяет хеш с секретным ключом для обеспечения целостности.
27. RSA Signatures — подписывание данных с помощью закрытого ключа, чтобы другие могли проверить с помощью открытого ключа.
28. EdDSA — схема подписи, использующая скрученные кривые Эдвардса (например, Ed25519).
29. MAC (Message Authentication Code) — подтверждает, что данные не были изменены, аналогично HMAC.

Режимы работы (для блочных шифров, таких как AES) (определяют, как блочные шифры обрабатывают данные, превышающие размер блока):
30. ECB (Electronic Codebook) — небезопасен; одинаковые блоки открытого текста дают одинаковый шифротекст.
31. CBC (Cipher Block Chaining) — использует вектор инициализации (IV) для добавления случайности к блокам.
32. CTR (Counter Mode) — преобразует блочный шифр в потоковый шифр.
33. GCM (Galois/Counter Mode) — режим AES с встроенной аутентификацией (используется в TLS).
34. CFB (Cipher Feedback Mode) — преобразует блочный шифр в самосинхронизирующийся потоковый шифр.
35. OFB (Output Feedback Mode) — преобразует блочный шифр в синхронный потоковый шифр.
👍24🔥85
Масштабирование чтения и записи в веб-приложении
(продолжение в следующем посте)
Масштабирование чтения и записи в веб-приложении
(продолжение предыдущего поста)

Масштабирование операций чтения и записи являются частыми задачами в веб-приложении по мере увеличения нагрузки. Рассмотрим распространенные стратегии масштабирования операций чтения и записи.

1) Стратегии масштабирования чтений (проще)

Цель: Эффективно обрабатывать большой объём запросов на чтение.

Внутренний кэш (уровень приложения)
* кэш в оперативной памяти (например, локальный словарь, кэш LRU внутри экземпляра приложения);
* предотвращает повторные вычисления, но не распределяется между экземплярами.

Кэш в оперативной памяти (Redis, Memcached)
* хранит часто запрашиваемые данные в ОЗУ для сверхбыстрого доступа;
* сокращает количество запросов к базе данных, улучшая время отклика;
* оптимален для нагрузок с большим объёмом чтений (например, пользовательские сессии, предварительно вычисленные данные).

Копии для чтения (Read Replicas)
* множественные копии основной базы данных обрабатывают запросы на чтение;
* распределяет нагрузку от чтения по нескольким узлам;
* подходит для аналитических панелей и приложений с большим объёмом контента.

Сеть доставки контента (CDN — Content Delivery Network)
* кэширует статические ресурсы (изображения, видео, HTML) на периферийных узлах;
* сокращает задержки за счёт предоставления данных с ближайшего узла.

2) Стратегии масштабирования записей (сложнее)

Цель: Распределить нагрузку от записи и сохранить согласованность данных.

Шардинг (сегментация)
* разделяет данные по нескольким базам данных на основе ключа (например, ID пользователя);
* предотвращает перегрузку одной базы данных;
* требует тщательного проектирования запросов, чтобы избежать обращений к нескольким сегментам.

CQRS (разделение ответственности за команды и запросы — Command Query Responsibility Segregation)
* разделяет модели чтения и записи по разным базам данных или сервисам;
* позволяет оптимизировать нагрузки с большим объёмом записи и чтения отдельно.

Архитектура, управляемая событиями (Event-Driven Architecture)
* вместо прямых записей в БД публикуются события, которые обрабатываются асинхронно;
* помогает разделить сервисы и распределить нагрузку от записи;
* пример: сервис заказов отправляет событие «Заказ создан» → сервис инвентаризации асинхронно обновляет остатки.

Базы данных, оптимизированные для записи (Write-Optimized Databases)
* используют механизмы хранения с логической структурой (например, LSM-деревья в Cassandra, RocksDB) для нагрузок с большим объёмом записи;
* полезны в случаях высокочастотных операций (например, торговые системы, системы журналирования).

Что в итоге:
* Масштабирование чтений проще добавить позже.
* Масштабирование записей нужно проектировать на раннем этапе, чтобы избежать сложностей с рефакторингом.
8👍3🔥2
Жизненный цикл разработки программного обеспечения
(продолжение в следующем посте)
👍42🤝2👎1
Жизненный цикл разработки программного обеспечения
(продолжение предыдущего поста)

Жизненный цикл разработки ПО включает несколько моделей, каждая из которых предлагает свой подход к этапам создания продукта. Каждая модель жизненного цикла разработки ПО имеет свои преимущества и недостатки, выбор зависит от:
* сложности и масштаба проекта;
* гибкости требований;
* сроков разработки;
* вовлечённости заказчика;
* доступных ресурсов.

Рассмотрим основные модели:

1. Waterfall (Каскадная модель):
* Последовательность этапов: анализ → проектирование (design) → разработка (build) → тестирование (test) → развёртывание (deploy).
* Особенности: строгая последовательность, переход к следующему этапу только после завершения предыдущего. Подходит для проектов с чётко определёнными требованиями (например, электронная коммерция).
* Итог: структурированный и предсказуемый процесс, но менее гибкий к изменениям.

2. Spiral (Спиральная модель):
* Структура: комбинация каскадного и итеративного подходов. Этапы повторяются в виде спирали: оценка → планирование → разработка → тестирование.
* Ключевые элементы: оценка рисков, поэтапная разработка, тестирование на каждом витке спирали.
* Применение: проекты с высоким уровнем неопределённости и риска, длительные циклы разработки.
* Итог: баланс между гибкостью и контролем рисков.

3. Agile (Гибкая модель):
* Основа: итеративные циклы (спринты), быстрая адаптация к изменениям.
* Этапы: серия спринтов, в каждом из которых разрабатывается часть функционала.
* Фокус: сотрудничество с клиентом, быстрая обратная связь, поэтапная поставка рабочих версий ПО.
* Применение: динамичные рынки, стартапы, проекты с неясными требованиями.
* Итог: высокая адаптивность, но требует активного участия заказчика.

4. Iterative (Итеративная модель):
* Принцип: разработка через последовательные итерации (циклы), каждая из которых улучшает предыдущий прототип.
* Этапы: требования → анализ → проектирование → тестирование → реализация → обзор → повтор.
* Применение: сложные проекты, где конечная цель не определена чётко.
* Итог: постепенное приближение к финальному продукту с учётом обратной связи.

5. V-Model (V-образная модель):
* Структура: усовершенствованная каскадная модель с акцентом на тестирование. Этапы разработки «зеркальны» этапам тестирования.
* Этапы разработки: бизнес-требования → системные требования → высокоуровневый дизайн → низкоуровневый дизайн → кодирование.
* Этапы тестирования: приёмочное тестирование → системная интеграция → компонентное тестирование → модульное тестирование.
* Применение: проекты с жёсткими требованиями к качеству (аэрокосмическая отрасль, здравоохранение).
* Итог: тщательная проверка на каждом этапе, минимизация ошибок.

6. Incremental (Инкрементальная модель):
* Принцип: разработка ПО частями (инкрементами), каждый из которых добавляет новый функционал.
* Этапы: анализ → проектирование → кодирование → тестирование → развёртывание (повторяется для каждого инкремента).
* Применение: проекты с ограниченными ресурсами, когда нужно быстро предоставить рабочую версию ПО.
* Итог: поэтапная поставка функционала, гибкость в управлении требованиями.

7. Big Bang (Модель «Большого взрыва»):
* Суть: отсутствие чёткого планирования, разработка начинается с накопления ресурсов и идей, затем происходит «взрыв» активности.
* Этапы: накопление ресурсов → разработка → тестирование → продукт.
* Применение: небольшие проекты с креативным подходом, когда требования не определены заранее.
* Риски: высокий риск срыва сроков и бюджета из-за отсутствия структуры.
9🤷‍♂1🤮1
8. RAD (Rapid Application Development — быстрая разработка приложений):
* Основа: итеративный и инкрементальный подход с акцентом на быстрое создание прототипов.
* Этапы: анализ и быстрый дизайн → разработка прототипа → демонстрация → доработка → тестирование → развёртывание.
* Применение: проекты с быстро меняющимися требованиями, необходимость быстрого выхода на рынок.
* Итог: ускоренная разработка за счёт активного вовлечения заказчика и использования прототипов.
2👍2💯2🤷‍♂1
This media is not supported in your browser
VIEW IN TELEGRAM
Наглядно, что такое интеграл
👍21🤓13🆒63
Выполнение программы
(продолжение в следующем посте)
❤‍🔥4👍2🤝2
Выполнение программы
(продолжение предыдущего поста)

Программа проходит путь от исходного кода до исполняемого файла, загружается в память, взаимодействует с ОС через системные вызовы, использует ресурсы компьютера (CPU, память, устройства) и завершается с очисткой всех задействованных ресурсов. Рассмотрим пошагово.

1. Компиляция и загрузка программы (Program Compilation and Loading)

- Исходный код (например, Enter.c) передаётся компилятору.
- Компилятор преобразует исходный код в объектный файл (Enter.obj), проверяя синтаксис и семантику.
- Используются библиотеки (например, cw32.lib), из которых извлекаются необходимые функции (например, sprintf()).
- Происходит статическая компоновка — связывание объектного файла с библиотеками для создания промежуточного кода.
- Далее подключается динамическая компоновка — связывание с динамическими библиотеками (user32.dll и др.), используемыми для функций вроде MessageBox().
- В итоге формируется исполняемый файл (Enter.exe), готовый к запуску.

2. Взаимодействие пользователя и распределение памяти (User Interaction and Memory Allocation)

- Пользователь запускает программу через графический интерфейс (например, клик по иконке).
- Операционная система (ОС) получает запрос и инициирует загрузку исполняемого файла.
- ОС выделяет память для программы, используя структуру памяти:
- Memory pool (пул памяти) — общее пространство для распределения.
- Stack (стек) — для хранения локальных переменных и вызовов функций.
- Heap (куча) — для динамического выделения памяти (malloc, free).
- Сегменты: BSS (неинициализированные данные), Data (инициализированные данные), Code (исполняемый код).
- Программа загружается в выделенную область памяти.

3. Системные вызовы (System Calls)

- Программа взаимодействует с ОС через системные вызовы (system call), которые обеспечивают доступ к ресурсам (файлам, сети, устройствам).
- Процесс вызова:
1. Программа делает системный вызов (например, открытие файла).
2. Управление передаётся ядру ОС (kernel model), которое проверяет права доступа и параметры вызова.
3. Ядро выполняет операцию через сервисные программы (например, чтение данных с диска).
4. Результат возвращается программе, которая продолжает выполнение.
- Таблица системных вызовов (Sys_call_table) хранит адреса функций ядра.

4. Состояние ЦП и структура памяти (CPU Status and Memory Structure)

- Программа выполняется на центральном процессоре (CPU), который работает в двух режимах:
- Пользовательский режим (user model) — выполнение прикладного кода.
- Режим ядра (kernel model) — выполнение системных вызовов и привилегированных операций.
- Кэширование: CPU использует кэши (L1, L2, L3) для ускорения доступа к данным.
- RAM хранит исполняемый код и данные программы во время работы.
- Регистры программ (Program register) сохраняют состояние выполнения (адрес следующей инструкции).

5. Архитектура фон Неймана (Von Neumann Architecture)

- Программа и данные хранятся в единой памяти (принцип фон Неймана).
- Центральный процессор (CPU) состоит из:
- Control Unit (CU) — управляет выполнением инструкций.
- Arithmetic/Logic Unit (ALU) — выполняет арифметические и логические операции.
- Данные поступают с устройств ввода (Input Device), обрабатываются процессором и выводятся на устройства вывода (Output Device).
- Memory Unit хранит промежуточные результаты и инструкции.

6. Завершение программы и освобождение ресурсов (Program Termination and Resource Recovery)

- Программа завершается по команде exit() или по инициативе пользователя.
- ОС выполняет очистку ресурсов:
- Освобождение файловых ресурсов (закрытие дескрипторов файлов).
- Освобождение сетевых ресурсов (разрыв соединений).
- Возврат памяти (освобождение стека, кучи, сегментов).
- Все ресурсы возвращаются в пул ОС, программа завершается, и её состояние удаляется из памяти.
🔥8❤‍🔥54
В Думу внесли законопроект о подтверждении для сайтов значимых действий

Правительство внесло в Госдуму законопроект № 1110676-8, который с 1 сентября 2026 года вводит для российских сайтов обязательное подтверждение значимых действий в интернете кодами из СМС и одновременно сообщениями с использованием мессенджера Max. Перечень таких действий утвердит правительство.
В банковской и иных сферах финансового рынка перечень значимых действий будет дополнительно согласовываться с Банком России.
https://www.interfax.ru/russia/1065345
🤡37👎3💊2🤷2🖕1
Спрос на ИИ-специалистов в России растет быстрее предложения. Опубликовано почти 200 тысяч вакансий

Потребность российской экономики в кадрах в сфере искусственного интеллекта в 2025 г. увеличилась примерно на 18% по сравнению с 2024 г. За год на российских рекрутинговых ИТ-платформах было опубликовано почти 200 тыс. вакансий для специалистов, а в 2024 г. их было около 170 тыс. К кадрам по искусственному интеллекту работодатели относит ИТ-инженеров, ИТ-разработчиков, системных архитекторов и аналитиков и иных инженерно-научных и прикладных специалистов, которые создают и интегрируют ИТ-решения на основе этой технологии.

Число таких вакансий растет в среднем на 5 под пункта быстрее, чем количество ИИ-специалистов с нужными компетенциями. По примерным оценкам J’son Partners Consulting, сейчас в России 100 тыс. - 120 тыс. ИИ-кадров (+15% к 2024 г., следует из аналитики компании), из которых обучением моделей занимается около 1 тыс.-3 тыс. инженеров в сфере Machine Learning (ML), остальное приходится на специалистов по данным т.е. data science.

Согласно совместному исследованию HeadHunter и Skillaz, с 2022 г. спрос на специалистов данного профиля вырос в два раза. Абсолютные значения количества вакансий и резюме в исследовании не раскрываются.

https://www.cnews.ru/news/top/2025-12-30_v_2025_godu_spros_na_ii-spetsialistov
🤔11🤡9😁5👍32🕊1
В 2025 году произошло множество значимых событий в мире программирования. Помянем основные из них:

### Укрепление позиций Rust
На конференции Maintainers Summit в декабре 2025 года разработчики ядра Linux решили перевести поддержку языка Rust из экспериментального статуса в категорию основных возможностей. Эксперимент по добавлению в ядро возможности разработки компонентов на Rust начался три года назад с версии 6.1.
За это время в состав ядра были включены абстракции для разработки на Rust драйверов для GPU, файловых систем, блочных устройств, сетевых адаптеров и USB-устройств. Например, развиваются драйверы Nova для видеокарт NVIDIA, asahi для GPU Apple AGX, Tyr для GPU ARM Mali, а также реализация IPC Binder.
Поддержка Rust неактивна по умолчанию и не приводит к включению этого языка в число обязательных сборочных зависимостей ядра. Однако сторонники продвижения Rust считают, что этот язык помогает избежать многих ошибок, связанных с особенностями C, и позволяет сократить время разработки за счёт снижения трудозатрат на отладку.
Параллельно Microsoft активно внедряет поддержку Rust в Windows, даже были высказывания, что компания планирует к 2030 году полностью заменить весь код на C/C++ на Rust. Однако позднее компания дезавуировала подобные высказывания.
Google также продвигает Rust в Android, но менее агрессивно

### Выход .NET 10:
Выпуск с долгосрочной поддержкой (Long Term Support, LTS), что гарантирует стабильность и актуальность вплоть до конца 2028 года, и знаменует собой качественный прогресс в эволюции платформы, делая её более привлекательной для широкого круга разработчиков и предприятий
Новые оптимизации повышают производительность приложений и уменьшают потребление ресурсов. Повышение эффективности работы с многопоточностью и параллельной обработкой данных. Оптимизирован JIT-компилятор, ускоряющий выполнение кода путем уменьшения нагрузки на процессор и улучшение обработки аргументов структур. Добавлена поддержка инструкций AVX10.2 для Intel и ARM64 SVE, позволяющая эффективнее использовать аппаратные возможности современных процессоров.
Значительно улучшено быстродействие NativeAOT (ранней компиляции) за счёт снижения размера исполняемых файлов и ускорения старта приложений.
Возможность стековой аллокации небольших массивов фиксированного размера, что уменьшает нагрузку на динамическое выделение памяти.
Сопровождается обновленнием языка C# - C# 14 со многими нововведениями, из которых следует отметить прежде всего расширенные возможности расширения классов (extension blocks), позволяющие элегантно дополнять базовые классы методами и свойствами.
Добавлена поддержка выполнения кода в виде скриптов без создания проекта.

### Java 25
Плановый выпуск тем не менее знаменует собой важную веху в развитии языка программирования Java. Из нововведенией прежде всего следует отметить возможность создавать более компактные исходные файлы и метод main, что упрощает процесс для начинающих и для разработчиков скриптов, позволяя создавать Java-программы с меньшим количеством шаблонного кода
Также следует отметить развитие Structured Concurrency, которая предоставляет высокоуровневый API для управления параллельными задачами, обеспечивая четкую организацию и обработку исключений, и Scoped Values, которая предоставляет безопасную передачу неизменяемых данных между потоками, что обеспечивает лучшую интеграцию с виртуальными потоками и устраняет необходимость использования ThreadLocal.​
Кроме того, добавлена возможность массового подключения всех пакетов модуля одной строкой, что упрощает работу с крупными проектами и снижает сложность импорта, и упрощённое разрешение зависимостей и автоматический импорт пакетов, что ускоряет разработку и уменьшает когнитивную нагрузку
И, как обычно, все это сопровождается оптимизацией работы с памятью. В частности, функциональность Compact Object Headers позволяет сократить размер заголовков объектов в Java-куче и снижает потребление памяти, улучшает плотность кучи и общую производительность, особенно в приложениях с большим количеством объектов
8👍4❤‍🔥2🤮2👎1
### Python 3.14
Выход Python 3.14 в октябре 2025 года ознаменовал важные изменения и улучшения, направленные на повышение производительности, улучшение поддержки многопоточности и предоставление новых возможностей для разработчиков.
Интерпретатор Python 3.14 получил значительные улучшения, включающие оптимизацию обработки команд CPython и увеличение производительности на уровне байт-кода. Результаты тестов показывают, что средний прирост производительности составляет около 30%, что достигается без необходимости внесения изменений в существующий код.​
Важнейшим изменением является удаление механизма GIL, который препятствовал эффективному использованию многопроцессорных систем. Теперь Python позволяет эффективно распределять задачи между несколькими потоками, значительно увеличивая производительность в многопоточных приложениях. Это открывает путь к новому уровню производительности для интенсивных вычислительных задач и многопоточности.​
Python 3.14 отличается значительным увеличением производительности за счет оптимизации внутренней работы интерпретатора. Испытания показывают, что новое решение позволяет выполнять задачи быстрее и использовать меньше памяти, что особенно важно для больших проектов и интенсивных вычислений

### Swift для Android
Компания Apple открыла возможность разработки приложений на языке Swift для операционной системы Android, что ранее было ограничено экосистемой Apple. Хотя поддержка пока неполная, но в перспективе Swift может стать альтернативой инструментам для кросс-платформенной разработке, как Kotlin Multiplatform, Flutter (Dart), .NET MAUI (C#), React Native (JS/TS)

### Искусственный интеллект и инструменты для разработчиков
В 2025 году продолжил развиваться подход, при котором ИИ выступает не просто помощником, а полноценным соавтором разработчика. Примерно 60% специалистов среднего уровня активно использовали ИИ-ассистентов в работе.
Появился термин «вайбкодинг» (vibe coding), который описывает ситуацию, когда разработчик задаёт направление желаемого результата, а реализацию берёт на себя ИИ. В России этот подход стал стандартным инструментом для быстрого прототипирования и создания MVP, особенно в стартапах и продуктовых командах.
Однако эксперты предупреждают, что код, созданный с помощью вайбкодинга, часто оказывается хрупким: его сложно поддерживать и масштабировать. В индустрии даже появился термин «вайб-похмелье» для описания ситуации, когда проект приходится переписывать с нуля, потому что никто уже не понимает, как он устроен.

### Развитие рынка труда для разработчиков
В 2025 году рынок труда для программистов в России и мире претерпевал значительные изменения, связанные с экономическими факторами, технологическим прогрессом и структурными сдвигами в отрасли.

Увеличилось количество вакансий в сферах машинного обучения, AI, кибербезопасности, разработки приложений виртуальной реальности, операционной инженерии.

В России наблюдался дисбаланс между количеством соискателей и спросом на определённые категории специалистов. По данным hh_ru, на одну ИТ-вакансию в 2025 году приходилось около 14 резюме, что почти вдвое выше «комфортного» уровня. При этом конкуренция была максимальной среди начинающих специалистов (джунов) — 18,6 резюме на одну вакансию, тогда как на позиции сеньоров приходилось всего 3 резюме, и не все из них соответствовали требованиям.
Рынок труда характеризуется избытком джунов. Многие недавние выпускники онлайн-курсов и вузов не обладали достаточными практическими навыками для выполнения коммерческих задач. У них часто были завышенные зарплатные ожидания.
И в то же время наблюдается дефицит middle- и senior-специалистов. Компании остро нуждались в опытных разработчиках, способных быстро включаться в сложные проекты и принимать ключевые решения.
5❤‍🔥2👎1👏1
На российский рынок труда также оказали влияние некоторые локальные особенности. Например, влияние импортозамещения: переход на отечественные решения (например, замену Oracle на PostgreSQL, SAP на 1С) создал спрос на специалистов, знакомых с российскими продуктами
В то де время экономические факторы, в частности, высокая ключевая ставка ЦБ и замедление экономики, а также оптимизация расходов привели к снижению количества вакансий, произошло сокращение бюджетов и проектов.
Тем не менее также стоит отметить и гос. поддержку в этой сфере: действовали программы льготной ипотеки для IT-специалистов (до 2030 года), отсрочка от призыва для сотрудников аккредитованных компаний, образовательные инициативы (увеличение бюджетных мест в вузах, корпоративные университеты).

Мировой рынок IT в 2025 году столкнулся с заметным охлаждением. По данным компании ZipRecruiter, в США количество IT-вакансий за последний год сократилось на 56%. Крупные технологические компании (Microsoft, Intel, Tata Consultancy Services) проводили масштабные сокращения.
ИИ начал массово внедряться в процессы разработки, что привело к сокращению спроса на специалистов, выполняющих рутинные задачи. По некоторым оценкам, доля кода, создаваемого с помощью ИИ, достигла около 50%. Однако это повысило спрос на сеньоров для ревью кода, постановки требований и работы с аналитикой.
В США и Индии и в ряде других стран (как и в России) фиксировалось сокращение позиций для начинающих специалистов и рост спроса на узкопрофильных экспертов. Компании искали специалистов с опытом в конкретных сферах: финансы, e-commerce, кибербезопасность, машинное обучение.
👍14🔥42👎2❤‍🔥1🤬1