<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/comerc/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя comerc]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Mon, 04 May 2026 06:32:51 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[Как я переписал проект за неделю вместо трёх месяцев]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1028804/</guid>
      <link>https://habr.com/ru/articles/1028804/?utm_campaign=1028804&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/867/c16/fcf/867c16fcf9a26046a11d8ce5f0dc0512.jpg" /><p>Год назад у меня был legacy-проект с одним <code>main.go</code> на две тысячи строк. MVP: бизнес-логика, конфиг, хэндлеры, БД - всё в одном файле. Три месяца в Cursor, аккуратно, по кусочкам, с тестами на коленке, я вытянул это в нормальную структуру. Три месяца…</p><p>А недавно я сел переписывать другой свой проект такого же масштаба. Claude Code, Opus, три субагента-ревьювера, тридцать скилов. Неделя. И это я ещё половину времени потратил на BDD, потому что поверх всего накатывал реализацию на godog. Без BDD уложился бы дня за три!</p><p>Расскажу про свой тулчейн <a href="https://github.com/pure-golang/level85/" rel="noopener noreferrer nofollow"><code>level85</code></a>, через который получил эту разницу. Не “десять советов как заставить нейронку писать код”, а как я дошёл до такой конфигурации, что делает её рабочей, и где я продолжаю наступать на грабли.</p> <a href="https://habr.com/ru/articles/1028804/?utm_campaign=1028804&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 27 Apr 2026 19:39:04 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Искусственный интеллект]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[вискас]]></category><category><![CDATA[claude]]></category><category><![CDATA[warp]]></category><category><![CDATA[skills]]></category><category><![CDATA[bdd]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Про Телемост]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1021034/</guid>
      <link>https://habr.com/ru/articles/1021034/?utm_campaign=1021034&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/928/1b9/85b/9281b985b3933f869775b66873c75596.png" /><p>Я написал на Хабре <a href="https://habr.com/ru/articles/1009472/" rel="noopener noreferrer nofollow">“Почему Яндекс.Мессенджер”</a> и получил в комментариях ожидаемое “ну и зачем нам ещё один мессенджер”. Но жизнь внесла коррективы, и я снова здесь с обзором продукта из экосистемы Яндекса.</p><p>Телемостом я пользуюсь каждый день по работе. Долгое время это была просто видеозвонилка по ссылке и ничего больше. А потом в какой-то момент там появились чаты, контакты, каналы.</p> <a href="https://habr.com/ru/articles/1021034/?utm_campaign=1021034&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 17 Apr 2026 10:00:49 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Мессенджеры]]></category>
      <category><![CDATA[вискас]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Почему Яндекс.Мессенджер]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1009472/</guid>
      <link>https://habr.com/ru/articles/1009472/?utm_campaign=1009472&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/e37/372/582/e37372582ba151896065c8b5bcc5a65f.png" /><p>В роли эксперта, который давно в теме корпоративных мессенджеров (ресёрч-разработка-внедрение), нашёл несколько ограничений, которые можно обойти сегодня и получить обновления завтра. Экосистема бизнес-продуктов Яндекса заметно развивается в последние годы. И замечательный поиск, как вишенка на торте.</p> <a href="https://habr.com/ru/articles/1009472/?utm_campaign=1009472&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Thu, 12 Mar 2026 12:50:12 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Мессенджеры]]></category>
      <category><![CDATA[вискас]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Встречайте Gas Town]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/983502/</guid>
      <link>https://habr.com/ru/articles/983502/?utm_campaign=983502&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/1b9/179/cad/1b9179cadd94d9064dc23d3918729744.webp" /><p>С Новым Годом и добро пожаловать в Gas Town!</p><p><a href="https://github.com/steveyegge/gastown" rel="noopener noreferrer nofollow">Gas Town</a> - это новый взгляд на IDE для 2026 года. Gas Town помогает вам справиться с рутиной запуска множества экземпляров Claude Code. Вещи теряются, трудно отследить, кто чем занимается, и так далее. Gas Town помогает со всей этой рутиной и позволяет вам сосредоточиться на том, над чем работают ваши Claude Code.</p><p>В этом посте "Claude Code" означает "Claude Code и все его идентичные конкуренты", то есть Codex, Gemini CLI, Amp, Amazon Q-developer CLI, бла-бла-бла, потому что именно этим они и являются. Клоны. Индустрия - это постыдная детская футбольная команда, гоняющаяся за форм-фактором CLI Claude Code образца 2025 года, вместо того чтобы создавать то, что будет дальше.</p><p>Я пошел вперед и создал то, что будет дальше. Сначала я предсказал это еще в марте в статье <a href="https://sourcegraph.com/blog/revenge-of-the-junior-developer" rel="noopener noreferrer nofollow">Месть начинающего разработчика</a>. Я предсказал, что кто-то свяжет верблюдов Claude Code вместе в колесницы, и это именно то, что я сделал с Gas Town. Я приручил их настолько, что вы можете продуктивно использовать 20–30 штук одновременно на постоянной основе.</p><p>Gas Town имеет свое мнение - во многом как Kubernetes или Temporal, на которые Gas Town похож, по крайней мере, если прищуриться так сильно, что глаза почти полностью закроются. Я включу сравнения как с k8s, так и с Temporal в конце этого поста. Немного удивительно, насколько они похожи, несмотря на радикально разные основы.</p><p>Но сравнение должно служить предупреждением: Gas Town сложен. Не потому, что я этого хотел, а потому, что мне приходилось добавлять компоненты до тех пор, пока он не стал самодостаточной машиной. И те части, которые у него теперь есть, ну, они выглядят так, как будто Kubernetes спарился с Temporal, и у них родился очень уродливый ребенок.</p><p>Но это работает! Gas Town решает <a href="https://arxiv.org/abs/2511.09030" rel="noopener noreferrer nofollow">проблему MAKER</a> (Ханойская башня из 20 дисков) вообще элементарно. Просто генерируешь по формуле "цепочку" на миллион шагов - и готово. Вчера ради интереса прогнал 10 дисков за несколько минут: доказал, что тысяча шагов для нас - это не проблема, хотя в статье MAKER говорится, что нейронки ломаются уже через несколько сотен. На 20 дисков закладываю часов 30. На этом мой импровизированный TED Talk окончен.</p><p>Все это обретет полный смысл, если вы дочитаете до конца следующих 23 страниц.</p> <a href="https://habr.com/ru/articles/983502/?utm_campaign=983502&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 07 Jan 2026 22:48:07 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category>сезон ии в разработке</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Лучшие практики Beads]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/983500/</guid>
      <link>https://habr.com/ru/articles/983500/?utm_campaign=983500&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/1ba/c65/1a5/1bac651a5d3f0a040f7092df01d6c24a.png" /><p>Beads продолжает набирать обороты. Когда мои старые друзья начинают натыкаться на него независимо друг от друга, я понимаю, что проект становится вирусным.</p><p>Beads занимает совершенно уникальную нишу. Все сосредоточены на создании инструментов <em>планирования</em>, в то время как Beads - это инструмент <em>исполнения</em>. Это всё равно что поставить вашего ИИ-агента на отлично смазанные лыжи. Возможно, лучшим названием было бы <em>Agents on Rails</em> («Агенты на рельсах»). Но название «Beads» (Бусины) хорошо передает идею того, что инструмент сфокусирован исключительно на отслеживании (трекинге) и ни на чем другом: маленькое имя для маленькой системы.</p><p>Сейчас, спустя почти 6 недель своего пути, Beads стал намного, намного стабильнее. Это была безумная гонка, порой менялось по 50 тысяч строк кода в день. И никто из нас, контрибьюторов, даже не просматривает этот код. Он на 100% написан ИИ («vibe coded»), сейчас в нем 130 тысяч строк на Go, и примерно половина - это тесты. Десятки тысяч людей используют его в своих повседневных рабочих процессах. Люди говорят мне, что им это так нравится, что они используют его даже для личных списков дел (TODO). А другие направо и налево встраивают его в более крупные оркестраторы. Это также потрясающий строительный блок.</p><p>Мы сохранили небольшой объем функционала. Прислушиваясь к мнению сообщества, я отвергаю всё, что не должно быть частью ядра Beads. Поэтому у Beads нет пользовательского интерфейса (UI), но есть множество примеров UI, которые люди создали как проекты «для души» (passion projects). У нас их уже как минимум четыре или пять. Мой приятель и соавтор Джин Ким даже создал свой собственный UI для Beads на Java Swing! Он был так взволнован, когда показывал мне его. И это действительно было очень круто.</p><p>Итак, никакого UI, и у Beads также нет системы планирования. Он не для этого. Но он отлично интегрируется с любой системой планирования - просто составьте план, а затем попросите агента создать в Beads эпики и задачи (issues) для этой работы. После того как эпики будут готовы, вы можете натравить на них любое количество агентов, чтобы они их «разгребли».</p><p>Последняя большая категория, которую люди постоянно пытаются втиснуть в Beads, - это оркестрация. Мы знаем, что оркестрация неизбежна. И есть соблазн сделать Beads более активным; сегодня он довольно пассивен и ожидает, что Агент будет использовать его как инструмент. Но люди хотят большего. И я их понимаю. Однако этому не место в Beads.</p> <a href="https://habr.com/ru/articles/983500/?utm_campaign=983500&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 07 Jan 2026 22:40:36 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category>сезон ии в разработке</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Представляем Beads: система памяти для кодинг-агентов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/983498/</guid>
      <link>https://habr.com/ru/articles/983498/?utm_campaign=983498&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/94f/194/b00/94f194b00282249dc4adfd026038a7c2.webp" /><p>Я занимался вайб-кодингом (vibe coding) как одержимый сорок дней и сорок ночей. Это долгая история, поэтому я резюмирую её в этих трех картинках.</p><p>Слева, 3 недели назад: я вайб-кожу на пляже за ужином в Кабо-Сан-Лукас, Мексика, с неподражаемым Торстеном Боллом, нашим приятелем Мэттом Манелой и другими коллегами из Sourcegraph на корпоративном выезде. Кто-то сделал это фото, потому что я отказывался убрать компьютер.</p><p>В центре, 2 недели назад: фотография, на которой я фотографирую сам себя, пока еду на скорости 100 км/ч (60 миль/ч) по шоссе в Беллингем, чтобы забрать гитары, занимаясь голосовым вайб-кодингом всю дорогу туда и обратно. Глупо и чертовски опасно. Мне было плевать. Застрял в пробке на несколько часов. Всё равно плевать. Я упоминал, что это вызывает привыкание? Вайб-кодинг вызывает привыкание.</p><p>На последнем кадре: мы с женой в торговом центре на прошлой неделе, наслаждаемся приятным днем с кофе, наблюдаем за людьми и вайб-кодим вместе с Моцартом (на фото он в своей любимой сумке). Лин прячется за компьютером - так я получил разрешение руководства на публикацию снимка.</p><p>Я никуда не хожу и не делаю <em>ничего</em>, даже не сплю, без своего ноутбука. Ну, разве что когда бегаю - там я ещё не совсем раскусил, как вайб-кодить. Но я близок. Это тема для отдельного поста, но у меня наконец-то работают агенты на GCP с Terraform и Tailscale. Так что скоро я смогу вайб-кодить и с телефона.</p><p>Агенты никогда не должны отдыхать.</p> <a href="https://habr.com/ru/articles/983498/?utm_campaign=983498&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 07 Jan 2026 22:35:09 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category>сезон ии в разработке</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[Upgrade: OpenSpec и Beads в Cursor]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/983316/</guid>
      <link>https://habr.com/ru/articles/983316/?utm_campaign=983316&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/84d/4f5/7c2/84d4f57c2fe7b4739f13949dae0bb5dd.png" /><p>Разработка с ИИ-ассистентами часто напоминает поездку с талантливым, но забывчивым штурманом. Он отлично знает карту (код), но постоянно забывает пункт назначения (бизнес-задачу) и пройденный маршрут (контекст).</p><p>Мы привыкли работать в режиме "Prompt &amp; Pray": написали длинный промпт, получили код, внесли правки. Но на дистанции сложной фичи контекст размывается. Агент начинает галлюцинировать, терять детали или переписывать одно и то же. Проблема не в модели, а в отсутствии <strong>долгосрочной памяти</strong> и <strong>четкого контракта</strong>.</p><p>В этой статье я расскажу, как превратить хаотичный диалог с Cursor в структурированный инженерный процесс. Мы объединим два инструмента:</p><p><strong>OpenSpec</strong> - чтобы зафиксировать "что и зачем мы делаем" (Spec-Driven Development).</p><p><strong>Beads</strong> - чтобы управлять тем, "как и в каком порядке" это выполнять (граф задач).</p><p><strong>Cursor</strong> - как среду, которая связывает их воедино.</p><p>Если вы устали от того, что ИИ теряет нить повествования на середине рефакторинга, этот подход для вас.</p> <a href="https://habr.com/ru/articles/983316/?utm_campaign=983316&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 07 Jan 2026 03:13:09 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Искусственный интеллект]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[сезон ии в разработке]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Не болтайте ерундой]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/983062/</guid>
      <link>https://habr.com/ru/articles/983062/?utm_campaign=983062&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/7d9/426/d78/7d9426d78f7c53b173314e71472f46f1.png" /><p><strong>Вы тоже устали?</strong> Устали объяснять ChatGPT структуру вашего проекта в десятый раз? Устали от того, что Cursor "съедает" ваши лимиты? Платные подписки нужны ради их мощных моделей, но обидно тратить драгоценные токены на бесконечные уточнения контекста.</p><p>Встречайте <strong>OpenSpec</strong> - конец vibe-кодинга. Это инструмент, который не просто "еще одна обертка над GPT", а смена парадигмы. Мы переходим от AI-чатов к Spec-Driven Development.</p> <a href="https://habr.com/ru/articles/983062/?utm_campaign=983062&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 05 Jan 2026 17:22:31 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[сезон ии в разработке]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Внедрение Spec-Driven Development в существующие проекты]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/982890/</guid>
      <link>https://habr.com/ru/articles/982890/?utm_campaign=982890&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/b86/201/f29/b86201f29650f17e6ad44552862c5006.jpg" /><p>Spec Kit - это один из самых амбициозных фреймворков для наведения порядка в разработке с использованием ИИ. В нашем предыдущем посте о <a href="https://habr.com/ru/articles/982620/" rel="noopener noreferrer nofollow">spec driven development</a> мы обсуждали его потенциал для закрытия давних пробелов в рабочих процессах с ИИ-ассистентами за счет обеспечения соблюдения стандартов проекта, контекста на уровне функций, принудительной декомпозиции для управляемого объема работ и контрольных этапов (review gates) для контроля качества.</p><p>Но исполнение - это то, где теория сталкивается с сопротивлением. Документация Spec Kit - это сильная отправная точка, с понятными видео, подробными руководствами и предписывающими шагами, которые позволяют развернуть его за считанные часы. Сложности начинаются, когда вы покидаете «песочницу». Подобно примерам Animal → Dog → Labrador в учебниках по ООП, примеры учат синтаксису, а не промышленной разработке программного обеспечения.</p><p>Пробел заключается не в документации, а в контексте и реальной экспертизе. Чистые примеры прекрасно работают для greenfield-проектов (проектов с нуля), но большинство команд работают с существующими (brownfield) кодовыми базами, сформированными месяцами эволюционирующих решений, компромиссами разработчиков, конкурирующими паттернами и не подлежащими обсуждению стандартами качества.</p><p>Этот пост отражает наш путь через эти испытания. Это не отполированная история успеха, а честный рассказ о том, что сработало, что нет, и как мы заставили Spec Kit работать в живой производственной системе, где компромиссы в качестве были недопустимы.</p> <a href="https://habr.com/ru/articles/982890/?utm_campaign=982890&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 04 Jan 2026 22:01:42 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Искусственный интеллект]]></category><category><![CDATA[Программирование]]></category>
      <category>сезон ии в разработке</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Внутри Spec-Driven Development: на что способен Spec Kit]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/982620/</guid>
      <link>https://habr.com/ru/articles/982620/?utm_campaign=982620&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/a51/3f0/a75/a513f0a75f86e93158df65eb85a9c289.jpg" /><p>Почему команды отказываются от подхода «сначала код, потом исправления», когда ИИ ускоряет поставку сверх всякого контроля? Spec-Driven Development (разработка на основе спецификаций) представляет шестиэтапную модель, которая переносит архитектурные решения, ограничения и ясность на более ранние стадии (upstream). Узнайте, как это улучшает качество выходного результата, сокращает циклы очистки кода и позволяет AI-агентам работать согласованно в рамках мультисервисных систем.</p><p>Поставка программного обеспечения была ориентирована на реализацию большую часть своего существования: команды открывали редактор, пробегали глазами бриф спринта и начинали писать код. Этот рабочий процесс имел смысл, когда основными создателями были люди, репозитории развивались медленно, а конвейеры релизов были линейными и предсказуемыми. Теперь AI-агенты, такие как Copilot, Cursor и Windsurf, генерируют код быстрее, чем успевают реагировать архитектура, управление (governance) и интеграция. Код перескакивает от бэкенд-логики к конфигурациям инфраструктуры и CI/CD за часы, на что раньше уходили месяцы.</p><p>Когда такой подход «сначала код, разберемся позже» опережает архитектуру, безопасность и управление, система в конечном итоге рушится под собственным весом.</p><p>Модель, ориентированная на спецификации (spec-first), обращает этот коллапс вспять с помощью живых, исполняемых артефактов. Вместо того чтобы код вел процесс, спецификации становятся якорем (и источником), на основе которого действуют ИИ и люди. Они содержат решения о структуре, библиотеках, паттернах, соответствии требованиям и интеграции еще до того, как будет сгенерирована хоть одна функция.</p><p>Когда поведение меняется, команды обновляют спецификацию, и все последующие выходные данные следуют за ней. Поломки также устраняются путем обновления исходной спецификации, а не латанием симптомов в разных файлах. Чтобы увидеть, как Spec-Driven Development меняет темп и качество разработки с использованием ИИ, давайте разберем, что это такое на самом деле.</p> <a href="https://habr.com/ru/articles/982620/?utm_campaign=982620&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 04 Jan 2026 21:14:06 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Искусственный интеллект]]></category><category><![CDATA[Программирование]]></category>
      <category>сезон ии в разработке</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[А может чайку]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/982480/</guid>
      <link>https://habr.com/ru/articles/982480/?utm_campaign=982480&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/701/d99/1b8/701d991b86044d633da698a852dc343e.png" /><p>Все уже слышали, что в Go 1.25 завезли новый экспериментальный сборщик мусора - <strong>Green Tea GC</strong>. Теории о том, как он работает, много (и в том числе на Хабре).</p><p>Но когда мы с коллегой попытались просто включить <code>GOEXPERIMENT=greenteagc</code> на наших обычных бенчмарках, нас ждало разочарование: результаты были то чуть лучше, то чуть хуже, то вообще одинаковые. Сплошная лотерея.</p><p>Мы задались целью: <strong>найти условия, в которых Green Tea GC побеждает безоговорочно</strong>. Не на 1-2% в пределах погрешности, а так, чтобы график "пробил потолок". И у нас получилось добиться стабильного ускорения пауз GC на <strong>40-50%</strong>.</p> <a href="https://habr.com/ru/articles/982480/?utm_campaign=982480&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Вот рецепт нашего успеха</a>]]></description>
      
      <pubDate>Fri, 02 Jan 2026 20:37:48 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category><category><![CDATA[Программирование]]></category>
      <category><![CDATA[green tea]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Масштабирование LLM с помощью Golang: как мы обслуживаем миллионы запросов LLM]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/979544/</guid>
      <link>https://habr.com/ru/articles/979544/?utm_campaign=979544&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/48e/21b/1d0/48e21b1d050abff0c4b5c78d937e2a07.jpg" /><p>Хотя экосистема LLM в основном ориентирована на Python, мы нашли Go исключительно подходящим для производственных развертываний. Наша инфраструктура на базе Go обрабатывает миллионы ежемесячных запросов LLM с минимальной настройкой производительности. Помимо хорошо документированных преимуществ Go (см. отличное изложение Роба Пайка о <a href="https://go.dev/talks/2012/splash.article" rel="noopener noreferrer nofollow">преимуществах Go</a>), три возможности оказались особенно ценными для нагрузок LLM: статическая проверка типов для обработки выходных данных модели, горутины для управления параллельными вызовами API и интерфейсы для построения составных конвейеров ответов. Вот как мы реализовали каждую из них в нашем производственном стеке.</p> <a href="https://habr.com/ru/articles/979544/?utm_campaign=979544&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 22 Dec 2025 23:27:58 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category><category><![CDATA[Python]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category>вискас</category><category>highload</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[ИИ 2025 — от интерполяции к энтропии, инвестиции на иксы]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/977474/</guid>
      <link>https://habr.com/ru/articles/977474/?utm_campaign=977474&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/1dc/25c/a75/1dc25ca75a2c381e3c9e8022113a169c.jpg" /><p>После просмотра подкаста (<a href="https://www.youtube.com/watch?v=llnfc1Vehso" rel="noopener noreferrer nofollow">Коняев - чума!</a>) я вроде понял, в чём минус «ИИ», и провёл небольшое исследование этого вопроса. Ниже - обзорная статья, которая охватывает фундаментальные ограничения современных LLM через призму интерполяции и энтропии, технологические прорывы 2025 года, рыночную динамику ключевых игроков (Google, Broadcom, Intel), экономику вычислений и революционные перспективы развития ИИ.</p> <a href="https://habr.com/ru/articles/977474/?utm_campaign=977474&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 16 Dec 2025 19:21:45 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Сезон ИИ в разработке]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Почему Go?]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/963108/</guid>
      <link>https://habr.com/ru/articles/963108/?utm_campaign=963108&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/e71/323/b06/e71323b063e188039d7edbf19d07ae6e.jpg" /><p>На моих трансляциях лайв-кодинга постоянно всплывает этот вопрос. Проговаривал много раз, но если записать ответ, то дальше можно просто выдавать ссылку.</p> <a href="https://habr.com/ru/articles/963108/?utm_campaign=963108&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 04 Nov 2025 20:23:47 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category><![CDATA[golang]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Go synctest: Решение проблемы нестабильных тестов]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/916510/</guid>
      <link>https://habr.com/ru/articles/916510/?utm_campaign=916510&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p><img src="https://habrastorage.org/webt/c7/ik/kh/c7ikkh7raat0nwqk5nrqfjnuuw8.jpeg"></p><br>
