<?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>
	<title>PyCharm : The only Python IDE you need. | The JetBrains Blog</title>
	<atom:link href="https://blog.jetbrains.com/pycharm/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.jetbrains.com</link>
	<description>Developer Tools for Professionals and Teams</description>
	<lastBuildDate>Thu, 05 Nov 2026 15:03:21 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://blog.jetbrains.com/wp-content/uploads/2026/09/icon-512.webp</url>
	<title>PyCharm : The only Python IDE you need. | The JetBrains Blog</title>
	<link>https://blog.jetbrains.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>What&#8217;s New in PyCharm 2026.3</title>
		<link>https://blog.jetbrains.com/pycharm/2026/11/what-s-new-in-pycharm-2026-3/</link>
					<comments>https://blog.jetbrains.com/pycharm/2026/11/what-s-new-in-pycharm-2026-3/#respond</comments>
		
		<dc:creator><![CDATA[Ilia Afanasiev]]></dc:creator>
		<pubDate>Thu, 05 Nov 2026 15:03:04 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/11/PC-releases-BlogFeatured-1280x720-1-1.png</featuredImage>		<category><![CDATA[releases]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=752978</guid>

					<description><![CDATA[At the center of this release is JetBrains Air – a new layer for agentic development. It lets you run, track, and verify multi-agent workflows directly inside your IDE, with code intelligence keeping agents on track and complete review tools in your hands. This release also brings workspaces that adapt terminals and consoles to individual [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p id="p-rc_a6cc8a76c03f9027-163">At the center of this release is <a href="https://www.jetbrains.com/air/ides/" target="_blank" rel="noopener">JetBrains Air</a> – a new layer for agentic development. It lets you run, track, and verify multi-agent workflows directly inside your IDE, with code intelligence keeping agents on track and complete review tools in your hands. This release also brings workspaces that adapt terminals and consoles to individual subprojects, initial support for Python 3.15 lazy imports, interactive FastAPI dependency graphs, and deeper Pydantic inspections, and so much more.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/download/" class="btn" target="_blank" rel="noopener">Download PyCharm 2026.3 now</a>
                                                    </div>
    </div>







<p id="p-rc_a6cc8a76c03f9027-164">Check out an overview video by our developer advocate William Vincent:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="What’s New in PyCharm 2026.3" src="https://www.youtube.com/embed/mFSlHxYJgMo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p id="p-rc_a6cc8a76c03f9027-164">Now, let&#8217;s take a closer look at the key highlights.</p>



<h2 class="wp-block-heading">JetBrains Air in PyCharm – One place to run your agents and verify their work&nbsp;</h2>



<p>As of this release, JetBrains IDEs ship with <a href="https://www.jetbrains.com/air/ides/" target="_blank" rel="noopener">Air</a>, a new layer for agentic development. Work with the coding agents of your choice, and run, track, and verify multi-agent workflows inside your IDE, where code intelligence helps agents make fewer wrong turns and gives you the tools to review every change before it ships.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="JetBrains Air in PyCharm 2026.3: Multi-Agent Workflows in Production" src="https://www.youtube.com/embed/cf3LT8Sd62I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 class="wp-block-heading">Your agents, your models, your subscriptions – with Junie Lite for free</h3>



<p>Air works with Claude Agent, Codex, Gemini, GitHub Copilot, Junie, OpenCode, and other <a href="https://www.jetbrains.com/acp/" target="_blank" rel="noopener">ACP-compatible agents</a>. It detects the agents already installed on your machine so you can connect them in a click, and you can add more from the agent registry.</p>



<p>Your existing setup carries over, too: provider subscriptions, API keys, and even a custom base URL all work, with no JetBrains AI subscription required. Run Claude Agent on your Claude subscription in the terminal or in a full-screen IDE tab, use other agent subscriptions in the chat or terminal, and switch between subscriptions at any moment, even mid-session.</p>



<p>Air includes free AI with the <a href="https://junie.jetbrains.com/" target="_blank" rel="noopener">Junie</a> Lite configuration, so you can use an agent without a subscription. You only need a JetBrains Account.</p>


    <div class="slider slider-full">
                                        <div class="slider__slide">
                    <a href="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-connections.png">
                        <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-connections.png" alt="">
                    </a>
                </div>
                                                    <div class="slider__slide">
                    <a href="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-workflows.png">
                        <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-workflows.png" alt="">
                    </a>
                </div>
                                                    <div class="slider__slide">
                    <a href="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-details.png">
                        <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-agent-details.png" alt="">
                    </a>
                </div>
                        </div>






<h3 class="wp-block-heading">A central workspace to review changes and guide the agent</h3>



<p>Review an agent&#8217;s changes with the surrounding code and your project tools in view, and send feedback straight back to the agent. Anchor a note to a specific line in the diff, or comment directly from the code, so the agent gets concrete context about the change you want. Work in the chat or the terminal, whichever suits you.</p>


    <div class="slider slider-full">
                                        <div class="slider__slide">
                    <a href="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-review-workspace-overview-1.png">
                        <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-review-workspace-overview-1.png" alt="">
                    </a>
                </div>
                                                    <div class="slider__slide">
                    <a href="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-review-workspace-details-1.png">
                        <img style="width:100% !important; height:auto !important; max-width:100% !important;" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/air-review-workspace-details-1.png" alt="">
                    </a>
                </div>
                        </div>






<p><em>Still using AI Assistant? A notification will offer you a trial of Air. Moving to Air hides AI Assistant, if you wish to return to AI Assistant follow the steps outlined </em><a href="https://www.jetbrains.com/help/ai-assistant/switch-to-air.html#return-to-ai-assistant" target="_blank" rel="noopener"><em>here</em></a><em>. Air automatically migrates your IDE skills, MCP configuration, agents installed through ACP, authentication, and chat history. </em>Chat <em>mode history isn&#8217;t migrated.</em></p>



<h2 class="wp-block-heading">Workspace support</h2>



<h3 class="wp-block-heading">A console and terminal for each subproject</h3>



<p>Each subproject has its own Python console and terminal running in its own environment, so you run code against the dependencies that subproject actually uses. In uv workspaces, the console uses the workspace environment and adds the subproject root to <code>sys.path</code>.</p>



<ul class="wp-block-list">
<li>Right-click a subproject and select <em>Open in | Python console</em> to start a console for it.</li>



<li>Open a terminal while a subproject file is in the editor to run commands in that subproject’s environment.</li>
</ul>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/01_Python_Console_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/01_Python_Console.mp4"></video></figure>



<h3 class="wp-block-heading">Subproject creation and conversion</h3>



<p>You can add a new subproject or convert an existing folder from the <em>Project</em> tool window context menu. The subproject is initialized using uv, Hatch, or Poetry, and automatically added as a workspace member to your root <code>pyproject.toml</code> in uv workspaces.</p>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/02_Subproject_Convert_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/02_Subproject_Convert.mp4"></video></figure>



<h2 class="wp-block-heading">Python 3.15 lazy imports</h2>



<p>PyCharm now supports the lazy import syntax introduced in Python 3.15. A lazy import defers loading a module until it’s first used, which can noticeably cut startup time in applications and scripts with heavy dependencies. PyCharm parses and resolves lazy imports like regular ones, so you can adopt the syntax without giving up code insight on the names you import.</p>



<p>Learn more about lazy imports in<a href="https://blog.jetbrains.com/pycharm/2026/06/explicit-lazy-imports-are-coming-to-python-3-15/"> our blog post</a>.</p>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/03_LazyImport_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/03_LazyImports.mp4"></video></figure>



<h2 class="wp-block-heading">FastAPI support <sup>[Pro]</sup></h2>



<p>An endpoint can depend on a chain of <code>Depends()</code> and <code>Security()</code> calls spread across many files. PyCharm draws that chain as a graph for any endpoint. Each dependency is marked as <code>yield</code> or <code>return</code>, and circular dependencies, which raise a <code>RuntimeError</code> at startup, are flagged in the editor. In the other direction, a dependency shows which endpoints rely on it, directly or through other dependencies.</p>



<p>You can open the graph from the gutter icon next to an endpoint or click the endpoint count above a dependency to see its usages.</p>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/05_FastAPI_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/05_FastAPI_Screencast.mp4"></video></figure>



<h2 class="wp-block-heading">Python interpreter widget</h2>



<p>The redesigned <em>Python interpreter</em> widget in the status bar is built around the tools that manage your environments, such as uv, Poetry, Hatch, and conda. It detects the ones installed on your machine and lists the environments each one manages for your project.</p>



<p>Environments created from the command line also appear under their tool. To start working in one, open the widget, select the tool, and pick the environment. To recreate it with a different Python version, choose <em>Recreate Environment</em> under <em>Current Environment</em>. If the Python version you choose isn’t installed, you’ll be prompted to download it.</p>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/04_PythonInterpreter_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/04_PythonInterpreter.mp4"></video></figure>



<h2 class="wp-block-heading">Pydantic support</h2>



<p>PyCharm now provides deeper editor support for Pydantic models. Field constraints, validators, and configuration are read from the model’s declaration and used across the editor.</p>



<ul class="wp-block-list">
<li>Values passed to a model are checked against its <code>Field()</code> constraints, such as <code>min_length</code>, <code>max_length</code>, <code>gt</code>, and <code>lt</code>, with a warning displayed when one is broken.</li>



<li>A field name inside <code>@field_validator('price')</code> now resolves to that field’s definition, letting you jump straight to it.</li>



<li>Code completion suggests configuration options in a model’s class arguments, such as <code>validate_by_name</code> and <code>validate_by_alias</code>.</li>
</ul>



<figure class="wp-block-video"><video controls poster="https://blog.jetbrains.com/wp-content/uploads/2026/11/06_Pydantic_preview.png" src="https://blog.jetbrains.com/wp-content/uploads/2026/11/06_Pydantic.mp4"></video></figure>



<p id="p-rc_a6cc8a76c03f9027-166">What you see here only scratches the surface of what is included in PyCharm 2026.3<sup></sup>. From editing standalone files in the new Home window to full SQLAlchemy ORM support, automatic project configuration copy in Git worktrees, and remote development directly from the IDE via SSH – there is plenty more to explore across code insight, testing, environments, and version control<sup></sup>.</p>



<p id="p-rc_a6cc8a76c03f9027-166">Head over to the <a target="_blank" rel="noreferrer noopener" href="https://www.jetbrains.com/pycharm/whatsnew/">What’s new in PyCharm 2026.3</a> page to see the complete list of features, performance improvements, and fixes<sup></sup>.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/whatsnew/" class="btn" target="" rel="noopener">Read the full What&#8217;s New</a>
                                                    </div>
    </div>







<p id="p-rc_a6cc8a76c03f9027-168">We would love to hear how JetBrains Air and the new workspace tooling fit into your day-to-day work – share your thoughts in the comments below or submit feedback directly in our <a href="https://youtrack.jetbrains.com/issues/PY" target="_blank" rel="noopener">issue tracker</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.jetbrains.com/pycharm/2026/11/what-s-new-in-pycharm-2026-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Compromised eMudhra Certificates: Update Your JetBrains IDEs, ReSharper, .NET Tools, Toolbox App, and Gateway Now</title>
		<link>https://blog.jetbrains.com/security/2026/10/compromised-emudhra-certificates-ides/</link>
					<comments>https://blog.jetbrains.com/security/2026/10/compromised-emudhra-certificates-ides/#respond</comments>
		
		<dc:creator><![CDATA[Ilya Petrov]]></dc:creator>
		<pubDate>Fri, 30 Oct 2026 15:24:48 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/IS-social-BlogFeatured-1280x720-1.png</featuredImage>		<product ><![CDATA[clion]]></product>
		<product ><![CDATA[datagrip]]></product>
		<product ><![CDATA[datalore]]></product>
		<product ><![CDATA[dataspell]]></product>
		<product ><![CDATA[dotnet]]></product>
		<product ><![CDATA[go]]></product>
		<product ><![CDATA[idea]]></product>
		<product ><![CDATA[phpstorm]]></product>
		<product ><![CDATA[pycharm]]></product>
		<product ><![CDATA[ruby]]></product>
		<product ><![CDATA[rust]]></product>
		<product ><![CDATA[rustrover]]></product>
		<product ><![CDATA[toolbox-app]]></product>
		<product ><![CDATA[webstorm]]></product>
		<category><![CDATA[net-tools]]></category>
		<category><![CDATA[clion]]></category>
		<category><![CDATA[goland]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[resharpercplusplus]]></category>
		<category><![CDATA[rider]]></category>
		<category><![CDATA[rubymine]]></category>
		<category><![CDATA[rustrover]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[toolbox-app]]></category>
		<category><![CDATA[webstorm]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=security&#038;p=750273</guid>

					<description><![CDATA[Summary Available fixed versions The issue is fixed in the following versions: The 2025.2.6.* updates for all IDEs now contain only the JBR fix. They will get a separate hotfix for the JCEF problem. Until then, use a workaround to disable JCEF in your IDE (see instructions below). IDE versions 2025.1 and earlier, and Toolbox [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Summary</h2>



<ul class="wp-block-list">
<li>The private keys of eight eMudhra intermediate certificates were compromised. A network attacker could use them to impersonate websites and services that JetBrains tools connect to.</li>



<li>JetBrains IDEs, the Toolbox App, Gateway, and ReSharper are affected because they use the trust store of the bundled JetBrains Runtime (JBR). For IDEs, the embedded browser (JCEF) is also affected. Operating system updates don’t protect against this issue.&nbsp;</li>



<li>The Toolbox App and JetBrains IDEs use a background service, <code>jetbrainsd</code>. It has its own built-in list of trusted certificates and is fixed separately, in <code>jetbrainsd</code> 0.9.9728.</li>



<li>At the time of publishing, we are not aware of any exploitation of this issue against JetBrains users.</li>
</ul>



<h2 class="wp-block-heading">Available fixed versions</h2>



<p>The issue is fixed in the following versions:</p>



<ul class="wp-block-list">
<li><strong>IntelliJ IDEA:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.6.2, 2025.2.6.4.</li>



<li><strong>PyCharm:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.6.2, 2025.2.6.3.</li>



<li><strong>PhpStorm:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.6.2, 2025.2.6.3.</li>



<li><strong>RubyMine:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.6.2, 2025.2.6.3.</li>



<li><strong>WebStorm:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.6.2, 2025.2.6.3.</li>



<li><strong>Rider:</strong> 2026.3 EAP 9, 2026.2.4, 2026.1.5.3, 2025.3.5.3.</li>



<li><strong>CLion:</strong> 2026.3 RC, 2026.2.4.1, 2026.1.5.2, 2025.3.6.3, 2025.2.6.3.</li>



<li><strong>DataSpell:</strong> 2026.1.3.1, 2025.3.3.1, 2025.2.4.1.</li>



<li><strong>DataGrip:</strong> 2026.3 RC, 2026.2.6.1, 2026.1.4.1, 2025.3.6.1, 2025.2.6.1.</li>



<li><strong>GoLand:</strong> 2026.3 RC, 2026.2.4, 2026.1.5.1, 2025.3.5.2, 2025.2.6.3.</li>



<li><strong>RustRover:</strong> 2026.3 EAP 8, 2026.2.5, 2026.1.4.1, 2025.3.7.1, 2025.2.6.1.</li>



<li><strong>Gateway:</strong> 2026.3 RC, 2026.2.4, 2026.1.4, 2025.3.3, 2025.2.6.</li>



<li><strong>ReSharper:</strong> 2026.3 EAP9, 2026.2.4, 2026.1.5.3, 2025.3.5.3.</li>



<li><strong>Toolbox App</strong> 3.9.1, 3.8.2.</li>
</ul>



<p>The 2025.2.6.* updates for all IDEs now contain only the JBR fix. They will get a separate hotfix for the JCEF problem. Until then, use a workaround to disable JCEF in your IDE (see instructions below).</p>



<p><strong>IDE versions 2025.1 and earlier, and Toolbox App 3.7 and earlier, will not receive this fix. </strong>You must update to a fixed version.</p>



<h2 class="wp-block-heading">Details</h2>



<p>In October 2026, the private keys of eight intermediate certificates issued by the certificate authority eMudhra were compromised. An attacker who can intercept your network traffic could use them to impersonate websites and services.<br><br><a href="https://emudhra.we-have-a-problem.com/" target="_blank" rel="noopener">Full details of the incident</a>.</p>



<p>JetBrains IDEs check certificates against the trust store of their bundled runtime, JetBrains Runtime (JBR), so updating your operating system doesn’t protect against this issue. We’ve integrated Oracle’s fixes for <a href="https://www.oracle.com/security-alerts/alert-cve-2026-91403.html" target="_blank" rel="noopener">CVE-2026-91403</a> and <a href="https://www.oracle.com/security-alerts/alert-cve-2026-114820.html" target="_blank" rel="noopener">CVE-2026-114820</a> into JBR as-is. The updated runtime blocks the compromised certificates and no longer trusts these root certificates:</p>



<ul class="wp-block-list">
<li>emSign ECC Root CA – G3</li>



<li>emSign Root CA – G1</li>



<li>emSign Root CA – G2</li>



<li>AAA Certificate Services</li>
</ul>



<p>In the fixed versions of 2025.3 and later, the embedded browser now receives Chrome&#8217;s certificate updates, which block the compromised certificates (<a href="https://www.cve.org/CVERecord?id=CVE-2026-118696" target="_blank" rel="noopener">CVE-2026-118696)</a>. It downloads them from Google&#8217;s update servers shortly after the IDE starts. If your network blocks access to Google&#8217;s update servers, the embedded browser stays unprotected. In this case, turn it off as described below.</p>



<p>The Toolbox App and JetBrains IDEs also install a background service, <code>jetbrainsd</code>. Its list of trusted certificates is built into the service itself, so updating JBR doesn&#8217;t fix it. We&#8217;ve released a separate fix in <code>jetbrainsd</code> 0.9.9728, tracked as <a href="https://www.cve.org/CVERecord?id=CVE-2026-118697" data-type="link" data-id="https://www.cve.org/CVERecord?id=CVE-2026-118697" target="_blank" rel="noopener">CVE-2026-118697</a>. Only one copy of <code>jetbrainsd</code> runs for each user, and a newer version always replaces an older one. Updating any app that includes jetbrainsd 0.9.9728 fixes it for all JetBrains apps.</p>



<h2 class="wp-block-heading">What you should do: Update now</h2>



<p>The fix is available in the latest versions of <strong>JetBrains IDEs</strong>, from 2025.2 up to 2026.3 RC. The upcoming 2026.3 release will include it too. Updating to the latest bugfix release of your current version is enough. Versions 2025.1 and earlier will not receive a fix. If you use one of them, please update to one of the versions above.</p>



<p>If you use ReSharper or other JetBrains .NET tools, update them to the latest version.</p>



<p><strong>Important for Toolbox App users:</strong> versions 3.7 and earlier won’t receive this fix. If you’re on 3.7, update to version 3.9.1 or 3.8.2.</p>



<p>If you use <strong>JetBrains Gateway</strong>, update it to one of the following versions: 2026.1.4, 2025.3.3, 2025.2.6.</p>



<p>If you use <strong>JetBrains Runtime</strong> directly, update to one of the fixed builds: <a href="https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-25.0.4.1b635.79" target="_blank" rel="noopener">jbr25.635.79</a>, <a href="https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-25.0.4.1b508.41" target="_blank" rel="noopener">jbr25.508.41</a>, <a href="https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-25.0.4.1b329.142" target="_blank" rel="noopener">jbr25.329.142</a>, <a href="https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-21.0.11b1163.125" target="_blank" rel="noopener">jbr21.1163.125</a>, <a href="https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr-release-21.0.9b1038.91" target="_blank" rel="noopener">jbr21.1038.91</a>.</p>



<p>In rare cases, the IDE will no longer connect to a server whose certificate chains to one of the removed root certificates. The server’s owner will need to replace the certificate.</p>



<h2 class="wp-block-heading"><strong>If you can’t update right away</strong></h2>



<div class="wp-block-pb-accordion-item c-accordion__item js-accordion-item no-js" data-initially-open="false" data-click-to-close="true" data-auto-close="true" data-scroll="false" data-scroll-offset="0"><h3 id="at-7502730" class="c-accordion__title js-accordion-controller" role="button">Clean your certificates manually</h3><div id="ac-7502730" class="c-accordion__content">
<p>The Java runtime bundled with these IDEs and Toolbox App still trusts two eMudhra-related root certificates. If you can&#8217;t update the IDE, give it a cleaned copy of its certificate list and turn off its built-in browser, which has its own list that can&#8217;t be changed. It takes about five minutes and is fully reversible.</p>



<ol class="wp-block-list">
<li><strong>Copy the certificate list</strong> from the IDE folder to your home folder:<br>macOS: <code>&lt;IDE&gt;.app/Contents/jbr/Contents/Home/lib/security/cacerts</code> <br>Windows / Linux: <code>&lt;IDE&gt;/jbr/lib/security/cacerts</code><br>&nbsp;</li>



<li><strong>Remove the two affected roots</strong>, using the keytool in the IDE&#8217;s jbr/bin folder:<br><code>keytool -delete -keystore &lt;copy&gt; -storepass changeit -alias "comodoaaaca [jdk]"</code><br><code>keytool -delete -keystore &lt;copy&gt; -storepass changeit -alias "emsigneccrootcag3 [jdk]"</code><br>&nbsp;</li>



<li>Open <em>Help | Edit Custom VM Options</em>, add this line, then restart the IDE:<br><code>-Djavax.net.ssl.trustStore=&lt;full path to the copy&gt;</code><br><strong>Important:</strong> write the full path, with no ~, no variables, and no quotes. A wrong path silently leaves you unprotected.<br>&nbsp;</li>



<li>In <em>Settings | Tools | Server Certificates</em>, make sure &#8220;<em>Accept non-trusted certificates automatically</em>&#8221; is off.<br>&nbsp;</li>



<li><strong>Linux only:</strong> update the ca-certificates package.</li>
</ol>



<p><strong>What to expect: </strong>If the IDE shows an &#8220;untrusted server certificate&#8221; dialog for an eMudhra certificate, click <em>Reject</em>.</p>
</div></div>



<div class="wp-block-pb-accordion-item c-accordion__item js-accordion-item no-js" data-initially-open="false" data-click-to-close="true" data-auto-close="true" data-scroll="false" data-scroll-offset="0"><h3 id="at-7502731" class="c-accordion__title js-accordion-controller" role="button">Disable JCEF in your IDE</h3><div id="ac-7502731" class="c-accordion__content">
<p>To workaround the JCEF problem in <strong>2025.2.6.4 and previous versions, or in any version if your network blocks Google&#8217;s update servers:</strong></p>



<ol class="wp-block-list">
<li>Open <em>Search Everywhere -&gt; Actions</em></li>



<li>Type “Registry”</li>



<li>Open <em>Registry</em></li>



<li>Search for ‘<code>ide.browser.jcef.enabled</code>’ key</li>



<li>Switch it off</li>



<li>Restart</li>
</ol>



<p><strong>Note:</strong> Turning off the embedded browser affects features that use it, for example, Markdown and HTML previews and Jupyter notebook output. Some plugins may also stop working correctly. After you update to a fixed version, turn <code>ide.browser.jcef.enabled</code> back on and restart the IDE.</p>
</div></div>



<div class="wp-block-pb-accordion-item c-accordion__item js-accordion-item no-js" data-initially-open="false" data-click-to-close="true" data-auto-close="true" data-scroll="false" data-scroll-offset="0"><h3 id="at-7502732" class="c-accordion__title js-accordion-controller" role="button">Update <code>jetbrainsd</code> background service</h3><div id="ac-7502732" class="c-accordion__content">
<p>The Toolbox App and JetBrains IDEs use a background service, <code>jetbrainsd</code>. It has its own built-in list of trusted certificates, so updating JBR doesn&#8217;t fix it, and the workarounds above don&#8217;t apply to it.</p>



<p>The fix is in <code>jetbrainsd</code> 0.9.9728. You get it when you install or update a fixed version of the Toolbox App or an IDE and start it. Only one copy of <code>jetbrainsd</code> runs for each user, and the newest version replaces older ones. So updating the Toolbox App fixes <code>jetbrainsd</code> for all your IDEs, even if you can&#8217;t update the IDEs themselves.</p>



<p><strong>If you can&#8217;t update the Toolbox App or an IDE</strong>, update jetbrainsd manually:</p>



<ol class="wp-block-list">
<li><strong>Download the archive</strong> for your platform and check its SHA-256 checksum with shasum -a 256 <file> (macOS), sha256sum <file> (Linux), or Get-FileHash <file> (Windows PowerShell):</file></file></file>
<ul class="wp-block-list">
<li>Linux x64: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd-linux-x86_64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd-linux-x86_64-0.9.9728.tar.gz<br></a><code>SHA-256: 6916c5a20e9971be55caa73dc935cbabfb002e86910f2146a2e5dd01747f6b8e</code></li>



<li>Linux ARM64: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd-linux-aarch64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd-linux-aarch64-0.9.9728.tar.gz<br></a><code>SHA-256: abecdf7775475fe2073b46f6f9cae1272b2b9809355cc973de70c4e552a00420</code></li>



<li>macOS Intel: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd.app-macos-x86_64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd.app-macos-x86_64-0.9.9728.tar.gz<br></a><code>SHA-256: 2c35b0b90b4f8255de399d408ad01dd171200737f8c1aeffb6b7ba9ce11279f4</code></li>



<li>macOS Apple silicon: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd.app-macos-aarch64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd.app-macos-aarch64-0.9.9728.tar.gz<br></a><code>SHA-256: a26c459e8665a9c1bcc229384476527e1be8e7e3c1230a59e5a3eb3a8108fd08</code></li>



<li>Windows x64: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd-windows-x86_64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd-windows-x86_64-0.9.9728.tar.gz<br></a><code>SHA-256: 06b8dd29aa5c99fa9f17adfbc4417e5e8b13599aa1d8e45eea1d9590c8c493d0</code></li>



<li>Windows ARM64: <a href="https://download.jetbrains.com/resources/jetbrainsd/jetbrainsd-windows-aarch64-0.9.9728.tar.gz" target="_blank" rel="noopener">jetbrainsd-windows-aarch64-0.9.9728.tar.gz<br></a><code>SHA-256: d5186973f7ddc803d4cabbe03202e1fed942cfc64628ef65af104bb664ee8865</code><br>&nbsp;</li>
</ul>
</li>



<li><strong>Unpack the archive and run jetbrainsd once</strong> without arguments. It replaces the older version. To unpack, use <code>tar -xzf</code><file>. On Windows 10 and later, <code>tar</code> is built in.</file>
<ul class="wp-block-list">
<li>Linux: <code>./jetbrainsd/bin/jetbrainsd</code></li>



<li>macOS: <code>./jetbrainsd.app/Contents/MacOS/jetbrainsd</code></li>



<li>Windows: <code>.\jetbrainsd\bin\jetbrainsd.exe</code><br>&nbsp;</li>
</ul>
</li>



<li><strong>Check the installed version.</strong> It should be 0.9.9728 or later:
<ul class="wp-block-list">
<li>Linux: <code>"${XDG_DATA_HOME:-$HOME/.local/share}/JetBrains/Daemon/bundles/current/jetbrainsd/bin/jetbrainsd" --version</code></li>



<li>macOS: <code>"$HOME/Library/Application Support/JetBrains/Daemon/bundles/current/jetbrainsd.app/Contents/MacOS/jetbrainsd" --version</code></li>



<li>Windows (PowerShell): <code>&amp; "$env:LOCALAPPDATA\JetBrains\Daemon\bundles\current\jetbrainsd\bin\jetbrainsd.exe" --version</code></li>
</ul>
</li>
</ol>
</div></div>



<h2 class="wp-block-heading"><strong>Also check</strong></h2>



<p>Your project JDKs and any tools that bring their own runtime, such as Node.js, Python, or Go, use their own trust stores. Update them as <a href="https://emudhra.we-have-a-problem.com/#developers" target="_blank" rel="noopener">their vendors recommend</a>.</p>



<h2 class="wp-block-heading"><strong>Support</strong></h2>



<p>If you have any questions about this issue or have trouble updating, please contact <a href="https://www.jetbrains.com/support/" target="_blank" rel="noopener">our Support team</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.jetbrains.com/security/2026/10/compromised-emudhra-certificates-ides/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python vs Go: A Practical Comparison for Developers</title>
		<link>https://blog.jetbrains.com/go/2026/10/13/python-vs-go/</link>
		
		<dc:creator><![CDATA[Dominika Stankiewicz]]></dc:creator>
		<pubDate>Tue, 13 Oct 2026 09:02:11 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/10/GO-social-BlogFeatured-1280x720-1.png</featuredImage>		<product ><![CDATA[pycharm]]></product>
		<category><![CDATA[goland]]></category>
		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[deveco]]></category>
		<category><![CDATA[golang]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=go&#038;p=746009</guid>

					<description><![CDATA[Two things are true about Python: It’s the most popular programming language in the world, and it’s the most common companion language for Go developers. How do we know that? From the Developer Ecosystem 2026 survey by JetBrains. But we also know a lot more about the developers who use these two languages – both [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Two things are true about Python: It’s the most popular programming language in the world, and it’s the most common companion language for Go developers. How do we know that? From the Developer Ecosystem 2026 survey by JetBrains.</p>



<p>But we also know a lot more about the developers who use these two languages – both from quantitative data from different surveys, as well as qualitative data from our interviews with professionals who switched from Python to Go.</p>



<p>In this article, we share findings from these sources, going well beyond the simple syntax comparisons you will usually find. We will look at how the two languages differ, what the surveys tell us about the people who use them, and what our interviews say about the trade-offs between Python and Go, so that if you’re considering making the leap, you don’t have to dive in blind.</p>



<h2 class="wp-block-heading">TL;DR</h2>



<ul class="wp-block-list">
<li>The article compares Python and Go across language design, performance, tooling, developer profiles, and migration experiences.</li>



<li>Python favors expressive code and rapid iteration; Go favors explicit, standardized code that is easy to maintain across teams.</li>



<li>Go excels in raw performance and concurrency, and is widely used in cloud infrastructure. Python remains stronger for machine learning, data science, and scientific computing.</li>



<li>Go developers are typically more infrastructure-focused and more senior. Go is rarely someone’s first language, whereas Python is very beginner-friendly.</li>



<li>Python leads in building AI models, yet Go developers create AI integrations at nearly the same rate: 46% vs 44%.</li>



<li>Moving to Go rarely means abandoning Python. Most teams use both, with Go for services and infrastructure and Python for AI and data workloads.</li>
</ul>



<p><strong>A note about the data</strong></p>



<p>Unless stated otherwise, all survey figures come from the JetBrains Developer Ecosystem Survey 2026 (28,945 responses, fielded May–July 2026). We compare two groups: developers who selected Go among their primary languages (1,836) and developers who selected Python (11,298). The groups overlap, with 619 respondents selecting both languages. Therefore, every gap below is a conservative estimate of the real difference. Some questions were shown to only a part of each group, so bases are provided for reference. The qualitative material comes from interviews with developers who moved production workloads from Python to Go. We conducted the interviews between April and May 2026 and included seven participants who began using Go within the past year.</p>



<h2 class="wp-block-heading">Python vs Go – languages compared</h2>



<h3 class="wp-block-heading">Core philosophy</h3>



<p>On paper, Python and Go sound like they&#8217;d get along. Python lays out the core principles in the <a href="https://peps.python.org/pep-0020/" target="_blank" rel="noopener"><em>Zen of Python</em></a>: Simple is better than complex, readability counts, there should be one obvious way to do it, etc. Go, as per <a href="https://go.dev/doc/effective_go" target="_blank" rel="noopener"><em>Effective Go</em></a>, “focuses on simplicity, reliability, and efficiency”, and is “specifically designed to make it easy to build software at scale”.</p>



<p>In practice, Python often optimizes for the person writing the code, offering multiple ways to say the same thing. Go optimizes for the person (or, nowadays, possibly the agent) reading someone else’s code two years later, so it picks one way to say most things and makes you spell it out. The goal is for all Go code to look like other Go code.</p>



<p>We point this out right at the beginning, because however similar these two philosophies look, this difference in approach underlies almost all the other language design differences that follow.</p>



<h3 class="wp-block-heading">Ease of use and learning curve</h3>



<p>Python is arguably one of the easiest programming languages to learn among those widely used in production. The syntax resembles natural language, the core set of constructs is small, and beginners can focus on programming ideas instead of language mechanics, leading to less frustration and faster results. Surveys consistently show Python to be one of the most popular programming languages (if not <em>the</em> most popular). In 2026, 10% of Python developers have been coding for less than a year, 23% are students or working students, and 19% hold junior positions, showing the language has a strong early-stage user base.</p>



<p>Python’s popularity among early learners is almost self-perpetuating. Initially, the language was well-suited to introductory courses and learning materials largely because it lets beginners print “Hello, world” with little ceremony, bypassing much boring theory in favor of real outputs. It also has the added benefit of being a generalist language that can handle a variety of use cases. Later, the sheer number of introductory courses and learning materials made it a natural choice for anyone who wanted to pick up programming but didn’t know where to start.</p>



<p>It’s not the same case with Go. In fact, you would be hard-pressed to find courses that teach you programming through Go. There are two reasons for that. First, Go 1.0 was released in 2012, long after Python had already become firmly embedded in CS curricula. The other is that Go solves problems that beginners don’t have. Explicit error handling, static types, and interfaces, which we’ll discuss later, all pay off across a large codebase maintained by a team over years. Go also has a much narrower set of implementations than Python, which makes it even less appealing for beginners.</p>



<p>That said, Go was also designed to be easy to learn, but for a different reason: Any large team should be able to onboard a new engineer quickly. Many Go developers will say that if you already know general programming concepts, you can become productive in Go in a matter of days or weeks. Developers we talked to said that Go “feels as easy to write as Python” and that it “strikes a good balance between Python’s simplicity and Java’s explicit nature”.</p>



<h3 class="wp-block-heading">Syntax and readability</h3>



<p>When you read Python, you can often follow it even without programming experience, because it reads relatively close to English. Python is dynamically typed, so type declarations are optional, though in practice, many companies and large codebases now write Python with type hints throughout, checked by tools like <a href="https://github.com/python/mypy" target="_blank" rel="noopener">mypy</a> or <a href="https://github.com/microsoft/pyright" target="_blank" rel="noopener">Pyright</a>. Most of the ecosystem follows the formatting conventions set out in <a href="https://peps.python.org/pep-0008/" target="_blank" rel="noopener">PEP 8</a>, but they are still optional, and so some teams diverge from them.</p>



<p>Go, by contrast, is explicit and deliberately limited, which contributes to the cross-team readability we mentioned. It is statically typed, which makes it noticeably more verbose than Python. That was the main syntactic complaint raised by the developers we interviewed. Formatting in Go is not a matter of preference: <code>gofmt</code> will shape your code into the canonical form, whether you like the conventions or not.</p>



<p>One syntactic difference that developers consistently pointed out as a big adjustment when moving from Python to Go was error handling. Python lets you push failure handling to the edges of a function with <code>try / except</code>. Experienced Go developers clutch their pearls at the sight of that.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Python: handle failure where it is convenient
try:
    profile = get_user(user_id)
except UserNotFound:
    return render_404()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="golang" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Go: handle failure where it happens
profile, err := getUser(userID)
if err != nil {
    if _, ok := errors.AsType[*UserNotFoundError](err); ok {
        return render404(w)
    }
    return fmt.Errorf("get user %s: %w", userID, err)
}</pre>



<p>The Go version is longer, and in a large handler, developers will find themselves writing the <code>if err != nil</code> boilerplate <em>ad nauseam</em>. In return, they get control flow with no invisible jumps: Every path a value can take is explicit. Both approaches come with trade-offs.</p>



<h4 class="wp-block-heading">Type system</h4>



<p>Python&#8217;s dynamic typing checks types at runtime. This gives developers flexibility in writing and can speed up iteration, but it also means some type errors only show up when the code runs. The flexibility extends to the object model, which relies on duck typing: The code cares less about what an object is than what it can do. The developers we interviewed said they sorely missed duck typing, as it makes testing and mocking more difficult in Go.</p>



<p>Go checks types before the program runs. This results in fewer type-related failures reaching production and makes refactoring safer, but also causes code verbosity, as we touched on earlier.</p>



<h4 class="wp-block-heading">Object model and polymorphism</h4>



<p>Python is object-oriented in the way that most developers first learn the term. Everything is an object, and classes inherit from other classes (several at once, if you insist). Polymorphism works in two ways: down the class hierarchy when a subclass overrides its parent’s method, and sideways through duck typing, where anything with a <code>read()</code> method can be handed to code that expects a file.</p>



<p>Go has none of that hierarchy. There are no classes, no inheritance, and no way to declare that one type is a subtype of another. Instead, structs have methods attached to them, as well as interfaces that types satisfy implicitly without ever naming them.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Python: the implementation announces its role
class Store(ABC):
    @abstractmethod
    def get(self, key: str) -> bytes: ...

class RedisStore(Store):
    def get(self, key: str) -> bytes:
        ...</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="golang" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Go: the consumer declares what it needs; RedisStore never mentions Getter
type Getter interface {
    Get(key string) ([]byte, error)
}

func handleRead(g Getter, key string) ([]byte, error) {
    return g.Get(key)
}</pre>



<p>Notice how the dependency runs. In Python, <code>RedisStore</code> inherits from <code>Store</code>, so the abstraction sits with the implementation. In Go, <code>handleRead</code> declares the one method it actually calls, and <code>RedisStore</code> never learns that <code>Getter</code> exists. That’s why Go developers say to “accept interfaces, return structs”, and that’s why interfaces stay small – <code>io.Reader</code> and <code>io.Writer</code> have a single method each.</p>



<h3 class="wp-block-heading">Performance and speed</h3>



<p>Go follows a traditional compilation model, producing a native binary. Python, on the other hand, takes a hybrid approach: Source code is compiled to bytecode, which the interpreter then executes.</p>



<p>As most compiled languages do, Go wins in terms of raw speed. You can compare the patterns across latency, throughput, and startup time on <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/python3-go.html" target="_blank" rel="noopener">The Computer Language Benchmarks Game</a>. Microbenchmarks like these don’t really translate directly to real workloads, and we wouldn’t be surprised if you made nothing of them. Our interviewees told us what the difference meant in production for them: One team migrated to Go after cold starts on AWS Lambda in Python exceeded 10 seconds; another measured a tenfold improvement in request times after rewriting their Python service in Go.</p>



<p>But raw language speed matters only when your service is actually compute-bound or latency-sensitive, and plenty of services are neither. Equally importantly, the Python interpreter is not slow where it counts most for one of its largest user bases. In machine learning, data work, and numerical computing, libraries like NumPy and PyTorch offload expensive operations to optimized native code, making interpreter overhead much less relevant. When we asked migrating developers where they decided to keep Python code, they confidently listed all AI and ML workflows – LLMs, chatbots, RAGs, and model training.</p>



<h4 class="wp-block-heading">Memory management</h4>



<p>Memory management is another important part of the performance discussion. Both languages manage memory for you, but differently: Go uses a tracing garbage collector, while CPython uses reference counting alongside a cyclic garbage collector. This affects what developers can fine-tune and what they need to design around.</p>



<p>Go’s GC runs concurrently with the program and is designed to minimize stop-the-world pauses. Developers can tune this behavior: <code>GOGC</code> and <code>GOMEMLIMIT</code> set the pacing, and the memory profile (heap and allocs) tells you when a service allocates too hard.</p>



<p>In CPython, an object is typically freed the moment its last reference disappears. Memory use is predictable, and pauses are rarely worth measuring, but the cost is spread across every operation, and there’s little to room tune it.&nbsp;&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Concurrency and parallelism</h3>



<p>Even though both languages support concurrency, developers we talked to cited <em>better</em> concurrency as the reason why they switched from Python to Go.</p>



<p>Goroutines are central to Go’s design. They are lightweight threads managed by the runtime. They are cheap to create, carry little overhead, and scale to thousands of concurrent operations. The runtime handles the scheduling, which makes the model simpler than in Python – there is no separate <code>async/await</code> syntax, so a function is just a function. However, if you start to spawn goroutines without controlling their lifecycle, you’d better be ready to deal with race conditions, leaks, and deadlocks before long.</p>



<p>The other half of the concurrency model in Go are channels – typed conduits that pass values between goroutines and synchronize them. Instead of guarding shared state with a lock, Go can pass the value to whichever needs it next. A <code>select</code> statement waits on several channels at once, which is how Go expresses timeouts, cancellation, and fan-in using built-in language constructs. These very same primitives also produce common Go bugs: goroutine leaks and more deadlocks.&nbsp;</p>



<p>Meanwhile, Python relies on standard libraries, single-threaded event loops, and sub-processes to work around interpreter constraints. It offers <code>threading</code>, but in CPython, the global interpreter lock (GIL) has historically prevented threads from running Python bytecode simultaneously, making it ineffective for CPU-bound parallelism. For I/O-bound concurrency, there is <code>asyncio</code>, and for real parallelism there is <code>multiprocessing</code>, but that adds memory overhead and requires inter-process communication.</p>



<p>It’s worth noting that the <a href="https://blog.jetbrains.com/pycharm/2025/07/faster-python-unlocking-the-python-global-interpreter-lock/">GIL itself is no longer a necessity</a> – starting with Python 3.13, <a href="https://peps.python.org/pep-0703/" target="_blank" rel="noopener">PEP 703</a> introduced an officially supported free-threaded build, and 3.14 continues that work. Most production code still runs with the GIL in place, but with each new release, the claim that “Python can’t do real threading” is becoming less true.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Python: async/await, and the coloring that comes with it
async def fetch_all(urls):
    return await asyncio.gather(*(fetch(u) for u in urls))</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="golang" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Go: ordinary functions run concurrently
var wg sync.WaitGroup
for _, u := range urls {
    wg.Go(func() {
        fetch(u)
    })
}
wg.Wait()</pre>



<p>The approach to concurrency gives Go much of its practical advantage in high-throughput services, and having experienced both, our interviewees praised Go for being “async by default” and better suited for high-concurrency components, and they described it as having a superior concurrency model that’s highly performant and appealing for real-world use cases.</p>



<h3 class="wp-block-heading">Libraries, frameworks, and IDEs</h3>



<h4 class="wp-block-heading">Go’s self-contained ecosystem</h4>



<p>Go was never built as just a programming language, but as an ecosystem. As the Go team puts it, the goal was “an end-to-end platform with tooling all around the software development lifecycle” (<a href="https://developers.googleblog.com/why-go-is-an-ideal-language-for-ai-assisted-software-engineering/" target="_blank" rel="noopener">Google for Developers</a>), with formatters, test frameworks, dependency management, and security tools included in the toolchain, alongside a standard library that’s comprehensive enough to make external frameworks optional, if not irrelevant.</p>



<p>The Developer Ecosystem 2026 survey shows how successful the Go team has been in achieving that goal. For example, among Gophers, the standard <code>html/template</code> and <code>text/template</code> library packages are used by 31% and 22% of developers respectively, whereas the only other significant alternative – <code>templ</code> – is used by 11%.</p>



<p>Almost half of Gophers either don’t write unit tests or don’t use testing frameworks: 14% don’t write unit tests at all, and 35% don’t use frameworks for testing – the <code>testing</code> package provides everything they need in that regard. Others may also reach for tools such as Testify (31%) or GoMock (25%). The remaining libraries are far less popular.</p>



<p>For web development, 46% of developers use the standard <code>net/http</code> library, compared to 48% who use Gin. This proves that where a third-party framework exists, it doesn’t compete with the many other frameworks, but only with the standard library. Oftentimes, it loses.</p>



<div class="jb-pvg" data-jb-pvg-widget="group-go_ecosystem" data-jb-pvg-tabs>
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go developers</p>
<p class="jb-pvg-title">Libraries and frameworks Go developers use</p>
<div class="jb-pvg-tabs" role="tablist" aria-label="Libraries and frameworks Go developers use" hidden><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-go-ecosystem-tab-0" aria-controls="jb-pvg-go-ecosystem-panel-0" aria-selected="true">Template engines</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-go-ecosystem-tab-1" aria-controls="jb-pvg-go-ecosystem-panel-1" aria-selected="false">Testing</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-go-ecosystem-tab-2" aria-controls="jb-pvg-go-ecosystem-panel-2" aria-selected="false">Web frameworks</button></div>
<div class="jb-pvg-card" id="jb-pvg-go-ecosystem-panel-0" data-jb-pvg-card="go_templateengines">
<p class="jb-pvg-ctitle">Template engines used for Go development</p>
<p class="jb-pvg-q">Which template engines do you use for Go development, if any?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">None</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">52%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">html/template</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.587"></span><span class="jb-pvg-v">31%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">text/template</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.427"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">templ</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.207"></span><span class="jb-pvg-v">11%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">gomponents</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.091"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">pongo2</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.081"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Plush</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.026"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.035"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,529). Multiple answers allowed.</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-go-ecosystem-panel-1" data-jb-pvg-card="go_testing">
<p class="jb-pvg-ctitle">Testing frameworks and mock libraries in Go</p>
<p class="jb-pvg-q">Which testing frameworks or mock libraries do you regularly use, if any?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">I write unit tests but don’t use any frameworks</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">35%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Testify</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.883"></span><span class="jb-pvg-v">31%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GoMock</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.708"></span><span class="jb-pvg-v">25%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">I don’t write unit tests for Go</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.402"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Ginkgo</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.212"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">go-sqlmock</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.184"></span><span class="jb-pvg-v">6%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Godog</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.154"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Gomega</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.076"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GoConvey</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.025"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.065"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,518). Multiple answers allowed.</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-go-ecosystem-panel-2" data-jb-pvg-card="go_frameworks">
<p class="jb-pvg-ctitle">Go web frameworks in regular use</p>
<p class="jb-pvg-q">Which Go web frameworks do you regularly use, if any?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Gin</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">48%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">net/http</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.961"></span><span class="jb-pvg-v">46%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">gorilla/mux</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.314"></span><span class="jb-pvg-v">15%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">go-chi/chi</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.309"></span><span class="jb-pvg-v">15%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Echo</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.275"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Fiber</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.268"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">None</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.253"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Beego</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.1"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Buffalo</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.036"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Revel</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.021"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.103"></span><span class="jb-pvg-v">5%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,519). Multiple answers allowed.</p>
</div>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h4 class="wp-block-heading">Python’s broad ecosystem</h4>



<p>Python’s ecosystem works the other way around. The Python Package Index (<a href="https://pypi.org/" target="_blank" rel="noopener">PyPI</a>) is vast and mature, and where the standard library stops, several strong alternatives tend to compete.</p>



<p>Take web frameworks, for example. Half of Python developers use FastAPI, and Django (31%) competes closely with Flask (30%). The data science landscape is more fragmented, and developers use those libraries simultaneously: 69% use NumPy, 68% use pandas, 50% use PyTorch, 49% use Matplotlib, etc. With Python, there’s often no clear leader, and choosing the right framework or library is part of the job.</p>



<div class="jb-pvg" data-jb-pvg-widget="group-python_ecosystem" data-jb-pvg-tabs>
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Python developers</p>
<p class="jb-pvg-title">Frameworks and packages Python developers use</p>
<div class="jb-pvg-tabs" role="tablist" aria-label="Frameworks and packages Python developers use" hidden><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-python-ecosystem-tab-0" aria-controls="jb-pvg-python-ecosystem-panel-0" aria-selected="true">Web frameworks</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-python-ecosystem-tab-1" aria-controls="jb-pvg-python-ecosystem-panel-1" aria-selected="false">Data science</button></div>
<div class="jb-pvg-card" id="jb-pvg-python-ecosystem-panel-0" data-jb-pvg-card="python_web_libs">
<p class="jb-pvg-ctitle">Web frameworks used with Python</p>
<p class="jb-pvg-q">What web frameworks / libraries do you use in addition to Python?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">FastAPI</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:1"></span><span class="jb-pvg-v">50%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Django</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.627"></span><span class="jb-pvg-v">31%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Flask</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.603"></span><span class="jb-pvg-v">30%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">None</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.556"></span><span class="jb-pvg-v">28%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.058"></span><span class="jb-pvg-v">3%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,276). Multiple answers allowed.</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-python-ecosystem-panel-1" data-jb-pvg-card="python_other_libs" data-jb-pvg-collapsible data-jb-pvg-total="14">
<p class="jb-pvg-ctitle">Data science packages used with Python</p>
<p class="jb-pvg-q">What data science packages do you use in Python?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">NumPy</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:1"></span><span class="jb-pvg-v">69%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">pandas</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.981"></span><span class="jb-pvg-v">68%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">PyTorch</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.717"></span><span class="jb-pvg-v">49%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Matplotlib</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.703"></span><span class="jb-pvg-v">48%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">scikit-learn</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.508"></span><span class="jb-pvg-v">35%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">OpenCV</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.468"></span><span class="jb-pvg-v">32%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">TensorFlow</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.442"></span><span class="jb-pvg-v">30%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">SciPy</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.424"></span><span class="jb-pvg-v">29%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Seaborn</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.294"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Keras</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.212"></span><span class="jb-pvg-v">15%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m jb-pvg-x" role="listitem"><span class="jb-pvg-l">None</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.209"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">XGBoost</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.186"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Polars</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.117"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.015"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<button type="button" class="jb-pvg-toggle" aria-expanded="true" hidden>Show fewer options</button>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,277). Multiple answers allowed.</p>
</div>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h4 class="wp-block-heading">IDEs &amp; editors</h4>



<p>When it comes to editors, we see a similar pattern unfold. Go has an excellent language server, which makes general-purpose editors a viable alternative to a Go-specific IDE. When asked which IDEs or editors they use for Go development, 49% reported using GoLand, while 48% reported using VS Code.&nbsp;</p>



<div class="jb-pvg" data-jb-pvg-widget="go_ide">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go developers</p>
<p class="jb-pvg-title">IDEs and editors used for Go development</p>
<p class="jb-pvg-q">Which IDEs or editors do you use for Go development?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GoLand</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">49%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Visual Studio Code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.983"></span><span class="jb-pvg-v">48%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Zed</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.296"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Cursor</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.295"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Neovim</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.209"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">IntelliJ IDEA</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.161"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Vim</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.087"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Visual Studio</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.073"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Sublime Text</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.042"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Emacs</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.023"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Windsurf</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.023"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Atom</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b" style="--w:0.076"></span><span class="jb-pvg-v">4%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Go section (n = 1,529). Multiple answers allowed.</p>
</div>
</div>



<p>One reason is how much of Go’s surrounding ecosystem developers can access without having to assemble it themselves. GoLand installs with a test runner, debugger, coverage, and profilers wired into the toolchain. The analysis runs across the whole project, rather than only the open file. Interprocedural nil checks and unhandled-error inspections can catch the mistakes a Python developer might otherwise only see at runtime. Suffice it to say, <a href="https://x.com/GoLandIDE/status/2109662964403904589">Alan Donovan of the Go team has also described traditional IDEs like ours as setting “the gold standard” for refactoring</a> because of their tight integration between the analysis logic and the user interface.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/go/" class="btn" target="_blank" rel="noopener">Try GoLand</a>
                                                    </div>
    </div>







<div class="jb-pvg" data-jb-pvg-widget="python_ide">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Python developers</p>
<p class="jb-pvg-title">Main IDE or editor for Python development</p>
<p class="jb-pvg-q">Which IDE or editor do you use the most for Python development?</p>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Visual Studio Code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:1"></span><span class="jb-pvg-v">41%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">PyCharm</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.539"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Cursor</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.239"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">PyCharm Pro</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.199"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Jupyter Notebook</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.131"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Vim / Neovim</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.068"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">IntelliJ IDEA</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.068"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Zed</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.04"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Notepad++</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.037"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">IDLE</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.028"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Datalore</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.011"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Windsurf</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.009"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Emacs</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.007"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-b jb-pvg-bp" style="--w:0.045"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who answered the Python section (n = 4,276). One answer per respondent.</p>
</div>
</div>



<p>The Python side is more fragmented and has more Python-specific options, such as Jupyter Notebook and, of course, <a href="https://www.jetbrains.com/pycharm/" target="_blank" rel="noopener">PyCharm</a>. The latter is used by 30% of Python developers (PyCharm – 22%, PyCharm Pro – 8%), with VS Code at 41%. Notebooks explain much of the fragmentation, since data and service work don’t necessarily require the same toolset. Whatever you build in Python, PyCharm has first-class support for your stack, your frameworks, and your workflow – for web, data, and ML workflows – with notebooks running alongside a debugger and type checker. It parses your code and resolves usages, types, and dependencies throughout your entire project. So you always know exactly what your code does and what will break if it changes, for you and your agents alike.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/" class="btn" target="_blank" rel="noopener">Try PyCharm</a>
                                                    </div>
    </div>







<p>If you use both Go and Python – as a quarter of Gophers do – it’s worth noting that both GoLand and PyCharm are built on the same platform, so keymaps, shortcuts, and settings sync between them. GoLand also supports Python functionalities through the <a href="https://plugins.jetbrains.com/plugin/7322-python-community-edition" target="_blank" rel="noopener">Python Community Edition plugin</a>.</p>



<h2 class="wp-block-heading">Python vs Go – broader landscapes</h2>



<p>The language itself is one thing, but many other factors go into deciding which language you choose to work with. Developers consider what the languages are used for, who uses them, and how they’re maintained. In this section, we’ll provide insights on the factors that shape the broader landscapes of Python and Go.</p>



<h3 class="wp-block-heading">Go developers are more senior</h3>



<p>Across all questions about age, experience, and seniority in the Developer Ecosystem 2026 survey, Gophers tend to be further along in their career than Python developers.</p>



<p>On overall professional coding experience (not just experience in their main programming language), 20% of Go devs report 16 years or more, compared to 12% among Python developers. At the other end, 9% of Gophers have 1–2 years of experience, compared to 20% of Python developers.</p>



<p>Most Go professionals have senior roles, at 60%, with only 2% being trainees and 10% juniors. Meanwhile, 42% of Python professionals are seniors; trainees (6%) and juniors (19%) make up a quarter of the cohort.</p>



<p>72% of Go developers are employed full-time, compared to 51% of Python developers. Students and working students make up 8% of Gophers, compared to 23% of the Python population.</p>



<p>Finally, by age, the largest group of Go developers is aged 30–34 (23%), compared to Python’s largest group, aged 21–24 (22%).</p>



<p>These differences align with the point we made earlier: Python is a very popular first language for learners, while Go is almost never chosen as a first language and instead is picked up by more experienced developers later in their careers.</p>



<p>It’s important to keep this in mind as you read the following sections on developer demographics, because a lot of these numbers may look like differences between two languages, where in reality, they’re just differences between a senior population vs a general one that you would see regardless of what ecosystems you compare.</p>



<div class="jb-pvg" data-jb-pvg-widget="group-seniority" data-jb-pvg-tabs>
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Experience and seniority</p>
<div class="jb-pvg-tabs" role="tablist" aria-label="Experience and seniority" hidden><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-seniority-tab-0" aria-controls="jb-pvg-seniority-panel-0" aria-selected="true">Experience</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-seniority-tab-1" aria-controls="jb-pvg-seniority-panel-1" aria-selected="false">Position</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-seniority-tab-2" aria-controls="jb-pvg-seniority-panel-2" aria-selected="false">Employment</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-seniority-tab-3" aria-controls="jb-pvg-seniority-panel-3" aria-selected="false">Age</button></div>
<div class="jb-pvg-card" id="jb-pvg-seniority-panel-0" data-jb-pvg-card="code_yrs">
<p class="jb-pvg-ctitle">Professional coding experience</p>
<p class="jb-pvg-q">How many years of professional coding experience do you have?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Less than 1 year<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.084"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.362"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">1–2 years<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.313"></span><span class="jb-pvg-v">9%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.711"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">3–5 years</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.806"></span><span class="jb-pvg-v">22%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.89"></span><span class="jb-pvg-v">25%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">6–10 years<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">28%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.688"></span><span class="jb-pvg-v">19%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">11–15 years<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.629"></span><span class="jb-pvg-v">17%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.329"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">16+ years<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.733"></span><span class="jb-pvg-v">20%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.447"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">No professional coding experience<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.03"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.169"></span><span class="jb-pvg-v">5%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-seniority-panel-1" data-jb-pvg-card="position_level">
<p class="jb-pvg-ctitle">Position level</p>
<p class="jb-pvg-q">What is the level of your current position?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Trainee<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.032"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.103"></span><span class="jb-pvg-v">6%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Junior<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.16"></span><span class="jb-pvg-v">10%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.322"></span><span class="jb-pvg-v">19%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Middle<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.428"></span><span class="jb-pvg-v">26%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.497"></span><span class="jb-pvg-v">30%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Senior<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">60%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.689"></span><span class="jb-pvg-v">42%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.044"></span><span class="jb-pvg-v">3%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,531, Python n = 6,891. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-seniority-panel-2" data-jb-pvg-card="employment_status">
<p class="jb-pvg-ctitle">Employment status</p>
<p class="jb-pvg-q">Which of the following best describes your employment and involvement in software development?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Employed full-time<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">72%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.71"></span><span class="jb-pvg-v">51%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Employed part-time<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.029"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.045"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Self-employed or freelancer<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.132"></span><span class="jb-pvg-v">10%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.159"></span><span class="jb-pvg-v">11%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Founder or business owner</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.054"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.042"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Working student<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.056"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.122"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Student<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.061"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.197"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Not employed, with development experience</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.036"></span><span class="jb-pvg-v">3%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.046"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Learning as a hobby or career transition<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.018"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.058"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.008"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-seniority-panel-3" data-jb-pvg-card="age_range">
<p class="jb-pvg-ctitle">Age</p>
<p class="jb-pvg-q">What is your age range?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">18–20<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.162"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.397"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">21–24<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.571"></span><span class="jb-pvg-v">13%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.975"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">25–29</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.952"></span><span class="jb-pvg-v">22%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.919"></span><span class="jb-pvg-v">21%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">30–34<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">23%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.712"></span><span class="jb-pvg-v">16%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">35–39<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.765"></span><span class="jb-pvg-v">17%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.516"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">40–49<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.784"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.597"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">50–59<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.158"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.22"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">60 or older<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.013"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.069"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h3 class="wp-block-heading">Salary follows seniority</h3>



<p>Salary bands clearly show how experience affects other demographic data. Go developers are better represented in the top bracket: 9% report earning more than $180,000 a year, compared to 6% of Python programmers. Meanwhile, Python users cluster more in the lowest brackets.</p>



<div class="jb-pvg" data-jb-pvg-widget="salary_category">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Annual salary, USD</p>
<p class="jb-pvg-q">Salary bands in USD, converted from local currencies.</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 1,000<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.027"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 1,800</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.045"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.07"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 6,000<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.217"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.444"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 12,000<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.34"></span><span class="jb-pvg-v">6%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.471"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 18,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.353"></span><span class="jb-pvg-v">6%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.346"></span><span class="jb-pvg-v">6%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 24,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.3"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.402"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 36,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.697"></span><span class="jb-pvg-v">12%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.79"></span><span class="jb-pvg-v">14%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 48,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.64"></span><span class="jb-pvg-v">11%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.561"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 60,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.513"></span><span class="jb-pvg-v">9%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.473"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 84,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.727"></span><span class="jb-pvg-v">13%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.693"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 120,000<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">17%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.723"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Up to 180,000</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.485"></span><span class="jb-pvg-v">8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.475"></span><span class="jb-pvg-v">8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">More than 180,000<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.501"></span><span class="jb-pvg-v">9%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.344"></span><span class="jb-pvg-v">6%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,115, Python n = 5,004. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>



<p>However, if we look only at full-time developers, the differences are no longer statistically significant. The premium is attached to the seniority and employment status, not the primary language. In other words, learning Go itself will not guarantee you a higher salary, but the roles that require Go generally pay better.</p>



<h3 class="wp-block-heading">What they build</h3>



<p>The Developer Ecosystem survey also asks people what functionality their code implements.</p>



<p>Go developers more frequently reported:</p>



<ul class="wp-block-list">
<li>69% – providing APIs and services (Python – 41%)</li>



<li>63% – integrating with APIs and services (Python – 47%)</li>



<li>51% – application logic and workflows (Python – 37%)</li>



<li>47% – user interface (Python – 41%)</li>



<li>35% – libraries and frameworks (Python – 26%)</li>
</ul>



<p>Meanwhile, Python developers reported higher rates for:</p>



<ul class="wp-block-list">
<li>38% – data processing and analytics (Go – 30%)</li>



<li>36% – artificial intelligence and machine learning (Go – 20%)</li>



<li>32% – data science and data analytics (Go – 15%)</li>
</ul>



<p>The question of where their code is executed adds more context: A vast majority of Go developers target server, infrastructure, or cloud environments (74% compared to 57% of Python developers. On the other hand, 66% of Python developers target the desktop (Go – 47%).</p>



<p>Python is clearly a general-purpose language with a stronghold in AI, ML, and data work that favors local execution, while Go is heavily oriented towards networked services and infrastructure.</p>



<p>There is, however, a particularly interesting line item in the set: integration with AI. While AI development <em>per se</em> is a Python domain, integrations are not. 46% of Go developers report implementing AI integrations, against Python’s 44%, almost equal numbers. Asked about the types of development they do at work, 51% of Python developers reported working with AI and AI tools, compared to Go’s 48%. Go engineers may not train the models, but they are building AI-powered products at roughly the same rate as Python developers.</p>



<div class="jb-pvg" data-jb-pvg-widget="group-what_they_build" data-jb-pvg-tabs>
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">What Go and Python developers build</p>
<div class="jb-pvg-tabs" role="tablist" aria-label="What Go and Python developers build" hidden><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-what-they-build-tab-0" aria-controls="jb-pvg-what-they-build-panel-0" aria-selected="true">Functionality</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-what-they-build-tab-1" aria-controls="jb-pvg-what-they-build-panel-1" aria-selected="false">Platforms</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-what-they-build-tab-2" aria-controls="jb-pvg-what-they-build-panel-2" aria-selected="false">Development type</button></div>
<div class="jb-pvg-card" id="jb-pvg-what-they-build-panel-0" data-jb-pvg-card="functionality" data-jb-pvg-collapsible data-jb-pvg-total="20">
<p class="jb-pvg-ctitle">What their code implements</p>
<p class="jb-pvg-q">Which specific functionality does your code implement?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Integrating with APIs and services<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.925"></span><span class="jb-pvg-v">63%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.689"></span><span class="jb-pvg-v">47%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Providing APIs and services<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">69%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.602"></span><span class="jb-pvg-v">41%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Integration with AI</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.664"></span><span class="jb-pvg-v">46%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.636"></span><span class="jb-pvg-v">44%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">User interface<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.69"></span><span class="jb-pvg-v">47%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.597"></span><span class="jb-pvg-v">41%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Application logic and workflows<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.739"></span><span class="jb-pvg-v">51%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.536"></span><span class="jb-pvg-v">37%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Data processing and analytics<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.43"></span><span class="jb-pvg-v">30%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.56"></span><span class="jb-pvg-v">38%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Libraries / frameworks<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.508"></span><span class="jb-pvg-v">35%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.375"></span><span class="jb-pvg-v">26%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Artificial intelligence and machine learning<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.29"></span><span class="jb-pvg-v">20%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.52"></span><span class="jb-pvg-v">36%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">System tools and components<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.399"></span><span class="jb-pvg-v">27%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.283"></span><span class="jb-pvg-v">19%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Data science / data analytics<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.212"></span><span class="jb-pvg-v">15%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.462"></span><span class="jb-pvg-v">32%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Automating software testing and QA<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.339"></span><span class="jb-pvg-v">23%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.287"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Ad hoc scripts<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.267"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.218"></span><span class="jb-pvg-v">15%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Network communication protocols<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.276"></span><span class="jb-pvg-v">19%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.176"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Security, encryption, and cryptographic protocols<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.262"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.188"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Audio or video processing<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.121"></span><span class="jb-pvg-v">8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.15"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Hardware interfacing and control systems<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.114"></span><span class="jb-pvg-v">8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.151"></span><span class="jb-pvg-v">10%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Simulations and predictive modeling<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.075"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.136"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Rendering and processing graphics (2D/3D)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.068"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.107"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Blockchain technology</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.063"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.048"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Other<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.018"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<button type="button" class="jb-pvg-toggle" aria-expanded="true" hidden>Show fewer options</button>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-what-they-build-panel-1" data-jb-pvg-card="platform">
<p class="jb-pvg-ctitle">Where their code runs</p>
<p class="jb-pvg-q">On which platforms is your code executed?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Server / infrastructure / cloud<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">74%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.775"></span><span class="jb-pvg-v">57%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Browser<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.853"></span><span class="jb-pvg-v">63%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.771"></span><span class="jb-pvg-v">57%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Desktop<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.641"></span><span class="jb-pvg-v">47%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.887"></span><span class="jb-pvg-v">66%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Mobile<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.436"></span><span class="jb-pvg-v">32%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.355"></span><span class="jb-pvg-v">26%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">IoT / embedded</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.151"></span><span class="jb-pvg-v">11%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.168"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">WebAssembly<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.089"></span><span class="jb-pvg-v">7%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.063"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Game consoles<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.022"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.01"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-what-they-build-panel-2" data-jb-pvg-card="development_type">
<p class="jb-pvg-ctitle">Types of development at work</p>
<p class="jb-pvg-q">Which types of development are you involved in at work?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Backend<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">77%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.704"></span><span class="jb-pvg-v">54%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Full-stack<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.712"></span><span class="jb-pvg-v">55%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.571"></span><span class="jb-pvg-v">44%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">AI and AI tools</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.62"></span><span class="jb-pvg-v">48%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.658"></span><span class="jb-pvg-v">51%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Infrastructure / DevOps<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.583"></span><span class="jb-pvg-v">45%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.397"></span><span class="jb-pvg-v">31%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Frontend<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.511"></span><span class="jb-pvg-v">39%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.451"></span><span class="jb-pvg-v">35%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Automated test</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.29"></span><span class="jb-pvg-v">22%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.264"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Data science and ML<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.137"></span><span class="jb-pvg-v">11%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.356"></span><span class="jb-pvg-v">27%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Desktop</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.228"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.246"></span><span class="jb-pvg-v">19%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Mobile</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.233"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.206"></span><span class="jb-pvg-v">16%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Embedded and IoT</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.096"></span><span class="jb-pvg-v">7%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.118"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Games</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.061"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.048"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">I don’t develop software professionally<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.017"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.079"></span><span class="jb-pvg-v">6%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.008"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.011"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,595, Python n = 7,427. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h4 class="wp-block-heading">DevOps: Same job, different toolbox</h4>



<p>One other point of convergence between Python and Go developers that deserves its own section is DevOps. Both groups are involved in that area, though Python developers (31%) somewhat less than Gophers (45%). The two groups also tend to use different tools.</p>



<ul class="wp-block-list">
<li>For <strong>orchestration</strong>, Go developers are more likely to use tooling overall, and especially Kubernetes. Only 8% of Go developers don’t use container orchestration tools (compared to 17% for Python); 58% use Kubernetes (compared to 39%). The engineers we talked to cited Go’s deep integration with Kubernetes as one of the reasons they migrate entire services from Python to Go.</li>



<li>For <strong>configuration management</strong>, Terraform leads both groups. However, Python developers lean more toward cloud-native IaC tools (29% for Python, 23% for Go) or use nothing (21% for Python, 15% for Go), while Go developers choose GitOps more often (27% for Go, 21% for Python).</li>



<li>When it comes to <strong>DevOps practices</strong>, Go developers report using them more often overall, with one exception: AI-driven operations (12% of Go developers and 18% of Python developers). Python developers are also more likely to use no DevOps practices at all (6% for Python, 2% for Go).</li>
</ul>



<p>So even if you move from Python to Go in the same type of role, the toolset change might be as big an adjustment as the language change itself.</p>



<div class="jb-pvg" data-jb-pvg-widget="group-devops" data-jb-pvg-tabs>
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">DevOps tools and practices</p>
<div class="jb-pvg-tabs" role="tablist" aria-label="DevOps tools and practices" hidden><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-devops-tab-0" aria-controls="jb-pvg-devops-panel-0" aria-selected="true">Orchestration</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-devops-tab-1" aria-controls="jb-pvg-devops-panel-1" aria-selected="false">Config management</button><button type="button" class="jb-pvg-tab" role="tab" id="jb-pvg-devops-tab-2" aria-controls="jb-pvg-devops-panel-2" aria-selected="false">Practices</button></div>
<div class="jb-pvg-card" id="jb-pvg-devops-panel-0" data-jb-pvg-card="devops_container_orchestration">
<p class="jb-pvg-ctitle">Container orchestration tools</p>
<p class="jb-pvg-q">Which container orchestration tools or services do you use?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Docker Compose</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">68%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.959"></span><span class="jb-pvg-v">65%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Kubernetes (incl. EKS, GKE, or AKS)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.854"></span><span class="jb-pvg-v">58%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.573"></span><span class="jb-pvg-v">39%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Amazon ECS</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.21"></span><span class="jb-pvg-v">14%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.199"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">I don’t use any such tools or services<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.112"></span><span class="jb-pvg-v">8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.248"></span><span class="jb-pvg-v">17%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Docker Swarm</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.12"></span><span class="jb-pvg-v">8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.105"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">OpenShift<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.031"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.06"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">HashiCorp Nomad</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.029"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.021"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Apache Mesos<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.026"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.021"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.013"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,435, Python n = 7,242. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-devops-panel-1" data-jb-pvg-card="devops_conf_management">
<p class="jb-pvg-ctitle">Configuration management and IaC tools</p>
<p class="jb-pvg-q">Which configuration management or IaC tools do you use?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Terraform<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">47%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.782"></span><span class="jb-pvg-v">37%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Cloud-native IaC tools (CloudFormation/CDK, ARM/Bicep, etc.)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.479"></span><span class="jb-pvg-v">23%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.606"></span><span class="jb-pvg-v">29%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GitOps<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.567"></span><span class="jb-pvg-v">27%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.436"></span><span class="jb-pvg-v">21%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Custom scripts or in-house solutions</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.459"></span><span class="jb-pvg-v">22%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.462"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Ansible</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.447"></span><span class="jb-pvg-v">21%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.464"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">I don’t use any such tools<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.317"></span><span class="jb-pvg-v">15%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.435"></span><span class="jb-pvg-v">21%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Puppet, Chef, SaltStack, or similar</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.083"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.1"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Pulumi</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.07"></span><span class="jb-pvg-v">3%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.064"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.044"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.048"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 930, Python n = 3,109. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<div class="jb-pvg-card" id="jb-pvg-devops-panel-2" data-jb-pvg-card="devops_practices_used">
<p class="jb-pvg-ctitle">DevOps practices in use</p>
<p class="jb-pvg-q">Which of the following DevOps practices do you or your team currently use?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">CI/CD pipelines<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">88%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.942"></span><span class="jb-pvg-v">83%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Containerization and orchestration<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.689"></span><span class="jb-pvg-v">61%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.598"></span><span class="jb-pvg-v">52%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Infrastructure as code (IaC)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.566"></span><span class="jb-pvg-v">50%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.482"></span><span class="jb-pvg-v">42%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GitOps<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.413"></span><span class="jb-pvg-v">36%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.299"></span><span class="jb-pvg-v">26%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Platform engineering<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.288"></span><span class="jb-pvg-v">25%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.209"></span><span class="jb-pvg-v">18%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">DevSecOps</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.223"></span><span class="jb-pvg-v">20%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.224"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">AI-driven operations<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.139"></span><span class="jb-pvg-v">12%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.209"></span><span class="jb-pvg-v">18%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Serverless (FaaS), multi-cloud, or hybrid cloud</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.191"></span><span class="jb-pvg-v">17%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.153"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">We don’t use any DevOps practices<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.028"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.074"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.006"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 930, Python n = 3,110. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h3 class="wp-block-heading">Operating systems</h3>



<p>A curious difference surfaced when we asked developers about the operating system they use for their development environment. Go developers work on macOS (70%) and Linux (57%) significantly more than on Windows (44%). Meanwhile, Python developers use Windows first (66%), then split almost evenly between macOS (54%) and Linux (52%).</p>



<p>For developers planning to migrate to Go, sticking with Windows doesn’t have to complicate deployment, even when the target is a Linux server. For pure Go, building a Linux binary from any of the three operating systems takes no more than two environment variables, while a Python deployment still has to find a matching interpreter and native packages, wherever it ends up.</p>



<div class="jb-pvg" data-jb-pvg-widget="os_devenv">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Operating systems for development environments</p>
<p class="jb-pvg-q">On which operating systems are your development environments?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">macOS<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">70%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.763"></span><span class="jb-pvg-v">54%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Windows<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.623"></span><span class="jb-pvg-v">44%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.942"></span><span class="jb-pvg-v">66%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Linux<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.81"></span><span class="jb-pvg-v">57%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.743"></span><span class="jb-pvg-v">52%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.009"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,298. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>



<h3 class="wp-block-heading">Two different approaches to AI</h3>



<p>We’ve already discussed using Python and Go for AI development, but what about using AI for Go and Python development? Both groups use AI heavily at work, but there’s a difference in how and what they use it for.</p>



<p>Go developers report using AI daily for tasks such as editing code across multiple files (60% vs 52%), agentic development of features or programs (51% vs 41%),&nbsp; generating commit messages (51% vs 36%) and tests (47% vs 34%), or performing code reviews (39% vs 34%).</p>



<p>Meanwhile, Python developers lead on one task: learning new things about coding and software development (38% of Python developers vs 31% of Go developers), which is consistent with earlier data showing a larger early-career population among Python developers.</p>



<p>There is, however, a long list of tasks where the two groups are indistinguishable: refactoring, debugging, checking code for potential issues, asking general questions, or generating boilerplate – even though you’d expect Go developers to jump on the last one much more, considering the verbosity of the language.</p>



<div class="jb-pvg" data-jb-pvg-widget="ai_coding_tasks_freq" data-jb-pvg-collapsible data-jb-pvg-total="23">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Tasks they use AI tools for every day</p>
<p class="jb-pvg-q">How often do you use AI tools for each of the following tasks at work? Share answering “Every day”.</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Generating code<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">69%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.927"></span><span class="jb-pvg-v">64%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Editing code across multiple files<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.866"></span><span class="jb-pvg-v">60%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.744"></span><span class="jb-pvg-v">52%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Code completion<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.797"></span><span class="jb-pvg-v">55%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.729"></span><span class="jb-pvg-v">51%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Agentic development of features or programs<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.729"></span><span class="jb-pvg-v">51%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.594"></span><span class="jb-pvg-v">41%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Generating boilerplate, repetitive code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.645"></span><span class="jb-pvg-v">45%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.657"></span><span class="jb-pvg-v">46%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Asking questions about software development</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.645"></span><span class="jb-pvg-v">45%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.653"></span><span class="jb-pvg-v">45%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Generating code comments or documentation<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.686"></span><span class="jb-pvg-v">48%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.605"></span><span class="jb-pvg-v">42%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Generating commit messages<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.742"></span><span class="jb-pvg-v">51%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.523"></span><span class="jb-pvg-v">36%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Explaining bugs and offering fixes</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.583"></span><span class="jb-pvg-v">40%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.644"></span><span class="jb-pvg-v">45%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Generating tests<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.671"></span><span class="jb-pvg-v">47%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.489"></span><span class="jb-pvg-v">34%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Improving or optimizing code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.573"></span><span class="jb-pvg-v">40%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.577"></span><span class="jb-pvg-v">40%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Checking code for potential issues</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.565"></span><span class="jb-pvg-v">39%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.584"></span><span class="jb-pvg-v">41%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Performing code reviews<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.568"></span><span class="jb-pvg-v">39%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.489"></span><span class="jb-pvg-v">34%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Explaining code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.535"></span><span class="jb-pvg-v">37%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.517"></span><span class="jb-pvg-v">36%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Brainstorming new ideas</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.502"></span><span class="jb-pvg-v">35%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.543"></span><span class="jb-pvg-v">38%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Learning new things about coding<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.441"></span><span class="jb-pvg-v">31%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.553"></span><span class="jb-pvg-v">38%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Summarizing recent code changes</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.497"></span><span class="jb-pvg-v">34%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.485"></span><span class="jb-pvg-v">34%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Debugging code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.468"></span><span class="jb-pvg-v">32%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.51"></span><span class="jb-pvg-v">35%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Generating user documentation</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.46"></span><span class="jb-pvg-v">32%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.402"></span><span class="jb-pvg-v">28%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Natural-language search for code fragments</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.445"></span><span class="jb-pvg-v">31%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.386"></span><span class="jb-pvg-v">27%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Generating internal documentation</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.397"></span><span class="jb-pvg-v">28%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.35"></span><span class="jb-pvg-v">24%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Refactoring code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.323"></span><span class="jb-pvg-v">22%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.321"></span><span class="jb-pvg-v">22%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Converting code to other languages</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.163"></span><span class="jb-pvg-v">11%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.186"></span><span class="jb-pvg-v">13%</span></span></span></div>
</div>
<button type="button" class="jb-pvg-toggle" aria-expanded="true" hidden>Show fewer options</button>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Respondents who rated these tasks (Go n = 993, Python n = 5,056); bases vary slightly by task. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<p>So AI-assisted coding is common in both ecosystems. Go developers have simply wired it into the production chores of a maintenance-heavy codebase: commits, tests, reviews, and multi-file edits.</p>



<p>The groups also tend to use different tools. Go developers are more likely to use terminal and agentic tools like Claude Code (45% vs 40%), OpenAI Codex (24% vs 17%), Cursor (17% vs 12%), and OpenCode (12% vs 6%). Python developers, in turn, reach more for general-purpose assistants and Google or Microsoft surfaces like ChatGPT (20% vs 16%), Google Antigravity (9% vs 5%), and Microsoft 365 Copilot (4% vs 1%).</p>



<div class="jb-pvg" data-jb-pvg-widget="workusage_ai_coding" data-jb-pvg-collapsible data-jb-pvg-total="44">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">AI tools used for coding at work</p>
<p class="jb-pvg-q">Which of these AI tools do you use for your coding and other development-related tasks at work?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Claude Code<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">45%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.891"></span><span class="jb-pvg-v">40%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">OpenAI Codex<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.531"></span><span class="jb-pvg-v">24%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.384"></span><span class="jb-pvg-v">17%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">GitHub Copilot</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.404"></span><span class="jb-pvg-v">18%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.416"></span><span class="jb-pvg-v">19%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">ChatGPT (web, desktop, or mobile app)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.349"></span><span class="jb-pvg-v">16%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.451"></span><span class="jb-pvg-v">20%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Claude (web, desktop, or mobile app)</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.367"></span><span class="jb-pvg-v">16%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.378"></span><span class="jb-pvg-v">17%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Cursor<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.386"></span><span class="jb-pvg-v">17%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.275"></span><span class="jb-pvg-v">12%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">OpenCode<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.264"></span><span class="jb-pvg-v">12%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.139"></span><span class="jb-pvg-v">6%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Google Antigravity<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.121"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.194"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Google Gemini (web or mobile app)</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.144"></span><span class="jb-pvg-v">6%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.152"></span><span class="jb-pvg-v">7%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">JetBrains AI Assistant<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.154"></span><span class="jb-pvg-v">7%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.107"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">DeepSeek (apps or self-hosted)</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.106"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.1"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">CodeGPT plugin in VS Code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.107"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.074"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Zed<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.118"></span><span class="jb-pvg-v">5%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.051"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Gemini CLI<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.055"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.085"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">JetBrains Junie<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.088"></span><span class="jb-pvg-v">4%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.047"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Microsoft 365 Copilot<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.023"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.095"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Trae</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.055"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.035"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Gemini Code Assist</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.031"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.049"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">CodeRabbit<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.047"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.015"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Google AI Studio<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.011"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.05"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Perplexity</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.025"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">TONGYI Lingma</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.039"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.02"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Windsurf</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.029"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.026"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Qwen Code</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.018"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Amazon Q Developer</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.02"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.031"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">OpenClaw<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.014"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.03"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">JetBrains Air</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.028"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.011"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Devin</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.022"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.013"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Gemini in Android Studio<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.024"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Warp / Oz</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.01"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.019"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Cline<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.023"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m jb-pvg-x" role="listitem"><span class="jb-pvg-l">None</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.004"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.012"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Conductor</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.014"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Amp</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Factory</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.008"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">BLACKBOX AI<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.007"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Google Jules</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">GitHub Agent HQ</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Tabnine</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">GitLab Duo Agent Platform</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Superset</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Graphite</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Ona (previously Gitpod)</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.041"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.031"></span><span class="jb-pvg-v">1%</span></span></span></div>
</div>
<button type="button" class="jb-pvg-toggle" aria-expanded="true" hidden>Show fewer options</button>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,482, Python n = 6,747. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h3 class="wp-block-heading">One number that has to change</h3>



<p>Software development remains a heavily male-dominated field, and the gap is particularly pronounced in Go, which – as it’s typically people’s second language – inherits whatever the pipeline hands it and exacerbates it further. In our sample, only 1.8% of Go developers identify as female, compared to 5.8% of Python developers.</p>



<div class="jb-pvg" data-jb-pvg-widget="gender">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Gender</p>
<p class="jb-pvg-q">What is your gender?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Male<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">95.8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.947"></span><span class="jb-pvg-v">90.8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Female<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.019"></span><span class="jb-pvg-v">1.8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.06"></span><span class="jb-pvg-v">5.8%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Non-binary, genderqueer, or gender non-conforming<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.007"></span><span class="jb-pvg-v">0.6%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.012"></span><span class="jb-pvg-v">1.2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">Prefer not to say</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.018"></span><span class="jb-pvg-v">1.8%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.023"></span><span class="jb-pvg-v">2.2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Other<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.001"></span><span class="jb-pvg-v">0.1%</span></span></span></div>
</div>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,833, Python n = 11,284. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
</div>



<h2 class="wp-block-heading">Transitioning from Python to Go</h2>



<h3 class="wp-block-heading">One-way path well traveled</h3>



<p>You may ask why we’re focusing on transitioning from Python to Go, not the other way around. The data leaves little doubt about the path developers are taking. Python is already the most common second language among Go developers – 35% of Gophers declare it as their other primary language. But most Go developers (70%) say they have no intention of adopting another language in the next 12 months, and if they do, they name Rust (16%), rather than Python (2%). On the other hand, 10% of Python developers (a much larger cohort in terms of absolute numbers) plan to pick up Go, roughly 5.5 times the rate at which Go developers plan to pick up Python.</p>



<div class="jb-pvg" data-jb-pvg-widget="adopt_proglang" data-jb-pvg-collapsible data-jb-pvg-total="39">
<style>.jb-pvg{--jb-pvg-go:#007d9c;--jb-pvg-py:#6b57ff;--jb-pvg-t:#19191c;--jb-pvg-mu:#6b6b73;--jb-pvg-li:#d9d9e3;color:var(--jb-pvg-t);font:inherit;margin:32px 0}.jb-pvg *{box-sizing:border-box}.jb-pvg-panel{background:#fff;border:1px solid var(--jb-pvg-li);border-radius:8px;padding:24px}.jb-pvg .jb-pvg-eyebrow{color:var(--jb-pvg-mu);font-size:12px;font-weight:700;letter-spacing:.08em;line-height:1.4;margin:0 0 6px;text-transform:uppercase}.jb-pvg .jb-pvg-title{color:var(--jb-pvg-t);font-size:20px;font-weight:700;line-height:1.3;margin:0}.jb-pvg .jb-pvg-q{color:var(--jb-pvg-mu);font-size:14px;line-height:1.5;margin:6px 0 0}.jb-pvg-legend{display:flex;flex-wrap:wrap;gap:6px 18px;margin:16px 0 0;color:var(--jb-pvg-mu);font-size:13px;line-height:1.4}.jb-pvg-key{display:inline-flex;align-items:center;gap:6px}.jb-pvg-key:before{content:"";display:inline-block;width:12px;height:12px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-key-py:before{background:var(--jb-pvg-py)}.jb-pvg-rows{margin:12px 0 0;padding:0}.jb-pvg-r{display:grid;grid-template-columns:minmax(0,38%) minmax(0,1fr);gap:4px 16px;align-items:center;padding:7px 0;border-top:1px solid #ececf2}.jb-pvg-r:first-child{border-top:0}.jb-pvg-l{min-width:0;font-size:14px;line-height:1.35;overflow-wrap:anywhere}.jb-pvg-m .jb-pvg-l{color:var(--jb-pvg-mu)}.jb-pvg-s{color:var(--jb-pvg-mu);margin-left:2px}.jb-pvg-bs{display:grid;gap:3px;min-width:0}.jb-pvg-ln{display:flex;align-items:center;gap:8px;min-width:0}.jb-pvg-b{display:block;flex:none;width:calc((100% - 56px) * var(--w));height:10px;min-width:2px;border-radius:2px;background:var(--jb-pvg-go)}.jb-pvg-bp{background:var(--jb-pvg-py)}.jb-pvg-z{min-width:0}.jb-pvg-m .jb-pvg-b{opacity:.5}.jb-pvg-v{flex:none;min-width:44px;font-size:13px;line-height:1.2;font-variant-numeric:tabular-nums;white-space:nowrap}.jb-pvg-sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.jb-pvg-collapsed .jb-pvg-x{display:none}.jb-pvg .jb-pvg-toggle{display:inline-block;margin:12px 0 0;padding:6px 12px;background:#fff;border:1px solid var(--jb-pvg-li);border-radius:6px;color:var(--jb-pvg-t);font:inherit;font-size:13px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-toggle[hidden]{display:none}.jb-pvg .jb-pvg-toggle:hover{border-color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-toggle:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:2px}.jb-pvg .jb-pvg-note{color:var(--jb-pvg-mu);font-size:12.5px;line-height:1.5;margin:14px 0 0}@media (max-width:560px){.jb-pvg-panel{padding:18px}.jb-pvg-r{grid-template-columns:minmax(0,1fr)}.jb-pvg .jb-pvg-title{font-size:18px}}.jb-pvg .jb-pvg-tabs{display:flex;flex-wrap:wrap;gap:2px 4px;margin:16px 0 0;padding:0;border-bottom:1px solid var(--jb-pvg-li)}.jb-pvg .jb-pvg-tabs[hidden]{display:none}.jb-pvg .jb-pvg-tab{margin:0 0 -1px;padding:8px 12px;background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--jb-pvg-mu);font:inherit;font-size:14px;line-height:1.4;cursor:pointer}.jb-pvg .jb-pvg-tab:hover{color:var(--jb-pvg-t)}.jb-pvg .jb-pvg-tab[aria-selected="true"]{color:var(--jb-pvg-t);border-bottom-color:var(--jb-pvg-t);font-weight:700}.jb-pvg .jb-pvg-tab:focus-visible{outline:2px solid var(--jb-pvg-py);outline-offset:-2px}.jb-pvg-card+.jb-pvg-card{margin-top:24px;padding-top:8px;border-top:1px solid var(--jb-pvg-li)}.jb-pvg-tabbed .jb-pvg-card+.jb-pvg-card{margin-top:0;padding-top:0;border-top:0}.jb-pvg-card[hidden]{display:none}.jb-pvg .jb-pvg-ctitle{color:var(--jb-pvg-t);font-size:16px;font-weight:700;line-height:1.35;margin:16px 0 0}@media (max-width:560px){.jb-pvg .jb-pvg-tab{padding:8px 10px;font-size:13px}}</style>
<div class="jb-pvg-panel">
<p class="jb-pvg-eyebrow">Go vs Python developers</p>
<p class="jb-pvg-title">Languages they plan to adopt in the next 12 months</p>
<p class="jb-pvg-q">Do you plan to adopt or migrate to other languages in the next 12 months? If so, which ones?</p>
<div class="jb-pvg-legend" aria-hidden="true"><span class="jb-pvg-key jb-pvg-key-go">Go</span><span class="jb-pvg-key jb-pvg-key-py">Python</span></div>
<div class="jb-pvg-rows" role="list">
<div class="jb-pvg-r jb-pvg-m" role="listitem"><span class="jb-pvg-l">Not planning to adopt any other language<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:1"></span><span class="jb-pvg-v">70%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.869"></span><span class="jb-pvg-v">61%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Rust<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.223"></span><span class="jb-pvg-v">16%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.183"></span><span class="jb-pvg-v">13%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Go<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">n/a</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.134"></span><span class="jb-pvg-v">9%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">C++<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.045"></span><span class="jb-pvg-v">3%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.078"></span><span class="jb-pvg-v">5%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Java<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.06"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Swift<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.058"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">TypeScript<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.031"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.057"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Kotlin<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.032"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.052"></span><span class="jb-pvg-v">4%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">C#<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.022"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.046"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">JavaScript<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.014"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.049"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">C</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.023"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.034"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">SQL<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.014"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.038"></span><span class="jb-pvg-v">3%</span></span></span></div>
<div class="jb-pvg-r" role="listitem"><span class="jb-pvg-l">Python<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.023"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">n/a</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Ruby</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.017"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.026"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Shell scripting languages<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.013"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.029"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">PHP</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.014"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.021"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Elixir</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.022"></span><span class="jb-pvg-v">2%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.012"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Dart</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.012"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.018"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">R<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.004"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.025"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">HTML / CSS<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.024"></span><span class="jb-pvg-v">2%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Lua</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.012"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.012"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Assembly<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.017"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Scala</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.011"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.011"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">MATLAB<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.019"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Haskell</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.009"></span><span class="jb-pvg-v">1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Julia<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.011"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Visual Basic<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.01"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Platform-specific language (Apex, ABAP, 1C, etc.)<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.007"></span><span class="jb-pvg-v">1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Perl</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">COBOL<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Groovy</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Objective-C<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.006"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">LabVIEW<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">F#</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Delphi<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.005"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Clojure / ClojureScript<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.004"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">CoffeeScript<span class="jb-pvg-s">*</span></span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b jb-pvg-z" style="--w:0"></span><span class="jb-pvg-v">0%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.003"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Ada</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.001"></span><span class="jb-pvg-v">&lt;1%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.002"></span><span class="jb-pvg-v">&lt;1%</span></span></span></div>
<div class="jb-pvg-r jb-pvg-x" role="listitem"><span class="jb-pvg-l">Other</span><span class="jb-pvg-bs"><span class="jb-pvg-ln"><span class="jb-pvg-sr">Go </span><span class="jb-pvg-b" style="--w:0.047"></span><span class="jb-pvg-v">3%</span></span><span class="jb-pvg-ln"><span class="jb-pvg-sr">Python </span><span class="jb-pvg-b jb-pvg-bp" style="--w:0.031"></span><span class="jb-pvg-v">2%</span></span></span></div>
</div>
<button type="button" class="jb-pvg-toggle" aria-expanded="true" hidden>Show fewer options</button>
<p class="jb-pvg-note">Source: JetBrains Developer Ecosystem Survey 2026, weighted data. Base: Go n = 1,836, Python n = 11,295. Go and Python developers are respondents who selected the language among their primary languages; those who selected both are counted in both groups. Multiple answers allowed. n/a: respondents already use this language as a primary one. * Statistically significant difference (p &lt; 0.05, adjusted).</p>
</div>
<script>
(function () {
  var i;
  var lists = document.querySelectorAll("[data-jb-pvg-collapsible]");
  for (i = 0; i < lists.length; i++) { collapsible(lists[i]); }
  var groups = document.querySelectorAll("[data-jb-pvg-tabs]");
  for (i = 0; i < groups.length; i++) { tabs(groups[i]); }
  function collapsible(w) {
    if (w.getAttribute("data-jb-pvg-ready") === "1") { return; }
    var btn = w.querySelector(".jb-pvg-toggle");
    if (!btn) { return; }
    if (!w.classList) { return; }
    if (!btn.addEventListener) { return; }
    w.setAttribute("data-jb-pvg-ready", "1");
    var more = "Show all " + w.getAttribute("data-jb-pvg-total") + " options";
    w.classList.add("jb-pvg-collapsed");
    btn.textContent = more;
    btn.setAttribute("aria-expanded", "false");
    btn.hidden = false;
    btn.addEventListener("click", function () {
      var collapsed = w.classList.toggle("jb-pvg-collapsed");
      btn.setAttribute("aria-expanded", collapsed ? "false" : "true");
      btn.textContent = collapsed ? more : "Show fewer options";
    });
  }
  function tabs(w) {
    if (w.getAttribute("data-jb-pvg-tabs-ready") === "1") { return; }
    var list = w.querySelector(".jb-pvg-tabs");
    if (!list) { return; }
    if (!w.classList) { return; }
    if (!list.addEventListener) { return; }
    var btns = list.querySelectorAll(".jb-pvg-tab");
    var panels = w.querySelectorAll(".jb-pvg-card");
    if (btns.length !== panels.length) { return; }
    w.setAttribute("data-jb-pvg-tabs-ready", "1");
    var k;
    for (k = 0; k < panels.length; k++) {
      panels[k].setAttribute("role", "tabpanel");
      panels[k].setAttribute("aria-labelledby", btns[k].id);
      panels[k].setAttribute("tabindex", "0");
      bind(k);
    }
    function select(n, focus) {
      var j;
      for (j = 0; j < btns.length; j++) {
        var on = j === n;
        btns[j].setAttribute("aria-selected", on ? "true" : "false");
        btns[j].setAttribute("tabindex", on ? "0" : "-1");
        panels[j].hidden = !on;
      }
      if (focus) { btns[n].focus(); }
    }
    function bind(n) {
      btns[n].addEventListener("click", function () { select(n, false); });
      btns[n].addEventListener("keydown", function (e) {
        var c = btns.length;
        var t = -1;
        if (e.key === "ArrowRight") { t = (n + 1) % c; }
        if (e.key === "ArrowLeft") { t = (n - 1 + c) % c; }
        if (e.key === "Home") { t = 0; }
        if (e.key === "End") { t = c - 1; }
        if (t < 0) { return; }
        e.preventDefault();
        select(t, true);
      });
    }
    w.classList.add("jb-pvg-tabbed");
    list.hidden = false;
    select(0, false);
  }
}());
</script>
</div>



<h3 class="wp-block-heading">Why make the switch from Python to Go?</h3>



<p>Despite working in different roles and on different products, the developers we interviewed gave consistent reasons for transitioning from Python to Go. These were:</p>



<ul class="wp-block-list">
<li>Better <strong>performance and speed,</strong> including cold starts, latency, and operating cost.</li>



<li>Easier and more effective <strong>concurrency model</strong>.</li>



<li><strong>Type safety</strong> that catches failures that would otherwise reach production at compile time.</li>



<li><strong>Proximity to the platform</strong>, since Kubernetes and much of the cloud-native toolchain are written in Go, so teams working on that infrastructure already interact with Go daily.</li>
</ul>



<h3 class="wp-block-heading">What they gained and what they lost</h3>



<p>Perceived potential gains are one thing, but did Go actually deliver? According to the developers we interviewed, it did in the areas described above. But they also found benefits they weren’t expecting: predictable formatting and linting that contributed to “clean code”, out-of-the-box tooling, and simplicity comparable to Python’s.</p>



<p>But Go also has flaws that are obvious to developers coming from Python. Just like the reasons for adopting Go were consistent, so were the complaints:</p>



<ul class="wp-block-list">
<li>Explicit <strong>error handling</strong> that’s fundamentally different from Python, less intuitive, and more repetitive.</li>



<li>Overall <strong>verbosity and opinionatedness,</strong> with more lines needed to convey the same behavior and fewer ways to express it.</li>



<li><strong>An object model</strong> that makes testing and mocking noticeably more difficult.</li>



<li><strong>Library gaps</strong>, especially for testing.</li>
</ul>



<h3 class="wp-block-heading">Did they really leave?</h3>



<p>“Migrating”, “transitioning”, and “switching over” may all sound like final decisions to leave Python behind, but that’s not really the case. Not one of the developers we interviewed removed Python from their stack completely. They kept it for artificial intelligence and machine learning, data science, and pipelines on platforms that only support Python, as well as simply because they work on larger teams that already know Python and are productive in it.</p>



<p>The realistic outcome of “moving to Go” is not becoming a monoglot, but having a polyglot codebase where each language is used for what it’s best suited for.</p>



<h2 class="wp-block-heading">Conclusions</h2>



<p>So, which language should you choose? Is it worth dropping Python in favor of Go? We hope that by now the answer is clear – it’s not a matter of which language is <em>better</em>, but which one is a <em>better fit</em>. Based on our data and developer testimony, here’s what we found.</p>



<p>Go may be a better fit if:</p>



<ul class="wp-block-list">
<li>Performance is crucial for your app: Latency, throughput, or cold starts are problems you actually have and can measure.</li>



<li>The workload is concurrent, especially if it is I/O-heavy.</li>



<li>The service is long-lived and maintained by a team, not one person.</li>



<li>The system already depends heavily on Kubernetes and the rest of the cloud-native toolchain.</li>
</ul>



<p>Python may be a better fit if:</p>



<ul class="wp-block-list">
<li>The work is machine learning, data science, or numerical computing.</li>



<li>Your platform only accepts Python, as managed ETL and notebook environments frequently do.</li>



<li>Iteration speed matters more than runtime speed, which is often the case for internal tooling and prototypes.</li>



<li>The library you depend on has no Go equivalent; for a lot of the scientific stack, there isn’t one.</li>
</ul>



<p>Language features alone rarely determine the best choice. When deciding what to build with, the teams weigh in the toolchain they already run, the languages their colleagues already know or are willing to learn, and how much of the existing system they are willing to change. Those things carry more weight than any benchmark, and they are why developers we talked to ended up using both languages, instead of choosing one.</p>



<h2 class="wp-block-heading">Frequently asked questions</h2>



<h3 class="wp-block-heading">Can Go replace Python completely?</h3>



<p>For a lot of backend work, yes, in principle. In practice, it doesn’t. None of the developers we interviewed removed Python from their stack completely. They kept it for machine learning and data science, for pipelines on platforms that only accept Python, and because the teams around them already know it. In the Developer Ecosystem 2026 survey, about a quarter of Go developers report using Python in the same project.</p>



<h3 class="wp-block-heading">Is Go good for data engineering?</h3>



<p>It depends on which end of the pipeline you mean. Go works well for moving data around, including ingestion services, stream processing, API integrations, and CLI tooling, and 30% of Go developers report working on data processing and analytics, compared with Python’s 38%. The analytical end is a different story: Only 15% of Gophers do data science and data analytics, against 32% of Python developers, and the library ecosystem reflects that.</p>



<h3 class="wp-block-heading">How long does it take a Python developer to learn Go?</h3>



<p>Days to weeks for the language itself. The syntax is small, <code>gofmt</code> settles the formatting arguments, and developers we talked to said Go “feels as easy to write as Python”. What takes longer is everything around it: system concepts such as pointers, interfaces, goroutines, and channels, as well as the habits Go asks you to change, from explicit error handling to designing test seams instead of patching at runtime.</p>



<p>The bigger adjustment may not be the language after all. Go work tends to sit closer to Kubernetes, Terraform, and GitOps, so if you’re moving into a Go team from a Python one, budget as much time for learning the toolchain as for the syntax.</p>



<h3 class="wp-block-heading">Is Go good for machine learning?</h3>



<p>For training models, probably not. 20% of Go developers work on artificial intelligence and machine learning, against 36% of Python developers, and the developers we interviewed were blunt about why: Python has the libraries, while Go lacks equivalents.</p>



<p>When it comes to building products around the models, it’s a different story. 46% of Go developers implement AI integrations, against Python’s 44% – a negligible difference. Gophers generally aren’t training the models, but they sure are serving them.</p>



<h3 class="wp-block-heading">Can Go and Python be used in the same project?</h3>



<p>Not only can they be used together, they often are. 27% of Go developers report using Python alongside Go in the same project, behind TypeScript (43%) and just ahead of JavaScript (24%). We know from interviews that the usual division of labor follows each language’s strengths: Go for the networked services and infrastructure, Python for data work, machine learning, and anything that depends on the scientific library stack.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Behind the Scenes: How the OpenTelemetry Plugin Maps Your Microservices in Real-Time</title>
		<link>https://blog.jetbrains.com/platform/2026/09/how-to-service-map-with-opentelemetry/</link>
		
		<dc:creator><![CDATA[Nikita Dukin]]></dc:creator>
		<pubDate>Wed, 16 Sep 2026 12:34:47 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/09/JB-social-BlogFeatured-1280x720-1-3.png</featuredImage>		<product ><![CDATA[go]]></product>
		<product ><![CDATA[pycharm]]></product>
		<product ><![CDATA[research]]></product>
		<product ><![CDATA[webstorm]]></product>
		<category><![CDATA[all-things-web]]></category>
		<category><![CDATA[backstage]]></category>
		<category><![CDATA[plugin-development]]></category>
		<category><![CDATA[goland]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[intellij-platform]]></category>
		<category><![CDATA[plugin-highlights]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[rider]]></category>
		<category><![CDATA[webstorm]]></category>
		<category><![CDATA[intellij-idea]]></category>
		<category><![CDATA[opentelemetry]]></category>
		<category><![CDATA[performance-optimization]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=platform&#038;p=740440</guid>

					<description><![CDATA[We’ve all been there: you join a new project, and the first thing you ask for is the architecture diagram. You&#8217;re handed a diagram that looks great, but after a week of debugging, you realize it’s six months out of date. Service A hasn&#8217;t talked to Service B since the spring, and there’s a new [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We’ve all been there: you join a new project, and the first thing you ask for is the architecture diagram. You&#8217;re handed a diagram that looks great, but after a week of debugging, you realize it’s six months out of date. Service A hasn&#8217;t talked to Service B since the spring, and there’s a new message queue nobody bothered to document.</p>



<p>Figuring out how a complex system <em>actually</em> fits together is a classic engineering headache. You can try to figure it out manually (if you have faith in yourself and enough time to spare), or you can use static analysis to explore the codebase (which often fails to capture how services are actually wired together at runtime).</p>



<p>But there’s a third way: <strong>dynamic analysis</strong>. What if we could just watch the system run and draw the map based on what is actually happening?</p>



<p>Since the OpenTelemetry plugin is already collecting a wealth of runtime data – logs, metrics, and traces – we realized we had the perfect opportunity to auto-generate this architecture map for you. Here’s a look under the hood at the Service Map feature, built as part of a collaboration between the Rider Execution team and <a href="https://lp.jetbrains.com/research/software-engineering/" target="_blank" rel="noopener">Software Engineering Research</a>.</p>



<h2 class="wp-block-heading">The magic ingredient: traces</h2>



<p>If you’re familiar with observability, you know the &#8220;three pillars&#8221;: logs, metrics, and traces.</p>



<p>While logs tell you <em>what</em> happened and metrics tell you <em>how much</em>, <strong>traces</strong> show you the <em>journey</em> of a request through your system. Traces are made up of individual units of work called <strong>spans</strong>.</p>



<p>Because OpenTelemetry standardizes these spans (for instance, explicitly defining <a href="https://opentelemetry.io/docs/specs/semconv/http/http-spans/#http-client-span" target="_blank" rel="noopener">HTTP Client</a> and <a href="https://opentelemetry.io/docs/specs/semconv/http/http-spans/#http-server" target="_blank" rel="noopener">HTTP Server</a> spans), they are the ultimate cheat code for understanding system architecture. Relying on the OpenTelemetry standard means the plugin can visualize your system completely independently of your technology stack, as long as your app and libraries emit spans the way OTel expects.</p>



<p>Building a map from traces has one massive advantage: it&#8217;s the source of runtime truth. We aren&#8217;t guessing based on source code or outdated specs. We are looking at data generated by the live system.</p>



<h2 class="wp-block-heading">How it works</h2>



<p>So, how does this actually work inside your JetBrains IDE?</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" fetchpriority="high" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image3.png" alt="" class="wp-image-740475"/></figure>



<p>When you start your IDE with OpenTelemetry plugin enabled, the plugin starts a lightweight local OpenTelemetry backend that can process your application telemetry data.&nbsp;</p>



<p>When you hit <em>Run</em> in your IDE:&nbsp;</p>



<ol class="wp-block-list">
<li>Plugin provides standard OTel environment variables to the application, so it knows that data should be sent to the local backend.</li>



<li>Your app (already configured to emit spans) starts sending telemetry data to our local backend.</li>



<li>The backend asynchronously crunches these incoming spans, continuously building and updating an internal model of your architecture.</li>



<li>When you click on the <em>Service Map</em> tab, the OpenTelemetry plugin fetches the latest structural model from the backend and renders the visual diagram.</li>
</ol>



<h2 class="wp-block-heading">The messy reality of telemetry data</h2>



<p>If you look at an architecture diagram, it looks static and orderly. But the stream of telemetry data generating that diagram is anything but. Before we could write an algorithm to connect the dots, we had to solve a few hidden challenges:</p>



<h3 class="wp-block-heading">Chaos in the wire&nbsp;</h3>



<p>Spans arrive completely independently, and their order is never guaranteed. A parent span might finish and arrive <em>after</em> its child span has already been processed.</p>



<h3 class="wp-block-heading">No finish line&nbsp;</h3>



<p>A trace never explicitly says &#8220;I&#8217;m done.&#8221; At any given moment, we can never be 100% sure that a late-arriving span isn&#8217;t about to show up.</p>



<h3 class="wp-block-heading">Untyped payloads</h3>



<p>OpenTelemetry doesn’t provide a strictly typed version for each span type. Instead, each span carries a key-value map with attributes that describe the semantics of the operation. We had to deduce what kind of interaction they represent purely by inspecting their attributes.</p>



<h2 class="wp-block-heading">The reconstruction algorithm</h2>



<p>To handle this asynchronous, out-of-order data, we built the architecture reconstruction as a stream processing algorithm. Instead of waiting around for a complete trace – which, as we just established, is impossible to guarantee – we process every span the moment it arrives.</p>



<p>First we figure out what we&#8217;re looking at. We pull the basic metadata off the span, then inspect its semantic attributes to classify it: attributes such as <code>http.request.method</code> and <code>http.response.status_code</code> tell us it&#8217;s an HTTP call, while others point to a database query, a message queue interaction, and so on.</p>



<p>Next we ask which service emitted it. New service we haven&#8217;t seen? It goes on the map. Already there? We merge the new data in and update its statistics.</p>



<p>Then comes the interesting part: connecting the dots across service boundaries. A fully instrumented HTTP call has two sides: the calling service emits a CLIENT span, while the receiving service emits a SERVER span. The trace context travels with the request, so the downstream SERVER span is created as a child of the upstream CLIENT span.</p>



<p>So when an outgoing HTTP Client span shows up, we go looking for its child on the server side. When an incoming HTTP Server span shows up, we look for the parent that called it. If the partner span is already in our system, we draw (or update) the connection between the two services right away. If it isn&#8217;t, we park the span in memory and wait for its other half to arrive.&nbsp;</p>



<p>Other kinds of dependencies require slightly different rules. A database call is usually represented by a single CLIENT span, so we infer the database node directly from its semantic attributes. Messaging is more varied: producer and consumer operations may be connected through a parent-child relationship or through span links, depending on the messaging system and instrumentation. In every case, the backend processes spans as they arrive and incrementally enriches the map as more evidence becomes available</p>



<p>That last step is what lets the plugin build an accurate, real-time map, even when the network delivers everything late and out of order.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image2.png" alt="" class="wp-image-740486"/><figcaption class="wp-element-caption"><em>Service map showing cross-service http communication and db access.<br></em></figcaption></figure>



<p>This way we can process and show you information about http requests, database requests and message queues.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/09/image1.png" alt="" class="wp-image-740497"/><figcaption class="wp-element-caption"><em>Service map showing cross-service communication through message queue (rabbit) and db access.</em></figcaption></figure>



<p>Because the map is built from standard OpenTelemetry spans and the reconstruction algorithm relies on semantic conventions rather than framework-specific APIs, the feature is language- and vendor-agnostic. The same logic works across JVM, .NET, Python, Go, and other OpenTelemetry-instrumented applications, as long as their instrumentation emits the expected spans and propagates context correctly. This also means you can use the feature in the JetBrains IDE that best fits your stack, including IntelliJ IDEA, GoLand, PyCharm, WebStorm, and Rider.</p>



<h2 class="wp-block-heading">See your own architecture</h2>



<p>Want to see your own architecture mapped out in real-time? Expected one HTTP call or database query, but the diagram shows several? Finding that during development gives you time to fix it before release.</p>



<p>You can install the OpenTelemetry plugin right now and stop guessing how your services talk to each other.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/27488-opentelemetry" class="btn" target="_blank" rel="noopener">Download the OpenTelemetry plugin</a>
                                                    </div>
    </div>







<p></p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/platform/2026/09/how-to-service-map-with-opentelemetry/</url>
                    </language>
                	</item>
		<item>
		<title>Fine-Tuning SOTA Object Detection Models on Real-World Datasets</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/fine-tuning-sota-object-detection-models-on-real-world-datasets/</link>
		
		<dc:creator><![CDATA[Arina Belova]]></dc:creator>
		<pubDate>Mon, 31 Aug 2026 13:50:29 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/PC-social-BlogFeatured-1280x720-1-2.png</featuredImage>		<category><![CDATA[data-science]]></category>
		<category><![CDATA[object-detection]]></category>
		<category><![CDATA[yolo]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=732973</guid>

					<description><![CDATA[In our previous blog post in this series, we discussed state-of-the-art models for object detection: the architectures, the theory, and what makes YOLO12, YOLO26, and RF-DETR tick. If you want the theoretical background on these models, start there. This post is the practical follow-up: how to actually use these models, how to fine-tune them on [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>In our <a href="https://blog.jetbrains.com/pycharm/2026/07/best-object-detection-models-for-machine-learning-in-2026/">previous blog post</a> in this series, we discussed state-of-the-art models for object detection: the architectures, the theory, and what makes YOLO12, YOLO26, and RF-DETR tick. If you want the theoretical background on these models, start there.</p>



<p>This post is the practical follow-up: how to actually <strong>use</strong> these models, how to <strong>fine-tune</strong> them on diverse, specialized datasets that look nothing like their training data, and how to <strong>evaluate</strong> the results – all within PyCharm.</p>



<h2 class="wp-block-heading">Why fine-tune at all?</h2>



<p>Every pretrained detector you download was trained on some distribution of images, almost always <a href="https://cocodataset.org/" target="_blank" rel="noopener">COCO</a>, which is ~118k training images of everyday scenes containing 80 common object categories (people, cars, dogs, chairs, etc.).</p>



<p>Real-world deployment data rarely looks like COCO. Things that object detection might actually be applied to, such as damaged industrial cables, bone fractures on X-rays, or densely stacked soda bottles on a shelf, are:</p>



<ul class="wp-block-list">
<li><strong>Out of vocabulary</strong>: &#8220;Bone fracture&#8221; is not one of COCO&#8217;s 80 classes, so the model literally has no output category for it.</li>



<li><strong>Out of visual distribution</strong>: X-ray imagery, industrial close-ups, and heavily occluded shelf scenes differ drastically from consumer photos in texture, viewpoint, and object density.</li>
</ul>



<p>Deploying a detector on off-distribution data therefore requires <strong>fine-tuning</strong>. But before we break the models, let&#8217;s establish that we get similar results on our hardware to the ones reported by developers.</p>



<h2 class="wp-block-heading">The models</h2>



<p>For the purposes of this experiment, we’ll focus on three current SOTA object detection families and examine two sizes of each model:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Family</strong></th><th><strong>Variants</strong></th><th><strong>Implementation</strong></th></tr></thead><tbody><tr><td>YOLO12</td><td><code>yolov12n, yolov12m</code></td><td><a href="https://github.com/sunsmarterjie/yolov12" target="_blank" rel="noopener">Original authors&#8217; repo</a></td></tr><tr><td>YOLO26</td><td><code>yolo26n, yolo26m</code></td><td><a href="https://github.com/ultralytics/ultralytics" target="_blank" rel="noopener">Ultralytics</a> PyPI package</td></tr><tr><td>RF-DETR</td><td><code>RFDETRNano, RFDETRBase</code></td><td><a href="https://github.com/roboflow/rf-detr" target="_blank" rel="noopener">Roboflow</a> PyPI package</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Sanity check: Reproducing COCO <code>val2017</code> baselines</h3>



<p>We’re going to be working with six pretrained checkpoints: Two different sizes of each of the three models. To check that these models are behaving as expected, we evaluated all of them on the full 5,000-image COCO validation dataset (<code>val2017</code>) to verify the numbers reported in the previous post:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Model</strong></th><th><strong>Params (M)</strong></th><th><strong>mAP50</strong></th><th><strong>mAP50-95</strong></th><th><strong>Latency (ms)</strong></th></tr></thead><tbody><tr><td>YOLOv12-N</td><td>2.55</td><td>0.5548</td><td>0.4021</td><td>23.9</td></tr><tr><td>YOLO26-N</td><td>2.57</td><td>0.5498</td><td>0.3952</td><td><strong>12.3</strong></td></tr><tr><td>YOLOv12-M</td><td>19.67</td><td>0.6953</td><td><strong>0.5259</strong></td><td>72.4</td></tr><tr><td>YOLO26-M</td><td>21.90</td><td>0.6906</td><td>0.5181</td><td>13.9</td></tr><tr><td>RF-DETR Nano</td><td>30.47</td><td>0.6750</td><td>0.4835</td><td><strong>12.4</strong></td></tr><tr><td>RF-DETR Base</td><td>32.17</td><td>0.7210</td><td><strong>0.5325</strong></td><td>12.9</td></tr></tbody></table></figure>



<p>Three things stand out even before we leave COCO behind:</p>



<ol class="wp-block-list">
<li><strong>Larger models (mostly) have better performance.</strong> RF-DETR Base leads (0.5325 mAP50-95), but the medium YOLOs get remarkably close (0.5259 / 0.5181) with ~10M fewer parameters.</li>



<li><strong>YOLO26&#8217;s NMS-free design pays off in throughput.</strong> YOLO26-N is the fastest model in the lineup (12.3 ms latency) at essentially the same mAP50-95 as YOLOv12-N, which, despite being the smallest model here, is considerably slower (23.9 ms latency). Attention is expensive. (If you want more detail on the model architectures and how they affect performance, see the <a href="https://blog.jetbrains.com/pycharm/2026/07/best-object-detection-models-for-machine-learning-in-2026/">previous blog post</a> in this series.)</li>



<li><strong>RF-DETR Nano is not &#8220;nano&#8221; by parameter count</strong> (~30M – more than YOLO26-M), but it is well-optimized: With 12.4 ms latency, it is the second-fastest overall.</li>
</ol>



<p>Published papers report <em>optimized</em> inference latency: That is, they measure the model&#8217;s forward pass in isolation, stripped of the surrounding stages of the object detection pipeline. We deliberately skipped that aggressive optimization so our numbers reflect what you&#8217;d actually see when deploying these models.</p>



<p>As a result, our latency figures don&#8217;t line up with the benchmarks in the models&#8217; white papers. There are two main reasons for this:</p>



<ul class="wp-block-list">
<li><strong>Hardware:</strong> We used different hardware from the NVIDIA T4 GPU that serves as the <em>de facto</em> standard in object detection benchmarking.</li>



<li><strong>Unoptimized computation graph:</strong> We ran the models in their native framework rather than converting them to TensorRT. TensorRT compiles a network into a hardware-specific engine, fusing layers, selecting the fastest kernels for the target GPU, and optionally running in reduced precision. That can cut latency substantially, but the resulting engine is tied to one GPU and requires an extra build step, so it doesn&#8217;t represent how these models perform out of the box.</li>
</ul>



<p>Accuracy is a different story: While our latencies diverge from the published ones, our mAP50-95 results fall within reasonable noise bounds of the reported figures.</p>



<p>Now that we’ve seen what our pretrained models can do on COCO, the dataset they were trained on, let&#8217;s see what happens when they&#8217;re tested off distribution.</p>



<h2 class="wp-block-heading">The datasets</h2>



<p>For evaluation, we used <a href="https://rf100-vl.org/" target="_blank" rel="noopener">RF100-VL</a>, a large-scale collection of 100 multimodal datasets covering concepts deliberately chosen to be rare in object detection models’ pretraining data. These datasets contain exactly the off-distribution targets we care about. These targets also mirror common real-life applications for object detection, giving us a realistic test of these models’ capabilities out in the wild.</p>



<p>We picked three datasets that stress test the models in different ways:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Dataset</strong></th><th><strong>Domain</strong></th><th><strong>Why it&#8217;s hard</strong></th><th><strong>Classes</strong></th></tr></thead><tbody><tr><td><strong><code>cable-damage</code></strong></td><td>Technical/industrial</td><td>Fine-grained damage types on visually similar backgrounds</td><td><code>break, thunderbolt</code></td></tr><tr><td><strong><code>bone-fracture</code></strong></td><td>Medical (X-ray)</td><td>Entirely different imaging modality; subtle features</td><td><code>angle, fracture, line, messed_up_angle</code></td></tr><tr><td><strong><code>soda-bottles</code></strong></td><td>Retail</td><td>Heavy occlusion, many near-identical instances per image</td><td><code>coca-cola, fanta, sprite</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Tutorial: Fine-tuning all three models in PyCharm 🙂</h2>



<h3 class="wp-block-heading">Step 1: Setting up the project</h3>



<p>One of the first challenges we had to overcome in this project was that the three implementations do <strong>not</strong> share a compatible set of dependencies. In particular, the two different generations of YOLO require different versions of the <code>ultralytics</code> package. PyCharm offers a clean solution for this: one PyCharm project with three isolated <code>uv</code> environments – one per model family.</p>



<p>We&#8217;ll run our computations on a remote GPU. Configuring a remote interpreter in PyCharm follows the same workflow as a local one: the same dialog and the same dropdown as in the local case. Note that remote interpreters require PyCharm Professional; Community Edition supports local environments only.</p>



<p>Firstly, we need to instantiate our three <code>uv</code> virtual environments via:<br></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">cd yolov12 &amp;&amp; uv venv .venv --python 3.11 

cd yolov26 &amp;&amp; uv venv .venv --python 3.11 

cd rf-detr &amp;&amp; uv venv .venv --python 3.11</pre>



<p>Once your uv virtual environments exist, register each one as an existing interpreter. Go to <em>Settings | Python | Interpreter</em>, click <em>Add Interpreter → Add Local Interpreter</em>, choose <em>Environment </em>as <em>Select existing</em>, and point the interpreter field at that environment&#8217;s <code>bin/python</code>. PyCharm doesn&#8217;t create anything here, it just picks up the environment <code>uv</code> already built.</p>



<p>Repeat for each environment. From then on, switching is a matter of picking one from the <em>Settings | Python | Interpreter</em> dropdown, or from the interpreter widget in the bottom-right-hand status bar.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/uv_virtual_env.png" alt="" class="wp-image-733186"/></figure>



<p>You can find the full list of dependencies required for each model in their respective project repositories. You can either install all the projects’ dependencies in PyCharm’s built-in <em>Terminal</em> tool window or install individual packages using the<em> Python Packages</em> tool window (including selecting specific versions of packages). You can access both of these tool windows by clicking the relevant icons in the lower left-hand corner of the PyCharm toolbar.&nbsp;</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Screenshot-2026-08-14-at-16.29.31-1.png" alt="" class="wp-image-733197"/></figure>



<p>For a step-by-step guide on setting up the environments for all three models, see our <a href="https://github.com/ArinaBelova/sota-object-detection-tutorial/blob/main/environments_setup.md" target="_blank" rel="noopener">GitHub implementation</a> of this tutorial.</p>



<h3 class="wp-block-heading">Step 2: Getting the datasets</h3>



<p>To obtain the out-of-COCO-distribution datasets, we can install our datasets via the <code>rf-detr</code> virtual environment, since it has <code>roboflow</code> as one of its core dependencies. We then set the Roboflow API key as an environment variable so that it is available to the API when downloading the datasets.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="shell" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install roboflow

export ROBOFLOW_API_KEY="your_key_here" # you can get API key here: https://docs.roboflow.com/reference/authentication/authentication/find-your-roboflow-api-key </pre>



<p>After setting everything up, now you can run the Python script below to get the three datasets we’re going to use in our tutorial:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import os
from roboflow import Roboflow

api_key = os.environ.get("ROBOFLOW_API_KEY")

if not api_key:
    raise RuntimeError("ROBOFLOW_API_KEY is not set")

DATASETS = [
    "bone-fracture-7fylg",
    "cable-damage",
    "soda-bottles",
]

VERSION = 2          # RF100 projects are generally published at version 2
FORMAT = "yolov8"    # or "coco", "voc", "yolov5"
rf = Roboflow(api_key=api_key)
workspace = rf.workspace("rf100")

for slug in DATASETS:
    print(f"Downloading {slug} ...")

    try:
        project = workspace.project(slug)
        dataset = project.version(VERSION).download(FORMAT)
        print(f"  -> {dataset.location}")

    except Exception as e:
        print(f"  !! failed: {e}")</pre>



<p>This script connects to the Roboflow cloud service via its Python API client and downloads three specified RF100 datasets in YOLOv8 format. It loops through each dataset, reports where successful downloads are saved, and prints an error if any download fails.</p>



<h3 class="wp-block-heading">Step 3: Getting a zero-shot baseline by using pretrained models on custom data</h3>



<p>Before fine-tuning, we’re going to evaluate the COCO-pretrained checkpoints directly on our three datasets, to see whether the fine-tuning is actually necessary. The result was unambiguous: <strong>The models predicted essentially nothing.</strong></p>



<p><em>Zero-shot mAP50-95 on the test splits of our three datasets:</em></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Model</strong></th><th><strong><code>cable-damage</code></strong></th><th><strong><code>bone-fracture</code></strong></th><th><strong><code>soda-bottles</code></strong></th></tr></thead><tbody><tr><td>RF-DETR Nano</td><td>0.0004</td><td>0.0000</td><td>0.0027</td></tr><tr><td>RF-DETR Base</td><td>0.0005</td><td>0.0000</td><td>0.0004</td></tr><tr><td>YOLOv12-N</td><td>0.0007</td><td>0.0000</td><td>0.0266</td></tr><tr><td>YOLO26-N</td><td>0.0000</td><td>0.0000</td><td>0.0033</td></tr><tr><td>YOLOv12-M</td><td>0.0000</td><td>0.0000</td><td>0.0160</td></tr><tr><td>YOLO26-M</td><td>0.0000</td><td>0.0000</td><td>0.0012</td></tr></tbody></table></figure>



<p>This is to be expected; it’s not a bug! As the models are closed-vocabulary detectors, that is, they have a finite number of predefined target classes, they physically cannot output a class like <code>fracture</code> that isn&#8217;t in their 80-class COCO head.&nbsp;</p>



<p>This is the punchline of this whole post: A model scoring 0.72 mAP50 on COCO scores 0.00 on bone fractures. Pretrained ≠ deployable, even when the model is state of the art. Basic machine learning principles still apply, even in the age of AI!</p>



<h3 class="wp-block-heading">Step 4: Fine-tuning</h3>



<p>All models were fine-tuned on a single <strong>A100 GPU</strong> for <strong>10 epochs</strong>. We used standard Ultralytics/RF-DETR fine-tuning pipelines in order to fine-tune the models on our three datasets. We fine-tuned a model for each dataset. The full fine-tuning pipeline can be found in <code>finetune_rf100.py</code> scripts in the project repo, under the folders for each model.</p>



<p>You can see the core of the training setup below. Both YOLO and RF-DETR are built on PyTorch under the hood, but the training loops are abstracted behind higher-level library APIs: Ultralytics’ <code>YOLO.train()</code> for the YOLO models, and RF-DETR’s own <code>train()</code> functionality.</p>



<h4 class="wp-block-heading">YOLO12 and YOLO26</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">train_model = YOLO(args.model)

train_res = train_model.train(
                data=str(yaml_path),
                epochs=args.epochs,
                imgsz=args.imgsz,
                batch=args.batch,
                device=args.device,
                project=args.project,
                name=run_name,
                exist_ok=True,
                verbose=False,
            )</pre>



<h4 class="wp-block-heading">RF-DETR</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ModelClass().train(
                dataset_dir=str(coco_dir),
                output_dir=str(output_dir),
                epochs=args.epochs,
                batch_size=args.batch_size,
                grad_accum_steps=args.grad_accum,
                lr=args.lr,
                resolution=resolution,
                early_stopping=True,
                checkpoint_interval=1,
            )</pre>



<h3 class="wp-block-heading">Step 5: Results</h3>



<p>Fine-tuning transforms the picture. You can see the results on the test set after training:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/accuracy_vs_speed.png" alt="" class="wp-image-733209"/></figure>



<p>On the left, we have the pretrained models’ results for the COCO validation dataset. As we showed earlier, accuracy (mAP50-95) fell between 0.39 and 0.53, and all models except for YOLOv12-M showed low latency. The fine-tuned models on the right showed a similar range of accuracy for the <code>cable-damage</code> and <code>soda-bottle</code> detection tasks, only falling lower for the <code>bone-fracture</code> task. Moreover, the fine-tuned models were comparable in latency to the pretrained models for their intended tasks, and for YOLOv12-M, they were even faster. This suggests that, after fine-tuning to the target domain, the models achieve performance that’s broadly comparable to the pretrained performance on their original training domain.</p>



<p>Let’s now have a closer look at the fine-tuned models’ performance, breaking it down by mAP50 and mAP50-95 for the three separate RF-100 datasets:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th><strong>Model</strong></th><th><strong><code>cable-damage</code></strong></th><th><strong><code>bone-fracture</code></strong></th><th><strong><code>soda-bottles</code></strong></th></tr></thead><tbody><tr><td>RF-DETR Nano</td><td>0.9195 (0.4391)</td><td>0.2317 (0.1136)</td><td>0.9617 (0.6223)</td></tr><tr><td>RF-DETR Base</td><td><strong>0.9281</strong> (<strong>0.4456</strong>)</td><td><strong>0.4474</strong> (<strong>0.1915</strong>)</td><td>0.9688 (0.6332)</td></tr><tr><td>YOLOv12-N</td><td>0.9236 (0.4378)</td><td>0.0911 (0.0532)</td><td>0.9677 (0.6343)</td></tr><tr><td>YOLO26-N</td><td>0.8165 (0.3681)</td><td>0.0193 (0.0064)</td><td>0.9148 (0.5896)</td></tr><tr><td>YOLOv12-M</td><td>0.8266 (0.3649)</td><td>0.1500 (0.0635)</td><td><strong>0.9706</strong> (<strong>0.6422</strong>)</td></tr><tr><td>YOLO26-M</td><td>0.8707 (0.3896)</td><td>0.2194 (0.1038)</td><td>0.9596 (0.6304)</td></tr></tbody></table></figure>



<p>What the numbers say:</p>



<ul class="wp-block-list">
<li><strong>The <code>soda-bottles</code> target is the easy win.</strong> Every model lands in the 0.91–0.97 mAP50 band. This is likely due to the fact that the domain (consumer products in photos) is visually close to existing classes in COCO, so only the vocabulary was new. Interestingly, the attention model family does great here, with YOLOv12-M taking the top spot (0.6422 mAP50-95).</li>



<li><strong><code>cable-damage</code>: Detection is easy, but localization is hard.</strong> mAP50 reaches 0.93, but mAP50-95 tops out at 0.446. It appears that the models find the damage reliably, yet they struggle to box thin, elongated defects precisely. If your application needs tight boxes at high IoU, this gap would be a significant issue.</li>



<li><strong><code>bone-fracture</code> remains genuinely hard.</strong> The best model (RF-DETR Base, 0.447 mAP50) is far from production-ready, and the performance spread across models is huge. The modality shift from photos to X-rays means the pretrained backbone features transfer poorly. The different image modality and small, sometimes almost indistinguishable bone fractures make the detection task way harder than the one employed on common objects identification. This is the dataset that would most benefit from domain-specific pretraining, more data, or longer fine-tuning.&nbsp;</li>



<li><strong>RF-DETR Base is the most consistent performer</strong>, winning on two out of three datasets and challenging seriously for the third. The DETR-style architecture seems to transfer more robustly to unfamiliar domains.&nbsp;</li>
</ul>



<h3 class="wp-block-heading">Qualitative results</h3>



<p>To visually assess how these models perform, we can overlay the predicted bounding boxes on the images. Let&#8217;s look at the objects our models detected in six random images per class:</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/cable-damage_very_low_res.png" alt="" class="wp-image-733331"/></figure>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/bone-fracture-7fylg.png" alt="" class="wp-image-733256"/></figure>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/soda-bottles_very_low_res.png" alt="" class="wp-image-733320"/></figure>



<p>We can see this confirms the accuracy values we saw above: The noisy images of soda bottles in fridges are labeled accurately, with tight bounding boxes for each object. The cable damage is identified less consistently, with some models failing to find the damage altogether, and others creating unnecessarily large bounding boxes. Finally, the images of broken bones contrast sharply with the other two, with less than half of the images having any break identified, and different models identifying different potential breakage points.</p>



<h2 class="wp-block-heading">Conclusions&nbsp;</h2>



<p>Pretrained object detectors are powerful, based on advancements in model architecture over the past five years, but as we’ve seen here, pretrained does not necessarily mean deployable. All six models performed well on COCO, yet when we applied those same checkpoints directly to our specialized datasets, their performance fell close to zero. However, fine-tuning completely changed that picture.</p>



<p>After only 10 epochs of fine-tuning, all three model families were able to adapt well to both the <code>cable-damage</code> and <code>soda-bottle</code> datasets. As we noted, the <code>soda-bottle</code> task was particularly transferable, likely because it contained objects similar to those contained in COCO. <code>cable-damage</code> was also detected relatively reliably, although the larger gap between mAP50 and mAP50-95 showed that precisely locating these tiny defects was still challenging for all of the models. However, <code>bone-fracture</code> was a completely different story, likely because moving from the sort of natural images contained in COCO to X-rays is a much larger domain shift. While RF-DETR handled this jump best, even its performance shows the limits of fine-tuning, and there are times when you might need to consider more data, longer training, or even domain-specific pretraining.</p>



<p>The broader takeaway is that there is no single “best” detector: It is dependent on the task. Model size, latency requirements, licensing restrictions, and most importantly, the similarity between the model’s pretraining data and your target domain all affect the outcome. It is important to refrain from unquestioningly trusting the numbers reported by model providers and explore the fit of a specific model for your own particular task.</p>



<h2 class="wp-block-heading">Get started with PyCharm today</h2>



<p>In this post, we’ve gone from validating pretrained YOLO12, YOLO26, and RF-DETR checkpoints on COCO to testing them zero-shot on specialized data, to fine-tuning them on three very different object detection tasks, and then finally, comparing the resulting accuracy and latency. Along the way, we’ve seen how PyCharm can help manage the practical side of a project like this, where multiple model families require different dependency sets and training environments.</p>



<p>PyCharm helps you keep these workflows together in a single project while using isolated Python environments for each model family. Its interpreter management, built-in terminal, <em>Python Packages</em> tool window, and support for remote development make it easier to move between environments and run training on remote GPU hardware without having to manage each part of this workflow separately.</p>



<p>If you’d like to try these experiments yourself, maybe look into fine-tuning these models for your own specific object detection use case! PyCharm is available to download and try. You can use the accompanying project code to reproduce our COCO baselines, download the RF100 datasets, fine-tune the models, and evaluate them using the held-out test splits.</p>



<p>You can find the <a href="https://github.com/ArinaBelova/sota-object-detection-tutorial" target="_blank" rel="noopener">full code for this project on GitHub</a>. And if you’d like to learn more about object detection, including the architectures behind the models we used in this post, check out the <a href="https://blog.jetbrains.com/pycharm/2026/07/best-object-detection-models-for-machine-learning-in-2026/">previous post in this series</a>.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The State of Django 2026: Boring is so back</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/the-state-of-django-2026-boring-is-so-back/</link>
		
		<dc:creator><![CDATA[Will Vincent]]></dc:creator>
		<pubDate>Fri, 28 Aug 2026 14:17:28 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/Django_Preview_1280x720.png</featuredImage>		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[state-of-django]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=734624</guid>

					<description><![CDATA[Welcome to the highlights from the fifth annual Django Developers Survey, a collaboration between the Django Software Foundation and PyCharm. This year’s report draws on responses from nearly 3,500 Django developers across more than 40 countries — from students in their first year to veterans with decades of experience. In software, &#8220;boring&#8221; is a compliment. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Welcome to the highlights from the fifth annual <a href="https://lp.jetbrains.com/django-developer-survey-2026/" target="_blank" rel="noopener">Django Developers Survey</a>, a collaboration between the <a href="https://www.djangoproject.com/foundation/" target="_blank" rel="noopener">Django Software Foundation</a> and <a href="https://www.jetbrains.com/pycharm/web-development/django/" target="_blank" rel="noopener">PyCharm</a>. This year’s report draws on responses from nearly 3,500 Django developers across more than 40 countries — from students in their first year to veterans with decades of experience.</p>



<p>In software, &#8220;boring&#8221; is a compliment. It means a technology works so reliably you can stop thinking about it. By that standard, Django in 2026 is thriving: PostgreSQL has been the database of choice for 76–79% of respondents for five consecutive years, Django&#8217;s template engine has held steady at around 80%, and nearly half of developers upgrade with every stable release — 43% are already on Django 6.0, months after it shipped. The core is boring in the best possible way. Mature, but not static.</p>



<p>Everything around that core, though, is moving fast. AI is now an everyday tool for most developers, and agents are beginning to move beyond answering questions to editing files, running commands, and completing larger tasks. Newer tools are consolidating workflows that once required several separate utilities, typing is becoming standard practice, and the boundaries between editors, terminals, automation, and AI are getting blurrier.</p>



<p>That may be Django’s particular advantage in 2026: it is mature enough to be dependable, active enough to keep moving, and stable enough to give developers room to change almost everything else.</p>



<p><em>As an open-source framework, Django depends on its community and needs funding to remain healthy and secure. The PyCharm team runs an annual fundraiser to support Django.</em></p>



<p><em>Until September 10, get PyCharm at 30% off, and JetBrains will donate 100% of your purchase amount to the Django Software Foundation.</em></p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/promo/support-django/" class="btn" target="" rel="noopener">Get PyCharm at 30% off, and support Django</a>
                                                    </div>
    </div>







<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_infographics_2-3.png" alt="" class="wp-image-734782"/></figure>



<h2 class="wp-block-heading">1. AI is mainstream, but no workflow has won</h2>



<p>AI has become part of the normal Django development workflow. Only 10% of respondents said they regularly use no AI tools for coding, while 58% of AI users use them every day and another 27% several times a week.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_1.png" alt="" class="wp-image-734651"/></figure>



<p>What remains unsettled is how developers use them. The interfaces are split almost evenly across the browser, the IDE, and the command line, and no tool dominates: Claude Code leads at 35%, with ChatGPT just behind at 33% and GitHub Copilot at 23%. And for all the attention on agents, a majority of AI users — 56% — still use it purely for chat and advice.</p>



<h2 class="wp-block-heading">2. Dominating AI workflow is still supervised</h2>



<p>Nearly half of AI users already work with AI through an IDE integration. But despite the growth of coding agents, the dominant workflow is still supervised: 59% have AI generate code and then apply the changes themselves, 44% let it edit files or run commands when instructed, and only 27% use it to autonomously complete multi-step tasks.</p>



<p>The emerging pattern is therefore less “replace the IDE with an agent” and more “bring the agent into the development environment.” Developers are adopting AI quickly, but the editor remains their home base for understanding the codebase, reviewing changes, and deciding what makes it into the project.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_2.png" alt="" class="wp-image-734662"/></figure>



<p>Nowhere is the shift clearer than in how developers learn. Django&#8217;s official documentation remains the top resource at 67%, but AI tools are now second at 51% — ahead of YouTube, reading source code, and Stack Overflow.</p>



<p>AI is already routine for writing code, debugging, research, and learning. But developers are still experimenting with where it belongs: in the browser, inside the IDE, at the terminal, or increasingly, acting directly on the codebase.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>AI is changing the IDE faster than it is replacing it.</strong></p>
</blockquote>



<h2 class="wp-block-heading">3. Python tooling is consolidating fast</h2>



<p>Two tools that barely existed a few years ago are already near the top of the survey.</p>



<p>uv, released in February 2024, is already used by 43% of respondents for managing Python environments—second only to venv at 63% and ahead of Docker at 31%.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_3.png" alt="" class="wp-image-734673"/></figure>



<p>Ruff tells a similar story. At 43%, it is now the most widely used code-quality and formatting tool in the survey, ahead of IDE inspections at 27%, Black at 25%, pre-commit at 20%, and Flake8 at 17%.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_4.png" alt="" class="wp-image-734684"/></figure>



<p>The shift is not that Python’s older tools have disappeared. It is that newer tools increasingly cover jobs that once required several separate utilities. The result is a Python toolchain beginning to consolidate around fewer, faster, more capable tools.</p>



<h2 class="wp-block-heading">4. Type hints are winning. The type checker race is wide open.</h2>



<p>Type hints are becoming the norm in Django development: 57% already use them, and another 26% plan to. What is much less settled is how developers check those types.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_5-1.png" alt="" class="wp-image-734695"/></figure>



<p>Among developers who use type hints, the most popular option isn&#8217;t a standalone type checker at all: 40% rely on the checker built into their IDE. Mypy follows at 32%, Ruff at 29%, and Pyright/Pylance at 22%. Newer entrants are already appearing too, with Astral’s ty reaching 12% and Meta’s Pyrefly at 4%.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_6.png" alt="" class="wp-image-734706"/></figure>



<p>The practice, in other words, is converging faster than the tooling. Django developers increasingly agree that types are useful, but there is still no consensus on which tool should enforce them—or whether a separate tool is necessary at all.</p>



<p>That makes type checking an interesting space to watch in 2027: will one of the newer standalone tools break away from the pack, or will type checking increasingly become something developers simply expect their IDE to provide?</p>



<h2 class="wp-block-heading">5. As AI writes more code, verification matters more</h2>



<p>AI is moving beyond suggestions and into the codebase. That makes automated verification more important, not less.</p>



<p>The survey can&#8217;t tell us whether AI is driving greater adoption of tests or CI. What it does show is that most Django developers already have the infrastructure agents need: pytest is used by 45% of respondents and unittest by 43%, with pytest-django at 34%. </p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_7.png" alt="" class="wp-image-734757"/></figure>



<p>That testing culture sits alongside widespread CI/CD adoption — GitHub Actions is now used by a majority of respondents at 51%, with GitLab CI/CD at another 26%. Together, these create a natural feedback loop for agentic development: an agent can make a change, run the test suite, respond to failures, and hand the developer a result that has already passed the project&#8217;s checks.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_8.png" alt="" class="wp-image-734717"/></figure>



<p>Not everyone has that loop in place: 19% of respondents write no automated tests at all. As more code is delegated to agents, that fifth of developers is working without the safety net that makes delegation trustworthy.</p>



<p>The emerging agentic workflow may depend as much on verification as generation. The more code we delegate, the more valuable it becomes to have tests and pipelines that can quickly tell both developers and agents whether a change actually works.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Agents can generate code. Tests and pipelines tell them whether it works.</strong></p>
</blockquote>



<h2 class="wp-block-heading">6. One framework, two ways to build</h2>



<p>Two distinct ways of building with Django are now firmly mainstream: letting Django render the interface, or using it as the backend for a separate frontend. 72% of respondents use server-rendered templates, while 53% use Django for API-only applications and 46% use it as the backend for a single-page application or dedicated JavaScript frontend.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_9.png" alt="" class="wp-image-734730"/></figure>



<p>The balance is even clearer when developers are asked for their primary approach. Half primarily build server-rendered applications, while 44% primarily use Django for either APIs or dedicated JavaScript frontends.</p>



<p>The JavaScript numbers tell the sharper story. React has barely moved in five years — 37% in 2021, 38% today. What&#8217;s changed is everything around it: jQuery has fallen from 37% to 23%, Vue from 28% to 17%, while htmx has climbed from just 5% to 34%. htmx isn&#8217;t taking share from React — it&#8217;s modernizing the server-rendered side of the divide that jQuery used to own.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/Blog_graph_10.png" alt="" class="wp-image-734742"/></figure>



<p>That flexibility is one of Django’s strengths. The same framework can sit at the center of a hypermedia application or behind an API consumed by React, mobile apps, or other clients. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Django remains unusually comfortable on both sides of the frontend divide.</p>
</blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p></p>
</blockquote>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Across the survey, the pattern is consistent: developers are changing their tools and workflows far faster than they are changing the framework underneath them. The parts of Django they value most remain familiar — models, the admin, authentication — and even deployment stays defiantly unfashionable, with 54% shipping monoliths and 44% self-hosting.</p>



<p>Even where Django itself is evolving, it does so deliberately: 33% of respondents use its async features and another 40% plan to — change offered as an opt-in, not a rewrite.</p>



<p>That stability is increasingly valuable. Developers can experiment with a new agent, replace several tools with Ruff or uv, add htmx to a template, or adopt a new type checker without having to rethink the framework underneath their application.</p>



<p>Django&#8217;s advantage in 2026 is not that it is the newest thing. It is that it gives developers a solid, dependable — yes, boring — place from which to try the newest things. Boring is so back.</p>



<h2 class="wp-block-heading">PyCharm for Django Fundraiser</h2>



<p>Get a new PyCharm Pro license or renew your existing one at 30% off, with 100% of your purchase amount going to the Django Software Foundation.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/promo/support-django/" class="btn" target="_blank" rel="noopener">Get PyCharm at 30% off, and support Django</a>
                                                    </div>
    </div>







<p>Explore the complete <a href="https://lp.jetbrains.com/django-developer-survey-2026/" target="_blank" rel="noopener">2026 Django Developers Survey Results</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Security Incident Affecting JetBrains Cadence</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/cadence-security-incident-august-2026/</link>
		
		<dc:creator><![CDATA[Daniel Gallo]]></dc:creator>
		<pubDate>Fri, 28 Aug 2026 09:50:14 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/JB-social-BlogFeatured-1280x720-1-9.png</featuredImage>		<category><![CDATA[news]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=734588</guid>

					<description><![CDATA[We investigated a security incident affecting JetBrains Cadence. Cadence was a JetBrains-hosted service that integrated with PyCharm through an optional plugin, and let you run your projects on cloud compute resources. The sunset of Cadence was announced on March 31, 2026, and the service was scheduled to be shut down on August 31, 2026. Our [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>We investigated a security incident affecting JetBrains Cadence. Cadence was a JetBrains-hosted service that integrated with PyCharm through an optional plugin, and let you run your projects on cloud compute resources. The sunset of Cadence was announced on March 31, 2026, and the service was scheduled to be shut down on August 31, 2026. Our investigation confirmed unauthorized access to the service and the exposure of customer data associated with its use.</p>



<p>We contacted affected users directly and took steps to contain the incident.</p>



<p><strong>This post provides the latest information about the incident, its potential impact, and the actions we recommend Cadence users take. We will update it as our investigation progresses and additional information becomes available.</strong></p>



<p><strong>Last updated: </strong>September 3, 2026, 19:00 CEST</p>



<h2 class="wp-block-heading">September 3, 2026, 19:00 CEST</h2>



<p>Our investigation has identified additional potential exposure involving storage used by the current Cadence environment.</p>



<p>We confirmed that the threat actor obtained access that could have allowed them to reach storage containing data associated with current Cadence users, including email addresses, project source code, and credentials. This affects the same group of users we previously contacted directly. These findings did not identify any additional affected users. As a precaution, we are treating the data stored there as potentially exposed.&nbsp;</p>



<p>Our investigation has now concluded. The recommended actions for affected users remain unchanged.</p>



<h2 class="wp-block-heading">September 1, 2026, 12:05 CEST</h2>



<p>Our investigation is nearing completion, and most mitigation and response actions are now finalized. We have not identified any additional compromised resources or data since our last update, and we are wrapping up a small number of remaining verification activities. The recommended actions for affected users remain unchanged.</p>



<h2 class="wp-block-heading">August 31, 2026, 12:56 CEST</h2>



<p>Our investigation remains ongoing. At this time, we have not identified any additional compromised resources or data.</p>



<p>We have confirmed that the threat actor accessed data contained in the Cadence server backup from 2024. At this time, there is no evidence to suggest that the threat actor extracted data, including secrets, from the current Cadence environment.</p>



<p>The recommended actions described below remain unchanged.</p>



<h2 class="wp-block-heading">August 28, 2026, 11:50 CEST</h2>



<p><a href="https://blog.jetbrains.com/pycharm/2025/06/training-your-ml-models-with-cadence/">Cadence</a> was a JetBrains-hosted service integrated with PyCharm through an optional plugin, that let you run your projects on cloud compute resources. Its sunset was announced on March 31, 2026, and the service was scheduled to be shut down on August 31, 2026. Cadence used JetBrains TeamCity to orchestrate this work. We recently disclosed <a href="https://blog.jetbrains.com/teamcity/2026/07/cve-2026-63077/">CVE-2026-63077</a>, a critical vulnerability in TeamCity that can allow an unauthenticated attacker to execute arbitrary commands on a vulnerable server.</p>



<p>We have since confirmed the Cadence environment was vulnerable to CVE-2026-63077 and was exploited through this vulnerability.</p>



<p>Cadence users should immediately revoke or rotate all credentials and secrets that may have been used to run their Cadence executions. They should also treat all executions, including their inputs and outputs in your Cadence project, as potentially untrusted.</p>



<h3 class="wp-block-heading"><strong>Actions required immediately</strong></h3>



<p>We strongly recommend that Cadence users:</p>



<ul class="wp-block-list">
<li>Revoke and rotate all credentials and secrets that may have been used to run Cadence executions.</li>



<li>Review connected systems for suspicious activity, particularly AWS accounts, S3 buckets, deployment environments, package/container registries, and other systems accessible using credentials mentioned above.</li>



<li>Review source code repositories for unauthorized changes made during the affected period.</li>



<li>Review any source code or project files synchronized to Cadence from PyCharm and rotate any credentials, tokens, or other sensitive information contained within them.</li>



<li>Treat all executions, including their inputs and outputs in your Cadence project, as potentially untrusted.</li>
</ul>



<p>Cadence users can contact us to request an inventory of the credentials and secrets associated with their Cadence usage. This may help users identify which credentials need to be revoked or rotated, but the inventory should not be considered exhaustive.</p>



<p>We have collated a list of Indicators of Compromise (IoCs) below. These indicators are not exhaustive, and the absence of these indicators does not confirm that an account or system was unaffected:</p>



<ul class="wp-block-list">
<li>Activity occurring from August 8, 2026, onwards, particularly authentication or activity using credentials previously stored in or accessible through Cadence.</li>



<li>IP addresses associated with observed exploitation activity:
<ul class="wp-block-list">
<li>150.109.230.104</li>



<li>43.153.227.206</li>



<li>62.210.127.48</li>



<li>210.247.242.190</li>



<li>15.235.225.205</li>



<li>152.233.30.18</li>
</ul>
</li>



<li>Authentication or other activity from unexpected IP addresses or locations.</li>



<li>Unexpected repository clones or downloads, and unexpected commits to repositories.</li>



<li>Changes to repository secrets, webhooks, collaborators, or permissions.</li>



<li>New or modified personal access tokens, API tokens, or SSH keys in external services.</li>



<li>New service accounts created in external services.</li>



<li>Unexpected changes to cloud IAM roles, policies, or permissions.</li>



<li>Unexpected access to cloud storage, including S3 buckets and objects, in services such as AWS and Google Cloud.</li>



<li>Unexpected publication or modification of packages or releases.</li>
</ul>



<h3 class="wp-block-heading"><strong>Affected server</strong></h3>



<p>We have confirmed that the following Cadence server was successfully exploited: <code>api.cadence.jetbrains.com</code>.</p>



<h3 class="wp-block-heading"><strong>Affected period</strong></h3>



<p>August 8, 2026, to August 24, 2026.</p>



<h3 class="wp-block-heading"><strong>What happened</strong></h3>



<p>The Cadence server used TeamCity to orchestrate workloads and was vulnerable to CVE-2026-63077. Threat actors exploited the vulnerability and gained unauthorized access to the affected Cadence environments, with activity identified from August 8, 2026. We discovered the exploitation on August 23, 2026, and took the affected server offline on August 24, 2026, while we continued our investigation.</p>



<h3 class="wp-block-heading"><strong>What we know</strong></h3>



<p>Our investigation is ongoing, but we have confirmed that the threat actors:</p>



<ul class="wp-block-list">
<li>Accessed personal data and extracted it from the affected environment. Confirmed affected personal data includes usernames, real names, email addresses, last-login timestamps, and last accessed IP addresses.</li>



<li>Compromised a full backup of the Cadence server dating from 2024. This means credentials, configuration, artifacts, logs, or other data present in that backup must also be treated as potentially exposed.</li>



<li>Compromised multiple AWS IAM users and associated credentials/secrets used with Cadence, including IAM users belonging to JetBrains employees who used the service. These credentials were present in the compromised 2024 backup.</li>



<li>Accessed files stored in S3 buckets within JetBrains AWS accounts used by Cadence. We are still determining the full scope of the data accessed. We do not currently know whether the threat actors accessed storage buckets in customer accounts. However, some users may have configured Cadence to access their own storage buckets, and the credentials used for those connections may have also been exposed.</li>



<li>May have accessed source code synchronized from PyCharm projects to the affected server. If you used PyCharm to upload or synchronize project files for execution in Cadence, you should treat that code, and any credentials or configuration contained within it, as potentially compromised.</li>
</ul>



<p>The likely consequences of the personal data exposure include an increased risk of targeted phishing, social engineering, impersonation, and other unsolicited or malicious communications using the affected names and email addresses.</p>



<p>As the threat actors gained access to the Cadence server, any credentials or secrets stored in Cadence, contained in the compromised backup, or made available to executions on the affected server should be considered compromised and must be revoked or rotated.</p>



<p>This includes but is not limited to:</p>



<ul class="wp-block-list">
<li>Cloud credentials, including AWS, Azure, and Google Cloud.</li>



<li>Source control credentials and tokens, including GitHub, GitLab, and Bitbucket.</li>



<li>Package repository credentials, including npm, Maven, NuGet, PyPI, and similar services.</li>



<li>Container registry credentials, including Docker Hub, ECR, GCR, ACR, and other registries.</li>



<li>Slack tokens, webhooks, API tokens, SSH/deployment keys, service account credentials, signing keys/certificates, and credentials for any other external systems used by your Cadence executions.</li>
</ul>



<h3 class="wp-block-heading"><strong>Actions JetBrains has taken</strong></h3>



<p>We took the Cadence server offline on August 24, 2026, while we continue to investigate the incident. At present, we have confirmed that the incident is limited to data associated with the Cadence host mentioned above.</p>



<p>The server should have been patched as part of our response to the vulnerability, but it was not. We sincerely apologize for this failure and the impact it may have on you.</p>



<p>We have invalidated all access tokens used by the JetBrains Cadence plugin in PyCharm to connect to Cadence, and took the server offline on August 24, 2026.</p>



<p>We are also notifying the relevant authorities and taking the necessary steps to protect the data of Cadence users.</p>



<h3 class="wp-block-heading"><strong>Further updates</strong></h3>



<p>We will publish further findings and guidance here as our investigation progresses. We recommend checking this page frequently for the latest information. We will also contact affected users directly if we identify any important new information that may require action on their part.</p>



<p>For more information about the underlying vulnerability, please see our original <a href="https://blog.jetbrains.com/teamcity/2026/07/cve-2026-63077/">security advisory</a> to TeamCity customers and users.</p>



<p>If you previously used Cadence and need assistance identifying which credentials may have been exposed or have any questions regarding this incident, contact the JetBrains Security team at <a href="mailto:security@jetbrains.com?subject=Security incident affecting JetBrains Cadence">security@jetbrains.com</a>.</p>



<p>We recognize the seriousness of this incident and apologize again for the impact.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>OpenTelemetry Comes to IntelliJ IDEA, GoLand, PyCharm, and WebStorm</title>
		<link>https://blog.jetbrains.com/platform/2026/08/opentelemetry-plugin-for-jetbrains-ides/</link>
		
		<dc:creator><![CDATA[Egor Klimov]]></dc:creator>
		<pubDate>Wed, 26 Aug 2026 07:40:10 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/JB-social-BlogFeatured-1280x720-1-6.png</featuredImage>		<product ><![CDATA[go]]></product>
		<product ><![CDATA[pycharm]]></product>
		<product ><![CDATA[webstorm]]></product>
		<category><![CDATA[goland]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[intellij-platform]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[pycharm]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[rider]]></category>
		<category><![CDATA[webstorm]]></category>
		<category><![CDATA[intellij-idea]]></category>
		<category><![CDATA[opentelemetry]]></category>
		<category><![CDATA[performance-optimization]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=platform&#038;p=733710</guid>

					<description><![CDATA[OpenTelemetry Comes to IntelliJ IDEA, GoLand, PyCharm, and WebStorm. The OpenTelemetry plugin has broken out of the confines of JetBrains Rider. No sandbox exploit was involved – this escape was planned by our developers. With the 2026.2 release, the OpenTelemetry plugin is now available in IntelliJ IDEA, GoLand, PyCharm and WebStorm. Rider users needn’t worry [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>OpenTelemetry Comes to IntelliJ IDEA, GoLand, PyCharm, and WebStorm.</p>



<p>The <a href="https://plugins.jetbrains.com/plugin/27488-opentelemetry/" target="_blank" rel="noopener">OpenTelemetry plugin</a> has broken out of the confines of JetBrains Rider. No sandbox exploit was involved – this escape was planned by our developers. With the 2026.2 release, the OpenTelemetry plugin is now available in IntelliJ IDEA, GoLand, PyCharm and WebStorm. Rider users needn’t worry – it still works there too.</p>



<p>The plugin brings logs, metrics, traces, and the service map from local applications into the IDE. You can inspect them without setting up a separate local observability backend.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/27488-opentelemetry/" class="btn" target="_blank" rel="noopener">Get the OTel plugin from the Marketplace</a>
                                                    </div>
    </div>







<h2 class="wp-block-heading">What is the OpenTelemetry plugin?</h2>



<p>While developing with your IDE, you can use the plugin to:</p>



<ul class="wp-block-list">
<li>Find what happened immediately before an error.</li>



<li>See which services and dependencies a request reached.</li>



<li>Pinpoint where a request spent its time.</li>



<li>Check whether the application emitted the expected logs, metrics, and traces.</li>



<li>Ask your coding agent to do all of the above via <a href="https://www.jetbrains.com/help/idea/mcp-server.html" target="_blank" rel="noopener">MCP</a>.</li>
</ul>



<p></p>



<p>The plugin’s functionality complements what the IDE offers out of the box. Use a debugger to step through code, a profiler to analyze performance, and a production monitoring platform to watch deployed systems. Use the OpenTelemetry plugin to inspect runtime behavior while you build or test the application.</p>



<h2 class="wp-block-heading">Imagine this</h2>



<p>Say you are testing a feature that calls several services and a database before publishing a message to a queue. The request fails, and the console shows the exception, but not the path that led to it.</p>



<p>In the <em>OpenTelemetry</em> tool window, you can search the logs for the error. Open the relevant trace to see how the request moved through the system and where it failed. The <em>Service Map</em> shows the services and infrastructure involved.</p>



<h2 class="wp-block-heading">Explore runtime data in the IDE</h2>



<h3 class="wp-block-heading">Search and inspect logs</h3>



<p>Console output is manageable until several services start writing at once. The <em>Logs</em> view puts OpenTelemetry log records in a searchable table. You can filter by severity or content, then open a record to inspect its attributes.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/image3-3.png" alt="" class="wp-image-733792"/><figcaption class="wp-element-caption"><em>Detailed log view showing timestamps, levels, and messages for different log types</em></figcaption></figure>



<h3 class="wp-block-heading">Check metrics</h3>



<p>Select a metric from the metric tree to plot its values while you use the application. This view is not a replacement for your production dashboards, but it lets you inspect what the application will export before you send the data to a production observability platform. If a new library adds noisy or unnecessary metrics, you can catch them locally and adjust the instrumentation before your DevOps and SRE colleagues have to handle them.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/image2.png" alt="" class="wp-image-733803"/><figcaption class="wp-element-caption"><em>The metrics viewer displays CPU utilization data with real-time charts.</em></figcaption></figure>



<h3 class="wp-block-heading">Follow a request through its trace</h3>



<p>Open a trace to see its spans across services. Each span includes timing and attributes, so you can follow the request from start to finish and zero in on the operation that failed or slowed things down. Development is also a good time to look at the trace itself. Does it contain the spans and details you&#8217;d need during a real incident? It&#8217;s much easier to fix those gaps now than to discover them in production.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/image4-2.png" alt="" class="wp-image-733781"/><figcaption class="wp-element-caption"><em><em>The trace table view with filtering capabilities and detailed information for the selected trace.</em></em></figcaption></figure>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/image1-1.png" alt="" class="wp-image-733814"/><figcaption class="wp-element-caption"><em>The trace viewer showing details of the POST request involving multiple internal DB and HTTP calls.</em></figcaption></figure>



<p></p>



<h3 class="wp-block-heading">See observed relationships in the <em>Service Map</em></h3>



<p>Architecture diagrams go stale. The <em>Service Map</em> builds its relationships from collected traces, so it reflects the traffic the plugin has seen between services, endpoints, databases, and message queues.</p>



<p>Expected one HTTP call or database query, but the diagram shows several? Finding that during development gives you time to fix it before release.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/image5-2.png" alt="" class="wp-image-733825"/><figcaption class="wp-element-caption"><em>Automatically generated service map showing the relationship between API endpoints, internal services, and PostgreSQL based on actual runtime traces.</em></figcaption></figure>



<h2 class="wp-block-heading">Connect an instrumented application</h2>



<p>The plugin does not add OpenTelemetry libraries or agents to your application. It configures where an already instrumented application sends its data.</p>



<p>Start an instrumented Java, Python, Go, or .NET application from a supported IDE run configuration, and the plugin passes OpenTelemetry Protocol (OTLP) environment variables that point to its built-in receiver. It passes the same variables to new integrated terminal sessions.</p>



<p>You can also point the application&#8217;s OTLP exporter at the endpoint shown by the plugin. If you already use a local OpenTelemetry Collector, add the plugin as an OTLP destination and keep the rest of your pipeline.</p>



<h2 class="wp-block-heading">Runtime context for coding agents</h2>



<p>The plugin has experimental MCP support through the <a href="https://plugins.jetbrains.com/plugin/26071-mcp-server" target="_blank" rel="noopener">JetBrains MCP server</a>. A compatible coding agent can query the telemetry collected in the IDE with these tools:</p>



<ul class="wp-block-list">
<li><code>get_log_records</code></li>



<li><code>get_spans</code></li>



<li><code>get_services</code></li>



<li><code>get_service_map</code></li>
</ul>



<p>These tools give the agent evidence from a particular run, so that it can inspect the logs and spans or query the observed service relationships.</p>



<h2 class="wp-block-heading">Getting started</h2>



<ol class="wp-block-list">
<li>Install the <a href="https://plugins.jetbrains.com/plugin/27488-opentelemetry/" target="_blank" rel="noopener">OpenTelemetry plugin from JetBrains Marketplace</a> for your favorite IDE.</li>



<li>Instrument your application with OpenTelemetry libraries or agents.</li>



<li>Start it from a supported IDE run configuration or a new integrated terminal session. The plugin will pass the OTLP environment variables. Alternatively, point the application&#8217;s exporter or your local collector at the endpoint shown by the plugin.</li>



<li>Open the <em>OpenTelemetry</em> tool window and exercise the part of the application you want to inspect.</li>
</ol>



<p>The plugin shows the signals it receives. If your application exports only traces, the <em>Logs</em> and <em>Metrics</em> views stay empty.</p>



<p>Full setup instructions are available in the <a href="https://www.jetbrains.com/help/rider/OpenTelemetry.html" target="_blank" rel="noopener">OpenTelemetry plugin documentation</a>.</p>



<h2 class="wp-block-heading">Install it and tell us what you find</h2>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/27488-opentelemetry/" class="btn" target="_blank" rel="noopener">Get the OTel plugin from the Marketplace</a>
                                                    </div>
    </div>







<p>Try it on a real project, then tell us in the comments or through the <a href="https://youtrack.jetbrains.com/projects/RIDER/issues/RIDER-102188/OpenTelemetry-plugin-for-Rider" target="_blank" rel="noopener">issue tracker</a> what worked and what still sent you to another tool.</p>



<h2 class="wp-block-heading">Some final notes</h2>



<p>This plugin is the product of a collaborative effort between the Rider Execution team and the Dynamic Program Analysis Research team at JetBrains Research. This launch is the first step in exploring how telemetry analysis can help us build development tools that better adapt to real-world developer workflows.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PyCharm for AI-assisted Django Workflows</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/pycharm-for-ai-assisted-django-workflows/</link>
		
		<dc:creator><![CDATA[Will Vincent]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 13:06:50 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/PC-social-BlogFeatured-1280x720-1-1.png</featuredImage>		<category><![CDATA[agentic-ai]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web-development]]></category>
		<category><![CDATA[django]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=731652</guid>

					<description><![CDATA[The 2026 Django Developers Survey found that AI is part of the weekly or daily workflow for 90% of respondents. AI can write code quickly, but Django developers still need to understand the application, evaluate what the agent produces, and be accountable for what ships. That makes your IDE more important, not less. PyCharm gives [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>The <em><a href="https://lp.jetbrains.com/django-developer-survey-2026/" target="_blank" rel="noopener">2026 Django Developers Survey</a></em> found that AI is part of the weekly or daily workflow for 90% of respondents. AI can write code quickly, but Django developers still need to understand the application, evaluate what the agent produces, and be accountable for what ships.</p>



<p>That makes your IDE more important, not less. PyCharm gives you the freedom to choose the agents and models you want, as well as extensive Python and Django support for understanding and reviewing the code they produce.</p>



<h3 class="wp-block-heading">1. Bring your own agent</h3>



<p>Leading agents such as Codex, Claude Agent, Junie, and Gemini run natively in PyCharm, while the <a href="https://agentclientprotocol.com/get-started/registry" target="_blank" rel="noopener">ACP registry</a> gives you access to dozens more, installable in a click from the same dropdown menu. You can use a JetBrains AI subscription or bring your own tools – the choice is yours.</p>



<p>Want to use your own model? <a href="https://www.jetbrains.com/help/ai-assistant/bring-your-own-key-byok.html" target="_blank" rel="noopener">Bring Your Own Key</a> technology lets you connect existing provider credentials, while Ollama and LM Studio let you work with local models.</p>



<p>You choose the AI tools that fit your workflow. PyCharm doesn&#8217;t lock you into one provider.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/1_AIChat_Dropdown.webm"></video></figure>



<h3 class="wp-block-heading">2. Teach your agent your conventions</h3>



<p>Skills give your agent reusable instructions and context. In PyCharm 2026.2, native skill support for Claude Agent and Codex lets you add a skill directly from the AI chat, either for a single project or across your entire codebase.</p>



<p>The curated <a href="https://blog.jetbrains.com/ai/2026/04/skill-manager-and-skill-repository/">Skill Repository</a> also gives you a way to add official skills for technologies, including React, Postgres, and Playwright.</p>



<p>Skills let you encode useful context once and reuse it, so you spend less time repeating instructions to your agents.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/2_Agent_Skills.webm"></video></figure>



<h3 class="wp-block-heading">3. Django 6+ support</h3>



<p>PyCharm keeps up with Django&#8217;s release cycle, including<a href="https://www.jetbrains.com/help/pycharm/django-6-template-partials.html" target="_blank" rel="noopener"> Django 6.0 template partials</a>. The IDE understands the new partial template tags and completes them as you type.</p>



<p>This matters especially when frameworks evolve. An agent&#8217;s training data may not reflect the exact Django version you&#8217;re running. PyCharm&#8217;s Django support is tied to the version in your project.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/3_Django60_Template_Partials.webm"></video></figure>



<h3 class="wp-block-heading">4. Review with confidence</h3>



<p>AI generates code quickly, which makes reviewing and undoing changes more important than ever.</p>



<p>PyCharm gives you visual diffs, merge tools, integrated conflict resolution, and Git history in the IDE, so you can inspect changes before committing or merging.</p>



<p><a href="https://www.jetbrains.com/help/pycharm/local-history.html" target="_blank" rel="noopener">Local History</a> works independently of version control, recording changes as you work. You can compare a file with an earlier state and restore a version from before the agent touched it – even if you never committed the change.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/4_Review_Confidence.webm"></video></figure>



<h3 class="wp-block-heading">5. See your Django architecture</h3>



<p>Django applications can get big<strong>. </strong><a href="https://www.jetbrains.com/help/pycharm/django-logical-structure.html" target="_blank" rel="noopener">Django Logical Structure</a> presents your project from Django&#8217;s point of view rather than as a flat collection of Python and HTML files. You can follow a model to its serializer, its views, and the endpoints they serve.</p>



<p>Whether the code you&#8217;re reading was written by you six months ago, another developer, or an agent, PyCharm helps you understand how the pieces fit together.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/5_Django_Structure.webm"></video></figure>



<h3 class="wp-block-heading">6. Verify your API and your data</h3>



<p>The<a href="https://www.jetbrains.com/help/pycharm/endpoints-tool-window.html" target="_blank" rel="noopener"><em> </em><em>Endpoints </em>tool window</a> gives you a structured view of your Django endpoints, including documentation, examples, generated HTTP requests, and OpenAPI information. You can send those requests directly with the built-in HTTP Client.</p>



<p>The same idea applies to your database. The<a href="https://www.jetbrains.com/help/pycharm/data-editor-and-viewer.html" target="_blank" rel="noopener"> data editor and viewer</a> let you browse and query application data without leaving the IDE. After an agent generates a migration, you can inspect the resulting data and verify that the change did what you expected.</p>



<figure class="wp-block-video"><video controls src="https://blog.jetbrains.com/wp-content/uploads/2026/08/6_Export_API_DB.webm"></video></figure>



<h3 class="wp-block-heading">The IDE outlasts the agent</h3>



<p>AI tooling is changing fast, but your developer workflow can stay consistent. PyCharm combines deep Python and Django support with access to the agents and models you choose.</p>



<p>Get 30% off PyCharm, and JetBrains will donate 100% of what you pay to the Django Software Foundation.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/promo/support-django/" class="btn" target="" rel="noopener">Get 30% off PyCharm</a>
                                                    </div>
    </div>




]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What’s Fixed and Improved in PyCharm 2026.2</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/what-s-fixed-and-improved-in-pycharm-2026-2/</link>
		
		<dc:creator><![CDATA[Will Vincent]]></dc:creator>
		<pubDate>Wed, 19 Aug 2026 13:54:13 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/Whats-fixed-2026-2-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[releases]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web-development]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=731629</guid>

					<description><![CDATA[Across the PyCharm 2026.2 release line, we shipped 263 fixes and improvements. Many improve Python code insight directly, with more precise type inference, fewer false positives, smarter completion and imports, and more reliable refactoring. Here are some of the smaller changes you’re likely to notice in everyday Python development. SQLAlchemy 2.0 support SQLAlchemy has been [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Across the PyCharm 2026.2 release line, we shipped<a href="https://youtrack.jetbrains.com/issues?q=%23py%20type:%20bug%20%23resolved%20Planned%20for:%202026.2,%20%7B2026.2%20*%7D,%202026.2.1%20visible%20to:%20%7BAll%20Users%7D" target="_blank" rel="noopener"> 263 fixes and improvements</a>. Many improve Python code insight directly, with more precise type inference, fewer false positives, smarter completion and imports, and more reliable refactoring. Here are some of the smaller changes you’re likely to notice in everyday Python development.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">SQLAlchemy 2.0 support</h2>



<p>SQLAlchemy has been a long-standing source of false positives – enough that several duplicate tickets have accumulated over the years. This release resolves a batch of them for the 2.0 style.</p>



<p>String forward-references inside <code>Mapped[...]</code> resolve correctly:</p>



<pre class="EnlighterJSRAW">posts: Mapped&#091;list&#091;&quot;Post&quot;]] = relationship(back_populates=&quot;author&quot;)

# &quot;Post&quot; now resolves to the model class</pre>



<p>PyCharm also correctly infers the mapped type returned by <code>Session.get()</code>, instead of treating the result as the model class itself:</p>



<pre class="EnlighterJSRAW">report = session.get(Report, report_id)

reveal_type(report)&nbsp; # was: type&#091;Report] | None &nbsp; now: Report | None</pre>



<p>Modern <code>hybrid_property</code> setters written as <code>@name.inplace.setter</code> are recognized, so assigning to the property no longer produces a warning. Model class attributes defined via mixins are picked up again, too, clearing the old <em>unexpected argument</em> reports on model constructors.</p>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-78816" target="_blank" rel="noopener">PY-78816</a>,<a href="https://youtrack.jetbrains.com/issue/PY-65142" target="_blank" rel="noopener"> PY-65142</a>,<a href="https://youtrack.jetbrains.com/issue/PY-59732" target="_blank" rel="noopener"> PY-59732</a>,<a href="https://youtrack.jetbrains.com/issue/PY-51906" target="_blank" rel="noopener"> PY-51906</a>,<a href="https://youtrack.jetbrains.com/issue/PY-28762" target="_blank" rel="noopener"> PY-28762</a>)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Code insight and type inference</h2>



<h3 class="wp-block-heading">Control-flow narrowing and &#8220;unreachable code&#8221;</h3>



<p>Several false <em>This code is unreachable</em> reports and instances of lost narrowing across loops have been fixed. The common issue: flow analysis either gave up or over-eagerly narrowed to <code>Never </code>in branches it should have kept alive.</p>



<p><code>isinstance</code> on a numeric union no longer kills the <code>else</code> branch:</p>



<pre class="EnlighterJSRAW">def foo(y: int | float) -&gt; None:

&nbsp;&nbsp;&nbsp;&nbsp;if isinstance(y, float):

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass

&nbsp;&nbsp;&nbsp;&nbsp;else:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(y)&nbsp; # was flagged unreachable, y inferred as Never</pre>



<p>Narrowing also survives a <code>while</code> loop, so re-narrowing an optional attribute inside the loop body no longer reports a bogus <em>has no attribute</em> error.</p>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-83206" target="_blank" rel="noopener">PY-83206</a>,<a href="https://youtrack.jetbrains.com/issue/PY-83354" target="_blank" rel="noopener"> PY-83354</a>,<a href="https://youtrack.jetbrains.com/issue/PY-88265" target="_blank" rel="noopener"> PY-88265</a>)</p>



<h3 class="wp-block-heading">Strings inside type annotations</h3>



<p>A string used as metadata inside <code>Annotated[...]</code> – a Pydantic discriminator field name, for instance – is no longer parsed as a forward reference and flagged as unresolved.</p>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-48749" target="_blank" rel="noopener">PY-48749</a>,<a href="https://youtrack.jetbrains.com/issue/PY-82245" target="_blank" rel="noopener"> PY-82245</a>)</p>



<h3 class="wp-block-heading">Iterable unpacking and star expressions</h3>



<p>PyCharm&#8217;s analysis of tuple and star unpacking could lose type information and fall back to <code>Any</code>. Unpacking a starred value into a tuple lost its element types, <code>*</code>-expansion collapsed to <code>Any</code>, and several genuine errors went unreported. Starred expressions preserve their element types:</p>



<pre class="EnlighterJSRAW">def a() -&gt; tuple&#091;int, int]:

&nbsp;&nbsp;&nbsp;&nbsp;return 2, 3

def b() -&gt; tuple&#091;int, int, int]:

&nbsp;&nbsp;&nbsp;&nbsp;return (1, *a())&nbsp; # no more bogus &quot;Expected tuple&#091;int, int, int]&quot;</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-12592" target="_blank" rel="noopener">PY-12592</a>,<a href="https://youtrack.jetbrains.com/issue/PY-27205" target="_blank" rel="noopener"> PY-27205</a>,<a href="https://youtrack.jetbrains.com/issue/PY-43585" target="_blank" rel="noopener"> PY-43585</a>,<a href="https://youtrack.jetbrains.com/issue/PY-90219" target="_blank" rel="noopener"> PY-90219</a>)</p>



<h3 class="wp-block-heading">Augmented assignment</h3>



<p>A cluster of false positives came from augmented assignments being misanalyzed. A simple <code>/=</code> on an <code>int</code> produced the wrong type:</p>



<pre class="EnlighterJSRAW">foo = 5

foo /= 2

reveal_type(foo)&nbsp; # was: int &nbsp; now: float | int</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-80622" target="_blank" rel="noopener">PY-80622</a>)</p>



<h3 class="wp-block-heading"><code>Self</code> and constructor return types</h3>



<p><code>Self</code> binds correctly through <code>classmethod</code> parameters typed as <code>type[Self]</code>:</p>



<pre class="EnlighterJSRAW">class A:

&nbsp;&nbsp;&nbsp;&nbsp;@classmethod

&nbsp;&nbsp;&nbsp;&nbsp;def bar(cls, y: type&#091;Self]) -&gt; Self: ...

x = A.bar(A)&nbsp; &nbsp; &nbsp; # was a spurious &quot;Expected type&#091;A], got type&#091;A]&quot;

reveal_type(x)&nbsp; &nbsp; # was: Any &nbsp; now: A</pre>



<p>Construction also respects <code>__new__</code>, <code>__init__</code>, and metaclass <code>__call__</code>. When <code>__new__</code> returns something other than an instance, that&#8217;s the constructed type – even when an <code>__init__</code> is present. The same fix covers explicitly parameterized calls like <code>MyClass[int]()</code> and <code>__new__</code> assigned as a class attribute.</p>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-89296" target="_blank" rel="noopener">PY-89296</a>,<a href="https://youtrack.jetbrains.com/issue/PY-77611" target="_blank" rel="noopener"> PY-77611</a>,<a href="https://youtrack.jetbrains.com/issue/PY-88644" target="_blank" rel="noopener"> PY-88644</a>,<a href="https://youtrack.jetbrains.com/issue/PY-89571" target="_blank" rel="noopener"> PY-89571</a>)</p>



<h3 class="wp-block-heading">Enum members: Literal types for <code>.value</code> and <code>.name</code></h3>



<p>Reading an enum member&#8217;s <code>.value</code> or <code>.name</code> yields a precise <code>Literal</code> instead of a widened <code>str</code> or <code>int</code>, so assignments to <code>Literal[...]</code> target type-check. This matches <code>mypy</code>’s inference:</p>



<pre class="EnlighterJSRAW">from enum import Enum

from typing import Literal

class E(Enum):

&nbsp;&nbsp;&nbsp;&nbsp;a = &quot;a&quot;

b: Literal&#091;&quot;a&quot;] = E.a.value &nbsp; # was: Expected &#039;Literal&#091;&quot;a&quot;]&#039;, got &#039;str&#039;

n: Literal&#091;&quot;a&quot;] = E.a.name&nbsp; &nbsp; # .name is a Literal too</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-61028" target="_blank" rel="noopener">PY-61028</a>,<a href="https://youtrack.jetbrains.com/issue/PY-79198" target="_blank" rel="noopener"> PY-79198</a>)</p>



<h3 class="wp-block-heading">Parameter types inferred from decorators</h3>



<p>When a decorator constrains the callable it accepts, the decorated function&#8217;s parameters are inferred from that constraint instead of falling back to <code>Any</code>:</p>



<pre class="EnlighterJSRAW">from typing import Callable

def d(fn: Callable&#091;&#091;int], str]): ...

@d

def f(a):

&nbsp;&nbsp;&nbsp;&nbsp;reveal_type(a) &nbsp; # was: Any &nbsp; now: int</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-79204" target="_blank" rel="noopener">PY-79204</a>)</p>



<h3 class="wp-block-heading">Also fixed</h3>



<ul class="wp-block-list">
<li>Keyword arguments in a class header are validated against the base class&#8217;s <code>__init_subclass__</code> signature, and offered in completion (<a href="https://youtrack.jetbrains.com/issue/PY-79173" target="_blank" rel="noopener">PY-79173</a>).</li>



<li>An ellipsis in a <code>Callable</code> used as a PEP 695 type-parameter bound no longer reports a bogus <em>Invalid type expression</em> (<a href="https://youtrack.jetbrains.com/issue/PY-83570" target="_blank" rel="noopener">PY-83570</a>).</li>



<li>Type-checker findings are split into granular suppression codes rather than a single <code>PyTypeChecker</code> id, and <code># noinspection</code> directives accept a simplified name form. <code>PyTypeChecker</code> still works as a blanket ignore (<a href="https://youtrack.jetbrains.com/issue/PY-90265" target="_blank" rel="noopener">PY-90265</a>).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Completion and auto-import</h2>



<h3 class="wp-block-heading">Smarter auto-import&nbsp;</h3>



<p>Auto-import is now noticeably less noisy. Previously, if a module was already imported, PyCharm would offer to add a second, redundant import instead of qualifying through the one you already had. The quick-fix – and the completion popup – prefer to reuse the existing import.</p>



<p>Given <code>pkg/src.py</code> containing <code>MyClass</code>, and a file that already imports the module, <em>Alt</em>+<em>Enter</em> produces this:</p>



<pre class="EnlighterJSRAW">from pkg import src&nbsp; # no longer flagged as unused

src.MyClass</pre>



<p>instead of adding <code>from pkg.src import MyClass</code>. The same reuse logic applies to plain <code>import pkg.src</code>, and to the auto-import completion on a second <em>Ctrl</em>+<em>Space</em>.</p>



<p>Nested classes can be auto-imported too, which is something PyCharm didn&#8217;t previously support:</p>



<pre class="EnlighterJSRAW"># mod.py

class Outer:

&nbsp;&nbsp;&nbsp;&nbsp;class Inner:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass

# main.py – Alt+Enter on Inner now offers &quot;Import Outer from mod&quot;

from mod import Outer

value = Outer.Inner()</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-87970" target="_blank" rel="noopener">PY-87970</a>,<a href="https://youtrack.jetbrains.com/issue/PY-87971" target="_blank" rel="noopener"> PY-87971</a>,<a href="https://youtrack.jetbrains.com/issue/PY-87972" target="_blank" rel="noopener"> PY-87972</a>,<a href="https://youtrack.jetbrains.com/issue/PY-88009" target="_blank" rel="noopener"> PY-88009</a>,<a href="https://youtrack.jetbrains.com/issue/PY-88016" target="_blank" rel="noopener"> PY-88016</a>)</p>



<h3 class="wp-block-heading">Completion for <code>unittest.mock.patch()</code> targets</h3>



<p>Patching by string target previously offered no code assistance, so dotted paths had to be entered manually. The string argument to <code>mock.patch(...)</code> gets code completion for modules, classes, and their attributes, and it no longer suggests the invalid <code>as</code> keyword mid-path:</p>



<pre class="EnlighterJSRAW">from unittest import mock

# sample.py defines: class Foo: my_attr = 42

with mock.patch(&quot;sample.Foo.my_attr&quot;, 14):

&nbsp;&nbsp;&nbsp;&nbsp;...

# completion now offers `sample`, `Foo`, and `my_attr`</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-89189" target="_blank" rel="noopener">PY-89189</a>,<a href="https://youtrack.jetbrains.com/issue/PY-89191" target="_blank" rel="noopener"> PY-89191</a>,<a href="https://youtrack.jetbrains.com/issue/PY-89192" target="_blank" rel="noopener"> PY-89192</a>)</p>



<h3 class="wp-block-heading">Typed signatures when overriding built-in methods</h3>



<p>Completing an override of a dunder or built-in method fills in the full annotated signature – and auto-imports the types it needs – instead of bare parameters:</p>



<pre class="EnlighterJSRAW">from types import TracebackType

class A:

&nbsp;&nbsp;&nbsp;&nbsp;def __exit__(self, exc_type: type&#091;BaseException] | None,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exc_val: BaseException | None,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exc_tb: TracebackType | None): ...

# was: def __exit__(self, exc_type, exc_val, exc_tb):</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-79218" target="_blank" rel="noopener">PY-79218</a>)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Editor and inspections</h2>



<h3 class="wp-block-heading">Type inlay hints</h3>



<p>Inferred type arguments are shown inline at the call site, so you can see what a generic resolved to without hovering over it:</p>



<pre class="EnlighterJSRAW">class A&#091;T]:

&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, t: T): ...

A&#091;int](1) &nbsp; &nbsp; # &#091;int] shown as an inlay hint</pre>



<p>Type names rendered inside inlay hints – return types and solved arguments alike – are also clickable, so you can jump straight to a type&#8217;s definition from the hint.</p>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-90411" target="_blank" rel="noopener">PY-90411</a>,<a href="https://youtrack.jetbrains.com/issue/PY-90293" target="_blank" rel="noopener"> PY-90293</a>)</p>



<h3 class="wp-block-heading"><code>f-string</code> format-spec validation</h3>



<p>PyCharm already validated the <code>str.format()</code> mini-language. Those checks apply to <code>f-strings</code> too, and PyCharm flags formatting a type that doesn&#8217;t implement <code>__format__</code>:</p>



<pre class="EnlighterJSRAW">data = 1

f&quot;{data:.2f}&quot; &nbsp; # ok

f&quot;{data:.2q}&quot; &nbsp; # now flagged: unsupported format spec

class A: ...

f&quot;{A():d}&quot;&nbsp; &nbsp; &nbsp; # now flagged: A doesn&#039;t support the &#039;d&#039; format</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-51322" target="_blank" rel="noopener">PY-51322</a>,<a href="https://youtrack.jetbrains.com/issue/PY-89760" target="_blank" rel="noopener"> PY-89760</a>)</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Refactoring</h2>



<p>The <em>Rename</em> refactoring also updates references to a module when the module itself is renamed. Previously, the renaming left importing sites pointing at the old name:</p>



<pre class="EnlighterJSRAW"># rename provider/provider_module.py → some_module.py

from ..provider import provider_module&nbsp; # this reference is updated too</pre>



<p>(<a href="https://youtrack.jetbrains.com/issue/PY-53274" target="_blank" rel="noopener">PY-53274</a>)</p>



<p>The <em>Refactor | Field action</em> is now <em>Attribute</em>, and the documentation says &#8220;instance attributes&#8221; to match Python terminology (<a href="https://youtrack.jetbrains.com/issue/PY-85828" target="_blank" rel="noopener">PY-85828</a>).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Taken together, these changes make PyCharm’s understanding of Python more precise and predictable: fewer false positives, better type inference, smarter completion, and less time spent working around cases where the IDE gets valid code wrong.</p>



<p>Many of these improvements started with real-world examples reported by users. If PyCharm still misunderstands a typing pattern, framework API, or other valid Python code in your project, let us know in YouTrack – a small reproducer can help us turn that friction into the next fix.</p>



<p>Try <a href="https://www.jetbrains.com/pycharm/" target="_blank" rel="noopener">PyCharm 2026.2</a> and let us know which improvements make the biggest difference for your workflow.</p>



<p>Thank you for using PyCharm!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hybrid and Local AI course at DeepLearning.AI</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/hybrid-and-local-ai-course-at-deeplearning-ai/</link>
		
		<dc:creator><![CDATA[Paul Everitt]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 10:01:32 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/PC-social-BlogFeatured-1280x720-1.png</featuredImage>		<product ><![CDATA[education]]></product>
		<category><![CDATA[learning-courses]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[local-ai]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=730368</guid>

					<description><![CDATA[Open weight models are having a moment, driven by control, choice, and cost. Hybrid and local AI are now getting serious looks, so JetBrains teamed up with DeepLearning.AI on a free AI Coding Workflows: Hybrid to Local course that covers the ideas and options. The course is now available and uses PyCharm and its AI [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Open weight models are having a moment, driven by control, choice, and cost. Hybrid and local AI are now getting serious looks, so JetBrains teamed up with <a href="https://www.deeplearning.ai" target="_blank" rel="noopener">DeepLearning.AI</a> on a free <a href="https://learn.deeplearning.ai/courses/ai-coding-workflows-from-cloud-to-local/lesson/napfi1/introduction" target="_blank" rel="noopener">AI Coding Workflows: Hybrid to Local</a> course that covers the ideas and options.</p>



<p>The course is now available and uses <a href="https://www.jetbrains.com/pycharm/" data-type="link" data-id="https://www.jetbrains.com/pycharm/" target="_blank" rel="noopener">PyCharm</a> and its AI Chat. Here’s a peek into the course.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Take back control of your AI coding workflow" src="https://www.youtube.com/embed/xUXJuPC7gz0?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Claude Code: Subagents and cheaper models</h2>



<p>We start the course with, well, not-local. Instead, we use what you already know – Claude Code and its Anthropic models – to introduce some of the techniques and “levers” that help bring choice, control, and even cost reduction. (Yes, I wrote emdashes.)</p>



<p>We did a previous course on <a href="https://www.deeplearning.ai/courses/spec-driven-development-with-coding-agents" target="_blank" rel="noopener">Spec-Driven Development</a> (SDD) so of course, we wanted to start there. Smaller models struggle with big, open-ended “vibe coding.” Dividing and bounding the work keeps smaller models on track. Important note: this course’s example app is <em>really</em> basic. You might say “that’s too easy.” But that’s part of the takeaway: big brain models can do the upfront work, forming right-sized steps for smaller models.</p>



<p>We then illustrate this division with a Claude Code <em>subagent</em>. The main chat prompt implements each roadmap phase in a fresh subagent, to better manage context. This then gives the payoff: a cheaper model for the implementer. Use a “big brain” (Opus) for main conversation thinking and a “little brain” (Haiku) for implementation.</p>



<p>Each lesson finishes with metrics about the change in tokens, turns, cost, and estimated wall time. Which brings us to the main course goal: learning the <em>ideas</em> instead of the specifics, which change weekly.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/metrics.png" alt="" class="wp-image-730947"/></figure>



<h2 class="wp-block-heading">New agent, inference, and model</h2>



<p>That covers the four levers:</p>



<ul class="wp-block-list">
<li>Specs shaped for the model size</li>



<li>Specialist subagents to divide work</li>



<li>Cheaper models for the routine work</li>



<li>Collect metrics as evidence to guide thinking</li>
</ul>



<p><br>The course then introduces choice and control:</p>



<ul class="wp-block-list">
<li>New agent: OpenCode</li>



<li>New inference router: OpenRouter</li>



<li>New model and inference host: DeepSeek (via OpenRouter) by moving to a new agent (OpenCode) using inference routing (OpenRouter) to inference hosting and models (DeepSeek)</li>
</ul>



<p><br>We first move to OpenCode, running in PyCharm. JetBrains wants our IDEs to be <em>open platforms</em> for agents and models. This makes the move from Claude Code to OpenCode straightforward: it’s the same UI. We add OpenRouter (a paid step), connect it to OpenCode, and choose DeepSeek as a model.</p>



<p>Next we repeat our sequence: all in one chat, then context isolation using a subagent. But this time, with a different agent and model.</p>



<p>We finish by making a dedicated implementer subagent in Markdown. This gives quite a number of levers of control: in the frontmatter for mandatory controls, and in the subagent body for “persuasion” guidance. Most importantly, we have the implementer use the smaller DeepSeek v4 Flash model as the “little brain.”</p>



<p>Compared to the Claude Code version, the metrics were, unsurprisingly, a lot cheaper.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/openrouter.png" alt="" class="wp-image-730958"/></figure>



<h2 class="wp-block-heading">Hybrid and Local</h2>



<p>Now for the main attraction: for routine development, can we do some – or even all – of the work locally?</p>



<p>We start with a lesson on setting up local AI: LM Studio as the inference server and Gemma 4 12B as the local model, targeting a 32 GB laptop.</p>



<p>We then configure the implementer subagent to use this local Gemma 4 model, promoting DeepSeek v4 Flash from last lesson’s “little brain” up to “big brain.” The results? Quite good, as it turns out.</p>



<p>Then the big test: fully local, with Qwen 3.5 27B as the “big brain.” The results: better than expected, showing that guardrails help.</p>



<p>How did hybrid and local do? Both of these lessons finish with a review of the metrics. That’s one of the big course takeaways: look at the evidence. You can see how small models struggle, and see the effect of helping them succeed.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/lmstudio.png" alt="" class="wp-image-730969"/></figure>



<h2 class="wp-block-heading">Hybrid and Local AI Are Heating Up</h2>



<p>Much thanks to <a href="http://deeplearning.ai/" target="_blank" rel="noopener">DeepLearning.AI</a> both for working with us again and for pushing to get this out fast. This topic is now red-hot in the news: Sovereign AI, privacy and security, and of course cost. The innovations are coming really fast and it is important to have a gentle introduction to the fundamentals.</p>



<p>We’ll do more updates here on Local AI for control, choice, and cost. Most of all, we at PyCharm believe in the human-in-the-loop. Stay tuned for more on this.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://learn.deeplearning.ai/courses/ai-coding-workflows-from-cloud-to-local/lesson/napfi1/introduction" class="btn" target="" rel="noopener">Enroll for free</a>
                                                    </div>
    </div>




]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What&#8217;s New in PyCharm 2026.2.1</title>
		<link>https://blog.jetbrains.com/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</link>
		
		<dc:creator><![CDATA[Evgenia Verbina]]></dc:creator>
		<pubDate>Wed, 12 Aug 2026 12:05:32 +0000</pubDate>
		<featuredImage>https://blog.jetbrains.com/wp-content/uploads/2026/08/PC-releases-BlogFeatured-1280x720-1.png</featuredImage>		<category><![CDATA[releases]]></category>
		<guid isPermaLink="false">https://blog.jetbrains.com/?post_type=pycharm&#038;p=727409</guid>

					<description><![CDATA[This PyCharm release is a big one for anyone building with AI. Your agents can now roll up their sleeves inside your Jupyter notebooks – working against a live kernel instead of firing off disconnected scripts. And they finally know which Python to use, so packages land in the right environment every time. We&#8217;re also [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>This <a href="https://www.jetbrains.com/pycharm/" data-type="link" data-id="https://www.jetbrains.com/pycharm/" target="_blank" rel="noopener">PyCharm</a> release is a big one for anyone building with AI. Your agents can now roll up their sleeves inside your Jupyter notebooks – working against a live kernel instead of firing off disconnected scripts. And they finally know which Python to use, so packages land in the right environment every time.</p>



<p>We&#8217;re also welcoming marimo notebooks into the IDE and introducing changes to bundled plugins to keep PyCharm fast and focused.</p>



<h2 class="wp-block-heading">Release highlights</h2>



<h3 class="wp-block-heading">Jupyter notebook skill for AI agents</h3>



<p>Let AI agents such as Claude Code and Codex create, edit, and run <code>.ipynb</code> notebooks via PyCharm&#8217;s notebook model and a live kernel, so variables, models, and data persist across cells instead of disappearing when the agent shells out. For you, this means more reliable notebook and ML work – with fewer tokens used. To start, just open the AI chat and ask the agent to work in your notebook.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://blog.jetbrains.com/pycharm/2026/08/we-gave-ai-agents-a-live-jupyter-kernel-in-pycharm/" class="btn" target="">Learn more</a>
                                                    </div>
    </div>







<h3 class="wp-block-heading">Agent environment coordinator</h3>



<p>Tired of AI agents installing packages into the wrong Python environment? This new skill gives the agent your project&#8217;s configured interpreter and tool – <code>uv</code>, Poetry, <code>pip</code> in a <code>venv</code>, or <code>conda</code> – so commands target the right environment, not a system one. If none exists, it can set one up via PyCharm, and the agent decides how to use the information. To start, ask the agent to run or install something in your project.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://blog.jetbrains.com/pycharm/2026/08/we-stopped-ai-agents-from-installing-into-the-wrong-python-task-success-rates-jumped-to-95/" class="btn" target="">Learn more</a>
                                                    </div>
    </div>







<h3 class="wp-block-heading">marimo notebooks in PyCharm [third-party plugin]</h3>



<p>You can now open, edit, and run marimo notebooks directly in PyCharm with the new plugin developed by the marimo team.&nbsp;</p>



<p>Work with reactive cells and interactive UI elements in a dedicated notebook without leaving your IDE. Because marimo notebooks are stored as Python files, they are Git-friendly, executable as scripts, and easy to integrate into your existing Python projects.</p>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/07/image-51.png" alt="" class="wp-image-727410"/></figure>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://plugins.jetbrains.com/plugin/32416-marimo" class="btn" target="" rel="noopener">Install the plugin</a>
                                                    </div>
    </div>







<h3 class="wp-block-heading">Changes to bundled plugins in 2026.2</h3>



<p>As part of ongoing maintenance, we are unbundling and deprecating low-usage plugins, including Data Wrangler, Hugging Face, and Google Colab support. You can continue to install compatible versions from JetBrains Marketplace, but these plugins are no longer bundled or actively maintained by the PyCharm team. A more focused set of bundled plugins means a leaner codebase, helping us keep PyCharm fast and responsive and invest our effort where it has the most impact.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://blog.jetbrains.com/pycharm/2026/08/unbundling-and-deprecating-low-usage-plugins-in-pycharm/" class="btn" target="">Learn more</a>
                                                    </div>
    </div>







<h2 class="wp-block-heading">Redesigned Python Packages tool window</h2>



<ul class="wp-block-list">
<li>Packages now appear in a collapsible tree alongside their dependencies so you can see what&#8217;s installed and why – with new icons, right-aligned versions, and inline Install/Update links.</li>



<li>A new floating search popup (think “Search Everywhere” but for packages) makes finding and installing fast. It also shows you which environment will be used and lets you pick a module and dependency group.</li>



<li>You can install a package into specific <code>uv</code>/Poetry dependency groups like dev or test per workspace member, change versions inline or through the new Change Version dialog, and install from VCS via Custom Installation.</li>



<li>Package repositories can be enabled or disabled, with state remembered across sessions. In addition, unreachable URLs show a clear error, and Remote Development support is substantially improved.</li>
</ul>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/PY-89838-Python-Packages-Tool-Window-redesign.png" alt="Redesigned Python Packages tool window in PyCharm" class="wp-image-730282"/></figure>



<h2 class="wp-block-heading">Clearer type checking</h2>



<p>Get clearer, more actionable type messages:</p>



<ul class="wp-block-list">
<li>Richer type-mismatch errors, now with a breakdown of why the types don&#8217;t match. </li>



<li>A type diff for callables and other composite types, so both sides read the same way. </li>



<li>Fully rendered names and types in inspection tooltips, with clickable links. </li>
</ul>



<figure class="wp-block-image size-full"><img style="width:100% !important; height:auto !important; max-width:100% !important;" loading="lazy" decoding="async" src="https://blog.jetbrains.com/wp-content/uploads/2026/08/PY-80221-explain_Show-a-breakdown-when-type-mismatch-is-reported.png" alt="Clearer type checking in PyCharm" class="wp-image-730293"/></figure>



<h2 class="wp-block-heading">Bug fixes</h2>



<ul class="wp-block-list">
<li><strong>Virtual environments for end-of-life Python</strong>: PyCharm no longer creates venvs for Python 2.7, 3.6, and 3.7. You can still create a new env from a command line and add it to the IDE manually.</li>



<li><strong>SQLAlchemy 2.0 Session.get() inference</strong>: <code>Session.get(Entity, id)</code> (and SQLModel) is now inferred as a model instance rather than the class.</li>
</ul>



<h2 class="wp-block-heading">Download PyCharm</h2>



<p>All of these updates are available in PyCharm 2026.2.1. Update right from the IDE or the Toolbox App, or <a href="https://www.jetbrains.com/pycharm/download/" target="_blank" rel="noopener">download the latest version</a> to try everything out on your own projects. As always, we’d love to hear your feedback.</p>


    <div class="buttons">
        <div class="buttons__row">
                                                <a href="https://www.jetbrains.com/pycharm/download/" class="btn" target="" rel="noopener">Download PyCharm</a>
                                                    </div>
    </div>







<p></p>
]]></content:encoded>
					
		
		
		                    <language>
                        <code><![CDATA[zh-hans]]></code>
                        <url>https://blog.jetbrains.com/zh-hans/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[pt-br]]></code>
                        <url>https://blog.jetbrains.com/pt-br/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ko]]></code>
                        <url>https://blog.jetbrains.com/ko/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[ja]]></code>
                        <url>https://blog.jetbrains.com/ja/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[fr]]></code>
                        <url>https://blog.jetbrains.com/fr/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[es]]></code>
                        <url>https://blog.jetbrains.com/es/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                                    <language>
                        <code><![CDATA[de]]></code>
                        <url>https://blog.jetbrains.com/de/pycharm/2026/08/what-s-new-in-pycharm-2026-2-1/</url>
                    </language>
                	</item>
	</channel>
</rss>
