<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Ruby</title>
    <description/>
    <link>https://tproger.ru/tag/ruby</link>
    <atom:link href="https://tproger.ru/tag/ruby/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Mon, 28 Sep 2026 21:44:18 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Ruby</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</title>
      <link>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</link>
      <comments>https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Роман Фролов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r</guid>
      <description><![CDATA[<p>Проект представляет из себя быстрый способ воссоздать архитектуру состоящую из 2 серверов (локальный + удаленный) с определенными сервисами, которые решают специфические задачи. Проект сделан прежде всего для меня, а также для людей которые хотят свой готовый self-hosted сервер из коробки с полной системой обслуживания</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/svoya-self-hosted-dvuhservernaya-vpn-arhitektura-podrobnyj-put-r">Своя self-hosted двухсерверная VPN-архитектура. Подробный путь разработки и ошибки, с которыми вы можете столкнуться</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[unix]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Музыка]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[VPN]]></category>
      <category><![CDATA[Telegram]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Cloudflare]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 26 Jul 2026 15:46:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всё
 началось с того, что меня перестал устраивать мой подход к 
развертыванию личных сервисов. Я решил переписать всё с нуля. К тому же 
это был отличный повод получить новые навыки и попробовать инструменты, 
до которых давно не доходили руки.</p><p>Арендовать мощные VPS под 
ресурсоемкие задачи в текущих реалиях выходит неоправданно дорого. При 
этом дома у меня уже был выделенный неттоп (мини-ПК) с 16 ГБ оперативной
 памяти на базе энергоэффективного процессора Intel N95.</p><p>Пройдя 
путь от простых Bash-скриптов и сторонних туннелей до полностью 
автоматизированной инфраструктуры, я создал проект ServeHub-2. В этой 
статье я подробно разберу, как эволюционировала сеть проекта, почему 
декларативный подход победил императивный и с какими неочевидными багами
 пришлось столкнуться в процессе автоматизации.</p><h2>История настройки сетевой архитектуры</h2><h3>Использование Tuna</h3><p>В
 самом начале проекта я еще не думал о VPN как о способе пробития NAT и 
основе, на которой будет строиться вся система. Первое, к чему я пришел —
 сервис Tuna. Если кратко, это аналог Cloudflare Tunnel за условные 300 
рублей. У него очень приятный веб-интерфейс и невероятно простая 
настройка. Однако для полноценной независимой архитектуры он не подошел 
по двум причинам:</p><ul><li>Сервера Tuna находятся вне контроля пользователя.</li><li>На удаленном сервере нельзя развернуть свои сопутствующие сервисы.</li></ul><p>В целом сервис действительно удобный, но для моих задач он оказался слишком ограничивающим.</p><p>Вот
 пример конфига для tuna (все максимально просто, создаем контейнеры для
 ssh туннеля, чтобы был доступ ssh, а также основной http туннель с 
привязкой к nginx или любому другому прокси если такой есть):</p><h3>В поисках гибкости: тесты Pangolin и переход к FRP</h3><p>После Tuna я решил двигаться в сторону собственного контроля и попробовал Pangolin.
 Однако решение быстро отвалилось: для дешёвого сервера оно оказалось 
слишком «тяжёлым» и избыточным. Главные минусы — ощутимый оверхед по 
ресурсам и лишний слой принудительной веб-аутентификации перед самими 
сервисами. Это ломало нормальное взаимодействие с родными мобильными 
клиентами (вроде Element для Matrix или Bitwarden для паролей), где 
повторная авторизация в браузере просто не нужна.</p><p>На смену пришел FRP (Fast Reverse Proxy).
 Он выполнял ту же функцию проброса, но хостил я его уже на собственном 
арендованном VPS в режиме Layer 4 (TCP). Это дало абсолютную гибкость: 
внешний VPS не заглядывал внутрь пакетов и ничего не расшифровывал, а 
просто пересылал сырой поток домой. Кроме того, это отлично 
оптимизировало расходы: вместо 300 рублей за Tuna и ещё 300 рублей за 
отдельный VPN, я стал платить всего 500 рублей за один стойкий VPS, 
который мог настраивать как хочу. (к тому же можно было обойтись даже 
дешевле, так как VPS с 4 гб оперативки загружен всего лишь на 40%, 
процессор всего на 20%-40%)</p><p>FRP состоит из 2 конфигурационных 
файлов (один на удаленном сервере frp server, другой на локальном frp 
client), все также довольно просто, однако его можно использовать на 
разных слоях. У меня он брал трафик за стандартный TCP и передавал его 
на локальный сервер.</p><p>Также доп. фишка в том что основная 
конфигурация происходит именно в frpc, который, в свою очередь, передает
 часть настроек на frp на удаленном сервере.</p><p>frpc.toml:</p><p>frps.toml:</p><h3>Полноценный переезд на WireGuard (AmneziaWG) и 8 часов отладки</h3><p>Со временем архитектура эволюционировала в сторону полноценной VPN-сети на базе WireGuard, а точнее — его модификации AmneziaWG. Причин для этого шага было несколько:</p><ul><li>Безопасность: FRP всё же открывал внутренние ресурсы в публичный интернет, оставляя их доступными для сканеров портов.</li><li>Удобство маршрутизации:
 Все участники сети стали равноправными узлами в одной виртуальной 
локальной подсети. Больше не нужно было настраивать постоянные 
односторонние пробросы.</li><li>Дополнительный бонус:
 Поскольку удаленный VPS был куплен в Нидерландах, через этот же VPN я 
автоматически получил безопасный доступ ко всем зарубежным ресурсам.</li></ul><p>Для реализации схемы на удаленном VPS был развернут контейнер wg-easy с поддержкой AmneziaWG, а на домашнем мини-ПК — клиентский контейнер Amnezia (сборка из Dockerfile с использованием amnezia-tools  и модулем ядра хоста).</p><p>И
 именно здесь я поймал самый изнурительный баг проекта. После 
развертывания трафик упорно шёл только в одну сторону. Часов 8 ушло на 
диагностику iptables, маршрутов и чтение зарубежных форумов (что 
бесполезно, учитывая специфику наших блокировок). Оказалось, провайдер 
просто дропал обратный трафик стандартного WireGuard, так как пакеты шли
 без маскировки. Причина крылась в docker-compose.yml: у меня было прописано image: ghcr.io/wg-easy/wg-easy:latest. Как выяснилось, тег latest  на Docker Hub намертво прилип к старой 14-й версии, а поддержка параметров AmneziaWG появилась только в ветке 15.x. Изменение тега на конкретную версию (15.3) решило проблему за секунду.</p><p>Благодаря
 переходу конфигурация получилась максимально простой, основные отличия 
от стандартной документации выделил в коде: (в основном то, на что 
пришлось долго рыть информацию)</p><h3>Настройка Nginx</h3><p>Чтобы
 сервисы были доступны исключительно внутри подсети VPN, я задействовал 
Nginx. Доступ к приложениям был жестко ограничен на уровне конфигурации —
 веб-сервер принимает запросы только из диапазона IP-адресов 10.8.0.0/24. Любые попытки постучаться на сервер из внешнего интернета без активного VPN-туннеля автоматически сбрасываются Nginx.</p><p>Логика
 распределения завязана на proxy-протоколе: Nginx на удаленном VPS 
выступает основным входным узлом, принимает зашифрованный трафик, 
заворачивает его в заголовки с реальным IP-адресом клиента и через 
туннель перекидывает на локальный Nginx домашнего сервера. Локальный 
веб-сервер уже сам расшифровывает SSL и распределяет трафик по конечным 
Docker-контейнерам, сохраняя реальные IP в логах безопасности.</p><p>Вставлю
 один кусок кода из nginx на удаленной машине для примера, так все 
остальное примерно похоже (конфиги использовались в виде .template):</p><h3>SSL-сертификаты</h3><p>Для получения валидных SSL-сертификатов я настроил работу через автоматический Certbot по challenge-валидации DNS-01 c API Webnames. Сам домен привязан к внутреннему IP-адресу 10.8.0.1.
 Проверка через DNS позволила выпустить единый wildcard-сертификат на 
весь домен и его поддомены без необходимости держать открытым 80-й порт 
веб-сервера наружу.</p><p>Уточню, что certbot запускается автоматически 
во время выполнения Ansible плейбука, поэтому самому кроме указания 
переменных ничего делать не нужно.</p><p>В
 итоге получилась схема, при которой все сервисы доступны по красивым 
доменным именам с HTTPS, но абсолютно невидимы для внешнего интернета.</p><p>Вот настройка certbot:</p><h2>История софта</h2><p>Параллельно
 с сетевой структурой развивался и сам набор приложений. Изначально я 
хотел собрать в одном месте утилиты, которыми пользуюсь каждый день, но в
 процессе селфхостинга быстро понимаешь: нельзя просто накидать 
контейнеров и надеяться, что мини-ПК справится, а конфигурационные файлы
 не превратятся в кашу.</p><h3>Первый стек и оптимизация</h3><p>Первыми на домашнем сервере прижились медиа-сервисы: Navidrome для стриминга музыки и Audiobookshelf
 для аудиокниг и подкастов. Они легковесные, имеют отличные мобильные 
клиенты с синхронизацией прогресса и полностью закрывают мои 
потребности. Позже к ним добавился Nextcloud как единое независимое облако для файлов, контактов и семейных документов.</p><p>Затем встал вопрос безопасного хранения паролей. Сначала я смотрел в сторону оригинального Bitwarden, но в итоге я выбрал Vaultwarden
 — альтернативный сервер на Rust, полностью совместимый с API Bitwarden.
 Он потребляет считанные мегабайты оперативной памяти и работает 
идеально. Дополнительно для удобства управления всей этой распределенной
 Docker-инфраструктурой в локальный стек был добавлен Portainer. (+ Portainer Agent на удаленный сервер)</p><p>Из интересных моментов, где мне пришлось немного больше возиться, чем с остальными сервисами это nextcloud настройка:</p><h3>Ошибки проектирования: почему я удалил Matrix (Synapse)</h3><p>Не все решения прошли проверку временем. На этапе использования Tuna и FRP я развернул сервер Matrix (Synapse)
 для защищенного обмена сообщениями. Мне казалось это крутой идеей, но 
когда я окончательно перешел на AmneziaWG, целесообразность мессенджера 
внутри закрытого туннеля сошла на нет.</p><p>Synapse требовал слишком 
много ресурсов, впустую расходовал оперативку домашнего ПК и усложнял 
конфиг Nginx. При этом реальной пользы для семьи он не приносил. Для 
критических алертов инфраструктуры и повседневного общения проще и 
эффективнее оказалось использовать Telegram. (плюс алертинг настроен 
именно через него) В итоге я полностью выпилил Synapse из стека, 
освободив ресурсы.</p><p>Вместо него я добавил в связку к wg-easy локальный AdGuard Home.
 Теперь он работает прямо внутри VPN-сети: очищает весь трафик от 
рекламы и трекеров на лету, кэширует DNS-запросы и не дает истории 
веб-серфинга улетать внешним провайдерам.</p><p>Основной проблемой с 
которой я столкнулся при использовании AdGuard Home, так это то что я 
так и не понял как заставить использовать AmneziaVPN клиент AdGuard как 
основной DNS, при этом AmneziaWG работает прекрасно. Как я понимаю дело в
 том что AmneziaWG работает намного проще на уровне ip и у него нету 
никаких доп фильтров, настроек и подобного, поэтому он просто берет 
данные из конфига.</p><h3>От костылей на Bash к декларативному Ansible</h3><p>Весь
 стек на обоих серверах разворачивался через bash скрипты, что было уж 
очень плохо с точки зрения идемпотентности. Во первых из-за bash мне 
постоянно приходилось очищать сервера, так как нормальных проверок у 
меня не было и писать я их не хотел, а также было много костылей с 
импортом переменных, записями в файлы и подобным.</p><p>Так я пришел к декларативному подходу и Ansible.
 Теперь вся конфигурация описывается в виде плейбуков и ролей, 
отражающих конечное желаемое состояние серверов. Конфиденциальные данные
 перенесены в файл secrets.yml, а хрупкие конструкции 
автоматизированы через шаблоны Jinja2. Проект стал идемпотентным: если 
шаги уже выполнены, Ansible их просто пропускает.</p><p>В итоге 
получилось несколько yaml файлов для стандартной настройки системы 
(bootstrap_os.yml) и для настройки каждого из хостов (setup_local.yml и 
setup_remote.yml). В итоге теперь все что нужно чтобы полностью с нуля 
развернуть проект - скачать Ansible, несколько других зависимостей на 
свой рабочий пк и запустить один manage_deploy.sh, в котором можно будет
 выбрать сценарий как будет вести себя Ansible и спокойно дождаться 
разворачивания сервисов.</p><p>Также благодаря Ansible я удобно 
реализовал переносимость проекта. Так как я решил не использовать тома 
docker, и вместо этого храню все в папках, чтобы перенести старые данные
 проекта нужно просто скопировать папку apps-data и положить ее в нужное
 место и все само заработает после повторного развертывания проекта. В 
Ansible выделяется отдельная пауза для этого.</p><p>Вот пример основного плейбука deploy.yml:</p><h3>Тестирование мультидистрибутивности с помощью Vagrant</h3><p>Проект
 изначально затачивался под работу на трех дистрибутивах: Ubuntu, Debian
 и Arch Linux. Тестировать Ansible-плейбуки прямо на рабочей локальной 
машине (в моем случае — EndeavourOS) слишком рискованно, а создавать 
виртуальные машины руками — долго и неудобно.</p><p>Решением стал Vagrant,
 позволяющий за пару минут развернуть чистые ОС в VirtualBox из готовых 
образов. Но в процессе настройки мультивендорного стенда в режиме 
сетевого моста (public_network) всплыли две критические проблемы:</p><ol><li>Конфликт DNS:
 По умолчанию Vagrant создает NAT-интерфейс для управления нодой. При 
включении второго (публичного) интерфейса для локальной сети ломался 
дефолтный DNS-резолвер. Проблему пришлось решать принудительной очисткой
 и перезаписью файла /etc/resolv.conf через inline-скрипт автоматизации Vagrant.</li><li>Проблема с GRUB на Debian: В используемом базовом образе generic/debian12
 конфигурация GRUB сохраняла жесткую привязку к конкретному имени диска 
из окружения сборщика. При повторном развертывании плейбуков на тестовом
 стенде это приводило к сбоям загрузчика. Чтобы автоматизировать 
очистку, пришлось внедрить скрипт, который на лету определяет имя 
системного диска через lsblk и автоматически передает правильные параметры в загрузчик через утилиту debconf-set-selections.</li></ol><p>Вот код Vagrantfile: (в node.vm.provision происходит основное решение ошибок)</p><p>Надежная система бэкапов на базе BorgmaticДля создания резервных копий я внедрил Borgmatic
 (удобную надстройку над дедуплицирующим инструментом Borg Backup). Весь
 процесс автоматизирован с помощью связки системных юнитов borgmatic.service и borgmatic.timer. В бэкап уходят две ключевые директории: apps-data (конфигурации приложений и баз данных) и PersonalData (медиатека: музыка, книги, подкасты, файлы Nextcloud).</p><p>Развертывание
 системы бэкапов полностью берет на себя Ansible. Мне достаточно указать
 UUID внешнего жесткого диска — скрипт сам проверит его наличие в 
системе, примонтирует в нужную директорию, создаст зашифрованный 
репозиторий и настроит политику ротации (хранение 7 ежедневных, 4 
еженедельных и 6 ежемесячных копий). Также в Prometheus выведен 
мониторинг самого репозитория .borg для отслеживания его размера и статуса успешности архивации.</p><p>Главная
 проблема при бэкапе работающих Docker-контейнеров — риск скопировать 
базу данных в «битом» или неконсистентном состоянии, если в момент 
создания архива в нее шла активная запись. Чтобы решить эту проблему, я 
задействовал механизм хуков в конфигурации Borgmatic.</p><p>Перед началом резервного копирования автоматически срабатывает команда остановки контейнеров проекта (docker-compose down),
 а после успешного завершения (или в случае возникновения непредвиденной
 ошибки) контейнеры автоматически поднимаются обратно в фоновом режиме. 
Для удобного просмотра архивов и быстрого восстановления файлов я 
развернул веб-интерфейс Borg UI.</p><p>Конфигурация borgmatic: (использую как Jinja2 шаблон, чтобы Ansible в плейбуках сам подставил переменные)</p><h2>Наблюдаемость (Observability) уровня Enterprise</h2><p>В последних релизах (v1.2.0 и v1.3.0) фокус проекта сместился на мониторинг и работу с логами.</p><h3>Эволюция алертинга и переход на Gatus</h3><p>Изначально для мониторинга доступности я смотрел на Uptime Kuma, но отказался из-за отсутствия удобной декларативной настройки через конфиги. Затем я развернул связку Blackbox Exporter и Alertmanager
 с уведомлениями в Matrix. Но тут крылась логическая несостыковка: весь 
алертинг был завязан на локальном ПК, и в случае его аппаратного отказа я
 бы просто лишился уведомлений.</p><p>Тогда я решил вернуть Uptime Kuma,
 но развернуть его на удаленном VPS в качестве внешнего «сторожа» и 
автоматизировать его настройку через Python-скрипт с библиотекой uptime-kuma-api. Но и тут ждали «грабли» — библиотека не обновлялась три года и намертво ломалась на свежих версиях Kuma.</p><p>В итоге идеальным решением стал Gatus.
 Он изначально проектировался под управление через YAML-конфиги и 
поддерживает отправку алертов, если сервер не отвечает. Из-за специфики 
фронтенда Gatus (он не умеет работать из подкаталога типа /gatus), мне пришлось перенести его и wg-easy на полноценные субдомены gatus. и wireguard.</p><p>Для Gatus получился простой конфиг:</p><p>Для мониторинга аппаратных ресурсов удаленного и локального серверов была развернута связка node-exporter + cAdvisor. Все уведомления теперь приходят мгновенно в Telegram-бота. Чтобы 
избежать лавины одинаковых сообщений (например, при перезагрузке хоста),
 в Alertmanager настроена жесткая группировка и дедупликация событий. 
Также добавлен экспортер для AdGuard Home, выводящий статистику 
заблокированных запросов в Grafana.</p><h3>Централизованные логи: Loki + Grafana Alloy</h3><p>В релизе v1.3.0 в стек была добавлена централизованная система сбора логов Loki. Вместо устаревшего Promtail в качестве агента сбора я применил Grafana Alloy.</p><p>Он
 эффективно собирает логи со всех запущенных Docker-контейнеров, парсит 
их и передает в Loki. Теперь вся история событий, ошибок веб-сервера 
Nginx или падений внутренних приложений доступна в едином интерфейсе 
Grafana с возможностью удобной фильтрации через LogQL, что значительно 
упрощает отладку.</p><p>Конфиг Loki:</p><p>Конфиг Grafana Alloy: (локальный конфиг)</p><h2>Интерфейс: переход на Homepage</h2><p>Изначально для 
домашней страницы я написал кастомную минималистичную HTML-панель с 
Glassmorphism-дизайном. Выглядело это красиво, но добавлять новые 
сервисы вручную через постоянную правку исходного кода было крайне 
неудобно.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/8a8f2752-8aac-4aa5-898e-98affd01cdff.webp" alt="" /><figcaption>HTML + CSS</figcaption></figure><p>В итоге я заменил самописную страницу на полноценный комьюнити-проект Homepage.
 Это дало некоторую гибкость: вся панель настраивается через простые 
YAML-файлы и поддерживает встроенные виджеты интеграции. Пока что она 
простенькая, но возможно в будущем сделаю что-то более продвинутое.</p><figure><img src="https://media.tproger.ru/user-uploads/139471/2026-07-15/90c65d4a-1310-4a30-b1ad-9e4d3083959d.webp" alt="" /><figcaption>Homepage</figcaption></figure><h2>Заключение</h2><p>Постарался
 подробно рассказать о структуре проекта и как я к этому пришел, очень 
много я не добавил, если пост зайдет, то я обязательно более подробно 
пройдусь по некоторым моментам: как я настраивал Matrix и на каком 
моменте я решил его убрать, как собирал локальный amnezia 
контейнер-клиент, что нового я добавил в релизе 1.4.0 и другое.</p><p>Также
 я перешел с manage_deploy.sh на отдельный GUI клиент, который 
будет полностью автоматизировать процесс подготовки к deploy. (написан на Go Wails). Про это тоже возможно сделаю статью.</p><p>Вся кодовая база проекта, подробная документация, инструкции по развертыванию открыты и доступны для сообщества:</p><p>🔗 GitHub-репозиторий: <a href="https://github.com/canntstand/ServeHub-2" rel="noopener noreferrer nofollow">https://github.com/canntstand/ServeHub-2</a></p><p>Это
 моя первая статья на этом сайте и в то же время первый личный проект, которому я 
отдал так много времени (3 месяца). Буду рад вашему фидбеку в 
комментариях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Как приручить legacy-код: безопасная модернизация без заморозки фич</title>
      <link>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</link>
      <comments>https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[KODE]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki</guid>
      <description><![CDATA[<p>Как модернизировать legacy-код без остановки продукта: Strangler Fig Pattern, feature flags, shadow testing и безопасная миграция данных. Практика и антипаттерны.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-priruchit-legacy-kod-bezopasnaya-modernizaciya-bez-zamorozki">Как приручить legacy-код: безопасная модернизация без заморозки фич</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[ICO]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[OpenTelemetry]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[DeFi]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Legacy]]></category>
      <category><![CDATA[Техника]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 23 Jun 2026 06:16:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Legacy-код — одна из самых болезненных тем в инженерных командах. Обычно все понимают, что система устарела: архитектура мешает быстро выпускать изменения, новые фичи приходится встраивать через обходные пути, тесты либо неполные, либо отсутствуют, а любое изменение в одном модуле неожиданно ломает другой.</p><p>Но при этом к такому коду часто боятся прикасаться. И не без причины. В старых системах редко бывает понятная карта зависимостей. Документация устарела, часть знаний живет только в головах нескольких разработчиков, а бизнес при этом продолжает ждать новых релизов, интеграций и продуктовых экспериментов.</p><p>Так появляется классическая ловушка legacy: систему надо модернизировать, но остановить развитие нельзя. Переписать всё с нуля страшно, поддерживать как есть — всё дороже. В результате продукт обрастает временными решениями, скорость разработки падает, а стоимость каждого следующего изменения растет.</p><p>Хорошая новость в том, что модернизация legacy-кода не обязана быть большим взрывом. Старую систему можно менять постепенно, сохраняя рабочий продукт, не замораживая фичи и не устраивая один критический релиз, от которого зависит всё.</p><h2>Почему Big Bang-переписывание чаще всего заканчивается плохо</h2><p>Когда команда долго живет с устаревшей системой, идея переписать всё с нуля выглядит очень соблазнительно. Кажется, что можно наконец избавиться от технического долга, выбрать нормальную архитектуру, перепроектировать модули, покрыть всё тестами и начать «правильно».</p><p>На старте такой план часто звучит логично. Особенно если текущая система действительно мешает развитию. Например, мобильное приложение растет, у него уже миллионы пользователей, бэкенд написан несколько лет назад как монолит, а каждая новая фича требует изменений в десятке мест. Команда устала чинить регрессии, бизнес устал ждать, и всем хочется «один раз нормально переписать».</p><p>Проблема не в самой идее переписывания, а в условиях, при которых оно проваливается. Большой риск возникает, когда совпадают четыре фактора: переписывание занимает много месяцев, в это время бизнес продолжает развивать старую систему, новая версия покрывает сразу большую часть функциональности, а откат связан с миграцией данных. Если все четыре пункта присутствуют, Big Bang почти гарантированно превратится в долгий и дорогой проект.</p><p>Допустим, команда решила переписать модуль заказов в e-commerce-продукте. В старой версии есть корзина, промокоды, доставка и оплата. Команда планирует за полгода сделать новый сервис заказов. Но за эти полгода бизнес добавляет подписки, подарочные сертификаты, частичную оплату бонусами и новую логику возвратов. В итоге новая система, которую проектировали под старые требования, к моменту релиза уже нуждается в доработке.</p><p>Есть и другая проблема: большой релиз почти всегда несет максимальный риск. Если вы заменяете крупный кусок системы целиком, ошибка влияет сразу на большую часть пользователей. Откат тоже становится сложным, потому что новая логика уже связана с новыми данными, контрактами и интеграциями.</p><p>Big Bang всё-таки бывает оправдан — но в узких условиях. Если кодовая база молодая (год-два), пользователей мало, у системы нет критичного состояния в БД и продукт можно временно заморозить или вести в обоих контурах параллельно, полное переписывание может оказаться дешевле постепенной миграции. Это редкая ситуация, и она быстро исчезает по мере роста продукта. В зрелых системах безопаснее работает другой подход — постепенная архитектурная эволюция.</p><h2>Пример: как команда переписала сервис документов и потеряла полгода</h2><p>Команда сопровождала сервис — старый модуль на aiohttp с Pydantic v1, через который проходила вся обработка путевых листов и актов осмотра транспорта. Сервис существовал шесть лет, был покрыт тестами фрагментарно, а его API использовали мобильное приложение водителей, диспетчерская веб-панель и пакетный импорт.</p><p>Команда решила переписать сервис целиком: перейти на FastAPI, обновить Pydantic до v2, заодно почистить контракты и заменить внутреннее хранилище документов с MongoDB на PostgreSQL. План был рассчитан на четыре месяца.</p><p>Через восемь месяцев проект всё ещё не был готов к выкатке, а к десятому месяцу команда откатила миграцию полностью. Причин было несколько.</p><p>Во-первых, переписывание шло параллельно с продуктовой разработкой. За время миграции бизнес добавил два новых типа документов и изменил правила подписи актов. Новая система проектировалась под старые требования и к моменту готовности уже не соответствовала продукту.</p><p>Во-вторых, команда не написала характеристических тестов. Поведение «как есть» нигде не было зафиксировано, и расхождения находились только в продакшене после переключения.</p><p>В-третьих, у старого сервиса были скрытые побочные эффекты, о которых никто не помнил. При смене статуса документа публиковал событие в Kafka, которое читал биллинг и сервис аналитики. В новой реализации это поведение не было воспроизведено, потому что в коде оно выглядело как «лишний» вызов. После переключения биллинг перестал получать события, и расхождение обнаружили только через две недели — по жалобе финансового отдела.</p><p>В-четвёртых, переключение было сделано «в лоб»: маршрут в API Gateway просто перенаправили на новый сервис. Фича-флага не было, теневого запуска не было, плана отката не было. Когда выяснилось, что новый сервис строже валидирует исторические форматы документов и отклоняет часть старых записей, быстро вернуться на старую реализацию не получилось — её к тому моменту уже отключили на стенде, а в БД успели уйти записи в новом формате.</p><p>В итоге миграцию свернули, потратив около десяти человеко-месяцев и потеряв доверие бизнеса. Сервис до сих пор работает в исходной реализации, а команда переходит к плану, описанному ниже.</p><h2>Strangler Fig Pattern: как заменить систему по частям</h2><p>Один из самых практичных подходов к модернизации legacy-кода — Strangler Fig Pattern. В софтверном виде паттерн был сформулирован Мартином Фаулером в 2004 году под названием StranglerFigApplication. Идея проста: не переписывать систему целиком, а постепенно выносить отдельные части в новую реализацию.</p><p>Название пришло из биологии. Фикус-душитель растет вокруг дерева-хозяина и постепенно вытесняет его. В архитектуре принцип похожий: старая система продолжает работать, новая функциональность появляется рядом, а затем отдельные потоки постепенно переводятся на новую реализацию.</p><p>Представим старый монолит интернет-магазина. Внутри него есть каталог, корзина, заказы, платежи, скидки, личный кабинет и уведомления. Переписать всё сразу — рискованно. Но можно начать с относительно изолированного участка, например с уведомлений.</p><p>Сначала команда описывает текущий контракт: какие события приходят в модуль уведомлений, какие каналы используются, какие шаблоны отправляются, какие ошибки считаются допустимыми. Затем рядом создается новый сервис уведомлений, который реализует тот же контракт. На первом этапе он может даже не отправлять реальные сообщения, а только принимать события и логировать результат. После проверки часть трафика переводится на новую реализацию. Когда сервис стабилизируется, старый код уведомлений удаляется из монолита.</p><p>Strangler Fig хорошо работает там, где между старым и новым кодом есть сетевая граница: HTTP, message bus, RPC. Если такой границы нет — например, нужно постепенно заменить функцию или класс внутри одного процесса — используется родственный паттерн Branch by Abstraction: над старой реализацией создается абстракция, рядом пишется новая реализация, переключение происходит через конфигурацию или фича-флаг, после стабилизации старая ветка удаляется. Снаружи это выглядит как Strangler Fig, но без сетевого прокси.</p><p>Такой подход снижает риск. В системе нет одного большого релиза, где всё меняется сразу. Есть серия небольших контролируемых изменений. Каждое можно протестировать, измерить и откатить.</p><h2>Главное правило: сначала повторить поведение, потом улучшать</h2><p>Одна из частых ошибок при модернизации legacy-кода — попытка одновременно переписать систему и улучшить бизнес-логику. Команда смотрит на старый модуль и думает: «Раз уж мы его трогаем, давайте сразу сделаем нормальную архитектуру, изменим контракты, уберем странные кейсы и перепишем поведение».</p><p>Это опасный путь. В legacy-системах странное поведение часто существует не случайно. За ним может стоять неочевидное бизнес-правило, старый клиент, интеграция с внешней системой или исторический баг, на который уже кто-то завязался.</p><p>Например, в системе расчета налогов может быть правило: для контрактов, заключенных до 2018 года, НДС округляется в меньшую сторону до целого рубля, а для всех остальных — по математическим правилам. Новый разработчик может решить, что это ошибка, и «исправить» округление. Но потом выяснится, что часть крупных клиентов держит это поведение в своих сверках, а смена правила приведет к расхождениям в актах и претензиям.</p><p>Прежде чем менять поведение, его нужно зафиксировать. Для этого пишут характеристические тесты (characterization tests, иногда называемые golden master или approval tests). Идея простая: на реальных данных или их обезличенных копиях прогоняется старая реализация, её ответы сохраняются как эталон, и любые будущие изменения, отклоняющиеся от эталона, отлавливаются автоматически. Тесты пишутся не для красоты, а для того, чтобы зафиксировать существующее поведение — даже странное — перед тем, как его трогать. Подробно эта техника описана у Майкла Физерса в книге Working Effectively with Legacy Code; на практике её удобно реализовать через библиотеки семейства approval-tests (approvaltests-python, approvaltests-java и аналоги).</p><p>Поэтому первый этап модернизации — не улучшение, а воспроизведение текущего поведения. Новая реализация должна вести себя так же, как старая. Даже если старое поведение кажется странным. Только после стабилизации можно отдельно обсуждать, что именно стоит менять.</p><h2>Feature toggles: как включать новую логику без риска</h2><p>Feature toggles, или фича-флаги, — один из главных инструментов безопасной миграции. Они позволяют включать и выключать новую логику без деплоя.</p><p>В обычной разработке релиз часто выглядит бинарно: код либо выкатили, либо нет. При миграции legacy это неудобно. Гораздо безопаснее иметь возможность включить новую реализацию для 1% пользователей, затем для 10%, потом для половины аудитории и только после этого для всех.</p><p>Например, команда переносит расчет стоимости доставки из монолита в новый сервис. С помощью фича-флага это выглядит так:</p><p>user_id передается явно, чтобы решение «попал ли пользователь в новый сегмент» было стабильным от запроса к запросу. Иначе один и тот же клиент будет получать разные ответы при обновлении страницы, и поведение системы станет непредсказуемым.</p><p>На первом этапе флаг включают только для внутренней команды. Потом для тестового сегмента пользователей. Затем для небольшой доли реального трафика. Если метрики стабильны, долю увеличивают. Если появляются ошибки, флаг выключают, и пользователи снова идут в старую реализацию.</p><p>Важно различать два разных типа флагов. Флаг постепенной выкатки (rollout flag) меняется редко и контролирует, какой процент пользователей видит новую логику. Kill switch — отдельный флаг, единственная задача которого — мгновенно выключить новую реализацию при инциденте. Kill switch должен опрашиваться на каждом запросе, его кэширование должно жить секунды, а не минуты, и он принципиально не должен зависеть от той системы, которую он выключает. Иначе в момент аварии может оказаться, что выключатель сам недоступен.</p><p>В качестве инфраструктуры для флагов команды обычно берут одну из платформ: LaunchDarkly, Unleash, Flagsmith, GrowthBook, либо собирают собственную поверх Redis или конфигурационного сервиса. Для миграции важны три свойства: быстрое распространение изменений (секунды, а не минуты), поддержка таргетинга по пользователю/сегменту и аудит — кто и когда менял флаг.</p><p>Важно, что фича-флаг — это не просто if в коде. Для серьезной миграции нужны правила: кто может включать флаг, как быстро его можно отключить, какие метрики отслеживаются, когда флаг должен быть удален.</p><p>Последний пункт особенно важен. Если флаги не удалять, система быстро превращается в набор ветвлений, где никто уже не понимает, какая логика актуальна.</p><h2>Shadow testing: как проверить новую систему на реальном трафике</h2><p>Feature toggles помогают безопасно переключать пользователей. Но перед этим хорошо бы понять, совпадает ли новая логика со старой. Для этого используют shadow testing.</p><p>Shadow testing — это запуск новой реализации параллельно старой, но без влияния на пользователя. Пользовательский запрос по-прежнему обрабатывает старая система, а новая получает копию запроса и считает результат «в тени». Пользователю этот результат не показывается. Команда только сравнивает ответы.</p><p>Например, есть старый модуль расчета скидок. Он учитывает промокоды, сегмент пользователя, историю покупок, регион и партнерские условия. Команда пишет новый сервис скидок. Чтобы не переключать пользователей сразу, можно запустить теневой режим:</p><p>Два момента, на которые стоит обратить внимание в этом коде. Теневой вызов запускается через asyncio.create_task — корутина сразу планируется в event loop и начнёт выполняться, как только функция вернёт управление. И весь блок завернут в try/except: исключение в новой логике не должно ронять основной запрос. Без этих двух свойств shadow testing рискует ухудшить продакшен вместо того, чтобы безопасно его проверить.</p><p>Небольшая оговорка для продакшена: event loop держит на task только слабую ссылку, и без сохранённой ссылки задача может быть собрана сборщиком мусора прямо во время выполнения. В реальном коде Task имеет смысл класть в set фоновых задач и удалять оттуда через add_done_callback. В примере выше эта обвязка опущена для читаемости.</p><p>Для критичной доменной логики — платежей, биллинга, расчета тарифов — допустимый уровень расхождения должен быть около нуля: цель в shadow-режиме не «как можно меньше различий», а «понимаем каждое расхождение». Для менее чувствительных доменов (рекомендации, ранжирование результатов поиска) можно жить с расхождением в долях процента, но и там расхождения нужно классифицировать, а не игнорировать. Возможно, это баги новой реализации. А возможно, старая система содержит устаревшую логику, которую нужно отдельно обсудить с бизнесом.</p><p>Shadow testing особенно полезен для критичных доменных частей: платежей, биллинга, расчета тарифов, персональных предложений, транзакций. Там нельзя просто «попробовать на пользователях» и посмотреть, что будет.</p><p>При этом важно отличать теневую проверку чтения от теневой проверки записи. Чтение проверить относительно дёшево: запрос идёт в обе системы, ответы сравниваются, никаких внешних эффектов нет. С записью всё сложнее. Если новая реализация в shadow-режиме действительно создаст заказ, спишет деньги или отправит письмо, у пользователя возникнут двойные эффекты. Поэтому для writes либо вводят идемпотентные ключи и shadow-режим без реальных побочных действий (внешние вызовы заменены no-op-стабами, БД — отдельной shadow-копией), либо вообще отказываются от теневой проверки записи в пользу постепенной выкатки за фича-флагом.</p><p>Сравнение ответов в реальной системе тоже не сводится к одной функции compare. Нужно отдельно решать, как игнорировать «нормальный» шум (метки времени, идентификаторы, порядок коллекций), как сэмплировать трафик, чтобы не утопить хранилище расхождений, и как организовать триаж — кто и в каком ритме разбирает накопившиеся диффы. Готовые решения этого класса — GitHub Scientist (Ruby и его порты в другие языки), Twitter Diffy, либо собственный лёгкий регистратор поверх Kafka и таблицы расхождений.</p><h2>С чего начинать модернизацию</h2><p>Начинать лучше не с самого больного и не с самого центрального модуля. Это звучит контринтуитивно, потому что обычно хочется сразу взяться за главный источник проблем. Но если начать с ядра системы, команда быстро упрется в максимальное количество зависимостей и рисков.</p><p>Удобный способ выбрать первый кусок — оценить кандидатов по двум осям: насколько модуль критичен для бизнеса (low / high) и насколько сильно он связан с остальной системой (low / high). Начинать стоит с квадранта low-criticality + low-coupling: ошибки в нем не уронят бизнес-показатели, а малое количество зависимостей позволит провести миграцию полностью, не утянув за собой смежные модули. Высоко-критичные и сильно связанные части (платежи, ядро авторизации) трогают в последнюю очередь — на этот момент команда уже наберёт опыт безопасной миграции.</p><p>Хорошие точки входа обычно: уведомления, генерация отчетов, поиск, история операций, профиль пользователя, отдельная часть каталога. Важно, чтобы у команды была возможность описать контракт: какие данные входят, какие выходят, какие ошибки возможны, какие внешние системы участвуют.</p><p>Допустим, в банковском приложении есть старый модуль истории операций. Он медленный, сложно расширяется, но при этом не выполняет сами транзакции. Это хороший кандидат для первой миграции. Ошибка в истории операций неприятна, но обычно менее критична, чем ошибка в списании денег.</p><p>Команда может вынести чтение истории в отдельный сервис, сначала запустить его в shadow-режиме, потом включить для части пользователей, затем полностью перевести чтение на новую реализацию. При этом критичная транзакционная логика останется в старой системе до тех пор, пока команда не наберет опыт безопасной миграции.</p><h2>Миграция данных: самая сложная часть</h2><p>Большая часть статьи говорит о маршрутизации запросов и переключении трафика. Но в реальных проектах основная сложность лежит ниже — в данных. Старая и новая реализации почти всегда работают с общим состоянием: одной БД, одним хранилищем документов, одним набором очередей. Переехать туда «одним коммитом» нельзя.</p><p>Базовый рабочий приём — Expand-Contract (он же Parallel Change). Изменение схемы делается в три такта. На этапе expand в БД добавляются новые поля, таблицы или индексы, при этом старое поведение полностью сохраняется. Затем — migrate: обе реализации начинают писать и в старое, и в новое место (dual writes), а отдельный фоновый процесс делает backfill — заполняет новые поля историческими данными. После этого читатели по одному переключаются на новую схему. Только когда никто из читателей не использует старую структуру, наступает contract — удаление лишних колонок и таблиц.</p><p>Несколько практических деталей, которые часто упускают:</p><p>·         Dual writes — это не бесплатная операция. Две записи означают две точки отказа. Если одна из них упала, нужно решать, что делать: продолжать ли работу, ставить ли событие в очередь на повтор, помечать ли запись как несогласованную. Простое «сначала пишем туда, потом сюда» в продакшене на нагрузке приводит к расхождениям.</p><p>·         Backfill часто длиннее, чем кажется. На большой таблице миграция в одном UPDATE блокирует продакшен. Поэтому backfill делают батчами по N тысяч строк с паузами, отслеживают прогресс и предусматривают возможность остановить и продолжить.</p><p>·         Онлайн-изменения схемы на крупных таблицах делаются не штатным ALTER TABLE, а специализированными инструментами: gh-ost или pt-online-schema-change для MySQL, встроенные онлайн-механизмы PostgreSQL для индексов и колонок, Liquibase/Flyway — для управления версионированием изменений в репозитории.</p><p>·         Shadow testing данные не покрывает. Можно сравнить, что новая реализация возвращает то же, что и старая, но если за этим стоит другая схема в БД, проверка корректности самой миграции данных — это отдельная работа: сверки, контрольные суммы, выборочный аудит исторических записей.</p><p>Без этих шагов любая красивая фасадная архитектура наталкивается на разъезжающиеся данные — и тогда даже идеальный Strangler Fig снаружи не спасает.</p><h2>Прокси-слой как точка контроля</h2><p>Чтобы постепенно заменять legacy-код, нужно управлять маршрутизацией запросов. Для этого часто создают прокси-слой, API Gateway или фасад, через который проходит обращение к старой и новой логике. В терминах Domain-Driven Design такой слой часто называют Anti-Corruption Layer: он защищает новую реализацию от старых контрактов и наоборот, позволяя двум моделям сосуществовать без взаимного «загрязнения».</p><p>Без такой точки контроля миграция становится хаотичной. Часть клиентов ходит напрямую в старый модуль, часть — в новый, часть использует обходные пути, а команда теряет возможность централизованно переключать трафик.</p><p>Прокси-слой решает несколько задач. Он скрывает детали реализации от клиентов, позволяет направлять часть запросов в новую систему, поддерживает фича-флаги, собирает метрики и упрощает откат.</p><p>В качестве технической основы команды обычно берут один из трех вариантов: классический API gateway (Kong, AWS API Gateway), service mesh (Envoy, Istio) или более простой reverse proxy (NGINX, HAProxy). Service mesh особенно удобен, когда трафик уже идёт внутри Kubernetes-кластера: маршрутизацию можно менять конфигурацией, без правок кода клиентов и сервисов.</p><p>Например, мобильное приложение обращается к endpoint /orders/history. Раньше этот endpoint напрямую обслуживал монолит. После введения API Gateway приложение продолжает ходить по тому же контракту, но внутри gateway может решать, куда направить запрос: в legacy-модуль или новый сервис истории заказов.</p><p>Управление маршрутизацией обычно делается не «всё или ничего», а на основании атрибутов запроса: значения заголовка (X-Migration-Cohort: new), куки, хэша от user-id (стабильное разбиение пользователей на сегменты) или географического региона. Это позволяет выкатывать новую реализацию сначала на одну страну, на сотрудников самой компании или на тестовый сегмент — и только потом расширять охват.</p><p>Для клиента ничего не меняется. Для команды появляется управляемость.</p><h2>Наблюдаемость: без метрик миграция превращается в гадание</h2><p>Постепенная модернизация невозможна без нормальной наблюдаемости. Если команда не видит, что происходит внутри системы, она не сможет безопасно переключать трафик.</p><p>Минимальный набор — это логи, метрики и распределенная трассировка (distributed tracing). Нужно понимать, сколько запросов идет в старую и новую реализацию, сколько ошибок возникает, как меняется latency, где появляются таймауты, какие статусы возвращаются, какие бизнес-метрики проседают.</p><p>Технические метрики стоит формулировать не как «средний ответ» и «процент ошибок», а в терминах SLI и SLO: целевые показатели вида «99.9% запросов на /orders/history отвечают быстрее 300 ms за 30 дней» с явным error budget. Latency измеряется по перцентилям (p50, p95, p99) — среднее значение почти всегда обманчиво, а хвосты распределения говорят о реальном опыте пользователя. На время миграции имеет смысл выставить отдельные SLO для нового и старого пути и сравнивать их.</p><p>В качестве инструментов де-факто стандартом стал OpenTelemetry для трассировок, метрик и логов — единый протокол, который пишет в практически любое хранилище. Дальше — Prometheus и Grafana для метрик, Jaeger или Tempo для traces, Sentry или аналог для ошибок. Для миграции важна возможность фильтровать метрики по «варианту» — отдельно по старому и новому пути — иначе все цифры смешаются и реальную динамику будет не видно.</p><p>Технических метрик недостаточно. Если команда переносит оформление заказа, важно смотреть не только на 500 ошибки и время ответа, но и на конверсию в оплату, количество брошенных корзин, повторы запросов, обращения в поддержку.</p><p>Пример: новая система формально отвечает быстрее старой и не дает ошибок. Но после включения на 10% пользователей падает конверсия в оплату. Причина может быть не в серверной ошибке, а в изменении порядка полей, другом тексте сообщения или потере какого-то edge-case. Без бизнес-метрик команда может решить, что миграция успешна, хотя для продукта она уже создает проблему.</p><h2>Практическая последовательность миграции</h2><p>Рабочая последовательность обычно выглядит так.</p><p>Сначала команда выбирает ограниченный участок системы. На этом этапе важно не просто назвать модуль, а описать его границы. Какие сценарии он закрывает? Кто его вызывает? Какие данные он читает и пишет? Какие внешние интеграции использует? Какие неочевидные бизнес-правила в нем есть?</p><p>Затем поверх legacy-логики создается стабильный контракт. Это может быть API, фасад, gateway или отдельный слой внутри приложения. Главная задача — сделать так, чтобы клиенты зависели не от внутренней реализации, а от понятного интерфейса. На этом этапе полезно вспомнить про contract testing (Pact, Spring Cloud Contract): автотесты со стороны потребителей фиксируют, что именно они ожидают от API, и предупреждают о ломающих изменениях до того, как они доедут до продакшена.</p><p>После этого рядом пишется новая реализация. Она должна повторять текущее поведение, а не сразу становиться «идеальной версией будущего». На этом этапе полезно фиксировать все расхождения: где старая система работает странно, где требования не описаны, где бизнес-правила требуют уточнения.</p><p>Следующий этап — shadow testing. Новая система получает копии реальных запросов, считает результат, но пользователю по-прежнему возвращается ответ legacy. Команда сравнивает результаты и устраняет расхождения.</p><p>Когда новая реализация достаточно стабильна, начинается постепенное переключение через feature toggles. Сначала внутренние пользователи, потом 1% реального трафика, затем 5–10%, затем 50% и только после этого 100%.</p><p>На каждом этапе команда смотрит на метрики. Если всё стабильно, движение продолжается. Если появляются проблемы, флаг выключается, трафик возвращается в legacy, а команда разбирает причины.</p><p>Последний этап — удаление старого кода. Это не формальность, а обязательная часть миграции. И «удалить старый код» — это не один коммит, а явный Definition of Done: вырезана старая ветка кода, удалён фича-флаг, обновлена документация и схемы архитектуры, переименованы или удалены устаревшие дашборды и алерты, обновлены runbook’и для on-call и проведено короткое внутреннее обучение. Если этого не сделать, через полгода никто уже не вспомнит, какой путь актуален, и легаси-ветвление останется в коде навсегда.</p><h2>Откат миграций: дешёвый только пока не пошли записи</h2><p>Откатить миграцию, в которой ещё не было записи в БД, легко: достаточно переключить фича-флаг, и трафик снова идёт через старую реализацию. Откатить миграцию, в которой новая система уже неделю писала данные в новые таблицы, — отдельный, гораздо более тяжёлый разговор.</p><p>Поэтому ещё на этапе проектирования каждое изменение должно сопровождаться явным планом отката. Удобно различать три типа шагов.</p><p>Полностью обратимые шаги. Чтение через новый сервис, расчёт «в тени», новые метрики. Откат — выключить флаг. Это самый комфортный режим, и в нём стоит держать миграцию как можно дольше.</p><p>Обратимые с компенсацией. Новая реализация пишет дополнительные данные (например, дублирует операции в новую таблицу), но старый источник тоже обновляется. Откат возможен, но требует решить, что делать с уже записанными данными: оставить, очистить, синхронизировать. План этих действий должен быть написан до выкатки, не во время инцидента.</p><p>Forward-only. После некоторой точки откат становится невозможен — например, после того, как старая схема удалена или внешние интеграции перенастроены на новый сервис. Такие шаги допустимы, но к ним нужно приходить отдельно, осознанно, с особенно строгими SLO в предыдущем этапе. До forward-only-перехода имеет смысл подержать систему в режиме параллельной работы дольше, чем по графику.</p><p>Базовое правило: ни один шаг миграции не должен уходить в продакшен, если у команды нет письменного ответа на вопрос «как мы откатываемся в случае проблемы». Иначе при инциденте откатываться будут на ходу — и не факт, что успешно.</p><h2>Пример: как тот же сервис мигрировали со второй попытки</h2><p>После неудачного опыта команда взялась за тот же сервис заново, но изменила подход.</p><p>На первом шаге они зафиксировали поведение существующего сервиса. На самые часто используемые сценарии (создание путевого листа, подпись акта осмотра, выгрузка пакета документов за период) написали характеристические тесты на реальных продакшен-данных, обезличенных и сохранённых как фикстуры. Любое будущее изменение поведения теперь падало в CI как явное расхождение.</p><p>Параллельно команда провела инвентаризацию побочных эффектов. Из исходного кода и логов выяснилось, что сервис не только хранит документы, но и: публикует событие в Kafka при смене статуса, инкрементирует счётчик в Redis для рейтинга водителей, отправляет webhook во внешнюю систему партнёра, пишет в таблицу аудита. Каждый из этих эффектов попал в отдельный пункт чек-листа «что должно остаться» в новой реализации.</p><p>Затем команда выбрала первый кусок для выноса — не весь сервис, а только чтение документов (GET /documents/{id} и GET /documents/by-driver/{driver_id}). Это была наименее рискованная часть: ошибки в чтении неприятны, но не ломают финансовые потоки.</p><p>Новый сервис написали на FastAPI рядом со старым. На уровне API Gateway появилось правило маршрутизации: запросы на чтение шли в старый сервис, но в фоне дублировались в новый. Ответ пользователю всегда возвращал legacy, а ответ нового сервиса сравнивался с эталоном и записывался в отдельную таблицу для разбора. Использовали обёртку поверх asyncio.create_task — на ответ пользователя теневой вызов не влиял.</p><p>За три недели shadow-режима команда нашла четыре расхождения. Два оказались багами новой реализации (округление времени, неправильная сортировка вложений). Два — давно забытыми особенностями старого сервиса (одно поле возвращалось в UTC, другое — в локальной зоне; так было исторически, бизнес не возражал, но в новой реализации захотели единый формат). Все четыре зафиксировали явно: баги — починили, особенности — согласовали с продуктовой командой как осознанное изменение.</p><p>Когда расхождений не осталось, включили фича-флаг на сотрудников самой компании. Через неделю — на 1% реальных водителей. Дальше шаг по 5%, 25%, 50%, 100% с паузой в несколько дней между этапами. На каждом шаге следили не только за HTTP-ошибками и latency, но и за продуктовыми метриками: количество подписанных актов, время от открытия документа до подписи, доля повторных запросов. Один раз пришлось откатиться с 25% на 5% — в одном из регионов выросло время отклика из-за неэффективного запроса. Исправили, выкатили снова.</p><p>Через два месяца чтение полностью перешло в новый сервис. Старый код чтения и фича-флаг удалили в том же релизе. После этого по той же схеме мигрировали запись документов, потом публикацию событий, потом импорт из внешних систем. Полная миграция заняла девять месяцев — почти столько же, сколько провалившийся Big Bang, — но продукт всё это время продолжал развиваться, инцидентов не было, и в конце команда осталась с системой, которую понимает.</p><h2>Типичные ошибки при работе с legacy</h2><p>Первая ошибка — пытаться улучшить всё сразу. Команда одновременно меняет архитектуру, бизнес-логику, контракты и инфраструктуру. В результате становится невозможно понять, какая именно часть вызвала проблему. Правильнее сначала воспроизвести поведение, стабилизировать новую реализацию и только потом улучшать.</p><p>Вторая ошибка — недооценивать скрытые зависимости и побочные эффекты. Legacy-код часто делает больше, чем кажется. На один и тот же вызов могут быть навешаны: запись в таблицу аудита, инкремент счётчика в кэше, публикация события в очередь, обновление статуса связанной сущности, инвалидация кэша, дёрганье webhook’а во внешнюю систему. Если в новой реализации воспроизвести только явный путь, скрытые потребители молча перестанут получать данные — и узнают об этом через жалобу бизнеса, а не через ошибку в логах. Поэтому перед выносом любого модуля имеет смысл составить инвентаризацию побочных эффектов: пройтись по коду и логам и выписать каждое нелогичное действие отдельным пунктом чек-листа.</p><p>Третья ошибка — отсутствие наблюдаемости. Без логов, метрик и трассировки команда не управляет миграцией, а угадывает. Особенно опасно смотреть только на технические ошибки и игнорировать бизнес-показатели.</p><p>Четвертая ошибка — не договариваться с бизнесом. Модернизация не должна быть невидимой «инженерной активностью в стол». Её нужно встраивать в roadmap, объяснять эффект и договариваться о приоритетах. Если бизнес не понимает, зачем команда тратит время на миграцию, работа будет постоянно проигрывать новым фичам.</p><p>Пятая ошибка — не удалять старый код. Временное сосуществование старой и новой логики нормально. Вечное сосуществование — нет. Если legacy не удаляется, технический долг не уменьшается, а просто меняет форму.</p><p>Шестая ошибка — не удалять фича-флаги после миграции. Флаг, который сыграл свою роль и больше никогда не выключается, превращается в постоянное ветвление в коде. Через год команда не помнит, можно ли удалить такую ветку или там сидит важный edge-case. Через два — кода с такими «мёртвыми» флагами становится больше, чем основной логики. Поэтому каждый флаг должен заводиться с условием удаления («после полной выкатки и двух недель стабильной работы») и иметь ответственного, кто этим удалением займётся.</p><p>Отдельно стоит упомянуть организационную сторону. Закон Конвея работает и в обратную сторону: если новый и старый код владеются разными командами с разными приоритетами, миграция будет тормозиться независимо от выбранного паттерна. На время миграции имеет смысл явно проговорить, кто отвечает за переход, и не разделять старую и новую реализации между несовместимыми roadmap’ами.</p><h2>Компромиссы, к которым нужно быть готовыми</h2><p>Постепенная модернизация безопаснее Big Bang-переписывания, но она не бесплатна. Некоторое время система будет сложнее, чем раньше. В ней появятся старый и новый код, прокси-слой, фича-флаги, дублирование логики, дополнительные метрики.</p><p>Shadow testing увеличит нагрузку на инфраструктуру, потому что часть запросов будет обрабатываться дважды. Команде придется поддерживать дисциплину: документировать контракты, отслеживать флаги, удалять старую реализацию после миграции, поддерживать contract-тесты в актуальном состоянии.</p><p>Но это контролируемая сложность. Она распределена во времени и управляется инженерными практиками. В отличие от Big Bang-риска, где команда долго работает с минимальной обратной связью, а потом выкатывает один большой релиз с максимальной неопределенностью.</p><h2>Когда Strangler Fig особенно оправдан</h2><p>Постепенная миграция особенно хорошо подходит для систем, где downtime невозможен или слишком дорог. Это финтех, e-commerce, биллинг, мобильные бэкенды с большой аудиторией, высоконагруженные продукты, старые монолиты и системы с большим количеством интеграций.</p><p>Если продуктом ежедневно пользуются сотни тысяч или миллионы людей, нельзя позволить себе «переписать и посмотреть, что будет». Нужно менять архитектуру так, чтобы пользователь не замечал процесса миграции.</p><p>Этот подход также полезен там, где бизнес продолжает активно развивать продукт. Если фичи нельзя заморозить на полгода, модернизация должна идти параллельно с продуктовой разработкой.</p><h2>Когда модернизацию лучше не делать</h2><p>Постепенная миграция — мощный инструмент, но у неё тоже есть стоимость, и иногда правильный ответ — оставить систему как есть. Несколько сценариев, в которых модернизация плохо окупается.</p><p>Продукт, который уходит из эксплуатации. Если через год сервис будет выключен или заменён на покупное решение, тратить квартал на его рефакторинг бессмысленно. Достаточно стабилизировать то, что есть.</p><p>Модуль, который никто не трогает. Если код десятилетней давности продолжает работать, не падает, не требует изменений и не вызывает инцидентов, его «уродливость» — не повод его переписывать. Цель модернизации — упростить будущие изменения; если будущих изменений нет, цели тоже нет.</p><p>Регулируемые системы с тяжёлой ресертификацией. В банковских, медицинских и государственных контурах любое изменение в критичной системе может потребовать повторной сертификации, перепрохождения аудитов, обновления договорной обвязки. В таких условиях стоимость модернизации может на порядок превышать стоимость поддержки текущей реализации, и решение нужно принимать вместе с владельцем продукта и юристами, а не только инженерным составом.</p><p>Простой тест: если на вопрос «какой бизнес-сценарий мы откроем после миграции» нет внятного ответа — модернизацию имеет смысл отложить и заняться чем-то другим.</p><h2>Что получает команда</h2><p>Главный результат постепенной модернизации — управляемость. Команда начинает лучше понимать систему, контролировать изменения и снижать риск инцидентов.</p><p>Появляются понятные контракты, наблюдаемость, практика безопасных релизов, культура удаления старого кода. Разработчики перестают бояться legacy, потому что у них появляется метод, а не только желание «когда-нибудь всё переписать».</p><p>Для бизнеса это тоже выгодно. Продукт продолжает развиваться, сроки становятся более прогнозируемыми, риски крупных сбоев снижаются, а технический долг постепенно уменьшается.</p><h2>Модернизация — это процесс, а не проект</h2><p>Legacy нельзя «починить за квартал». Если система развивалась годами, она не станет простой после одного рефакторинга. Но её можно системно улучшать.</p><p>Strangler Fig Pattern, Branch by Abstraction, feature toggles, shadow testing и аккуратная миграция данных дают рабочую модель: выбрать ограниченный участок, описать контракт, реализовать новую версию, проверить её на реальном трафике, постепенно переключить пользователей и удалить старый код.</p><p>Это не самый быстрый путь. Зато он управляемый. А в зрелых продуктах управляемость важнее скорости.</p><p>Потому что цель модернизации — не написать красивую новую систему. Цель — сделать так, чтобы продукт продолжал развиваться, команда могла безопасно вносить изменения, а пользователи не становились участниками инженерного эксперимента.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Ruby 4.0: новый JIT и экспериментальная изоляция кода Ruby Box. Что еще нового</title>
      <link>https://tproger.ru/news/vywel-ruby-4-0--novyj-jit-i-eksperimentalnaya-izolyaciya-koda-ruby-box--chto-eshhe-novogo</link>
      <comments>https://tproger.ru/news/vywel-ruby-4-0--novyj-jit-i-eksperimentalnaya-izolyaciya-koda-ruby-box--chto-eshhe-novogo?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vywel-ruby-4-0--novyj-jit-i-eksperimentalnaya-izolyaciya-koda-ruby-box--chto-eshhe-novogo</guid>
      <description><![CDATA[<p>Вышел Ruby 4.0: язык получил экспериментальную изоляцию Ruby Box, новый JIT-компилятор ZJIT, ускорения производительности, улучшенный параллелизм и обновления стандартной библиотеки</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vywel-ruby-4-0--novyj-jit-i-eksperimentalnaya-izolyaciya-koda-ruby-box--chto-eshhe-novogo">Вышел Ruby 4.0: новый JIT и экспериментальная изоляция кода Ruby Box. Что еще нового</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Dec 2025 04:06:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Состоялся <a href="https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/">релиз</a> <b>Ruby 4.0</b>. Это достаточно крупное обновление, которое делает язык быстрее, безопаснее и заметно взрослее с точки зрения архитектуры.</p><p>В центре релиза сразу две большие новинки: <b>экспериментальная система изоляции Ruby Box</b> и <b>новый JIT-компилятор ZJIT</b>.</p><p>Параллельно разработчики серьезно прокачали параллелизм, производительность и стандартную библиотеку.</p><h2>Ruby Box: изоляция без контейнеров и процессов</h2><p>Ruby Box — это новый экспериментальный механизм изоляции кода. Он позволяет запускать определения классов, модулей, глобальных переменных и даже подключение библиотек в отдельном «боксе», изолированном от остальной программы.</p><p>Включается он через переменную окружения RUBY_BOX=1, а основной интерфейс — класс Ruby::Box.</p><p>Идея проста: <b>изолировать побочные эффекты</b>. Monkey patch больше не должен ломать соседние тесты или весь процесс.</p><p>Среди предполагаемых сценариев — запуск тестов с агрессивными патчами, параллельный запуск нескольких версий веб-приложения для blue-green деплоя и эксперименты с зависимостями в одном Ruby-процессе.</p><p>В перспективе, Ruby Box может стать фундаментом для более высокого уровня модульности и «пакетной» системы, хотя пока это именно низкоуровневый API.</p><h2>ZJIT: новый курс для производительности</h2><p>Вторая ключевая новинка — ZJIT. Это новый just-in-time компилятор следующего поколения. Он должен прийти на смену YJIT и строится как более классический <i>метод-ориентированный</i> JIT с SSA-представлением.</p><p>ZJIT написан с расчетом на расширяемость и вклад сообщества, но требует Rust 1.85 и новее для сборки.</p><p>Сейчас <b>ZJIT быстрее интерпретатора</b>, но <b>все еще уступает YJIT</b>. Да и сами разработчики языка открыто предупреждают — да, экспериментировать можно. Но в продакшен лучше пока с новинкой не лезть. Цель — сделать ZJIT быстрее YJIT и полностью готовым к бою уже в Ruby 4.1.</p><h2>Ractor становится ближе к «неэкспериментальному»</h2><p>Параллелизм в Ruby тоже заметно продвинулся. Ractor получил новый механизм синхронизации Ractor::Port, упрощающий обмен сообщениями, а внутренние структуры были переработаны для снижения блокировок и конкуренции за CPU-кэш.</p>]]></content:encoded>
    </item>
    <item>
      <title>Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</title>
      <link>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</link>
      <comments>https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Жукова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka</guid>
      <description><![CDATA[<p>Выбираете первый язык программирования? Узнайте о низкоуровневых (C, C++), среднеуровневых (Java, C#) и высокоуровневых (Python, JavaScript) языках: плюсы, минусы и примеры применения. Чек-лист от экспертов поможет новичкам выбрать язык для веб, мобильной разработки или игр.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tipy-yazykov-programmirovaniya--ot-nizkourovnevyh-do-vysokourovnevyh---kak-vybrat-dlya-novichka">Типы языков программирования: от низкоуровневых до высокоуровневых — как выбрать для новичка</a>»</p>]]></description>
      <category><![CDATA[Низкоуровневое программирование]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Xamarin]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 28 Oct 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для погружения в программирование нужно всего 3 вещи:</p><ul><li>Решить, с какого языка/технологии вы хотите начать.</li><li>Решить, на каком ресурсе вы хотите обучаться.</li><li>Выделить время на само программирование.</li></ul><p>Звучит просто, однако у вас уйдёт много времени на исследования, чтобы решить, что вам подходит и на каком ресурсе обучаться.</p><p>Некоторые люди начинают с относительно низкоуровневого программирования на C и C++. Другие выбирают более традиционный путь, изучая Java или C#. Есть и те, кто начинает с высокоуровневых или скриптовых языков вроде Python, Ruby или JavaScript.</p><p>Мы классифицируем языки по уровню абстракции. Для новичков: низкоуровневые — как ручная сборка машины (контроль, но сложный); среднеуровневые — как готовый конструктор с инструкцией (сохраняем баланс); высокоуровневые — как приложение на смартфоне (быстро, но меньше контроля). Ниже разберём плюсы и минусы и поможем сделать правильный выбор.</p><h2>Низкоуровневые языки: близко к «железу»</h2><p>Это языки, где вы напрямую работаете с памятью компьютера. Нет автоматической уборки ненужных данных, <b>всё под вашим контролем</b>. Подходят для системного ПО, игр или устройств (например, микроконтроллеров).</p><p>Примеры: C (для ОС вроде Linux), C++ (для игр на движке вроде Unreal Engine), Assembler (для оптимизации критических частей кода).</p><p><b>Плюсы:</b></p><ul><li>Полный контроль: вы решаете, как использовать ресурсы. Так, в C++ можно вручную выделять память для массивов, избегая ненужных копий данных.</li><li>Высокая скорость: прямой доступ к памяти позволяет писать код, который работает быстрее (это важно для работы с играми или серверами).</li><li>Основы основ: такие языки учат, как компьютер работает изнутри, чтобы в будущем ценить удобства других языков. Например, вы узнаёте, почему «утечка памяти» — это проблема.</li><li>Эффективность: низкоуровневые языки мотивируют думать об оптимизации заранее, снижая расход батареи или CPU.</li><li>Компактность: минимальная библиотека, приложения получаются лёгкими (идеально для embedded-систем, как в IoT-устройствах).</li></ul><p>Минусы:</p><ul><li>Всё-таки это сложно: рутинные задачи (например, чтение файла) требуют больше кода и внимания к деталям, рискуя ошибками вроде переполненного буфера.</li><li>Ручное управление памятью: можно легко «забыть» освободить память, вызвав утечки или краши. Например, в C нужно использовать malloc/free, иначе программа съест всю RAM.</li><li>Много копипасты: придётся писать шаблонный код, и делать это часто.</li><li>Платформо-зависимость: код для Windows может не работать на Linux без правок.</li></ul><h2>Среднеуровневые языки: баланс контроля и удобства</h2><p>Эти языки предлагают готовые инструменты, упрощающие работу, но требуют строгой проверки типов данных. Для их запуска нужна специальная программа (среда выполнения). Они идеальны для приложений, серверов и игр.</p><p>Примеры: Java (для Android-приложений), C# (для Unity-игр или .NET-серверов).</p><p>Плюсы:</p><ul><li>Автоматическая память: память очищается автоматически благодаря сборщику мусора, что избавляет от ручной работы и снижает вероятность ошибок, вроде утечек памяти в больших проектах. При этом можно получить доступ к низкоуровневым функциям для особых задач, например, через специальные инструменты в Java.</li><li>Богатые библиотеки: готовые инструменты для сетей, GUI или баз данных. Пример: Java’s Spring для веб-серверов.</li><li>Кроссплатформенность: компиляция в байт-код (JVM для Java) позволяет запускать код везде. Например, пишешь на Windows, запускаешь на Linux.</li><li>Безопасность: язык проверяет типы данных перед запуском программы, помогая заранее найти ошибки. Среда выполнения защищает от опасных сбоев, например, от переполненной памяти.</li><li>Масштабируемость: встроенные инструменты для параллельных вычислений позволяют легко создавать программы, которые одновременно выполняют много задач (серверы для тысяч пользователей и т.п.).</li></ul><p>Минусы:</p><ul><li>Дополнительная нагрузка от рантайма: Среда выполнения и автоматическая очистка памяти создают дополнительную нагрузку. Сборщик мусора может ненадолго останавливать программу, что заметно в играх или при обработке видео.</li><li>Меньше контроля: абстракции скрывают детали памяти, усложняя оптимизацию (например, в Java сложно избежать боксинга примитивов).</li><li>Повторяющийся код, которого много: приходится писать повторяющийся код и тренировать свою усидчивость, например, для доступа к данным объекта. Кстати, инструменты вроде Lombok могут упростить эту задачу.</li><li>Зависимость от среды: для запуска программ нужна специальная среда (например, JVM для Java), что влияет на размер программ и замедляет их старт.</li><li>Сложность интеграции: подключение кода на других языках, например, на C, требует писать специальные обёртки, что усложняет работу и снижает скорость.</li></ul><h2>Высокоуровневые языки: удобство и скорость разработки</h2><p>Эти языки скрывают технические детали, позволяя сосредоточиться на создании <b>логики программы</b>. Подходят для веба, data science или скриптов.</p><p>Примеры: Python (для ML), Ruby (для веб-разработки), JavaScript (для фронтенда).</p><p>Плюсы:</p><ul><li>Простота: сложные задачи решаются в пару строк. Так, в JS async/await упрощает API-запросы.</li><li>Быстрая разработка: динамическая типизация позволяет быстро писать и тестировать код без необходимости его компиляции.</li><li>Богатые экосистемы: есть библиотеки для всего (к примеру, NumPy для данных в Python).</li><li>Гибкость: легко менять код, идеально для прототипов или стартапов.</li></ul><p>Минусы:</p><ul><li>Низкая производительность: абстракции добавляют нагрузки. Например, циклы в Python медленнее, чем в C.</li><li>Ошибки на рантайме: из-за слабой типизации ошибки выявляются только при запуске программы, что усложняет отладку.</li><li>Риск «спагетти-кода»: лёгкость изменений может привести к хаосу без дисциплины.</li><li>Скрытые проблемы: абстракции маскируют баги.</li><li>Зависимость от интерпретатора: программы требуют установленного интерпретатора, что замедляет их запуск и добавляет зависимость от дополнительного ПО.</li></ul><h2>Чек-лист: как выбрать язык программирования для новичка</h2><p>Этот чек-лист основан на советах экспертов, чтобы помочь новичкам выбрать первый язык программирования. Каждый пункт включает конкретные рекомендации.</p><ol><li><b>Определите, что вас вдохновляет, и выберите сферу.</b> Подумайте, что вы хотите создавать: сайты, игры, мобильные приложения или серверы. Разные сферы требуют разных языков. Например, для веб-разработки подойдут JavaScript или Python, для мобильных приложений — Java, Kotlin, Swift или Dart, а для игр — C# или C++. Составьте список идей (например, сайт-визитка, игра, аналитика данных) и найдите, какие языки для них используют. <br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Ищите язык с широким применением.</b> Выбирайте языки, которые используются в разных областях, чтобы легче переключаться между задачами. Например, Kotlin подходит для мобильной разработки, веба и серверов, а C# — для десктоп-приложений, игр (Unity) и бэкенда. Это даёт гибкость и упрощает изучение новых языков в будущем.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Проверьте спрос на рынке труда. </b>Если цель — смена профессии, изучите вакансии на HH.ru или LinkedIn. Введите «junior Python», «junior Java» и сравните, где больше предложений и какие требования. Избегайте языков с низким спросом, если хотите быстро найти работу. Например, Java, Kotlin, Python и JavaScript популярны для найма.<br />— Владислав Масунов, Head of Development</li><li><b>Опробуйте языки на практике.</b> Напишите простые программы (например, "Hello World" или калькулятор) на нескольких языках, чтобы понять, какой синтаксис вам ближе. Используйте онлайн-редакторы вроде Replit или CodePen. Например, попробуйте TypeScript для веба (он поддерживает типизацию и разные подходы к программированию) или C++ для понимания работы с памятью. Это поможет почувствовать, к чему лежит душа.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS; Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Выберите язык с хорошей документацией и сообществом.</b> Убедитесь, что у языка много обучающих материалов и активное сообщество. Например, TypeScript имеет богатую документацию и поддержку, что упрощает старт. Проверьте ресурсы вроде LearnPython.org, freeCodeCamp для JavaScript или Telegram-чаты для C++. Это поможет быстрее решать вопросы.<br />— Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Учитывайте сложность и карьерные цели.</b> Для небольших проектов или быстрого старта берите Python или PHP — они проще и подходят для веб-разработки или скриптов. Для сложных задач с высокой нагрузкой (например, серверы или оптимизация) попробуйте C++ или Go. Если цель — работа в крупных компаниях, Java и Kotlin востребованы и часто используются с ИИ-инструментами. Выбирайте, исходя из сложности и ваших амбиций.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Смотрите на универсальность и переход к другим языкам. </b>Выбирайте язык, который учит основам программирования и упрощает переход к другим. Например, изучение C# может помочь освоить Java, а затем — Android-разработку. TypeScript учит объектно-ориентированному и функциональному программированию, что полезно для разных задач. Это создаёт базу для дальнейшего роста.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH; Рома Троицкий, фронтенд-инженер в Сбер B2C, член ПК HolyJS &amp; MoscowCSS</li><li><b>Не гонитесь за гилти плежа.</b> Избегайте языков, которые изучают «для удовольствия» без практического применения. Выбирайте те, которые можно применить в реальных проектах или которые востребованы в индустрии. Например, вместо нишевых языков берите Python, Java или Kotlin: они имеют чёткие сценарии использования.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li><li><b>Практикуйтесь с ИИ-инструментами.</b> Если хотите работать в крупных компаниях, освойте язык, который хорошо сочетается с ИИ-инструментами (например, Go или Java). Практикуйтесь с ИИ-агентами по типу GitHub Copilot для автоматизации задач — это ценится работодателями.<br />— Евгений Антонов, ИТ-консультант, автор тг-канала <a href="https://t.me/general_it_talks">@general_it_talks</a></li><li><b>Составьте план развития.</b> Создайте roadmap: определите, какие проекты хотите делать через 3-6 месяцев (например, мобильное приложение или веб-сервис), и подберите язык под эти цели. Если выбрали C#, начните с десктоп-приложений, затем попробуйте Xamarin для кроссплатформенной разработки. Постепенно добавляйте новые языки, опираясь на первый.<br />— Аня Жаркова, руководитель мобильной разработки в USETECH</li></ol><p>Если не определились, предлагаем пройти квиз и расставить всё по полочкам:</p>]]></content:encoded>
    </item>
    <item>
      <title>Выбираем российский хостинг в 2025: подборка на любой запрос</title>
      <link>https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros</link>
      <comments>https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros</guid>
      <description><![CDATA[<p>В этом материале — семь проверенных российских хостингов для разных задач: от стартапа до корпоративного проекта. Каждый прошел тестирование на аптайм (время бесперебойной работы), безопасность и доступность поддержки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/vybiraem-rossijskij-hosting-v-2025--podborka-na-lyuboj-zapros">Выбираем российский хостинг в 2025: подборка на любой запрос</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Тестирование]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Windows Server]]></category>
      <category><![CDATA[Техподдержка]]></category>
      <category><![CDATA[Россия]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[CMS]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[VPS]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 22 Jul 2025 12:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В 2025 году российский хостинг переживает новый виток развития. После того как законодательство изменилось и добавились новые технологии, локальные провайдеры усилили инфраструктуру.</p><p>Теперь они предлагают решения, которые не хуже, а где-то даже и лучше международных аналогов и по надёжности, и по цене.</p><p>Посмотрим, кто из них есть в этом списке, и определим особенности хостингов для сайта.</p><h2>1. FirstVDS: профессиональные решения для любых проектов</h2><p><a href="https://firstvds.ru/">FirstVDS</a><a href="https://firstvds.ru/" rel="noopener noreferrer nofollow"></a> — хостинг-провайдер с опытом на рынке более 20 лет. Предлагают VPS и VDS с виртуализацией KVM для проектов любого размера. Все серверы работают на современном оборудовании. Трижды победитель в номинации «Хостер года» Национальной премии «ЦОДы.РФ».</p><p>Хостинг подойдет бизнесу любого масштаба: для любых сайтов — от визиток до высоконагруженных интернет-магазинов, для разработки и тестирования, для сервисов и других проектов. Отдельные решения для Битрикс, установка ОС семейства Linux и Windows Server.</p><h3>Особенности хостинга</h3><h4>Надёжность</h4><p>FirstVDS обеспечивает аптайм 99,97–99,99% в 2025 году, подтверждённый замерами (например, отклик из Москвы — 27 мс в апреле 2025). Серверы размещены в трёх дата-центрах уровня Tier III: два в Москве (IXcellerate и Web DC) и один в Амстердаме (euNetworks). Отказоустойчивый кластер Ceph гарантирует работу даже при сбоях точки или канала.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/80547603-f63a-4f2e-9bc1-332c9e061bf9.png" alt="" /></figure><h4>Инфраструктура</h4><p>Серверы работают на процессорах Intel Xeon и AMD EPYC (до 5,7 ГГц в линейке CPU.Турбо), с быстрыми NVMe-дисками объёмом до 8 ТБ и оперативной памятью DDR5 (до 768 ГБ в VDS Атлант). Это обеспечивает высокую производительность для ресурсоёмких задач, таких как Битрикс или высоконагруженные приложения.</p><h4>Гибкость</h4><p>Тарифы масштабируются: от базовых конфигураций (1 CPU, 1 ГБ RAM, 40 ГБ SSD) до мощных серверов (192 ядра, 768 ГБ RAM, 8 ТБ NVMe). Линейки:</p><ul><li>VDS Форсаж: AMD EPYC, до 128 ядер, 512 ГБ RAM, 4 ТБ NVMe, от 749 ₽/мес (Москва/Амстердам).</li><li>CPU.Турбо: AMD Ryzen до 5,7 ГГц, DDR5, от 624 ₽/мес (Москва).</li><li>VDS Атлант: отказоустойчивый, до 192 ядер, 8 ТБ NVMe, от 1619 ₽/мес (Москва).</li><li>VDS Storage: хранилище, от 704 ₽/мес (Москва).Горячее масштабирование (hot-resize) позволяет добавлять CPU, RAM или диск без перезагрузки.</li></ul><h4>Автоматизация</h4><p>Шаблоны для быстрого развёртывания: Django, Redmine, Tomcat, Teamspeak, Nextcloud, LAMP, LEMP, Forgejo Git, GitLab, Битрикс. Поддерживаются ОС Linux (Ubuntu, Alma, Debian, Rocky, CentOS, Oracle), FreeBSD, Windows Server. API и панель ispmanager 6 lite (бесплатно на месяц) упрощают управление.</p><h4>Безопасность</h4><p>Включена защита от DDoS-атак на сетевом уровне, BitNinja для защиты сервера и сайта, SSL-сертификаты GlobalSign. Доступны автобэкапы, снапшоты, Кибер-бэкап и объектное хранилище S3 для больших данных.</p><h4>Поддержка</h4><p>Круглосуточная поддержка 24/7 без чат-ботов, ответ до 15 минут через чат, личный кабинет или телефон. Бесплатно: помощь с активацией и первичной настройкой. Платно: установка ПО, администрирование. Экспертная линия для мониторинга и устранения сбоев.</p><h4>Бонусы</h4><ul><li>Тестовый период 3 дня.</li><li>Бесплатный перенос до 10 сайтов с другого хостера.</li><li>Скидки: 40% на первый месяц при оплате на 1/3/6 месяцев или 3 месяца бесплатно при оплате за год.</li><li>Лояльность: скидка 5–20% для клиентов от 5 лет.</li><li>Реферальная программа: 10% от расходов привлечённых клиентов для партнёра, 25% скидка для нового пользователя на первый месяц.</li><li>Домены: продление по цене регистрации.</li></ul><h3>Тарифы и условия</h3><p>Тестовый период 3 дня, после него подключаете один из основных тарифов:</p><ul><li>Линейка готовых конфигураций от 1 CPU, 1 Гб RAM, 40 Гб SSD-накопителя и от 219 руб/мес. до сервера с 8 CPU, 12 Гб RAM, 150 Гб NVMe-накопителя. Локация в РФ и Нидерландах.</li><li>VDS Форсаж: на AMD Epyc от 749 ₽/мес. Локации: РФ и Нидерланды.</li><li>CPU.Турбо: гибкая конфигурация на базе высокочастотных AMD Ryzen 9 от 624 ₽/мес. При покупке лицензии Битрикс дополнительная скидка 30% на 3 месяца аренды CPU.Турбо. Локация в РФ.</li><li>VDS Атлант: отказоустойчивый с автобэкапами от 1 619 ₽/мес. Локация: РФ.</li><li>VDS Storage: сервис как хранилище с гибкой конфигурацией от 704 ₽/мес. Локация: РФ</li></ul><p>Все тарифы доступны для тестирования по согласованию с отделом продаж. Для точного подбора конфигурации используйте гибкую настройку.</p><h2>2. UltraVDS: для малого бизнеса и стартапов</h2><p>Компания <a href="https://ultravds.com/">UltraVDS</a>, провайдер услуг виртуальных серверов (VPS/VDS), работает на рынке с 2014 года — предлагает решения для разных операционных потребностей. Сервисы UltraVDS можно использовать для развертывания торговых роботов, запуска чат-ботов, хостинга веб-сайтов, а также для создания FTP-хранилищ данных. Есть предложения для фрилансеров, цифровых агентств, корпоративных пользователей и стартапов, которым требуются функциональные инфраструктурные решения.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/edef3abb-6f77-4c69-be56-e22d90f379db.png" alt="" /></figure><h3>Технические особенности</h3><p>Серверы UltraVDS размещены в современном дата-центре, расположенном в Москве. Доступность сервиса (аптайм) составляет 99,98%, что обеспечивает высокую стабильность работы. Сетевая пропускная способность превышает 200 Мбит/с, при этом трафик предоставляется без ограничений.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/56ccb605-b64b-44f3-94b7-10e960541dda.png" alt="" /></figure><p>Система защиты от DDoS-атак способна обрабатывать трафик до 1,5 Тбит/с и поддерживает стабильность работы сервера даже при интенсивном внешнем воздействии. Лицензия на Windows Server входит в стоимость обслуживания в данном предложении. Это упрощает развертывание сервера: вам не нужно отдельно покупать и устанавливать лицензию. Плюс снижает общие операционные расходы для пользователей этой операционной системы.</p><h3>Тарифные планы</h3><p>Для новых пользователей UltraVDS предусмотрена возможность 3-дневного тестового периода, позволяющего оценить функциональность и производительность сервиса.</p><p>После тестового периода стоимость тарифов начинается от 119 рублей в месяц. На сайте доступен онлайн-калькулятор, позволяющий подобрать конфигурацию сервера и рассчитать итоговую стоимость.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/932d0cca-9f20-4723-8ae9-8d9c3218a08a.png" alt="" /></figure><p>Клиентам доступны различные варианты оплаты, включая ежемесячную систему без предоплаты. При авансовой оплате на период от 3 до 12 месяцев предоставляются скидки до 20%, размер которых зависит от выбранного срока. В случае досрочного прекращения использования сервиса, неиспользованный остаток средств возвращается на баланс пользователя.</p><h3>Поддержка и обслуживание</h3><p>Техническая поддержка UltraVDS работает круглосуточно, 7 дней в неделю. Среднее время ответа на запросы составляет до 15 минут. Связь со службой поддержки возможна по электронной почте и телефону, указанным на официальном сайте.</p><h2>3. RUVDS: 10 лет на рынке облачных решений</h2><p><a href="https://ruvds.com/ru-rub">RUVDS</a> — облачный провайдер, имеющий десятилетний опыт работы на рынке услуг виртуальных серверов (VPS/VDS). Является официальным партнером Huawei в России, работает по SLA. Компания предоставляет инфраструктурные решения, которые могут быть применены для широкого спектра задач, включая хостинг высоконагруженных интернет-магазинов, корпоративных порталов, игровых серверов, сложных backend-систем и чат-ботов.</p><p>Платформа RUVDS спроектирована для оптимизации процесса развертывания ресурсов. Одной из ее особенностей является маркетплейс, который позволяет быстро запускать серверы с предустановленным программным обеспечением. Это способствует ускорению старта проектов, снижая потребность в ручной настройке распространенных CMS, игровых серверов и сред разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/aed25b96-b39b-4be9-b875-dc695645ef24.png" alt="" /></figure><h3>Тарифная политика и варианты оплаты</h3><p>RUVDS предлагает различные тарифные планы. Например, стоимость конфигурации Linux-сервера (1 CPU, 512 МБ RAM, 10 ГБ HDD, 1 IPv4) начинается от 139 ₽/месяц. Это может быть рассмотрено как экономичное решение для запуска небольших проектов и проведения тестирования.</p><p>Клиентам доступны разные опции оплаты:</p><ol><li>Ежемесячные платежи или предоплата на срок от 3 до 12 месяцев, при которой предоставляются скидки до 20%, зависящие от продолжительности периода.</li><li>Для проектов с динамической нагрузкой предусмотрена посекундная тарификация, оплата по которой взимается только за фактически использованные ресурсы. Неиспользованный остаток средств в рамках этой модели возвращается на баланс пользователя</li></ol><p>Дополнительно, до конца 2025 года панель управления ISP Manager для сервера и сайта предоставляется без дополнительной платы при создании любого VPS.</p><h3>Глобальная инфраструктура и стабильность</h3><p>Инфраструктура включает 17 дата-центров уровня Tier III, расположенных по всему миру. Это один из самых больших показателей по количеству геолокаций среди российских провайдеров. Для работы используются корпоративное оборудование и накопители (HDD, SSD, NVMe), чтобы обеспечить стабильную работу и производительность размещенных проектов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/3f3c970e-820f-4f0e-9b53-f227950e298b.png" alt="" /></figure><h3>Поддержка клиентов и доступные ресурсы</h3><p>Техническая поддержка RUVDS доступна круглосуточно, 7 дней в неделю. Среднее время ответа на запросы через тикет-систему или онлайн-чат составляет 15 минут. Клиентам предоставляются полные административные права и консультации по вопросам запуска и настройки серверов. Для самостоятельного изучения доступна база знаний, включающая инструкции и руководства.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-07-17/c086a963-2d51-4ada-86c8-0c1704cf8230.png" alt="" /></figure><h3>Безопасность и масштабирования</h3><p>В контексте безопасности данных, RUVDS предлагает несколько решений:</p><p>- Встроенная защита от DDoS-атак, способствующая поддержанию бесперебойной работы серверов при внешнем воздействии.</p><p>- Стандартный IPv4-адрес включен в стоимость каждой виртуальной машины, с опцией аренды дополнительных IP-адресов.</p><p>- API, соответствующий OpenAPI 3.0.0, предоставляет возможности для интеграции и автоматического масштабирования серверных ресурсов в зависимости от нагрузки.</p><p>- Компания официально подтверждает соответствие требованиям ФСТЭК и ФЗ-152 по защите персональных данных, что обеспечивает соблюдение соответствующих законодательных норм.</p><h2>4. McHost: решения для бизнеса разного масштаба</h2><p><a href="https://mchost.ru/"> McHost</a> предоставляет комплексные хостинговые решения, включая виртуальный хостинг и VPS/VDS с NVMe-накопителями. Сервис поддерживает популярные CMS (WordPress, Joomla, 1С-Битрикс) с оптимизированными настройками и автоматической установкой через панель управления.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/2ccc459a-8df5-41b6-bbf9-b751bed2e757.png" alt="" /></figure><p>McHost ориентирован на широкий круг клиентов:</p><ul><li>владельцы сайтов-визиток, блогов и лендингов — благодаря низким тарифам и полному набору опций;</li><li>интернет-магазины с небольшой нагрузкой — тарифы с SSD-накопителями и автоматическим резервным копированием обеспечивают стабильную работу;</li><li>разработчики, которым нужны<br />VPS/VDS с root-доступом — работают серверы на KVM-виртуализации с ОС Linux и Windows;</li><li>госучреждения и компании,<br />работающие с персональными данными — соответствие 152-ФЗ и размещение в дата-центрах Tier III в Москве.</li></ul><h3>Особенности сервиса</h3><p>McHost поддерживает стабильную работу с аптаймом 99.9% за счет размещения оборудования в дата-центрах уровня Tier III — в Москве и Нидерландах.</p><p>Сервис предоставляет защиту от DDoS-атак, автоматическое резервное копирование раз в два дня с хранением данных в течение 30 дней для виртуального хостинга и 14 дней для VPS, а также поддержку российских криптографических стандартов. Клиентам доступны различные варианты размещения: от виртуального хостинга с SSD (от 157.5 ₽/мес) до выделенных серверов с NVMe-накопителями.</p><h3>Технические параметры и условия</h3><p>Инфраструктура McHost базируется на серверах Dell с NVMe-накопителями и процессорами Intel Xeon (частота ядер от 2.35 ГГц). Для виртуального хостинга используется CloudLinux с технологией CageFS, обеспечивающей изоляцию аккаунтов. Поддержка российских ОС («Альт») подтверждена для VPS-тарифов.</p><p>В техподдержку можно обратиться по телефону, через тикет или в Telegram-боте. Время ответа — до 10 минут.</p><p>Текущие тарифы:</p><ul><li>Виртуальный хостинг: от 157 ₽/мес<br />(3 ГБ SSD, 1 сайт).</li><li>VPS: от 396 ₽/мес (15 ГБ SSD, 1<br />ядро CPU).</li><li>Выделенные серверы: от 3 000 ₽/мес<br />(32 ГБ RAM, 2×1 ТБ HDD).</li></ul><h2>5. UFO Hosting: VPS/VDS и выделенные серверы с портом до 10 Гбит/с и безлимитным трафиком</h2><p><a href="https://ufo.hosting/">UFO Hosting </a>предлагает VPS/VDS и выделенные серверы на партнёрской инфраструктуре IXcellerate (Tier III). В портфолио — недорогие виртуальные машины и серверы с портом 10 Gbps для проектов, которым нужна стабильность без завышенных цен.</p><p>Сервис подходит для пользователей разных масштабов: от фрилансеров и веб‑студий до средних и крупных компаний. Для DevOps‑специалистов доступны API и инструменты автоматизации.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-19/3cfc6e79-bab0-48ab-862b-f523c0ad24e8.png" alt="" /></figure><h3>Основные сценарии использования</h3><ul><li>корпоративные сайты, CRM‑системы и веб‑приложения;</li><li>аналитические сервисы и SaaS‑продукты;</li><li>инфраструктура для разработки и тестирования;</li><li>задачи фрилансеров, агентств и digital‑команд.</li></ul><h3>Формат работы, особенности и интеграции</h3><p>Серверы установлены в российском дата‑центре Tier III (IXcellerate), что означает резервирование по питанию и каналам связи. Заявленный аптайм — 99,98 %. Поддержка работает круглосуточно в тикетах, чате и по телефону; среднее время ответа 5–10 минут.</p><p>Сервис UFO Hosting делает акцент на безопасности и гибкости. Есть сеть с защитой от DDoS, возможность горячего расширения ресурсов, автоматическое развёртывание из шаблонов и API для интеграции. Поддерживаются популярные фреймворки и CMS, есть интеграции с GitLab, Telegram и DockerHub. Бэкапы, снапшоты и резервирование входят в стандартный набор, так что восстанавливать тестовую среду не придётся вручную.</p><p>В панели управления можно автоматически установить популярные CMS, панели управления, хранилища и DevOps‑инструменты. Это экономит время на настройку и подходит тем, кто не хочет поднимать всё с нуля.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-06/e4433ae3-898b-4c14-90c1-2a4bbb8b13a1.png" alt="" /></figure><h3>Условия использования и тарифы</h3><p>Базовые конфигурации начинаются от 577 руб./месяц. Заявленная скорость порта — до 10 Gbps, что подходит для проектов, где много трафика.</p><p>Есть возможность бесплатно попробовать сервис присутствует, но предоставляется по запросу в поддержку, а при оплате на срок от трёх месяцев действуют скидки, а также регулярно проводятся акции: это поможет оптимизировать бюджет.</p><figure><img src="https://media.tproger.ru/user-uploads/99854/2025-08-06/1e2e0191-1194-4a60-a612-fcac5d8cf76d.png" alt="" /></figure><p>В целом, UFO Hosting выглядит как практичное решение для тех, кому нужны производительные VPS/VDS и выделенные серверы в России. При выборе стоит оценить, насколько конфигурации подходят под конкретные нагрузки и есть ли необходимость в интеграциях из коробки.</p><h2>6. Timeweb: хостинг для веб-проектов</h2><p><a href="https://timeweb.com/">Timeweb </a>предоставляет услуги хостинга для различных типов веб-проектов. Сервис поддерживает популярные CMS, включая WordPress, 1C-Битрикс и Joomla, что делает его подходящим как для личных блогов, так и для корпоративных сайтов.</p><p>Платформа использует собственную панель управления с инструментами для работы с сайтами, базами данных и резервными копиями. Ежедневное автоматическое резервное копирование с хранением данных до 30 дней включено во все тарифные планы. Базовая защита от DDoS-атак доступна для всех клиентов без дополнительной платы.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/b443bfef-bccb-4672-bd55-cb67a1146bc3.png" alt="" /></figure><p>Инфраструктура Timeweb размещена в дата-центрах уровня Tier III в России (Санкт-Петербург) и Казахстане (Алматы). Гарантированный показатель uptime составляет 99.98%. Поддерживаются современные технологии: PHP версий от 5.3 до 8.4, MySQL от 5.6 до 8.0, а также Perl, Python, SSH, FTP и Cron.</p><p>Тарифные планы:</p><ul><li>Year+: от 164 ₽/мес (2 сайта, 15<br />ГБ NVMe, 2 БД);</li><li>Optimo+: от 248 ₽/мес (15 сайтов,<br />40 ГБ NVMe, безлимитные БД);</li><li>Century+: от 347 ₽/мес (35 сайтов,<br />50 ГБ NVMe, безлимитные БД);</li><li>Millennium+: от 482 ₽/мес (60<br />сайтов, 60 ГБ NVMe, безлимитные БД).</li></ul><p>Все тарифы включают бесплатный SSL-сертификат, 10 ГБ почтовой квоты с неограниченным количеством ящиков и DNS-хостинг. При оплате годового тарифа предоставляется домен в зонах .RU/.РФ в подарок.</p><p>Техническая поддержка доступна круглосуточно через онлайн-чат, тикет-систему и по телефону. Среднее время ответа не превышает 15 минут. Новые клиенты могут протестировать сервис бесплатно в течение пробного периода.</p><h2>7. Reg.ru: комплексные решения для сайтов и доменов</h2><p><a href="https://www.reg.ru/">Reg.ru </a>сочетает услуги хостинга и регистрации доменов, что упрощает управление веб-проектами. Компания работает с 2005 года, имеет статус аккредитованного регистратора доменных имён в зонах .RU и .РФ.</p><h3>Функциональные возможности</h3><p>Платформа предоставляет доступ к трём панелям управления: ISPmanager, cPanel и Plesk. Это позволяет выбрать наиболее удобный интерфейс для работы с сайтами. Все тарифы включают бесплатный SSL-сертификат от Let’s Encrypt, который автоматически устанавливается при создании сайта.</p><p>Начинающим пользователям доступен конструктор сайтов с готовыми шаблонами. Поддерживаются популярные CMS, включая WordPress, Joomla и 1С-Битрикс. Ежедневное резервное копирование данных с хранением копий в течение 30 дней входит в стандартный набор услуг.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/c1ac0c6a-51ae-4ae5-8875-f18a01ffdc2c.png" alt="" /></figure><h3>Техническая инфраструктура</h3><p>Серверы размещены в дата-центрах уровня Tier III в Москве. Средний показатель uptime составляет 99.9%, что подтверждается ежемесячной статистикой. Подключение к сети осуществляется по выделенным каналам со скоростью до 1 Гбит/с на выделенных серверах.</p><h3>Поддержка и тарифы</h3><p>Техническая поддержка доступна 24/7 через онлайн-чат и тикет-систему. Среднее время ответа составляет 15-20 минут. Для срочных вопросов можно обратиться по телефону.</p><p>Тарифы — от 151 ₽/мес (7 ГБ SSD, 15 сайтов). При регистрации домена в зонах .RU или .РФ предоставляется скидка на другие доменные имена.</p><h2>8. Спринтхост: хостинг с персональным подходом</h2><p><a href="https://sprinthost.ru/">Sprinthost</a> предлагает услуги хостинга с акцентом на индивидуальную поддержку клиентов. Сервис работает с 2011 года и специализируется на VPS-решениях для различных веб-проектов.</p><h2>Особенности сервиса</h2><p>Компания предоставляет персонального менеджера для каждого клиента, который помогает с настройкой сервера и решением технических вопросов. А если вы остались недовольны услугами, то в течение 30 дней сервис вернёт деньги. Sprinthost проводит бесплатные обучающие вебинары по DevOps и администрированию серверов.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-07-16/7acc90d0-655a-4cda-906f-a7e5ad4f9a8e.png" alt="" /></figure><h3>Технические характеристики и тарифы</h3><p>Инфраструктура размещена в дата-центрах Москвы и Санкт-Петербурга с аптаймом 99.9%. Поддерживаются современные технологии разработки, включая Ruby on Rails, Node.js, Python и Docker. Все серверы используют SSD-накопители с гарантированной скоростью чтения/записи.</p><p>Тарифные планы:</p><ul><li>Start: 290 ₽/мес (1 ядро, 1 ГБ<br />RAM, 15 ГБ SSD);</li><li>Turbo: 1 900 ₽/мес (4 ядра, 8 ГБ<br />RAM, 100 ГБ NVMe).</li></ul><h3>Поддержка</h3><p>Техническая помощь доступна 24/7 через тикет-систему и онлайн-чат. Среднее время ответа составляет 10-15 минут. Для корпоративных клиентов предусмотрена приоритетная поддержка по телефону.</p><h2>Как выбрать хостинг в 2025 году</h2><p>Выбор хостинга зависит от типа проекта и его требований. Для небольших сайтов и блогов подойдет виртуальный хостинг с поддержкой популярных CMS — важно проверить наличие автоматических бэкапов и базовой защиты от DDoS. Если проект связан с обработкой персональных данных, убедитесь, что провайдер соответствует 152-ФЗ и использует сертифицированное оборудование.</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/3a0b1d01-c4e0-424d-86b2-8988d43bcdb1.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/b3c26558-3a50-4eb3-a9f3-89c899fd9e59.png" alt="" /></figure><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-08-20/3408c453-b5db-44ce-b6ab-f1b3bcb5abd1.png" alt="" /></figure><p>Для высоконагруженных сервисов и интернет-магазинов лучше рассматривать VPS или выделенные серверы. Обратите внимание на тип накопителей (SSD/NVMe), возможность масштабирования ресурсов и аптайм дата-центров (рекомендуется от 99.9%).</p><p>Перед покупкой протестируйте сервис — большинство провайдеров предлагают пробный период. Проверьте скорость работы панели управления и отзывчивость поддержки. Не забывайте о резервном копировании: даже если хостинг предоставляет эту услугу, дублируйте критически важные данные самостоятельно.</p><p>Главное правило — выбирайте решение, которое покрывает текущие потребности проекта. Важно, чтобы конфигурацию можно было оперативно менять по мере роста запросов и масштабирования бизнеса. Технологии меняются быстро, и гибкость конфигурации часто важнее сиюминутной экономии.</p><h2>FAQ</h2><h3>Что такое виртуальный хостинг и когда его выбирать?</h3><p>Виртуальный хостинг — это экономичное решение, где один физический сервер делит ресурсы между множеством сайтов. Подходит для небольших проектов с низкой нагрузкой: личных блогов, лендингов или стартовых страниц.</p><p>Преимущества: низкая стоимость, простота управления через панели, автоматические обновления и базовая защита. Минусы: ограниченные ресурсы; производительность зависит от соседних сайтов; минимальный контроль над настройками.</p><h3>Что такое VPS/VDS и для каких проектов он подходит?</h3><p>VPS (Virtual Private Server) или VDS — это виртуальный сервер с выделенными ресурсами (процессор, память, диск), предоставляющий доступ для полной настройки. Идеален для проектов среднего масштаба: интернет-магазинов, API, SaaS, чат-ботов, корпоративных порталов или приложений с умеренным трафиком.</p><p>Преимущества: гибкость конфигураций, выбор ОС, изоляция ресурсов. Минусы: требует базовых навыков администрирования, стоимость выше, чем у виртуального хостинга.</p><h3>Что такое выделенный сервер и когда его использовать?</h3><p>Выделенный сервер — это физический сервер, полностью зарезервированный под ваш проект. Подходит для высоконагруженных систем: крупных интернет-магазинов, игровых платформ, корпоративных ERP или аналитических сервисов с большим трафиком.</p><p>Преимущества: максимальная производительность, полный контроль, высокая отказоустойчивость. Минусы: высокая цена, сложность настройки и обслуживания.</p><h3>В чём основные различия между виртуальным хостингом, VPS и выделенным сервером?</h3><p>Виртуальный хостинг — самый дешёвый и простой, но ресурсы делятся между пользователями, что ограничивает производительность (до 1000–2000 посетителей в сутки).</p><p>VPS обеспечивает выделенные ресурсы и гибкость, справляясь с нагрузкой до 5000–10 000 пользователей в сутки.</p><p>Выделенный сервер — максимум мощности для пиков свыше 10 000 пользователей, но требует значительных затрат и технических знаний.</p><p>Выбор зависит от масштаба: виртуальный для старта, VPS для роста, выделенный для enterprise.</p><h3>Нужны ли навыки администрирования для хостинга?</h3><p>Для виртуального хостинга навыки не нужны — управление идёт через интуитивные панели, а провайдеры обеспечивают обновления и базовую поддержку. Для VPS желательны базовые знания (настройка ОС, установка ПО), хотя многие провайдеры предлагают помощь. Для выделенного сервера навыки администрирования необходимы, так как вы полностью отвечаете за сервер, хотя провайдеры могут предлагать платное администрирование.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 инструментов, которые используют айтишные команды</title>
      <link>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</link>
      <comments>https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy</guid>
      <description><![CDATA[<p>Показываем, какими инструментами пользуются внутри айтишных команд и какие можно использовать для себя здесь и сейчас или внедрить в свою команду.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-instrumentov--kotorye-ispolzuyut-ajtiwnye-komandy">5 инструментов, которые используют айтишные команды</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Микросервисы]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Отладка]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Adobe]]></category>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Аналитика]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Grafana]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Jun 2025 14:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>В статье собрали 5 решений — от трекеров задач и онлайн-досок до комплексных платформ для управления проектами. Инструменты помогут закрывать горящие дедлайны, ускорять разработку и четко распределять задачи — все то, что используют в больших командах. Рассказываем, что делать с этими фичами и как их использовать.</p><h2>1. МояДоска</h2><p><a href="https://moyadoska.com/">«МояДоска»</a> — это российский SaaS-сервис для совместной работы и визуализации идей. У онлайн-доски бесконечный размер: это значит, что вы можете размещать сколько угодно элементов и никогда не упретесь в границу. Так, команды, преподаватели и креативные специалисты могут проводить брейнштормы, планирования, презентации и обучение в одном пространстве.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/4fe2215f-6b29-4d0c-a490-281b2d045ddc.jpeg" alt="" /></figure><h3>Что под капотом</h3><p>Фронт написан на React + PixiJS, а бэк — Node.js + PostgreSQL. Это обеспечивает быстрый и понятный интерфейс и стабильную работу даже при большом объёме объектов на доске. Команда выпускает обновления несколько раз в месяц, а о новинках можно узнать в <a href="https://t.me/moyadoska">Telegram-канале</a> сервиса. Например, в недавнем апдейте появилась возможность превратить фрейм в таблицу или тетрадь за пару кликов, а еще задать нужное число столбцов, колонок, толщину границ и цвет.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/0f1a8489-ffe3-4003-8ecc-09d25bbba3b3.png" alt="" /></figure><p><b>Из главных функций:</b></p><ul><li>Понятный интерфейс</li><li>Совместная работа в реальном времени</li><li>Привычные инструменты: фигуры, стрелки, стикеры, текст, загрузка файлов, маркер, карандаш</li><li>Обрезка фото прямо на доске, воспроизведение аудио, поддержка PDF</li><li>Гибкое управление доступом</li><li>Возможность повторного использования шаблонов</li><li>Поддержка фреймов и создание логичных пространств для разных задач</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/21a6ecbd-a6b5-40c9-ae19-71a85b919c46.png" alt="" /></figure><h3>Переезд на сервис</h3><p>«МояДоска» интегрируется в процессы на разных этапах, упрощая жизнь команде. Например, сама команда сервиса перешла с Miro на свою доску для стратегического планирования. С помощью стикеров и стрелок они построили дерево решений, чтобы лучше расставить приоритеты. А одно маркетинговое агентство перевело все документы и сессии планирования на доску, отказавшись от Google Docs и таблиц. Это ускорило принятие решений: сотрудники работали с данными в одном формате, точно собрались в одном кабинете перед маркерной доской.</p><h2>2. METEOR</h2><p><a href="https://u-meteor.ru">METEOR</a> — инструмент управления проектами. Это трекер задач с дашбордами, досками канбан, диаграммами Ганта и API, который работает в виде веб-приложения как в облаке, так и на своих серверах. Продукт создавался как универсальный центр управления задачами: он объединяет в себе все — от разработки и тестирования до маркетинга и поддержки. Сейчас его используют более 250 команд и свыше 2000 пользователей ежедневно.</p><h3>Что под капотом</h3><p>В основе — стек Ruby on Rails, React и TypeScript, PostgreSQL и Redis, плюс современная инфраструктура на Docker и Kubernetes.</p><p>Система разбита на микросервисы — за фоновую обработку, нотификации и работу с файлами отвечает отдельный функционал. Авторизация построена через OAuth 2.0 (Google, Yandex), а для аналитики используется Posthog и ELK-стек. Мониторинг реализован на Prometheus + Grafana. Обновления выходят каждую неделю, а обратная связь приходит разработчикам METEOR через Telegram-бот.</p><p><b>Вот главные функции:</b></p><ul><li>Гибкие доски задач (Kanban, Scrum) — 6 видов.</li><li>Списки задач с группировками и иерархией.</li><li>Автоматические отчеты (ежедневные/еженедельные сводки).</li><li>Умные напоминания (Telegram-бот, email).</li><li>Глубокая аналитика (время выполнения задач, загрузка команды).</li><li>Потоковая автоматизация процессов</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/60e0eb0a-c1b1-473b-b343-1c4fb1b3fbd6.png" alt="" /><figcaption>Упрощенная схема сущностей системы</figcaption></figure><p>METEOR — мощный инструмент для автоматизации процессов, с триггерами, серверными функциями и ИИ-аналитикой. Он позволяет гибко настраивать сложные операции.</p><p>Все данные анализируются, и внутри самого сервиса можно понять, как работает команда: кто загружен, сколько времени уходит на задачи, где стопперы в процессе.</p><p>Разработчики используют METEOR для линковки задач с pull-requests и контроля бэклога. Менеджеры получают отчеты автоматически и не тратят часы, чтобы собрать всю информацию вручную. QA ведут тест-кейсы и баги в удобных досках, а DevOps отслеживают инциденты и шаги деплоя. Даже HR подключаются — через систему проходят кандидаты и стажеры.</p><h3>Переезд на сервис</h3><p>После внедрения METEOR команды замечают, что продуктивность их работы сильно повышается:</p><ul><li>скорость выполнения задач увеличивается в среднем на 25% — благодаря автоматическим напоминаниям и чётким процессам;</li><li>количество потерянных задач снижается на 70% — исчезают хаотичные чаты и забытые письма;</li><li>на составление отчетов и сбор метрик уходит не 5 часов, а всего 30 минут в неделю;</li><li>а экономия времени — около 75 часов в месяц на команду из 10 человек.</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/f3f086f0-5846-4a35-adba-dc4fbe17f1c0.png" alt="" /><figcaption>Карточка задачи</figcaption></figure><p>METEOR не просто помогает контролировать задачи — он становится частью операционного «ядра» команды, избавляя от хаоса, ускоряя работу и делая все немного спокойнее.</p><h2>3. Gitlife</h2><p><a href="https://gitlife.ru">GitLife</a> — это универсальная платформа для хостинга репозиториев и построения полного DevOps-процесса внутри компании. Разработана с прицелом на закрытые контуры, импортозамещение и гибкость — подходит как для современных Git-проектов, так и для инфраструктур, где все еще используется SVN.</p><p>Помимо самого Gitlife, разработчики делают Gitlife AI, в котором есть доступ к топовым ИИ-моделям и инструментам, чтобы разрабатывать ИИ-решения.</p><h3>Что под капотом</h3><p>Внутри Gitlife собраны модули для:</p><ul><li>Кода — репозитории, ветвление.</li><li>Задач — бэклоги, спринты, дашборды.</li><li>Документации — совместное редактирование документов, управление правами.</li><li>Аналитики — карты потока ценности, качество кода, метрики по инженерам.</li><li>Пайплайны — модуль «Конвейер» управляет сборками и CI/CD.</li></ul><p>Gitlife используется ИТ-отделами и R&amp;D-подразделениями в компаниях с высокими требованиями к информационной безопасности. Подходит как для небольших команд, так и для распределённых корпораций с десятками проектов.</p><p>Что решает:</p><ul><li>Безопасный и полностью локальный хостинг исходного кода (Git + SVN)</li><li>Управление задачами и CI/CD в одном месте</li><li>Централизованный доступ, права, аудиты и история изменений</li><li>Полная поддержка DevOps-процессов на российском ПО</li><li>Альтернатива GitHub, GitLab и Bitbucket в условиях ограниченного доступа и санкционных рисков</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/bb3f815f-ce07-4c9d-9243-7ace4b14d5ba.png" alt="" /><figcaption>Создание пайплайна</figcaption></figure><h3>Переезд на сервис</h3><p>Инструмент подходит практически всем командам — от инди-разработчиков до крупных проектов с множеством ролей. Например, гейм-девелопер может разрабатывать персональный проект и хранить код бесплатно, стартап — разрабатывать MVP, а крупный бизнес — управлять большими командами и проектами максимально безопасно.</p><h2>4. Cerebro</h2><p><a href="https://cerebrohq.com/ru/">Cerebro</a> — профессиональная система для совместной работы и управления проектами. Она помогает ставить задачи, планировать этапы, следить за выполнением, обмениваться файлами и комментировать их прямо в системе. Особенно полезна для команд, которые делают VFX, 3D, анимацию или дизайн — но при этом легко адаптируется и под другие команды.</p><p>Платформа охватывает полный цикл — от первых идей и планирования до комментирования финальных шотов (отдельных сцен или кадров в видео/анимации) и соблюдения дедлайнов. Такой подход помогает команде ускорить работу на 20%, сократить время на правки и держать весь процесс под контролем — от начала до сдачи проекта.</p><p>Cerebro подходит для команд от 1 до 1000+ человек с задачами на проекте от 1 до 10000+. Сервис работает с 2009 года, сейчас им пользуются более 400 команд в России и СНГ.</p><h3>Что под капотом</h3><p>Cerebro поддерживает десктоп (Windows, Mac и Linux), веб-версию и мобильное приложение, локальное, облачное и гибридное развертывание. Инструмент построен на клиент-серверной архитектуре — она гибкая, поэтому можно настраивать конфиги исходя из потребностей бизнеса.</p><p>Из технологий:</p><ul><li><b>Backend:</b> C, C++, Python, SQL</li><li><b>Frontend:</b> JS, TypeScript, ReactJS, Qt, PyQt</li><li><b>Мобильные клиенты:</b> React Native</li><li><b>БД: </b>PostgreSQL с проприетарными расширениями + SQLite</li><li><b>Файловое хранилище:</b> Cargador</li><li><b>Плагины: </b>Tentaculo (встраивается в производственные программы)</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/d51c709f-2b9c-4e0b-95c0-2b78d61f5c1e.png" alt="" /></figure><p>Cerebro покрывает весь пайплайн — от идеи до финала. Вот основные возможности сервиса:</p><ul><li>Множественные уровни вложенности задач — подходит для сложных иерархий продакшена</li><li>Планирование с помощью диаграммы Ганта и специального инструмента «План»</li><li>Канбан-доска для визуального контроля задач</li><li>Инструмент «Моё пространство» — для персонализированной фильтрации и отбора задач</li><li>Уровни доступа и ролевое управление</li><li>Расширенная статистика по проектам, командам, сотрудникам</li><li>Совместная работа над большими файлами (видео, изображения, 3D) — Mirada позволяет комментировать, делать подрисовки, оставлять голосовые заметки</li><li>Интеграция с пакетами Adobe, Autodesk и мессенджерами, возможность встраивать в любые пайплайны</li><li>Удобное подключение фрилансеров</li></ul><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/5411ad9d-a74b-46ed-9774-61d60ff69885.png" alt="" /><figcaption>Навигатор и форум</figcaption></figure><h3>Переезд на сервис</h3><p>Обычно внедрение начинается еще на этапе препродакшена — во время разработки концепции и четкого плана действий. Затем система сопровождает проект на всех стадиях, вплоть до постпродакшена (финального тестирования и релиза), где она закрывает 80-100% задач. Cerebro позволяет собирать всё в одном месте: задачи, правки, сроки, бюджеты, загрузку сотрудников и статус проекта в целом.</p><p>После переезда снимается много рутинных задач: больше не нужно вручную назначать исполнителей, комментировать медиаконтент, передавать файлы между программами и так далее. В среднем проекты выполняются на 20% быстрее, без потери качества. В больших студиях объем выпускаемых шотов может вырасти до 20+ тысяч — это уже работает у других клиентов, среди которых СберМаркетинг, Sinners, Black Point и другие. Cerebro также помогает переехать с других такс-трекеров и систем для управления проектами.</p><h2>5. Replit Teams</h2><p><a href="https://replit.com/teams">Replit Teams</a> — это платформа для совместной разработки в реальном времени. По сути, это интегрированная IDE + git-репозиторий + система управления задачами — и все доступно через браузер. Подходит как для командной работы в стартапах, так и для образовательных проектов, хакатонов и небольших продуктовых команд.</p><p>А главная фишка — встроенный ИИ, к которому можно обращаться прямо во время написания кода. Инструмент разработан с акцентом на простоту входа, командную работу и быстрое прототипирование. Поддерживает более 50 языков программирования и позволяет запускать полноценные веб-приложения в облаке.</p><figure><img src="https://media.tproger.ru/user-uploads/101078/2025-06-26/70b00e25-9ec7-4858-911c-b2d7a181104e.png" alt="" /></figure><h3>Что под капотом</h3><p>Внутри Replit Teams есть интерфейсы для:</p><ul><li>Кода — редактор с автокомплитом, подсветкой синтаксиса, терминалом и интеграцией с Git.</li><li>Задач — встроенный таск-менеджер с распределением задач по участникам.</li><li>Общения — встроенные комментарии в коде, возможность ревью и обсуждений.</li><li>CI/DevOps — запуск и отладка приложений без настройки окружения.</li><li>Доступа — гибкие роли, приглашения по ссылке, настройки приватности.</li></ul><h3>Переезд на сервис</h3><p>Replit Teams позволяет моментально начать работу: не нужно ставить зависимости, конфигурировать CI или закупать сервера. Подходит как для быстрой прокачки навыков, так и для реальных командных проектов в продакшене.</p><p>Сейчас инструмент активно используют в стартапах — для быстрого MVP, парного программирования, хакатонов и удаленных командах — как замена локальным IDE и конфигурациям.</p><p>Рассказывайте в комментариях, какими сервисами пользуетесь вы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</title>
      <link>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</link>
      <comments>https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Денис Кудерин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov</guid>
      <description><![CDATA[<p>Эпохи развития программирования в России и в мире. Какие стадии прошли разработчики и к чему пришли в настоящий момент. Прогнозы на будущее. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/evolyuciya-programmista-2005-2025--ot-crt-monitorov-do-kvantovyh-algoritmov">Эволюция программиста 2005–2025: от CRT-мониторов до квантовых алгоритмов</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Stack Overflow]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Облачные технологии]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Intel]]></category>
      <category><![CDATA[Mozilla]]></category>
      <category><![CDATA[WebAssembly]]></category>
      <category><![CDATA[Образование]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Soft Skills]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Обучающие курсы]]></category>
      <category><![CDATA[Дата-центр]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Машин]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Fullstack]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jun 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>За последние 20 лет программирование изменилось до неузнаваемости. Если в 2005 году разработчики писали код на PHP 4.0 под мерцание CRT-экранов, то в 2025-м нейросети помогают им генерировать целые модули, а квантовые компьютеры становятся частью исследовательских проектов.</p><p>Эта статья — подробная хроника эволюции программистов: какие языки и технологии они осваивали, как менялись их рабочие места, методы обучения и даже само восприятие профессии. Мы разберем ключевые этапы, от первых веб-гигантов до эпохи совместного программирования с ИИ, и попробуем представить, что ждет нас дальше.</p><h2>2005-2009: Эпоха авторских решений и первых веб-фреймворков</h2><p>В середине 2000-х типичный рабочий инструмент программиста — это громоздкий системный блок с процессором Intel Pentium 4 или новеньким Core 2 Duo. Мониторы с ЭЛТ-трубкой постепенно уступали место LCD-экранам с разрешением 1024×768 — именно на таких дисплеях создавались первые версии Wikipedia и набирающих популярность соцсетей. Оперативная память в 1-2 ГБ считалась нормой, а жесткие диски на 80-160 ГБ часто заполнялись до отказа — проекты редко весили меньше нескольких гигабайт.</p><p>Серьезная разработка велась преимущественно на стационарных компьютерах. Ноутбуки только начинали входить в обиход — их брали в офис, но для реальной работы предпочитали мощные десктопы. Операционная система Windows XP доминировала на рабочих станциях, в то время как серверы чаще всего крутили на Linux — Red Hat Enterprise или Debian.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/d5fca723-5450-4b72-8e8d-4cd57627fb99.jpg" alt="" /></figure><p>Среды разработки того времени сегодня кажутся архаичными. Eclipse и NetBeans потребляли гигабайты памяти, Visual Studio 2005 требовала серьезных ресурсов. Многие разработчики предпочитали простые текстовые редакторы вроде Notepad++, а для отладки использовали примитивные методы вроде вывода значений переменных через print. Контроль версий только начинал входить в практику — Git появился в 2005 году, но большинство команд продолжали использовать SVN или вообще заливали файлы по FTP напрямую на продакшен.</p><p>Языковая экосистема этого периода вращалась вокруг трех основных технологий. PHP версий 4 и 4.3 доминировал в веб-разработке — на нем работало около 80% всех сайтов в интернете. Однако его объектно-ориентированные возможности были крайне ограничены до выхода PHP 5 в 2004 году.</p><p>Java в лице J2EE оставалась стандартом для корпоративных решений — банковских систем, крупных порталов и ERP-комплексов. Spring Framework только начинал набирать популярность, а Hibernate упрощал работу с реляционными базами данных. C++ сохранял свои позиции в разработке игр (особенно с использованием Unreal Engine), драйверов и высоконагруженных сервисов.</p><p>Фронтенд-разработка в те годы была невероятно простой по современным меркам. Верстали преимущественно таблицами, а всю динамику реализовывали через jQuery, который появился в 2006 году и быстро вытеснил нативный JavaScript из повседневной практики. AJAX-запросы казались революционной технологией, позволяющей обновлять части страницы без ее полной перезагрузки.</p><p>Обучение программированию в этот период кардинально отличалось от современных подходов. Онлайн-курсы практически отсутствовали. Основными источниками знаний служили бумажные книги:</p><ul><li>«Философия Java» Брюса Эккеля;</li><li>«Совершенный код» Стива Макконнелла;</li><li>«PHP и MySQL. Разработка веб-приложений» Люка Веллинга.</li></ul><p>Русскоязычное сообщество активно обсуждало вопросы разработки на форумах RSDN.ru и CyberForum.ru. В 2008 году появился Stack Overflow, который постепенно стал главной площадкой для профессиональных обсуждений.</p><p>Университетское образование давало хорошую теоретическую базу — алгоритмы, структуры данных, принципы ООП. Однако практическим навыкам приходилось учиться самостоятельно, методом проб и ошибок. Документацию часто скачивали в формате CHM-файлов или читали непосредственно на сайтах вроде php.net и MSDN.</p><p>Типичный стек начинающего разработчика в 2009 году:</p><ul><li>HTML/CSS с jQuery для фронтенда;</li><li>PHP или Ruby on Rails для бэкенда;</li><li>MySQL в качестве базы данных.</li></ul><p>ORM-технологии еще не получили широкого распространения, поэтому SQL-запросы писали вручную. Многие проекты представляли собой монолитные приложения, где весь код хранился в единой кодовой базе без четкого разделения на модули.</p><p><b>Показательный кейс</b>:</p><p>В 2007 году разработчик PHP-приложений из МЭСИ (Москва) столкнулся с типичной для того времени проблемой — SQL-инъекциями. Вместо стандартных решений он создал DLAC (Data Logic Access Component) — обертку для работы с базой данных, которая автоматически экранировала параметры запросов. Это выглядело революционно на фоне типичного кода того периода, где строки запросов часто собирали через конкатенацию с пользовательским вводом.</p><p>Компонент использовал новую для 2005 года технологию Generics в C#. Он генерировал параметризованные запросы, что резко снижало риски взлома.</p><p><i>Разработчики в университетской среде тогда редко задумывались о безопасности — многие проекты содержали уязвимости вроде  </i>SELECT * FROM users WHERE name = ‘.$_POST[‘name’]<i>. </i></p><p><i>DLAC стал локальным спасением для внутренних систем МЭСИ, пока в 2009 году не появился NHibernate — порт популярного Java-фреймворка Hibernate.</i></p><p>Этот кейс хорошо иллюстрирует дух эпохи: отсутствие готовых безопасных решений заставляло программистов изобретать велосипеды. Многие подобные наработки позже легли в основу ORM-библиотек, но тогда они рождались в муках — через пробелы в безопасности и километры самописного кода.</p><h2>2010-2014: Мобильная революция и рассвет JavaScript</h2><p>Начало нового десятилетия ознаменовалось стремительным ростом мобильных технологий. Выход iPhone 4 в 2010 году и Android 2.3 Gingerbread задал новые стандарты мобильной разработки.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/7b640694-b2cd-4f03-a68f-51ed138557b2.jpg" alt="" /></figure><p>Программисты массово переходили на MacBook Pro — не столько из-за преимуществ macOS, сколько благодаря появлению Retina-дисплеев в 2012 году, которые кардинально улучшили качество отображения кода.</p><p>Железо продолжало стремительно эволюционировать. Твердотельные накопители (SSD) начали вытеснять традиционные жесткие диски в рабочих станциях. Облачные платформы вроде AWS и Heroku стали реальной альтернативой локальным серверам, которые раньше часто стояли прямо под рабочими столами в офисах. Оперативная память в 8 ГБ стала стандартом для комфортной разработки, а четырехъядерные процессоры ускорили сборку крупных проектов.</p><p>Языковая палитра этого периода значительно расширилась. Objective-C стал основным языком для iOS-разработки и оставался таковым до появления Swift в 2014 году. Python 3 начал набирать популярность благодаря веб-фреймворку Django и научным библиотекам NumPy и Pandas, которые открыли дорогу для анализа данных в массовом сегменте.</p><p>JavaScript пережил настоящий ренессанс — после выхода AngularJS в 2010 и Node.js в 2009 году он перестал быть просто «языком для анимаций на сайте», превратившись в полноценную платформу для fullstack-разработки.</p><p><b>Важный факт</b>. В 2011 году разработчик из Сан-Франциско Райан Даль представил Node.js — среду выполнения JavaScript на стороне сервера. За первые 24 часа после релиза проект собрал 10 000 звезд на GitHub, что для того времени стало рекордом. Многие скептически относились к идее использовать JavaScript вне браузера, но уже через год такие компании как LinkedIn и Walmart перевели части своего бэкенда на Node.js, получив прирост производительности в 2-3 раза по сравнению с традиционными решениями на Java и Ruby.</p><p>Образовательная сфера претерпела значительные изменения. В 2011 году запустилась Coursera с первым массовым курсом по программированию — Machine Learning от Эндрю Ына. В 2012 году в Кремниевой долине открылся Hack Reactor, ставший прототипом современных coding bootcamps (интенсивов по программированию). Эти форматы предложили альтернативу традиционному университетскому образованию, сделав акцент на практических навыках.</p><p>Параллельно в России:</p><ul><li>В 2012 году появился Hexlet — одна из первых русскоязычных платформ с практико-ориентированными курсами по программированию. Особенность: выполнение заданий в реальной среде разработки через браузер. Платформа до сих пор работает: на текущий момент 80% выпускников трудоустраиваются в IT, <a href="https://ru.hexlet.io/blog/posts/hse-research">согласно исследованию ВШЭ</a>. В 2012 этот показатель был еще выше.</li><li>«Нетология» (основана в 2011) к 2013 году запустила курсы по веб-разработке с акцентом на JavaScript и Python, сотрудничая с российскими tech-компаниями. Их модель включала менторство и проектные работы.</li><li>В 2013 году стартовал Stepik — платформа с открытыми курсами от ведущих вузов (ИТМО, МФТИ). Особенность: интерактивные задачи с автоматической проверкой кода, что было прорывом для местного рынка.</li></ul><p>Курс «Введение в Linux» от Stepik (2014) за полгода собрал 50 тыс. студентов — рекорд для Рунета. Задания включали настройку виртуальных серверов, что сразу применялось в работе.</p><p>Эти проекты заложили основу для бума EdTech в России после 2015 года, доказав, что онлайн-формат может давать актуальные навыки быстрее вузов.</p><p>Типичный разработчик среднего уровня в 2014 году:</p><ul><li>понимал принципы REST API;</li><li>начинал осваивать основы DevOps с появлением Docker в 2013;</li><li>экспериментировал с микроконтроллерами вроде Arduino или Raspberry Pi, создавая собственные IoT-устройства.</li></ul><p>В профессиональной среде начал формироваться консенсус о том, что PHP устаревает для сложных коммерческих проектов.</p><h2>2015-2019: Эра больших данных и облачных технологий</h2><p>Аппаратные возможности сделали очередной рывок вперед. Многоядерные процессоры Intel i7 и AMD Ryzen стали стандартом для рабочих станций. 16 ГБ оперативной памяти перестали быть роскошью, а мониторы с разрешением 4К стали доступны широкому кругу разработчиков. В 2015 году появился Visual Studio Code, который быстро обогнал по популярности Sublime Text и Atom благодаря удачному сочетанию функциональности и производительности.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/c92b70be-b3eb-4924-a40a-587ed3d43592.png" alt="" /></figure><p>Языковая экосистема продолжила развитие. TypeScript, представленный в 2014 году, предложил решение проблемы масштабируемости JavaScript-кода в крупных проектах. Go от Google, созданный еще в 2009, нашел свою нишу в разработке микросервисов и инструментов оркестрации вроде Kubernetes (2015). Rust от Mozilla начал завоевывать доверие системных программистов благодаря уникальной системе владения памятью.</p><p>JavaScript-сообщество столкнулось с первыми серьезными проблемами. В 2016 году инцидент с пакетом left-pad показал уязвимость экосистемы npm — удаление одного небольшого модуля привело к сбоям в работе тысяч проектов по всему миру. Это заставило разработчиков задуматься о зависимости от сторонних библиотек.</p><p>Типичный senior-разработчик в 2019:</p><ul><li>разбирался в микросервисной архитектуре и понимал, как избежать vendor lock-in (привязки к поставщику) при работе с облачными провайдерами;</li><li>имел опыт работы с React или <a href="http://vue.js">Vue.js</a>;</li><li>знал, что понимание принципов работы алгоритмов становится менее важным, чем развитие soft skills для работы в команде.</li></ul><p>Ключевые технологии этого периода включали Kubernetes, который стал стандартом де-факто для оркестрации контейнеров, а также TensorFlow (2015) и PyTorch (2016), открывшие эру машинного обучения для широкого круга разработчиков. Появились первые серьезные инструменты для работы с большими данными — Apache Spark, Hadoop.</p><p><i>Ключевой момент. В 2016 году Netflix раскрыл детали своего перехода на облачную инфраструктуру AWS. Компания полностью перенесла все сервисы — от рекомендательной системы до биллинга — в облако за семь лет. Главным триггером стала катастрофа 2008 года, когда три дня простоя дата-центра оставили 8,4 млн подписчиков без доступа к сервису. Миграция потребовала перепроектирования архитектуры: инженеры разбили монолит на 500 микросервисов и внедрили Chaos Monkey — инструмент для тестирования отказоустойчивости, который случайно отключал серверы в продакшене.</i></p><p>Этот кейс стал хрестоматийным примером cloud-native подхода. Облачные технологии стали активно использоваться в разработке, а обращение с ними — обязательным навыком для прогеров.</p><h2>2020-2024: AI-assisted разработка и новые парадигмы</h2><p>Пандемия COVID-19 ускорила переход на удаленную работу. Программисты по достоинству оценили макбуки на чипах M1 (2020) за их энергоэффективность и производительность. Домашние офисы оснащались 32-дюймовыми 4К-мониторами и механическими клавиатурами, ставшими своеобразным профессиональным стандартом.</p><figure><img src="https://media.tproger.ru/user-uploads/113565/2025-06-13/65ba41e0-844c-419f-8656-e78905e93540.jpg" alt="" /></figure><p>Языковая палитра продолжала обогащаться. Rust официально вошел в ядро Linux в 2022 году, подтвердив свой статус системного языка нового поколения. Zig появился как современная альтернатива «C» с акцентом на безопасность. WebAssembly (Wasm) позволил запускать ресурсоемкие приложения прямо в браузере, открыв новые возможности для веб-разработки.</p><p>Искусственный интеллект начал проникать в повседневную работу программистов. GitHub Copilot на базе GPT-3, представленный в 2021, изменил сам процесс написания кода, предлагая контекстные подсказки. Low-code платформы вроде Retool упростили создание внутренних инструментов для бизнеса.</p><p>Типичный lead-разработчик в 2024 году:</p><ul><li>умел эффективно работать в гибридных командах (офис + удаленка);</li><li>автоматизировал рутинные задачи через ChatGPT API;</li><li>следил за развитием квантовых вычислений, хотя практическое применение пока оставалось ограниченным.</li></ul><p><i>Ключевой момент. В 2023 году GitHub Copilot, разработанный совместно с OpenAI, стал катализатором перемен в индустрии. За первый год после релиза инструмент использовали более 1,3 млн разработчиков — каждый десятый подписчик GitHub. Система анализировала контекст кода и предлагала целые функции: например, при написании SQL-запроса она автоматически генерировала соответствующую модель данных на Python. Amazon внедрил аналогичный инструмент Amazon Q Developer для внутренних команд — по заявлению CEO Энди Джесси, это сэкономило компании 4,500 человеко-лет работы и $260 млн ежегодно.</i></p><p><i>Но были и курьезы. В 2024 году разработчик из Берлина случайно отправил в продакшен код, полностью сгенерированный Copilot. Система использовала фрагмент из GPL-лицензированной библиотеки, что нарушило политику компании по открытому ПО. Инцидент заставил пересмотреть процессы ревью: теперь 78% команд требуют ручной проверки AI-кода перед мержем (слиянием).</i></p><p><i>Параллельно выяснилось, что Copilot в 40% случаев предлагает уязвимый код при работе с СУБД — это привело к взлому API стартапа через SQL-инъекцию. Такие кейсы показали, что ИИ пока не заменяет программистов, а требует от них новых навыков — критического анализа машинных предложений и понимания юридических аспектов кода.</i></p><h2>2025: Современное состояние профессии</h2><p>Современные рабочие станции программистов оснащены ноутбуками с процессорами Apple M4 (3 нм) или Windows-машинами на Snapdragon X Elite. Мониторы с разрешением 8К используются для разработки AR-приложений, а OLED-экраны с HDR стали стандартом для работы с графикой. Появляются первые экспериментальные IDE с нейроинтерфейсами, способные предсказывать код на основе анализа мозговой активности.</p><p>Среди языков программирования выделяется Mojo (2023) — «Python для GPU», набирающий популярность в сфере машинного обучения. Carbon как потенциальный наследник C++ пока остается в тени Rust. Квантовые языки вроде Q# и Cirq интересуют в основном энтузиастов и исследователей.</p><p>Профессия претерпела значительные изменения. ИИ стал не конкурентом, а помощником — по некоторым оценкам, около 60% рутинного кода в 2025 году (тесты, документация) генерируется автоматически. Знание английского языка стало важнее знания сложных алгоритмов — без него невозможно эффективно работать с современными AI-инструментами. Понятие «fullstack-разработчик» трансформировалось — теперь оно подразумевает владение фронтендом, одним бэкенд-языком и основами машинного обучения.</p><p>За два десятилетия программисты прошли путь от одиночек за CRT-мониторами до участников глобальных распределенных команд. Если в 2005 ключевым навыком было умение написать работающий код, то в 2025 главное — способность эффективно взаимодействовать с ИИ-ассистентами. Однако основы профессии остались неизменными — логическое мышление, способность к абстракции и желание автоматизировать рутинные задачи.</p><p>Будущее обещает новые трансформации. К 2030 году нейроинтерфейсы смогут заменить традиционные устройства ввода, а квантовые компьютеры — перевернуть основы криптографии. Но пока актуальными остаются проверенные временем принципы: изучать перспективные технологии (вроде Rust и Mojo), осваивать работу с ИИ и, конечно, совершенствовать главный навык любого программиста — умение быстро и грамотно гуглить.</p><p>Ты уже программист, если читаешь это! Больше о кодинге <a href="https://t.me/+ezugB7gnIEsxNGMy">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</title>
      <link>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</link>
      <comments>https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha</guid>
      <description><![CDATA[<p>Нужен ли сеньору второй язык программирования? Опыт и выводы разработчика с 18 годами стажа — когда и зачем изучать новые языки</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/--nuzhen-li-senoru-vtoroj-yazyk-programmirovaniya--opytom-podelilsya-razrabotchik-s-18-godami-stazha">Нужен ли сеньору второй язык программирования? Опытом поделился разработчик с 18 годами стажа</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 06 May 2025 06:04:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>В айтишных чатах нередко звучит мнение: хороший сеньор должен уметь программировать на любом языке.</p><p>Оскар — разработчик с 18-летним стажем. Он решил <a href="https://www.architecture-weekly.com/p/why-we-should-learn-multiple-programming">разобраться</a>, насколько утверждение про необходимость знать множество языков правдива.</p><p>Сам Оскар за свою карьеру успел поработать с C#, Java, C++, Python, Ruby, JavaScript, Perl и прочими языками. Но не потому что стремился к полиглотству, а потому что так сложилось — проекты, клиенты, задачи.</p><p>По его мнению, изучение новых языков не просто расширяет кругозор. Это помогает иначе смотреть на архитектуру и подходы к решению задач. Даже если вы продолжаете писать на своем основном языке, знакомство с другими помогает вырасти ментально.</p><h2>Синтаксис — это не все</h2><p>Проблема в том, что многие изучают новый язык на уровне «выучил синтаксис — значит, могу писать». Но это часто приводит к «Java-коду на Go» или «C#-архитектуре в TypeScript». Новички в языке переносят привычные паттерны, не понимая, как использовать сильные стороны новой платформы.</p><p>Чтобы писать идиоматично, нужно время. Неделя — чтобы освоить синтаксис. Пару месяцев — чтобы почувствовать экосистему. Год — чтобы писать как носитель языка.</p><h2>Когда стоит добавлять новый язык в стек</h2><p>Оскар выделяет три повода:</p><ul><li>Бизнес-задача. Например, для тяжелых расчетов стоит взять язык быстрее JavaScript.</li><li>Кадровый вопрос. Иногда проще найти разработчиков под Node.js, чем под Java.</li><li>Карьерный рост. Умение работать с востребованным стеком открывает больше возможностей.</li></ul><p>Но главное — не делать выбор из любопытства. Однажды Оскару пришлось переписать модуль с F# на C#, потому что никто не хотел его поддерживать. В другом проекте Python-модуль оказался узким горлышком и потребовал переделки. Эти эксперименты дорого обошлись бизнесу.</p><h2>Архитектору — особенно важно</h2><p>Если вы архитектор, то знание языков — не просто плюс, а необходимость. Без этого вы будете опираться на чужие слова и чужие слайды, а не на собственный опыт. Лучшие архитекторы, по словам Оскара, регулярно пишут код — пусть и не фуллтайм.</p><h2>Баланс между глубиной и гибкостью</h2><p>Итак, должен ли сеньор уметь писать на любом языке? Не обязательно. Но он должен уметь быстро адаптироваться, понимать принципы, а не только синтаксис. И главное — не бояться признать, что его любимый язык не всегда лучший выбор.</p><p>Языки — это инструменты. Хороший разработчик остается таковым вне зависимости от того, на чем он пишет.</p>]]></content:encoded>
    </item>
    <item>
      <title>Язык Elixir и функциональное программирование: что это за зверь и почему он хорош для отказоустойчивых систем</title>
      <link>https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem</link>
      <comments>https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Владислав Устинов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem</guid>
      <description><![CDATA[<p>Что такое язык Elixir. Показываем сравнение языка Эликсир с другими. Рассматриваем преимущества и основные нюансы ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/yazyk-elixir-i-funkcionalnoe-programmirovanie--chto-eto-za-zver-i-pochemu-on-horow-dlya-otkazoustojchivyh-sistem">Язык Elixir и функциональное программирование: что это за зверь и почему он хорош для отказоустойчивых систем</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 22 Apr 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Основные принципы функционального программирования</h2><p>Elixir — функциональный язык программирования. Это значит, что здесь нет классов, объектов и прочих абстракций из ООП. Рассмотрим его особенности более детально.</p><h3>Чистые функции и отсутствие побочных эффектов</h3><p>Чистые функции делают код более предсказуемым и надёжным. У них есть два главных признака:</p><ul><li><b>Предсказуемый результат: </b>для одних и тех же входных аргументов такая функция всегда возвращает одно и то же значение. Её результат зависит исключительно оттого, что ей передали, в коде нет заимствований извне.</li><li><b>Отсутствие побочных эффектов: </b>она не взаимодействует с «внешним миром» — не изменяет данные вне своей области видимости, не выводит информацию на экран, не пишет в файлы, не зависит от случайных чисел или текущего времени.</li></ul><p>Рассмотрим на примере:</p><p>Функция sum — чистая, потому что она всегда возвращает один и тот же результат для одних и тех же входных данных (a и b). Если мы вызовем alculator.sum(10, 5), то всегда получим 15. Она не меняет никаких данных вне себя и не взаимодействует с внешним миром. Результат зависит только от её аргументов.</p><p>А это пример нечистой функции:</p><p>Функция sum_with_config выглядит похожей на sum, но она нечистая, потому что зависит от внешнего состояния и ведёт себя непредсказуемо.</p><p>Значение b берётся из файла config.txt. Если файл пуст, содержит 5 или, например, 100, результат будет разным, даже если аргумент a не изменился.</p><p>Код с чистыми функциями проще понимать, отлаживать, тестировать, рефакторить и переиспользовать. А ещё он хорошо подходит для задач, где важна безопасность при параллельном выполнении.</p><h3>Иммутабельность данных</h3><p>Elixir, как язык функционального программирования, поддерживает иммутабельность данных.</p><p>Вспомним, как мы обычно изменяем значения переменных в других языках на примере Python:</p><p>Мы создаём переменную x, она записывается в память, где ей присваиваем значение 10.</p><p>Далее мы присваиваем ей новое значение 11, и оно обновляется в памяти. Десятки больше нет.</p><p>Теперь рассмотрим похожий пример на Эликсире:</p><p>В память записывается значение 10, а не x. Только после этого присваиваем нашему значению «ярлык» в виде x.</p><p>Если у нас несколько переменных с одинаковыми значениями, то все они ссылаются на один участок памяти. В данном случае y ссылается на туже самую десятку.</p><p>Когда мы меняем значение переменной, мы на самом деле создаём новое в памяти, в данном случае 11, и присваиваем к нему новый «ярлык» — x.</p><p>Старое значение 10 остаётся, если у него есть другие ссылки или ярлыки. Если их нет, то его удаляет сборщик мусора. В данном случае 10 останется вместе с переменной y.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-15/e68eda57-9464-4c02-bd16-eeb12a6efb82.jpg" alt="" /><figcaption>Мутабельный и иммутабельный подход к переназначению переменных</figcaption></figure><p>Такой подход называют иммутабельностью. Он позволяет избежать ошибок, особенно когда несколько процессов читают одни и те же данные.</p><h3>Каррирование и композиция функций</h3><p><b>Каррирование </b>часто встречается в функциональных языках программирования. Оно означает, что мы превращаем функцию в цепочку, которая принимает только один аргумент.</p><ul><li>У нас есть функция sum(a, b), которая ожидает оба числа сразу.</li><li>После каррирования мы получаем функцию curried_sum(a).</li><li>Когда мы вызываем curried_sum(5), она не считает сумму. Вместо этого возвращает новую функцию. Назовём её условно add_five_func. Эта функция «запомнила», что a = 5, и теперь ждёт единственный аргумент — b.</li><li>Следующим шагом мы берём эту только что полученную функцию (add_five_func) и вызываем её, передавая ей значение 3 в качестве аргумента b.</li><li>Именно этот вызов (add_five_func(3)) запускает финальное вычисление (5 + 3) и возвращает нам результат 8.</li></ul><p>Благодаря каррированию код получается более модульным, функции можно любым образом комбинировать и проще тестировать.</p><p>Недостаток каррирования — код становится сложным, трудно читаемым. Ещё новые функции влияют на производительность, и во многих сценариях каррирование может быть избыточным.</p><p>В некоторых языках программирования, например, в Haskell или F#, есть фишки для более удобного синтаксиса каррирования и даже автоматическое каррирование, но не в Elixir. В нём всё приходится делать с награмождением и без плюшек под капотом.</p><p><b>Композиция </b>— это когда мы объединяем несколько функций в одну, где выходные данные одной функции передаются как входные данные для другой.</p><p>Представим, что нам нужно взять строку, убрать у неё лишние пробелы по краям, перевести в верхний регистр, а затем развернуть задом наперёд. Вместо того чтобы писать вложенные вызовы, мы можем использовать композицию с |&gt;:</p><ul><li>Мы начинаем с initial_string.</li><li>Оператор |&gt; берёт значение initial_string и передаёт его как первый аргумент функции String.trim().</li><li>Результат String.trim() ("hello elixir world") снова берётся оператором |&gt; и передаётся как первый аргумент в String.upcase().</li><li>Результат String.upcase() ("HELLO ELIXIR WORLD") аналогично передаётся в String.reverse().</li><li>final_result получает итоговое значение этой цепочки — "DLROW RIXILE OLLEH".</li></ul><p>Такие функции проще читать и комбинировать, но при отладке цепочки могут возникать проблемы.</p><h3>Работа с рекурсией вместо циклов</h3><p>В функциональных языках программирования часто приходится работать с рекурсией вместо циклов. Их разница в том, что цикл — это функция, которая повторяет код внутри себя. Рекурсия — функция, которая начинается, завершается и вызывает саму себя, вместо того, чтобы зацикливать содержимое.</p><figure><img src="https://media.tproger.ru/user-uploads/105039/2025-04-15/388125fb-01ac-4a3b-ad10-91a619d9d78f.jpg" alt="" /><figcaption>Спасибо пользователю fesher за идею схемы сравнения рекурсии и цикла</figcaption></figure><p>Она работает как два зеркала, которые поставили друг напротив друга. Одно отображает другое.</p><p>Пример рекурсии в Elixir:</p><p>Этот код выводит числа меньше пяти. Он работает до тех пор, пока переменная n не будет равна нулю.</p><p>В отличие от цикла, функция print_down() в конце вызывает сама себя.</p><p>Рекурсии отлично подходят для задач с вложенностью и хорошо читаются. Но с ними надо быть начеку, так как они могут бесконечно выполняться и переполнять память.</p><p>Иногда в функциональном программировании используют хвостовую рекурсию. Она отличается от обычной рекурсии тем, что рекурсивный вызов является последним действием в функции, и после него не выполняется никаких дополнительных операций. Это позволяет виртуальной машине (в случае Elixir — BEAM) оптимизировать рекурсию, избегая создания новых кадров стека для каждого вызова.</p><p>Здесь используется аккумулятор acc, который накапливает промежуточный результат. Рекурсивный вызов factorial(n - 1, n * acc) — это последнее действие в функции, и после него ничего не происходит.</p><h2>Особенности языка Elixir</h2><h3>Синтаксис, вдохновлённый Ruby</h3><p>Хосе Валими, создатель Эликсира, хотел взять элегантность и простоту Ruby, чтобы разработчики могли писать код, который легко читается.</p><h4>Читаемость и минимум шума</h4><p>Как и Ruby, язык Elixir выглядит чисто — меньше скобок, точек с запятой и лишних символов. Пример с Ruby:</p><p>Пример с Elixir:</p><p>Интерполяция строк с #{} — прямое заимствование из Ruby. Это делает вывод текста интуитивным.</p><h4>Блоки с do...end</h4><p>В Ruby и Elixir есть блоки кода с do...end для функций и управляющих структур:</p><p>Ruby:</p><p>Elixir:</p><p>В обоих языках do...end обозначает тело функции — это привычно для рубистов и делает переход на Elixir проще.</p><h4>Сахарный синтаксис</h4><p>Ruby славится «синтаксическим сахаром» — удобными сокращениями. Elixir тоже этим балуется:</p><p>Ruby — пропуск скобок в вызовах:</p><p>Elixir — короткая запись для однострочных функций:</p><p>Оба языка стараются убрать лишнее, чтобы код был лаконичным.</p><h4>Модули вместо классов</h4><p>В Ruby классы и модули — основа ООП:</p><p>В Elixir модули — это просто контейнеры для функций, без ООП:</p><p>Имена модулей и стиль их использования явно перекликаются с Ruby, хотя и Elixir функциональный язык.</p><p>Среди языков, как Elixir, которые ориентированы на функциональное программирование и конкурентность, мало кто предлагает столь же современный и читаемый синтаксис.</p><h3>Конкурентность через Actor-модель (Erlang VM)</h3><p>Эликсир основан на виртуальной машине Erlang VM. Она поддерживает конкурентность и работу при помощи Actor-моделей.</p><p>Конкурентность — когда мы управляем множеством задач или потоков. Эти задачи могут выполняться параллельно, если у нас многоядерный процессор, либо быстро переключаться на одном ядре, создавая иллюзию одновременности.</p><p>Обычно конкурентные задачи работают с общей памятью. Это может приводить к малозаметным ошибкам наподобие гонки данных или взаимоблокировок. Для таких случаев в Elixir есть Actor-модели.</p><p>Это сущности, которые отвечают за выполнение задач. Акторы в Эликсире изолированы. Каждый процесс — это легковесный актор с собственной памятью:</p><p>Этот код запускает новый процесс, который выведет сообщение и умрет. А теперь представим миллион таких:</p><p>Акторы не дерутся за ресурсы — они отправляют сообщения через send и ждут ответа с receive:</p><p>Благодаря тому, что акторы изолированы друг от друга, у системы высокая отказоустойчивость. Если одни актор отвалится, то не потянет за собой остальных.</p><h3>Распределённые вычисления и масштабируемость</h3><p>Elixir отлично подходит для горизонтального и вертикального масштабирования. Мы можем распределять акторов по разным узлам, которые связаны между собой как одна система:</p><p>Node.connect соединяет два узла. Node.spawn запускает процесс на узле node2@host. Код выполняется там, но мы управляем им с узла node1@host.</p><h3>Встроенная поддержка обработки отказов (fault tolerance)</h3><h4>Изоляция процессов</h4><p>В Elixir задачи выполняются в отдельных процессах. Каждый процесс изолирован: у него своя память, и он не может случайно сломать другие процессы. Если один падает, система продолжает работать.</p><h4>Связывание и мониторинг</h4><p>Иногда нужно знать, что процесс упал, чтобы отреагировать. Для этого есть связывание (Process.link) и мониторинг (Process.monitor).</p><p><b>Связывание </b>соединяет процессы. Если один процесс падает, то другой получает сигнал и тоже падает.</p><p>В этом примере spawn_link связывает процессы. Когда дочерний процесс падает (raise), главный тоже падает, потому что они связаны. Поэтому IO.puts не выполнится.</p><p><b>Мониторинг мягче</b> — мы просто получаем сообщение о сбое, падение процесса не тянет за собой другие процессы.</p><p>Process.monitor(pid) включает наблюдение за процессом. Когда тот падает, мы не падаем сами, а получаем сообщение. Мы его обрабатываем через receive.</p><h4>Supervisor</h4><p>Supervisor — это специальный процесс в Эликсире, который следит за другими процессами и перезапускает их, если они падают. Supervisor позволяет не просто переживать сбои, а автоматически восстанавливаться.</p><ul><li>Demo.start запускает супервизор, который следит за одним процессом.</li><li>start_crasher — запускает процесс, который тут же падает.</li><li>Супервизор автоматически перезапускает его бесконечно.</li></ul><h4>Распределённость и отказоустойчивость</h4><p>Отказоустойчивость Elixir работает не только на уровне одного сервера, но и на уровне кластера. Если процессы на разных узлах и один сервер падает, то нагрузка равномерно распределяется между другими серверами.</p><p>Всё происходит с одного узла (node1) — он управляет и следит. Если процесс на node2 падает (например, узел отвалился или exit(:boom)), то :DOWN ловится через monitor и запускается резерв на node3.</p><h2>Сравнение Elixir с другими языками</h2><h3>Elixir vs Erlang: современный синтаксис против классического подхода</h3><p>У Elixir и Erlang много общего. Во-первых, они оба придерживаются функционального подхода к программированию, во-вторых, у них общая виртуальная машина Erlang VM (BEAM). Именно от неё Elixir получил связанные с отказоустойчивостью фишки вроде акторов.</p><h4>Общий синтаксис</h4><p>Несмотря на то, что между языками много общего, эликсир был разработан с учётом требований к современным языкам программирования, в том числе к синтаксису.</p><p>У Erlang он классический, немного старомодный, с уклоном в функциональный стиль. Много точек, запятых и точек с запятой.</p><p>Elixir читаемый, минималистичный, с закосом под Ruby. Код выглядит чище и ближе к современным языкам:</p><h4>Работа со строками</h4><p>В Erlang строки — это списки символов, каждый «Hello» внутри — это [72,101,108,108,111].</p><p>Тут всё строго: ++ склеивает списки, а io:format с ~s выводит результат. Это работает, но медленно и неудобно, особенно для больших текстов.</p><p>А вот так выглядит код на эликсире:</p><p>Строки в эликсире — это бинарные данные, быстрые и удобные. Оператор &lt;&gt; соединяет их, а |&gt; (pipe) делает код читаемым, как поток: взял «Hello», добавил «world», вывел. Никаких списков и лишних точек.</p><h4>Работа со списками</h4><p>Подход к работе со списками тоже отличается. В Erlang:</p><p>Тут всё вручную: [0|List] добавляет элемент в начало, а ~p выводит.</p><p>В Elixir списки тоже функциональны, но с бонусами:</p><p>У модуля Enum есть готовые функции вроде map, которые экономят время и нервы.</p><h4>Работа со словарями</h4><p>Erlang долго обходился без словарей, а когда они появились (maps), то остались простыми:</p><p>Всё по делу, но без изысков. А вот пример с эликсиром:</p><p>Точечная нотация (map.age), удобный синтаксис и pipe для обновлений.</p><h3>Elixir vs Ruby: почему Elixir лучше подходит для высоконагруженных систем</h3><p>Ruby: Использует потоки (threads) или процессы ОС (например, через Puma или Unicorn). Это тяжеловесный подход: каждый поток потребляет память, а глобальная блокировка интерпретатора (GIL в MRI Ruby) ограничивает параллелизм.</p><ul><li>GIL мешает реальной параллельности на одном ядре.</li><li>Для масштабирования нужны новые сервера и внешние инструменты (Redis, Sidekiq).</li></ul><p>У Ruby нет такой отказоустойчивости и имутабельности. В конце концов, это интерпретируемый язык с одним потоком выполнения в MRI, а значит, у него невысокая производительность.</p><h3>Elixir vs Go: конкурентность через процессы BEAM против горутин</h3><p>Процессы в Elixir благодаря акторам изолированы друг от друга, у них нет общей памяти и поэтому они более отказоустойчивые. Из-за изоляции один процесс весит от 300 кб.</p><p>У Go есть свои аналоги акторов, они называются горутины, но работают немного иначе. Гоурутины не изолированы между собой, у них общая память и они «дешевле». Один горутин весит от 2 кб., вместо 300 кб. как у Elixir.</p><p>Благодаря этому горутины лучше работают с памятью и более производительны в сравнении с акторами. Однако из-за отсутствия изоляции приходится заморачиваться с их синхронизацией. Такая система менее отказоустойчивая. Go лучше подходит для проектов, где важнее всего производительность, Elixir выигрывает там, где нужна стабильность.</p><h2>Примеры кода на Elixir</h2><h3>Определение модуля и функций</h3><p>Модули — это «коробки», в которые мы помещаем функции. Так проще организовать код:</p><ul><li>defmodule создаёт модуль, внутри него — функции с def.</li><li>do...end — для многострочных функций, do: — для коротких.</li><li>IO.puts — это как print, выводит результат в консоль.</li></ul><h3>Использование pipe (|&gt;) для удобного комбинирования операций</h3><p>Pipe-оператор (|&gt;) — это фишка Elixir, которая делает код читаемым, передавая результат одной операции в следующую.</p><p>|&gt; берёт результат и передаёт его как первый аргумент следующей функции.</p><p>Вместо вложенных вызовов (String.reverse(String.trim(String.upcase("elixir")))), мы пишем шаги сверху вниз.</p><h3>Асинхронные процессы через spawn и GenServer</h3><ul><li>spawn запускает новый процесс, который работает параллельно.</li><li>pid — это идентификатор процесса, его можно использовать для общения между процессами.</li><li>Процессы изолированы: один спит, другой идёт дальше.</li></ul><h2>Где применяется Elixir?</h2><h3>Веб-приложения с высокой нагрузкой (Phoenix Framework)</h3><p>Фреймворк Phoenix, построенный на Elixir, идеален для веб-приложений, которым нужно обрабатывать тысячи или миллионы пользователей одновременно. Вот пара примеров его использования:</p><p>Bleacher Report: Этот спортивный сайт, их аудитория превышает 200 млн человек. В 2017 году <a href="https://www.erlang-solutions.com/case-studies/bleacher-report-case-study/">его перенесли</a> на Phoenix, чтобы улучшить производительность и справиться с пиковыми нагрузками во время крупных событий. Phoenix позволил  эффективно использовать веб-сокеты для интерактивных функций, по типу обновлений в реальном времени.</p><p>Pinterest: Одна из крупнейших социальных платформ, которая <a href="https://www.monterail.com/blog/famous-companies-using-elixir">использует </a>Elixir для управления трафиком и отправки уведомлений с 2014 года. Благодаря Elixir компании удалось повысить производительность системы уведомлений до 14 тыс. в секунду. Также получилось сократить количество серверов для этой задачи с 30 до 15.</p><h3>Чаты и мессенджеры</h3><p>Elixir отлично подходит для real-time приложений, где важна мгновенная доставка сообщений и высокая отказоустойчивость:</p><p>Discord: Популярная платформа для геймеров и сообществ <a href="https://www.monterail.com/blog/famous-companies-using-elixir">использует </a>Elixir для обработки миллионов сообщений в реальном времени. Каждый пользователь или чат работает как отдельный процесс, что позволяет системе легко масштабироваться.</p><p>WhatsApp: В основном работает на Erlang, но Elixir <a href="https://www.netguru.com/blog/10-companies-use-elixir">здесь тоже присутствует</a>. Он помогает обрабатывать миллиарды сообщений каждый день.</p><h3>Микросервисная архитектура</h3><p>Elixir используется в микросервисах — подходе, где большие системы разбиваются на независимые сервисы. Вот несколько примеров:</p><p>Financial Times: Известное издание <a href="https://www.erlang-solutions.com/blog/which-companies-are-using-elixir-and-why-mytopdogstatus/">перешло </a>на Elixir для своего GraphQL API, чтобы повысить производительность и обеспечить стабильность при росте числа читателей.</p><p>Lonely Planet: Этот туристический ресурс <a href="https://www.erlang-solutions.com/blog/which-companies-are-using-elixir-and-why-mytopdogstatus/">использует </a>микросервисы на Elixir для управления контентом, что позволяет быстро обновлять данные и масштабировать систему под миллионы пользователей.</p><p>PepsiCo: Компания <a href="https://www.erlang-solutions.com/blog/which-companies-are-using-elixir-and-why-mytopdogstatus/">применяет </a>Elixir в проектах eCommerce и IoT, где микросервисы помогают эффективно обрабатывать данные и взаимодействовать с клиентами.</p><p>Изолированные процессы и встроенные инструменты для распределённых систем делают Elixir надёжным выбором для микросервисной архитектуры.</p><h3>Интернет вещей (IoT) и распределённые системы</h3><p>Elixir также нашёл своё место в IoT, где важны стабильность и управление множеством устройств:</p><p>Nerves: Это открытый проект, который позволяет создавать прошивки для IoT-устройств на <a href="https://nerves-project.org/">Elixir</a>.</p><p>TeslaMate: Приложение, <a href="https://www.balandavid.com/en/posts/2023/01/elevate-your-tesla-experience-with-teslamate/">написанное </a>на Elixir, собирает данные с автомобилей Tesla в реальном времени, предоставляя владельцам подробную статистику. Оно демонстрирует, как Elixir справляется с обработкой данных от распределённых источников.</p><p>В IoT каждое устройство может работать как отдельный процесс, а супервизоры обеспечивают стабильность, даже если одно из устройств временно отключается.</p><p>Ты точно программист, если читаешь это! Больше мемов, инсайтов и боли кодеров <a href="https://t.me/+ajgz7pDecB4xZTI6">тут</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</title>
      <link>https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki</link>
      <comments>https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Егорцев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki</guid>
      <description><![CDATA[<p>Популярные фреймворки для веб-разработки. Показываем основные виды фреймворков. Рассматриваем пошаговую инструкцию по использованию ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/obzor-populyarnyh-frejmvorkov-dlya-veb-razrabotki">Фреймворки, меняющие игру: выбираем идеальный инструмент для ваших веб-проектов</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[MySQL]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Node.js]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Приложение]]></category>
      <category><![CDATA[Angular]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Jan 2025 09:00:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Выбор фреймворка влияет на скорость, удобство разработки, производительность, масштабируемость и поддержку приложения. Рассмотрим популярные варианты для веб-разработки фронтенда, бэкенда и фулстека и сравним их между собой.</p><h2>Frontend фреймворки</h2><h3>React</h3><p>Это самый популярный фреймворк для создания веб-приложений. React используется в лендингах, динамических веб-приложениях и даже мобильных приложениях (<a href="https://tproger.ru/articles/your-first-app-in-react-native">React Native</a>).</p><p>UI здесь разбивается на независимые и переиспользуемые блоки. Такие компоненты легко интегрировать, комбинировать в разных частях приложения или между проектами. Фреймворк ускоряет разработку и рефакторинг.</p><p>React обращается к DOM только для обновления изменившихся компонентов. За счет этого повышается производительность приложения.</p><p>Пример простого React компонента:</p><h4>Преимущества фреймворка:</h4><ul><li>Облегчает повторное использование кода и поддержку приложений;</li><li>Имеет множество дополнительных библиотек и инструментов;</li><li>Виртуальный DOM снижает прямые манипуляции с DOM и повышает производительность приложения;</li><li>Фреймворк пользуется популярностью в сообществе. Как результат  —  множество учебников, разборов документации и сторонних библиотек.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Концепции JSX и управления состоянием могут быть сложны для новичков;</li><li>Плохая кроссбраузерная поддержка;</li><li>Требует дополнительных библиотек для маршрутизации и управления состоянием.</li></ul><h3>Vue.js</h3><p>Vue используется для разработки простых лендингов и комплексных веб-приложений. Это гибкое решение, которое можно интегрировать в проекты постепенно.</p><p>Преимущество Vue в его простоте и низком пороге входа. При этом фреймворк сохраняет статус мощного инструмента для разработки сложных веб-приложений.</p><p>Vue автоматически отслеживает зависимости между блоками и обновляет DOM при их изменении, как React.</p><p>Компонентная архитектура Vue позволяет разбивать UI на переиспользуемые части. Разметка, стили и логика разделяются «оболочкой», а это облегчает поддержку и масштабирование приложения.</p><p>Пример простого компонента Vue:</p><p>Экосистема Vue включает множество библиотек и плагинов, расширяющих возможности фреймворка. Например, Vuex для управления состоянием, Vue Router, Nuxt.js и другие.</p><h4>Преимущества фреймворка:</h4><ul><li>Понятный синтаксис и подробная документация;</li><li>Может использоваться как библиотека или цельный фреймворк в зависимости от проекта;</li><li>Есть поддержка серверного рендера;</li><li>Автоматически обновляет интерфейс при изменении данных;</li><li>Имеет небольшой вес файлов.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Меньше ресурсов и сторонних библиотек по сравнению с React и Angular;</li><li>Неполная документация на русском языке.</li></ul><h3>Angular</h3><p>С помощью Angular разрабатывают клиентские части веб-приложений. Этот фреймворк сложнее Vue и React.</p><p>Angular чаще используют для крупных веб-приложений. Например, панели администрирования, системы управления контентом и т. д.</p><p>По аналогии с Vue и React, фреймворк разбивает приложение на независимые, переиспользуемые блоки кода. Компоненты: шаблон; класс, описывающий поведение; стили.</p><p>Освоение Angular требует больше времени и усилий по сравнению с Vue и React из-за архитектуры и специфических концепций. Нужны углубленные знания по внедрению зависимостей, декораторам и модулям.</p><p>Пример простого Angular-компонента:</p><h4>Преимущества фреймворка:</h4><ul><li>Богатый выбор инструментов, шаблонов, которые сокращают сроки реализации сложных приложений;</li><li>Angular CLI расширяется за счет shematics, поэтому его легко доработать под конкретные задачи;</li><li>Есть поддержка TypeScript: статическая типизация улучшает качество кода;</li><li>Встроенная утилита для обновления проекта при переходе на новую версию Angular.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Ангуляр сложнее, чем Вью и Реакт. Его изучение занимает больше времени, если это первый фреймворк в карьере разработчика.</li></ul><h2>Backend фреймворки</h2><h3>Django (Python)</h3><p>Django подходит для широкого спектра приложений — от блогов до высоконагруженных веб-сервисов. Админ-панель фреймворка упрощает управление контентом и пользователями. Django часто используют для разработки новостных сайтов, интернет-магазинов, социальных сетей и образовательных платформ.</p><p>Фреймворк содержит множество инструментов для решения общих задач веб-разработки. «В комплекте» готовые библиотеки для аутентификации пользователей, администрирования контента, работы с формами, маршрутизации URL.</p><p>Django следует архитектурному шаблону Model-View-Controller (MVC). Модели определяют структуру данных, представления обрабатывают логику и взаимодействие с моделями, а шаблоны отвечают за представление данных пользователю.</p><p>Сильная сторона Django — его ORM (Object-Relational Mapping). Интерфейс для работы с базой данных на Python используется для написания сырых SQL-запросов. Django поддерживает PostgreSQL, MySQL, SQLite, Oracle.</p><p>Если ищете универсальный фреймворк для бэкенд-разработки на Python, Django определенно заслуживает вашего внимания.</p><p>Пример модели Django:</p><p>В примере определяем модель Article с полями title, content и published_at. Метод __str__ возвращает строковое представление объекта:</p><p>Представление article_list получает объекты Article из базы данных и передает их в шаблон для отображения.</p><h4>Преимущества фреймворка:</h4><ul><li>Широкий набор инструментов: включает ORM, аутентификацию и админ-панель;</li><li>Фреймворк задаёт структуру проекта — помогает разработчикам понимать, как и где добавлять новую функцию;</li><li>Защищен от SQL-инъекции и подделки межсайтовых запросов;</li><li>Подходит для высоконагруженных приложений.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Django ORM уступает последней SQLAlchemy.</li></ul><h3>Ruby on Rails (Ruby)</h3><p>Rails подходит для быстрого прототипирования и проектов, ориентированных на работу с базами данных. Его используют для SaaS-платформ, CRM-систем, CMS, маркетплейсов и многого другого.</p><p>Rails применяет архитектурный паттерн MVC (Model-View-Controller). Фреймворк хорош с точки зрения бизнес-логики и взаимодействует с базой данных с помощью ActiveRecord ORM.</p><p>Rails поставляется со встроенными инструментами и библиотеками. Например, ActiveRecord для работы с базами данных, ActiveStorage для управления файлами, ActionMailer для отправки email.</p><p>В сообществе Rails огромное количество гемов (библиотек), расширяющих функциональность фреймворка.</p><p>Пример модели Rails (с использованием ActiveRecord):</p><p>Пример контроллера Rails:</p><p>В примере определяем модель Article с валидациями и связями. Контроллер ArticlesController содержит экшены для списка статей, отображения отдельной статьи, создания новой статьи.  Приватный метод article_params используется для фильтрации параметров.</p><h4>Преимущества фреймворка:</h4><ul><li>Продуманная структура, которая продвигает стандарты качества и лучшие практики веб-разработки;</li><li>Active Record ORM упрощает взаимодействие с базой данных;</li><li>Vue, Angular.js и React легко интегрируются с Ruby on Rails.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Ruby on Rails js медленнее Django и Node.js.</li></ul><h3>Node.js с Express (JavaScript)</h3><p>Express — фреймворк Node.js с набором функций для разработки веб-приложений и API. В нем реализован простой интерфейс для HTTP-запросов и маршрутизации.</p><p>Node.js + Express используется для сервисов, серверных приложений (например, чатов или игр).</p><p>Преимущество Node.js и Express состоит в возможности писать на JavaScript как клиентскую, так и серверную сторону. Можно вести разработку на одном языке и делиться кодом с фронтендом и бэкендом.</p><p>Пример простого приложения на Express:</p><h4>Преимущества фреймворка:</h4><ul><li>JavaScript на всем стеке — один язык для фронтенда и бэкенда;</li><li>Имеет минимальные ограничения, можно строить архитектуру как удобно.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Отсутствуют встроенные компоненты, требуются дополнительные настройки для безопасности и работы с базами данных;</li><li>Управление обратными вызовами усложняет код и его поддержку.</li></ul><h2>Full-Stack фреймворки</h2><h3>Laravel (PHP)</h3><p>Laravel — фреймворк для веб-разработки на PHP. Он использует архитектуру MVC: разделяет логику приложения и улучшает организацию кода.</p><p>Laravel выбирают для разработки CMS, SaaS-платформ, электронной коммерции и др. Встроенные библиотеки ускоряют работу.</p><p>В фреймворке реализована:</p><ul><li>Система миграций для управления структурой базы данных;</li><li>Eloquent ORM для работы с данными;</li><li>Система шаблонизации Blade;</li><li>Встроенная поддержка аутентификации и авторизации;</li><li>Очередь заданий и планировщик для выполнения асинхронных задач.</li></ul><p>Пример определения маршрута в Laravel:</p><p>Пример контроллера Laravel:</p><p>Пример модели Eloquent:</p><p>В примерах выше определяем маршрут, который принимает id и возвращает строку с идентификатором. Контроллер UserController методом show получает пользователя из базы данных по id и передает его в представление user.profile. Модель User представляет таблицу пользователей в базе данных и определяет заполняемые атрибуты.</p><h4>Преимущества фреймворка:</h4><ul><li>Шаблонизатор Blade упрощает создание представлений;</li><li>ORM Eloquent облегчает работу с базами данных;</li><li>Есть автоматизация задач с помощью встроенных инструментов и командной строки.</li></ul><h4>Недостатки:</h4><ul><li>Сложности с долгосрочной поддержкой версий.</li></ul><h3>Spring Boot (Java)</h3><p>Spring Boot применяется для разработки микросервисов и облачных приложений. Модульная архитектура используется в независимых сервисах, которые легко масштабировать.</p><p>Фреймворк имеет встроенный контейнер сервлетов (Tomcat, Jetty), чтобы запускать приложение как автономный JAR-файл без развертывания на внешнем сервере.</p><p>Фреймворк также предлагает:</p><ul><li>Автоконфигурацию библиотек (JPA, JDBC);</li><li>Встроенные метрики мониторинга;</li><li>Поддержку внешней конфигурации;</li><li>Интеграцию с базами данных.</li></ul><h4>Преимущества фреймворка:</h4><ul><li>Есть встроенные серверы Tomcat, Jetty и Undertow;</li><li>Облегчает управление зависимостями с помощью стартовых пакетов;</li><li>Оснащен встроенным контейнером сервлетов;</li><li>Автоматическая конфигурация экономит время на старте проекта.</li></ul><h4>Недостатки:</h4><ul><li>Spring Boot создает множество неиспользуемых зависимостей и  увеличивает размер файла развертывания.</li></ul><h3>Meteor (JavaScript)</h3><p>Особенность Meteor в том, что он синхронизирует данные в реальном времени. Фреймворк автоматически обновляет пользовательский интерфейс при изменении данных на сервере. Это возможно благодаря протоколу DDP (Distributed Data Protocol) и реактивным источникам данных, таких как MongoDB.</p><p>На JS + Meteor можно писать код, который работает как на клиенте, так и на сервере. Фреймворк также предоставляет интегрированную систему сборки, которая автоматически объединяет ресурсы приложения.</p><p>Meteor выбирают для разработки приложений, требующих обновления данных в реальном времени (чаты, приложения для совместной работы, панели мониторинга,  игровые проекты). Его реактивная архитектура и синхронизация данных облегчают создание интерактивных и отзывчивых пользовательских интерфейсов.</p><h4>Преимущества фреймворка:</h4><ul><li>Архитектура и синтаксис с понятным кодом упрощают обучение новичков и повышают производительность команды;</li><li>Есть мгновенная синхронизация данных между клиентом и сервером;</li><li>Возможна интеграция базы данных MongoDB.</li></ul><h4>Недостатки фреймворка:</h4><ul><li>Не предлагает широкого функционала для масштабирования и разделения логики на модули;</li><li>Сложности с масштабированием при увеличении числа пользователей из-за обработки данных в реальном времени.</li></ul><p>При выборе фреймворка важно учитывать долгосрочные перспективы проекта. Также следует принимать во внимание доступность обучающих ресурсов и поддержки. Помните, нет идеального решения. Выбор фреймворка зависит от конкретных требований, ресурсов и предпочтений команды.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ужасный код: если бы злодеи хорроров стали программистами</title>
      <link>https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami</link>
      <comments>https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Валерия Турчак]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami</guid>
      <description><![CDATA[<p>Мы погрузились в мрачный мир фантазий и представили, какие языки программирования и роли могли бы выбрать самые известные злодеи хоррор-фильмов, если бы они ворвались в IT. </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/uzhasnyj-kod--esli-by-zlodei-horrorov-stali-programmistami">Ужасный код: если бы злодеи хорроров стали программистами</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Docker]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Kubernetes]]></category>
      <category><![CDATA[Vue]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[микро]]></category>
      <category><![CDATA[CI/CD]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 31 Oct 2024 09:30:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ночь Хэллоуина сгущается, тьма окутывает мир, и из самых глубоких уголков кинематографа выходят наши любимые кошмары. Но представьте, если бы эти жуткие персонажи сменили свое оружие на клавиатуру и монитор? Что, если бы Норман Бейтс автоматизировал свой мотель с помощью Python, а Пеннивайз заманивал пользователей в свои веб-ловушки на JavaScript?</p><h2>1. Норман Бейтс («Психо»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/6951c6b4-9e2b-4498-94aa-7700063929f1.jpg" alt="" /></figure><h2>Почему Python?</h2><p>Норман — сотрудник с раздвоением личности. Python для него как второй Норман: гибкий, мощный и позволяет быстро автоматизировать все, что только можно. Идеально подходит для человека, который ведет двойную жизнь и хочет держать все под контролем, не привлекая лишнего внимания.</p><h2>Его путь в IT</h2><p>Норман начинал как сисадмин в семейном мотеле "Бейтс". Ручное управление серверами быстро ему надоело — ну сколько можно делать одно и то же? Он начал писать скрипты на Python, автоматизируя бэкапы, мониторинг и деплой. Затем подсел на Docker и Kubernetes, завернул всю инфраструктуру в контейнеры и настроил CI/CD пайплайны.</p><p>Однажды Норман без уведомления команды внес критические изменения в продакшен-серверы ночью, когда никого не было на месте. Это привело к сбою системы на несколько часов. Когда коллеги попытались разобраться, он отрицал свою причастность, ссылаясь на проблемы с автоматизацией.</p><p>Но позже выяснилось, что он сделал это под влиянием своего "второго я", не осознавая последствий.</p><h2>2. Майкл Майерс («Хэллоуин»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/2edbbf8b-1b3f-47ba-af52-d973ac93c0cc.jpg" alt="" /></figure><h2>Почему C?</h2><p>Майкл — молчаливый и непробиваемый. C для него — идеальный язык: никаких лишних абстракций, полный контроль над железом. Ему не нужны навороты и фреймворки — только чистый код и абсолютная власть над системой.</p><h2>Его путь в IT</h2><p>С детства Майкл разбирал и собирал механизмы, пытаясь понять, как все работает изнутри. Начал с ассемблера, но перешел на C, когда понял, что так можно быть эффективнее, не теряя контроля. Работал над прошивками для микроконтроллеров, системами реального времени, где каждая миллисекунда на счету. Его код запускает медицинское оборудование и авионику — там, где ошибки не прощаются.</p><p>Однажды Майкл взялся за разработку критически важного модуля в одиночку, отказавшись от помощи и код-ревью. Когда модуль был интегрирован, система дала сбой, что привело к остановке производства.</p><p>Майкл любитель действовать в одиночку, игнорируя окружающих, на работе его нежелание сотрудничать может привести к серьезным проблемам.</p><h2>3. Пеннивайз («Оно»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/3672c708-3a03-446b-be8c-4cb2aa300c53.jpg" alt="" /></figure><h2>Почему JavaScript?</h2><p>Пеннивайз — мастер иллюзий и обмана. JavaScript для него — как волшебная палочка: можно творить что угодно и где угодно. Он любит удивлять пользователей неожиданными эффектами и нестандартными решениями. Вездесущность JS позволяет ему быть везде и сразу, играя с восприятием и ожиданиями.</p><h2>Его путь в IT</h2><p>Начал с создания веб-сайтов, которые завораживали и одновременно пугали пользователей своей необычностью. Быстро освоил все популярные фреймворки, переключаясь между React и Vue. Решил, что одной клиентской магии мало, и ушел в бэкенд.</p><p>Однажды Пеннивайз внедрил в продакшен нестабильную экспериментальную функцию без согласования. Пользователи были шокированы неожиданными изменениями интерфейса, что привело к массовому оттоку клиентов.</p><p>Раньше он появлялся и пугал детей, теперь на работе его неожиданные решения могут привести к убыткам компании и увольнению одним днем.</p><h2>4. Гостфейс («Крик»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/402925e7-3402-42e4-bdb4-36cc95b258aa.jpg" alt="" /></figure><h2>Почему Ruby?</h2><p>Гостфейс обожает интриги и игры разума. Ruby, по его мнению, идеально подходит для хакинга. Ему нравится быть на шаг впереди и всегда оставаться в тени. Ruby дает ему возможность быстро писать скрипты для поиска уязвимостей и эксплойтов.</p><h2>Его путь в IT</h2><p>Сначала был обычным админом, но быстро заскучал без адреналина. Погрузился в мир кибербезопасности, специализируясь на пентестах и социальной инженерии. Может украсить пароль у кого угодно, используя социальную инженерию и хитрость. В компании он тот, кто проводит внутренние проверки безопасности, и никто не знает, когда ждать следующего сюрприза.</p><p>На прошлой неделе Гостфейс решил проверить бдительность коллег и организовал фишинговую атаку внутри компании без предупреждения руководства. Это вызвало панику и недоверие среди сотрудников. Но лучше так, чем терроризировать жертв звонками, хотя...</p><h2>5. Кожаное лицо («Техасская резня бензопилой»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/6b8107b6-df04-4239-9fcf-e2bdc89ca177.jpg" alt="" /></figure><h2>Почему C++?</h2><p>Кожаное лицо любит работать с железом напрямую. C++ дает ему мощь и гибкость, позволяя писать эффективный код для микроконтроллеров. Он ценит контроль над памятью и возможность выжать максимум из ресурсов. Для него код — это инструмент, как и бензопила, которым он мастерски владеет.</p><h2>Его путь в IT</h2><p>С юных лет мастерил устройства из подручных материалов. Когда открыл для себя программирование микроконтроллеров, понял, что это его стихия. Создает прошивки для IoT-устройств, умных гаджетов и даже для самодельных девайсов. Его разработки надежны и устойчивы к любым условиям — будь то жара Техаса или суровая зима.</p><p>Коллеги знают: если нужно что-то спаять, запрограммировать и заставить работать — это к нему. Хотя он не особо разговорчив и может показаться грубоватым.</p><p>Во время стресса из-за сжатых сроков Кожаное лицо повредил дорогостоящее оборудование в лаборатории, пытаясь "улучшить" его без согласования.</p><h2>6. Акула («Челюсти»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/dbc0f930-5c93-49e9-a00e-836b47b26d6c.jpg" alt="" /></figure><h2>Почему Go?</h2><p>Акула — воплощение скорости и эффективности. Go для нее — идеальный инструмент для создания высокопроизводительных сервисов. Простота синтаксиса и мощные возможности конкурентности позволяют ей строить системы, которые не тонут под нагрузкой. Go — это язык для хищников, которые не терпят рутинных задач.</p><h2>Ее путь в IT</h2><p>Начинала с Java, но быстро поняла, что Go лучше подходит для ее целей. Стала экспертом в микросервисной архитектуре, разворачивая кластеры, способные обрабатывать миллионы запросов в секунду. Ее код оптимизирован на все 100%, как и она сама в погоне за добычей.</p><p>Коллеги уважают ее за способность быстро решать сложные задачи и держать систему на плаву. Но однажды в попытках улучшить производительность, Акула самостоятельно изменила настройки кластера, что привело к потере данных. Ей сложно перестроиться от бесконтрольных атак, поэтому на работе ее агрессивные действия могут причинить ущерб. Будьте осторожны.</p><h2>7. Существа из «Тихое место»</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/76c6e40d-6b9e-4077-b55d-f300f7cd357d.jpg" alt="" /></figure><h2>Почему Rust?</h2><p>Существа ценят тишину и надежность. Rust дает им безопасность и высокую производительность, предотвращая ошибки еще на этапе компиляции. Они создают системы, которые работают без сбоев и не требуют вмешательства — все тихо и гладко. Rust — идеальный язык для тех, кто предпочитает оставаться в тени, обеспечивая стабильность.</p><h2>Их путь в IT</h2><p>Начали как системные администраторы, но быстро поняли, что могут сделать больше. Освоили Rust для разработки внутренних инструментов и сервисов мониторинга. Настроили инфраструктуру так, что пользователи даже не подозревают о ее существовании — все работает как по маслу, без лишнего шума.</p><p>Недавно их чрезмерная реакция на мелкие проблемы привела к полной остановке системы. Маленький баг был воспринят как критическая угроза, и они отключили сервисы для "предотвращения катастрофы". Помните, они нападают на любой звук, на работе их гиперчувствительность может нанести вред.</p><h2>8. Сара Фир («Улица страха»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/68b9ede1-3c9c-46a8-b7c8-4d5c22e73a5c.jpg" alt="" /></figure><h2>Почему Kotlin?</h2><p>Сара видит то, что скрыто от других. Kotlin дает ей мощь и гибкость для создания масштабируемых приложений. Он современный и лаконичный, позволяющий писать чистый и понятный код. В сочетании с ML она строит модели, которые могут предсказывать будущее.</p><h2>Ее путь в IT</h2><p>Начинала как аналитик данных, копаясь в цифрах и выявляя закономерности. Освоила Kotlin, чтобы писать эффективные приложения для обработки больших данных.  Руководит командой Data Science, создавая алгоритмы, которые помогают компании быть на шаг впереди конкурентов.</p><p>Убежденная в своей правоте, Сара обновила новую модель без тестирования. Это привело к неверным прогнозам и финансовым потерям. Стоит сказать CTO, что на работе ее уверенность может обернуться против компании.</p><h2>9. Джейсон Вурхиз («Пятница, 13-е»)</h2><figure><img src="https://media.tproger.ru/user-uploads/99854/2024-10-30/d3194107-8621-4d13-a422-7c047cd60ee9.jpg" alt="" /></figure><h2>Почему Java?</h2><p>Джейсон — вечный, как сама Java. Java для него — символ стабильности и надежности. Он ценит проверенные временем технологии и масштабируемость, которую предоставляет язык. Его код такой же прочный, как и он сам, выдерживает любые нагрузки и атаки.</p><h2>Его путь в IT</h2><p>Начал с разработки для банков и крупных корпораций, где ошибка может стоить миллионов. Специализируется на системах, где отказоустойчивость и безопасность на первом месте. С помощью Spring и Hibernate строит архитектуры, которые работают годами без сбоев.</p><p>Было и такое, что Джейсон отказался от обновления технологий и продолжал использовать устаревшие версии, что сделало систему уязвимой для атак. Уверенность в стабильных решениях — это хорошо, но на работе его сопротивление изменениям может навредить безопасности компании.</p><p>Вот такие айтишные персонажи могли бы получиться из наших любимых хоррор-злодеев! У каждого свой уникальный стиль, подход к работе и, конечно же, свой любимый язык программирования.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python, Go, Ruby — сайты создателей популярнейших языков собрали в одном месте</title>
      <link>https://tproger.ru/news/python--go--ruby---sajty-sozdatelej-populyarnejwih-yazykov-sobrali-v-odnom-meste</link>
      <comments>https://tproger.ru/news/python--go--ruby---sajty-sozdatelej-populyarnejwih-yazykov-sobrali-v-odnom-meste?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/python--go--ruby---sajty-sozdatelej-populyarnejwih-yazykov-sobrali-v-odnom-meste</guid>
      <description><![CDATA[<p>Свежий проект собрал личные сайты создателей популярных языков программирования Python, Go и Ruby в одном месте, но столкнулся с техническими трудностями, такими как высокая загрузка процессора</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/python--go--ruby---sajty-sozdatelej-populyarnejwih-yazykov-sobrali-v-odnom-meste">Python, Go, Ruby — сайты создателей популярнейших языков собрали в одном месте</a>»</p>]]></description>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 28 Oct 2024 05:41:19 GMT</pubDate>
      <content:encoded><![CDATA[<p>В сети появился интересный проект, в котором собрали все личные сайты создателей популярных языков программирования.</p><p>Проект представляет собой коллекцию скриншотов страниц, которые служат личными блогами и веб-ресурсами таких известных специалистов, как Джон Маккарти, Дональд Кнут, Роб Пайк и другие.</p><p>Рядом с изображениями сайтов есть ссылки на эти страницы.</p><h2>Технические трудности и идеи для улучшения</h2><p>Изначально проект начал набирать популярность благодаря посту на Reddit.</p><p>Правда, пользователи платформы заметили, что текущая версия сайта сталкивается с рядом проблем. Основные жалобы включают низкую производительность и перегрузку ресурсов браузера.</p><p>Например, пользователи сообщали, что сайт вызывает высокую загрузку процессора, особенно на мобильных устройствах, что делает его практически невозможным для использования.</p><p>Были предложены варианты решения — такие как внедрение ссылок и скриншотов вместо фреймов, чтобы снизить нагрузку на страницу.</p><figure><img src="https://media.tproger.ru/user-uploads/98945/2024-10-28/5c00a11a-d863-4b34-a853-593ba014f5c3.jpg" alt="" /></figure><h2>Идеи для оптимизации сайта</h2><p>Кроме того, обсуждались способы улучшения сайта, чтобы сделать его более удобным.</p><p>Например, был предложен вариант с «ленивой» загрузкой, при котором фреймы подгружаются только тогда, когда пользователь прокручивает страницу до нужного участка.</p><p>Это могло бы значительно уменьшить потребление ресурсов и улучшить пользовательский опыт, особенно на мобильных устройствах.</p><h2>Вдохновение для будущих разработок</h2><p>Отметим, что хоть у проекта и есть проблемы, он явно показывает, насколько интересной может быть идея коллекционирования информации о тех, кто стоит за самыми популярными языками программирования.</p><p>Посмотреть на проект своими глазами можно по <a href="https://homepages.pldb.io/">ссылке</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Языки программирования, которые стоит начать учить в 2024 году</title>
      <link>https://tproger.ru/articles/yazyki-programmirovaniya--kotorye-stoit-nachat-uchit-v-2024-godu</link>
      <comments>https://tproger.ru/articles/yazyki-programmirovaniya--kotorye-stoit-nachat-uchit-v-2024-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[МТС]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/yazyki-programmirovaniya--kotorye-stoit-nachat-uchit-v-2024-godu</guid>
      <description><![CDATA[<p>Изучили популярность и сложность языков программирования, а также размер зарплат разработчиков, чтобы вам было проще сделать выбор.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/yazyki-programmirovaniya--kotorye-stoit-nachat-uchit-v-2024-godu">Языки программирования, которые стоит начать учить в 2024 году</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 31 May 2024 08:12:28 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Как оценивали языки</h2><p>В прошлом году мы опубликовали <a href="https://tproger.ru/articles/kakoj-jazyk-programmirovanija-vybrat-novichku-v-2023-godu">материал</a>, для которого создали несложную методику анализа. Статья стала самой читаемой в нашем блоге и собрала более 33 тыс. просмотров за год.</p><p><b>В этом году решили выбрать тот же путь и оценили языки программирования:</b></p><p>— по рейтингам TIOBE и RedMonk (базируются на данных GitHub и активности обсуждений на Stack Overflow)</p><p>— порогу вхождения</p><p>— размеру зарплат разработчиков</p><p><b>В статье рассматриваем:</b></p><ul><li>Python</li><li>JavaScript</li><li>Java</li><li>TypeScript</li><li>Golang</li><li>Ruby</li><li>Swift</li></ul><h2>Python</h2><h4>Популярность</h4><p>Язык находится на 1-м месте TIOBE. Несмотря на популярность, за год язык потерял в рейтинге 2,39%. Вот динамика изменения позиции Python с 2002 года.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/53e8a524-cd33-4ae8-b048-0d01636bb18e.png" alt="" /></figure><p>Согласно рейтингу RedMonk, язык находится на втором месте. Ниже — динамика популярности языков программирования с 2012 года. На инфографике есть и другие языки, которые обсуждаем в этой статье — можете сразу обратить на них внимание.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/bbb9514d-074a-494f-a1cf-115bd42b9864.jpg" alt="" /></figure><h4>Уровень зарплат</h4><p>По <a href="https://habr.com/ru/companies/habr_career/articles/746038/">данным Хабр Карьеры</a>, медианная зарплата программистов на Python составляет 184 000 ₽. Минимальная заработная плата — 74 000 ₽ (джун), максимальная — 350 000 ₽ (лид).</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/26e756bd-05ab-4f97-abe4-027c5ae57d7f.png" alt="" /></figure><h4>Порог вхождения и перспективы</h4><p>Python считается не очень сложным языком для освоения, на базовом уровне он доступен новичкам без технического образования.</p><p>На Python можно писать как относительно несложные проекты, так и корпоративные системы с комплексной архитектурой. А библиотеки Python (TensorFlow и Keras) сделали его популярным среди специалистов для создания нейронных сетей и моделей машинного обучения.</p><h2>JavaScript</h2><h4>Популярность</h4><p>В рейтинге TIOBE JavaScript находится на 6-м месте, потеряв за год 0,11% (особой динамики нет). Это может означать только одно: JavaScript стабильно популярен у разработчиков.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/9d141f92-d54f-4a5e-8570-cd5f8f797725.png" alt="" /></figure><p>В рейтинге RedMonk JavaScript на 1-м месте — он не сходит с этой позиции с 2012 года. Только один раз, в 2013 году, JavaScript уступил Java, но уже в 2014-м вернул место лидера.</p><h4>Уровень зарплат</h4><p>Согласно <a href="https://habr.com/ru/companies/habr_career/articles/746038/">Хабр Карьере</a>, медианная заработная плата составляет 176 000 ₽. Минимальная зарплата у джунов — 70 000 ₽, а максимальная, у сеньоров — 199 000 ₽ (данных по лидам у сервиса нет).</p><h4>Порог вхождения и перспективы</h4><p>Технологии JavaScript используют практически во всех отраслях IT. У языка не очень высокий порог входа, что делает его доступным для новичков.</p><p>Чтобы познакомиться с основами языка (синтаксис, типы данных, операторы), новичку достаточно 1-2 месяцев. Ещё месяц уйдёт на изучение работы с DOM-деревом и событиями. После этого человек сможет писать несложные скрипты для сайтов: для валидации форм, слайдеров, обработки кликов пользователя и т. д. Ну а дальше нужно осваивать асинхронное программирование и фреймворки — на это уйдёт от 2 до 5 месяцев.</p><p>В ближайшее время JavaScript вряд ли потеряет популярность, ведь с его помощью можно разрабатывать сайты (как фронтенд, так и бэкенд), приложения для смартфонов и даже игры. На JavaScript написан весь фронтенд  Gmail и другие известные на весь мир приложения.</p><h2>Java</h2><h4>Популярность</h4><p>В рейтинге TIOBE Java находится на 4-м месте, язык потерял за год 4,34%. Сильнее сократился показатель лишь у языка С# — он упал на 4,81% за год. Тем не менее это не критическое падение.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/e026ca0f-b343-44f2-b60c-b4f85b00a1b0.png" alt="" /></figure><p>Во втором рейтинге Java на 3-м месте — там он находится уже три года подряд. В RedMonk Java весьма стабилен: с 2012 года язык то падает до 3-го места, то поднимается на второе.</p><h4>Уровень зарплат</h4><p><a href="https://habr.com/ru/companies/habr_career/articles/746038/">По информации Хабр Карьеры</a>, медианная зарплата специалистов по Java составляет 212 000 ₽. Джуны зарабатывают около 95 000 ₽, а лиды — 326 000 ₽. В целом, всё неплохо — компании предлагают разработчикам достойное вознаграждение.</p><h4>Порог вхождения и перспективы</h4><p>Здесь всё чуть сложнее, чем с предыдущими языками — порог вхождения у Java средний.</p><p>Java — объектно ориентированный язык. Помимо обычной базы в виде синтаксиса, структур данных и операторов придётся освоить концепции ООП: классы, объекты, наследование и полиморфизм.</p><p>В среднем у новичков это занимает от 2 до 6 месяцев. После вы сможете создавать несложные приложения для десктопов, смартфонов и веба: калькуляторы, todo-листы, игры.</p><p>Программисты на Java пользуются большой популярностью на рынке труда. На этом языке разрабатывают мобильные приложения под Android, большие корпоративные системы и игры. Так, на Java написаны Assassin’s Creed и Minecraft, серверная часть Pokemon Go, портала «Госуслуги» и приложений для интернета вещей, а также сервисы доставки еды и продуктов.</p><h2>TypeScript</h2><h4>Популярность</h4><p>У этого языка 35-е место в рейтинге TIOBE. За год TypeScript набрал примерно 0,39%, т. е. почти ничего не изменилось. Тем не менее разработчики советуют изучать TypeScript, в другом рейтинге он занимает более высокое положение.</p><p>По мнению RedMonk, TypeScript находится на 8-м месте, поднимаясь из «подвала» с 2016 года. В прошлом году он занимал то же место, из чего можно сделать вывод, что TypeScript явно востребован среди специалистов.</p><h4>Уровень зарплат</h4><p>На Хабр Карьере нет данных по зарплате разработчиков этой специальности. По информации сервиса <a href="https://zarplan.com/zarplata/%D0%9F%D0%A0%D0%9E%D0%93%D0%A0%D0%90%D0%9C%D0%9C%D0%98%D0%A1%D0%A2%20TYPESCRIPT/%D0%A0%D0%9E%D0%A1%D0%A1%D0%98%D0%AF/">Zarplan</a> (сайт прекратил работу с 1 февраля 2024 года), медианная заработная плата программиста TypeScript составляет 201 000 ₽.</p><h4>Порог вхождения и перспективы</h4><p>Проще всего освоить TypeScript программистам, которые уже знают JavaScript, так как многие концепции и синтаксические конструкции в них похожи. В этом случае достаточно провести пару вечеров за просмотром туториалов на YouTube — из них вы узнаете, что такое статическая типизация, интерфейсы, дженерики и др. Чтобы закрепить полученные знания на практике, понадобится несколько недель.</p><p>Стоит ли учить TypeScript как первый язык программирования? Без знания JavaScript вам будет довольно сложно понять концепции и синтаксис TypeScript, обучение может затянуться на несколько месяцев. В описаниях стажировок и вакансий TypeScript обычно требуется в связке с JS или его фреймворками, поэтому начинать свой путь в программировании с TS не стоит.</p><p>TypeScript используют для создания пользовательских интерфейсов, frontend- и backend-частей веб-сайтов, а ещё больших бизнес-приложений, где требуется стабильность. Соответственно, популярность TypeScript вряд ли будет сильно снижаться.</p><h2>Golang</h2><h4>Популярность</h4><p>По рейтингу TIOBE язык Go находится на 11-м месте. Это один из немногих языков программирования, который за год стал популярнее: Golang набрал 1,38% рейтинга.</p><p>Вот динамика сразу за 14 лет, начиная с появления языка.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/f530405e-4274-446c-acbc-d0405173c2f6.png" alt="" /></figure><p>По RedMonk Go находится на 15-м месте. К слову, он занимал эту позицию ещё в 2018 году, затем несколько опустился в рейтинге и снова стал расти с 2021 года.</p><h4>Уровень зарплат</h4><p><a href="https://habr.com/ru/companies/habr_career/articles/746038/">Хабр Карьера сообщает</a>, что медианная зарплата Golang-разработчика составляет 255 000 ₽. Джуны в среднем получают 125 000 ₽, а лиды — 424 000 ₽. Это один из лучших показателей среди языков программирования, о которых мы говорили выше.</p><h4>Порог вхождения и перспективы</h4><p>Golang — неплохой вариант для новичков, его можно начать осваивать в качестве первого языка программирования. Достоинство Golang в том, что он полный по Тьюрингу, относительно простой и лаконичный.</p><p>При этом проекты на Go можно писать самые разные — от минималистичных ботов до сложных высоконагруженных серверных систем. В целом, он считается языком общего назначения, но главное его применение — разработка веб-сервисов и клиент-серверных приложений.</p><p>На Go разработаны инструменты для контейнеризации Kubernetes и Docker, консольное приложение GitHub CLI, а также база данных для работы с метками Prometheus. Пишут на Go в крупнейших компаниях России и мира, так что перспективы у языка хорошие.</p><h2>Ruby</h2><h4>Популярность</h4><p>В рейтинге TIOBE Ruby занимает 18-ю позицию. При этом за год он практически ничего не потерял, но и не набрал. Так что Ruby остаётся стабильно востребованным языком программирования.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/f9bacec7-9f93-4cb2-8b26-af6e0bc0d442.png" alt="" /></figure><p>А вот c RedMonk иная ситуация: в этом рейтинге у Ruby 9-е место. Но у языка неровная динамика: он то поднимается в рейтинге, то снова падает. Например, в 2012 году он занимал 5-ю позицию.</p><h4>Уровень зарплат</h4><p>Согласно Хабр Карьере, медианная зарплата специалистов составляет 223 000 ₽. По лидам данных нет. Зато известно, сколько получают джуны (в среднем 101 000 ₽) и сеньоры (350 000 ₽).</p><h4>Порог вхождения и перспективы</h4><p>С нуля учить этот язык вряд ли получится, уже практикующие кодеры рекомендуют освоить базовые концепции программирования (переменные, операторы, типы данных, циклы, функции, ООП) и только потом переходить к изучению этого языка. Чаще всего разработчики приходят в Ruby после нескольких лет работы на любых других языках.</p><p>Тем не менее этот язык стоит изучить, поскольку Ruby — современный, постоянно развивающийся язык программирования.</p><p>Ruby применяют в веб-разработке (фреймворк Ruby on Rails), создании скриптов для администрирования, DevOps и тестирования, научных вычислений и обработки данных. С использованием Ruby on Rails написаны серверные части веб-приложений Twitter, GitHub, Airbnb и Shopify, поэтому язык имеет хорошие перспективы в будущем.</p><h2>Swift</h2><h4>Популярность</h4><p>В рейтинге TIOBE язык занимает 16-е место. За год Swift потерял одну позицию, оставаясь тем не менее востребованным и популярным.</p><p>Вот его динамика.</p><figure><img src="https://media.tproger.ru/user-uploads/73713/2024-05-30/9d1ef70e-5dca-48fb-8713-be45d0046440.png" alt="" /></figure><p>По RedMonk видим, что Swift резко поднялся из «подвала» в 2016 году. После чего, начиная с 2018 года, стабильно занимает 11-е место.</p><h4>Уровень зарплат</h4><p>Медианный показатель здесь — 263 000 ₽, джуны получают около 110 000 ₽, а лиды — 430 000 ₽. Если верить <a href="https://habr.com/ru/companies/habr_career/articles/746038/">Хабр Карьере</a>, специалисты по Swift явно одни из самых высокооплачиваемых на рынке.</p><h4>Порог вхождения и перспективы</h4><p>Swift достаточно простой для освоения язык. Заниматься коммерческой разработкой приложений можно уже примерно через год после старта его изучения.</p><p>В ближайшее время вряд ли Swift будет терять разработчиков, ведь на нём держится экосистема Apple. Swift и был создан для написания приложений под iOS, так что спрос на таких специалистов будет стабильно высоким.</p><h2>Что выбрать?</h2><p>Новичку для старта карьеры в IT лучше выбрать язык с максимально низким порогом входа, например Python, Go, JavaScript.</p><p>Если у вас есть технический бэкграунд, можно попробовать освоить и более сложные языки программирования — Ruby и Java.</p><p>В любом случае главное, чтобы процесс затягивал, а работа нравилась. И конечно, не стоит бросать освоение языка на полпути, если что-то не заладилось. Чтобы поддержать мотивацию, рекомендуем к прочтению <a href="https://tproger.ru/articles/kak-vojti-v-ajti-i-ne-slitsya-po-doroge">«Как войти в IT и не слиться по дороге»</a>.</p><p>Желаем удачи!</p>]]></content:encoded>
    </item>
    <item>
      <title>Платформа для работы с исходным кодом GitVerse получила масштабное обновление</title>
      <link>https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3</link>
      <comments>https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3</guid>
      <description><![CDATA[<p>На платформе доступны новые инструменты, ускоряющие разработку, реализован чат в GigaCode, а пользоваться GitVerse теперь может малый и средний бизнес.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/platforma-dlya-raboty-s-ishodnym-kodom-gitverse-poluchila-maswtabnoe-obnovlenie-erid-ljn8kxjg3">Платформа для работы с исходным кодом GitVerse получила масштабное обновление</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[JSON]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[CSS]]></category>
      <category><![CDATA[Рефакторинг]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Сервисы]]></category>
      <category><![CDATA[PyCharm]]></category>
      <category><![CDATA[Мессенджер]]></category>
      <category><![CDATA[ARM]]></category>
      <category><![CDATA[Сбер]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[Фулстек-разработка: полный цикл]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Mar 2024 16:20:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчик платформы СберТех (дочерняя компания Сбера) внес десятки улучшений в базовую функциональность платформы для работы с исходным кодом <a href="https://gitverse.ru/promo/announcement-conference?utm_source=sm_tproger&amp;utm_medium=cpm&amp;utm_campaign=sm_202401033103_media_march_2024_rk528559gr6134&amp;utm_content=article&amp;utm_term=event">GitVerse</a> и представил ее новые возможности, которые помогают ускорить и упростить разработку. Об этом команда платформы рассказала на онлайн-презентации «GitVerse: открой вселенную кода».</p><h2>CI/CD-инструменты</h2><p>CI/CD-инструменты позволят автоматизировать сборку исходного кода и процессы поставки. Разработчики теперь могут воспользоваться уже написанными скриптами сборки, в один клик перенося свои проекты с Git-репозиториев. Технология оповещения о новых событиях на сервере (вебхуки) позволяет реализовать еще больше сценариев автоматизации. По событиям в GitVerse можно вызвать через API сторонние сервисы. Например, при определенных событиях в репозитории можно запустить сторонний сборочный конвейер или отправить уведомление в мессенджер.</p><h2>Новые функции персонального AI-ассистента разработчика GigaCode</h2><p>Теперь AI-ассистент поможет разработчику решать задачи, связанные с кодом, в окне чата непосредственно в среде разработки. Сервис чата также доступен и в GitVerse, где при просмотре репозитория можно получить объяснение, что делает та или иная часть кода, а также советы по его улучшению. Список языков программирования, которые поддерживает GigaCode, пополнил Ruby, а также стала доступна генерация текстовых данных в формате JSON. На сегодняшний день AI-ассистент поддерживает уже более 15 популярных языков программирования и устанавливается как плагин в привычные среды разработки, включая IDEA, PyCharm, VSCode, Jupyter.</p><h2>Функциональность для организаций</h2><p>Теперь разработка на GitVerse доступна не только индивидуальным разработчикам, но и малым и средним предприятиям. Компании могут организовать совместную работу команды и управлять доступами к своим репозиториям.</p><blockquote>При разработке новой функциональности мы учитываем пожелания пользователей, добавляем необходимые инструменты, чтобы они могли вести разработку еще проще и быстрее. С каждым релизом платформа будет становиться все более удобной и пополняться новыми популярными репозиториями, open source-версиями продуктов и инструментами для эффективной разработки. Будущее разработки мы видим в создании удобной среды по принципу единого окна, в которой все члены команды могут работать на своем этапе производственного процесса, заказывать облачную инфраструктуру и общаться. На всех этапах разработки партнерскую роль будет занимать AI: помогать писать код, советовать, как сконфигурировать стенд, готовить документацию, подсказывать шаги по CI/CD-конвейеру</blockquote><p>Также на мероприятии представили дорожную карту развития платформы, согласно которой в этом году появится еще больше полезной функциональности для разработчиков:</p><ul><li>новые инструменты для управления проектами, позволяющие удобно организовывать рабочие процессы;</li><li>интегрированная среда разработки позволит разворачивать полностью настроенные инструменты разработки в облаке. Функциональность будет доступна прямо из браузера: разработчик сможет легко и быстро открыть любой репозиторий GitVerse в среде разработки;</li><li>новые функции GigaCode: генерация тестов, автоматическое создание документации и умный рефакторинг. Число языков, которые поддерживает GigaCode, пополнят PHP, HTML, CSS, Markdown и Rust; <b> </b></li><li>инструменты для безопасной разработки (оркестрация CI/CD, статический анализатор, управление секретами и безопасность зависимостей);</li><li>удобный и безопасный вход через популярные сервисы идентификации личности, а также мобильная версия платформы.</li></ul><p><i>Реклама Реклама АО “Сбертех” ИНН 7736632467, </i> <i>LjN8KXJG3</i></p>]]></content:encoded>
    </item>
    <item>
      <title>Оптимизация Linux для начинающих разработчиков: Ruby on Rails</title>
      <link>https://tproger.ru/articles/optimizaciya-linux-dlya-nachinayushhihrazrabotchikov-ruby-on-rails</link>
      <comments>https://tproger.ru/articles/optimizaciya-linux-dlya-nachinayushhihrazrabotchikov-ruby-on-rails?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Милюхин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/optimizaciya-linux-dlya-nachinayushhihrazrabotchikov-ruby-on-rails</guid>
      <description><![CDATA[<p>Рассказали, как начинающему программисту подготовить рабочее место в Linux для разработки на Ruby on Rails.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/optimizaciya-linux-dlya-nachinayushhihrazrabotchikov-ruby-on-rails">Оптимизация Linux для начинающих разработчиков: Ruby on Rails</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 26 Dec 2023 12:03:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире программирования Linux занимает особое место благодаря своей гибкости, безопасности и мощности. Для начинающих разработчиков настройка Linux может быть как захватывающим, так и немного сложным процессом.</p><p>В этой статье мы рассмотрим как начинающему программисту подготовить себе рабочее место для разработки на фреймворке Ruby on Rails, который предназначен для создания веб-приложений.</p><h2>Выбор подходящего дистрибутива</h2><p>Первый шаг – выбор правильного дистрибутива. Для новичков идеально подходят такие дистрибутивы, как Ubuntu, Fedora и Mint. За основу возьмем ОС Ubuntu 22.04. Стоит отметить, что в Ubuntu уже есть предустановленные языки, такие как Perl, Python, а также Ruby, который и будем использовать</p><h2>Установка необходимого программного обеспечения</h2><p>Ключевым элементом является установка инструментов разработки. Для начала проверим какая версия Ruby установлена у тебя по умолчанию.</p><p>Откроем консоль через комбинацию клавиш Alt+Tab и напишем команду ruby -v. В консоли ты увидишь что-то вроде «ruby 2.4.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux]».</p><p>Версия, которая предустановлена в системе обычно устаревшая, поэтому имеет смысл ее обновить. Обновлять надо через RVM — Ruby Version Manager.</p><p>Для этого опять потребуется консоль, в которой нужно ввести следующие команды:</p><p>Разберем, что здесь написано.</p><ol><li>$ – показывает, что в консоли ты работаешь под правами текущего пользователя. Печатать его перед командой не нужно, его итак видно в консоли перед курсором.</li><li>sudo — команда указывает, что команда после нее будет выполняться под правами суперпользователя (root).</li><li>apt update (или apt-get update, как устаревший вариант) — выполняет обновление доступных пакетов программного обеспечения из репозиториев, другими словами актуализирует список доступных версий программ для установки.</li></ol><p>Выполняем обновление всех установленных программ и библиотек в системе</p><p>apt install — выполняет установку необходимых тебе приложений или библиотек. В данном случае ты выполняешь установку необходимых зависимостей, то есть программ и библиотек, которые потребуются для выполнения дальнейших действий.</p><p>Команда выполняет импорт ключей стороннего репозитория, которые подтверждают надежность этого репозитория и безопасность его использования. Это необходимо, так как на следующем шаге ты установишь в систему новый внешний репозиторий.</p><ol><li>Команда curl c указанными ключами выкачивает скрипт, который находится по адресу https://get.rvm.io;</li><li>Команда bash -s stable запускает этот скрипт в системе. Скрипт установит в систему репозиторий RVM и установит сам RVM версии stable в систему.</li></ol><p>После установки RVM необходимо указать системе, где находится RVM – для этого прописываешь командой место нахождения скриптов RVM в переменные окружения.</p><p>Команда покажет список всех возможных версий языка Ruby, доступных для установки. Тебя интересует версия ruby-3.0.0</p><p>Устанавливаем посредством RVM Ruby версии 3.0.0</p><p>Ты должен убедиться, что все прошло успешно, проверив установленную версию (если увидишь версию 3.0.0, то ты справился).</p><p>Выполнив шаги выше ты обновил версию языка Ruby в системе и готов перейти к следующему этапу — установке фреймворка Ruby on Rails для разработки веб-приложений.</p><h2>Рассмотрим термины, которые будут встречаться дальше</h2><p>Gem — сторонняя библиотека, которая содержит в себе необходимый набор классов и методов, которая позволяет ускорить процесс разработки. Например, тебе нужно написать Телеграм-бота. А для этого что необходимо? Правильно, ознакомиться с официальной документацией, разобраться с http запросами, написать километры кода…</p><p>Но можно пойти по другому пути, а именно — установить gem telegram-bot-ruby и использовать в своем коде методы этого джема, потому как всю логику работы с Телеграм и все километры кода о которых говорили выше, кто-то уже написал.</p><p>Другими словами, ты можешь строить свой дом из кирпича, а можешь из готовых блоков, что будет быстрее и понятнее. В будущем ты сможешь создавать свои джемы, которые облегчат работу тебе и другим разработчикам по всему миру.</p><p>Ruby on Rails (RoR) — фреймворк, написанный на языке ruby, предназначенный для разработки веб-приложений и реализующий архитектуру MVC (model, view, controller).</p><h2>Приступим к установке Ruby on Rails</h2><p>Для этого необходимо выполнить всего одну команду:</p><p>Команда установит джем rails в систему. Как видишь, ничего сложного:</p><p>Проверь версию установленного фреймворка (по умолчанию установится последняя версия RoR)</p><h2>Создадим наше первое веб-приложение</h2><p>После выполнения этой команды фреймворк RoR создаст папку с названием твоего приложения, в которой будет реализована вся шаблонная архитектура приложения, необходимая для дальнейшей разработки.</p><h2>Перейдем в папку с приложением</h2><p>И запустим наше шаблонное приложение:</p><p>Теперь ты можешь перейти в браузере по адресу http://localhost:3000 и увидеть графическую заглушку, которая свидетельствует, что наше приложение запустилось.</p><p>Linux предлагает множество возможностей для разработчиков всех уровней. Вот так, за 14 коротких шагов ты смог создать и запустить свое первое веб-приложение. Успехов в дальнейшей разработке, изучению языка Ruby и фреймворка Ruby on Rails.</p>]]></content:encoded>
    </item>
    <item>
      <title>Стартует батл языков программирования 2023</title>
      <link>https://tproger.ru/articles/startuet-batl-yazykov-programmirovaniya-2023</link>
      <comments>https://tproger.ru/articles/startuet-batl-yazykov-programmirovaniya-2023?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/startuet-batl-yazykov-programmirovaniya-2023</guid>
      <description><![CDATA[<p>Стартует турнир за звание лучшего языка программирования в 2023 году среди читателей Tproger. Кто же победит в этом году?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/startuet-batl-yazykov-programmirovaniya-2023">Стартует батл языков программирования 2023</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Dart]]></category>
      <category><![CDATA[Лучший язык 2023]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 18 Dec 2023 08:27:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Подходит к концу 2023 год, а это значит, пора подвести его итоги и запустить традиционный батл за звание лучшего языка программирования на Tproger.</p><p>Мы уже проводили батл в прошлых <a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2022-zavershilsja">2020</a>, <a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-zavershilsja">2021</a> и <a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2022-zavershilsja-2">2022</a> годах: первые два раза в голосовании победил Python, а в прошлом году — C#.</p><p>Вот, кто поборется за звание лучшего языка в 2023 году:</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-12-18/7e3c300f-7dab-486d-af02-360ba8dc5952.png" alt="" /></figure><p>Правила батла остаются прежними:</p><ol><li>В батле участвует 16 языков программирования.</li><li>Ежедневно соревнуются две пары.</li><li>За любимый язык можно проголосовать в течение 24 часов.</li><li>Пары составляются рандомно, так что выбирайте язык, который субъективно нравится больше.</li><li>В финале мы определим тройку победителей.</li><li>Старт — 19 декабря, финал — 26 декабря.</li></ol><p>Примечание Сохраните эту запись в закладки: сюда мы добавим ссылки на все раунды батла во время голосования.</p><ol><li><a href="https://tproger.ru/articles/nachalsya-battl-yazykov-programmirovaniya-2023">Первый раунд</a></li><li><a href="https://tproger.ru/articles/vtoroj-raund-bitvy-yazykov-programmirovaniya-v-2023-godu">Второй раунд</a></li><li><a href="https://tproger.ru/articles/tretij-raund-bitvy-yazykov-programmirovaniya-v-2023-godu">Третий раунд</a></li><li><a href="https://tproger.ru/articles/chetvyortyj-raund-bitvy-yazykov-programmirovaniya-v-2023-godu">Четвёртый раунд</a></li><li><a href="https://tproger.ru/articles/pyatyj-raund-bitvy-yazykov-programmirovaniya-v-2023-godu">Пятый раунд</a></li><li><a href="https://tproger.ru/articles/westoj-raund-bitvy-yazykov-programmirovaniya-v-2023-godu">Шестой раунд</a></li><li><a href="https://tproger.ru/articles/polufinal-bitvy-yazykov-programmirovaniya-v-2023-godu">Полуфинал</a></li><li><a href="https://tproger.ru/articles/final-bitvy-yazykov-programmirovaniya-v-2023-godu">Финал</a></li><li><a href="https://tproger.ru/articles/batl-yazykov-programmirovaniya-2023-zaverwilsya">Результаты</a></li></ol><p>Также подпишитесь на тэг <a href="https://tproger.ru/tag/toplang2023">Лучший язык 2023</a>. Тогда новые раунды батла появятся в вашей личной ленте, а вам будут приходить уведомления об их появлении.</p><p>Старт уже завтра — 19 декабря в 11:00 МСК. Следите, участвуйте, голосуйте!</p>]]></content:encoded>
    </item>
    <item>
      <title>Рейтинг лучших программистов в мире 2023: анонс</title>
      <link>https://tproger.ru/articles/startuet-batl-luchwih-programmistov-mira-2023</link>
      <comments>https://tproger.ru/articles/startuet-batl-luchwih-programmistov-mira-2023?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/startuet-batl-luchwih-programmistov-mira-2023</guid>
      <description><![CDATA[<p>Объявляем батл за звание лучшего программиста мира. Читатели Tproger смогут выяснить, кто самый крутой айтишник в мире.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/startuet-batl-luchwih-programmistov-mira-2023">Рейтинг лучших программистов в мире 2023: анонс</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Bitcoin]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Павел Дуров]]></category>
      <category><![CDATA[Илон Маск]]></category>
      <category><![CDATA[Лучший программист 2023]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 24 Jul 2023 08:01:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ежегодно, перед Новым годом, мы проводим <a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2022-zavershilsja-2/">батл лучших языков программирования</a>. Этот батл мы очень любим: он весёлый, а результаты бывают непредсказуемыми.</p><p>Начитавшись новостей о противостоянии Илона Маска и Марка Цукерберга, которое перетекает из борьбы бизнесов в борьбу физическую и наоборот, мы решили провести новый летний батл за звание лучшего программиста мира.</p><p>Читатели Tproger смогут проголосовать за своего фаворита и выяснить, кто на самом деле самый крутой айтишник.</p><p>Правила батла просты:</p><ol><li>В батле участвует 16 всемирно известных программистов.</li><li>Ежедневно соревнуются две пары.</li><li>За любимого программиста можно проголосовать в течение 24 часов.</li><li>Пары составляются рандомно, так что выбирайте программиста, который субъективно, лично вам нравится больше.</li><li>В финале мы определим тройку победителей.</li><li>Старт — 25 июля, финал — 1 августа.</li></ol><p>Забирайте эту запись в закладки, ведь именно в неё будут добавляться ссылки на последующие этапы голосования.</p><p><b>Турнирная таблица:</b></p><figure><img src="https://media.tproger.ru/uploads/2023/07/14f247b0-4d7c-4f6f-ac24-319da3157686.png" alt="" /></figure><p>Старт уже завтра — 25 июля в 11:00 МСК. Следите, участвуйте, голосуйте!</p>]]></content:encoded>
    </item>
    <item>
      <title>Dry-rb — мощный инструмент для построения чистого и гибкого Ruby-кода</title>
      <link>https://tproger.ru/articles/dry-rb-moshhnyj-instrument-dlya-postroeniya-chistogo-i-gibkogo-ruby-koda</link>
      <comments>https://tproger.ru/articles/dry-rb-moshhnyj-instrument-dlya-postroeniya-chistogo-i-gibkogo-ruby-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Егор Щербаков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/dry-rb-moshhnyj-instrument-dlya-postroeniya-chistogo-i-gibkogo-ruby-koda</guid>
      <description><![CDATA[<p>Dry-rb - это семейство библиотек Ruby для создания легкого и масштабируемого кода. Рассмотрели основные компоненты dry-rb с примерами кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/dry-rb-moshhnyj-instrument-dlya-postroeniya-chistogo-i-gibkogo-ruby-koda">Dry-rb — мощный инструмент для построения чистого и гибкого Ruby-кода</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 17 Jul 2023 11:24:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Dry-rb – это семейство библиотек Ruby, предназначенных для создания легкого, модульного и масштабируемого кода. В этом статье мы рассмотрим основные компоненты dry-rb и рассмотрим примеры кода, чтобы продемонстрировать их функциональность.</p><h2>Dry-Types</h2><p>Dry-Types предоставляет возможность определять и использовать строгие типы данных в Ruby. Это позволяет сделать код более надежным и понятным. Вот пример:</p><h2>Dry-Struct</h2><p>Dry-Struct – это простой и легковесный способ определения структур данных с строгой типизацией. Он помогает избежать нежелательных мутаций объектов и обеспечивает простой доступ к атрибутам. Вот пример:</p><h2>Dry-Validation</h2><p>Dry-Validation предоставляет декларативный способ проверки данных и валидации входных параметров. Он помогает управлять сложной валидацией и предоставляет легкую интеграцию с другими инструментами проверки данных. Вот пример:</p><p>Dry-rb предлагает широкий спектр инструментов, которые помогают разработчикам создавать более чистый, гибкий и надежный код на языке Ruby. В этой статье мы кратко рассмотрели dry-types, dry-struct и dry-validation, но dry-rb также включает другие библиотеки, такие как dry-transaction и dry-view, которые улучшают разработку программного обеспечения в различных областях. Если вы хотите узнать больше о dry-rb, рекомендуется ознакомиться с его официальной документацией и начать применять его в своих проектах для достижения более высокого уровня качества кода.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разработка чат-ботов с использованием Ruby</title>
      <link>https://tproger.ru/articles/razrabotka-chat-botov-s-ispolzovaniem-ruby</link>
      <comments>https://tproger.ru/articles/razrabotka-chat-botov-s-ispolzovaniem-ruby?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Егор Щербаков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/razrabotka-chat-botov-s-ispolzovaniem-ruby</guid>
      <description><![CDATA[<p>Ruby делает разработку чат-ботов быстрой и простой. В этой статье мы рассмотрим преимущества Ruby для разработки чат-ботов с примерами кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/razrabotka-chat-botov-s-ispolzovaniem-ruby">Разработка чат-ботов с использованием Ruby</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Jul 2023 12:36:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>В мире современных технологий чат-боты давно стали популярными. Они предоставляют удобный и эффективный способ автоматизировать коммуникацию с пользователями.</p><p>Одним из языков программирования, используемых для создания чат-ботов, является Ruby. Ruby предоставляет множество инструментов и библиотек, которые делают разработку чат-ботов быстрой и простой.</p><p>В этой статье мы рассмотрим преимущества Ruby для разработки чат-ботов с примерами кода.</p><p>Преимущества Ruby для разработки чат-ботов:</p><ol><li>Простота и ясность кода: Ruby имеет удобный и понятный синтаксис, который делает код легким для чтения и понимания. Это особенно важно при разработке чат-ботов, так как код должен быть легко поддерживаемым и расширяемым.</li><li>Большое сообщество и библиотеки: Ruby имеет активное сообщество разработчиков, которое создало множество полезных библиотек и фреймворков для разработки чат-ботов. Например, библиотеки, такие как «Telegram Bot API» и «Slack Ruby Bot», предоставляют простой и удобный способ взаимодействия с популярными платформами мессенджеров.</li><li>Поддержка API и веб-сервисов: Ruby имеет мощную поддержку для работы с API и веб-сервисами. Это позволяет чат-ботам взаимодействовать с различными веб-приложениями и сервисами, открывая широкие возможности для автоматизации и интеграции.</li></ol><p>Пример разработки простого чат-бота на Ruby с использованием библиотеки «Telegram Bot API»:</p><p>В этом примере мы используем библиотеку «Telegram Bot API» для создания простого чат-бота. Бот принимает сообщения от пользователей, обрабатывает команды «/start» и «/help», и отвечает на них соответствующими сообщениями. Если полученное сообщение не является командой, бот отправляет ответ «Извините, я не понимаю ваш запрос.»</p><p>Пример разработки чат-бота на Ruby с использованием библиотеки «Slack Ruby Bot»:</p><p>В этом примере мы используем библиотеку «Slack Ruby Bot» для разработки чат-бота, который работает в Slack. Бот реагирует на две команды: «/hello» и «/weather». При получении команды «/hello» он отправляет приветственное сообщение, а при получении команды «/weather» он вызывает функцию</p><p>, которая получает информацию о погоде с внешнего API, и отправляет результат в чат.</p><p>Ruby предоставляет множество библиотек для разработки чат-ботов, и вы можете выбрать ту, которая лучше всего подходит для вашего проекта. Помимо «Telegram Bot API» и «Slack Ruby Bot», существуют и другие библиотеки, такие как «Discordrb» и другие, которые позволяют взаимодействовать с соответствующими платформами мессенджеров.</p><p>В заключение, разработка чат-ботов на Ruby с использованием различных библиотек дает вам широкие возможности для автоматизации коммуникации и интеграции с различными платформами мессенджеров. Ruby — мощный инструмент, который обеспечивает простоту кода, активное сообщество разработчиков и поддержку API, делая его идеальным выбором для создания чат-ботов.</p>]]></content:encoded>
    </item>
    <item>
      <title>Оптимизация Ruby-приложений: советы и примеры кода</title>
      <link>https://tproger.ru/articles/optimizaciya-proizvoditelnosti-ruby-prilozhenij-sovety-i-primery-koda</link>
      <comments>https://tproger.ru/articles/optimizaciya-proizvoditelnosti-ruby-prilozhenij-sovety-i-primery-koda?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Егор Щербаков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/optimizaciya-proizvoditelnosti-ruby-prilozhenij-sovety-i-primery-koda</guid>
      <description><![CDATA[<p>Рассмотрели 3 совета по оптимизации приложений на Ruby и привели примеры с кодом, которые помогут вам создать быстрые и эффективные программы.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/optimizaciya-proizvoditelnosti-ruby-prilozhenij-sovety-i-primery-koda">Оптимизация Ruby-приложений: советы и примеры кода</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Оптимизация]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Советы]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 04 Jul 2023 08:14:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ruby является одним из популярных языков программирования для разработки веб-приложений. Однако, при работе с большими объемами данных или высокой нагрузкой, производительность Ruby-приложений может стать проблемой.</p><p>В этой статье мы рассмотрим несколько советов и примеров кода по оптимизации производительности Ruby-приложений, которые помогут вам создать быстрые и эффективные программы.</p><h2>Используйте правильные структуры данных</h2><p>Выбор правильной структуры данных может значительно повлиять на производительность вашего Ruby-приложения. Рассмотрим пример использования хэш-таблицы (Hash) вместо массива (Array) для быстрого доступа к данным:</p><h2>Оптимизация базы данных</h2><p>База данных часто является узким местом в производительности Ruby-приложений. Вот пример оптимизации запроса с использованием индексов:</p><h2>Избегайте медленных операций</h2><p>Некоторые операции в Ruby могут быть медленными по своей природе. Например, регулярные выражения могут замедлять работу с большими объемами данных. Рассмотрим пример замены медленной операции регулярного выражения:</p><p>Оптимизация производительности Ruby-приложений является важной задачей для создания эффективных программ.</p><p>В данной статье мы рассмотрели несколько советов и примеров кода, которые помогут вам улучшить производительность ваших Ruby-приложений.</p><p>Применяйте эти рекомендации, проводите профилирование кода и постоянно ищите возможности для оптимизации. Это позволит создать быстрые и отзывчивые приложения на Ruby.</p>]]></content:encoded>
    </item>
    <item>
      <title>Лучший язык программирования: рейтинг TIOBE 2022</title>
      <link>https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022</link>
      <comments>https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022</guid>
      <description><![CDATA[<p>В этом году рейтинг языков программирования TIOBE удивил тройкой лидеров. Узнайте, какой из языков потеснил Java и вышел в топ-3!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022">Лучший язык программирования: рейтинг TIOBE 2022</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Статистика]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Perl]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 23 Dec 2022 12:35:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>На днях у нас прошёл батл языков программирования 2022, и настало время обратиться к рейтингам TIOBE.</p><p>Напомним, что индекс TIOBE оценивает популярность языков программирования, основываясь на поисковых запросах, которые содержат тот или иной язык. Для формирования индекса используются такие ресурсы, как Google, YouTube, Amazon, Wikipedia, Yahoo!, Bing и Baidu.</p><p>В 2023 году популярность языков изменилась. Какие языки потеряли популярность, а какие — нет, <a href="https://tproger.ru/articles/best-prog-lang-2023">рассказали в этой статье</a>.</p><ol><li>Python, C и C++ соревнуются за звание лучшего языка</li><li>Пара слов о других языках</li><li>Выводы</li></ol><h2>Python, C и C++ соревнуются за звание лучшего языка</h2><p>Именно таковы результаты по состоянию на конец декабря — двадцать языков программирования с наибольшей рыночной долей по версии TIOBE:</p><figure><img src="https://media.tproger.ru/uploads/2022/12/9bcee0e3-9325-45a6-985b-c850cc01a924.jpg" alt="" /></figure><p>Ещё в прошлом году Java уверенно держалась в тройке, но теперь уступила своё место «плюсам». Любопытно, что в последний раз C++ становился лидером рейтинга TIOBE в далёком 2003 году, и это впервые, когда данный язык программирования обошёл Java по поисковым запросам. При этом Java входила в топ-3 свыше двадцати лет, начиная с 2001.</p><p>Уже в следующем месяце мы узнаем имя победителя. Каждый из лидирующей тройки уже занимал первое место по итогам года:</p><ol><li>C++ — 1 раз (2003).</li><li>C — 3 раза (2008, 2017, 2019).</li><li>Python — 5 раз (2007, 2010, 2018, 2020, 2021).</li></ol><h2>Пара слов о других языках</h2><p>Помимо прочего, мы видим, как Kotlin и Julia приближаются к топ-20, JavaScript держится в семёрке, а PHP вырывается в десятку, тогда как в прошлом году занял 12-е место.</p><p>Интересно, что Go поднялся аж на 7 позиций и теперь занял 12-е место рейтинга. Стоит отметить, что по версии GitHub за третий квартал 2022 Golang также находится на четвёртом месте по популярности, обогнав при этом PHP, C, C#, Ruby, TypeScript и JavaScript. Тенденция налицо:</p><figure><img src="https://media.tproger.ru/uploads/2022/12/d6659c61-2e2c-4fa7-8d63-f8121e17b018.jpg" alt="" /></figure><p>На 18-е место рейтинга TIOBE вернулся Perl. Rust удерживает 20 позицию. Что касается Delphi, то он всю осень прыгал туда-сюда:</p><ul><li>сентябрь — 13 место (1.09%);</li><li>октябрь — 18 место (0.85%);</li><li>ноябрь — 14 место (1.08%).</li></ul><p>В декабре же язык опустился на 16 место (0.85%), что соответствует результатам декабря прошлого года.</p><h2>Выводы</h2><p>Разумеется, рейтинг языков программирования 2022 TIOBE сложно назвать объективным, так как он рассматривает лишь один аспект — популярность ЯП в поисковых запросах пользователей. Он не отражает реальный рыночный спрос или количество написанного кода, как это делает GitHub в своих отчётах на основе проектов.</p><p>Тем не менее, индекс TIOBE можно использовать, чтобы проверить, актуальны ли ваши навыки, или принять решение о том, на какой язык программирования можно перейти или какой следует использовать при написании новой программы.</p>]]></content:encoded>
    </item>
    <item>
      <title>Третий раунд битвы языков программирования в 2022 году</title>
      <link>https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-v-2022-godu</link>
      <comments>https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-v-2022-godu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-v-2022-godu</guid>
      <description><![CDATA[<p>Начинается третий раунд битвы за звание лучшего языка программирования в 2022 году. На этот раз столкнулись PHP и Ruby, Swift и Kotlin.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-v-2022-godu">Третий раунд битвы языков программирования в 2022 году</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Лучший язык 2022]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 Dec 2022 08:00:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Второй раунд битвы за титул лучшего языка программирования 2022 завершился победой Python над Golang и C над Assembler. Ознакомиться с результатами прошлого раунда можно <a href="https://tproger.ru/articles/vtoroj-raund-bitvy-jazykov-programmirovanija-v-2022-godu/">здесь</a>.</p><p>Не хотите пропустить новые раунды? Подпишитесь на тэг <a href="https://tproger.ru/tag/luchshij-jazyk-2022/">Лучший язык 2022</a> и следите за обновлениями в личной ленте.</p><p>Сегодня между собой соревнуются:</p><ul><li>Ruby и PHP;</li><li>Swift и Kotlin.</li></ul><figure><img src="https://media.tproger.ru/uploads/2022/12/battle_table-1-1.png" alt="" /></figure><p>Голосование по этим языкам программирования продлится до 16 декабря 2022 года. Опросы будут закрыты в 11:00 по МСК.</p>]]></content:encoded>
    </item>
    <item>
      <title>Стартует батл языков программирования 2022</title>
      <link>https://tproger.ru/articles/startuet-batl-jazykov-programmirovanija-2022</link>
      <comments>https://tproger.ru/articles/startuet-batl-jazykov-programmirovanija-2022?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/startuet-batl-jazykov-programmirovanija-2022</guid>
      <description><![CDATA[<p>Батл на звание лучшего языка программирования 2022 уже не за горами. Давайте узнаем, какой ЯП наиболее популярен по версии Tproger!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/startuet-batl-jazykov-programmirovanija-2022">Стартует батл языков программирования 2022</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Лучший язык 2022]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 Dec 2022 08:00:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>Предлагаем отвлечься от серьёзных рейтингов вроде <a href="https://tproger.ru/articles/luchshij-jazyk-programmirovanija-rejting-tiobe-2022/">TIOBE</a> или PYPL и выбрать лучший язык программирования 2022 по версии пользователей Tproger.</p><p>Правила батла по-прежнему просты:</p><ol><li>В батле участвует 16 языков программирования.</li><li>Ежедневно соревнуются две пары.</li><li>За любимый язык можно проголосовать в течение 24 часов.</li><li>Пары составляются рандомно, так что выбирайте язык, который субъективно нравится больше.</li><li>В финале мы определим тройку победителей.</li><li>Старт — 13 декабря, финал — 20 декабря.</li></ol><p>Примечание Забирайте эту запись в закладки, ведь именно в неё будут добавляться ссылки на последующие этапы голосования.</p><ul><li><a href="https://tproger.ru/articles/nachalsja-battl-jazykov-programmirovanija-2022/">Этап 1</a></li><li><a href="https://tproger.ru/articles/vtoroj-raund-bitvy-jazykov-programmirovanija-v-2022-godu/">Этап 2</a></li><li><a href="https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-v-2022-godu/">Этап 3</a></li><li><a href="https://tproger.ru/articles/chetvjortyj-raund-bitvy-jazykov-programmirovanija-2022/">Этап 4</a></li><li><a href="https://tproger.ru/articles/pjatyj-raund-bitvy-jazykov-programmirovanija-2022/">Этап 5</a></li><li><a href="https://tproger.ru/articles/shestoj-raund-bitvy-jazykov-programmirovanija-2022/">Этап 6</a></li><li><a href="https://tproger.ru/articles/polufinal-bitvy-jazykov-programmirovanija-2022">Полуфинал</a></li><li><a href="https://tproger.ru/articles/final-bitvy-jazykov-programmirovanija-2022/">Финал</a></li><li><a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2022-zavershilsja-2/">Результаты</a></li></ul><p>Турнирная таблица:</p><figure><img src="https://media.tproger.ru/uploads/2022/12/Turnirnaja-tablica.png" alt="" /></figure><p>Старт уже завтра — 13 декабря в 11:00 МСК. Следите, участвуйте, голосуйте!</p>]]></content:encoded>
    </item>
    <item>
      <title>Четвёртый раунд битвы языков программирования 2021</title>
      <link>https://tproger.ru/articles/chetvjortyj-raund-bitvy-jazykov-programmirovanija-2021</link>
      <comments>https://tproger.ru/articles/chetvjortyj-raund-bitvy-jazykov-programmirovanija-2021?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/chetvjortyj-raund-bitvy-jazykov-programmirovanija-2021</guid>
      <description><![CDATA[<p>В этом раунде на лучший язык программирования 2021 претендуют такие кандидаты: JavaScript vs. C++, а также Ruby vs. Kotlin.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/chetvjortyj-raund-bitvy-jazykov-programmirovanija-2021">Четвёртый раунд битвы языков программирования 2021</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Лучший язык 2021]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Dec 2021 07:59:57 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вчера завершился третий раунд батла, по итогам которого язык Java в десять раз превзошёл оппонента в лице Visual Basic, а Go утопил Swift. Результаты можно посмотреть <a href="https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-2021/">по ссылке</a>.</p><p>В четвёртом раунде за звание лучшего языка программирования 2021 поборются:</p><ul><li>JavaScript vs. C++</li><li>Ruby vs. Kotlin</li></ul><figure><img src="https://media.tproger.ru/uploads/2021/12/Frame-13-1-1.png" alt="" /></figure><p>Слушайте сердце и выбирайте язык, исходя из личной симпатии. Голосование в четвёртом раунде будет завершено 18 декабря 2021 года в 11:00 по Москве.</p>]]></content:encoded>
    </item>
    <item>
      <title>Баттл языков программирования 2021 стартует уже завтра</title>
      <link>https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-startuet-uzhe-zavtra</link>
      <comments>https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-startuet-uzhe-zavtra?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-startuet-uzhe-zavtra</guid>
      <description><![CDATA[<p>Отбросьте результаты исследований TIOBE, ведь в нашем баттле именно вы выбираете лучший язык программирования 2021.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-startuet-uzhe-zavtra">Баттл языков программирования 2021 стартует уже завтра</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Язык Си]]></category>
      <category><![CDATA[BASIC]]></category>
      <category><![CDATA[Rust]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Лучший язык 2021]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 13 Dec 2021 08:12:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>Лучший язык программирования в 2021 году — это Java или Python? Совсем недавно рейтинг TIOBE взбудоражил всё IT-сообщество, ведь именно Python потеснил извечных лидеров в виде Java и C.</p><p>Но давайте отвлечёмся от официальной статистики и узнаем, какие языки предпочитаете именно вы! Завтра стартует баттл языков программирования 2021. Правила просты:</p><ol><li>Всего участвует 16 языков программирования.</li><li>Каждый день соревнуются две пары.</li><li>На возможность проголосовать за любимый язык отводится 24 часа.</li><li>Пары составляются рандомно.</li><li>Выбирайте тот язык, который субъективно нравится вам больше.</li><li>В финале мы определим победителей — языки которые заняли первое, второе и третье место.</li><li>Старт — 14 декабря, финал — 21 декабря.</li></ol><p>Так выглядит изначальная турнирная таблица:</p><figure><img src="https://media.tproger.ru/uploads/2021/12/languages_battle_2021_announce.png" alt="" /></figure><p>А вот как мы <a href="https://tproger.ru/tag/toplang2020/">выбирали лучший язык программирования</a> в прошлом году.</p><p>Подписывайтесь на уведомления на сайте, чтобы быть в курсе лидеров и новых голосований.</p><p>Результаты баттла можно посмотреть по <a href="https://tproger.ru/articles/battl-jazykov-programmirovanija-2021-zavershilsja/">ссылке</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>OpenAI разработала инструмент Codex. Он переводит английский язык в код</title>
      <link>https://tproger.ru/news/openai-razrabotala-instrument-codex-on-perevodit-anglijskij-jazyk-v-kod</link>
      <comments>https://tproger.ru/news/openai-razrabotala-instrument-codex-on-perevodit-anglijskij-jazyk-v-kod?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Борисов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/openai-razrabotala-instrument-codex-on-perevodit-anglijskij-jazyk-v-kod</guid>
      <description><![CDATA[<p>OpenAI разработала инструмент Codex, который переводит команды на естественном языке в программный код. Он работает лучше, чем аналогичные модели на GPT-3.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/openai-razrabotala-instrument-codex-on-perevodit-anglijskij-jazyk-v-kod">OpenAI разработала инструмент Codex. Он переводит английский язык в код</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Perl]]></category>
      <category><![CDATA[OpenAI]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Aug 2021 07:34:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания OpenAI <a href="https://openai.com/blog/openai-codex/">разработала</a> инструмент Codex, который переводит команды на естественном языке в программный код.</p><p>Codex — одна из моделей, которая используется для работы ИИ-помощника для программистов <a href="https://tproger.ru/news/ii-pomoshhnik-dlja-razrabotchikov-predstavila-microsoft/">GitHub Copilot</a>.</p><p>Инструмент лучше всего работает с Python, но спокойно справляется и с другими языками: JavaScript, TypeScript, Go, Perl, PHP, Ruby, Shell, Swift и так далее.</p><h2>Как работает</h2><p>OpenAI продемонстрировала в нескольких видео, как новый инструмент переводит команды на английском языке в код и таким образом может построить целую игру.</p><p>Вот видео, как Codex сделал простую компьютерную игру:</p><p>Codex пишет код на выбранном языке программирования: достаточно ввести фразу на английском, чтобы сказать программе, что от неё требуется, и Codex сам напишет код.</p><p>Например, если пользователь напишет в специальном окне фразу <i>Print Hello World</i> («напечатай Hello World»), Codex сгенерирует код <i>print(“Hello World”)</i>, если выбран язык Python.</p><p>Codex печатает Hello World:</p><h2>Codex — потомок GPT-3</h2><p>Инструмент Codex — это почти как <a href="https://tproger.ru/news/microsoft-pozvolit-pisat-kod-v-rezhime-dialoga-s-nejrosetju-gpt-3/">ИИ-модель на основе GPT-3</a> от Microsoft, но c несколькими улучшениями.</p><p>Codex выделяет память 14 КБ памяти для кода на Python, когда GPT-3 — только 4 КБ. Благодаря этому новый инструмент может учитывать в 3 раза больше контекста.</p><h2>Где попробовать</h2><p>OpenAI Codex вчера вышел в бета-тестирование.</p><p>Чтобы протестировать новый инструмент, нужно <a href="https://share.hsforms.com/1Lfc7WtPLRk2ppXhPjcYY-A4sk30">зарегистрироваться в список ожидания</a>.</p><p>Когда Codex полноценно запустится, его можно будет бесплатно попробовать в течение пробного периода.</p><p>Источник: <a href="https://openai.com/blog/openai-codex/">OpenAI</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Docker и Visual Studio Code Remote-Containers — как сэкономить время при развёртывании проектов</title>
      <link>https://tproger.ru/articles/docker-i-visual-studio-code-remote-containers-kak-sjekonomit-vremja-pri-razvjortke-proektov</link>
      <comments>https://tproger.ru/articles/docker-i-visual-studio-code-remote-containers-kak-sjekonomit-vremja-pri-razvjortke-proektov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Бунтов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/docker-i-visual-studio-code-remote-containers-kak-sjekonomit-vremja-pri-razvjortke-proektov</guid>
      <description><![CDATA[<p>Попробуем использовать инструмент для контейнеризации проекта со всем его окружением. Это позволит автоматизировать развёртывание.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/docker-i-visual-studio-code-remote-containers-kak-sjekonomit-vremja-pri-razvjortke-proektov">Docker и Visual Studio Code Remote-Containers — как сэкономить время при развёртывании проектов</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 02 Aug 2021 12:12:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Начало проекта на Ruby on Rails — это время на развёртывание: установка нужной версии, гемов и их зависимостей, а также различных баз данных. Иногда процесс идёт не идеально, и приходится тратить время на поиск решения в Stackoverflow. Чтобы упростить жизнь, можно использовать инструмент для контейнеризации проекта со всем его окружением. Это позволит автоматизировать развёртывание и добавит бонусов вашему резюме.</p><p>В качестве полнофункциональной среды разработки мы будем использовать Docker-контейнеры и Visual Studio Code. По тому, как установить и пользоваться Docker есть масса статей и видео, поэтому этот увлекательный путь вы без труда пройдёте сами. А вот для Visual Studio Code нам потребуется установить специальное приложение <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Remote-Containers plugin</a>, которое позволит работать внутри контейнера и использовать весь набор функций.</p><p>Шаг первый: завернуть весь проект с помощью Docker и Docker-Compose. Создать докер файл легко: вам достаточно нажать в VS Code F1, выбрать Docker: Add Docker Files to Workspace и следовать подсказкам. Также можно создать Dockerfile в корневой папке. Пример файла для Ruby on Rails приложения:</p><p>Далее создаем файл со скриптами entrypoint.sh, который так же добавим в корневую папку:</p><p>Чтобы магия сработала, создадим docker-compose.yml:</p><p>После этого устанавливаем <a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers">Remote-Containers plugin</a> в VS Code — плагин позволит работать внутри контейнера. Затем создаем файл конфигурации: F1 &gt;&gt; Remote-Containers: Add Development Container Configuration Files</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screen-Shot-2021-07-15-at-03.22.06.png" alt="" /></figure><p>В папке .devcontainer вы найдете файл devcontainer.json</p><p>Внесём новые настройки и уберем лишние комментарии. Добавим все сервисы из docker-compose.yml в "runServices": ["workspace", "db", "redis"], чтобы запустить их на старте.</p><p>Для того, чтобы VS Code останавливал контейнеры, когда окно закроется, добавим строчку "shutdownAction": "stopCompose", а также добавим список портов внутрь контейнера, которые будут доступны локально "forwardPorts": [3000]</p><p>Пример итогового содержания файла:</p><p>Теперь подготовим базу для нашего приложения и запустим в терминале: docker-compose run workspace rake db:create. Запускаем F1 &gt;&gt; Remote-Containers: Rebuild and Reopen in Container и с помощью команды в терминале rails s открываем готовое приложение.</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screen-Shot-2021-07-15-at-03.11.16.png" alt="" /></figure><p>После запуска, вам понадобятся все плагины, которыми вы пользуетесь в ежедневной работе. Их легко перенести в среду разработки нажав на кнопку, указанную на скриншоте:</p><figure><img src="https://media.tproger.ru/uploads/2021/07/Screen-Shot-2021-07-15-at-03.13.28.png" alt="" /></figure><p>Поздравляю! Теперь не нужно устанавливать никакие зависимости и лишние библиотеки — вы работаете внутри контейнера.</p>]]></content:encoded>
    </item>
    <item>
      <title>Технические задачи для интервью на должность веб-разработчика</title>
      <link>https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika</link>
      <comments>https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Бунтов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika</guid>
      <description><![CDATA[<p>Примеры задач для веб-разработчиков. Варианты для стартапов и крупных компаний, проверяющие различные компетенции специалистов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika">Технические задачи для интервью на должность веб-разработчика</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 Jul 2021 09:55:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Отведите для технического интервью не более 50 минут.</p><h2>Задачи на создание или отладку кода</h2><p>Для кандидата в стартап подойдут задачи на создание или отладку кода. Это поможет выявить, обладает ли соискатель хорошими базовыми знаниями в технологиях, и то, как он может строить удачные технические решения. Как правило, это основной массив работы программиста в молодых компаниях. Рассмотрим следующие задачи, которые отлично подойдут для этого кейса собеседования.</p><h3>1. Найдите ошибку в коде</h3><h4>Решение задачи</h4><p>Здесь приведены методы ActiveRecord. Метод .find_by! вернёт первый объект из базы без ключа. Так как бесключевой метод не экранирует SQL-запрос, появляется возможность сделать sql инъекцию. Это делает код небезопасным и уязвимым. Подробнее можно узнать про SQL Injection в Ruby on Rails <a href="https://rails-sqli.org/">на этой странице</a>.</p><p>Вторая ошибка в применении метода .delete, он удаляет запись без вызова коллбеков. Здесь необходимо заменить его на метод .destroy, чтобы вновь включить работу коллбеков.</p><h3>2. Опишите, как работает этот код</h3><h4>Решение задачи</h4><p>Cоздается Lambda, которая принимает единственный параметр a. Этот параметр выводится с помощью команды p, которая вызывает и передает атрибут строку "Lambda worked" с помощью [], где [] — это сокращённый вариант метода call.</p><h3>3. В чём разница между двумя нижеприведёнными методами?</h3><h4>Решение задачи</h4><p>Оператор += повторно инициализирует переменную новым значением, поэтому a += b эквивалентно a = a + b. Может показаться, что += изменяет значение, на самом деле, он создает новый объект и указывает старую переменную на вновь созданный объект. Разница имеет значение для производительности.</p><h2>Задачи по структурам данных и алгоритмам</h2><p>Для потенциального сотрудника в компании крупного бизнеса подойдут задачи по структурам данных и алгоритмам. Если кандидат умеет преобразовать алгоритм в чистый и структурированный код в хорошем стиле программирования, то, скорее всего, он будет успешно решать несколько задач одновременно. Проще говоря, он умён. А умные люди создают качественные и сложные продукты.</p><h3>1. Реализуйте алгоритм игры «Тайный Санта (Secret Santa)»</h3><p>Основная идея игры — анонимный обмен подарками. В шляпу кладутся небольшие записки с именами участников. Затем каждый играющий по очереди вытягивает бумажку с именем того, кому предстоит вручить презент. Реализуйте алгоритм жеребьёвки игры.</p><h4>Решение</h4><p>Стоит отметить, что у этой задачи есть несколько решений. Рассмотрим один из вариантов.</p><p>Для начала представим, что жеребьёвка — это рандомный список дарителей и получателей. Отобразим его в виде Hash, где ключи — это дарители, а значения — это получатели.</p><p>Возникает вопрос: как распределить участников игры, чтобы они не смогли выбрать самих себя? Для этого нужно взять список дарителей и сместить на один шаг, то есть тот, кто в списке был первым дарителем, станет последним получателем.</p><p>Так выглядит готовый список. Мы также решили проблему с нечётным и четным количеством участников, чтобы все смогли получить свой подарок.</p><p>Дальше реализовываем логику распределения. В алгоритме задачи есть участники и распределитель подарков, поэтому создадим сущности. На самом деле, можно обойтись и без них, но так кандидат покажет, что он способен думать абстракциями ООП.</p><p>После этого напишем простой тест, который будет проверять корректность функционирования вашего кода.</p><p>Теперь мы можем реализовать логику методом assign_recipients :</p><p>Теперь следует подумать, как реализовать рандомайзер, то есть как «встряхнуть шляпу» и применить логику привязки даритель-получатель. Для этого возьмём массив участников и применим к нему метод .shuffle!, после чего назначим получателей.</p><p>Теперь запущенный тест упадёт с ошибкой. Чтобы это исправить, применим mock для метода .shuffle! и озеленим тест.</p><p>В итоге мы получим такой код:</p><h4>Анализ сложности алгоритма</h4><p>Метод shuffle! реализует генерацию случайной перестановки, применяя алгоритм Фишера-Йетса. Он имеет временную сложность равную O(n) и константную пространственную сложность.</p><p>Также в решении задачи использовался один цикл, который проходит по всему списку участников. В этом же цикле мы заполняли Hash дарителей и получателей. Отсюда следует, что временная сложность и пространственная сложность равно O(n) ,где n — это количество участников игры.</p><h3>2. Проверьте сортировку слов по заданному алфавиту</h3><p>Предположим, что в других языках также используются строчные английские буквы, но, возможно, в другом порядке. Порядок алфавита — это некая система расположения строчных букв. Учитывая последовательность слов, написанных на чужом языке, и порядок в алфавите, нужно вернуть true, когда данные слова лексикографически отсортированы на этом языке.</p><p>Примеры:</p><p>Поскольку в этом языке перед буквой d стоит буква h, последовательность букв в заданном алфавите уже отсортирована.</p><p>Поскольку в этом языке d стоит после l , то words[0]&gt; words[1], следовательно последовательность не отсортирована.</p><p>Первые три символа «app» совпадают, а второе слово короче по количеству символов. Согласно лексикографическим правилам, «apple» больше «app», потому что l больше ∅, где ∅ определяется как пробел, который меньше любого другого символа.</p><h4>Решение</h4><p>Хорошим тоном считается, если кандидат напишет тесты в первую очередь:</p><p>Далее необходимо создать словарь с помощью ассоциативного массива Hash или просто массива:</p><p>Теперь повторим логику из того, что было написано в примерах:</p><p>После этого кандидат должен ответить с какой сложностью выполняется алгоритм.</p><h4>Анализ сложности выполнения алгоритма</h4><p>Временная сложность<b>:</b></p><ol><li>Создание словаря для сохранения порядка каждой буквы занимает O(n) времени.</li><li>В первом цикле мы сначала перебираем слова, а во вложенном — проверяем буквы этого слова. Временная сложность займет O(m), где m — это количество всех букв в словах. Таким образом, временная сложность составляет O (m+n). Но в словаре всегда 26 букв, в примерах меняется лишь порядок. Следовательно, временная сложность O(m), где m — это количество всех букв в словах.</li></ol><p>Пространственная сложность:</p><p>Мы используем только одну дополнительную структуру данных — это Hash или массив, где хранится порядок букв. Поскольку в словаре только 26 букв и их длина неизменна, мы имеем константную пространственную сложность.</p><p><b>Итоговый вид решения задачи:</b></p><p>На заключительном этапе технического интервью сообщите кандидату о временных рамках вашего решения. Обязательно сообщите о любых результатах собеседования в электронном письме. Поблагодарите за уделенное время, похвалите его за старания и, в случае отказа, предложите попробовать снова, но не менее чем через 6 месяцев. Это позволит остаться лояльной компанией в глазах соискателя, дать ему возможность подтянуть свои навыки и не упустить в будущем хорошего сотрудника.</p>]]></content:encoded>
    </item>
    <item>
      <title>Уязвимость в Homebrew позволяла выполнять произвольный код на компьютерах пользователей</title>
      <link>https://tproger.ru/news/ujazvimost-v-homebrew-pozvoljala-vypolnjat-proizvolnyj-kod-na-kompjuterah-polzovatelej</link>
      <comments>https://tproger.ru/news/ujazvimost-v-homebrew-pozvoljala-vypolnjat-proizvolnyj-kod-na-kompjuterah-polzovatelej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ujazvimost-v-homebrew-pozvoljala-vypolnjat-proizvolnyj-kod-na-kompjuterah-polzovatelej</guid>
      <description><![CDATA[<p>Специалист RyotaK нашёл дыру в репозитории Homebrew Cask: из-за зависимости git_diff вредоносные pull-запросы объединялись автоматически.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ujazvimost-v-homebrew-pozvoljala-vypolnjat-proizvolnyj-kod-na-kompjuterah-polzovatelej">Уязвимость в Homebrew позволяла выполнять произвольный код на компьютерах пользователей</a>»</p>]]></description>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[macOS]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Уязвимость]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 27 Apr 2021 10:40:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Специалист по кибербезопасности из Японии под ником RyotaK нашёл критическую уязвимость в пакетном менеджере Homebrew. Она позволяла злоумышленникам использовать популярный инструмент для выполнения любого кода на компьютерах жертв.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1-42.png" alt="" /></figure><p>«Дыру» обнаружили в официальном репозитории Homebrew Cask. Эксплуатируя её, хакеры могли внедрять произвольный код в контейнер, после чего автоматически объединять его.</p><p>Это [объединение] происходит из-за проблемы в зависимости git_diff действия GitHub review-cask-pr, которое используется для синтаксического анализа различий в pull-запросе для проверки. Синтаксический анализатор можно обмануть, и он полностью проигнорирует вредоносные строки, что приведет к успешному одобрению вредоносного pull-запроса.</p><p>Разработчики Homebrew объявили об удалении автоматического объединения кода в контейнере на GitHub. Вместе с тем они отключили и удалили действие review-cask-pr из всех уязвимых репозиториев.</p><p>Homebrew — один из самых популярных пакетных менеджеров. Используется пользователями macOS и Linux. Написан он на языке Ruby, а распространяется как свободное программное обеспечение с открытым кодом.</p><p>Источник: <a href="https://www.securitylab.ru/news/519383.php">SecurityLab</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Опубликован топ-9 самых популярных языков программирования с высокими зарплатами</title>
      <link>https://tproger.ru/news/opublikovan-top-9-samyh-populjarnyh-jazykov-programmirovanija-s-vysokimi-zarplatami</link>
      <comments>https://tproger.ru/news/opublikovan-top-9-samyh-populjarnyh-jazykov-programmirovanija-s-vysokimi-zarplatami?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/opublikovan-top-9-samyh-populjarnyh-jazykov-programmirovanija-s-vysokimi-zarplatami</guid>
      <description><![CDATA[<p>Dice Insights составило рейтинг из девяти языков по уровню оплаты: первое место у Ruby со 105 223 долларами, далее идут Java и C++.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/opublikovan-top-9-samyh-populjarnyh-jazykov-programmirovanija-s-vysokimi-zarplatami">Опубликован топ-9 самых популярных языков программирования с высокими зарплатами</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 01 Apr 2021 14:46:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Издание Dice Insights провело исследование, на основе которого составило топ-9 популярных языков программирования. Отличительной особенностью данного топа является то, что все представленные в нём языки очень хорошо оплачиваются.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1.jpeg" alt="" /><figcaption>Источник: Unsplash</figcaption></figure><p>В основу списка легли данные Burning Glass. Они собирали информацию о количестве вакансий с упоминанием языков с начала 2021 года по США.</p><p>В итоге на первом месте по уровню зарплаты расположился Ruby с показателем в 105 223 доллара. Второе место и 102 119 долларов достались Java. Третье — С++ с его 101 234 долларами:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/Screen-Shot-2021-04-01-at-17.38.20.png" alt="" /></figure><p>При этом рейтинг также показал уровень потенциала каждого из языков. И вот тут картина куда интереснее.</p><p>Так, например, специалисты ожидают рост популярности TypeScript на 60% в ближайшие 10 лет. В свою очередь Python также будет продолжать своё «распространение» — примерно на 21% за те же 10 лет. Самым худшим показателем в этом плане обладают C# и С++ — у обоих -14% в ближайшее десятилетие.</p><p>Источник: <a href="https://insights.dice.com/2021/03/31/9-programming-languages-that-employers-want-and-pay-high-salaries/">Dice Insights</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Примеры задач с собеседования на позицию Middle Ruby разработчика</title>
      <link>https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika</link>
      <comments>https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika</guid>
      <description><![CDATA[<p>Подборка задач по основам Ruby и часто используемым функциям языка, которые встречаются на интервью для позиции middle-разработчика.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika">Примеры задач с собеседования на позицию Middle Ruby разработчика</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Feb 2021 10:19:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Позиции Junior, Middle и Senior в СНГ различаются не только от компаний к компаниям, но и в принципе отсутствуют в некоторых странах. Для проведения интервью у кого-то есть заранее подготовленный набор тестовых заданий, кто-то предпочитает беседу за жизнь вперемешку с конкретными техническими вопросами. Есть компании, которым важны преимущественно soft skills. И все-таки выявить подходящего кандидата — дорогостоящий процесс.</p><p>После прохождения интервью во множество компаний есть понимание, что кандидат должен знать и уметь применять основные принципы, на которых строятся современные приложения. И хотя в моей практике не было такого, чтобы интервью закончилось после первого неправильного ответа или вопроса, — есть основы, в которых надо разобраться заранее.</p><p>В этом материале создана подборка по основам Ruby, часто используемым функциям языка. И если Junior разработчик никак не привязан к языку программирования, а Senior может писать более сложный код, то если вы сможете решить эти задачи без подсказок — бо́льшая часть практической подготовки на позицию Middle пройдена и можно сфокусироваться на других темах при подготовке к собеседованию.</p><p>Реализуйте метод Array#map</p><p>Реализуйте метод attr_accessor</p><p>Перепишите код без использования if</p><p>Проверка использования:</p><p>Напишите код, чтобы строка (1..10).select(&amp;3) возвращала результат [3, 6, 9]</p><p>Добавьте функциональность объекта post, изменяющую значение любого параметра объекта на требуемое и логирующую это изменение</p><p>Класс Post:</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел Ruby 3.0. Разработчики заявляют о трёхкратном приросте производительности</title>
      <link>https://tproger.ru/news/vyshel-ruby-3-0-razrabotchiki-zajavljajut-o-trjohkratnom-priroste-proizvoditelnosti</link>
      <comments>https://tproger.ru/news/vyshel-ruby-3-0-razrabotchiki-zajavljajut-o-trjohkratnom-priroste-proizvoditelnosti?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/vyshel-ruby-3-0-razrabotchiki-zajavljajut-o-trjohkratnom-priroste-proizvoditelnosti</guid>
      <description><![CDATA[<p>Релиз сделан с упором на скорость, параллелизм и типизацию: в OptCarrot Benchmark версия с JIT набрала втрое больше баллов, чем Ruby 2.0 на VM.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/vyshel-ruby-3-0-razrabotchiki-zajavljajut-o-trjohkratnom-priroste-proizvoditelnosti">Вышел Ruby 3.0. Разработчики заявляют о трёхкратном приросте производительности</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Производительность]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 25 Dec 2020 08:36:37 GMT</pubDate>
      <content:encoded><![CDATA[<figure><img src="https://media.tproger.ru/uploads/2020/12/3-3.jpg" alt="" /></figure><p>На официальном сайте Ruby <a href="https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/">вышел</a> пост, посвящённый релизу третьей версии языка — Ruby 3.0.0. По словам разработчиков, в нём они сделали упор на повышении <a href="https://blog.heroku.com/ruby-3-by-3">производительности</a>, параллелизме и типизации.</p><p>Для демонстрации мощи новой версии языка, на сайте опубликовали результаты его тестирования в OptCarrot Benchmark. Утилита измеряет производительность одного потока на основе нагрузки во время эмуляции игр для Nintendo Entertainment System (NES). В нём Ruby 3.0 (JIT) набрал в три раза больше баллов, чем Ruby 2.0 (VM).</p><figure><img src="https://media.tproger.ru/uploads/2020/12/1-13.png" alt="" /></figure><p>Разработчики также заявили, что обновили ряд библиотек в новой версии языка. К таковым относятся RubyGems 3.2.3, Bundler 2.2.3, IRB 1.2.6, JSON 2.5.0 и т.д. Также команда, работавшая над Ruby 3.0 заявила об изменении 4 028 файлов, о 200 058 вставках и 154 063 удалениях со времён Ruby 2.7.0. С полным списком изменений можно <a href="https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/">ознакомиться</a> в оригинальной публикации на сайте.</p><p>Источник: <a href="https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/">Ruby</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Третий раунд битвы языков программирования 2020!</title>
      <link>https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-2020</link>
      <comments>https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-2020?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Борисенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-2020</guid>
      <description><![CDATA[<p>В голосовании соревнуются пары SQL и TypeScript, Python и Ruby. Выбирать предлагают любимый язык, а голосование продлится ровно 24 часа.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tretij-raund-bitvy-jazykov-programmirovanija-2020">Третий раунд битвы языков программирования 2020!</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Лучший язык 2020]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 16 Dec 2020 08:01:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>По итогам вчерашнего раунда С++ буквально уничтожил Cobol, а Assembler оказался почти в два раза популярнее чем Pascal. Результаты смотрите <a href="https://tproger.ru/articles/bitva-jazykov-programmirovanija-2020-prodolzhaetsja/">здесь</a>.</p><p>Сегодня у нас новые соперники: SQL/TypeScript и Python/Ruby.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Frame-4-4.png" alt="" /></figure><p>Вы выбираете кто из-них пройдёт в следующий раунд нашей битвы языков. Главное правило при выборе — голосовать за любимый язык.</p><p>Голосование закончится ровно через 24 часа — 17 декабря 2020 года в 11:00 по московскому времени.</p><p>Финальное голосование — <a href="https://tproger.ru/articles/final-battla-jazykov-programmirovanija-2020-uzhe-segodnja/">здесь</a>.</p><p>Включите уведомления в браузере, чтобы следить за ходом голосования.</p>]]></content:encoded>
    </item>
    <item>
      <title>Примите участие в баттле языков программирования 2020. Старт уже завтра!</title>
      <link>https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra</link>
      <comments>https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Борисенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra</guid>
      <description><![CDATA[<p>Голосование выяснит, какие языки подписчики любят больше всего, пока Java и язык Си меняются местами на вершине рейтинга TIOBE.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/primite-uchastie-v-battle-jazykov-programmirovanija-2020-start-uzhe-zavtra">Примите участие в баттле языков программирования 2020. Старт уже завтра!</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[.NET]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[TypeScript]]></category>
      <category><![CDATA[Kotlin]]></category>
      <category><![CDATA[Язык ассемблера]]></category>
      <category><![CDATA[Pascal]]></category>
      <category><![CDATA[Лучший язык 2020]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 13 Dec 2020 08:00:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>В то время как Java и язык Си меняются местами на вершине рейтинга TIOBE, мы решили выяснить, какие языки программирования, наши подписчики любят больше всего.</p><p>Завтра начинается баттл языков программирования 2020. Правила просты:</p><ul><li>В баттле участвуют 16 языков;</li><li>ежедневно соревнуются две пары;</li><li>на каждое голосование отводится 24 часа;</li><li>вы выбираете язык который субъективно нравится вам больше чем его оппонент;</li><li>пары подбираются случайно;</li><li>в результате мы определим победителей, занявших первое, второе и третье места;</li><li>Старт завтра — 14 декабря, финал — 21 декабря.</li></ul><p>Так выглядит изначальная турнирная таблица:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Frame-4.png" alt="" /></figure><p>Подписывайтесь на уведомления на сайте, чтобы быть в курсе текущих лидеров и новых голосований.</p>]]></content:encoded>
    </item>
    <item>
      <title>В Ruby обнаружен баг, связанный с сериализацией</title>
      <link>https://tproger.ru/news/ruby-serialization-vulnerability</link>
      <comments>https://tproger.ru/news/ruby-serialization-vulnerability?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Галадей]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ruby-serialization-vulnerability</guid>
      <description><![CDATA[<p>Специалисты компании Elttam нашли в Ruby проблему сериализации и десериализации: поддержка встроена в сам язык, а не в сторонние библиотеки.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ruby-serialization-vulnerability">В Ruby обнаружен баг, связанный с сериализацией</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 12 Nov 2018 10:25:47 GMT</pubDate>
      <content:encoded><![CDATA[<p>Проблема сериализации и десериализации объектов добралась и до языка программирования Ruby. Баг <a href="https://www.elttam.com.au/blog/ruby-deserialization/">обнаружили</a> специалисты из компании Elttam, Австралия.</p><h3>Суть проблемы</h3><p>Сериализацией в программировании называется перевод структуры данных в любой другой формат, более удобный для хранения. Обратной операцией является операция десериализации — восстановление начального состояния структуры данных из битовой последовательности. Возможность этого встроена в Ruby и, как оказалось, она позволяет злоумышленникам использовать нативные механизмы языка для осуществления своих атак.</p><p>Исследователи из Elttam добавили к отчёту proof-of-concept эксплоит, который это реализует. Проблема состоит в том, что эти механизмы встроены в сам язык, а именно в версии от 2.0 до 2.5. Также предполагается, что возможно доработать методы атак и под более старые версии. Кроме того, в альтернативных реализациях Ruby под названием JRuby и Rubinius потенциально могут быть сходные проблемы.</p><h3>Другие языки</h3><p>Уязвимости сериализации и десериализации объектов есть и в других языках. В 2015 году их нашли в библиотеке FoxGlove Security для Java. В 2017 году похожую проблему обнаружили в библиотеках .NET, а в 2018 году — в PHP. В последнем случае это затрагивает движок WordPress. Зачастую проблемы решаются выпуском патчей, хотя нередко баги сложно выявить. При этом нужно понимать, что сериализация и десериализация данных сама по себе ослабляет их защиту.</p><p>В мае 2018 года Oracle сообщила, что <a href="https://tproger.ru/news/oracle-refuse-java-serialization/">собирается</a> убрать из Java встроенную поддержку сериализации. Вместо неё будет использован компактный фреймворк.</p>]]></content:encoded>
    </item>
    <item>
      <title>JetBrains опубликовала IDE RubyMine 2018.2</title>
      <link>https://tproger.ru/news/rubymine-2018-2-released</link>
      <comments>https://tproger.ru/news/rubymine-2018-2-released?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Тимур Кондратьев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rubymine-2018-2-released</guid>
      <description><![CDATA[<p>Обновление RubyMine принесло улучшенный вывод типов, поддержку новых менеджеров версий и повторный запуск только проваленных тестов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rubymine-2018-2-released">JetBrains опубликовала IDE RubyMine 2018.2</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 26 Jul 2018 18:14:00 GMT</pubDate>
      <content:encoded><![CDATA[<p><a href="https://blog.jetbrains.com/ruby/2018/07/rubymine-2018-2-released/">Вышло</a> крупное летнее обновление интегрированной среды разработки RubyMine от JetBrains под номером 2018.2. Среди нововведений — улучшения работы с кодом, поддержка новых менеджеров версий, повторное тестирование только проваленных тестов и многое другое.</p><h3>Анализ кода</h3><p>Новая версия IDE RubyMine получила усовершенствованный вывод типов, который позволяет лучше читать типы элементов в блоках, массивах и хешах. Эта функция улучшает автозаполнение кода и навигацию по всему проекту:</p><figure><img src="https://media.tproger.ru/uploads/2018/07/block_element_completion-670-2x.gif" alt="" /></figure><p>Кроме того, RubyMine теперь правильно распознает модели, использующие полиморфные ассоциации, и предлагает для них полную поддержку «умных» функций.</p><h3>Менеджеры версий</h3><p>Обновленная среда разработки получила поддержку chruby и asdf. Более того, теперь все менеджеры версий доступны в WSL, Docker, SSH и других удаленных соединениях.</p><p>Подробнее о новых менеджерах и их поддержке <a href="https://blog.jetbrains.com/ruby/2018/06/chruby-asdf-yaml-rubymine-2018-2-eap/#version_managers">можно узнать</a> в блоге IDE.</p><h3>Тестирование</h3><p>RubyMine 2018.2 позволяет проводить повторное тестирование только тех тестов, которые не прошли проверку. По словам разработчиков, это освобождает пользователя от ручного просмотра каждой проваленной проверки. Новая функция также работает с пресетами rake test и rake spec:</p><figure><img src="https://media.tproger.ru/uploads/2018/07/rerun_failed_tests-670-2x.gif" alt="" /></figure><h3>YAML</h3><p>В этом обновлении разработчики уделили внимание формату сериализации данных YAML. Теперь его код можно форматировать прямо в IDE и использовать все функции автозаполнения и навигации по коду. Более того, новая версия RubyMine предоставляет автоматическое заполнение структур данных YAML, имеющих файлы JSON Schema, и возможность копирования/вставки ключевого пути к значению в файлах .yml.</p><h3>Git</h3><p>Поддержка системы контроля версий в RubyMine 2018.2 получила несколько новых функций:</p><ul><li>файлы с конфликтом слияния теперь группируются в отдельном узле;</li><li>новое действие Browse Repository at Revision позволяет исследовать состояние репозитория после каждого пересмотра;</li><li>появилась возможность пропускать действие Push во время команды Commit and Push или использовать его только для защищенных веток;</li><li>к GitHub можно подключить неограниченное число аккаунтов и выбрать главный для каждого проекта.</li></ul><h3>Другие улучшения</h3><p>Кроме общих улучшений производительности новая версия IDE принесла новые иконки, темную тему для MacOS, поддержку Touch Bar, усовершенствованную поддержку JS, TypeScript и CoffeeScript, с которыми <a href="https://tproger.ru/news/webstorm-2018-2/">можно познакомиться</a> в обзоре обновления IDE WebStorm 2018.2, а также подключение отладчика к удаленным процессам без необходимости их перезагрузки.</p><p>Подробнее о новых функциях <a href="https://www.jetbrains.com/ruby/whatsnew/">можно прочитать</a> на сайте разработчиков.</p><p>Предыдущее крупное обновление RubyMine под номером 2018.1 <a href="https://tproger.ru/news/rubymine-2018-1/">вышло</a> весной 2018 года. Оно было направлено на улучшение общей производительности среды разработки.</p>]]></content:encoded>
    </item>
    <item>
      <title>Представлена среда разработки RubyMine 2018.1</title>
      <link>https://tproger.ru/news/rubymine-2018-1</link>
      <comments>https://tproger.ru/news/rubymine-2018-1?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Светлана Хачатурян]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rubymine-2018-1</guid>
      <description><![CDATA[<p>JetBrains выпустила стабильную RubyMine 2018.1 с обновлениями, направленными главным образом на производительность и удобство написания кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rubymine-2018-1">Представлена среда разработки RubyMine 2018.1</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[JetBrains]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 19 Apr 2018 11:04:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Разработчики из JetBrains <a href="https://blog.jetbrains.com/ruby/2018/04/rubymine-2018-1-released/">анонсировали</a> выход первой крупной стабильной версии IDE для Ruby в 2018 году — RubyMine 2018.1. Обновления в основном касаются повышения производительности среды разработки.</p><h3>Что нового?</h3><p>В RubyMine 2018.1 реализованы:</p><ul><li>переработанный механизм статического анализа, повышающий скорость работы IDE;</li><li>улучшенная опция Code Insight для блочных переменных;</li><li>новая функция Run anything, позволяющая моментально запускать задачи Rake, rails s, любой скрипт или консольную команду:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/run_anything_rake.gif" alt="" /></figure><ul><li>режим Debug anything;</li><li>улучшенный режим постфиксного автозаполнения кода:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/def_self_if_postfix.gif" alt="" /></figure><ul><li>предпросмотр разметки с рендерингом встроенных диаграмм:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/markdown_diagram.gif" alt="" /></figure><ul><li>улучшенный способ выставления брейкпоинтов, позволяющий не прерывать исполнение при возникновении исключительной ситуации;</li><li>навигационная панель:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/navbar.gif" alt="" /></figure><ul><li>улучшения в работе с TypeScript, Vue.js и CSS;</li><li>три новые функции для упрощения процедуры перебазирования из IDE: Abort Rebase, Continue Rebase и Skip Commit;</li><li>опция «Открыть в терминале»:</li></ul><figure><img src="https://media.tproger.ru/uploads/2018/04/open_in_terminal.gif" alt="" /></figure><ul><li>улучшенная визуальная документация.</li></ul><p>Среда разработки RubyMine 2018.1 <a href="https://www.jetbrains.com/ruby/download/">доступна</a> для скачивания на Linux, macOS и Windows.</p>]]></content:encoded>
    </item>
    <item>
      <title>Мартовский рейтинг языков программирования TIOBE: Ruby вытеснил Delphi из топ-10</title>
      <link>https://tproger.ru/news/tiobe-march-2018</link>
      <comments>https://tproger.ru/news/tiobe-march-2018?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Екатерина Никитина]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/tiobe-march-2018</guid>
      <description><![CDATA[<p>Ruby вернулся в топ-10 TIOBE и вытеснил Delphi; Julia и Kotlin вошли в топ-40, а Rust и Groovy потеряли позиции в первой полусотне.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/tiobe-march-2018">Мартовский рейтинг языков программирования TIOBE: Ruby вытеснил Delphi из топ-10</a>»</p>]]></description>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 07 Mar 2018 19:50:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ruby вернулся в первую десятку рейтинга TIOBE, и аналитики считают это хорошим знаком. Язык появился очень давно, но оставался в тени до релиза Ruby on Rails в 2006 году. Фреймворк подкинул его на тридцать позиций вверх до топ-10 и обеспечил звание «Язык 2006 года».</p><p>После пика популярности в 2008 году Ruby начал сдавать позиции под натиском новых языков, но теперь постепенно взбирается обратно. По мнению экспертов, подобная динамика свидетельствует о естественном росте популярности.</p><figure><img src="https://media.tproger.ru/uploads/2018/03/2018-03-07.-tiobe_1.png" alt="" /></figure><p>Кроме того, в этом месяце Julia и Kotlin вошли в топ-40, тогда как Rust и Groovy потеряли позиции в первой полусотне.</p><figure><img src="https://media.tproger.ru/uploads/2018/03/2018-03-07.-tiobe_2.png" alt="" /></figure><p>Напомним, что TIOBE <a href="https://www.tiobe.com/tiobe-index/">составляет</a> рейтинги языков программирования в начале каждого месяца, исходя из статистики поисковых запросов. В феврале аналитиков <a href="https://tproger.ru/news/tiobe-february-2018/">удивил</a> язык Visual Basic.</p>]]></content:encoded>
    </item>
    <item>
      <title>Вышел минорный релиз Ruby 2.5.0</title>
      <link>https://tproger.ru/news/ruby-2-5-0-released</link>
      <comments>https://tproger.ru/news/ruby-2-5-0-released?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Максим Енбулаев]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/ruby-2-5-0-released</guid>
      <description><![CDATA[<p>Ruby 2.5.0 получил новые функции и повышение производительности; сообщество отмечает прирост быстродействия до 50% в отдельных случаях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/ruby-2-5-0-released">Вышел минорный релиз Ruby 2.5.0</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Языки программирования]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Dec 2017 19:11:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>В Ruby 2.5.0 реализовано множество новых функций и улучшена производительность. Ruby-сообщество <a href="http://www.rubyguides.com/2017/11/ruby-2-5-performance/">отмечает</a> 50-процентный прирост производительности в некоторых случаях. Ниже описаны наиболее значимые изменения:</p><ul><li>Обработку исключений в rescue/else/ensure теперь можно использовать напрямую в блоке do/end.</li><li>Добавлен метод yield_self. В отличии от tap, он возвращает результат блока.</li><li>Осуществлена поддержка измерения использования методов и блоков кода. При запуске теста с новыми функциями пользователь будет знать об используемых методах и частях ветвлений, а также сможет более строго оценивать полное покрытие тестами.</li><li>Добавлены Hash#slice и Hash#transform_keys.</li><li>Struct.new может создавать классы, поддерживающие именованные аргументы.</li><li>Методы Enumerable#any?, all?, none? и one? поддерживают аргументы по образцу.</li><li>Поиск констант высшего уровня больше не поддерживается.</li><li>Библиотека pp.rb теперь включена в ядро языка. Больше нет необходимости использовать команду require “pp”.</li><li>Вывод сообщений об ошибках в терминале теперь осуществляется в обратном порядке.</li></ul><h4>Прирост производительности</h4><ul><li>Скрипты на Ruby теперь в среднем на 5-10% быстрее благодаря удалению всех инструкций trace из генерируемого байткода. Хотя поддержка trace добавлена в TracePoint, его использование обычно излишне.</li><li>Код, генерируемый ERB из шаблонов, работает в два раза быстрее аналогичного из Ruby 2.4.</li><li>Улучшена производительность таких методов, как Array#concat, Enumerable#sort_by, String#concat, String#index, Time#+ и так далее.</li></ul><h4>Прочие изменения по сравнению с версии 2.4</h4><ul><li>SecureRandom теперь обходится средствами ОС, если это возможно. Ранее в первую очередь проверялось наличие OpenSSL.</li><li>Добавлены гемы cmath, csv, date, dbm, etc, fcntl, fiddle, fileutils, gdbm, ipaddr, scanf, sdbm, stringio, strscan, webrick, zlib.</li><li>Реализована поддержка Unicode версии 10.0.0.</li><li>RubyGems обновлена до 2.7.3.</li><li>RDoc обновлена до 6.0.1.</li><li>У Thread.report_on_exception теперь по умолчанию установлено значение true. Это изменение призвано облегчить отладку многопоточных программ.</li><li>IO#Write теперь принимает множественные аргументы.</li></ul><p>Загрузка новой версии языка <a href="https://www.ruby-lang.org/en/downloads/">доступна</a> на официальном сайте Ruby.</p>]]></content:encoded>
    </item>
    <item>
      <title>Состоялся релиз IDE RubyMine 2017.3 от JetBrains</title>
      <link>https://tproger.ru/news/rubymine-2017-3</link>
      <comments>https://tproger.ru/news/rubymine-2017-3?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Арсений Шамов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/rubymine-2017-3</guid>
      <description><![CDATA[<p>RubyMine стала производительнее, поддерживает вложенные проекты и WSL, получила настройку RuboCop и извлечение методов в private и protected.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/rubymine-2017-3">Состоялся релиз IDE RubyMine 2017.3 от JetBrains</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 03 Dec 2017 09:48:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>В первую очередь следует отметить <a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-3-eap1-is-open-2/#performance">возросшую производительность</a>. Это особенно заметно при выполнении объёмных задач — например, тестировании работы всего приложения. Улучшена ориентация во встроенных ключевых словах Rails, таких как колбэки before_action. <a href="https://blog.jetbrains.com/ruby/2017/10/rubymine-2017-3-eap4-code-intelligence-improved/#intelligence">Усовершенствованный анализатор кода</a> лучше справляется с маппингом указанных и заданных аргументов методов. Кроме того, новая RubyMine теперь поддерживает приложения с вложенными проектами: она обнаруживает расположенные в приложении проекты и их gem-файлы, и позволяет просто вставлять их в код и настраивать их параметры.</p><h3>WSL</h3><p>В новой версии появилась поддержка Windows Bash, а также есть возможность <a href="https://confluence.jetbrains.com/display/RUBYDEV/How+to+add+WSL+SDK+on+Windows+to+RubyMine">установки WSL</a>.</p><h3>Рефакторинг</h3><p>Изменения затронули также рефакторинг. В новой версии IDE можно <a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-3-eap1-is-open-2/#refactoring">извлекать методы</a> прямо в разделы private или protected.</p><h3>RuboCop</h3><p><a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-3-eap1-is-open-2/#rubocop">Претерпел изменения</a> RuboCop. Теперь пользователь может не только произвести автокоррекцию всего файла, но и создать особый cop department или offence class. Более того, RubyMine 2017.3 поддерживает пользовательские конфигурации rubocop.yml, что делает редактирование кода ещё удобнее.</p><h3>Стиль кода</h3><p><a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-3-eap1-is-open-2/#code-style">Доработано</a> управление стилем кода — добавили возможность индентировать частные и защищённые методы, а также выбирать, вокруг каких операторов нужно добавлять пробелы, а какие оставлять без изменений.</p><h3>Puppet</h3><p>Новая версия RubyMine <a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-3-eap1-is-open-2/#epp">поддерживает синтаксисы шаблона EPP</a>. IDE производит автодополнение шаблонов и манифестов и переключаться между ними. Функция Refactor Rename позволяет переименовывать переменные и параметры, а инструмент Find Usages — определять, в каких местах проекта применены пользовательские шаблоны.</p><h3>Отладчик</h3><p>Отладчик обзавёлся <a href="https://blog.jetbrains.com/ruby/2017/09/rubymine-2017-2-3-rc-docker-on-windows-and-debugger/#better-performing-debugger">функцией оценки</a> Trace to_s, ограничивающей время выполнения особенно ресурсоёмких операций, экономя время пользователя во время отладки программы.</p><h3>REST-клиент</h3><p>Ещё одним нововведением RubyMine 2017.3 стала возможность <a href="https://blog.jetbrains.com/phpstorm/2017/09/editor-based-rest-client/">тестировать API в IDE</a>. Для этого нужно написать HTTP-запросы в файле .http и запустить их иконками на боковой колонке.</p><h3>JavaScript</h3><p>Были доработаны <a href="https://blog.jetbrains.com/webstorm/2017/10/webstorm-2017-3-eap-173-3188/">функции</a> автозавершения кода и выведения информации для стандартных объектов, методов и Web API JavaScript.</p><p><a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap/#vue">Поддержка </a><a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap/#vue">Vue.js и</a><a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap/#vue"> </a><a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap/#vue">функции </a>завершения и перехода к определению <a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap/#vue">теперь работают</a> со входными параметрами Vue, свойствами в объектах данных, вычисляемыми свойствами, а также методами.</p><p>Улучшена <a href="https://blog.jetbrains.com/webstorm/2017/09/webstorm-2017-3-eap-173-2463/#css-impovements">работа с CSS</a>: благодаря новым вариантам окончаний кода для значений со свойствами transform, transition и pointer-events повысилась точность работы функции автозавершения кода для свойств и значений CSS.</p><h3>Контроль версий</h3><p>Усовершенствована <a href="https://www.jetbrains.com/ruby/whatsnew/#v2017-3-version-control">система контроля версий</a>: так, в функцию просмотра событий добавлено действие Interactively Rebase from Here, позволяющее подбирать, редактировать, пропускать, сжимать, переформулировать код и фиксировать его изменения. Сохраняются настройки каждой области рабочего пространства: открытые файлы, текущую конфигурацию и все контрольные точки. Также IDE показывает файлы, которые были изменены коммитом слияния, даже если они отличаются от общего родителя.</p><h3>Инструменты баз данных</h3><p>Доработке подверглись базы данных: узлы схем в древе базы данных были заменены <a href="https://blog.jetbrains.com/datagrip/2017/09/29/we-open-datagrip-2017-3-eap/">функцией в контекстном меню</a>, показывающей количество схем, отображаемых на древе в определённый момент времени. Для создания DDL-скриптов теперь можно использовать <a href="https://blog.jetbrains.com/datagrip/2017/11/02/datagrip-2017-3-eap-3/">SQL-генератор</a>. Кроме того, были улучшены <a href="https://blog.jetbrains.com/datagrip/2017/11/02/datagrip-2017-3-eap-3/">инструменты работы с SSH</a>.</p><h3>Прочие нововведения RubyMine 2017.3</h3><p>Среди других изменений можно отметить поддержку <a href="https://youtrack.jetbrains.com/issue/RUBY-20259">Ruby 2.5</a>, <a href="https://youtrack.jetbrains.com/issue/RUBY-20093">Gems.rb</a>, <a href="https://youtrack.jetbrains.com/issue/RUBY-20256">Docker Compose v3</a>, Cucumber Expressions, улучшенный Markdown, возможности <a href="https://youtrack.jetbrains.com/issue/RUBY-19336">переименования файлов из вкладок</a>, <a href="https://youtrack.jetbrains.com/issue/RUBY-19831">свёртывания многострочных контейнеров</a>, предложения <a href="https://youtrack.jetbrains.com/issue/RUBY-8936">установки gem’ов</a> в сообщениях трассировки стека, а также встроенную функцию установки Bundler через меню «Инструменты».</p>]]></content:encoded>
    </item>
    <item>
      <title>Врубись в Ruby: подборка книг по Ruby и Ruby on Rails</title>
      <link>https://tproger.ru/books/ruby-ror-books</link>
      <comments>https://tproger.ru/books/ruby-ror-books?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/books/ruby-ror-books</guid>
      <description><![CDATA[<p>Подборка книг помогает изучать Ruby и Ruby on Rails: от основ языка до проектирования API, функционального программирования и версии Ruby 2.1.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/books/ruby-ror-books">Врубись в Ruby: подборка книг по Ruby и Ruby on Rails</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Книги]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 28 Aug 2017 06:19:45 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ruby начал разрабатываться 23 февраля 1993 года и вышел в свет в 1995 году. Название навеяно языком Perl, многие особенности синтаксиса и семантики из которого заимствованы в Ruby (pearl — «жемчужина», ruby — «рубин»). Целью разработки было создание «настоящего объектно-ориентированного», лёгкого в разработке, интерпретируемого языка программирования.</p><p>Язык обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, сборщиком мусора и многими другими возможностями. Кроссплатформенная реализация интерпретатора языка является полностью свободной.</p><p>Ruby on Rails (RoR) — фреймворк, написанный на языке программирования Ruby. Он реализует архитектурный шаблон Model-View-Controller для веб-приложений, а также обеспечивает их интеграцию с веб-сервером и сервером баз данных. Является открытым программным обеспечением и распространяется под лицензией MIT.</p><p>Чтобы помочь вам в изучении этих технологий, мы собрали подборку книг. Как всегда, если вы знаете книгу, которая не попала в этот материал, делитесь ей в комментариях.</p><p>Эта книга предназначена для тех, кто хочет писать на Ruby как профи. В ней рассказывается, как проектировать красивые API и работать с приёмами функционального программирования. Новичкам книга не подойдёт, а вот тем, кто уже разбирается в Ruby, она точно пригодится.</p><p>Цель данной книги — научить читателей эффективно использовать язык Ruby. В книге рассматривается версия Ruby 2.1. Издание содержит около 400 различных примеров, сопровождающихся четкой постановкой задачи и ее решением с подробными комментариями.</p><p>Книга отличается достаточно низким входным порогом. Для ее изучения необязательно знать основы веб-разработки. В книге материал о Ruby on Rails, популярного фреймворка для разработки веб-приложений, дается с нуля. Автор Майкл Хартл, помимо Ruby on Rails, знакомит читателя с основами самого языка Ruby, языка запросов SQL, CSS, HTML. В книге много внимания уделено практическому использованию возможностей фреймворка. Также можно ознакомиться с <a href="https://dmkpress.com/files/PDF/978-5-97060-429-8.pdf">фрагментом</a> книги.</p><p>А эта книга пригодится именно начинающим. Её сложность увеличивается по нарастающей, и в каждом следующем разделе используются навыки, полученные в предыдущих.</p><p>С «Изучаем Ruby» вы в легкой и увлекательной форме на практике освоите все возможности этого языка, который сначала стремительно захватил сердца программистов Калифорнии, а затем и России.</p><p>Прочитав эту книгу, вы научитесь писать элегантный код с применением всех его уникальных особенностей.</p><p>В этой книге подробное разбирается внутреннее устройство языка Ruby. Знать сам Ruby читателю не обязательно, но вот знание C и, в особенности, принципов ООП будет огромным плюсом.</p><p>Эта книга отлично подойдёт для знакомства с Ruby. В ней разбираются все необходимые основы: от установки языка до обработки файлов и ООП. Каждая тема снабжена понятными примерами.</p><p>В этой книге рассказывается об одной из самых интересных фич Ruby — блоках. Они похожи на замыкания и лямбды и используются как в простых структурах языка вроде блоков, так и в сложных приёмах.</p><p>Эта книга разбита на несколько секций, различающихся по сложности. Сперва рассказывается о настройке и основных возможностях Ruby, а затем речь идёт о стандартной библиотеке и темах для продвинутых.</p><p>В этой книге рассказывается об основах веб-разработки на популярном фреймворке Ruby on Rails. Чтобы дать читателю представление о работе с реальными проектами, в книгу включены примеры использования Git, GitHub и Heroku.</p><p>Эта книга посвящена использованию принципов ООП в веб-проектах на Ruby on Rails. Фокус смещён в сторону практических решений, которые берут наилучшее от «пути Rails» и объектно-ориентированного подхода.</p><p>Также советуем ознакомиться с <a href="https://github.com/arbox/ruby-style-guide/blob/master/README-ruRU.md">этим руководством по стилю оформления</a> Ruby-кода и <a href="http://guides.rubyonrails.org">официальными гайдами</a> по Ruby on Rails.</p>]]></content:encoded>
    </item>
    <item>
      <title>Django или Ruby on Rails: какой фреймворк выбрать?</title>
      <link>https://tproger.ru/translations/django-or-ruby-on-rails</link>
      <comments>https://tproger.ru/translations/django-or-ruby-on-rails?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/django-or-ruby-on-rails</guid>
      <description><![CDATA[<p>Django и Ruby on Rails отличаются подходом к языку, философией и используемыми языками программирования, что влияет на выбор веб-фреймворка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/django-or-ruby-on-rails">Django или Ruby on Rails: какой фреймворк выбрать?</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Ruby on Rails]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 16 May 2017 09:31:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вопрос выбора фреймворка часто встаёт перед стартаперами или программистами. Первые хотят, чтобы проект был основан на наиболее подходящем, трендовом фреймворке. Вторые хотят развивать свои навыки и применять знания в реальных проектах. Обе цели могут быть достигнуты путём ознакомления с веб-фреймворком. Мы перевели для вас <a href="http://djangostars.com/blog/django-or-rails/?utm_source=tproger.ru&amp;utm_medium=translate&amp;utm_campaign=article&amp;utm_content=">материал о правильном выборе из этих двух альтернатив</a>.</p><h2>Змея или драгоценный камень</h2><p>Основные различия между фреймворками заключаются в подходе к языку, философии и языках программирования, которые они используют. Философия Python «Есть только один очевидный способ решения задачи» противоречит гибкости, свободе и силе выбора Ruby.</p><p>Большинство новичков начинают программировать на Python. Самый первый взгляд на код Python заманивает тех, кто не знаком с языком. Его синтаксис просто идеален: нет точек с запятой, странных специальных символов или ключевых слов. Если вы еще не программировали на Python — попробуйте, вы не разочаруетесь. Код на Python будет выглядеть следующим образом:</p><p>Синтаксис Python делает его подходящим для большинства проектов. Читаемость кода также упрощает присоединение новичков в команду разработчиков.</p><p>Python также хорош для прототипирования. Вы можете реализовать новую идею, используя Python. Если идея осуществима и ваше приложение требует высокой производительности, идея может быть повторно реализована на высокопроизводительном языке программирования вроде C++.</p><p>Прим. перев.  Если вы захотите начать изучение Python, советуем обратить внимание на наши <a href="https://tproger.ru/tag/python/">обучающие материалы</a> по этому языку.</p><p>Ruby особенный. Его можно назвать экзотическим и изящным. Не удивительно, что этот язык был изобретен японцами. В его строках есть что-то исключительное, что вызывает интерес. И хотя код не так читаем, как на Python, синтаксис по-прежнему очень прост для понимания и изучения. Код на этом уникальном языке будет выглядеть так:</p><p>В Ruby всё является объектами. Каждый тип данных относится к определенному классу со встроенными методами. То же самое относится к Python. Другой популярной особенностью Ruby являются «блоки». Используя их, вы можете изменить любой метод (даже встроенный).</p><h2>Особенности фреймворков</h2><p>Ruby on Rails и Django — это веб-фреймворки для реализации <a href="https://tproger.ru/articles/mvc/">схемы Model-View-Controller</a>. Этот шаблон разделяет проблемы разработки на три блока. Вот как это работает:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/model_2.png" alt="" /></figure><p>В двух словах, все три компонента шаблона MVC — это просто классы с методами. Представим ,что мы создали простой блог:</p><ul><li>Model представляет базы данных: профили пользователей, комментарии, сообщения и т.д.</li><li>View переносит данные в шаблон HTML и отправляет их в Controller.</li><li>Controller соединяет Model и View, обрабатывает пользовательские запросы и отправляет ответы обратно в веб-браузер.</li></ul><p>В Django имя шаблона немного отличается и может смутить сначала. Это тот же MVC, но View называется Template, а Controller называется View. Таким образом, мы получаем MTV.</p><h2>Расположение файлов</h2><p>Ruby on Rails и Django по-разному упорядочивают файлы внутри проекта . Представьте, что у нас есть веб-приложение Rails с именем my_taxi. Когда разработчик добавляет новый компонент, например «счета» или «платежи», он должен перейти в специальное место:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/11.png" alt="" /></figure><p>Django использует отдельные приложения для каждого компонента. Каждое приложение содержит собственные классы моделей, представлений и шаблонов. Это очень удобно, если ваш проект быстро развивается:</p><figure><img src="https://media.tproger.ru/uploads/2017/05/111.png" alt="" /></figure><h2>Продуктивность</h2><p>И Ruby on Rails, и Django имеют так называемые «волшебные», готовые решения. Однако магия RoR намного превосходит всё остальное.</p><p>Когда разработчик Rails создает контроллер, его методы могут автоматически обращаться к переменным и наследовать методы другого класса. Ни эти классы, ни переменные не определены явно. Ruby on Rails просто добавляет их автоматически. Он также автоматически устанавливает маршруты внутри MVC.</p><p>Разработчик Django, напротив, должен явно определять переменные и классы импорта. Они должны использовать <a href="https://tproger.ru/translations/regular-expression-python/">регулярные выражения</a> (что-то вроде ^[A-Z]+[a-z\g]$) для определения маршрутов и URL-адресов. Разработчики Django должны полностью понять, как все работает внутри, чтобы настроить код.</p><p>Приятно полагаться на волшебство, когда вы хотите как можно быстрее запустить веб-приложение. Для новичков-программистов это самый простой способ понять, как работают веб-фреймворки. С другой стороны, это покажет только картинку в целом. Развертывание веб-приложения на Django поможет понять, как все это работает в деталях.</p><h2>Производительность</h2><p>Оба фреймворка основаны на интерпретируемых скриптовых языках. Это приводит к почти одинаковой производительности. Ранние версии Ruby, такие как 1.8 или 1.9.x, были низко производительными. В те дни Twitter перешел с Ruby on Rails на Scala, заявив, что «Twitter Search теперь стал в 3 раза быстрее». Но имейте в виду, что большинство компаний вряд ли достигнут такого же объема трафика, как Twitter.</p><p>Обычно Python считается немного быстрее Ruby. Некоторые люди могут спорить и ссылаться на сравнительное сравнение времени выполнения. Тесты показывают идентичные результаты с точки зрения производительности. Однако даже эксперты Ruby признают, что язык медленный. Хорошей новостью является то, что каждая новая версия языков программирования повышает производительность.</p><h2>Документация и сообщества</h2><p>Документация является личным предпочтением. Оба фреймворка хорошо документированы и организованы. Команды разработчиков Django Software Foundation и Rails проделали большую работу, чтобы документации были структурированными и удобными. Они похожи на простые книги, которые приятно читать.</p><p><a href="https://docs.djangoproject.com/en/1.11/"></a></p><p><a href="http://guides.rubyonrails.org/"></a></p><p>Благодаря сообществам на StackOverflow и GitHub мы можем открыть Google и просто найти нужный код. Идея, которая придет вам на ум завтра, уже сегодня имеет готовое решение. Существует много программ, разработанных сообществом. Плагины могут помочь справиться с большинством задач.</p><p>Однако сообщества разные. Первоначально Ruby — это язык программирования общего назначения. Хотя существуют другие Ruby-структуры, такие как Sinatra или Lotus, большая часть Ruby относится к Rails. И Rails — это среда веб-разработки.</p><p>Python, напротив, выходит далеко за рамки веб-разработки. Есть много людей, которые используют Python для создания географических информационных систем, научно-ориентированных проектов, систем автоматизации тестирования и многого другого.</p><h2>Что выбрать?</h2><h3>Django и Python</h3><ul><li>Если вы знаете, что делать.</li><li>Если вы привыкли все делать в срок.</li><li>Если вы считаете, что документация — лучший друг программиста.</li></ul><h3>Ruby on Rails</h3><ul><li>Если вы ожидаете поддержку от веб-сообщества.</li><li>Если вы довольны большим количеством плагинов.</li><li>Если вы ищете фреймворк, который будет работать за вас.</li></ul><h2>Заключение</h2><p>Django и Ruby on Rails выглядят как близнецы от разных родителей: у каждого своя философия и свои особенности. Но когда дело доходит до работы, они действуют одинаково: они оба являются превосходными фреймворками, которые могут справляться с похожими задачами, используя свои уникальные подходы.</p><p>Чтобы сделать выбор было проще, посмотрите другой материал. Он рассказывает, <a href="https://tproger.ru/articles/which-technology-to-choose/">как выбрать технологию для большого и не очень большого веб-проекта</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем веб-приложение для распознавания лиц за час</title>
      <link>https://tproger.ru/translations/face-recognition-app-in-an-hour</link>
      <comments>https://tproger.ru/translations/face-recognition-app-in-an-hour?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дмитрий Юрченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/face-recognition-app-in-an-hour</guid>
      <description><![CDATA[<p>Amazon Rekognition распознаёт лица и объекты на фотографиях; пример получает снимки с веб-камеры iMac и выполняет распознавание через AWS API.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/face-recognition-app-in-an-hour">Пишем веб-приложение для распознавания лиц за час</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Компьютерное зрение]]></category>
      <category><![CDATA[Распознавание]]></category>
      <category><![CDATA[DIY]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 May 2017 13:33:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Деван Сабаратнам, разработчик с 30-летним стажем</p><p>В минувшие выходные, пролистывая Amazon Web Services, я заметил новый сервис под названием <a href="https://aws.amazon.com/ru/rekognition/">«Rekognition»</a>. Я предположил, что это опечатка (recognition — англ. распознавание), но она привлекла мое внимание. Я заинтересовался: что это за сервис? Amazon привык добавлять новые сервисы в свою платформу с пугающей регулярностью, и этот я пропустил.</p><p>Я узнал, что в конце 2016 года Amazon выпустила свой собственный сервис для распознавания изображений на базе глубокого обучения на их платформе. Он может распознавать не только лица, но и объекты на фото. Так как сервис довольно новый, подробностей о нём было немного, но мне захотелось немедленно попробовать его. В общем, в течение часа я написал пример веб-страницы, которая может получать фотографии с моей веб-камеры и выполнять элементарное распознавания лица на нем.</p><p>Прим. перев.  Чтобы не теряться в многочисленных сервисах Amazon, советуем вам прочитать <a href="https://tproger.ru/translations/aws-in-plain-russian/">нашу шпаргалку</a> по AWS.</p><p>Раньше я занимался технологией распознавания лиц, используя сторонние библиотеки, а также <a href="https://www.microsoft.com/cognitive-services/en-us/face-api">Microsoft Face API</a>, но все попытки создания подобного приложения не увенчались успехом. Но, просматривая документацию «Rekognition», я понял, что AWS API на самом деле очень прост в использовании. Я немедленно принялся за работу.</p><h2>Цель</h2><p>Мне была нужна простая веб-страница, которая позволила бы делать фотографию с помощью камеры моего iMac и выполнять распознавание на фотографии. В частности, я хотел бы определять пользователя, сидящего перед компьютером.</p><p>Сервис Amazon Rekognition позволяет создавать одну или несколько коллекций. Коллекция — это набор лицевых векторов для фотографий, которые вы хотите сохранить.</p><blockquote>Примечание: Сервис сохраняет не фотографии, а их JSON-представление.</blockquote><p>После создания коллекции вы можете сфотографировать предмет, сравнить его свойства c сохранёнными и вернуть ближайшее соответствие. Звучит просто, не так ли? По правде говоря, разработка фронтенда веб-страницы для получения данных с камеры заняла больше времени, чем написание бэкенда для распознавания.</p><p>В общем, веб-страница позволяет создавать или удалять коллекцию лицевых данных на Amazon, загружать новые данные, полученные из фотографии, в свою коллекцию и сравнивать новые фотографии с существующей коллекцией, чтобы найти совпадение. А в качестве дополнительной фичи я также добавил в эту демку службу <a href="https://aws.amazon.com/ru/polly/">Amazon Polly</a>, чтобы после распознавания фотографии страница приветствовала пользователя.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/1.png" alt="" /></figure><h3>Фронтенд</h3><p>Я не знал, какую библиотеку использовать для захвата изображения с помощью камеры iMac. В итоге я нашел на GitHub библиотеку <a href="https://github.com/amw/jpeg_camera">JPEG Camera</a>, которая позволяет использовать HTML5 Canvas или Flash для съёмки фото. Я решил использовать её и настроил под себя написанный на JavaScript образец.</p><h3>Бэкенд</h3><p>Для бэкенда я использовал Ruby-библиотеку <a href="http://www.sinatrarb.com">Sinatra</a>, которая может выполнять всю тяжёлую работу с помощью AWS. Я часто использовал Sinatra (на самом деле <a href="http://padrinorb.com">Padrino</a>) в своих проектах и настоятельно рекомендую эту платформу.</p><blockquote>Примечание: Amazon Rekognition предлагает сначала загружать исходные фотографии, которые использует его API, в Amazon S3, а затем обрабатывать их. Я хотел избежать этого ненужного шага и вместо этого отправлять изображения непосредственно в API, что мне в итоге удалось сделать.</blockquote><p>Я сумел сделать то же самое с их приветствием Polly . Вместо того, чтобы сохранять аудио в MP3-файл и проигрывать его, у меня получилось закодировать данные MP3 непосредственно в тег &lt;audio&gt; на странице и воспроизвести их оттуда.</p><h3>Код</h3><p>Я разместил весь код этого проекта на <a href="https://github.com/CyberFerret/FaceRekognition-Demo">моей странице</a> на GitHub. Не стесняйтесь использовать и изменять его. Ниже я постараюсь объяснить код более подробно.</p><h2>Пишем приложение</h2><p>Прежде всего, вам понадобится учетная запись <a href="https://aws.amazon.com/ru/">Amazon AWS</a>. Я не буду вдаваться в подробности, поскольку это несложно, а в случае затруднений можно легко найти информацию в Интернете.</p><h3>Создание пользователя AWS IAM</h3><p>Как только вы создали учетную запись AWS, первое, что нам нужно сделать, — создать пользователя Amazon IAM (Identity &amp; Access Management), который имеет права на использование службы Rekognition. Мы также зададим права для Amazon Polly.</p><p>В консоли Amazon нажмите на кнопку «Сервисы» в верхнем левом углу, затем выберите «IAM». В меню слева выберите «Пользователи». Вы должны увидеть список существующих пользователей IAM, которых вы создали в консоли, если вы делали это в прошлом.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/2.png" alt="" /></figure><p>Нажмите кнопку «Добавить пользователя», расположенную в верхней части списка, чтобы добавить нового пользователя IAM.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/3.png" alt="" /></figure><p>Дайте пользователю имя и убедитесь, что вы отметили пункт «Programmatic Access», так как вы будете использовать этот IAM в вызове API.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/4.png" alt="" /></figure><p>Далее приведены настройки разрешений. Убедитесь, что вы щелкаете по третьему квадратику на экране с надписью «Attach existing policies directly». Затем в поле поиска «Filter: Policy Type» введите «rekognition». Выберите «AmazonRekognitionFullAccess» из списка, поставив рядом с ним галочку.</p><p>Затем измените фильтр поиска на «polly» и поместите галочку рядом с «AmazonPollyFullAccess».</p><p>Теперь у этого IAM есть права, достаточные для Amazon Rekognition и Amazon Polly. Нажмите «Next: Review» в правом нижнем углу.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/5.png" alt="" /></figure><p>На странице просмотра вы должны увидеть 2 политики использования, дающие вам полный доступ к Rekognition и Polly. Если вы их не видите, вернитесь и повторите предыдущий шаг. Затем нажмите кнопку «Создать пользователя» в правом нижнем углу.</p><figure><img src="https://media.tproger.ru/uploads/2017/04/6.png" alt="" /></figure><p>Эта страница важна. Запишите ключи AWS Key и AWS Secret, которые вы указали на этой странице, поскольку нам необходимо включить их в наше приложение ниже.</p><p>Это единственный раз, когда вам будут показаны эти ключи, поэтому сохраните их и файл CSV с этой страницы в надёжном месте.</p><h3>Загрузка кода</h3><p>Теперь загрузите пример кода с <a href="https://github.com/CyberFerret/FaceRekognition-Demo">моей страницы GitHub</a>, чтобы вы могли изменить его по мере необходимости. Загрузите код в виде ZIP-файла, либо склонируйте его в вашу рабочую папку.</p><p>Первое, что вам нужно сделать, — это создать файл с именем .env в рабочей папке и ввести эти две строки, заменив в них ключи Amazon IAM на свои:</p><p>Теперь, если у вас установлен Ruby (не Ruby on Rails), то для установки зависимостей запустите команду:</p><p>Для запуска приложения введите эту команду:</p><p>Она должна запустить веб-браузер на порте 4567, чтобы вы могли увидеть веб-страницу и начать тестирование:</p><h3>Использование приложения</h3><p>Сама веб-страница довольно проста. Вы должны увидеть потоковое изображение в верхней части экрана, которое представляет собой канал с вашей веб-камеры.</p><p>Сперва создайте коллекцию, щелкнув по ссылке в самом нижнем левом углу страницы. Это создаст пустую коллекцию на серверах Amazon для хранения ваших изображений. Обратите внимание: имя по умолчанию для этой коллекции — faceapp_test, но вы можете изменить его в коде faceapp.rb (строка 17).</p><p>Затем, чтобы начать добавление лиц в свою коллекцию, попросите нескольких людей сесть перед вашим компьютером или телефоном и убедиться, что их лицо находится только в рамке для фотографий (несколько лиц сделают сканирование неудачным). Когда всё будет готово, введите их имя в текстовое поле и нажмите кнопку «Добавить в коллекцию». Должно появиться сообщение о том, что данные о лице были добавлены в базу данных.</p><p>После того, как вы создали несколько лиц в своей базе данных, вы можете попросить случайного человека сесть перед камерой и нажать «Сравнить изображение». Если этот человек уже добавлен в коллекцию, на экране должно появиться его имя.</p><p>Обратите внимание, что обычный способ работы Amazon Rekognition заключается в том, чтобы загружать фотографию в Amazon S3 Bucket, а затем обрабатывать его оттуда, но я хотел обойти этот шаг и фактически отправить данные фотографии непосредственно в Rekognition как поток байтов, закодированный в Base64. К счастью, aws-sdk для Ruby позволяет использовать оба метода.</p><h3>Разбор кода</h3><p>Прежде всего, давайте взглянем на HTML-страницу:</p><p>Структура страницы проста: всего несколько блоков, кнопок и ссылок. Обратите внимание, что мы используем jQuery, а также Moment.js для настраиваемого приветствия. Следует обратить внимание на код faceapp.js, который выполняет все сложные задачи и ссылки на библиотеку камер JPEG.</p><p>Вы также можете заметить теги &lt;audio&gt; в нижней части файла — это аудио-приветствие, которое мы отправляем пользователю.</p><p>Теперь разберем JS-файл приложения:</p><p>Это настраивает библиотеку JPEG Camera, чтобы отображать канал на экране и обрабатывать загрузку изображений.</p><p>Функция add_to_collection() захватывает изображение с камеры, а затем выполняет запись в конечную точку /upload вместе с именем пользователя в качестве параметра. Функция проверяет, действительно ли вы ввели имя, которое нужно в качестве уникального идентификатора этих данных.</p><p>Функция загрузки проверяет вызов и выводит сообщение об успешном завершении или ошибке.</p><p>Функция compare_image() вызывается, когда вы нажимаете кнопку «Сравнить изображение». Она захватывает кадр из камеры и передает POST-данные в /compare. Эта конечная точка вернет либо ошибку, либо структуру JSON, содержащую id (имя) найденного лица, а также процент схожести.</p><p>Если лицо совпадёт с данными из коллекции, функция отправит имя найденного лица в /speech. Эта конечная точка вызывает службу Amazon Polly, чтобы преобразовать приветствие в файл MP3, который можно воспроизвести пользователю.</p><p>Служба Amazon Polly возвращает приветствие в виде бинарного потока MP3, поэтому мы берем этот поток ввода-вывода, шифруем его в формате Base64 и помещаем в качестве закодированной исходной ссылки в теги &lt;audio&gt; на нашей веб-странице. Затем мы можем вызвать .play() для воспроизведения MP3 через динамики пользователя с помощью HTML5 Web Audio API.</p><p>Прим. перев.  Вы можете узнать о Web Audio побольше, прочитав <a href="https://tproger.ru/translations/web-audio-intro/">нашу серию статей</a> по этой теме.</p><p>Наконец, в JS-файле приложения есть функция greetingTime(). Она решает, стоит ли говорить «доброе утро / день / вечер» в зависимости от времени суток пользователя.</p><p>Теперь взглянем на код Ruby:</p><p>Здесь задан блок настройки конфигурации аутентификации AWS и имени коллекции по умолчанию, которое мы будем использовать (вы можете его свободно менять).</p><p>Остальная часть кода — это конечные точки, которые Sinatra будет слушать. Он прослушивает GET в /, чтобы отобразить фактическую веб-страницу конечному пользователю, а также слушает вызовы POST к /upload, /compare и /speech, которым JS-файл отправляет данные. Только 3–4 строки кода для каждой из этих конечных точек фактически выполняют задачи распознавания лиц и речи. Подробнее о них можно узнать из <a href="https://docs.aws.amazon.com/sdkforruby/api/Aws/Rekognition/Client.html">документации AWS SDK</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка неожиданного, странного, местами безумного кода: самые необычные программы из когда-либо написанных</title>
      <link>https://tproger.ru/translations/creepy-code-collection</link>
      <comments>https://tproger.ru/translations/creepy-code-collection?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/creepy-code-collection</guid>
      <description><![CDATA[<p>Регулярное выражение на Perl для проверки простого числа, выражение для дня недели и другие примеры кода, который ломает мозг даже опытным кодерам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/creepy-code-collection">Подборка неожиданного, странного, местами безумного кода: самые необычные программы из когда-либо написанных</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Красивый хак]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Perl]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 14 Mar 2017 21:35:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>Сегодня мы поговорим о самых странных программах, какие вы когда-либо видели. Настолько странных, что они сломают ваш мозг. Настолько маленьких, что не верится, что они работают. И настолько непонятных, что даже прошаренные кодеры начнут неистово гуглить.</p><p>Примечание Никогда не используйте такой код в реальных проектах — читаемость и поддерживаемость превыше всего.</p><h3>Уровень 0. Вступление</h3><p>Взгляните на этот милый код:</p><p>Это регулярное выражение написано на Perl и проверяет, является ли число простым. Вот <a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/check_prime.pl">полный код программы</a> для запуска. А вот <a href="https://tproger.ru/articles/quick-guide-to-perl/">наше руководство по Perl</a>, чтобы вы могли начать его изучать.</p><p>А это выражение выдаст день недели для заданной даты:</p><p>А как вам этот код на Java?</p><p>Чему будет равно i? Он вообще скомпилируется? Да уж…</p><p>А программа на гифке ниже — это <a href="https://tproger.ru/articles/quines">куайн</a> по имени qlobe, написанный на Ruby. Ну разве это не изумительно?</p><figure><img src="https://media.tproger.ru/uploads/2017/02/258441bc-c712-11e6-88bf-f8f02a028ad3.gif" alt="" /></figure><p>А эта — ну просто шедевр! Анимированный 3D-пончик, какая вкуснятина!</p><p>Вставьте этот код в адресную строку:</p><p>и оцените всю магию самостоятельно!</p><p>А вообще лучше ничего не копипастьте, <a href="https://tproger.ru/translations/dont-copy-paste-from-internet-to-terminal">особенно код для командной строки</a>, последствия могут быть неприятными.</p><p>Большую часть программ, приведённых ниже, вы вряд ли поймёте. Но описания по ссылкам помогут прояснить ситуацию. Для запуска этих программ вам может понадобится один из <a href="https://tproger.ru/digest/compile-code-online/">онлайн-компиляторов</a>, о которых мы рассказывали в одной из наших статей, например, ресурсы <a href="https://www.tutorialspoint.com/codingground.htm">TutorialsPoint-CodingGround</a> и <a href="https://repl.it/languages">repl.it</a> — там есть онлайн-редакторы кода и компиляторы.</p><h3>Уровень 1. Начинающий</h3><p><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/pyjava.java">pyjava.java</a> – Java-код, написанный, как на Python. Вычисляет факториалы больших чисел.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/one_line_swap.c">one_line_swap.c</a> – Странные однострочники, меняющие местами значения двух переменных.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/hello_world.java">hello_world.java</a> – Магическим образом выводит в консоли «hello world».<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/obfuscated.java">obfuscated.java</a> – Выводит в консоли «Hi!», но выглядит как большой бессмысленный комментарий.</p><h3>Уровень 2. Типичный</h3><p>Исходник – Описание</p><p><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/bitwise_arithmetic.c">bitwise_arithmetic.c</a> – Складывает и перемножает числа при помощи битовых операций.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/prefix2postfix.c">prefix2postfix.c</a> – Преобразует префиксную нотацию в постфиксную.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/sapin.c">sapin.c</a> – Выводит движущуюся новогоднюю ёлку.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/crazy_jvm.java">crazy_jvm.java</a> – Похоже, что JVM сошла с ума и выводит случайные числа.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/confusion.java">confusion.java</a> – Удивительно, но этот код компилируется и выводит 1.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/not_so_random.java">not_so_random.java</a> – Выведет (случайным образом!) 1 1 1 1 1 1 1 1 1 1.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/bangladesh.c">bangladesh.c</a> – Выводит карту Бангладеша.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/signature_prime.c">signature_prime.c</a> – Бесконечно (теоретически) выводит простые числа.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/day_of_week.c">day_of_week.c</a> – Вычисляет день недели для заданной даты.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/polyglot_so404.py.pl.rb.c.bf">polyglot_so404.py.pl.rb.c.bf</a> – Выводит 404 на Python, Perl, Ruby, C и Brainfuck.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/polyglot_quine.c.py.pl.rb">polyglot_quine.c.py.pl.rb</a> – Куайн, который работает в C, Python, Perl и Ruby.</p><h3>Уровень 3. Продвинутый</h3><p>Исходник – Описание</p><p><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/compound_eye.rb">compound_eye.rb</a> – Выводит анимированный узор.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/best_short_program.c">best_short_program.c</a> – Считывает число, записанное словами, и выводит его в десятичном виде.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/check_prime.pl">check_prime.pl</a> – Проверяет, является ли число простым, при помощи регулярного выражения.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/quine_signature.c">quine_signature.c</a> – Самый короткий код на Си, который печатает сам себя.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/clock_in1line.c">clock_in1line.c</a> – Выводит текущее время в виде ASCII-арта.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/japh.pl">japh.pl</a> – Выводит «just another perl hacker».<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/matrix_effect.html">matrix_effect.html</a> – Выводит экран Матрицы.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/pi_signature.c">pi_signature.c</a> – Вычисляет первые 15 тысяч знаков числа пи после запятой.</p><h3>Уровень 4. Просветлённый</h3><p>Исходник – Описание</p><p><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/mandelbrot_imager.py">mandelbrot_imager.py</a> – Создаёт множество Мандельброта (может работать до 20 минут!).<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/shortest_tetris.html">shortest_tetris.html</a> – Очень простой вариант Тетриса.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/qlobe.rb">qlobe.rb</a> – Выводит вращающийся глобус.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/animated_3d_doughnut.c">animated_3d_doughnut.c</a> – Показывает трёхмерный анимированный ASCII-пончик.<br /><a href="https://github.com/MinhasKamal/CreepyCodeCollection/blob/master/mandelbrot_flythrough.pl">mandelbrot_flythrough.pl</a> – Позволяет вращать, приближать, отдалять и прокручивать множество Мандельброта.</p><h3>Программы для ценителей</h3><p>Исходник – Описание</p><p><a href="https://rosettacode.org/wiki/Polyglot">octaglot.cob.pas.f77.c.ps.sh.pl.com</a> – Полиглот, выводит «hello polyglots» на 8 языках.<br /><a href="https://github.com/kenrube/Esopoly">esoteric_polyglot.mal.bf.ws.asdf.​123.spoon.excon</a> – Полиглот, написанный на 7 эзотерических языках.<br /><a href="https://github.com/KvanTTT/Freaky-Sources/blob/master/Patterns%20and%20Data/PalindromePolyglotQuine.cs.java">palindrome_polyglot_quine.cs.java</a> – Код-палиндром, компилируется в C# и Java и выводит сам себя.<br /><a href="https://github.com/mame/quine-relay">quine_relay.rb</a> – Программа-уроборос, написанная на 100 различных языках.</p><p>У многих программ есть обсуждения на сайтах <a href="https://stackoverflow.com/">StackOverflow</a>, <a href="https://www.quora.com/">Quora</a>, <a href="https://codegolf.stackexchange.com/">Programming Puzzles &amp; Code Golf </a>и <a href="https://news.ycombinator.com/news">Hacker News</a>.</p><p>Если вам понравилась эта подборка, то обязательно понравится ещё одна: <a href="https://github.com/MinhasKamal/CuteVirusCollection">CuteVirusCollection</a>. Будьте осторожны! Все программы оттуда немедленно перехватят контроль над системой, какой бы мощной она не была. Но поверьте, вирусы ещё никогда не были такими милыми.</p><h3>Вам не хватило странного кода? Вот ещё несколько подборок:</h3><ul><li>Рубрика <a href="https://tproger.ru/tag/good-hack/">«Красивый хак»</a> на нашем сайте;</li><li><a href="http://www.ioccc.org/years-spoiler.html">IOCCC</a>, <a href="http://www.pixelstech.net/article/1351185934-Do-you-really-understand-C-21st-International-Obfuscated-C-Code-Contest-winning-entries">IOCCC Winning Entries</a>;</li><li><a href="http://www.perlmonks.org/">PerlMonks</a>;</li><li><a href="http://www.iwriteiam.nl/SigProgC.html">C Cignature Programs</a>;</li><li><a href="https://codegolf.stackexchange.com/questions/tagged/tips?sort=votes&amp;pageSize=15">CodeGolf-StackExchange: Tips</a>, <a href="https://codegolf.stackexchange.com/questions/69/golf-you-a-quine-for-great-good">CodeGolf-StackExchange: Quine</a>, <a href="https://stackoverflow.com/questions/1995113/strangest-language-feature">StackOverflow: Strangest Language Feature</a>;</li><li><a href="http://js1k.com/">JS1K</a>;</li><li><a href="https://www.quora.com/What-is-the-most-elegant-line-of-code-youve-seen">Quora: Elegant Code</a>, <a href="https://www.quora.com/What-is-the-shortest-and-most-effective-code-ever-written">Quora: Shortest Effective Code</a>, <a href="https://www.quora.com/Whats-the-coolest-thing-you-can-get-a-computer-to-do-in-10-lines-of-code">Quora: Coolest Thing in 10 Line</a>;</li><li><a href="https://web.archive.org/web/20170319051614/http://cs.lmu.edu:80/~ray/notes/quineprograms/">QuinePrograms</a>;</li><li><a href="http://code-poetry.com/">CodePoetry</a>;</li><li><a href="http://golf.shinh.org/all.rb">Anarchy Golf</a>;</li><li><a href="http://uguu.org/sources.html">http://uguu.org/sources.html</a>;</li><li><a href="https://gist.github.com/xem/206db44adbdd09bac424">JS Code Golfing</a>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Простая и ужасающая история про шифрование — об Open Source, доверии и ответственности</title>
      <link>https://tproger.ru/translations/simple-terrifying-encryption-story</link>
      <comments>https://tproger.ru/translations/simple-terrifying-encryption-story?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/simple-terrifying-encryption-story</guid>
      <description><![CDATA[<p>Разработчик на Ruby выбрал библиотеку aes для шифрования по алгоритму AES и наткнулся на баг при расшифровке сообщения с неверным ключом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/simple-terrifying-encryption-story">Простая и ужасающая история про шифрование — об Open Source, доверии и ответственности</a>»</p>]]></description>
      <category><![CDATA[Open Source]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 13 Jan 2017 13:07:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Kacper Walanus,Senior-разработчик Ruby on Rails и тимлид в EL Passion</p><h3>Задача</h3><p>Я хотел написать простое приложение для шифрования и дешифрования сообщений. Алгоритм <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a> показался хорошим выбором, так что я начал с поиска подходящей библиотеки.</p><h3>Решение</h3><p>Я пишу на Ruby, так что сделал то, что сделал бы любой на моём месте — загуглил «ruby gem aes». И сразу же нашёл библиотеку под названием (сюрприз!) «aes», простейший пример использования которой выглядел вполне понятно:</p><p>Если передать неверный ключ, то библиотека выдаст ошибку:</p><h3>Баг</h3><p>Во время разработки я заметил одну интересную особенность. Я написал тест для проверки расшифровки сообщений с неправильным ключом. Если говорить конкретнее, я заменил один символ в ключе, с которым сообщение было зашифровано и попытался получить обратный результат, ожидая ошибку. И… мой тест провалился! Ошибка не просто не была сгенерирована, ещё и само сообщение было корректно расшифровано:</p><p>Хорошо, допустим я нашёл один крайне особенный случай, один на миллион. Попробуем поменять два символа в ключе:</p><p>… и опять тот же результат!</p><p>Что же, осталась только одна вещь, которую стоило проверить — использовать совершенно другой ключ:</p><p>Это выглядело как серьёзная проблема безопасности, так что я решил разобраться, в чём дело.</p><h3>Отладка</h3><p>Проблема была вот <a href="https://github.com/chicks/aes/blob/3661b53ec9fa09bf1969b71905a3cc91817ceea2/lib/aes/aes.rb#L155">в этой строчке</a> библиотеки «aes»:</p><p>Для начала объясню часть про unpack. В данном случае эта функция разделяет строку на массив из 32 строк (смотрите <a href="http://apidock.com/ruby/String/unpack">документацию</a>, если нужны подробности):</p><p>Затем для каждой из этих 32 коротких строк вызывается метод #hex. А String#hex в Ruby, как известно, преобразует шестнадцатеричные строки в их десятеричное числовое представление, а в случае неудачи возвращает 0:</p><p>Таким образом, любая строка не содержащая корректной шестнадцатеричной последовательности (как «ff» или «13») превратится просто в 32 нуля:</p><p>И в результате расшифровать сообщение можно практически с любым ключом. Скорее всего, автор ожидал, что в качестве ключей будут использоваться корректные числовые последовательности. Описанный баг, вероятно, следствие данного наивного предположения.</p><h3>Итого</h3><p>Библиотека «aes» не самая большая среди прочих в Ruby, всего 45 звёзд и 13 форков. Но проблема в том, что она выдаётся на первом месте в Google при поиске «aes gem» или «ruby aes gem», а мы обычно не задаём вопросов к тому, что Google выдаёт в топе. Мы вообще очень редко проверяем внешние библиотеки, хотя, судя по всему, должны бы. Особенно, когда дело касается безопасности.</p><h3>Дополнение</h3><p>Хочу пояснить, что у меня не было цели обвинить в чём-либо автора библиотеки. Он написал её несколько лет назад и не мог предвидеть, что она станет выдаваться поисковиками на первых строчках в 2017 году. Я просто нашёл серьёзный баг и хочу поделиться им с другими. Это то, как я представляю общественную ответственность в движении Open Source.</p><h3>Технические детали</h3><ul><li>Сама библиотека: <a href="https://github.com/chicks/aes">https://github.com/chicks/aes</a></li><li>Версия, использованная автором: 0.5.0 / 12c3648</li><li><a href="https://gist.github.com/kv109/42289aa65f81e819910005f4773215a1">Пример кода</a></li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как выбрать технологию для большого и не очень большого веб-проекта</title>
      <link>https://tproger.ru/articles/which-technology-to-choose</link>
      <comments>https://tproger.ru/articles/which-technology-to-choose?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Alexey Gorshkov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/which-technology-to-choose</guid>
      <description><![CDATA[<p>Никита Семенов, CEO SECL Group, объясняет, почему технологии чаще выбирают по субъективным причинам и что нужно знать для объективного выбора.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/which-technology-to-choose">Как выбрать технологию для большого и не очень большого веб-проекта</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[WordPress]]></category>
      <category><![CDATA[1C-Bitrix]]></category>
      <category><![CDATA[Magento]]></category>
      <category><![CDATA[OpenCart]]></category>
      <category><![CDATA[Материалы от друзей Tproger]]></category>
      <category><![CDATA[Django]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 20 Nov 2016 15:23:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает Никита Семенов, CEO SECL Group</p><p>За годы работы я часто слышал вопросы о выборе технологий для того или иного веб-проекта. Кто-то спрашивает у нас, как у разработчиков, как правильно, а кто-то приходит и просит сделать на какой-то конкретной технологии.</p><p>Проблема в том, что большинство выбирают технологии по субъективным причинам и пока я не слышал достойного и внятного рассуждения, которое позволит выбрать технологию объективно, основываясь на фактах, а не желаниях. Даже немногие IT-шники могут правильно выбрать технологию, ведь для этого нужно: понимать специфику проекта, иметь многолетний опыт разработки на нескольких языках, знать, как устроены подобные проекты и т.д.</p><p>Но прежде, чем что-то выбирать, давайте посмотрим, какие технологии бывают, чем они отличаются и в каких случаях какую технологию выбрать.</p><h3>Как чаще всего выбирают технологию сейчас:</h3><p>1. Она мне нравится<br />2. Знакомый посоветовал<br />3. Прочитал в Интернете<br />4. На этой технологии сделан аналогичный сайт</p><h4>В чем тут проблема:</h4><p>1. Нравится. Очень субъективно. А что, если по требованиям она не подходит? Или на ней очень дорогие и редкие специалисты? Или она вообще умирает?</p><p>2. Знакомый. Обычно это тот знакомый, который «чуть лучше» разбирается в ИТ, чем тот, кому он советует. И даже если он программист с опытом, он не может знать всех решений на всех популярных языках. Ведь никто не спрашивает, по каким критериям выбирал этот знакомый. Если этот знакомы не CTO Google, я бы так просто не доверял такой рекомендации.</p><p>3. Прочитал. Тут уже лучше, можно найти разные сравнения и аргументацию. Но опять же, чтобы разобраться во всех решениях человеку, пусть даже с крепкими знаниями в разработке, нужно время. А без знаний в разработке все прочитанные технические обзоры ничего не стоят.</p><p>4. Аналог. Большинство популярных сайтов написаны на тех или иных технологиях потому, что так «исторически сложилось» . Если бы Facebook сейчас выбирал технологию для себя, я сомневаюсь, что он взял бы за основу PHP. А еще может быть, что технология уже устарела, её продавили на основе прошлых 3х пунктов, выбрали какую-то разрекламированную технологию, а не действительно эффективную и т.д. Вы вряд ли можете знать реальные причины выбор технологий в других проектах. Оптимальные технологии используются крайне редко в аналогичных проектах.</p><p>Таким образом, ни один из вышеперечисленных методов выбора технологий разработки не отвечает критериям объективности. Поэтому стоит сначала определить эти критерии, а уже потом подбирать по ним техническую платформу. Ниже я попытаюсь выделить действительно важные для проекта критерии, на которым мы и будем основываться.</p><h4>Важные критерии при выборе технологий:</h4><ol><li>Размер и тип проекта</li><li>Сложность проекта</li><li>Скорость разработки</li><li>Стоимость специалистов</li><li>Доступность специалистов</li><li>Доступные инструменты разработки</li><li>Наличие готовых решений</li><li>Гибкость решения</li><li>Наличие широкого сообщества</li><li>Отказоустойчивость решения</li><li>Тренд его развития</li><li>Наличие подробной документации</li><li>Стоимость поддержки</li><li>Требования к нагрузкам</li><li>Требования к безопасности</li><li>Кроссплатформенность</li><li>Возможности интеграции с другими решениями</li></ol><p>Выбирая технологию по таким критериям мы сможем добиться объективного выбора и тем самым сэкономить себе время и деньги.</p><h3>Какие бывают проекты</h3><p>К технологиям мы еще вернемся, а пока давайте разберемся, какие бывают проекты. Часто тип проекта говорит сам за себя и можно сразу сказать, что подойдет: либо уже готовое решение, либо хотя бы в какую сторону нужно двигаться.</p><h4>Сложность проекта</h4><ol><li>Простые (визитки, лендинги, простые интернет-магазины, простые приложения) — такие решения обычно делаются на тематических коробочных решениях, CMS или шаблонах.</li><li>Средние (сложные интернет-магазины и маркетплейсы, порталы национального масштаба, разнообразные сервисы, продвинутые приложения) — такие решения обычно делаются на фреимворках.</li><li>Сложные (огромные порталы, социальные сети, инновационные и нетиповые решения) — ядро таких проектов обычно разрабатываются на чистом (нативном) языке программирования.</li></ol><p>По тематике: интернет-магазины, доски объявлений, социальные сети и т.д. Для большинства популярных тематических решений уже давно есть коробочные продукты и, если мы не пытаемся сделать какого-то монстра, то правильнее будет выбрать именно их. Решений очень много, все в одной статье описать невозможно.</p><h4>Языки программирования</h4><p>В технологиях я бы выделил 3 уровня абстракции:</p><ol><li>Чистый язык — это материал, из которого можно сделать все, что угодно. Ограничивают нас только возможности языка. На чистом языке сделаны все крупнейшие сайты мира с посещаемостью в сотни миллионов и миллиарды пользователей, такие как: Instagram, YouTube, Pinterest, Tumblr, Dropbox, Twitter, Facebook, Amazon, Digg, LinkedIn и другие. Более того, крупнейшие проекты в мире даже создают новые технологии для себя, так как уже существующие их не устраивают.</li><li>Фреимворк — это некая среда разработки для программиста с готовыми правилами и инструментами. Фреимворк с одной стороны помогает и ускоряет разработку, а с другой накладывает определенные ограничения. На фреимворках делаются проекты средней сложности с посещаемостью в миллионы.</li><li>CMS — это уже готовое решения, конструктор, в котором мы по частям собираем нужный проект. Его скорее не программируют, а настраивают. Ограничений тут огромное количество, выйти за границы коробки сложно и неэффективно. На CMS делаются простые сайты с посещаемостью до миллиона пользователей в месяц.</li></ol><p>Чаще всего один уровень абстракции базируется на другом. То есть на чистом языке делают фреимворки, а на фреимворках делают CMS. Для каждого популярного языка есть много разных фреимворков и CMS, но об этом позже.</p><p>Сегодня есть огромное количество разных языков программирования, на которых делают сайты. И, более того, на всех популярных языках есть примеры огромных сайтов. Если 10 лет назад, говоря о технологиях больших сайтов, все говорили преимущественно про Java, то сегодня это может быть почти любой язык и утверждать, что сайты делаются на каком-то конкретном языке — стереотип. Это связанно с развитием самих языков, за последнее десятилетие многие сильно продвинулись в развитии и получили широкие возможности. Конечно, каждый язык чем-то отличается и выбирая мы опять же должны руководствоваться объективными критериями с оглядкой на задачи проекта.</p><p>На чистом языке, без использования фреимворков и коробочных решений, пишутся огромные проекты с повышенными требованиями по гибкости, нагрузкам и безопасности. Для таких огромных проектов часто бюджет не играет такого значения, как эффективность. Чем больше проект, тем больше будет требований по гибкости и нагрузкам, а значит, проще писать все с нуля, выделяя на это лучших специалистов, чем если брать какие-то готовые решения, которые непонятно кем писались и непонятно какие проблемы в них скрыты. К примеру, когда речь про небольшой проект с посещаемостью в 10 тыс. человек в день, то нам будет дешевле сделать его на CMS, которая будет потреблять в 3 раза больше ресурсов сервера, поставить дополнительный сервер за 50$ / мес. и оно будет работать. Когда же мы говорим про сайт с посещаемостью в 100 млн. пользователей в день, стоимость добавления серверов у нас будет просто космической, поэтому нам проще и дешевле вложить деньги в разработку решения на чистом языке, которое будет оптимальным именно для конкретного проекта.</p><p>Чем больше проект, тем больше стек технологий, который в нем используется. В огромных порталах может использоваться сразу несколько языков программирования. Опять же, мы приходим к объективным критериям выбора технологий. Часто один язык может хорошо делать одну задачу, а другой — другую. Такие проекты могут быть на столько огромными, что его части могут работать на разных серверах, с разными доменами (поддоменами) и разными технологиями. Не следует боятся винегрета технологий в большом проекте, хотя и допускать его нужно только когда это действительно необходимо, а также помнить, что далеко не все технологии совместимы. Самый яркий пример использования разных технологий — Google. Он на столько большой, что разные его части написаны на C/C++, Java, Python, JS и других языках. Более того, Google активно создает новые технологии, как, например, популярный нынче AngularJS.</p><p>Попробую дать краткую характеристику каждому из популярных языков:</p><ol><li>PHP — его используют в основном для простых и средних проектов. Очень много коробочных решений. Относительно дешевые программисты. Антитренд последних лет, хотя с выходом последней версии языка под номером 7, он получил действительно мощные возможности.</li><li>Python — современный язык, разработка на нем быстрая и качественная. Используют его для средних и больших проектов. Программистов найти проблематично и стоят они не дешево.</li><li>Ruby — современный язык, разработка на нем так же быстрая. Его используют в основном для разработки простых и средних проектов, часто разрабатывают стартапы. Программистов также мало и они дорогие.</li><li>Java — разработка на нем очень долгая и дорогая. Его используют в основном для больших проектов со специфическими требованиями. Однако является самым популярным языком программирования <a href="https://tproger.ru/news/tiobe-march-2016/">в рейтинге TIOBE</a> по состоянию на март 2016.</li><li>C# — аналог Java, также используют для больших проектов, часть в сфере FinTech.</li><li>JavaScript — очень быстро развивается, тренд последних лет и самый популярный язык программирования <a href="https://tproger.ru/news/redmonk-language-ranking-6-16/">в рейтинге Redmonk</a> по состоянию на июнь 2016. Огромное количество наработок и можно писать все, что угодно, даже игры. Его используют для средних и больших проектов, но действительно мощные возможности этот язык получит недавно, потому примеров больших проектов пока мало, специалисты самые дорогие и найти их сложнее всего.</li></ol><p>Я описал самые популярные языки, которые сегодня используются под веб. Есть много новых языков, которые очень быстро растут, в частности Scala и некоторые другие. Но пока они довольно молодые и сырые. Я бы не рекомендовал бежать за модой и писать на них, пока они не разовьются во что-то большее.</p><p>Примеры больших сайтов:</p><ul><li>PHP: Facebook, Вконтакте, КиноПоиск</li><li>Python: Instagram, Pinterest, Reddit</li><li>Ruby: 500px, Groupon, Airbnb</li><li>Java: Ebay, Amazon, Alibaba</li><li>C#: Guru, Stack Overflow, Bank of America</li><li>JS: LinkedIn, Walmart, PayPal</li></ul><p>Эти примеры отлично показывают, что большие сайты могут быть написаны на разных языках, и это нормально. Опять же, приходим к тому, что выбирать технологию нужно под требования, руководствуясь объективными причинами.</p><h4>Фреймворки и платформы</h4><p>Это некая среда разработки для программистов, где есть готовая инфраструктура и ряд готовых функций со стандартными решениями типичных задач. Такой себе полуфабрикат, из которого можно сделать конфетку. На каждом языке есть много разных фреймворков. Есть как общие, которые создавались для разработки любых решений, так и специализированных, под узкие задачи. Например, Sylius — специализированный E-commerce фреймворк на основе Symfony. Также есть те, на которых делаются большие и сложные решения, а другие для этого не предназначены. Ниже я опишу популярные фреймворки для каждого из языков, на которых можно писать большие и сложные решения.</p><p>На фреймворках разрабатываются довольно большие и сложные сайты с уникальным функционалом. Это значительно быстрее и дешевле, чем на чистом языке, но при этом такое решение позволяет разрабатывать действительно сложные вещи и оптимизировать все это под нагрузки. Кроме того, это почти всегда более безопасно, чем любая коробочная CMS. Если вы хотите узнать об этом больше, посмотрите <a href="https://tproger.ru/translations/web-frameworks-how-to-get-started/">материал про веб-фреймворки для начинающих</a>.</p><p>Популярные фреймворки и платформы:</p><ol><li>PHP: Symfony, Laravel</li><li>Python: Django</li><li>Ruby: Ruby On Rails</li><li>Java: Spring</li><li>C#: .NET</li><li>JS: Node.js, AngularJS</li></ol><p>Больше всего фреймворков на PHP и на этом языке есть, из чего выбирать, но действительно функциональных не так много. Меньше на других языках, а на некоторых действительно качественных фреймворков вообще всего один, как у языка Ruby. У Java вообще очень много разных фреймворков для разных целей, и не только для сайтов. Все эти фреймворки ежегодно развиваются, выходят все новые и новые версии, одни фреймворки обгоняют другие. Например, Laravel только в последние несколько лет вышел на первое место по популярности, хотя самые сложные сайты до сих пор делаются на Symfony.</p><p>.NET и Node.js — это целые самостоятельные платформы, которые базируются на определенных языках, но имеют очень широкие возможности.</p><h4>CMS и CMF</h4><p>Это готовое программное обеспечение, которое нужно только настроить, реже — дописать / переписать какую-то из частей. Таких решений очень много на любом языке, но исторически так сложилось, что в основном все популярные CMS сделаны на PHP. Тут дело в развитие языков, раньше простые сайты, для которых и создавались CMS, писались на PHP. Я еще застал те времена, когда CMS почти не было, были скрипты — отдельные готовые части разных сайтов. Позже эти скрипты собирали в коробочный продукт, который был призван решить потребности 90% простых сайтов. Так и получилось, что основные CMS сделаны на PHP. Сегодня CMS на других языках развиваются слабо, потому, что уже есть сильные конкуренты на PHP, а простому сайту язык не играет большой роли, поэтому все смотрят на возможности этих готовых продуктов.</p><p>CMF — если говорить простым языком, это что-то среднее между CMS и фреймворком по возможностям. Обычно CMF используют для самых сложных сайтов из этой категории. Этот подход позволяет избавиться от лишних частей CMS, которые не нужны конкретному проекту.</p><p>CMS бывают разные по назначению: общие, для интернет-магазинов, для блогов и т.д. Разные по условиям использования: платные и бесплатные. Для каждой популярной CMS есть куча разных платных и бесплатных модулей, которые легко подключать и использовать.</p><p>Маленькие сайты, которые в основном нужны для малого бизнеса, почти всегда используют CMS. Это позволяет очень сильно экономить время на разработку. Кроме того, для настройки таких решений не нужны дорогие программисты, обычно это могут делать новички в программировании, по крайней мере саму настройку, если уже нужно писать код, тут сложнее.</p><p>Именно в работе с CMS возникает больше всего непонимание среди конечных заказчиков таких решений. Любая CMS — это тонны готового программного кода, на все случае жизни. В коробочной поставке идут десятки и сотни модулей. Все это очень сильно ограничивает специалистов. Такие решения сильно «тормозят» , они абсолютно не гибкие, их очень легко взломать, особенно бесплатные CMS. Еще часто взламывают CMS через модули сторонних разработчиков, в которых есть критические уязвимости, потому что мы никогда не знаем, какого уровня программист писал тот или иной модуль. То есть любая CMS НЕ рассчитана для большого и сложного сайта. Она не могут выдержать большие нагрузки. Это решение не безопасно, чтобы не говорили разработчики конкретной CMS.</p><p>Я видел решения почти на всех популярных CMS, с многими за более, чем 10 лет работы, пришлось поработать лично. Часть из них популярна в рунете, а часть знают в основном на западе. На используемые в них языки CMS разбивать нет смысла, по причинам, описанным выше. Лучше сказать несколько слов про каждую популярную CMS:</p><ol><li>WordPress — некогда блоговый движок, сейчас на ней делаются почти любые сайты, включая магазины. Одна из самых популярных CMS в мире, есть примеры довольно посещаемых сайтов. На ней часто делают информационные сайты, в том числе разные СМИ. Система бесплатная.</li><li>Joomla! — CMS общего назначения. Качеством особо не отличается, на ней делают очень маленькие сайты и обычно дешевле всех других вариантов, так как именно с этой CMS начинают учиться многие начинающие программисты. Система бесплатная.</li><li>Drupal — это уже CMF для общего назначения, с недавнего времени поставляется со встроенных фреймворком Symfony. Довольно мощная, на ней есть известные сайты, например, официальный сайт Белого Дома. Система бесплатная.</li><li>Magento — самая популярная система управления для интернет-магазинов в мире. Довольно мощная и сложная. В рунете используется редко, в основном на западе.</li><li>PrestaShop — одна из самых популярных CMS для магазинов в мире. Тоже довольно мощная, используют в основном на западе. Система бесплатная.</li><li>OpenCart — еще одна популярная система для интернет-магазинов, но её, наоборот, больше используют в рунете, чем на западе. В основном для маленьких и несложных магазинов. Система бесплатная.</li><li>1С-Битрикс — очень распиаренная CMS общего назначения, номер 1 в рунете. Возможности очень широкие. На ней часто пытаются делать большие и сложные сайты, а после определенного порога в посещаемости переписывают их на других технологиях. Многие считают, что только эта CMS может интегрироваться с 1С, что не является правдой, поскольку все перечисленные CMS из этого списка могут интегрироваться с 1С, для этого у всех CMS есть специальные модули. Система платная.</li></ol><p>Со всеми перечисленными CMS я работал. В основном со стороны разработчика. Точно НЕ рекомендую — Joomla, с остальными можно работать. Для магазинов лучше выбирать специализированные, а не общие CMS. Кроме 1С-Битрикс в рунете есть еще аналогичные коммерческие CMS, они во многом схожи. У каждой из систем есть свои особенности, но все они не предназначены для больших и сложных проектов, главное это не забывать.</p><h4>Шаблоны</h4><p>В последние 5 лет очень активно развивают шаблонные решения. Это еще на одну ступеньку выше, чем CMS. Если CMS — это конструктор и его нужно настраивать, то шаблоны — это уже готовые решения под типовые случаи. Например, в каждом городе есть свои рестораны, такси, клиники и т.д. Для всех этих типов малого бизнеса нужно примерно одно и тоже. Поэтому, можно просто выбрать готовый тематический шаблон, заменить в нем логотип, цвета и контент. При желании такие шаблоны можно дорабатывать по усмотрению владельца.</p><p>Преимущества таких решений в том, что они очень дешевые и их можно запускать моментально. Но при этом, такие решения не учитывают особенностей бизнеса и конверсия будет не очень высокой.</p><p>Есть специальные каталоги шаблонов: TemplateMonster, <a href="https://themeforest.net/?ref=SECL">ThemeForest</a> и др. Часто встречаются онлайн-конструкторы, в том числе тематические: <a href="http://ru.wix.com/">Wix</a>, <a href="https://www.pagecloud.com/">PageCloud</a> и др.</p><h4>Мобильные приложения</h4><p>В мобильных приложениях в последнее время используется два подхода: нативная разработка и кроссплатформенные технологии. Нативная ведется на оригинальных языках программирования, в частности Swift (для iOS, ранее был Objective-C) и Java (для Android). Кроссплатформенных технологий сейчас довольно много, они есть на базе разных языков программирования, в частности: Apache Cordova, React Native и др. Некоторые лучше, некоторые хуже. В любом случае, сложные приложения всегда пишутся на нативных технологиях. С кроссплатформой часто возникают проблемы, вплоть до того, что некоторые функции просто нереализуемы на тех или иных кроссплатформенных технологиях, сильно грузится оперативная память устройства, быстро садится батарея и т.д.</p><p>В этих двух подходах люди тоже часто путаются, пытаясь использовать кроссплатформенные подходы на все случаи жизни. Оно и понятно, ведь кроссплатформа позволяет писать код один раз, который сразу работает и на iOS и на Android, в то время, как на нативных технологиях это минимум в два раза дороже выходит. Однако мало кто знает про возможные дальнейшие проблемы в разработке. Я бы рекомендовал очень тщательно выбирать технологии и кроссплатформу брать только для простых приложений, иначе придется переписывать. Впрочем, кроссплатформенные технологии постепенно развиваются и становятся все лучше, а приложения написанные на них все сложнее.</p><h4>Стек технологий в больших проектах</h4><p>Выше я описал разные языки и фреймворки, которые используются в больших проектах, однако, если присмотреться к действительно большим проектам, там можно найти целый комплекс языков и технологий. Почти все большие сайты используются в основе один язык и еще несколько дополнительных. Тоже самое с базами данных: для одних задач могут использоваться реляционные, а для других нереляционные базы, и все это органично сочетается в рамках одного проекта.</p><p>Выбор технологий зависит от предлагаемой архитектуры проекта. Именно архитектор продумывает основные блоки будущего сайта. Какой язык ляжет к основу, будет ли он нативный или фреймворк, какую систему кэширования выбрать, какие базы данных, как все это связано и т.д.</p><p>Для примера рассмотрим технологии Instagram (данные Insight IT):</p><ul><li>Ubuntu Server 14.04 LTS — основная серверная операционная система</li><li>Python — основной язык программирования серверной части</li><li>Django — фреймворк</li><li>nginx — второй уровень балансировки входящих HTTP-запросов</li><li>gunicorn — WSGI-сервер</li><li>HAProxy — балансировка нагрузки внутри системы</li><li>PostgreSQL — основное хранилище данных</li><li>postgis — поддержка гео-запросов</li><li>pgfouine — отчеты на основе логов</li><li>pgbouncer — создание пула соединений</li><li>Redis — дополнительное хранилище данных</li><li>Memcached — кэширование</li><li>Gearman — очередь задач</li><li>Solr — гео-поиск</li><li>munin, statsd, pingdom — мониторинг</li><li>Fabric — управление кластером</li><li>xfs — файловая система</li></ul><p>И это вполне нормальный стек технологий. Сам Instagram не самый большой и сложный сервис в мире.</p><h4>Стоимость специалистов</h4><p>Один из важнейших факторов выбора технологии является стоимость и доступность специалистов, потому что именно это самая затратная часть в любом проекте. В рунете есть только одна пузомерка по зарплатам — я отфильтровал по Киеву, уровень Senior, опыт 3-5 лет. Сравним средние значения.</p><p>Зарплаты:</p><ol><li>C# — 3072$</li><li>Java — 3300$</li><li>JS — 3500$</li><li>PHP — 2780$</li><li>Python — 3000$</li><li>Ruby — 3000$</li><li>Scala — 3900$</li></ol><p>В США немного другая картина:</p><figure><img src="https://media.tproger.ru/uploads/2016/11/salary.png" alt="" /></figure><p>Теперь переведем цифры на человеческий язык. Java хоть и не новый язык, но специалисты на ней всегда были одними их самых дорогих. PHP всегда был самым дешевым, да и специалистов на рынке очень много. В сравнение я внес еще и Scala как один из новейших и трендовых языков, по этой причине он дороже всех. Еще дорогой JS, это связанно с его бурным ростом в последние годы и растущей популярностью Node.js, а также AngularJS.</p><p>Таким образом, если мы хотим экономить — то лучше смотреть на PHP, специалисты дешевые, а комьюнити большое. А если хотим самое качественное — то смотрим на Scala, который называют будущем веб-разработки, но, правда, на ней найти специалистов почти невозможно и наработок просто нет.</p><p>Еще важным параметром будет скорость разработки. Ведь важна не только зарплата программистов, но и скорость разработки. Если не учитывать уже существующие наработки, то одним из самых быстрых в разработке будет Python и Ruby, а самый медленный — Java. Кстати, по этой причине за последние 10 лет почти не вышло новых мегапроектов на Java, зато вышло много проектов на Python, о чем я расскажу ниже.</p><h4>Тренды</h4><p>Выбирая технологию, нам нужно смотреть вперед. Особенно, если речь о большом проекте. Все технологии очень быстро развиваются, выходят все новые и новые версии. Языки сильно меняются каждые 5-7 лет, фреймворки — каждые 2-3 года, а CMS — каждые 1-2 года. Важно выбрать не просто хорошую технологию сегодня, а предугадать тренды развития так, чтобы остаться на коне через несколько лет. Иначе, в конечном счете, придется переписывать проект, что всегда очень проблематично.</p><p>Есть всевозможные исследования, которые нам могут подсказать некоторые статистические выкладки. Например, исследование <a href="http://www.tiobe.com/tiobe-index/">TIOBE Index</a> показывает интересную статистику:</p><figure><img src="https://media.tproger.ru/uploads/2016/11/tiobe.png" alt="" /></figure><p>По результатам разных исследований можно выделить явных лидеров по росту — это JS (версия ES6 и выше) и мультипарадигмальные языки, в частности Scala. Кстати, именно Scala считается преемником языка Java и во многом на него похож. Также не плохо себя показывает Python.</p><p>Антитренды держат ряд старых языков и PHP. Правда, недавно вышла 7я версия PHP, в которой исправлены многие серьезные недостатки. Так что, я думаю, мы скоро увидим новый виток развития PHP. Еще многие большие проекты переписываются с Ruby на другие языки, тоже некий антитренд.</p><p>Для иллюстрации посмотрим, каких специалистов не хватает в США:</p><figure><img src="https://media.tproger.ru/uploads/2016/11/specialists.png" alt="" /></figure><p>Именно это можно считать реальной картиной трендов, которые мы видим и у нас.</p><p>На чем делались большие проекты за последние 10 лет?</p><ol><li>Airbnb — Ruby</li><li>Instagram — Python</li><li>Pinterest — Python</li><li>Foursquare — Python</li><li>Groupon — Ruby → JS</li><li>Twitter — Ruby → Scala</li><li>Uber — JS</li></ol><p>Это уже не теоретическая статистика, а реальная практика. Python и JS очень хорошо себя показывают.</p><h4>Стоимость поддержки</h4><p>Безусловно, важный критерий выбора технологии — это стоимость поддержки, о которой мало кто задумывается в начале разработки. Обычно все мыслят категориями стоимости часа поддержки, что в корне неправильно. Нам важны несколько параметров: стоимость часа, количество часов, официальная поддержка технологии, доступность специалистов, правильный подход к разработке и некоторые другие.</p><p>Стоимость часа зависит от зарплаты специалисты, с этим мы уже разобрались. А вот количество часов зависит от самой технологии и качества написания кода. Если решение коробочное, то часов на него может уходить очень много. То есть, с одной стороны, мы можем сэкономить при разработке первой версии проекта, но после погрязнуть в его постоянной доработке. Хорошо, когда решение популярное и есть официальная документация, но часто выбирают малоизвестные коробочные решения без какой-либо документации — в таких решениям стоимость поддержки будет во много раз выше стоимости самой коробки. То же касается некачественной разработки: у нас почему-то полностью отсутствует культура проведения технических аудитов готовых решений или его частей. В среднем за 20-40 часов можно проверить почти любое решение и найти его основные минусы. Чем более качественный код, тем легче, а следовательно и дешевле его поддерживать.</p><p>Также следует смотреть на версию языка, фреимворка, CMS. Нужно всегда использовать самую последнюю стабильную версию, чтобы она не устарела до выхода проекта в продакшн. При появлении новой версии, нужно сразу рассматривать возможность перевода проекта на эту версию. Потому что, если пропустить несколько версий, потом будут проблемы сделать резкое обновление.</p><h3>Так что выбрать?</h3><p>Подведем итог. Для простых сайтов чаще всего отлично подходят коробочные решения и шаблоны. Сложные сайты делаются только на фреимворках или даже чистых языках программирования. Делать можно на очень разных языках, язык выбирается под проект. Простые мобильные приложения можно делать на кроссплатформенных технологиях, а сложные обычно делаются на родных технологиях. Ну и, выбирая платформу, всегда стоит руководствоваться объективными критериями, которые я описал в статье.</p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка ресурсов с примерами кода на разных языках</title>
      <link>https://tproger.ru/digest/learn-everything-by-examples</link>
      <comments>https://tproger.ru/digest/learn-everything-by-examples?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/learn-everything-by-examples</guid>
      <description><![CDATA[<p>Сайты с простыми и понятными примерами кода на Java, C# и других языках — альтернатива документации и длинным туториалам для тех, кому они не по душе.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/learn-everything-by-examples">Подборка ресурсов с примерами кода на разных языках</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[PHP]]></category>
      <category><![CDATA[Haskell]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 04 Sep 2016 00:46:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Для тех, кому тяжело разбираться в документации и не по душе длинные туториалы, мы сделали подборку сайтов со множеством простых и понятных примеров кода на разные темы и на разных языках. Многие из них дают хорошее представление о подходах, которые реализуют. Кстати, если совсем хотите упростить себе жизнь, то взгляните на нашу <a href="https://tproger.ru/digest/trysmthorg/">подборку</a> интерактивных самоучителей.</p><h4>Java</h4><p>На <a href="http://www.java-examples.com">Java Examples</a> можно найти примеры на любой случай — от использования ключевых слов, вроде final, до объяснения, как выровнять иконку в Swing.</p><h4>C#</h4><p>Сайт для шарпистов <a href="http://www.csharp-examples.net">С# Example</a> вышел несколько более бедным, чем посвященный Java. Здесь вы не найдёте всех примеров, которые вам могут понадобиться, но можете найти что-то специфическое, например, <a href="http://www.csharp-examples.net/combine-multiple-printdocuments/">как совместить несколько PrintDocument’ов</a>.</p><h4>JavaScript</h4><p>Отдельный <a href="http://javascriptbook.com/code/">раздел</a> JavaScript Book построен в форме самоучителя. Всего есть 13 тем, например: API, Error handling, jQuery, Events. Каждый из них содержит около десяти примеров. Правда, есть весомый минус — код выдаётся в виде текстового файла, без подсветки.</p><h4>Haskell</h4><p>Отличный способ изучить основы Haskell — ознакомиться с содержимым сайта <a href="https://lotz84.github.io/haskellbyexample/">Haskell By Examples</a>. Здесь коротко описаны все базовые возможности языка, а примеры снабжены ссылками на <a href="https://wiki.haskell.org/">Haskell Wiki</a>.</p><h4>Ruby</h4><p>Существует и аналогичный ресурс по Ruby.</p><h4>C++</h4><p>Наверное, самый приятный сайт из этой подборки — это <a href="http://www.cppsamples.com">Cpp Examples</a>. Красивый дизайн, подсветка кода, разнообразные сэмплы. Есть, несколько посвящённых <a href="https://tproger.ru/translations/design-patterns-for-beginners/">паттернам</a>, например, <a href="http://www.cppsamples.com/patterns/observer.html">Observer</a> или <a href="http://www.cppsamples.com/patterns/builder.html">Builder</a>.</p><h4>PHP</h4><p>Создатели русскоязычной подборки примеров с PHP.su сделали упор на практическое применение, а не на обучение новичков. Здесь не будет примеров, посвящённых ключевым словами и работе с переменными, но можно узнать, как сделать свою рассылку или гостевую книгу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Cкрипт, модерирующий вашу git-активность в соответствии с концентрацией алкоголя в крови</title>
      <link>https://tproger.ru/news/gitdown-bac-activity-moderator</link>
      <comments>https://tproger.ru/news/gitdown-bac-activity-moderator?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/gitdown-bac-activity-moderator</guid>
      <description><![CDATA[<p>Найдет скрипт Gitdown, который модерирует git-активность в зависимости от концентрации алкоголя в крови </p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/gitdown-bac-activity-moderator">Cкрипт, модерирующий вашу git-активность в соответствии с концентрацией алкоголя в крови</a>»</p>]]></description>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Aug 2016 12:50:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Пользователь Reddit <a href="https://www.reddit.com/r/programming/comments/4woznl/git_down_uses_arduino_as_a_breath_analyzer_to/">нашёл</a> в сети <a href="https://github.com/noidontdig/gitdown">интересный скрипт</a>, который модерирует ваши коммиты в зависимости от концентрации алкоголя в крови.</p><p>Gitdown использует <a href="http://shieldlist.org/gfxhax/drinkshield">DrinkShield</a> в качестве анализатора дыхания и Ruby-скрипт в качестве git-хука. Проект был создан Alex Qin и Geoffrey Litt для участия в хакатоне hackNY в 2013 году, и занял там первое место.</p><h3>Режимы</h3><p>Gitdown может работать в трёх режимах:</p><ul><li>Normal: позволяет совершать коммиты с концентрацией алкоголя ниже 0.05%.</li><li>Krunk: позволяет совершать коммиты с концентрацией алкоголя выше 0.05%.</li><li>Ball(m)er: позволяет совершать коммиты с концентрацией алкоголя между 0.13% и 0.15%.</li></ul><figure><img src="https://media.tproger.ru/uploads/2016/08/ballmer_peak.png" alt="" /></figure><p>При использовании двух последних режимов скрипт исказит ваши сообщения при коммитах, а также выложит ваше имя, концентрацию алкоголя в крови и сообщение на <a href="http://gitdownhackny.tumblr.com">официальной страничке Tumblr</a>.</p><p>При этом, если включён параметр «verbose», gitdown также поделится полезными фактами об ухудшении вашего состояния.</p><h3>Использование</h3><p>Сперва клонируйте репозиторий и установите необходимые gem’ы:</p><p>Для использования скрипта в качестве хука его нужно скопировать:</p><p>Для использования этого проекта необходим  Arduino Uno с модулем DrinkShield. Откройте файл arduino_gitdown/arduino_gitdown.ino в Arduino IDE и загрузите его на Arduino.</p><p>Затем откройте конфиг .gitdown и измените три параметра:</p><ul><li>mode: Нужно указать один из трёх вышеописанных режимов.</li><li>port: Здесь нужно указать значение, которое можно найти в разделе “Serial Port” в Arduino IDE. Значение по умолчанию — /dev/tty.usbmodem1421, и оно работало на Macbook Air, используемом для разработки.</li><li>verbose: Выставить «true» или «false» для выдачи полезной информации о состоянии при текущей концентрации алкоголя в крови.</li></ul><p>Потом вы можете попробовать изменить файл в репозитории gitdown и закоммитить изменение для наблюдения за действием скрипта.</p><p>В зависимости от режима и концентрации алкоголя в крови скрипт либо разрешит, либо запретит совершить коммит.</p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка интерактивных самоучителей, которые помогут в увлекательной форме изучить основы популярных технологий</title>
      <link>https://tproger.ru/digest/trysmthorg</link>
      <comments>https://tproger.ru/digest/trysmthorg?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Пётр Соковых]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/digest/trysmthorg</guid>
      <description><![CDATA[<p>Игровой формат обучения выручает новичков без мотивации: подборка интерактивных курсов, среди которых приятный самоучитель по библиотеке jQuery.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/digest/trysmthorg">Подборка интерактивных самоучителей, которые помогут в увлекательной форме изучить основы популярных технологий</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Быстрый старт]]></category>
      <category><![CDATA[jQuery]]></category>
      <category><![CDATA[Игры для программистов]]></category>
      <category><![CDATA[Подборки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 19 Jul 2016 18:31:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Часто основная проблема у начинающих программистов — отстутствие мотивации. Очень сложно собраться с силами, чтобы читать документацию или длинные туториалы на английском. Наверное именно поэтому всё популярнее становятся интерактивные самоучители, обучение в которых происходит в формате, который похож на игру. Выбрали для вас несколько таких самоучителей с просторов интернета.</p><h3>jQuery</h3><p>Очень <a href="http://try.jquery.com">приятный курс</a>, проходить который можно, даже не зная, что такое jQuery вообще. Если что, jQuery — библиотека для JavaScript, с помощью которой можно находить и, например, изменять различные элементы HTML. Впрочем, это пояснение лишнее — курс начинается с весёлой песни, которая рассказывает про то, что такое jQuery.</p><p><a href="http://try.jquery.com"></a></p><p>Затем песню сменяет ведущий, который рассказывает теорию. Ведущий очень живой, слушать его приятно. Вдобавок, всё, что он говорит, сопровождается иллюстрациями. Слайды к тому, что он говорил, можно позже скачать.</p><p>Лекция ведущего сменяется практическими заданиями — с возможностью запросить подсказки. За просмотр подсказок условные баллы не снимаются, зато снимаются за просмотр ответов (такая возможность, естественно, тоже предусмотрена).</p><p><a href="http://try.jquery.com"></a></p><p>Задания сменяются новой теорией от ведущего, теория — снова практикой. В целом курс создан не для глубинного обучения jQuery, а для изучения основ синтаксиса и понимание общих принципов работы.</p><h3>Github</h3><p><a href="https://try.github.io/">Этот курс</a> построен несколько иначе, чем предыдущий. Курс построен так, будто вам нужно запушить свой проект на Github — сначала даётся объяснение того, что на данном этапе нужно сделать, а чуть ниже — команда, которая это выполняет. Для перехода к следующему уроку эту команду необходимо перепечатать в терминал и выполнить. Результат работы команды вы можете увидеть в импровизированном диспетчере файлов. В общем-то, чаще всего к подобным самоучителям прибегают, именно когда появляется срочная необходимость выложить свой проект на Github. Лучшего способа, чем проделать все шаги самому под чутким руководством милого Октокота, наверное, нет. Ну, разве что наше <a href="https://tproger.ru/articles/git-quick-start/">руководство</a> по быстрому старту с git.</p><p><a href="https://try.github.io/"></a> Оформление заданий</p><h3>Ruby</h3><p>В <a href="http://tryruby.org">этом туториале</a> каждый урок строится достаточно простым образом — программа сообщает вам, как делается в Ruby то или иное действие, и немного теории. Переход к следующему уроку осуществляется, когда вы выполните это (или аналогичное действие) в консоли справа. Курс достаточно интересный, к тому же система довольно сносно шутит (например, сначала предлагает вам выполнить 40.reverse(), а потом сообщает, что перевернуть можно только строку, а число нельзя. Если вы, конечно, не поднесёте к монитору зеркало :D)</p><p><a href="http://tryruby.org"></a> Первый урок на tryruby</p><p>А какие интерактивные самоучители знаете вы? Пишите в комментариях, лучшими из предложенных мы пополним статью.</p>]]></content:encoded>
    </item>
    <item>
      <title>GitHub выпустил инструмент для рефакторинга критически важных участков кода</title>
      <link>https://tproger.ru/news/github-releases-scientist</link>
      <comments>https://tproger.ru/news/github-releases-scientist?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/github-releases-scientist</guid>
      <description><![CDATA[<p>Библиотека на Ruby сравнивает старое и новое поведение кода под нагрузкой: блок use выполняет рабочий вариант, а блок try — проверяемый.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/github-releases-scientist">GitHub выпустил инструмент для рефакторинга критически важных участков кода</a>»</p>]]></description>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Feb 2016 00:39:48 GMT</pubDate>
      <content:encoded><![CDATA[<p>Команда GitHub <a href="http://githubengineering.com/scientist/">сообщила</a> в своём блоге о выпуске <a href="https://github.com/github/scientist">Scientist</a> 1.0 — библиотеки Ruby для осторожного рефакторинга критических частей кода, позволяющую быть уверенным в том, что ничего не сломается.</p><p>Проекты и их кодовая база обычно находятся в постоянном развитии. Ситуации, когда вам необходимо переписать или заменить какую-то часть системы — неизбежны. Конечно, тут могут помочь тесты, однако если вы хотите сравнить поведение до и после рефакторинга под нагрузкой, то с помощью Scientist можете сделать вот так:</p><p>Оборачиваете код с исходным работающим поведением в блок use, а новый, проверяемый, в try. Команда experiment.run всегда вернёт именно то, что получилось бы при выполнении use, но при этом проделает много незаметной и важной работы:</p><ul><li>Решит, запускать или нет код в блоке try;</li><li>Рандомизирует порядок, в котором выполняются блоки use и try;</li><li>Замеряет время выполнения обоих случаев;</li><li>Сравнивает результаты выполнения try с теми, что были получены, используя use;</li><li>Проглатывает (но записывает) все исключения, случившиеся в try;</li><li>Публикует всю эту информацию.</li></ul><p>Чтобы не создавать каждый раз experiment можно использовать такой синтаксис:</p><p>Если вы не объявите блок try, то Scientist не будет делать ничего и дополнительных накладных расходов не будет.</p><p>Подробнее о Scientist можно почитать на <a href="https://github.com/github/scientist">GitHub</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>