<p>Чтобы понять, что решает <code>synctest</code>, мы должны сначала рассмотреть основную проблему: недетерминизм в конкурентных тестах.</p><br>
<pre><code class="go">func TestSharedValue(t *testing.T) {
    var shared atomic.Int64
    go func() {
        shared.Store(1)
        time.Sleep(1 * time.Microsecond)
        shared.Store(2)
    }()

    // Проверяем общее значение через 5 микросекунд
    time.Sleep(5 * time.Microsecond)
    if shared.Load() != 2 {
        t.Errorf(&quot;shared = %d, want 2&quot;, shared.Load())
    }
}</code></pre><br>
<p>Этот тест запускает горутину, которая изменяет общую переменную. Она устанавливает <code>shared</code> в 1, спит 1 микросекунду, а затем устанавливает её в 2.</p><br>
<p>Тем временем основная функция теста ждёт 5 микросекунд перед проверкой того, достигло ли <code>shared</code> значения 2. На первый взгляд кажется, что этот тест должен всегда проходить. В конце концов, 5 микросекунд должно быть достаточно времени для завершения выполнения горутины.</p><br>
<p>Однако...</p> <a href="https://habr.com/ru/articles/916510/?utm_campaign=916510&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Sat, 07 Jun 2025 15:08:02 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category>тестирование</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[Соглашение по обработке ошибок]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/912788/</guid>
      <link>https://habr.com/ru/articles/912788/?utm_campaign=912788&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p><img src="https://habrastorage.org/webt/os/mi/cg/osmicg2qjlfyz5spftc0dy_4qvk.jpeg"></p><br>
