<?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>ShiftMag</title>
	<atom:link href="https://shiftmag.dev/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Thu, 25 Jun 2026 13:35:46 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>ShiftMag</title>
	<link>https://shiftmag.dev/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>A Future Where Nobody Writes Code Manually Might Be Closer Than It Seems</title>
		<link>https://shiftmag.dev/future-no-one-writes-code-manually-10471/</link>
		
		<dc:creator><![CDATA[Ivan Simic]]></dc:creator>
		<pubDate>Thu, 25 Jun 2026 13:35:45 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10471</guid>

					<description><![CDATA[<p>As AI tools reshape how software is built, the engineers in our new video say the job is shifting from writing every line by hand to guiding, reviewing, and orchestrating what AI produces.</p>
<p>The post <a href="https://shiftmag.dev/future-no-one-writes-code-manually-10471/">A Future Where Nobody Writes Code Manually Might Be Closer Than It Seems</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img fetchpriority="high" decoding="async" width="1280" height="720" src="https://shiftmag.dev/wp-content/uploads/2026/06/Thumb_2.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/Thumb_2.jpg 1280w, https://shiftmag.dev/wp-content/uploads/2026/06/Thumb_2-300x169.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/Thumb_2-1024x576.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/Thumb_2-768x432.jpg 768w" sizes="(max-width: 1280px) 100vw, 1280px" /></figure>


<p class="wp-block-paragraph">Once again, we brought together some of the finest minds Infobip has to answer tricky questions about the future of software. </p>



<p class="wp-block-paragraph">This time around, we spoke to four Infobip engineers about <strong>how they use AI in their daily work</strong> and how they view the AI revolution happening now.</p>



<h2 class="wp-block-heading"><span id="research-plan-execute">Research, plan, execute</span></h2>



<p class="wp-block-paragraph">With rapidly changing AI infrastructure, the things that used to be normal in software development are getting different, but some things stay the same. </p>



<p class="wp-block-paragraph"><strong>Petar Dučić</strong>, Engineering Director, said that the company&#8217;s mantra <strong>&#8220;you build it, you own it&#8221; has remained the same in the AI era</strong>. This simply means that engineers are responsible for whatever they build.</p>



<p class="wp-block-paragraph">Senior IT Research Scientist <strong>Ante Kapetanović</strong>, added that engineers need to <strong>separate their work phases </strong>efficiently:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You have to separate your research phase, your planning phase, and your coding implementation, whatever phase. This ultimately means that you own each step of the way. And basically, it is not AI-assisted coding, it is more human-assisting AI.</p>
</blockquote>



<h2 class="wp-block-heading">Engineering is now becoming even more necessary&#8230;</h2>



<p class="wp-block-paragraph">It&#8217;s true that using AI tools is, in many cases, a cheaper alternative to real people, but Petar pointed out that engineering is now becoming even more necessary, because there&#8217;s so many things that can go wrong, and <strong>we need real people to check them</strong> and undestand what&#8217;s going on.</p>



<p class="wp-block-paragraph">Senior Software Engineer<strong> Rino Čala</strong> pointed out that there&#8217;s <strong>three types of mistakes agentic tools make</strong>: logical mistakes, code-based mistakes and security mistakes. The solution is, as Rino puts it, just more tests:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">So it is definitely important to run tests, to run some local tests, CI tests, and do some static checks as well.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Zvonimir Petković</strong>, Staf Engineer, then explained that <strong>security issues</strong> are the number one flaw with AI software tools:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Security is the main risk with deploying Gen-AI generated code. With the whole Vibe coding setup, nobody looks at the code, and oftentimes we have also non-engineers deploying code. The hiding sensitive data within the source code itself, this is the number one problem.</p>
</blockquote>



<p class="wp-block-paragraph">The second problem for Zvonimir is <strong>scalability</strong>. Something that is built in a couple days might work fine for a small team, but cannot be scaled to 5,000 people easily.</p>



<h2 class="wp-block-heading">&#8230; and engineers are now more orchestrators than code writers</h2>



<p class="wp-block-paragraph">A stark contrast to the narrative of AI taking away jobs for engineers is that, with more people actively using AI, there&#8217;s a <strong>bigger need for someone with a technical background </strong>to help with not just support, but education.</p>



<p class="wp-block-paragraph">&#8220;We&#8217;re slowly becoming context engineers&#8221;, added Ante, saying that engineers are now spending a lot of time managing their context in different AI tools. He is personally a big advocate for writing your own code and feels like this is a major part of being an engineer. Still, Ante admits that might not be the case in a couple years.</p>



<p class="wp-block-paragraph">Zvonimir, interestingly, had a take about exactly that:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The total trend is that in a few years&#8217; time, we&#8217;ll have the situation where nobody writes the code manually. Software engineers will be like persons who are the experts in that field, so they will be able to review what gen AI has generated.</p>
</blockquote>



<p class="wp-block-paragraph">In conclusion, as Rino puts it, engineers are now more in the role of orchestrators and organizers than they are code writes, since they spend a lot of time managing AI models to do things properly.</p>



<p class="wp-block-paragraph"><strong>Want to hear more? Check out the video.</strong></p>



<p class="wp-block-paragraph"><em>Special thanks to our fellow colleagues at Infobip, the publisher of ShiftMag!</em></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="From Code Writers to Agent Managers" width="500" height="281" src="https://www.youtube.com/embed/KGTQ7vG6ofo?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>The post <a href="https://shiftmag.dev/future-no-one-writes-code-manually-10471/">A Future Where Nobody Writes Code Manually Might Be Closer Than It Seems</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tokens and PR velocity won’t tell you if your AI investment is paying off</title>
		<link>https://shiftmag.dev/measure-ai-investment-beyond-tokens-pr-velocity-10010/</link>
		
		<dc:creator><![CDATA[Mia Biberovic]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 13:24:28 +0000</pubDate>
				<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Catherine Hicks]]></category>
		<category><![CDATA[CTO Craft]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10010</guid>

					<description><![CDATA[<p>Your AI metrics might be measuring the wrong thing. Dr. Catherine Hicks explains how to fix the theory, not the dashboards.</p>
<p>The post <a href="https://shiftmag.dev/measure-ai-investment-beyond-tokens-pr-velocity-10010/">Tokens and PR velocity won’t tell you if your AI investment is paying off</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-768x403.jpg 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">At CTO Craft Con, <strong>Dr. Catherine Hicks</strong> (founder of Catharsis Consulting and researcher on open-science work involving 15,000+ developers) argued that most engineering measurement failures aren’t really data problems.</p>



<p class="wp-block-paragraph">No matter how much dashboards you vibe-code (we all do that nowadays, don’t we?), the problem is theoretical: <strong>understanding what causal model your metrics are actually testing.</strong></p>



<h2 class="wp-block-heading"><span id="are-you-building-spike-lines">Are you building spike lines?</span></h2>



<p class="wp-block-paragraph">Hicks opened with a historical detour that turned out to be her sharpest part of the argument. Probably a bit brutal from today&#8217;s point of view, but <strong>early electricity measurement </strong>looked straightforward: count the deaths, count the lumens, measure the hours of labor saved. </p>



<p class="wp-block-paragraph">Why the number of deaths? Those<strong> numbers made sense relative to what came before</strong>. Gas infrastructure occasionally caused sidewalks to explode. Zero to ten electrocution deaths in a neighborhood looked different once you remembered that twenty people you knew had died from the sidewalk going up.</p>



<p class="wp-block-paragraph">Measurement always encodes a comparison, and if you do not make that comparison explicit, your metric will mislead you.</p>



<p class="wp-block-paragraph">The more cutting example was the spike line. In early U.S. rural electrification, large power companies would create something called a <strong>spike line</strong>. It&#8217;s a single wire that ran through a region, sometimes connected to nothing more useful than a light in a shed, in order to legally claim the territory and block rural co-ops from building real infrastructure. The federal government that was<strong> measuring electrification by the presence of a line</strong> wasn’t measuring access but the exact opposite.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="853" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-2-1024x853.jpg?x94846" alt="" class="wp-image-10172" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-2-1024x853.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-2-300x250.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-2-768x640.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-Catherine-Hicks-2.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">CTO Craft Con</figcaption></figure>



<p class="wp-block-paragraph">Hicks argued that <strong>engineering organizations are building spike lines right now</strong>, and mostly do not know it.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Measurement failures usually come back to theory failures.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-loudest-thing-on-slack-might-not-be-the-most-important">The loudest thing (on Slack) might not be the most important</span></h2>



<p class="wp-block-paragraph">A change theory, in her framing, is a causal model: if I give engineers more ramp time on this language, they will engage differently with these processes, and that will produce a business outcome. Everyone operates inside such models, but most teams never make them explicit. </p>



<p class="wp-block-paragraph"><strong>The result is that they default to measuring what is visible, what is fast to collect, or what is loudest on Slack.</strong> None of those is necessarily connected to the outcome they care about.</p>



<p class="wp-block-paragraph">On AI specifically, she identified <strong>three recurring failure modes</strong>:</p>



<ol class="wp-block-list">
<li><strong>Treating developers as interchangeable units</strong>&nbsp;producing identical work, when they’re actually using AI in highly individual contexts.</li>



<li><strong>Reading early spikes in code volume as a stable signal</strong>, when research on open-source repositories shows those spikes often normalize into different patterns within weeks.</li>



<li><strong>Measuring only at the individual level</strong>&nbsp;while ignoring the interaction between the tool, the team, the task, the project goals, and organizational culture &#8211; a system Hicks said has too many interaction terms for any person to hold at once.</li>
</ol>



<p class="wp-block-paragraph">Her response to that complexity was deliberate:<strong> stop trying to measure everything</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Your job is not to measure everything that&#8217;s happening. What you really need to do is think about what in your organization are the key signals to measure if they give you two things.</p>
</blockquote>



<p class="wp-block-paragraph">Those two things are levers, predictors of large behavioral patterns, or blockers you can actually remove, and shared outcomes you can hold the organization accountable to over time.</p>



<h2 class="wp-block-heading"><span id="correlation-between-learning-culture-and-team-effectiveness">Correlation between learning culture and team effectiveness</span></h2>



<p class="wp-block-paragraph">Hicks drew on her own research to illustrate what a well-theorized lever looks like. </p>



<p class="wp-block-paragraph">In a 2024 study of over 3,000 working developers, her team tested<strong> </strong><a href="https://shiftmag.dev/dr-cat-hicks-software-teams-psychology-5357/" target="_blank" rel="noreferrer noopener">whether learning culture could reduce the identity threat that developers report feeling from AI</a><strong>.</strong> Teams with strong learning cultures, defined as believing they have organizational support to learn, and rejecting fixed-mindset assumptions about what makes someone technically capable, cut their AI-related identity threat by 50% or more. She has since replicated the correlation between learning culture and team effectiveness across multiple engineering organizations, and found that reaching the highest effectiveness tier requires clearing a threshold of learning culture, not just improving incrementally.</p>



<p class="wp-block-paragraph">The practical upshot for leaders:<strong> if you want to measure whether your AI investment is working, you probably should not start with token consumption or PR velocity</strong>. You should <strong>ask whether developers believe their organization treats learning as legitimate work</strong>.</p>



<h2 class="wp-block-heading"><span id="what-if-your-metrics-are-broken">What if your metrics are broken?</span></h2>



<p class="wp-block-paragraph">On the question of what to actually do when you realize your metrics are broken, Hicks was direct. Describe how you got there. Find the argument you lost, or the organizational story that made a bad measure feel safe to commit to. <strong>Then build a change theory first, and derive the measures from that</strong>, not the other way around.</p>



<p class="wp-block-paragraph">She closed with a framing that captured her broader position: you are not trying to map every variable in a complex system. You are trying to create enough shared understanding that people will tell you what is actually happening.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You will become the person who can hear what is really happening. You will be the person who will start to hear: I think we&#8217;re measuring spike lines over here.</p>
</blockquote>



<p class="wp-block-paragraph">That, she argued, is more useful than any dashboard.</p>
<p>The post <a href="https://shiftmag.dev/measure-ai-investment-beyond-tokens-pr-velocity-10010/">Tokens and PR velocity won’t tell you if your AI investment is paying off</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>This IDE Plugin Shows the Energy Cost of Your AI Prompts</title>
		<link>https://shiftmag.dev/energy-cost-ai-prompts-10404/</link>
		
		<dc:creator><![CDATA[Ivan Simic]]></dc:creator>
		<pubDate>Tue, 23 Jun 2026 13:22:55 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[environmental impact]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[university of bristol]]></category>
		<category><![CDATA[ustwo]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10404</guid>

					<description><![CDATA[<p>When tech company ustwo assessed one AI product’s carbon footprint, they found most came from AI inference. It raised a question: if AI has a measurable environmental impact, why is it almost invisible to everyday users?</p>
<p>The post <a href="https://shiftmag.dev/energy-cost-ai-prompts-10404/">This IDE Plugin Shows the Energy Cost of Your AI Prompts</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1280" height="719" src="https://shiftmag.dev/wp-content/uploads/2026/06/PRISM-TEAM-ustwo.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/PRISM-TEAM-ustwo.png 1280w, https://shiftmag.dev/wp-content/uploads/2026/06/PRISM-TEAM-ustwo-300x169.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/PRISM-TEAM-ustwo-1024x575.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/PRISM-TEAM-ustwo-768x431.png 768w" sizes="auto, (max-width: 1280px) 100vw, 1280px" /></figure>


<p class="wp-block-paragraph">That question led Paolo Rizzi (sustainability principal at ustwo), <strong>Nayan Jain</strong>, Executive Director of AI at ustwo and Nick Hegarty (Executive Director of Technology at ustwo)to start looking for tools that could help developers see the environmental cost of their AI usage while they worked.</p>



<p class="wp-block-paragraph">Having found no real tools for this, ustwo and the University of Bristol built one: <a href="https://marketplace.visualstudio.com/items?itemName=ustwo.prism-carbon-tracker&amp;ssr=false#overview" target="_blank" rel="noreferrer noopener">PRISM</a>. It launched last week, and we sat down with Nayan to talk about how it works and what it aims to change.</p>



<h2 class="wp-block-heading"><span id="prism-uses-ai-token-activity-to-estimate-energy-use-and-emissions">PRISM uses AI token activity to estimate energy use and emissions</span></h2>



<p class="wp-block-paragraph">The tools that were available mostly focused on data centers or broad &#8220;big picture&#8221; ideas, but <strong>none catered to the developers actually using AI tools</strong>. </p>



<p class="wp-block-paragraph">That gap led the ustwo team to think about ways to connect AI usage to real-world energy:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We quickly ran into a challenge that still exists today: a lack of transparent data from model providers. Without reliable information on energy consumption and infrastructure, it is difficult to build and validate a model with confidence.</p>
</blockquote>



<p class="wp-block-paragraph">Working around that, <strong>they decided to rely on tokens</strong>, a visible and relatively accurate measure of AI spend.</p>



<p class="wp-block-paragraph">The idea was to use token activity as a proxy for compute demand and estimate energy use and emissions using published research and carbon accounting principles, including the Green Software Foundation’s Software Carbon Intensity framework. </p>



<p class="wp-block-paragraph">Nick Hegarty, who helped narrow the focus: could they help developers understand the environmental impact of their AI use while they worked? That made the project possible.</p>



<h2 class="wp-block-heading"><span id="from-idea-to-ide">From idea to IDE</span></h2>



<p class="wp-block-paragraph">The answer was to create an <strong>in-editor tool</strong>, where the developer could see an estimation of their token costs and impact on energy consumption in real time. </p>



<p class="wp-block-paragraph">The theory here is that, with this data, engineers can see their habits and perhaps be more conscious about their usage:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Our theory is that making this visible can guide engineers into more mindful habits around their AI consumption in the moment. Because AI providers don&#8217;t publish complete energy or emissions data, PRISM acts as a proxy for energy consumption by surfacing an estimate rather than an exact measurement.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>PRISM directly monitors token usage</strong>, the model being used, and the provider. For other tools, like GitHub Copilot, PRISM reads local activity logs. AI requests made by an application at runtime are captured through a local interceptor.</p>



<p class="wp-block-paragraph">The app then combines input and output tokens into an estimate. Nayan notes that these will be separated &#8220;as soon as robust factors exist&#8221;.</p>



<h2 class="wp-block-heading"><span id="how-red-was-that-prompt">How red was that prompt?</span></h2>



<p class="wp-block-paragraph">In practice, PRISM is <strong>more of a subtle indicator than a big flashing number </strong>that appears after every call. Nayan explained how it feels to use it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">In the editor, a status indicator reflects your most recent call, colour coded. The headline feature is Relative Impact Classification, where each interaction is rated Green, Amber, or Red based on where it sits compared with the other requests in the same project.</p>
</blockquote>



<p class="wp-block-paragraph">Nayan continued to explain the colors:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Green is below the median, Amber sits between the 50th and 90th percentile, and Red is the top tenth. A few requests need to accumulate before the colours become meaningful, because the whole point is comparison within your own project rather than against an arbitrary threshold. </p>
</blockquote>



<p class="wp-block-paragraph">Clicking around the dashboard more, <strong>users can get information broken down by model usage</strong>, as well as other interesting metrics:</p>



<ul class="wp-block-list">
<li>Timeline of estimated carbon over the course of development</li>



<li>Heatmap that shades from green through amber to red</li>



<li>Breakdowns by branch and other visualisations.</li>
</ul>



<p class="wp-block-paragraph">However, Nayan explains that a relative, percentile-based design was chosen due to the inability of estimates to present absolute carbon figures. <strong>The goal of the tool is to explain and raise awareness more</strong>, and hopefully educate engineers on how their usage looks like from the eco standpoint.</p>



<h2 class="wp-block-heading"><span id="the-impact-is-awareness-not-less-ai-use">The impact is awareness, not less AI use</span></h2>



<p class="wp-block-paragraph">Ustwo has tested PRISM with UOB students and across the company&#8217;s engineering team, and the results have been positive so far:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Several users said that seeing estimated emissions made them more deliberate with AI tools.</p>
</blockquote>



<p class="wp-block-paragraph">Nayan added that engineers, having seen the data for their usage, tried to make adjustments to their style and became a bit more conscious of how they refine requests.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Some wrote shorter, more precise prompts instead of using multiple iterations, and others paid closer attention to model selection after seeing how much environmental impact different models could have for similar tasks.</p>
</blockquote>



<p class="wp-block-paragraph">But as Nayan said, what interested them the most wasn’t that developers used AI less, but that they became more aware of how they were using it. “Once the data was visible, users started noticing things they hadn’t considered before.”</p>



<h2 class="wp-block-heading"><span id="prism-won%e2%80%99t-solve-ai%e2%80%99s-environmental-impact-but-it-makes-it-more-visible">PRISM won’t solve AI’s environmental impact, but it makes it more visible</span></h2>



<p class="wp-block-paragraph">Right now, PRISM can <strong>provide data and insights for cloud and assistant-based models </strong>by identifying them, capturing token usage, and calculating the energy factor from a list of supported models. Locally run models are not yet supported, but might be in the future.</p>



<p class="wp-block-paragraph">As the tool grows, ustwo sees its ideal outcome at three levels. </p>



<p class="wp-block-paragraph"><strong>For engineers, the goal is awareness</strong>: giving users more information about their environmental impact during their work. Nayan says this is not about telling people what to do, but showing them a fuller picture of the tools they’re using. <strong>For organisations, the goal is to create a shared picture and open up more conversations</strong> about sustainability, governance, and responsible AI.</p>



<p class="wp-block-paragraph">Beyond those, ustwo is positive about the potential of collaboration in the field of environmental impact of AI. He concluded:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">PRISM won&#8217;t solve the environmental impact of AI on its own, but if it helps make that impact a little more visible, and sparks better conversations and behaviours as a result, then we&#8217;ve achieved something worthwhile.</p>
</blockquote>
<p>The post <a href="https://shiftmag.dev/energy-cost-ai-prompts-10404/">This IDE Plugin Shows the Energy Cost of Your AI Prompts</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CTOs Agree: Cognitive Debt Is the New Technical Debt</title>
		<link>https://shiftmag.dev/ctos-agree-cognitive-debt-is-the-new-technical-debt-10229/</link>
		
		<dc:creator><![CDATA[Ivan Brezak Brkan]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 12:59:35 +0000</pubDate>
				<category><![CDATA[Engineering Management]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[CTO Craft]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10229</guid>

					<description><![CDATA[<p>At a CTO Craft Dinner in Toronto, I sat down with engineering leaders from more than a dozen tech companies and asked where AI has actually landed. The free-for-all is over and we need to be realistic.</p>
<p>The post <a href="https://shiftmag.dev/ctos-agree-cognitive-debt-is-the-new-technical-debt-10229/">CTOs Agree: Cognitive Debt Is the New Technical Debt</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="2100" height="1397" src="https://shiftmag.dev/wp-content/uploads/2026/06/1ea593ef-e1f3-483a-b18d-9a7a82b3f1db-scaled.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/1ea593ef-e1f3-483a-b18d-9a7a82b3f1db-scaled.jpg 2100w, https://shiftmag.dev/wp-content/uploads/2026/06/1ea593ef-e1f3-483a-b18d-9a7a82b3f1db-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/1ea593ef-e1f3-483a-b18d-9a7a82b3f1db-1024x681.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/1ea593ef-e1f3-483a-b18d-9a7a82b3f1db-768x511.jpg 768w" sizes="auto, (max-width: 2100px) 100vw, 2100px" /></figure>


<p class="wp-block-paragraph">Our <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">Shift CTO Craft Dinner format</a> is built on candor, rather than slides or sponsor pitches. It&#8217;s just a group of senior engineering leaders talking about what&#8217;s actually happening in their organizations. At our Toronto dinner held on the outskirts of the <a href="https://conference.ctocraft.com/toronto-2026/" target="_blank" rel="noreferrer noopener">CTO Craft conference</a>, the theme was AI adoption in engineering</p>



<p class="wp-block-paragraph">Within the first 5 minutes it was clear we&#8217;d spend the evening confirming one uncomfortable truth, <a href="https://shiftmag.dev/cto-ai-adoption-strategy-9477/" target="_blank" rel="noreferrer noopener">similar to the one we heard earlier this spring in London</a>:<strong> nobody has truly yet figured it out</strong>.</p>



<p class="wp-block-paragraph"><em>Note: We&#8217;ll try to figure it out at our <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">Shift developer conference in September</a> on the beautiful Croatian coast &#8211; <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">tickets are on sale</a>!</em></p>



<h2 class="wp-block-heading"><span id="the-free-for-all-is-over">The free-for-all is over</span></h2>



<p class="wp-block-paragraph">Two years ago, the mandate was simple: spend on AI, no questions asked. That era is over.</p>



<p class="wp-block-paragraph">What&#8217;s replaced it is a harder conversation, one several participants had clearly been having with their CFOs. <strong>The question has shifted from <em>are you using AI</em> to <em>what are you getting for it?</em></strong></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The need for an ROI hasn&#8217;t changed. If anything, that window of just spending freely is dwindling. For larger organizations, the expectation is return within 12 months, or sooner.</p>
</blockquote>



<p class="wp-block-paragraph">The challenge, as one participant put it, is that the <em><strong>I</strong></em> in ROI is completely unmanaged. Engineering capacity used to mean headcount, something finance could model. Now it means tokens, and nobody controls how many tokens any individual engineer burns on a given day.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The CFO has no control once they&#8217;ve signed the contract over what the actual investment is going to be. And if you can&#8217;t tell me the investment, what does projected return even mean?</p>
</blockquote>



<p class="wp-block-paragraph">Several people around the table had run into the same wall: <strong>organizations that bought the tools, signed the contracts, and then realized there&#8217;s no financial model inside the company to manage what comes next</strong>. The comparison kept coming up: early cloud adoption, FinOps before FinOps existed. We&#8217;re in that same window. Costs are still a fantasy, usage is still undefined, and the metrics to measure it haven&#8217;t been invented yet.</p>



<p class="wp-block-paragraph">One participant&#8217;s take: pushing for ROI too hard right now might mean measuring the wrong things entirely. The smarter move is to establish a baseline first.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I think eventually it will get to a more predictable state where we can say, approximately this many tokens leads to this much feature value. But I don&#8217;t think we can predict that yet.</p>
</blockquote>



<p class="wp-block-paragraph">The more pragmatic response, shared by more than one team: stop the free-for-all, start standardizing. This doesn&#8217;t mean we&#8217;re telling people to use AI less, but nudging from &#8220;use everything&#8221; to &#8220;use the same things, smarter.&#8221;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="681" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0318-1120-1024x681.jpg?x94846" alt="" class="wp-image-10256" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0318-1120-1024x681.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0318-1120-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0318-1120-768x511.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Credit: CTO Craft Con</figcaption></figure>



<h2 class="wp-block-heading">What you&#8217;re actually hiring for now</h2>



<p class="wp-block-paragraph">The hiring discussion exposed a split in how people in the room think about what an engineer actually is.</p>



<p class="wp-block-paragraph">One participant drew a clean line between two different roles that often get conflated: <strong>the AI engineer who ships product</strong>, and <strong>the engineer who owns system design</strong>. Language doesn&#8217;t matter anymore: Python, Go, Rust, Node. But system design hasn&#8217;t changed. Someone still has to think about availability, budgets, and the architectural decisions that AI can&#8217;t make for you.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The new software engineer is a product leader. Someone thinking about what the product is, not just how it works. But we still need technical people who think about the design. Those are two different things.</p>
</blockquote>



<p class="wp-block-paragraph">On the interview side, the consensus leaned toward <strong>keeping technical fundamentals, but with caveats</strong>. One team hadn&#8217;t changed their process yet, still testing for systematic thinking, for the ability to break down ambiguous problems. Others were actively rethinking it. The most interesting take came from someone who&#8217;d shifted their interviews toward code review rather than coding, precisely because that&#8217;s what engineers actually do now.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I changed our interview process to focus on code review, because that&#8217;s what we&#8217;re actually doing. And implementation is now AI-assisted, however you choose to use your agents.</p>
</blockquote>



<p class="wp-block-paragraph">If your team can generate code faster than it can review it, you have a bottleneck. <strong>The constraint is human judgment</strong>, not output.</p>



<h2 class="wp-block-heading">Team reactions and &#8216;recalibration moments&#8217;</h2>



<p class="wp-block-paragraph">Across the table, nobody described a team that was uniformly enthusiastic or uniformly resistant. The reality was messier.</p>



<p class="wp-block-paragraph">One leader talked about late adopters at his company who finally jumped in after being gently pushed, then hit what he called &#8220;<strong>recalibration moments</strong>&#8220;: realizing that whole categories of work that used to take days now take hours, and having to rethink how their schedule works.</p>



<p class="wp-block-paragraph">Another described something more complicated: an engineer who is highly productive with AI, genuinely good at using it, but also deeply skeptical of AI-generated output.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">There&#8217;s one person who&#8217;s really good at using AI, very productive, but also highly sensitive to anything AI has produced. &#8220;This is written by AI.&#8221; &#8220;Okay, but is it good?&#8221; &#8220;Yes, it&#8217;s good. But it&#8217;s written by AI.&#8221;</p>
</blockquote>



<p class="wp-block-paragraph">The concern about AI making people stop thinking came up more than once. The counterargument wasn&#8217;t a dismissal. It was a reframe: this is a management problem, not a technology problem. The tools make it easy to be lazy. <strong>The job of a leader is to make laziness not worth it</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You can choose to make something fast and long and not that good. Or you can use it to iterate and really drill it down to something short. We can all write really long letters now. Whether we should is a different question.</p>
</blockquote>



<p class="wp-block-paragraph">One company ran an anonymous survey and found 90% of engineers at that organization actually want to use AI, higher than expected. What surprised him wasn&#8217;t the enthusiasm but what came next: <strong>questions about performance management, about promotion criteria, about how individual contribution gets recognized when anyone can now generate code</strong>. The adoption had outrun the enablement.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We&#8217;re applying AI adoption rapidly, but we haven&#8217;t updated the career pathway or rethought the competency matrix. They have every right to ask those questions.</p>
</blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0313-1078-1024x683.jpg?x94846" alt="" class="wp-image-10257" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0313-1078-1024x683.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0313-1078-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0313-1078-768x512.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Credit: CTO Craft Con</figcaption></figure>



<h2 class="wp-block-heading"><span id="the-feature-debt-problem-nobody-wants-to-talk-about">The feature debt problem nobody wants to talk about</span></h2>



<p class="wp-block-paragraph">AI makes it cheap to write code. That is not the same as it being cheap to <em>ship</em> it, or to <em>maintain</em> it. One participant put it cleanly: <strong>cognitive debt is the new technical debt</strong>.</p>



<p class="wp-block-paragraph">The room had seen the same pattern: teams adding features at a pace that would have been impossible two years ago, now dealing with the maintenance overhead that comes with it. Legacy code that was already hard to understand is now harder, because the people who wrote it aren&#8217;t being careful. They&#8217;re being fast. And internal tools that were never meant to be permanent are now permanent because someone shipped them with three prompts.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Those processes, build or buy, is this worth maintaining long term, were there for a reason. But if you can spin something up in an afternoon, it&#8217;s easy to skip them. The problem comes later.</p>
</blockquote>



<p class="wp-block-paragraph">One participant&#8217;s response: write whatever you want, but writing it doesn&#8217;t mean you&#8217;re shipping it. Code is cheap, but launching it isn&#8217;t. Keeping that distinction alive in a team is harder than it sounds when management is celebrating every PR.</p>



<p class="wp-block-paragraph">The concept of a dedicated &#8220;technical health team&#8221; came up as a structural answer: engineers who ship features and engineers who delete or refactor them, treated as equally valuable work. Getting buy-in for that from a business incentivized by velocity is the actual challenge.</p>



<h2 class="wp-block-heading"><span id="who-should-be-shipping-prs">Who should be shipping PRs?</span></h2>



<p class="wp-block-paragraph">The most spirited part of the dinner: if AI makes it easy for anyone to write code, should product managers be shipping PRs?</p>



<p class="wp-block-paragraph">The room was divided. Not on the possibility (everyone agreed the tools make it technically feasible) but on whether it&#8217;s the right thing to optimize for.</p>



<p class="wp-block-paragraph">One participant pushed back hard on the narrative of non-engineers shipping to production as a win:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If you&#8217;re effectively making engineers into code review monitors, protecting the company from PRs they didn&#8217;t write, while the PM gets the credit for shipping, check in on your engineers&#8217; mental health.</p>
</blockquote>



<p class="wp-block-paragraph">Others were more pragmatic.<strong> Enabling non-engineers to contribute on smaller, lower-risk tasks reduces the feedback loop for everyone</strong>. Designers who can write a component to spec without waiting for an engineer. Product managers who can fix a copy bug without opening a Jira ticket. That has value, as long as the guardrails are right.</p>



<p class="wp-block-paragraph">The self-driving car analogy landed well: an average AI-assisted non-engineer is probably better than an average unassisted one. But nobody&#8217;s comparing them to the engineers who spent years developing the expertise. The comparison only makes sense within a specific complexity range.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If a feature is 80% engineering and 20% product thinking, an engineer can do it. If it&#8217;s the reverse, maybe a PM can handle it. What I think is actually happening is that we&#8217;re becoming value creators who pick up whatever slice of the work makes sense, regardless of title.</p>
</blockquote>



<p class="wp-block-paragraph">The harder structural question got no clean answer: if anyone can ship, whose job is it to hold everything together? Several people in the room said the only realistic response is radical team autonomy: small groups of three to five people who own their own decisions, with management&#8217;s job shifting to alignment rather than gatekeeping.</p>



<h2 class="wp-block-heading"><span id="code-review-is-the-bottleneck-ai-might-fix-it">Code review is the bottleneck. AI might fix it.</span></h2>



<p class="wp-block-paragraph">One participant had been thinking about this from a CI/CD angle: the problem isn&#8217;t that teams can&#8217;t generate code, it&#8217;s that they can&#8217;t review it fast enough. Human review is now the bottleneck, and the solution isn&#8217;t more reviewers. It&#8217;s smarter triage.</p>



<p class="wp-block-paragraph">His team had been experimenting with confidence scoring on PRs: using AI to assess the risk of a change and surface only the parts that actually need human eyes. <strong>A 15,000-line PR with three lines that need human review isn&#8217;t a 15,000-line review problem. It&#8217;s a three-line problem, if you can trust the rest.</strong></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I honestly think you can have a fifteen thousand line PR and say, I need a human to review these three lines. Everything else here is fine. I don&#8217;t know how to do that yet, but I know it has to happen.</p>
</blockquote>



<p class="wp-block-paragraph">The deeper point was about abstraction layers. We don&#8217;t read assembly, we trust compilers. The question is whether you can build enough validation infrastructure, feature flags, observability, acceptance tests, mutation testing, to make a similar trust relationship work with AI-generated code.</p>



<p class="wp-block-paragraph">Nobody in the room claimed they&#8217;d solved it. Several said they were pushing as hard as they could in that direction.</p>



<p class="wp-block-paragraph">One practical suggestion that came out of this: <strong>invest in evals now, not later</strong>. The cost of building AI features isn&#8217;t the hard part. The cost of verification is. If you build a solid eval suite today, you can swap providers, survive model deprecations, or move to open source without starting from scratch.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The cost of building isn&#8217;t as high. The cost of verification is high. When the vendor you&#8217;re partnering with changes their model, which they do often, you just run that suite of evals and you&#8217;re okay.</p>
</blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0302-1029-1-1024x683.jpg?x94846" alt="" class="wp-image-10259" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0302-1029-1-1024x683.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0302-1029-1-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-0302-1029-1-768x512.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Credit: CTO Craft Con</figcaption></figure>



<h2 class="wp-block-heading">The vendor you&#8217;re betting on</h2>



<p class="wp-block-paragraph">What happens when Anthropic or OpenAI raises prices, goes down, or gets disrupted?</p>



<p class="wp-block-paragraph">One participant said it plainly: her entire company has a single point of failure on Anthropic. Engineering understands single points of failure. The people in marketing and finance building on top of Claude do not.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">So many teams outside engineering are building things, and I don&#8217;t think they truly understand what&#8217;s underneath it. If all of a sudden we can&#8217;t get inference, what happens to marketing? What happens to finance? They&#8217;re gonna call engineering.</p>
</blockquote>



<p class="wp-block-paragraph">The counterpoint was that competition will keep pricing in check. Open source models are no longer years behind; they&#8217;re a couple of versions back at most. You can&#8217;t double your prices when customers have alternatives. But the lock-in concern isn&#8217;t really about the model itself. It&#8217;s about everything built around it. Skills, tooling, internal workflows — those are much harder to migrate than a model endpoint.</p>



<p class="wp-block-paragraph">The practical advice: <strong>build internal UI wrappers over generic model APIs now, before your teams are locked into specific product interfaces</strong>. It&#8217;s cheap to do, and it means you can swap the model underneath without rebuilding the interface your teams depend on.</p>



<h2 class="wp-block-heading">What&#8217;s next? Let&#8217;s talk about it at Shift</h2>



<p class="wp-block-paragraph">These reflections, reactions and conversations were part of just one of our Shift CTO dinners that we&#8217;re organizing as a lead up to our <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">Shift engineering and AI conference in September</a>. All of our dinner participants have been invited &#8211; and so are you!</p>



<p class="wp-block-paragraph">We&#8217;re also planning some Engineering leadership programming, but will be talking about topics just like the ones in this article &#8211; building AI native engineering teams, growing your developer career, scaling systems &#8211; across the conference agenda. I&#8217;d love for you to join us &#8211; <a href="https://shift.infobip.com/" target="_blank" rel="noreferrer noopener">get your tickets and see you in Zadar</a>!</p>



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



<p class="wp-block-paragraph"><em>The dinner was held under Chatham House rules. Quotes are used without attribution.</em></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/ctos-agree-cognitive-debt-is-the-new-technical-debt-10229/">CTOs Agree: Cognitive Debt Is the New Technical Debt</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>AI generates larger pull requests. Larger pull requests bring more bugs.</title>
		<link>https://shiftmag.dev/ai-generates-larger-pull-requests-larger-pull-requests-bring-more-bugs-9932/</link>
		
		<dc:creator><![CDATA[Mia Biberovic]]></dc:creator>
		<pubDate>Wed, 17 Jun 2026 06:07:28 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[CTO Craft]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[measuring developer productivity]]></category>
		<category><![CDATA[pull request]]></category>
		<category><![CDATA[Span]]></category>
		<category><![CDATA[Stephen Poletto]]></category>
		<category><![CDATA[tokenmaxxing]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9932</guid>

					<description><![CDATA[<p>What economist Charles Goodhart said in 1975 is completely applicable in 2026: When a measure becomes a target, it ceases to be a good measure.</p>
<p>The post <a href="https://shiftmag.dev/ai-generates-larger-pull-requests-larger-pull-requests-bring-more-bugs-9932/">AI generates larger pull requests. Larger pull requests bring more bugs.</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-1.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-1.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-1-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-1-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-1-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">When companies start tracking engineer token consumption on internal leaderboards, something has gone wrong in the measurement chain. </p>



<p class="wp-block-paragraph"><strong>Stephen Poletto</strong>, Field CTO at Span, used his CTO Craft Con talk in Toronto to argue that the AI tooling wave has arrived with a familiar problem attached: <strong>organizations are reaching for the most legible metric available rather than the most meaningful one</strong>. </p>



<p class="wp-block-paragraph">The result is a rerun of every previous failed attempt to quantify developer productivity, but this time with a pretty substantial compute bill.</p>



<h1 class="wp-block-heading"><span id="burn-baby-burn">Burn, baby, burn</span></h1>



<p class="wp-block-paragraph">Poletto opened with a data point that frames the problem neatly. Uber and ServiceNow both <strong>burned through their entire annual AI token budgets within the first five months</strong> of the year. That pace of consumption is being held up in some quarters as a sign of healthy adoption. </p>



<p class="wp-block-paragraph">Poletto&#8217;s position is that it mostly signals a measurement vacuum.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Just because you&#8217;re spending money and using these things doesn&#8217;t necessarily mean that you&#8217;re producing better outcomes. That&#8217;s the issue that I have with tokenmaxxing.</p>
</blockquote>



<p class="wp-block-paragraph">The <a href="https://fortune.com/2026/04/09/meta-killed-employee-ai-token-dashboard/" target="_blank" rel="noreferrer noopener">leaderboard dynamic at Meta</a>, where engineers were reportedly running expensive jobs purely to rank well on an internal token-consumption meter, illustrates the trap cleanly. Poletto named it directly: Goodhart&#8217;s Law. </p>



<p class="wp-block-paragraph">Coined by British economist Charles Goodhart in 1975, it’s completely applicable to the 2026 problem: <strong>when a measure becomes a target, it ceases to be a good measure.</strong> Or, in today’s words: Set token usage as a goal and people will optimize for token usage, not for shipping software that works.</p>



<p class="wp-block-paragraph">This isn&#8217;t a new failure mode. Poletto traced the same pattern through lines of code, pull request counts, and story points, each of which generated its own gaming behavior when elevated to headline metric status. Tokenmaxxing, in his framing, is:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The same old pitfalls of trying to quantify developer productivity all over again.</p>
</blockquote>



<p class="wp-block-paragraph">The alternative he proposed is a ratio: customer value delivered against the total cost of producing it, headcount, tooling, and token spend included. DORA metrics and PR throughput are not useless, he argued, but they measure the inside of the system, not its output. Treating them as primary goals disconnects engineering effort from the outcomes the business actually cares about.</p>



<h1 class="wp-block-heading"><span id="what-about-controling-the-pr-size">What about controling the PR size?</span></h1>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="576" src="https://shiftmag.dev/wp-content/uploads/2026/05/image-1024x576.png?x94846" alt="Span: AI creates bigger pull requests" class="wp-image-9936" style="width:1200px" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/image-1024x576.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/image-300x169.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/image-768x432.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/image.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Bigger pull requests mean spending more time on reworking AI generated code afterwards (source: <a href="https://www.span.app/blog/ai-writes-bigger-prs" type="link" id="https://www.span.app/blog/ai-writes-bigger-prs" target="_blank" rel="noreferrer noopener">Span</a>)</figcaption></figure>



<p class="wp-block-paragraph">Span&#8217;s own benchmark data, drawn from its customer base, puts some numbers around where teams currently sit. About<strong> half to two-thirds of net new code is now AI-generated</strong>, up from 10 to 20 percent a year ago. PR throughput is running at roughly 1.7 times pre-AI rates. Neither figure, by itself, says anything about whether those teams are delivering more value to customers.</p>



<p class="wp-block-paragraph">The quality picture is more nuanced than the headline defect numbers suggest. Span&#8217;s analysis found that when controlling for pull request size, AI has a negligible independent effect on defect rates. The actual driver is that <a href="https://www.span.app/blog/ai-writes-bigger-prs" target="_blank" rel="noreferrer noopener">AI generates larger pull requests</a>, and <strong>larger pull requests correlate with more bugs</strong>. That is, in principle, actionable: you don&#8217;t need to focus on the AI generated code, but to the PR scope discipline.</p>



<h1 class="wp-block-heading"><span id="different-approaches-to-reduce-human-review-burden">Different approaches to reduce human review burden</span></h1>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-2-1024x682.jpg?x94846" alt="" class="wp-image-10177" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-2-1024x682.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-2-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-2-768x511.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Stephen-poletto-2.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">CTO Craft Con</figcaption></figure>



<p class="wp-block-paragraph"><strong>Code review is absorbing the strain more visibly</strong>. Poletto cited <a href="https://www.span.app/blog/introducing-ai-impact-report" target="_blank" rel="noreferrer noopener">30 percent more rework time on AI-generated code</a> compared to human-generated code, along with more review round trips. Teams that are navigating this well are doing so through process changes rather than raw tooling, pre-review automation gates, semantic routing of review assignments by code ownership and reviewer availability, and environment-level QA that lets agents validate their own output before a pull request opens.</p>



<p class="wp-block-paragraph"><strong>Stripe, Ramp, and WorkOS</strong> all came up as examples of teams that have built cloud environments where agents can run tasks more autonomously, with the explicit goal of disqualifying broken work before it reaches a human reviewer. Ramp&#8217;s approach to screenshots, attaching before-and-after visuals to PRs so reviewers can see what changed at a glance, is a small example of the same principle: <strong>reduce the human review burden by doing more verification earlier</strong>.</p>



<p class="wp-block-paragraph"><a href="https://www.intercom.com/help/en/articles/9515824-what-is-fin" target="_blank" rel="noreferrer noopener">Fin from Intercom</a> took a different angle, capturing agent-human interaction logs from development sessions and using them to provide personalized coaching to engineers on how to work more effectively with AI tools. Poletto noted they also tracked which agent skills were actively used versus deprecated, applying the same funnel analysis logic that product teams use for user flows.</p>



<p class="wp-block-paragraph">The thread connecting all of these examples is that the teams seeing compounding returns are treating their development workflow as a system to be instrumented and optimized, not a collection of individual contributors to be nudged toward higher token counts.</p>



<h1 class="wp-block-heading"><span id="writing-code-is-no-longer-a-bottleneck">Writing code is no longer a bottleneck</span></h1>



<p class="wp-block-paragraph">Poletto said in closing:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You should treat your development system as a system that can be optimized. Telemetry, observability, helping understand where those dynamics are, can help you be more confident in where you&#8217;re investing.</p>
</blockquote>



<p class="wp-block-paragraph">The bottleneck, his data suggests, is no longer primarily writing code but <strong>deciding what to build and validating that it works once built</strong>. That shift puts pressure on skills that most engineering hiring and evaluation frameworks are not set up to reward.</p>
<p>The post <a href="https://shiftmag.dev/ai-generates-larger-pull-requests-larger-pull-requests-bring-more-bugs-9932/">AI generates larger pull requests. Larger pull requests bring more bugs.</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>The Small Lies Developers Tell to Keep Work Moving</title>
		<link>https://shiftmag.dev/the-small-lies-developers-tell-to-keep-work-moving-10305/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Mon, 15 Jun 2026 13:03:39 +0000</pubDate>
				<category><![CDATA[Developer Experience]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Deadlines]]></category>
		<category><![CDATA[Developers Answer]]></category>
		<category><![CDATA[Software Engineer]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10305</guid>

					<description><![CDATA[<p>Developers share how they handle deadlines, pressure, and team communication - and why small white lies sometimes help engineering teams keep moving.</p>
<p>The post <a href="https://shiftmag.dev/the-small-lies-developers-tell-to-keep-work-moving-10305/">The Small Lies Developers Tell to Keep Work Moving</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/06/shiftmag_devs.jpg?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/shiftmag_devs.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/shiftmag_devs-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/shiftmag_devs-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/shiftmag_devs-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph"><a href="https://shiftmag.dev/we-asked-20-developers-why-they-really-got-into-tech-it-wasnt-the-money-10101/" type="link" id="https://shiftmag.dev/we-asked-20-developers-why-they-really-got-into-tech-it-wasnt-the-money-10101/" target="_blank" rel="noreferrer noopener">We played &#8220;Truth or Dare&#8221; with developers again</a>, truth only, with no option to dodge the answer by doing push-ups. </p>



<p class="wp-block-paragraph">Developers from different parts of the industry spoke about how they survive tight deadlines, tension inside engineering teams, and the subtle, protective lies they use to get through the week.</p>



<h2 class="wp-block-heading">There&#8217;s a pressure to sound confident</h2>



<p class="wp-block-paragraph">In engineering teams, pressure, shifting priorities, and the need to move quickly shape communication. In that environment, <strong>“truth” is more about signaling confidence</strong>, alignment, and forward progress than precision.</p>



<p class="wp-block-paragraph">Weekly meetings, fast delivery cycles, and constantly changing priorities push developers to learn that how they communicate can matter as much as the work itself.</p>



<p class="wp-block-paragraph">That is why we asked how developers manage expectations. The <strong>phrase “it will be done” often appears early</strong>, sometimes before anyone fully understands the scope of the task. Under pressure, estimates tend to be optimistic, and reality usually forces adjustments as the work moves forward.</p>



<p class="wp-block-paragraph">At the same time, developers handle that pressure in different ways &#8211; some narrow their focus and push through tight deadlines, while others start by asking whether those deadlines even make sense.</p>



<h2 class="wp-block-heading"><span id="the-truth-about-deadlines">The truth about deadlines</span></h2>



<p class="wp-block-paragraph">Deadlines sound like a nightmare for an engineering mind, so we asked our developers how they deal with them. </p>



<p class="wp-block-paragraph">Some described how <strong>short deadlines increase focus and force prioritization</strong>. Others questioned whether extreme deadlines reflect process problems rather than urgency.</p>



<p class="wp-block-paragraph">Hrvoje Rančić, Senior Software Engineer, described how constant pressure can indicate systemic misalignment rather than effective planning:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I realized that deadlines can sometimes be a mechanism of manipulation. If there are too many short deadlines, something is wrong in the process. Either people are making unrealistic promises, expectations are unrealistic, or there is poor communication between product and engineering.</p>
</blockquote>



<p class="wp-block-paragraph">At the same time, other participants admitted that deadlines can help with focus and discipline, but<strong> only when they are based on a realistic scope of work</strong>, not on constant escalation of pressure.</p>



<p class="wp-block-paragraph">The point is not that deadlines are <em>bad</em>, but that misaligned and unrealistic deadlines often point to deeper organizational issues.</p>



<h2 class="wp-block-heading"><span id="engineering-is-often-about-people-not-just-code">Engineering is often about people, not just code</span></h2>



<p class="wp-block-paragraph">The stereotype of the isolated, antisocial engineer still exists, even though modern software development is highly collaborative. That misconception often clashes with the reality of teamwork, where communication<strong>, negotiation, and constant alignment are a key part of the job</strong>.</p>



<p class="wp-block-paragraph">Kristina Valjak, Engineering Lead, summarized it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Some people think engineers are introverts who don’t socialize, who sit in basements and stare at screens all day. Maybe it’s true that we’re not social enough, but in reality, everyone is smart.</p>
</blockquote>



<p class="wp-block-paragraph">The irony is that engineering work is rarely isolated. Most of the tension developers describe does not come from code, but from coordination between them, the product teams, and management.</p>



<h2 class="wp-block-heading"><span id="how-developers-smooth-over-the-truth-at-work">How developers smooth over the truth at work</span></h2>



<p class="wp-block-paragraph">Developers often tell small, strategic lies to keep work flowing smoothly. These are not dramatic deceptions, but everyday adjustments such as overconfidence in estimates, downplaying uncertainty, or agreeing in meetings while problems are resolved in the background.</p>



<p class="wp-block-paragraph">Emin Mulaimović, Junior AI Engineer, reflected on this broader communication culture, recalling an anecdote from his first job:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">At my first job they told me not to say I was happy at work, so I kept complaining all the time. I think that’s the only lie I tell. I don’t tell them how much fun I actually have working there and how much I enjoy the job.</p>



<p class="wp-block-paragraph"></p>
</blockquote>



<p class="wp-block-paragraph">In another example, a developer described solving an issue during a break and returning to the meeting without interrupting the flow of discussion. In other cases, developers admitted to deliberately <strong>inflating estimates or simplifying status reports to avoid unnecessary tension</strong>.</p>



<p class="wp-block-paragraph">This behavior is not so much about deception as it is about reducing “noise” in systems that are already complex enough.</p>



<p class="wp-block-paragraph"><strong>Want to hear more? Check out the video.</strong></p>



<p class="wp-block-paragraph"><em>Special thanks to our fellow colleagues at Infobip, the publisher of ShiftMag!</em></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="Secrets, Deadlines &amp; Workplace Myths In Software Development" width="500" height="281" src="https://www.youtube.com/embed/ZGXQWjChuO0?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>The post <a href="https://shiftmag.dev/the-small-lies-developers-tell-to-keep-work-moving-10305/">The Small Lies Developers Tell to Keep Work Moving</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gian Segato, Anthropic: &#8220;AI Products Are a Lagging Indicator of Growth&#8221;</title>
		<link>https://shiftmag.dev/gian-segato-anthropic-ai-growth-10231/</link>
		
		<dc:creator><![CDATA[Ivan Simic]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 13:29:37 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[ai week milano]]></category>
		<category><![CDATA[anthropic]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10231</guid>

					<description><![CDATA[<p>Watching AI product evolution from the sidelines makes you feel like things are going fast, but according to Anthropic's Gian Segato, that might not be the best metric.</p>
<p>The post <a href="https://shiftmag.dev/gian-segato-anthropic-ai-growth-10231/">Gian Segato, Anthropic: &#8220;AI Products Are a Lagging Indicator of Growth&#8221;</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/06/New-ShiftMag-panel-interview-2.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/New-ShiftMag-panel-interview-2.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/New-ShiftMag-panel-interview-2-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/New-ShiftMag-panel-interview-2-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/New-ShiftMag-panel-interview-2-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">On June 9th, 2026, Anthropic released Claude Fable 5, its most powerful model ever. Fable is much faster than Opus 4.8, which is itself much faster than the ones before it. It seems like every AI model is faster, better and can do more, but what does that mean in practice? At <a href="https://www.aiweek.it/en/" target="_blank" rel="noreferrer noopener nofollow">AI Week Milano</a>, we listened to<strong> Data Science Manager for the Research team at Anthropic, Gian Segato</strong>, explain how he views AI evolution.</p>



<p class="wp-block-paragraph">In a few years, we&#8217;ve come from an AI chatbot that summarizes documents and writes a bit of code to a knowledge worker that is, by all intents and purposes, the closest thing to an &#8220;AI coworker&#8221; we have. These are jumps in capability that the general public struggles to follow, but they&#8217;re not the <em>real </em>reality.</p>



<p class="wp-block-paragraph">Gian explained in his talk that most of these flagship and public features were developed months before Claude users used them. According to him, seeing a new feature such as coding or image creation is the best way to know where AI <em><strong>was</strong></em> a few months ago, not where it is now. Since AI capabilities move so fast, it&#8217;s hard to keep track of it all:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Products are fundamentally a lagging indicator. You cannot just judge capabilities by looking backwards. Products are built on top of capabilities.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-acceleration-is-accelerating">The acceleration is accelerating</span></h2>



<p class="wp-block-paragraph">A good (or just more realistic) way to measure the speed at which models are getting smarter is to look at a new metric that Gian suggested, which works in three steps:</p>



<ul class="wp-block-list">
<li>Take a task, for example, the creation of a simple app, solving a particular problem or reading a data set;</li>



<li>Find out how much it would take for a human expert to do it;</li>



<li>Then check whether a model can do it and how much time it takes.</li>
</ul>



<p class="wp-block-paragraph">Doing this gives you a clean exponential and trajectory of where you are, and where you&#8217;re going. Right now, Gian thinks that the best models can <strong>autonomously</strong> complete work that would take a human expert around two days. Of course, he&#8217;s not talking about answering our emails or vibe-coding mini games, but complex work that requires in-depth knowledge of the matter at hand and particular skills.</p>



<p class="wp-block-paragraph">The speed at which models can do these tasks is, however, doubling every four months. Just a few years ago, it was doubling every <strong>seven</strong> months; the acceleration is, as Gian puts it, accelerating. This means that the capabilities of models are doubling at a rate that is also becoming faster; they take less time to become twice as efficient.</p>



<p class="wp-block-paragraph">What&#8217;s happening is relatively simple: <a href="https://blogs.nvidia.com/blog/ai-scaling-laws/" target="_blank" rel="noreferrer noopener nofollow">we&#8217;re just throwing more power and information to AI models</a>, and they&#8217;re responding to it well.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="538" src="https://shiftmag.dev/wp-content/uploads/2026/06/Shift-In-article-IS-1024x538.png?x94846" alt="" class="wp-image-10294" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/Shift-In-article-IS-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/Shift-In-article-IS-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/Shift-In-article-IS-768x403.png 768w, https://shiftmag.dev/wp-content/uploads/2026/06/Shift-In-article-IS.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="give-ai-more-power-and-it-gets-proportionally-smarter">Give AI more power and it gets proportionally smarter</span></h2>



<p class="wp-block-paragraph">For those unfamiliar with how <strong>Anthropic</strong> was created, the mention of a paper in which researchers figured out that just giving more power to AI models makes the AI models smarter came as a revelation. This means, in Segato&#8217;s words, that the line that portrays AI capability in relation to the amount of processing power is just a straight line, and one that researchers currently see no end to.</p>



<p class="wp-block-paragraph">The information is both slightly concerning and very impressive. Gian noted that the line spans eight orders of magnitude, which is immense and means that AI capability can scale incredibly while still not showing signs of vulnerability. For the sake of keeping this article short and easy to understand, let&#8217;s just say that this is almost unheard of, except in some physics research and laws of nature:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Typical things we build; engineering things, societal phenomena, you two or three-x them and they break down. There&#8217;s no equation that spans eight orders of magnitude except in physics and the laws of nature.</p>
</blockquote>



<p class="wp-block-paragraph">Calling AI a &#8220;law of physics&#8221; or a &#8220;force of nature&#8221; might be something that belongs in a conference keynote and is something an AI startup is just waiting to use for its new investor pitch after listening to this presentation.</p>



<p class="wp-block-paragraph">However, this also means that there&#8217;s really no way of telling how &#8220;deep&#8221; or &#8220;smart&#8221; an AI model can get if all that it takes for it to get there is just more hardware, more RAM, and more learning material. It also means that we&#8217;ll see more AI data centers as companies like Anthropic throw more chips and money to their models.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://shiftmag.dev/wp-content/uploads/2026/06/WhatsApp-Image-2025-05-16-at-10.52.58-copia-1024x683.jpeg?x94846" alt="" class="wp-image-10300" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/WhatsApp-Image-2025-05-16-at-10.52.58-copia-1024x683.jpeg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/WhatsApp-Image-2025-05-16-at-10.52.58-copia-300x200.jpeg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/WhatsApp-Image-2025-05-16-at-10.52.58-copia-768x512.jpeg 768w, https://shiftmag.dev/wp-content/uploads/2026/06/WhatsApp-Image-2025-05-16-at-10.52.58-copia.jpeg 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">AI Week Milano had more than 25,000 visitors this year. Credit: AI Week</figcaption></figure>



<h2 class="wp-block-heading"><span id="the-more-capability-the-more-risks">The more capability, the more risks</span></h2>



<p class="wp-block-paragraph">Gian continued that AI is now in the &#8220;tasks&#8221; era. This means that projects that take dozens of minutes for a human are regularly delegated to AI models, which do them easily. In six to 12 months, we&#8217;re probably going to enter something Anthropic calls the &#8220;projects&#8221; era, where AI models will be able to handle work that would take dozens of hours for humans.</p>



<p class="wp-block-paragraph">By then, we&#8217;re going to be looking at the equivalent of a CEO instructing a marketing director, rather than a human assigning a task to an AI tool. Seeing as the growth is both fast and linear, we&#8217;re approaching that era whether we&#8217;re prepared for it or not.</p>



<p class="wp-block-paragraph">With this growth come risks that can&#8217;t be ignored. For example, the more work models do, the less supervision is possible for us as humans. For example, if a model is doing a marketing campaign, a human can&#8217;t watch its every step:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Necessarily there&#8217;s going to be some element where we have to accept some lack of supervision. That&#8217;s both intellectually interesting and pretty scary. This is a little unsettling.</p>
</blockquote>



<p class="wp-block-paragraph">Gian&#8217;s &#8220;encouraging&#8221; words aside, this was the part of the presentation where he connected the researchers who&#8217;ve discovered the connection between power and AI model capability as the founders of Anthropic. This served as a diving board to present that Anthropic is really serious in terms of security and monitoring its models. Still, AI creators telling you they&#8217;re &#8220;doing all they can&#8221; to contain AI doesn&#8217;t really fill you with optimism. </p>



<p class="wp-block-paragraph">The talk from Anthropic&#8217;s researcher comes at a time when news of Mythos and Fable, the company&#8217;s extremely capable models and their effects on the internet are making headlines. Gian echoed this by saying that AI models that <em>might</em> potentially be used to engineer a new pandemic, having learned all there is to know about viruses and disease, might also be the best way to find out how cancer spreads and how the brain works. </p>



<p class="wp-block-paragraph">Of course, he believes that the <em>good guys</em> will be the best way of stopping the negative sides of AI from shining through. Whether the world feels like Anthropic are said <em>good guys </em>is another story entirely. </p>



<p class="wp-block-paragraph">Concluding his talk, Gian said that he believes the next period of human history will be the one where we will be able to &#8220;compress 100 years of industrial and scientific revolution into a very fun and interesting decade&#8221;.</p>
<p>The post <a href="https://shiftmag.dev/gian-segato-anthropic-ai-growth-10231/">Gian Segato, Anthropic: &#8220;AI Products Are a Lagging Indicator of Growth&#8221;</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Your API Is Already a Hidden MCP Server, You Just Need to Discover It</title>
		<link>https://shiftmag.dev/api-mcp-server-infobip-filip-srnec-10118/</link>
		
		<dc:creator><![CDATA[Marin Pavelić]]></dc:creator>
		<pubDate>Fri, 12 Jun 2026 10:23:11 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[devoxx uk]]></category>
		<category><![CDATA[filip srnec]]></category>
		<category><![CDATA[MCP]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10118</guid>

					<description><![CDATA[<p>This team was shipping production code at the same time as the MCP specification was taking shape. That is the reality of working with a technology that was evolving in real time.</p>
<p>The post <a href="https://shiftmag.dev/api-mcp-server-infobip-filip-srnec-10118/">Your API Is Already a Hidden MCP Server, You Just Need to Discover It</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="720" src="https://shiftmag.dev/wp-content/uploads/2026/05/filip-srnec.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/filip-srnec.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/05/filip-srnec-300x180.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/filip-srnec-1024x614.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/filip-srnec-768x461.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">What began as an internal hackathon project, where a small team at Infobip set out to create and launch a marketing campaign for a fictional chocolate brand using AI agents, <strong>evolved into the company&#8217;s first MCP servers running in production</strong>. </p>



<p class="wp-block-paragraph">At Devoxx UK, <strong>Filip Srnec</strong>, Principal Engineer at Infobip and lead of the company’s MCP team, <a href="https://www.youtube.com/watch?v=D1piW2IGQuk">explained how they built the OpenAPI MCP Spring Boot Starter</a>, a tool that turns any OpenAPI-documented API into a fully capable MCP server, without the need for rewrites or custom integration code.</p>



<h2 class="wp-block-heading"><span id="why-not-just-build-custom-mcp-servers">Why not just build custom MCP servers?</span></h2>



<p class="wp-block-paragraph">Filip kicked off his talk by asking the audience if anyone had an HDMI adapter so he could point out a <strong>common challenge</strong> in technology:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Protocols evolve, and systems don’t necessarily upgrade in sync.</em></p>
</blockquote>



<p class="wp-block-paragraph">Most of the systems AI agents need to interact with today already expose REST APIs. REST APIs helped us build the world that we now today. Mobile apps, smart devices, command-line tools, and interactive user interfaces all rely on them, running on top of decades of standards, tooling, and shared knowledge.<strong> Now AI agents need a way to use that same infrastructure</strong>.</p>



<p class="wp-block-paragraph">MCP, announced by Anthropic in November 2024, was positioned as “a USB-C port for AI applications.” That immediately raised the question of whether every existing API (the HDMI cable) would now need custom glue code (an adapter) to become agent-accessible.</p>



<p class="wp-block-paragraph">Infobip’s answer was <strong>no</strong>.</p>



<h2 class="wp-block-heading"><span id="the-openapi-connection">The OpenAPI connection</span></h2>



<p class="wp-block-paragraph">The breakthrough came when the team compared the structure of an MCP tool with an OpenAPI operation.<strong> The two map directly onto each other at the field level.</strong> MCP tools define elements such as a name, title, description, input schema, and annotations, while OpenAPI operations include an operation ID, summary, description, parameters, and request body. Comparing the two side by side shows that most OpenAPI operation metadata already has a direct equivalent in MCP:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>The name can be an operation ID, because operation ID uniquely identifies an operation in the specification. For a title, we can use a summary. Description is obvious. We have a way to define the input schema by combining parameters and the request body.</em></p>
</blockquote>



<p class="wp-block-paragraph">Infobip already had OpenAPI specifications for all of its public APIs. Since those specifications were powering the company’s API platform and SDK generation process, <strong>building a bridge to MCP</strong> made more sense than creating custom servers from scratch.</p>



<p class="wp-block-paragraph">Let&#8217;s take a look at how the OpenAPI MCP Spring Boot Starter works in two phases.</p>



<h2 class="wp-block-heading"><span id="how-the-framework-works">How the framework works</span></h2>



<p class="wp-block-paragraph">The process begins by reading the OpenAPI specification and turning it into MCP-compatible tool definitions. Because the connection is dynamic, updates to the API are reflected on the MCP side as well.</p>



<p class="wp-block-paragraph">At runtime, on every tool call, the framework validates credentials, maps tool arguments to HTTP requests, enriches and forwards those requests to the downstream API, handles errors, and returns the result to the agent.</p>



<p class="wp-block-paragraph">The setup is intentionally minimalistic. It requires only the OpenAPI specification URL and the base URL of the API being exposed. As Filip explained:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>You just point it at your OpenAPI specification, and your API instantly becomes an MCP server. This is something that we’ve been running in production for months now.</em></p>
</blockquote>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="614" src="https://shiftmag.dev/wp-content/uploads/2026/05/63-1024x614.png?x94846" alt="" class="wp-image-10122" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/63-1024x614.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/63-300x180.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/63-768x461.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/63.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Building a bridge from API to MCP makes more sense than creating new MCP servers. Credit: Devoxx UK </figcaption></figure>



<h2 class="wp-block-heading"><span id="not-every-endpoint-should-become-a-tool">Not every endpoint should become a tool</span></h2>



<p class="wp-block-paragraph">Filip pointed out that <strong>exposing an entire API surface to agents is a bad idea.</strong> Irrelevant operations add noise, increase costs, and can mislead the model. A larger surface also extends the potential attack surface for prompt injection.</p>



<p class="wp-block-paragraph">The framework tackles this through an OpenAPI filter chain. Before tools are exposed through MCP, developers can adjust the specification. That means removing endpoints, tweaking schemas, or changing how operations are presented. The good thing is that this approach works even when the API is maintained by someone else.</p>



<p class="wp-block-paragraph"><strong>One example involved OpenAPI&#8217;s discriminator feature.</strong> It is commonly used to select different schemas based on a property value, making server-side validation more flexible. The catch is that discriminators are not valid JSON Schema constructs, while MCP tool definitions require strict JSON Schema compliance. To solve the problem, the framework automatically rewrites discriminator-based schemas into oneOf structures that MCP clients can consume without issue, Filip explained. </p>



<p class="wp-block-paragraph">Unfortunately, exposing the right tools solves a part of the problem. For an AI agent to use a tool correctly it needs to understand both <strong>what the tool does</strong> and <strong>when to use it.</strong></p>



<h2 class="wp-block-heading"><span id="naming-descriptions-and-making-agents-actually-use-your-tools">Naming, descriptions, and making agents actually use your tools</span></h2>



<p class="wp-block-paragraph">LLMs select tools based on names and descriptions and both matter more than most developers realize.</p>



<p class="wp-block-paragraph">The framework gives developers<strong> </strong>several ways to name tools. They can keep <strong>the original operation ID</strong>, use a simplified version with special characters removed, or generate a name from the <strong>API endpoint</strong> itself when no operation ID is available. It also includes safeguards for clients that impose strict limits on name length.</p>



<p class="wp-block-paragraph">Tool descriptions require just as much attention because every description from every connected MCP server is loaded into the model’s context. These descriptions need to be concise and easy for AI agents to interpret. <strong>The framework can enrich them with summaries and examples</strong> from the OpenAPI specification, which Filip highlighted as especially useful when matching requests to input schemas.</p>



<p class="wp-block-paragraph">The tools, however, still need to work with existing authentication and authorization systems.</p>



<h2 class="wp-block-heading"><span id="solving-authentication-without-reinventing-it">Solving authentication without reinventing it</span></h2>



<p class="wp-block-paragraph">Authentication has been one of the more debated aspects of MCP and because of that the framework takes a pragmatic approach by relying on existing mechanisms rather than new ones. Filip explained:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Your API already knows how to perform authentication and authorization. It knows how to reject bad credentials.</em></p>
</blockquote>



<p class="wp-block-paragraph">Instead of introducing a separate authentication layer, the framework forwards credentials to a configurable endpoint that already handles it. As a result, any method supported by the underlying API, whether API keys, basic authentication, or JWTs, works through the MCP server as well.</p>



<p class="wp-block-paragraph">For OAuth, the framework proxies OpenID configuration calls and authorization requests to a configured OAuth server, and performs automatic scope discovery from the OpenAPI security definitions:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>To have full OAuth support, you need to point it at your OAuth server. And you’ll get minimal scope discovery automatically directly from the framework.</em></p>
</blockquote>



<p class="wp-block-paragraph">It is important to mention that building the features was, once again, only part of the story. The team was also developing the framework while the MCP ecosystem itself was still taking shape.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="602" src="https://shiftmag.dev/wp-content/uploads/2026/06/55259430583_83ac60faf9_o-1024x602.jpg?x94846" alt="" class="wp-image-10334" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/55259430583_83ac60faf9_o-1024x602.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/55259430583_83ac60faf9_o-300x176.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/55259430583_83ac60faf9_o-768x451.jpg 768w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Best way to explain API to MCP flows is, surprisingly, with cables and adapters. Credit: Devoxx UK</figcaption></figure>



<h2 class="wp-block-heading"><span id="building-on-a-moving-train">Building on a moving train</span></h2>



<p class="wp-block-paragraph">Filip was candid about the challenges the team faced. As Infobip was building and shipping the framework, the <strong>MCP specification evolved</strong>, with changes affecting everything from transport mechanisms and authentication flows to client behavior:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Sometimes we need to pick between features and compatibility. We decided that we wanted to move fast. We wanted to be in that space. The spec was still being written while we were shipping production code.</em></p>
</blockquote>



<p class="wp-block-paragraph">Along the way, the team had to deal with a growing list of <strong>compatibility issues.</strong> Different clients imposed different limits on tool name lengths, some sent nested objects as escaped strings instead of valid JSON, and OAuth implementations often behaved differently despite following the same specification:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>My point here is that sometimes you can’t wait for the ecosystem to mature. You ship and you adapt.</em></p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-demo">The demo</span></h2>



<p class="wp-block-paragraph">Filip wrapped up the session with a demonstration. Using the framework, he connected an OpenMeteo weather forecast server and Infobip’s production SMS MCP server, then showed how an AI agent could retrieve the next day’s weather forecast for London, generate a short summary, and send it as a text message. The point was how quickly an existing API could be turned into an MCP-compatible service. As Filip put it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>Your API may already be a hidden MCP server. Try to use this framework, point it at your specification, and ship it.</em></p>
</blockquote>



<ul class="wp-block-list">
<li>Listen to Filip&#8217;s entire talk on <a href="https://www.youtube.com/watch?v=D1piW2IGQuk">YouTube</a></li>



<li>The framework and examples are open source and available on <a href="https://github.com/infobip/infobip-openapi-mcp">GitHub</a>. </li>



<li>Infobip’s production MCP server is accessible at <a href="https://www.infobip.com/docs/mcp" id="https://www.infobip.com/docs/mcp">mcp.infobip.com.</a></li>
</ul>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/api-mcp-server-infobip-filip-srnec-10118/">Your API Is Already a Hidden MCP Server, You Just Need to Discover It</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</title>
		<link>https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/</link>
		
		<dc:creator><![CDATA[Antonio Ereiz]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 12:56:12 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Engineer Explains]]></category>
		<category><![CDATA[kazhoon]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9591</guid>

					<description><![CDATA[<p>When dozens of developers share the same environment and Git repository, testing changes quickly becomes chaotic. Here's how Kubernetes solves that.</p>
<p>The post <a href="https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/">Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1376" height="768" src="https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw.png 1376w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-300x167.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-1024x572.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/kubernetes-bottleneck-raw-768x429.png 768w" sizes="auto, (max-width: 1376px) 100vw, 1376px" /></figure>


<p class="wp-block-paragraph">I spend most of my time maintaining our companies&nbsp;<strong>internal developer portal (IDP),&nbsp;</strong>known internally as&nbsp;<strong>Kazhoon</strong>&nbsp;(which is built on&nbsp;<a href="https://backstage.io/">Backstage</a>). Like any developer portal, it provides a lot of features built by a wide range of engineering teams.</p>



<p class="wp-block-paragraph">Beyond my core team of maintainers, there are about 50 other contributors across the company who regularly develop their own plugins and features. All of these engineers push code to a single, giant&nbsp;<a href="https://monorepo.tools/">monorepo</a>.</p>



<p class="wp-block-paragraph">As you can imagine, there are going to be a lot of challenges with this kind of setup. In this guide, I&#8217;m going to focus on solving one of them.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-TheMulti-ContributorChallenge" class="wp-block-heading"><span id="the-multi-contributor-challenge"><strong>The Multi-Contributor Challenge</strong></span></h2>



<p class="wp-block-paragraph">When contributors are working on some feature, before merging, they would like to test it out, usually in a staging/testing environment. A small team working on a project has no issues here. They will just internally coordinate who gets to deploy at what time. But when you have 5 teams simultaneously working on different features, you&nbsp;<strong>will</strong>&nbsp;get conflicts.</p>



<p class="wp-block-paragraph">Our solution initially was to tell people to merge their &#8220;feature&#8221; branch into a &#8220;dev&#8221; branch that in theory should contain the features of all the other contributors as well. We would then deploy just this &#8220;dev&#8221; branch. In practice, however, we were still getting conflicts, just this time in a different place.</p>



<p class="wp-block-paragraph">Contributors would have issues merging their changes into the dev branch due to several reasons. Sometimes the dev branch was outdated, missing the latest changes from the master branch. Sometimes the contributors branch was not up-to-date. </p>



<p class="wp-block-paragraph">Sometimes someone doesn&#8217;t merge cleanly, which causes frustration to all the other people wanting to merge as well. Every few weeks we had to create a new &#8220;dev&#8221; branch from scratch because it just became impossible to fix the problems with the old one.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="491" src="https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-1024x491.png?x94846" alt="The issue of having multiple contributors pushing requests to a single dev branch." class="wp-image-10046" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-1024x491.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-300x144.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes-768x368.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/Photo1-kubernetes.png 1618w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">With many push requests, the &#8220;dev&#8221; branch was in trouble. </figcaption></figure>



<p class="wp-block-paragraph">So how do we solve this problem? The answer came to me while experimenting with Kubernetes. I was in the process of migrating one of our projects from a traditional “Docker on a VM” setup into Kubernetes. The project in question, as you might guess, is Kazhoon, our internal developer portal (IDP).&nbsp;</p>



<p class="wp-block-paragraph">Before explaining the solution, it helps to first understand how we deploy applications to Kubernetes.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-HowdowedeploytoKubernetes" class="wp-block-heading"><span id="how-do-we-deploy-to-kubernetes"><strong>How do we deploy to Kubernetes</strong></span></h2>



<p class="wp-block-paragraph">Apart from having standard Kubernetes clusters, Infobip also leverages ArgoCD. A continuous delivery/deployment tool that sits between developers and Kubernetes. It uses GitOps principles to continuously sync infrastructure configuration stored in a Git repository with the actual cluster state. </p>



<p class="wp-block-paragraph">This way,&nbsp;developers don&#8217;t need to directly interact with a Kubernetes cluster but instead just tweak and update the files in git and ArgoCD will make sure the changes get reflected in the actual Kubernetes cluster.</p>



<p class="wp-block-paragraph">Also, it gives us a nice UI to monitor the changes. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="313" src="https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-1024x313.png?x94846" alt="" class="wp-image-10289" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-1024x313.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-300x92.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571-768x235.png 768w, https://shiftmag.dev/wp-content/uploads/2026/06/image-2025-11-21_12-46-571.png 1660w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">ArgoCD UI</figcaption></figure>



<p class="wp-block-paragraph"><strong>So how do we deploy?</strong></p>



<p class="wp-block-paragraph">Well&#8230;, let&#8217;s say we want to deploy a &#8220;simple&#8221; application. In this case it is our IDP Kazhoon. Keep in mind that our app has do be dockerized for it to be deployed to Kubernetes.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><em>P.S. The files below are created in a separate git repository that is linked with our ArgoCD application. For more information check out&nbsp;<a href="https://argo-cd.readthedocs.io/en/stable/getting_started/" target="_blank" rel="noreferrer noopener nofollow">ArgoCD docs</a>. Parts of the files have also been cut out for clarity.</em></p>
</blockquote>



<p class="wp-block-paragraph">We will first create a file which describes how our application should be deployed. Important parts have comments.</p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Deployment &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">apps/v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of resource in Kubernetes that manages our pods (aka. instances)</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Name of the resources</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">replicas:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">2</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Number of pods to create/manage</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">selector:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">matchLabels:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">template:</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># this is where we describe each deployment of our application</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">labels:</span>
        <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">imagePullSecrets:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">image-pull-secret</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">containers:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">image:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">docker.domain.com/infobip-backstage:1.175.9</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># dockerized image on internal artifact repository.</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">imagePullPolicy:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">IfNotPresent</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Yes, Kubernetes will cache your images, so if it already existed, it will reuse it based on the name/version.</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">ports:</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># new port called "http"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">containerPort:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">7007</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># port where our application is listening</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">envFrom:</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">configMapRef:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-config</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Environment variables defined in a separate file</span>
            <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">secretRef:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-secrets</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f576.png" alt="🕶" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Secret Environment variable defined in a separate file</span>
          <span style="color: rgb(68, 68, 68); font-weight: 400;">resources:</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># We don't need to provision VMs for our application, we just tell Kubernetes how "heavy" our app is and Kubernetes will make sure to give us enough power.</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">requests:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">cpu:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">memory:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1Gi"</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">limits:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">cpu:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1"</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">memory:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"1Gi"</span></pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">We also need some sort of internal load balancer for our pods to be able to connect to them. We need to create a Kubernetes<strong>&nbsp;Service.&nbsp;</strong></p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Service &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Service</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of Kubernetes resource that acts as an internal load balancer. It also allows other resources to communicate with out pods</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-service</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">selector:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">app:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-deployment</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># We tell the service which pods it should find</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">ports:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;">#  we define a new port </span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">port:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">80</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># this port gets opened on the Service </span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">targetPort:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">http</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># resolves to the 7007 port of our pods (check the ports defined in the Deployment snippet)</span>
</pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">As a last step we also want to allow for people outside the Kubernetes cluster to connect to our application. We need an&nbsp;<strong>Ingress</strong></p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Ingress &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 400;">apiVersion:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">networking.k8s.io/v1</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">kind:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Ingress</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># Type of Kubernetes resource that allows us to expose our internal network to the outside. In Infobip we use Haproxy for this.</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">metadata:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-ingress</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">namespace:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">annotations:</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">iks-external-dns.k8s.infobip.com/hostname:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># special Infobip annotations that create a DNS record for our network</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">cert-manager.io/common-name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># used for TLS</span>
    <span style="color: rgb(68, 68, 68); font-weight: 400;">cert-manager.io/cluster-issuer:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">vault-issuer</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># TLS</span>
<span style="color: rgb(68, 68, 68); font-weight: 400;">spec:</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">rules:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">host:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span>
      <span style="color: rgb(68, 68, 68); font-weight: 400;">http:</span>
        <span style="color: rgb(68, 68, 68); font-weight: 400;">paths:</span>
          <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">path:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">/</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">pathType:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">Prefix</span>
            <span style="color: rgb(68, 68, 68); font-weight: 400;">backend:</span>
              <span style="color: rgb(68, 68, 68); font-weight: 400;">service:</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">backstage-service</span>
                <span style="color: rgb(68, 68, 68); font-weight: 400;">port:</span>
                  <span style="color: rgb(68, 68, 68); font-weight: 400;">number:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">80</span>
  <span style="color: rgb(68, 68, 68); font-weight: 400;">tls:</span>
    <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(68, 68, 68); font-weight: 400;">hosts:</span>
        <span style="color: rgb(57, 115, 0); font-weight: 400;">-</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">infobip-kazhoon-iot1.domain.com</span>
&nbsp; &nbsp; &nbsp; <span style="color: rgb(68, 68, 68); font-weight: 400;">secretName:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">minimal-ingress-cert</span> <span style="color: rgb(105, 112, 112); font-weight: 400;"># stores the certificate in this certificate resource</span></pre>
</details>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Once we create all the files, we push them to&nbsp;our git repository and hit &#8220;Sync&#8221; on ArgoCD. If we did everything okay we should see something like this:<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="133" src="https://shiftmag.dev/wp-content/uploads/2026/05/image-1-1024x133.png?x94846" alt="request → the ip of the haproxy service (which now has our config from the ingress) → ingress → service (load balancer) → pods" class="wp-image-10099" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/image-1-1024x133.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1-300x39.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1-768x100.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/image-1.png 1734w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">From left to right:<br><strong>request → the ip of the haproxy service (which now has our config from the ingress) → ingress → service (load balancer) → pods</strong></figcaption></figure>



<p class="wp-block-paragraph"><em>Since this is a simplified &#8220;network&#8221; view we don&#8217;t see all resources (config files, certificates, etc&#8230;). The pods/instances on our right are the result of our &#8220;Deployment&#8221; resource which is not visible here.</em></p>



<p class="wp-block-paragraph">As you can see, with just a handful of files we managed to completely skip VM provisioning as well as avoid the need to click through yet another UI just to deploy.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Revelation" class="wp-block-heading"><span id="and-then-it-clicked"><strong>And then, it clicked</strong></span></h2>



<p class="wp-block-paragraph">Kubernetes wasn’t just solving our infrastructure problems. Its design made it possible to solve the contributor problem I described at the beginning.</p>



<p class="wp-block-paragraph">Instead of coordinating deployments, managing shared environments, or deciding who gets to test changes and when, we could let the platform do the work for us.</p>



<p class="wp-block-paragraph">Everything could be automated.<br>Every change could have its own environment.<br>No coordination required.</p>



<p class="wp-block-paragraph"><em>The solution?</em></p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-EphemeralEnvironments" class="wp-block-heading"><span id="ephemeral-environments"><strong>Ephemeral Environments</strong></span></h2>



<p class="wp-block-paragraph">Whenever a contributor opens a new pull request, we can create an ephemeral (temporary) environment specifically for that branch, using the steps described in the example above.</p>



<p class="wp-block-paragraph">We deploy the contributor’s branch to this environment and provide a unique link where they can test their changes.</p>



<p class="wp-block-paragraph">This approach means contributors don’t need to think about deployment at all &#8211; everything happens automatically.</p>



<p class="wp-block-paragraph">Each temporary environment is fully isolated from the others. The only shared component is the database, which could be further improved by switching to an in-memory solution.</p>



<p class="wp-block-paragraph">Each environment has its own ingress, ensuring that every contributor receives a dedicated URL for their branch.</p>



<p class="wp-block-paragraph">Because of this, we can eliminate the need for a separate&nbsp;<code>dev</code>&nbsp;branch and deploy feature branches directly.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Howitworks?" class="wp-block-heading"><span id="how-it-works"><strong>How it works?</strong></span></h2>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-PullRequestHooks" class="wp-block-heading"><span id="step-1-pull-request-hooks">Step 1: Pull Request Hooks</span></h2>



<p class="wp-block-paragraph">Initially a contributor will just write some code, test it locally, and when happy, open up a pull request. This is where most developers would usually deploy to some IO environment that is close to a production setup for additional testing.</p>



<p class="wp-block-paragraph">Instead of having to worry about the deployment, a Bitbucket&nbsp;<a href="https://confluence.atlassian.com/bitbucketserver/manage-webhooks-938025878.html" target="_blank" rel="noreferrer noopener nofollow">webhook</a>&nbsp;which listens to the&nbsp;<strong>PR_OPENED&nbsp;</strong>event will trigger a Jenkins job. The same Jenkins job that is used to build the main Kazhoon application. This is done to prevent duplication of jenkins groovy code as well as archetypes, which I will explain later. Simple hook below.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="814" height="498" src="https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes.png?x94846" alt="" class="wp-image-10050" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes.png 814w, https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes-300x184.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/photo-4-kubernetes-768x470.png 768w" sizes="auto, (max-width: 814px) 100vw, 814px" /></figure>



<p class="wp-block-paragraph"><em>Notice the additional hook at the top. This is the main hook used for the app. It triggers the same Jenkins jobs but under different conditions (PUSH_EVENT &#8211; when code is pushed).</em></p>



<p class="wp-block-paragraph"><em>All of this can also be achieved on&nbsp;Github as well, using workflows.</em></p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-ThemainJenkinsJob" class="wp-block-heading"><span id="step-2-the-main-jenkins-job">Step 2: The main Jenkins Job</span></h2>



<p class="wp-block-paragraph">Apart from the main logic for building Kazhoon and pushing a docker image (standard for most Infobip apps), we additionally need the setup for Kubernetes. Keep in mind that the Jenkins job runs every time new code gets pushed. We need a way to detect which code change is linked to a PR. In other words:&nbsp;<strong>Does the branch that is currently being built have an open PR linked to it?</strong></p>



<p class="wp-block-paragraph">Initially we figured we could just use the build parameter PR_ID as seen&nbsp;on the image above. This was working okay for testing, but then a problem appeared. How do we detect code changes?&nbsp;After all, we would like the most recent code to be deployed and not just the one that existed when we opened up the PR.</p>



<p class="wp-block-paragraph">Sadly, the PR_ID parameter does not exist on regular code changes. We could create another hook using the PR_SOURCE_RESCOPED event, but that would mean that we will have duplicate Jenkins jobs. One for the newly added hook and one for the original &#8220;main&#8221; hook that always gets triggered when we push code. We need a different solution.</p>



<p class="wp-block-paragraph">Luckily, it is possible to call APIs through Jenkins, so what we can do is call the&nbsp;<a href="https://developer.atlassian.com/server/bitbucket/rest/v1000/intro/#about" target="_blank" rel="noreferrer noopener nofollow">Bitbucket API</a>, check if the branch currently being built has an open pull request, and if so, initiate the Kubernetes setup. This logic can be done on the initial pull request open event as well as subsequent code change triggers. Here is how that would look like. Example written in a Jenkinsfile using scripted pipeline syntax.</p>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Bitbucket API example &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; ">def <span style="color: rgb(136, 0, 0); font-weight: 700;">findPrForSourceBranch</span>(sourceBranch) {
    <span style="color: rgb(136, 0, 0); font-weight: 700;">withCredentials</span>([<span style="color: rgb(68, 68, 68); font-weight: 700;">string</span>(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentialsId</span>: globconst.GIT_HTTPS_TAG_TOKEN, <span style="color: rgb(68, 68, 68); font-weight: 400;">variable</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'GIT_TOKEN'</span>)]) {
        def response = <span style="color: rgb(136, 0, 0); font-weight: 700;">httpRequest</span>(
            <span style="color: rgb(68, 68, 68); font-weight: 400;">url</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">"${globconst.BITBUCKET_API_URL}projects/IAF/repos/infobip-backstage/pull-requests?state=OPEN&amp;at=refs/heads/${sourceBranch}&amp;direction=OUTGOING"</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">httpMode</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'GET'</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">contentType</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'APPLICATION_JSON'</span>,
            <span style="color: rgb(68, 68, 68); font-weight: 400;">customHeaders</span>: [[<span style="color: rgb(68, 68, 68); font-weight: 400;">name</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'Authorization'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">value</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">"Bearer ${GIT_TOKEN}"</span>]],
            <span style="color: rgb(68, 68, 68); font-weight: 400;">validResponseCodes</span>: <span style="color: rgb(136, 0, 0); font-weight: 400;">'200'</span>
        )
        def prList = <span style="color: rgb(68, 68, 68); font-weight: 700;">new</span> groovy.json.<span style="color: rgb(136, 0, 0); font-weight: 700;">JsonSlurper</span>().<span style="color: rgb(136, 0, 0); font-weight: 700;">parseText</span>(response.content)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (prList.size &gt; <span style="color: rgb(136, 0, 0); font-weight: 400;">0</span>) {
            <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span> prList.values[<span style="color: rgb(136, 0, 0); font-weight: 400;">0</span>].id
        }
        <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span> <span style="color: rgb(102, 153, 85); font-weight: 400;">null</span>
    }
}
<span style="color: rgb(136, 0, 0); font-weight: 700;">node</span>(<span style="color: rgb(136, 0, 0); font-weight: 400;">'infobip-docker-nodejs:v20-dev'</span>) {
    <span style="color: rgb(136, 0, 0); font-weight: 700;">LoadJenkinsPipelineLibrary</span>(this)
    <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (!env.PR_ID &amp;&amp; env.BRANCH_NAME &amp;&amp; env.BRANCH_NAME != <span style="color: rgb(136, 0, 0); font-weight: 400;">'master'</span>) {
        def prId = <span style="color: rgb(136, 0, 0); font-weight: 700;">findPrForSourceBranch</span>(env.BRANCH_NAME)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (prId) {
            env.PR_ID = prId
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: rgb(68, 68, 68); font-weight: 700;">echo</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"Found PR_ID=${prId} for branch ${env.BRANCH_NAME}"</span>
        } <span style="color: rgb(68, 68, 68); font-weight: 700;">else</span> {
            <span style="color: rgb(68, 68, 68); font-weight: 700;">echo</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"No PR found for branch ${env.BRANCH_NAME}"</span>
        }
    }</pre>
</details>



<p class="wp-block-paragraph">In the later stages we can just check for the env.PR_ID. If it exists then there is a PR linked to the branch. Here is how that would look like:</p>



<h3 class="wp-block-heading"><span id="stages">Stages:</span></h3>



<ol class="wp-block-list">
<li>Clone Kubernetes config repository which is linked to the ArgoCD application</li>



<li>Generate Kubernetes files from template &#8211; make sure we sanitize the values</li>



<li>Push to git</li>



<li>Trigger sync on ArgoCD and&nbsp;leave comment in PR with link to new deployment.</li>
</ol>



<p class="wp-block-paragraph"></p>



<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" style="font-size:16px"><summary><strong><em>Jenkinsfile Kubernetes Logic &#8211; CLICK TO EXPAND</em></strong></summary>
<pre style="font-family:monospace;color: rgb(68, 68, 68); background-color: rgb(243, 243, 243); font-weight: 400; "><span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_REPO = <span style="color: rgb(136, 0, 0); font-weight: 400;">'ssh://git-instance.com:7999/project-name/infobip-kazhoon.git'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_BRANCH = <span style="color: rgb(136, 0, 0); font-weight: 400;">'master'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> K8S_CONFIG_TARGET_DIR = <span style="color: rgb(136, 0, 0); font-weight: 400;">'k8s-config-repo'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> featureName = env.BRANCH_NAME.toLowerCase().replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/[^a-z0-9_-]/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"-"</span>) ?: <span style="color: rgb(136, 0, 0); font-weight: 400;">'feature-preview'</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> k8sSafeName = env.BRANCH_NAME.toLowerCase().replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/[^a-z0-9-]/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"-"</span>).take(<span style="color: rgb(136, 0, 0); font-weight: 400;">40</span>).replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/-+$/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">""</span>) <span style="color: rgb(105, 112, 112); font-weight: 400;">// Kubernetes name limit</span>
<span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> dnsSafeName = k8sSafeName.take(<span style="color: rgb(136, 0, 0); font-weight: 400;">24</span>).replaceAll(<span style="color: rgb(171, 86, 86); font-weight: 400;">/-+$/</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">""</span>) <span style="color: rgb(105, 112, 112); font-weight: 400;">// DNS name limit eg. infobip-kazhoon-iot1-feature-verylongbr.domain.com</span>

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Clone Kubernetes Config Repo'</span>) {
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// A neat trick to skip jenkins stages. Left out in later stages for brevity</span>
    <span style="color: rgb(68, 68, 68); font-weight: 700;">if</span> (!env.PR_ID) { 
        Utils.markStageSkippedForConditional(STAGE_NAME)
        <span style="color: rgb(68, 68, 68); font-weight: 700;">return</span>
    }
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// Clone the kubernetes repository where we put our initial files for deployment.</span>
    sshagent(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentials:</span> [GIT_CREDENTIALS]) {
        globlib.git.checkout(<span style="color: rgb(68, 68, 68); font-weight: 400;">gitUrl:</span> K8S_CONFIG_REPO, <span style="color: rgb(68, 68, 68); font-weight: 400;">gitBranch:</span> K8S_CONFIG_BRANCH, <span style="color: rgb(68, 68, 68); font-weight: 400;">targetDir:</span> K8S_CONFIG_TARGET_DIR)
    }
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Generate Kubernetes Files from Template'</span>) {
    <span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> featurePath = <span style="color: rgb(136, 0, 0); font-weight: 400;">"${K8S_CONFIG_TARGET_DIR}/feature/${featureName}"</span>
    <span style="color: rgb(105, 112, 112); font-weight: 400;">// Copy and customize template. The template looks similar to the 3 files we created for the deployment just with some parts containing placeholders instead of fixed values.</span>
    sh <span style="color: rgb(136, 0, 0); font-weight: 400;">"""
        mkdir -p ${featurePath}
        cp -r ${K8S_CONFIG_TARGET_DIR}/feature/template/* ${featurePath}/

        # Replace placeholders in template
        for f in ${featurePath}/deployment.yaml ${featurePath}/service.yaml ${featurePath}/ingress.yaml; do
            sed -i -e "s|{{IMAGE_TAG}}|${dockerLabel}|" \
                -e "s|{{K8S_SAFE_IMAGE_TAG}}|${k8sSafeName}|" \
                -e "s|{{DNS_NAME}}|${dnsSafeName}|" \"\$f"
        done
    """</span>
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Push Kubernetes Resources to Git'</span>) { 
    dir(<span style="color: rgb(136, 0, 0); font-weight: 400;">"${K8S_CONFIG_TARGET_DIR}"</span>) {
        sshagent(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentials:</span> [GIT_CREDENTIALS]) {
            sh <span style="color: rgb(136, 0, 0); font-weight: 400;">"""
                git config user.email "infobip-ci@infobip.com"
                git config user.name "Infobip CI (Jenkins)"
                git add .
				// We don't want the script to fail if there are no changes
                if ! git diff --cached --quiet; then
                    git commit -m 'added feature ${featureName}'
                    git push -u origin ${K8S_CONFIG_BRANCH}
                else
                    echo 'No changes to commit'
                fi
            """</span>
        }
    }
}

stage(<span style="color: rgb(136, 0, 0); font-weight: 400;">'Trigger Sync on ArgoCD'</span>) {
    withCredentials([string(<span style="color: rgb(68, 68, 68); font-weight: 400;">credentialsId:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'kazhoon_argocd_bearer_token'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">variable:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'BEARER_TOKEN'</span>)]) {
        <span style="color: rgb(68, 68, 68); font-weight: 700;">def</span> response = httpRequest(
            <span style="color: rgb(171, 86, 86); font-weight: 400;">url:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"https://argo-instance.com/api/v1/applications/infobip-kazhoon-iot1/sync"</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">httpMode:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'POST'</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">contentType:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'APPLICATION_JSON'</span>,
            <span style="color: rgb(171, 86, 86); font-weight: 400;">customHeaders:</span> [[<span style="color: rgb(68, 68, 68); font-weight: 400;">name:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'Authorization'</span>, <span style="color: rgb(68, 68, 68); font-weight: 400;">value:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">"Bearer ${BEARER_TOKEN}"</span>]],
            <span style="color: rgb(171, 86, 86); font-weight: 400;">validResponseCodes:</span> <span style="color: rgb(136, 0, 0); font-weight: 400;">'200'</span>
        )
    }
	<span style="color: rgb(105, 112, 112); font-weight: 400;">// Utility function for posting comments to Bitbucket PR.</span>
    postPrComment(env.PR_ID, <span style="color: rgb(136, 0, 0); font-weight: 400;">"finish"</span>, <span style="color: rgb(136, 0, 0); font-weight: 400;">"""<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Your **feature environment** is live!
    ![party](https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExcjFyczl4anFvZXYzNGY1aGM2amIyZTk5Y3B6ZWJ4dHM1Y2ExamptYSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/a0h7sAqON67nO/giphy.gif)
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f310.png" alt="🌐" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Access it here: [Preview URL](https://infobip-kazhoon-iot1-${dnsSafeName}.domain.com)
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2139.png" alt="ℹ" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Note that it might take a few minutes for the DNS to propagate and the service to become fully operational.
    <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2757.png" alt="❗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> If you encounter any issues, please contact [#kazhoon_contributors](https://infobip-support.slack.com/archives/C098ETXLL2U) on slack."""</span>)
}</pre>
</details>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-1024x576.png?x94846" alt="The flow for pushing requests through kubernetes " class="wp-image-10144" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-1024x576.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-300x169.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5-768x432.png 768w, https://shiftmag.dev/wp-content/uploads/2026/05/New-Project5.png 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Flow of creating new features</figcaption></figure>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Cleanup" class="wp-block-heading"><span id="step-3-cleanup">Step 3: Cleanup</span></h2>



<p class="wp-block-paragraph">After the PR is merged, the letfover deployment is automatically cleaned up using a separate webhook and Jenkins pipeline which I won&#8217;t go into detail for this blog post.</p>



<p class="wp-block-paragraph">In short, when a PR is merged or deleted, a&nbsp;<code>Jenkinsfile.cleanup</code>&nbsp; pipeline is executed to remove all previously created resources and trigger a sync in Argo CD.</p>



<p class="wp-block-paragraph">The same&nbsp;<code>Jenkinsfile.cleanup</code>&nbsp;pipeline also runs periodically to remove stale resources from old PRs, helping avoid unnecessary infrastructure and electricity usage.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Conclusion" class="wp-block-heading"><span id="conclusion"><strong>Conclusion</strong></span></h2>



<p class="wp-block-paragraph">Kubernetes and Argo CD allowed us to significantly improve the developer experience for everyone contributing to Kazhoon. By adopting a GitOps-driven approach, we eliminated the need to interact with a UI and, with it, the mental overhead of figuring out how and where to test changes. The entire deployment process is now fully abstracted away from contributors.</p>



<p class="wp-block-paragraph">The original &#8220;dev&#8221; branch which was a major source of confusion and friction no longer exists. Developers work exclusively on their feature branches, each with its own isolated, production-like environment.</p>



<p class="wp-block-paragraph">This setup also removed a large portion of our support overhead. Everything is automatic, predictable, and clearly communicated directly through pull request comments, allowing contributors to focus on what actually matters: building features.</p>



<h2 id="ScalingMultiContributorDevelopmentwithKubernetes&amp;EphemeralEnvironments-Resources&amp;Shout-outs" class="wp-block-heading"><span id="resources-shout-outs"><strong>Resources &amp; Shout-outs</strong></span></h2>



<p class="wp-block-paragraph">Special shout-out to Matej Kern and his team for helping me throughout the entire process. From explaining Kubernetes concepts to setting up the infrastructure behind everything described in this post. This project would not have been possible without their support and guidance.</p>



<p class="wp-block-paragraph">A huge shout-out as well to the maintainers and contributors behind these amazing projects and resources that made this workflow possible:</p>



<ul class="wp-block-list">
<li><a href="https://kubernetes.io/">Kubernetes</a></li>



<li><a href="https://argo-cd.readthedocs.io">Argo CD</a></li>



<li><a href="https://backstage.io/">Backstage, where I got the&nbsp;inspiration from</a></li>



<li><a href="https://www.cncf.io/">The cloud-native computing foundation</a></li>
</ul>



<p class="wp-block-paragraph"><em>Hope you enjoyed this blog post. It&#8217;s my first official one (and definitely not the last). There’s a lot I didn’t manage to include, because it would’ve ended up being a whole novel, so if you have any questions or thoughts, I&#8217;m always happy to chat. Feel free to <a href="https://x.com/a_erajc" target="_blank" rel="noreferrer noopener nofollow">message me on X.</a></em></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://shiftmag.dev/kubernetes-multi-contributor-challenge-infobip-9591/">Solving the Multi-Contributor Challenge with Kubernetes and Ephemeral Environments</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>20 Year Old Unicorn Goes AI-First Without Mass AI Layoffs</title>
		<link>https://shiftmag.dev/ai-first-izabel-jelenic-infobip-10156/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Wed, 10 Jun 2026 12:03:47 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Developer Experience]]></category>
		<category><![CDATA[agentic AI]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI-first]]></category>
		<category><![CDATA[CTO]]></category>
		<category><![CDATA[infobip]]></category>
		<category><![CDATA[Izabel Jelenić]]></category>
		<category><![CDATA[MCP]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10156</guid>

					<description><![CDATA[<p>A CTO with 20 years of experience through multiple tech shifts sees layoffs not as an AI effect, but as a correction after an unsustainable hiring boom. He sees AI as a reset: an opportunity for strong junior engineers, and a wake-up call for senior developers facing an existential shift in how they stay relevant.</p>
<p>The post <a href="https://shiftmag.dev/ai-first-izabel-jelenic-infobip-10156/">20 Year Old Unicorn Goes AI-First Without Mass AI Layoffs</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Whether you are a skeptical senior AI engineer, a cautious junior, or an enthusiast who has been fully engaged in AI since the moment you discovered it, the interview I prepared will stay with you.</p>


<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/05/izo1-1.png?x94846" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/izo1-1.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/05/izo1-1-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/05/izo1-1-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/izo1-1-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">This May, I spoke with a CTO who truly understands the spirit of the moment and brings a grounded, realistic view of the current wave of AI expansion. <strong>He applies that perspective across a team of roughly 1,000 developers.</strong></p>



<p class="wp-block-paragraph">That is <a href="https://www.linkedin.com/in/izabel-jelenic-1855974/">Izabel Jelenić</a>, CTO of <a href="https://www.infobip.com/" target="_blank" rel="noreferrer noopener">Infobip</a>, first Croatian unicorn. As a co-founder, he has been there since the very beginning, when two university friends started a small startup that later grew into a billion-dollar global organization. <strong>Over the past 20 years, this veteran tech leader has navigated every major technological shift while helping scale the company worldwide.</strong></p>



<p class="wp-block-paragraph">The conversation comes at a moment when we are in the middle of the agentic AI era, where AI systems move beyond answering questions and begin executing tasks, supporting and automating real workflows. At Infobip, this shift has been embraced early and deliberately through an <strong>AI-first transformation that extends across the entire organization, engaging not only developers but employees in every function</strong>.</p>



<h2 class="wp-block-heading"><span id="developers-should-adopt-ai-gradually">Developers should adopt AI gradually</span></h2>



<p class="wp-block-paragraph">I asked Izabel to explain what AI-first means and how the idea of shifting to an AI-first mindset emerged.</p>



<p class="wp-block-paragraph">What followed was a comprehensive breakdown of its evolution, core principles, and practical execution. With over two decades in the tech industry, my interlocutor emphasizes that he has never witnessed a technological shift this monumental, signaling clear proof that AI is rapidly moving from mere hype into everyday utility. </p>



<p class="wp-block-paragraph">That makes mastering these capabilities and maximizing their potential absolutely crucial. A common pitfall, however, is assuming AI belongs solely to developers, which completely misses the mark given the technology&#8217;s universal transformative power:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">That is why Infobip promotes a mindset in which all technical and non-technical employees embrace curiosity toward AI so they can be part of the new business and technological order instead of letting it overtake them. That is the AI-first shift the company has chosen as its business philosophy for the future.</p>
</blockquote>



<p class="wp-block-paragraph">While technical teams naturally adopt new tools faster and more efficiently, he believes those outside software engineering shouldn&#8217;t be left behind. Providing non-technical employees with the right resources and training allows them to leverage AI agents as personal assistants, ultimately making their daily work both easier and faster.</p>



<p class="wp-block-paragraph">When it comes to software developers, the Infobip CTO sees two extremes:</p>



<ol id="block-2e1c8206-e7bb-4608-9086-979d2a7323a0" class="wp-block-list">
<li>Some cling tightly to writing code and represent the anti-AI camp.</li>



<li>Others rely fully on AI and embrace vibe coding.</li>
</ol>



<p class="wp-block-paragraph">In his view, <strong>neither approach is correct</strong>.</p>



<p class="wp-block-paragraph">Because technological development has not yet reached the &#8220;dark factory&#8221; stage (where systems run entirely automated and unassisted), rushing into a full AI concept remains premature. Instead, this direction serves as a north star—a long-term guide rather than an immediate reality. While it remains uncertain if a fully autonomous state is entirely achievable, forcing such an approach today is clearly unwise.</p>



<p class="wp-block-paragraph"><strong>Developers should adopt AI gradually</strong>. They should understand which tools suit them best, such as coding, review, and testing.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://shiftmag.dev/wp-content/uploads/2026/05/DSC04514-1024x682.jpg?x94846" alt="AI-first mindset" class="wp-image-9717" title="AI-first mindset" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/DSC04514-1024x682.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04514-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04514-768x512.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04514.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo credit: Neven Kacun</figcaption></figure>



<h2 class="wp-block-heading">If you are a bad developer, AI can&#8217;t help you</h2>



<p class="wp-block-paragraph">From the CTO&#8217;s perspective, Infobip developers have adopted an AI-first mindset naturally and with little friction, though overdoing it remains a risk. There is a critical need to retain ownership and maintain a strong architecture, especially since AI often acts as an amplifier, scaling both good practices and underlying flaws:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If you are a bad developer, AI will not help you write good code. If you are a good developer, AI can help you a lot in terms of speed. But you have to know how to guide it and recognize its mistakes, because it can be very convincing.</p>
</blockquote>



<p class="wp-block-paragraph">He explains that an AI-first mindset changes how organizations operate. <strong>AI speeds up processes by automating everything that can be automated</strong>. People can master this technology by adopting engineering logic, and they gain a strong advantage for the future.</p>



<p class="wp-block-paragraph">By ignoring AI, a person pushes themselves out of the industry. Izabel finds it surprising that some smaller companies do not adopt AI faster. They are in a growth phase where AI could make a huge difference. They could implement it quickly because teams are small and compact. Despite this, adoption remains low.</p>



<p class="wp-block-paragraph">The Infobip co-founder sees a common misconception that AI is mainly for developers. <strong>The biggest impact actually appears in GTM</strong> because AI automates business processes extremely well. Hyper-personalization becomes fast, advanced, and efficient. It can significantly help business scaling:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You can automatically analyze the market, get a list of potential clients, identify use cases that clients need, and do outreach. With hyper-personalization, you can prepare content in a way that immediately helps a person understand what a company sells, but from their perspective.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="ai-will-reshape-roles-in-tech-companies">AI will reshape roles in tech companies</span></h2>



<p class="wp-block-paragraph">Even though AI can quickly improve business organization, he notices that people mostly focus on coding. Coding has never been the biggest problem in IT businesses, <strong>the real bottlenecks usually appear in sales</strong>.</p>



<p class="wp-block-paragraph">This is where AI transforms work, making processes more efficient and cost-effective. Far from replacing client relationships or removing the human element, the goal is simply to automate repetitive operational tasks, leading to a much more streamlined workflow:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">People need to get on the AI train. If they do not use AI, new companies will emerge that are AI-native. They start with two people and AI. Their approach will feel more natural and much faster than those who use AI only for software development.</p>
</blockquote>



<p class="wp-block-paragraph">When asked to describe what an AI-first transformation looks like from the inside (using Infobip as an example) and whether the company will abandon certain processes or redistribute roles, the answer is far from black and white. This transition will happen gradually, <strong>marking the most significant technological shift in over two decades</strong>. </p>



<p class="wp-block-paragraph">Ultimately, enthusiastic professionals eager to learn will be the ones expanding their roles by actively implementing these new technologies:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">People experienced in one specialization can now work much more broadly. They can keep their core role, but they can accomplish much more. Someone who used to be only a backend developer can now work with databases or frontend. They may not reach the level of an experienced database engineer, but they can handle simple tasks. They do not need to wait for anyone.</p>
</blockquote>



<p class="wp-block-paragraph">The concept of Agentic AI is another major focal point, pointing toward a future where everyone operates with multiple digital assistants. By helping manage core business tasks faster and more efficiently, these agents streamline daily operations while actively expanding a professional&#8217;s overall skill set.</p>



<h2 class="wp-block-heading"><span id="ai-agents-are-still-nothing-without-people">AI agents are still nothing without people</span></h2>



<p class="wp-block-paragraph">As part of its AI-first mindset, Infobip is building its own <a href="https://www.infobip.com/mcp" target="_blank" rel="noreferrer noopener">Model Context Protocol (MCP)</a>, integrations, enabling AI agents to easily consume and interact with Infobip services. CTO believes this is vital because <strong>AI agents will soon be everywhere</strong>, embedded in business systems, running on personal devices, practically on anything you can imagine:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Once it became clear that AI agents are the primary means of interacting with the outside world, adoption accelerated rapidly. Companies realized how easy it is to connect these agents to external systems and services. The key point is that AI agents can now perform real-world tasks by consuming various APIs, especially those available on platforms like MCP. This capability makes them an integral part of business operations, and it’s why we believe their presence will become ubiquitous in the near future.</p>
</blockquote>



<p class="wp-block-paragraph">However, he stresses <strong>the importance of human involvement</strong>. It should not disappear:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Communication must continue to exist. We cannot fully hand it over to AI agents. They can help, but communication becomes even more important because everyone becomes more productive. Without alignment, you can end up with many generated tools that no one understands.</p>
</blockquote>



<p class="wp-block-paragraph">There is also a clear warning regarding hyperproduction, which can easily spiral into chaos if teams begin operating without proper coordination.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://shiftmag.dev/wp-content/uploads/2026/05/DSC04413-1024x682.jpg?x94846" alt="" class="wp-image-9720" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/DSC04413-1024x682.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04413-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04413-768x512.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/05/DSC04413.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo credit: Neven Kacun</figcaption></figure>



<h2 class="wp-block-heading"><span id="there-are-fewer-junior-developers-but-they-are-still-valuable">There are fewer junior developers, but they are still valuable</span></h2>



<p class="wp-block-paragraph">I also wanted to ask an experienced professional what will happen to junior developers. Demand for them has decreased globally. AI now generates much of the code that juniors used to write.</p>



<p class="wp-block-paragraph">At the same time, a generational shift could lead to a talent shortage. Looking back at the end of the pandemic when the IT sector saw a massive influx of talent, Izabel notes that many recent layoffs in US companies are likely happening under the cover of AI:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">They use AI as an excuse for inflated numbers and inflated costs. That is why fewer juniors get hired. I think balance is returning. We will not see excessive hiring from before, but there will still be a need for young, smart people who bring new ideas and fresh energy into processes.</p>
</blockquote>



<p class="wp-block-paragraph">To combat these talent gaps, Infobip runs targeted internships and collaborates closely with universities, frequently transitioning these students into permanent roles. In CTO&#8217;s experience, these fresh perspectives bring genuine value and innovative ideas to the team. </p>



<p class="wp-block-paragraph"><strong>AI plays a pivotal role in this onboarding process by granting immediate access to learning resources</strong>, allowing junior engineers to upskill rapidly. By leveraging AI as a 24/7 virtual mentor alongside human guidance, juniors can accelerate their professional growth and secure key positions within the company much faster</p>



<h2 class="wp-block-heading"><span id="experienced-developers-face-an-identity-crisis-because-of-ai">Experienced developers face an identity crisis because of AI</span></h2>



<p class="wp-block-paragraph">Skepticism among experienced developers toward AI, in the view of Infobip&#8217;s co-founder, stems from a natural feeling of disappointment and an ego hit that is not easy to accept. At the same time, he points out that over twenty years, workflows, frameworks, programming languages, and machines have all continually evolved:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You spend 20 years writing code as a developer, refining it, running it, seeing how it works, writing tests, and then suddenly you stop looking at the code and start talking to a tool. You experience an identity crisis because you used to identify with the code you wrote.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>My interlocutor views these feelings as entirely legitimate</strong>, but encourages professionals to expand their scope and boost productivity. Ultimate purpose does not need to remain locked within a single job description when fulfillment can be found in wider responsibilities. </p>



<p class="wp-block-paragraph">This adaptation is admittedly difficult, but as he points out, once people move past the &#8220;this is useless&#8221; phase, they position themselves for rapid growth by embracing the new reality.</p>



<p class="wp-block-paragraph">Speaking from his experience as a CTO for 20 years, Izabel describes the transition to an AI-first mindset:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">These changes are quite painful. We also went through turbulence, but at some point you see that AI brings value and you have to use it. Claims about AI being prohibitively expensive often serve as mere excuses. Open-source models can already run locally on standard laptops, completely bypassing the need for intensive training in many scenarios. Ultimately, running a model and training one are two entirely different concepts. Today, hardware capabilities and overall quality are night and day compared to what was available just a few years ago.</p>
</blockquote>



<p class="wp-block-paragraph">The question may be how good an LLM you use, but you will not be able to work without it. The technology is here to stay. It is important to understand its strengths and weaknesses and use it as soon as possible.</p>



<h2 class="wp-block-heading"><span id="the-future-is-uncertain-but-exciting">The future is uncertain but exciting</span></h2>



<p class="wp-block-paragraph">Finally, when asked what the next twenty years of Infobip will look like, the answer was a candid &#8220;I don&#8217;t know.&#8221; Just as no one could have predicted the current shift, no one can definitively predict the next. Still, one thing is certain: there is immense excitement about this change. </p>



<p class="wp-block-paragraph">Within Infobip, both technical and non-technical teams are fully embracing AI. Another deep reshaping is underway, business as usual no longer exists. Instead, the industry is witnessing a real transformation:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Twenty years ago we said &#8220;We are just starting&#8221;, and now we are in the same situation again. That will probably continue for the next 20 years. Our best people keep learning new things that drive them forward instead of standing still.</p>
</blockquote>



<p class="wp-block-paragraph">This mindset feels humble, but also necessary in a time of major technological transformation. It reflects the Socratic idea that true wisdom begins with understanding how little we know.</p>



<p class="wp-block-paragraph"><em>Infobip is the publisher of ShiftMag, recognizing the need for high-quality content for developers.</em></p>
<p>The post <a href="https://shiftmag.dev/ai-first-izabel-jelenic-infobip-10156/">20 Year Old Unicorn Goes AI-First Without Mass AI Layoffs</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: shiftmag.dev @ 2026-06-25 18:36:08 by W3 Total Cache
-->