<?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>Wed, 17 Jun 2026 12:50:45 +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>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 fetchpriority="high" 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="(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 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="(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 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="(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>
		<item>
		<title>Engineering Leaders, You Should Be Worried If Your Team Isn&#8217;t Pushing Back</title>
		<link>https://shiftmag.dev/engineering-leaders-you-should-be-worried-if-your-team-isnt-pushing-back-9891/</link>
		
		<dc:creator><![CDATA[Mia Biberovic]]></dc:creator>
		<pubDate>Thu, 04 Jun 2026 13:24:58 +0000</pubDate>
				<category><![CDATA[Engineering Management]]></category>
		<category><![CDATA[coaching]]></category>
		<category><![CDATA[communication]]></category>
		<category><![CDATA[CTO Craft]]></category>
		<category><![CDATA[David Fung]]></category>
		<category><![CDATA[engineering management]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9891</guid>

					<description><![CDATA[<p>There is a gap most engineering leaders prefer not to explore: the distance between the clarity they believe they're projecting and the confusion their teams actually experience.</p>
<p>The post <a href="https://shiftmag.dev/engineering-leaders-you-should-be-worried-if-your-team-isnt-pushing-back-9891/">Engineering Leaders, You Should Be Worried If Your Team Isn&#8217;t Pushing Back</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-Day2-David-Fung.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-David-Fung.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph"><a href="http://linkedin.com/in/davidfung2" type="link" id="http://linkedin.com/in/davidfung2">David Fung</a>, ICF PCC, founder and executive coach at Coachful Coaching, spent over two decades in tech, most recently as a Senior Director at Salesforce leading Sales Engineering teams. </p>



<p class="wp-block-paragraph">I had a chance to talk to him at CTO Craft Con in Toronto about <strong>the most reliable signal that something is wrong in the teams</strong>. Coincidentally, it is also the one most leaders misread.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">One of the biggest signs that you may not be clear is if you hear silence. A lot of leaders take silence as alignment. But silence is actually a sign that maybe people are either not clear or they may have just given up fighting with you.</p>
</blockquote>



<p class="wp-block-paragraph">The pattern he described is familiar to anyone who has worked under a fast-moving founder or senior leader: <strong>repeated pivots train teams to stop pushing back</strong>. The resistance has proven futile in the past. And the result is a team that appears aligned but actually isn&#8217;t.</p>



<h2 class="wp-block-heading"><span id="less-output-more-filtering">Less output, more filtering</span></h2>



<p class="wp-block-paragraph">Fung&#8217;s prescription runs counter to the default mode of most technology organizations right now. Instead of generating more output, more strategy documents, more direction, he argues<strong> leaders need to filter more aggressively</strong>. The job, as he frames it, is to reduce the surface area of what the team has to process so they can focus on what actually matters.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Your role now, especially as a leader in an age of AI noise and disruption, is to filter more. You need to be better at this so that your team can focus. And when your team can focus, there&#8217;s less confusion.</p>
</blockquote>



<p class="wp-block-paragraph">He&#8217;s not particularly optimistic that most leaders will find this easy. The same problem appeared across every organisation he spoke to at the CTO Craft Con. And those organisations range from small engineering teams to Fortune 500 companies &#8211; different scale, same dysfunction.</p>



<h2 class="wp-block-heading">Don&#8217;t mistake volume for clarity</h2>



<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-Craft-Toronto-audience-1024x682.png?x94846" alt="" class="wp-image-10185" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-1024x682.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-300x200.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-768x511.png 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">CTO Craft Con</figcaption></figure>



<p class="wp-block-paragraph">On the question of whether the problem gets worse with seniority, Fung redirected. &#8220;The problem gets worse when a leader is surrounded by yes people,&#8221; he said, drawing a pointed comparison to the behaviour of large language models: humans, he noted, were sycophantic long before AI was. <strong>The leaders who struggle most are those who have never built an environment where pushback is safe. </strong>And AI, by accelerating decision-making and reducing friction, makes that environment harder to maintain, not easier.</p>



<p class="wp-block-paragraph">For technical leaders specifically, Fung identified a recurring failure mode: <strong>mistaking volume for clarity</strong>. Engineers who send fifty-paragraph emails or chain together Slack voice notes aren&#8217;t being thorough. They&#8217;re producing noise. His framework for actual clarity is straightforward: say what&#8217;s happening, say why it&#8217;s happening, and say what it means for the people on the receiving end. He calls it: Name It, Frame It, Invite It.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">A lot of technical people forget the human part of it. What does this mean for the person hearing it? Why should they care? They forget that part</p>
</blockquote>



<p class="wp-block-paragraph">The aha moment, when leaders finally recognise their own role in the confusion, requires three things to land simultaneously: dissatisfaction with the current situation, self-awareness, and willingness to change. Any one of those missing and the realisation doesn&#8217;t stick.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Even if it&#8217;s not you, start with: Maybe I&#8217;m the problem. And what can I do differently to help the team?</p>
</blockquote>



<h2 class="wp-block-heading">AI won&#8217;t help with human problems</h2>



<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-Day2-David-Fung-2-1024x682.jpg?x94846" alt="" class="wp-image-10174" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-2-1024x682.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-2-300x200.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-2-768x511.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day2-David-Fung-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">On whether AI will eventually make this class of problem smaller, his answer was straightforward: no. Speed will actually amplify it. And as long as humans remain in the loop, the underlying conditions, ego, fear, imprecision, nervousness, don&#8217;t disappear.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">So long as there&#8217;s emotions involved, the human condition will exist. And it&#8217;s not a flaw. It is part of the human experience.</p>
</blockquote>



<p class="wp-block-paragraph">For the newly promoted senior engineer trying to avoid building the same dysfunctional dynamic from day one, Fung&#8217;s advice was the same three-part framework &#8211; what&#8217;s happening, why, what it means for you &#8211; applied in <strong>their own voice</strong>, not rehearsed or smoothed into someone else&#8217;s register. </p>



<p class="wp-block-paragraph">Simple, as he acknowledged, but not always easy.</p>
<p>The post <a href="https://shiftmag.dev/engineering-leaders-you-should-be-worried-if-your-team-isnt-pushing-back-9891/">Engineering Leaders, You Should Be Worried If Your Team Isn&#8217;t Pushing Back</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Don&#8217;t Hire Juniors to Write Code, Hire Them to Become Seniors</title>
		<link>https://shiftmag.dev/dont-hire-juniors-to-write-code-hire-them-to-become-seniors-9884/</link>
		
		<dc:creator><![CDATA[Mia Biberovic]]></dc:creator>
		<pubDate>Tue, 02 Jun 2026 13:29:27 +0000</pubDate>
				<category><![CDATA[Engineering Management]]></category>
		<category><![CDATA[Christine Miao]]></category>
		<category><![CDATA[CTO Craft]]></category>
		<category><![CDATA[junior developers]]></category>
		<category><![CDATA[senior software engineer]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9884</guid>

					<description><![CDATA[<p>The case for cutting junior engineers looks airtight at the CFO level, but wrong from every other perspective.</p>
<p>The post <a href="https://shiftmag.dev/dont-hire-juniors-to-write-code-hire-them-to-become-seniors-9884/">Don&#8217;t Hire Juniors to Write Code, Hire Them to Become Seniors</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-Christine-Miao-cover.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-Christine-Miao-cover.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Christine-Miao-cover-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Christine-Miao-cover-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Day1-Christine-Miao-cover-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">AI can generate code, seniors can review it, and entry-level salaries aren&#8217;t trivial &#8211; the argument for cutting junior engineers sounds reasonable on a spreadsheet. <strong>Christine Miao&#8217;s</strong> counter-argument starts at a different level entirely.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We&#8217;re in a growing industry where companies need to be able to continue and carry forward. In order to do that, they need to hire juniors. Foundationally, it&#8217;s about survival.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="survival-ai-adoption-and-honestly-good-vibes">Survival, AI adoption and, honestly, good vibes</span></h2>



<p class="wp-block-paragraph">I had a chat with Miao, <strong>Founder and Researcher at Technical Accounting</strong>, after her talk at the CTO Craft Conference in Toronto. Her talk was followed by a presentation, one of the rare ones not (completely) generated with AI. It was fun and quirky, a bit like junior developers, who bring fresh perspective, followed by a bit of charming chaos.</p>



<p class="wp-block-paragraph">They are essential for the companies’ and industry’s survival, Miao is certain, but that part is just the floor. Miao points to something harder to quantify: <strong>the organizational effect of having people experience a steep learning curve in public for the first time</strong>. Senior engineers who mentor a junior feel accountable in a way they simply don&#8217;t with an LLM.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I would certainly very much hope that no one feels responsible to an LLM the way they would feel responsible to a young person who is learning the ropes for the first time.</p>
</blockquote>



<p class="wp-block-paragraph">There is also an adoption argument. Juniors, she notes, have no prior workflows to protect. In organizations struggling to get engineers and other team members to actually use the AI tools they&#8217;ve licensed, hiring people without ingrained habits is a legitimate strategy.</p>



<h2 class="wp-block-heading"><span id="the-culprit-for-the-current-situation">The culprit for the current situation?</span></h2>



<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-Craft-Toronto-audience-day1-1024x683.png?x94846" alt="" class="wp-image-10184" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-day1-1024x683.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-day1-300x200.png 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-day1-768x512.png 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Toronto-audience-day1.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">CTO Craft Con</figcaption></figure>



<p class="wp-block-paragraph">I asked Miao who is responsible for the current contraction in entry-level hiring. She traces it up the chain further than most critics do. The culprit, in her view, is <strong>investors who conflate cost reduction with value creation</strong>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">They can&#8217;t tell the difference between cutting costs to maintain EBITDA, versus building a new product and creating a new growth area. In their minds, because the numbers are the same, it all adds up.</p>
</blockquote>



<p class="wp-block-paragraph">That mindset propagates downward into management, and juniors, whose output is hard to measure visibly, become an easy target.</p>



<h2 class="wp-block-heading"><span id="how-to-mentor-junior-engineers-who-use-ai">How to mentor junior engineers who use AI?</span></h2>



<p class="wp-block-paragraph">The mentorship question is where the conversation gets more complicated. Some senior engineers argue that<strong> AI-assisted development is producing juniors who generate output without understanding it</strong>, making them harder, not easier, to teach. Miao doesn&#8217;t dismiss the pattern, but she describes a bimodal distribution. On one end: juniors producing &#8220;really fast, really crappy slop&#8221; they can&#8217;t debug or explain. On the other: organizations where <a href="https://thoughtfuleng.substack.com/p/junior-developers-in-the-age-of-ai" target="_blank" rel="noreferrer noopener">juniors leveled up in roughly three months</a>, which brings down the cost of onboarding significantly.</p>



<p class="wp-block-paragraph">The difference comes down to two factors. First, a <strong>genuine organizational commitment to mentorship</strong>. Not as policy language, but as actual practice. Second, engineering foundations that are already in reasonable shape.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If you have a good baseline, AI gets easier, junior engineers become easier.</p>
</blockquote>



<p class="wp-block-paragraph">The inverse is also true: legacy codebases, poor documentation, and no mentorship infrastructure don&#8217;t just slow junior development, they actively compound each other. Adding AI to that environment and then blaming the junior for the output is a category error.</p>



<p class="wp-block-paragraph">On the question of <strong>what makes a strong junior right now</strong>. Miao is direct: it&#8217;s not code, but a want to level up, having the aptitude to recognize when a field clicks, and the grit to work through the parts that don&#8217;t. The market tightening is, in her view, a reasonable filter. <strong>Previously, anyone who could code could find a job; now the bar requires genuine engagement with the craft.</strong></p>



<h2 class="wp-block-heading">Companies that don&#8217;t hire juniors will fall into their own trap</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Christine-Miao-2-1024x768.jpg?x94846" alt="" class="wp-image-10181" srcset="https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Christine-Miao-2-1024x768.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Christine-Miao-2-300x225.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Christine-Miao-2-768x576.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/06/CTO-Craft-Christine-Miao-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">The longer-term risk is structural. Organizations that stop refreshing their pipelines now will, Miao argues, find themselves trapped in five years: <strong>too brittle to adapt, carrying institutional knowledge that was never transferred, and too understaffed to train anyone new</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">You hit a point where you are so busy keeping your head above water that you have no time to train anyone else. At that point, frankly, money won&#8217;t fix the problem.</p>
</blockquote>



<p class="wp-block-paragraph">For the organizations paying attention, the current environment is actually favorable: <strong>junior talent is abundant, under-hired, and, when developed properly, notably loyal</strong>. The companies that recognize this as a competitive window rather than a cost problem are likely to look very different from the ones that didn&#8217;t, and not in a recoverable way.</p>
<p>The post <a href="https://shiftmag.dev/dont-hire-juniors-to-write-code-hire-them-to-become-seniors-9884/">Don&#8217;t Hire Juniors to Write Code, Hire Them to Become Seniors</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>We Asked 20 Developers Why They Really Got Into Tech. It Wasn&#8217;t the Money.</title>
		<link>https://shiftmag.dev/we-asked-20-developers-why-they-really-got-into-tech-it-wasnt-the-money-10101/</link>
		
		<dc:creator><![CDATA[Anastasija Uspenski]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 13:39:32 +0000</pubDate>
				<category><![CDATA[Developer Experience]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Engineer Explains]]></category>
		<category><![CDATA[infobip]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=10101</guid>

					<description><![CDATA[<p>Twenty developers got real about their jobs: the rush of shipping something that actually works, the way a fat paycheck can make you stay longer than you probably should, and the slow death of sitting through another meeting that should've been an email.</p>
<p>The post <a href="https://shiftmag.dev/we-asked-20-developers-why-they-really-got-into-tech-it-wasnt-the-money-10101/">We Asked 20 Developers Why They Really Got Into Tech. It Wasn&#8217;t the Money.</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/05/developers_answer_shiftmag.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/05/developers_answer_shiftmag.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/05/developers_answer_shiftmag-300x158.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/developers_answer_shiftmag-1024x538.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/developers_answer_shiftmag-768x403.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">Ask anyone outside the industry why people go into software engineering and they&#8217;ll say: good money, remote work. Talk to the developers themselves and you get a different story.</p>



<p class="wp-block-paragraph">For most of the <a href="https://www.youtube.com/watch?v=mRWXIFC12hs" target="_blank" rel="noreferrer noopener">20 of our Infobip colleagues we interviewed</a>, it started with <strong>genuine curiosity</strong> &#8211; a need to understand how things work, then build their own. Some caught the bug in childhood, others through gaming. But the thread running through nearly every story is the same: they fell in love with the craft long before they ever thought about the salary.</p>



<p class="wp-block-paragraph"><strong>Josip Antoliš,</strong> Senior Principal Engineer, captures this sentiment:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">It felt like playing with Lego, just for older kids. It was really about building and experimenting.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="if-money-is-the-only-reason-you-want-to-become-a-developer-you-won%e2%80%99t-make-it">If money is the only reason you want to become a developer, you won’t make it</span></h2>



<p class="wp-block-paragraph">Money is part of the equation, and some developers are honest about it &#8211; job security and solid pay were what first pointed them toward the field. There&#8217;s nothing wrong with that. But most will tell you it only gets you so far. </p>



<p class="wp-block-paragraph">Engineering is demanding, constantly evolving, and unforgiving to those who are just going through the motions. The developers we spoke to largely agreed: <strong>without a genuine curiosity for the craft, the motivation eventually runs dry</strong>, no matter what&#8217;s in your bank account.</p>



<p class="wp-block-paragraph"><strong>Olga Koroleva</strong>, Staff Software Engineer, explains:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"> For me, it was not money driven. I just naturally like learning new things.</p>
</blockquote>



<p class="wp-block-paragraph">Not everyone had a master plan. For some of the developers we spoke to, the path into software was <strong>less a calling and more a series of small, accidental steps</strong> like following friends into a computer science program, or stumbling onto coding in their twenties and realizing they had a knack for logical thinking and breaking problems apart.</p>



<p class="wp-block-paragraph">What matters less, it turns out, is how you got in. What keeps people thriving is the <strong>willingness to keep learning and adapting</strong> in a field that never really stands still.</p>



<p class="wp-block-paragraph">Among younger developers in particular, gaming played a surprisingly direct role &#8211; less a hobby, more an early window into how software actually works.</p>



<p class="wp-block-paragraph"><strong>Edvin Teskeredžić</strong>, Senior AI Software Engineer, remembers his Counter-Strike days:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We used to play a lot of Counter-Strike, and to play together we had to set up servers. Later we started modifying the game, and only later realized we were actually programming.</p>
</blockquote>



<p class="wp-block-paragraph">In the end, whatever brought them to the field, most engineers find a way to grow into it. As <strong>Denis Kranjčec</strong>, Staff Engineer, puts it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I started programming 40 years ago, and money was fine, but it was not the only thing.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-best-things-about-being-a-developer">The best things about being a developer</span></h2>



<p class="wp-block-paragraph">When asked what they love most about the job, the answers kept circling back to the same themes.</p>



<ul class="wp-block-list">
<li>Cracking a hard problem in a clean, elegant way</li>



<li>Shipping something that actually makes life easier for people &#8211; knowing your code is quietly doing its job out in the world</li>



<li>Those rarer moments when a tangle of complex systems finally clicks into place, and what was chaos becomes something that just works</li>
</ul>



<p class="wp-block-paragraph"><strong>Creativity and problem-solving</strong> remain central themes. As Teskeredžić puts it:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I like solving practical problems and applying creative solutions.</p>
</blockquote>



<p class="wp-block-paragraph">Beyond the work itself, the setup matters too &#8211; remote work, autonomy, and long uninterrupted stretches to actually think. But as Olga Koroleva puts it, what really keeps people around is simpler than any perk:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The best part is staying curious.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="the-not-so-good-part-of-a-developer%e2%80%99s-career">The not-so-good part of a developer’s career</span></h2>



<p class="wp-block-paragraph">Ask about the downsides and the answers get a lot shorter. One word came up more than any other: <strong>meetings</strong>. Pointless ones, mostly. The kind that could&#8217;ve been an email.</p>



<p class="wp-block-paragraph">Beyond that, developers highlighted several systemic frustrations that disrupt deep focus:</p>



<ul class="wp-block-list">
<li>Constant context-switching takes a significant mental toll.<br></li>



<li>Bureaucracy and tedious reporting often fracture the time dedicated to core engineering tasks.<br></li>



<li>Navigating undocumented legacy code and parsing ambiguous logs slows development velocity.</li>
</ul>



<p class="wp-block-paragraph">There&#8217;s also the relentless pace of change. <strong>Kristina Valjak</strong>, Engineering Lead, puts it plainly:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The speed of change means you constantly have to learn. You have to sacrifice things. It is not a job you leave at the door.</p>
</blockquote>



<p class="wp-block-paragraph">And then there&#8217;s the physical reality: long hours at a screen, tight deadlines, pressure that doesn&#8217;t let up. Even in teams doing interesting work, that combination can wear you down.</p>



<h2 class="wp-block-heading"><span id="would-they-choose-this-career-again-absolutely">Would they choose this career again? Absolutely.</span></h2>



<p class="wp-block-paragraph">When asked if they&#8217;d do it all over again, there was barely a pause. Absolutely. 100 percent. </p>



<p class="wp-block-paragraph">More pros than cons. Almost without exception, these developers would make the same choice and most believe tech still offers something few other industries can match: <strong>genuine stability and room to keep growing</strong>.</p>



<p class="wp-block-paragraph"><strong>Ivona Škorjanc</strong>, Software Engineer, remains highly optimistic:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I would still choose it. It is exciting and I see myself growing in it.</p>
</blockquote>



<p class="wp-block-paragraph">A few said they&#8217;d have <strong>invested more in the fundamentals early on</strong> &#8211; the theory, the computer science basics that tend to get skipped in the rush to learn frameworks and ship code. But that&#8217;s a minor footnote to a bigger conclusion: this field is hard, and most of them wouldn&#8217;t trade it for anything.</p>



<p class="wp-block-paragraph">Teskeredžić offers a final, inspiring perspective on the profession:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">To me, engineers are like real-world wizards. Advanced technology is like magic, and if you can be a wizard for a career, why not.</p>
</blockquote>



<p class="wp-block-paragraph">Even the ones who occasionally miss working with their hands come back to the same answer: they&#8217;d choose this path again.</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="20 Developers Get Honest About Their Work" width="500" height="281" src="https://www.youtube.com/embed/mRWXIFC12hs?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/we-asked-20-developers-why-they-really-got-into-tech-it-wasnt-the-money-10101/">We Asked 20 Developers Why They Really Got Into Tech. It Wasn&#8217;t the Money.</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Trisha Gee: AI Won&#8217;t Fix Your Broken Pipeline &#8211; It Will Break It Faster</title>
		<link>https://shiftmag.dev/trisha-gee-ai-wont-fix-your-broken-pipeline-it-will-break-it-faster-9785/</link>
		
		<dc:creator><![CDATA[Ivan Pelivanovic]]></dc:creator>
		<pubDate>Wed, 27 May 2026 13:36:39 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=9785</guid>

					<description><![CDATA[<p>At Devoxx UK, I spoke with Trisha Gee - author and one of the most recognized voices in the Java space - about what really happens when teams lean heavily on AI. Her take was far darker than the conference hype.</p>
<p>The post <a href="https://shiftmag.dev/trisha-gee-ai-wont-fix-your-broken-pipeline-it-will-break-it-faster-9785/">Trisha Gee: AI Won&#8217;t Fix Your Broken Pipeline &#8211; It Will Break It Faster</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/tirsha-devoxx.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/05/tirsha-devoxx.jpg 1200w, https://shiftmag.dev/wp-content/uploads/2026/05/tirsha-devoxx-300x180.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/tirsha-devoxx-1024x614.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/tirsha-devoxx-768x461.jpg 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>

<div class="wp-block-post-excerpt wp-block-hidden-desktop wp-block-hidden-mobile wp-block-hidden-tablet"><p class="wp-block-post-excerpt__excerpt">At Devoxx UK, I spoke with Trisha Gee &#8211; author and one of the most recognized voices in the Java space &#8211; about what really happens when teams lean heavily on AI. Her take was far darker than the conference hype. </p></div>


<p class="wp-block-paragraph"><strong>Trisha Gee</strong> has spent over two decades in software development, from startups to global enterprises &#8211; equally at home discussing DORA metrics and SPACE frameworks as business outcomes and organizational design.</p>



<p class="wp-block-paragraph">At <a href="https://www.devoxx.co.uk/" target="_blank" rel="noreferrer noopener">Devoxx UK</a>, she gave a talk about how <strong>software engineering principles stay the same regardless of what tooling era you are in</strong>. </p>



<p class="wp-block-paragraph">I wanted to understand what that means right now when AI is writing a significant portion of the code.</p>



<h2 class="wp-block-heading"><span id="ai-exposes-the-weakest-link-not-just-the-fastest-path">AI exposes the weakest link, not just the fastest path</span></h2>



<p class="wp-block-paragraph">Trisha frames AI as an amplifier, not a solution. When I asked what that looks like beyond demos, she put it simply: <strong>it exposes the problems that were already there</strong>, the ones you didn&#8217;t know you had.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The most common thing I saw (I was working at Gradle, so we dealt with a lot of build tooling) was more code, more tests, and tests taking longer. The continuous delivery pipeline took a lot of pressure.</p>
</blockquote>



<p class="wp-block-paragraph">The broader pattern she describes is straightforward but easy to miss when you are excited about shipping faster. &#8220;Whichever part of your system is the weakest, it&#8217;s going to expose that part,&#8221; she said.</p>



<p class="wp-block-paragraph">Reframing it this way, while most conversations about AI adoption focus on what gets faster, Trisha highlights what deteriorates first.</p>



<h2 class="wp-block-heading"><span id="when-code-gets-cheap-everything-else-gets-expensive">When code gets cheap, everything else gets expensive</span></h2>



<p class="wp-block-paragraph">When I asked Trisha where teams should focus once code generation becomes cheap, her answer was <em>everywhere</em>.</p>



<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/crowd-devoxx-1024x614.jpg?x94846" alt="" class="wp-image-9877" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/crowd-devoxx-1024x614.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/crowd-devoxx-300x180.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/crowd-devoxx-768x461.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/05/crowd-devoxx.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">&nbsp;Photo: DevoxxUK / Flickr</figcaption></figure>



<p class="wp-block-paragraph">What she means is that optimizing the <strong>writing of code without understanding the surrounding system does not move the needle</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">It&#8217;s not about one thing which is going to fix one problem, it&#8217;s about really understanding the whole system, it&#8217;s about understanding even the whole organization, the whole enterprise. Where does IT and technology and software fit into that? What are you really trying to deliver? What is the business benefit?</p>
</blockquote>



<p class="wp-block-paragraph">She described this as <strong>working across two ends of the process</strong>. On the input side, teams need to get better at questioning requirements before writing anything. On the output side, they need to look at build pipelines, test parallelism, flaky tests, and DORA metrics.</p>



<p class="wp-block-paragraph">&#8220;If you can measure those things (your DORA metrics, build times, whether delivered requirements actually give users value) you can start to see which parts of the process are working and which need attention,&#8221; Trisha explained.</p>



<h2 class="wp-block-heading"><span id="measuring-the-wrong-things-optimizes-the-wrong-things">Measuring the wrong things optimizes the wrong things</span></h2>



<p class="wp-block-paragraph">She also makes a sharp point about measurement and optimization.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">If you measure lines of code for productivity, you&#8217;ll get more lines of code. But really productivity is not just about what we call these activity metrics. It&#8217;s not just lines of code. It&#8217;s not just pull requests, merges, features delivered.</p>
</blockquote>



<p class="wp-block-paragraph">The thing teams consistently miss is the full arc of delivery.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Developer experience and productivity is the whole piece. Did it get out to the user? Did it meet the user&#8217;s needs? Is the user paying for more of our stuff? Is the business getting what they need from what the developers are doing? What you&#8217;re measuring there impacts what you&#8217;re going to optimize.</p>
</blockquote>



<p class="wp-block-paragraph">That last line is worth sitting with. If your productivity metrics stop at pull requests merged, you are optimizing for pull requests merged.</p>



<h2 class="wp-block-heading"><span id="the-space-framework-and-why-three-metrics-beat-one"><br>The SPACE framework and why three metrics beat one</span></h2>



<p class="wp-block-paragraph">When I asked Trisha what teams should measure, she pointed to the SPACE framework. SPACE stands for <strong>satisfaction</strong>, <strong>performance</strong>, <strong>activity</strong>, <strong>communication and collaboration</strong>, and <strong>efficiency and flow</strong>.</p>



<p class="wp-block-paragraph">DORA metrics, which most teams are more familiar with, are a subset of it. Her recommendation is to <strong>pick metrics from three different dimensions</strong> rather than relying on a single category. The reasoning is that single-category metrics tend to be easy to game without improving anything real.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">So yes, you can write more code, but no, you didn&#8217;t do what the business wanted.</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/Trisha-Gee-1-1024x614.jpg?x94846" alt="" class="wp-image-9879" srcset="https://shiftmag.dev/wp-content/uploads/2026/05/Trisha-Gee-1-1024x614.jpg 1024w, https://shiftmag.dev/wp-content/uploads/2026/05/Trisha-Gee-1-300x180.jpg 300w, https://shiftmag.dev/wp-content/uploads/2026/05/Trisha-Gee-1-768x461.jpg 768w, https://shiftmag.dev/wp-content/uploads/2026/05/Trisha-Gee-1.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo: Marin Pavelić</figcaption></figure>



<p class="wp-block-paragraph">She also brought up Fred Brooks and <strong>communication overhead</strong> as something the industry consistently underweights. The harder metrics to capture, like satisfaction and flow, are often more revealing than the activity metrics that dashboards make easy to track.</p>



<p class="wp-block-paragraph">The business outcomes she keeps returning to are specific: &#8220;You need to measure, did it do what you wanted it to do? Did it get out to the user in time? Did they start spending more money with us? Did it fix your retention problem?&#8221;</p>



<p class="wp-block-paragraph">Those are the things which matter much more to the business.</p>



<h2 class="wp-block-heading"><span id="what-to-fix-before-adopting-ai">What to fix before adopting AI</span></h2>



<p class="wp-block-paragraph">I wondered what teams need to get right before AI tooling can actually help them. Trisha&#8217;s first answer was essentially: stop adopting AI the way you have adopted everything else. </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">We generally get requirements, write the code, chuck it out there, and then you&#8217;re kind of done. That&#8217;s not how it should work.</p>
</blockquote>



<p class="wp-block-paragraph">What she advocates for instead is <strong>applying the scientific method to engineering decisions</strong>, which sounds obvious but rarely happens in real life.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Have a hypothesis, do your investigation, measure the results, have a conclusion. Generally speaking, we have not been great at that in our industry.</p>
</blockquote>



<p class="wp-block-paragraph">Applied to AI adoption specifically, that means being precise about what you are actually trying to achieve. What are we trying to achieve with AI? Do we want to deliver more features more quickly to the customer or do we want to perhaps deliver higher quality features? Because those two things are not necessarily the same thing Trisha concluded.</p>



<p class="wp-block-paragraph">Therefore the practical instruction she gives is to <strong>run short experiments, measure one change at a time, and iterate</strong>. But have a hypothesis, figure out how to measure it, measure it, get feedback, and iterate over that.</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="AI Won&amp;apos;t Fix What You Can&amp;apos;t Measure" width="500" height="281" src="https://www.youtube.com/embed/iH4UnTskOSM?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 class="wp-block-paragraph"><br></p>
<p>The post <a href="https://shiftmag.dev/trisha-gee-ai-wont-fix-your-broken-pipeline-it-will-break-it-faster-9785/">Trisha Gee: AI Won&#8217;t Fix Your Broken Pipeline &#8211; It Will Break It Faster</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-18 14:33:33 by W3 Total Cache
-->