<p>Go не признаёт сложных развесистых фреймворков — и это правильно. Любой инструмент должен быть настолько очевидным, чтобы разработчики сразу видели пользу от его применения.</p><br>
<p>И если вы сталкивались на больших legacy-проектах с хаосом в обработке и логировании ошибок — когда одна и та же ошибка дублируется в логах на каждом уровне, когда непонятно где обрабатывать ошибку, а где передавать дальше, когда тесты превращаются в кромешный ад из-за необходимости мокать каждый возможный путь ошибки — тогда возможно пригодится то, что я хочу предложить.</p> <a href="https://habr.com/ru/articles/912788/?utm_campaign=912788&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Mon, 26 May 2025 08:48:17 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category><![CDATA[Go]]></category><category><![CDATA[ошибки]]></category><category><![CDATA[тестирование]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Прощай error-hell: альтернативная обработка ошибок]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/912150/</guid>
      <link>https://habr.com/ru/articles/912150/?utm_campaign=912150&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p><img src="https://habrastorage.org/webt/os/mi/cg/osmicg2qjlfyz5spftc0dy_4qvk.jpeg"></p><br>
<p>В эпоху становления асинхронного программирования JavaScript-разработчики столкнулись с явлением, получившим название &quot;callback-hell&quot; — бесконечной вложенностью функций обратного вызова. Хотя с точки зрения функционального программирования функции являются полноправными гражданами первого класса, принцип &quot;всё хорошо в меру&quot; никто не отменял. Появление Promise и механизма async/await стало спасительным решением этой проблемы.</p><br>
<p>В мире Go у нас есть более элегантные инструменты — каналы и горутины. Однако совершенству нет предела, и здесь нас поджидает другая ловушка — &quot;error-hell&quot;. Новички в Golang часто приходят в недоумение от того, что идиомы языка требуют обработки ошибок буквально на каждом шагу.</p> <a href="https://habr.com/ru/articles/912150/?utm_campaign=912150&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 23 May 2025 09:17:24 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category><![CDATA[error handling]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Нативные подписки с роутером Cosmo]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/806541/</guid>
      <link>https://habr.com/ru/articles/806541/?utm_campaign=806541&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/32d/524/b78/32d524b78c8272277ef110c890248b38.png" /><p>Федеративный GraphQL бесценен для предприятий, потому что он создает единый, логический уровень API - федеративный граф, - который соединяет разрозненные источники данных, служа единым представлением о ландшафте данных организации.</p><p>Сервисы могут обеспечивать взаимодействие, но при этом оставаться независимыми и использовать технологии, с которыми они знакомы, благодаря общей и стандартизированной схеме GraphQL, и новые функции/сервисы могут быть легко интегрированы в этот объединенный граф без нарушения существующих систем. В двух словах: надежная, адаптивная архитектура предприятия, которая может развиваться для удовлетворения потребностей.</p><p>Что, если бы вы могли сделать еще один шаг вперед и предоставить данные в режиме реального времени наряду со статическими запросами? <a href="https://graphql.org/blog/subscriptions-in-graphql-and-relay/" rel="noopener noreferrer nofollow">Именно это позволяют делать подписки GraphQL</a>, но их не тривиально реализовать в такой архитектуре, ориентированной на микросервисы и федерацию, особенно в корпоративной среде.</p><p>С роутером, совместимым с Federation V1/V2, который изначально поддерживает подписки, как <a href="https://wundergraph.com/" rel="noopener noreferrer nofollow">WunderGraph Cosmo Router</a>, это становится намного проще. Что более важно, с Cosmo вы можете делать это с использованием открытого программного обеспечения, совместимого с <a href="https://opensource.org/" rel="noopener noreferrer nofollow">OSI</a>, которое позволяет вам самостоятельно размещать и сохранять полную автономию над вашими данными.</p><p>Мы рассмотрим, что нового предлагает Cosmo Router в отношении подписок на федеративном GraphQL; но сначала мы расскажем о подписках на GraphQL.</p> <a href="https://habr.com/ru/articles/806541/?utm_campaign=806541&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 09 Apr 2024 16:50:32 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>wundergraph</category><category>subscriptions</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Введение в Router Cosmo — потрясающе быстрый шлюз с открытым исходным кодом Federation V1/V2]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/806249/</guid>
      <link>https://habr.com/ru/articles/806249/?utm_campaign=806249&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/cb4/984/e36/cb4984e36a1612fdb54e20a7f8fe322d.png" /><p>Предприятия имеют разнообразные зависимости от данных — внутренние микросервисы со специализированными доменами данных, устаревшие системы с собственными форматами данных, а также сторонние API и приложения SaaS со своими уникальными моделями данных и конечными точками.</p><p>TL;DR: разные (и часто устаревшие) технологии, которые нужно как-то объединить.</p><p>Federated GraphQL выделился как главное решение для такого объединения в сфере предприятий, и Router (или Gateway) в Federation действует как ключевой элемент, который связывает все эти разрозненные источники данных вместе, делая их доступными через единственный, согласованный API, сохраняя при этом адаптивность. Это, на самом деле, ключ к тому, как Federated GraphQL позволяет создавать масштабируемые и модульные архитектуры.</p><p>Сегодня мы рассмотрим высокопроизводительный, открытый, совместимый с Federation V1/V2 Router от WunderGraph Cosmo. Мы расскажем, что он делает, почему он так важен для стека Cosmo, как вы можете разместить его самостоятельно, а также настроить и расширить его с помощью своего собственного кода на Go.</p> <a href="https://habr.com/ru/articles/806249/?utm_campaign=806249&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 08 Apr 2024 16:28:06 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>wundergraph</category><category>open-source</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Open Source GraphQL CDN / Edge Cache с Cloudflare, Fastly и Fly.io]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/806017/</guid>
      <link>https://habr.com/ru/articles/806017/?utm_campaign=806017&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/9ad/14a/07d/9ad14a07d14160c9e73bdcf0a65febaf.png" /><p>Мы недавно объявили, что WunderGraph теперь полностью открыт в исходном коде. Сегодня мы хотели бы объяснить, как вы можете использовать нашу платформу для разработчиков API, чтобы добавить кэширование на уровне Edge в ваши GraphQL API, не привязывая себя к конкретному поставщику.</p><p></p> <a href="https://habr.com/ru/articles/806017/?utm_campaign=806017&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 07 Apr 2024 19:57:54 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category>graphql</category><category>wundergraph</category><category>nextjs</category><category>cdn</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Подписки на GraphQL: Почему мы используем SSE/Fetch вместо Websockets]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805931/</guid>
      <link>https://habr.com/ru/articles/805931/?utm_campaign=805931&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/f1b/133/b1c/f1b133b1c917ffbd669c86a834a0bee6.png" /><p>WunderGraph предоставляет подписки GraphQL через SSE (Server-Sent Events) или Fetch (в качестве резервного варианта). В этом посте объясняется, почему мы решили выбрать этот подход и считаем его лучше, чем использование WebSockets.</p><p></p> <a href="https://habr.com/ru/articles/805931/?utm_campaign=805931&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 07 Apr 2024 10:27:17 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category>graphql</category><category>wundergraph</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Пространство имен для GraphQL: Бесконфликтное объединение любого количества API]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805875/</guid>
      <link>https://habr.com/ru/articles/805875/?utm_campaign=805875&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/84d/221/4c5/84d2214c58139864a83a9520dacfdc5e.png" /><p>Пространство имен - это важный концепт в программировании, позволяющий группировать элементы и предотвращать конфликты имен. В этом посте мы покажем, как мы применяем этот концепт к API, чтобы облегчить композицию и интеграцию различных сервисов.</p><p>Мы покажем вам, как интегрировать 8 сервисов: SpaceX GraphQL, 4x GraphQL с использованием Apollo Federation, REST API с использованием OpenAPI Specification, API на основе PostgreSQL и API на основе Planetscale-Vitess (MySQL) всего несколькими строками кода, полностью автоматически, без каких-либо конфликтов.</p><p></p> <a href="https://habr.com/ru/articles/805875/?utm_campaign=805875&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sat, 06 Apr 2024 17:09:28 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>wundergraph</category><category>api</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Dataloader 3.0: Новый алгоритм для решения проблемы N+1]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805769/</guid>
      <link>https://habr.com/ru/articles/805769/?utm_campaign=805769&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/885/889/a14/885889a14872f7f50d84b5aa95be26ed.png" /><p>При реализации Cosmo Router, open-source замена Apollo Router, мы столкнулись с проблемой поддержания нашего кода для решения проблемы N+1. Реализация маршрутизатора для федеративных служб GraphQL в значительной степени зависит от возможности группировать вложенные запросы GraphQL для сокращения числа запросов к подграфам.</p><p>Чтобы решить эту проблему, мы разработали новый алгоритм, который решает проблему N+1 более эффективно и проще для поддержания, чем наше предыдущее решение, которое было основано на шаблоне DataLoader, обычно используемом в сообществе GraphQL. Вместо разрешения сначала по глубине, мы загружаем данные сначала по ширине, что позволяет нам сократить параллелизм с O(N^2) до O(1) и улучшить производительность до 5 раз, сокращая сложность кода.</p><p>Если вы заинтересованы в проверке кода, вы можете найти его на <a href="https://github.com/wundergraph/cosmo" rel="noopener noreferrer nofollow">GitHub</a>.</p><p>Я также провел лекцию на эту тему на GraphQL Conf 2023, которую вы можете <a href="https://youtu.be/vWQYI5fNytM" rel="noopener noreferrer nofollow">посмотреть здесь</a>.</p><p></p> <a href="https://habr.com/ru/articles/805769/?utm_campaign=805769&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 05 Apr 2024 19:47:03 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>wundergraph</category><category>dataloader</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Создание серверного Live Chat приложения с использованием Next.js, Fauna и WunderGraph для GraphQL Live Queries]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805695/</guid>
      <link>https://habr.com/ru/articles/805695/?utm_campaign=805695&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/c74/4e4/e3e/c744e4e3e14fafad2a77b65eda35f41d.png" /><p>Пошаговое руководство по созданию масштабируемого, чат-приложения реального времени с использованием серверных технологий... с небольшой помощью от NextAuth.js для входа через GitHub. Кому нужны WebSockets, когда у вас есть Live Queries? Не нам!</p><p>Если вы создаете приложения, которые работают с данными в реальном времени, вы, вероятно, используете WebSockets. Они позволяют веб-браузеру и веб-серверу общаться в реальном времени, поддерживая постоянное соединение между ними - данные отправляются клиентам, как только они становятся доступными, а не когда клиент постоянно опрашивает сервер на предмет новых данных.</p><p>Но что, если ваше приложение является серверным - работает на инфраструктуре, управляемой облачным провайдером, таким как AWS или GCP?</p><p>Для обеспечения высокой эластичности и отказоустойчивости эти среды разработаны так, чтобы быть без состояния и временными по своей природе, что означает, что нет гарантии, что ваш код будет работать на одном и том же физическом сервере от одного запроса к другому - и, следовательно, нет постоянного соединения между клиентом и сервером.</p><p>Итак, какое решение для создания приложений в реальном времени на серверных архитектурах? Давайте выясним! Давайте создадим этот чат в реальном времени в стиле Slack/Discord, используя Next.js в качестве нашего JS-фреймворка, Fauna (с использованием GraphQL) в качестве нашей базы данных, и WunderGraph в качестве Backend-for-Frontend (<a href="https://bff-patterns.com/" rel="noopener noreferrer nofollow">BFF</a>), который обеспечивает связь между ними. Наше приложение также будет использовать вход через GitHub, и мы будем использовать знаменитый NextAuth (теперь <a href="https://authjs.dev/" rel="noopener noreferrer nofollow">Auth.js</a>!) для наших нужд в области аутентификации.</p><p></p> <a href="https://habr.com/ru/articles/805695/?utm_campaign=805695&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 05 Apr 2024 12:20:35 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>wundergraph</category><category>nextjs</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Полное руководство по безопасности GraphQL: Устранение 13 наиболее распространенных уязвимостей]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805537/</guid>
      <link>https://habr.com/ru/articles/805537/?utm_campaign=805537&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/00b/233/8d1/00b2338d1806d6c22b38101538e28129.png" /><p>Это 2024 год, и GraphQL на подъеме, чтобы стать <a href="https://trends.google.com/trends/explore?date=2014-01-01%202024-04-04&amp;q=%2Fg%2F11cn3w0w9t,%2Fm%2F010ppjcy" rel="noopener noreferrer nofollow">важным игроком в экосистеме API</a>. Это идеальное время, чтобы поговорить о том, как сделать ваши GraphQL API безопасными и готовыми к производству.</p><p>Итак, вот мой тезис: GraphQL по своей природе небезопасен. Я докажу это в течение всей статьи и предложу решения. Одно из решений потребует некоторого радикального изменения в том, как мы думаем о GraphQL, но это принесет много преимуществ, которые выходят далеко за рамки просто безопасности.</p><p></p> <a href="https://habr.com/ru/articles/805537/?utm_campaign=805537&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Thu, 04 Apr 2024 21:18:33 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category>graphql</category><category>wundergraph</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] API без версий — делаем API обратно совместимыми НАВСЕГДА, чтобы позволить бизнесу сотрудничать]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/805221/</guid>
      <link>https://habr.com/ru/articles/805221/?utm_campaign=805221&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/e95/869/ca5/e95869ca591b7074653b2c9c55683c80.png" /><p>Версионирование API является важной частью жизненного цикла API. Некоторые стили API, например, GraphQL, полностью игнорируют версионирование и называют это функцией. Другие, например, RESTful API, предоставляют разработчикам множество различных способов реализации версионирования.</p><p>Я считаю, что версионирование для API важно, но также слишком сложно. Это важно, потому что обратная совместимость критически важна в мире взаимосвязанных компаний, использующих API в качестве моста. В то же время это сложная проблема для команд разработчиков.</p><p>Все больше и больше компаний начинают понимать свои API как продукты. Компании будущего не будут работать в изоляции. Вместо этого они будут использовать API от сторонних поставщиков, предоставляя при этом свои API другим.</p><p>Опираясь на API других компаний, эти компании получат преимущество, так как смогут больше сосредоточиться на своем собственном бизнесе. В то же время, предоставляя свои собственные API в качестве продукта другим компаниям, они получат преимущество перед теми компаниями, которые не позволяют другим легко интегрироваться с ними. Все это приведет к выигрышной ситуации для участников. Я ожидаю, что этот тренд может только привести к экспоненциальному росту. Чем больше проблем легко решаемы с помощью интеграции с API, тем проще становится для других создавать новые бизнес-модели на его основе, что, в свою очередь, добавит больше API в экосистему.</p><p></p> <a href="https://habr.com/ru/articles/805221/?utm_campaign=805221&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 03 Apr 2024 21:35:59 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category>graphql</category><category>wundergraph</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Причуды подписок на GraphQL: SSE, WebSockets, Hasura, Apollo Federation / Supergraph]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/804641/</guid>
      <link>https://habr.com/ru/articles/804641/?utm_campaign=804641&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/4e6/2bd/9b3/4e62bd9b3fc2503fadb10d02be65d0fc.png" /><p>Возможно, вы думаете, что о подписках говорить особо нечего. Они определены в спецификации GraphQL, и должно быть очень ясно, как они работают и для чего они нужны.</p><p>Но на самом деле спецификация мало что говорит о транспортном слое. Фактически, она вообще не указывает транспортный слой. С одной стороны, это преимущество, потому что вы можете использовать GraphQL в самых разных средах. С другой стороны, у нас сейчас есть по крайней мере пять разных реализаций подписок GraphQL.</p><p>Это означает, что вы не можете просто использовать любой клиент GraphQL, подключиться к серверу GraphQL и ожидать, что все будет работать. Вам нужно знать, какой протокол поддерживает сервер и какой клиент вам нужно использовать. Это идеальная ситуация? Вероятно, нет, но мы собираемся это изменить!</p><p>Мы - создатели <a href="https://github.com/wundergraph/wundergraph" rel="noopener noreferrer nofollow">WunderGraph (открытый исходный код)</a>, первого облачного серверного GraphQL API Gateway. Одной из проблем, с которой мы столкнулись, была поддержка всех различных протоколов подписки GraphQL. Поскольку спецификация GraphQL строго агностична к протоколу, за годы было разработано несколько различных протоколов.</p><p>Если клиент хочет использовать подписку GraphQL, ему нужно знать, какой протокол использовать, и реализовать клиентскую сторону этого протокола.</p><p>С нашим Open Source API Gateway, мы делаем шаг вперед и объединяем все под одной крышей. Если вы смотрите на использование подписок GraphQL в вашем проекте, этот пост - отличный способ быстро ознакомиться с различными протоколами и их особенностями.</p><p></p> <a href="https://habr.com/ru/articles/804641/?utm_campaign=804641&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 01 Apr 2024 20:52:26 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category>
      <category>graphql</category><category>wundergraph</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Почему стоит взглянуть на Relay и GraphQL снова]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/804455/</guid>
      <link>https://habr.com/ru/articles/804455/?utm_campaign=804455&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/ec1/f3b/6bd/ec1f3b6bd3f291f4c256d09b2d084272.png" /><p>Если вы давно следите за моей работой, то знаете, что одним из моих любимых пристрастий являются сравнения GraphQL, REST, tRPC и других технологий, в которых не упоминаются Relay и Fragments. В этом посте я объясню, почему я считаю Relay переломным моментом, как мы сделали ее в 100 раз проще в использовании и внедрении, и почему вам стоит обратить на нее внимание.</p><p></p> <a href="https://habr.com/ru/articles/804455/?utm_campaign=804455&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 01 Apr 2024 10:19:03 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[ReactJS]]></category>
      <category>graphql</category><category>relay</category><category>WunderGraph</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Как быть худшим инженером в своей команде]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/804391/</guid>
      <link>https://habr.com/ru/articles/804391/?utm_campaign=804391&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/d5e/bea/ba2/d5ebeaba2f6f14ede065ce64de94233f.png" /><p>За время моей недолгой работы инженером-программистом (2,5 года) мне всегда невероятно везло с людьми, которые меня окружали. Я сталкивался с гениальными инженерами, которые, проявляя терпение и оказывая поддержку, делали все возможное, чтобы помочь мне учиться, совершенствоваться и самому становиться лучшим инженером.</p><p>В первый день работы в моей первой компании я не понимал, что такое POST-запрос. В начале прошлого года я не знал, что такое GraphQL. До вчерашнего дня я никогда не использовал <code>defer</code> в GoLang.</p><p>Теперь, если я оглянусь назад, я легко могу увидеть, насколько далеко я продвинулся. Но когда вы окружены командой чрезвычайно умных и знающих людей, еще проще увидеть, как далеко вам еще предстоит идти. И так же легко это расстояние может превратиться в тревогу и депрессию.</p> <a href="https://habr.com/ru/articles/804391/?utm_campaign=804391&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 01 Apr 2024 07:45:09 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Карьера в IT-индустрии]]></category>
      <category>вискас</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Масштабирование подписок GraphQL в Go с использованием Epoll и архитектуры, основанной на событиях]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/804287/</guid>
      <link>https://habr.com/ru/articles/804287/?utm_campaign=804287&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/ba5/f92/be4/ba5f92be4f21b016f04e29bdefa04edd.png" /><p>«Сделай работающим, сделай правильным, сделай&nbsp;быстрым». Это мантра, которую вы, вероятно, слышали раньше. Это хорошая мантра, которая помогает вам сосредоточиться на&nbsp;том, чтобы не&nbsp;переусложнять решение. Я пришел к&nbsp;выводу, что&nbsp;обычно достаточно сделать это правильно, обычно это достаточно&nbsp;быстро, если сделать это правильно.</p><p>Когда мы начали реализацию подписок GraphQL в&nbsp;Cosmo Router, мы сосредоточились на&nbsp;том, чтобы сделать это работающим. Это&nbsp;было несколько месяцев назад. Это&nbsp;было достаточно хорошо для&nbsp;первой итерации и позволило нам получить отзывы от&nbsp;наших пользователей и лучше понять проблемное пространство.</p><p>В&nbsp;процессе того, как&nbsp;мы делали это правильно, мы сократили количество горутин на 99% и потребление памяти на 90% без&nbsp;жертвования производительностью. В&nbsp;этой статье я объясню, как&nbsp;мы достигли этого. Использование Epoll/Kqueue сыграло большую роль в&nbsp;этом, но&nbsp;также переосмысление архитектуры, чтобы она&nbsp;была более событийно‑ориентированной.</p><p></p> <a href="https://habr.com/ru/articles/804287/?utm_campaign=804287&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 31 Mar 2024 17:53:12 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[Go]]></category>
      <category>graphql</category><category>websocket</category><category>вискас</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Представляем gqlgen: генератор серверов GraphQL для Go]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/792700/</guid>
      <link>https://habr.com/ru/articles/792700/?utm_campaign=792700&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/376/907/8a9/3769078a995f57801a0b22c1beff8298.png" /><p>В 99designs мы находимся на пути деконструкции нашего PHP-монолита в микросервисную архитектуру, при этом большинство новых сервисов пишется на Go. В этот период наша фронтенд-команда также применила безопасность типов, перейдя с Javascript на TypeScript и React.</p><p>После того как мы внедрили безопасность типов в бэкенд и фронтенд, стало очевидно, что наши конечные точки REST, созданные на заказ, не могут преодолеть разрыв между типами. Нам нужен был способ объединить эти системы типов и распутать наши конечные точки API.</p><p>Нам нужна была система безопасности типов для API. GraphQL выглядел многообещающе. Однако, изучив его, мы поняли, что не существует серверного подхода, который бы отвечал всем нашим требованиям. Поэтому мы разработали свой собственный, который мы назвали gqlgen.</p><p></p> <a href="https://habr.com/ru/articles/792700/?utm_campaign=792700&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 09 Feb 2024 17:08:07 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category>graphql</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Лучшие поисковые пакеты для JavaScript]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/784650/</guid>
      <link>https://habr.com/ru/articles/784650/?utm_campaign=784650&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/f6b/5a0/004/f6b5a0004ec753b18013667f42f26536.png" /><p>Спрос на функции поиска растет, и многие разработчики пытаются внедрить их в свои приложения. Однако создание таких приложений с нуля - сложная и трудоемкая задача. К счастью, существует множество библиотек с открытым исходным кодом, позволяющих освободить разработчиков от этого бремени.</p><p>В этом руководстве читатель найдет список лучших поисковых пакетов для JavaScript. В статье будет проведен обзор и сравнение поисковых пакетов с учетом скорости, простоты использования, типа предлагаемого поиска, базы данных и других характеристик. Кроме того, читатели поймут, что такое функциональность поиска и зачем она нужна.</p><p></p> <a href="https://habr.com/ru/articles/784650/?utm_campaign=784650&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Thu, 04 Jan 2024 22:10:02 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Веб-разработка]]></category><category><![CDATA[JavaScript]]></category>
      <category>поиск</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Asana CEO: То, как мы работаем сейчас, скоро будет выглядеть пережитком прошлого]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/784206/</guid>
      <link>https://habr.com/ru/articles/784206/?utm_campaign=784206&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p>По мере того как И.И. все больше проникает в общественное сознание, мы начинаем видеть антиутопические истории о будущем работы, предсказывающие своего рода окончательную победу макиавеллиевских сил капитализма.</p><p>Самый яркий пример - автор научной фантастики Тед Чианг, который недавно задался вопросом, есть ли "способ для И.И. сделать что-то еще, кроме как точить лезвие ножа капитализма?". По данным Insider, сотрудники JPMorgan, возможно, уже страдают от такой динамики благодаря мощным инструментам мониторинга сотрудников компании.</p><p>Эти истории рисуют мрачную картину, вызывая множество опасений, которые я разделяю, и, действительно, мои собственные опасения по поводу И.И. выходят далеко за рамки потенциального влияния на работу. Но я верю, что мы преодолеем их, и хочу на мгновение представить мир, где люди процветают на своих рабочих местах благодаря, а не вопреки И.И.</p> <a href="https://habr.com/ru/articles/784206/?utm_campaign=784206&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sat, 30 Dec 2023 17:40:14 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Управление разработкой]]></category><category><![CDATA[Управление проектами]]></category><category><![CDATA[Искусственный интеллект]]></category>
      <category>developer-centric culture</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Тонкая настройка Whisper для многоязычного ASR с помощью Hugging Face Transformers]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/783128/</guid>
      <link>https://habr.com/ru/articles/783128/?utm_campaign=783128&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/f85/019/16c/f8501916c6f3b216006300aca02602c0.jpeg" /><p>Предлагается пошаговое руководство по дообучению Whisper для любого многоязычного набора данных ASR с использованием Hugging Face ? Transformers. Эта заметка содержит подробные объяснения модели Whisper, набора данных Common Voice и теории дообучения, а также код для выполнения шагов по подготовке данных и дообучению. Для более упрощенной версии с меньшим количеством объяснений, но со всем кодом, см. соответствующий <a href="https://colab.research.google.com/github/sanchit-gandhi/notebooks/blob/main/fine_tune_whisper.ipynb" rel="noopener noreferrer nofollow">Google Colab</a>.</p><p></p> <a href="https://habr.com/ru/articles/783128/?utm_campaign=783128&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Mon, 25 Dec 2023 20:03:51 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Data Mining]]></category><category><![CDATA[Машинное обучение]]></category><category><![CDATA[Искусственный интеллект]]></category><category><![CDATA[Natural Language Processing]]></category>
      <category>asr</category><category>whisper</category><category>automatic speech recognition</category><category>nlp</category><category>распознавание речи</category><category>сезон data mining</category><category>speech-to-text</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Подробное объяснение принципа KISS в программном обеспечении]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/782094/</guid>
      <link>https://habr.com/ru/articles/782094/?utm_campaign=782094&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/489/540/002/489540002f98fbfc8853f2bd71bf565b.png" /><p>Когда я ищу информацию о принципе KISS в Интернете, я натыкаюсь на множество сайтов, определяющих его в паре строк: важна простота, давайте быть простыми, конец. Они часто не объясняют, что такое простота, почему простота важна и как ее достичь.</p><p>Простота - это одна из ведущих идей, которую мы должны помнить всегда, проектируя систему. Проблема: ее действительно трудно достичь.</p><p>Вы угадали: мы погрузимся в простоту (и сложность) в этой статье. Я не буду писать обо всех различных способах, которыми сложность может проникнуть в ваш код, но, вместо этого, я постараюсь дать вам краткий обзор различных масок, которые сложность может носить, с множеством примеров. Мы перейдем от самого бизнес-домена, через мелочи (реализацию), чтобы закончить сложностью архитектуры программного обеспечения.</p><p></p> <a href="https://habr.com/ru/articles/782094/?utm_campaign=782094&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 22 Dec 2023 05:00:39 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Программирование]]></category><category><![CDATA[Проектирование и рефакторинг]]></category><category><![CDATA[Управление разработкой]]></category>
      <category>yagni</category><category>kiss</category><category>dry</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Создание атомарных коммитов в Git]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/781794/</guid>
      <link>https://habr.com/ru/articles/781794/?utm_campaign=781794&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/252/d04/6f9/252d046f939028fcd46cd522adb482a3.jpeg" /><p>Мы все были там: Вы работали над множеством изменений одновременно, некоторые из которых не имели ничего общего. Для удобства вы решили объединить все эти изменения в один коммит и на этом закончить. Но хотя это может показаться заманчивым, на самом деле это может привести к большим проблемам в дальнейшем. Большие коммиты могут:</p><p></p> <a href="https://habr.com/ru/articles/781794/?utm_campaign=781794&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 19 Dec 2023 22:21:31 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Git]]></category><category><![CDATA[Системы управления версиями]]></category><category><![CDATA[Управление разработкой]]></category>
      <category>git commit</category><category>atomic</category>
    </item>
  

  

    
    <item>
      <title><![CDATA[Инструкция: как поднять GitLab CI/CD на GoLang-проекте]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/780172/</guid>
      <link>https://habr.com/ru/articles/780172/?utm_campaign=780172&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/d14/a3b/2f8/d14a3b2f872387e2ec45e4100c3d781f.png" /><p>В продолжение к заметке <a href="https://habr.com/ru/companies/agima/articles/779028/" rel="noopener noreferrer nofollow">Инструкция: как быстро настроить GitLab CI/CD на Flutter-проекте</a>.</p><p>Больше спасибо автору, всё получилось относительно легко. Я усложнил задачу: поднял GitLab локально на Хакинтоше, прикрутил <code>executor = "docker"</code> вместо <code>"shell"</code>. И началось веселье.</p><p></p> <a href="https://habr.com/ru/articles/780172/?utm_campaign=780172&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 12 Dec 2023 16:14:13 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Git]]></category><category><![CDATA[Go]]></category><category><![CDATA[DevOps]]></category>
      <category><![CDATA[gitlab]]></category><category><![CDATA[docker]]></category><category><![CDATA[cicd]]></category>
    </item>
  

  

  

	
  

  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Корутины для Go]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/775532/</guid>
      <link>https://habr.com/ru/articles/775532/?utm_campaign=775532&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/85f/ac8/a87/85fac8a87b90fa8a1d8eb4871ee8fb7f.png" /><p>Эта заметка о том, зачем нам нужен пакет coroutine для Go и как он будет выглядеть. Но прежде всего, что такое корутины?</p><p>Сегодня каждый программист знаком с вызовами функций (подпрограмм): F вызывает G, которая останавливает F и запускает G. G выполняет свою работу, потенциально вызывая и ожидая другие функции, и в конце концов возвращается. Когда G возвращается, G уже нет, а F продолжает работать. В этой схеме одновременно выполняется только одна функция, а ее вызывающие ожидают, поднимаясь вверх по стеку вызовов.</p><p>В отличие от подпрограмм, корутины выполняются конкурентно на разных стеках, но все равно верно, что одновременно выполняется только одна функция, а ее вызывающая сторона ждет. F запускает G, но G не выполняется немедленно. Вместо этого F должен явно возобновить (resume) выполнение G, который затем начинает выполняться. В любой момент G может развернуться и вернуться (yield) назад к F. Это приостановит G и продолжит F операцию возобновления. В конце концов F снова вызывает resume, который приостанавливает F и продолжает G после выхода. И так далее, туда-сюда, пока G не вернется, что приведет к очистке G и продолжению F с последней операции возобновления, с некоторым сигналом для F, что G закончена и F больше не должна пытаться возобновить G. В этом паттерне одновременно выполняется только одна корутина, а ее вызывающая сторона ждет на другом стеке. Они выполняются по очереди в четко определенном, скоординированном порядке.</p><p>Это несколько абстрактно. Давайте посмотрим на реальные программы.</p><p></p> <a href="https://habr.com/ru/articles/775532/?utm_campaign=775532&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 21 Nov 2023 20:57:52 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category>coroutine</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Формирование культуры, ориентированной на разработчиков]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/774740/</guid>
      <link>https://habr.com/ru/articles/774740/?utm_campaign=774740&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/739/cc7/8a5/739cc78a51043321bc429c8cf083160a.png" /><p>Создание, удержание и масштабирование отличных технических команд происходит благодаря сильной культуре, ориентированной на разработчиков. Обеспечение того, чтобы люди чувствовали себя в безопасности, чтобы их уважали и давали им возможность выполнять свою работу наилучшим образом, необходимо для создания любой команды, и разработчики не являются исключением!</p><p>Однако культура - вещь непростая. Ее нельзя измерить, и хотя она не может быть навязана сверху, здоровая культура требует правильной среды для роста и масштабирования. В этом первом разделе книги <a href="https://mattermost.com/ultimate-guide-to-building-technical-teams" rel="noopener noreferrer nofollow">The Ultimate Guide to Building Technical Teams</a> мы рассмотрим, что могут сделать организации, чтобы заложить фундамент командной культуры, ориентированной на разработчиков, частью которой они с удовольствием станут.<br><br><em>Этот манифест опубликован пару лет назад, но интересно посмотреть с оглядкой назад.</em></p><p></p> <a href="https://habr.com/ru/articles/774740/?utm_campaign=774740&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 17 Nov 2023 15:56:39 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Управление разработкой]]></category>
      <category>Developer-Centric Culture</category>
    </item>
  

  

    

  

  

	
  

  
    <item>
      <title><![CDATA[[Перевод] Проблемы функции Golang init]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/771858/</guid>
      <link>https://habr.com/ru/articles/771858/?utm_campaign=771858&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/b34/120/543/b34120543d9dbdf69ae44947885e5ee1.png" /><p>Прежде чем говорить о функции <code>init</code> в Golang, необходимо понять, что такое пакет в Golang. Программа go организована в пакеты. Пакет собирает несколько исходных файлов в одном каталоге. Он похож на ящик, в котором находятся некоторые инструменты или небольшая машина. Он является отправной точкой для инициализации всего пакета. По-видимому, это соответствует назначению функции <code>init</code>.</p><p></p> <a href="https://habr.com/ru/articles/771858/?utm_campaign=771858&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Fri, 03 Nov 2023 22:44:30 GMT</pubDate>
      <dc:creator><![CDATA[comerc]]></dc:creator>
      <category><![CDATA[Go]]></category>
      <category>init</category>
    </item>
  

  

      

      

      

    
  </channel>
</rss>
